提供方

ModelProviderHandle 将模型管理操作限定到一个 Workspace 和一种能力类型。它不会创建 Provider;它提供 Backend 列表、Backend 创建、地址探测和 Router 入口。

选择 Provider 类型

llm = workspace.llm_provider()
embedding = workspace.embedding_provider()
parser = workspace.parser_provider()

print(llm.kind)  # llm
llm := workspace.LLMProvider()
embedding := workspace.EmbeddingProvider()
parser := workspace.ParserProvider()

fmt.Println(llm.Kind()) // llm

三种入口返回相同类型的 Handle,但支持的配置并不完全相同:

能力

Backend 的主要配置

地址探测

LLM

模型列表、地址、API Key、超时、Provider 类型、推理控制协议

支持

Embedding

模型列表、地址、API Key、超时、Provider 类型

支持

Parser

支持的 MIME 类型、地址、API Key、超时、Provider 类型

probe_address / ProbeAddress 不支持

表中只列出 SDK 已公开的选项。具体协议值、模型名和 MIME 类型应来自目标服务或当前产品界面,SDK 不负责推断。

查看和绑定 Backend

backends() / Backends() 返回该 Provider 类型下的完整 Backend 列表。列表结果中的 ID 是后续更新、Endpoint 管理和删除操作的可靠输入。

result = llm.backends()
for backend in result.backends:
    print(backend.id, backend.name, list(backend.models))

# 绑定一个已由列表、创建结果或用户输入确认的 ID
backend = llm.backend(str(result.backends[0].id))
current = backend.info()
result, err := llm.Backends(ctx)
if err != nil {
    return err
}
for _, backend := range result.GetBackends() {
    fmt.Println(backend.GetId(), backend.GetName(), backend.GetModels())
}

backend, err := llm.Backend(strconv.FormatInt(result.GetBackends()[0].GetId(), 10))
if err != nil {
    return err
}
current, err := backend.Info(ctx)

backend(id) / Backend(id) 只构造 Handle,不会验证资源存在。不要编造 ID,也不要把列表下标当成 Backend ID。

创建前探测地址

LLM 和 Embedding Provider 可以在创建 Backend 前探测远端服务公开的模型列表。API Key 属于敏感信息,应从密钥管理系统或环境变量读取,不要写进日志、示例输出或仓库。

import os
import moi_product_sdk as sdk

models = llm.probe_address(
    model_endpoint,
    sdk.with_provider_backend_api_key(os.environ["MODEL_API_KEY"]),
)
print(list(models.models))
models, err := llm.ProbeAddress(
    ctx,
    modelEndpoint,
    sdk.WithProviderBackendAPIKey(os.Getenv("MODEL_API_KEY")),
)
if err != nil {
    return err
}
fmt.Println(models.GetModels())

探测只证明远端地址在当时返回了模型列表,不会创建资源,也不能替代创建后的读取和可用性检查。Parser Provider 调用该方法会返回不支持操作的错误。

创建 Backend

创建方法返回 ProviderBackendHandle 和创建后的 ProviderBackend。LLM 与 Embedding 创建时必须传模型列表;Parser 使用支持的 MIME 类型。

backend, created = llm.create_backend(
    backend_name,
    sdk.with_provider_backend_address(model_endpoint),
    sdk.with_provider_backend_api_key(os.environ["MODEL_API_KEY"]),
    sdk.with_provider_backend_models(*selected_models),
    sdk.with_provider_backend_timeout_seconds(60),
)
print(backend.id, created.name)
backend, created, err := llm.CreateBackend(
    ctx,
    backendName,
    sdk.WithProviderBackendAddress(modelEndpoint),
    sdk.WithProviderBackendAPIKey(os.Getenv("MODEL_API_KEY")),
    sdk.WithProviderBackendModels(selectedModels...),
    sdk.WithProviderBackendTimeoutSeconds(60),
)
if err != nil {
    return err
}
fmt.Println(backend.ID(), created.GetName())

Python 和 Go 还提供 Workspace 级的 setup_llm_backend / SetupLLMBackend,要求同时给出名称、地址和模型列表,并返回 后端 的组合结果。需要逐步控制创建过程时,使用 Provider Handle 更容易检查每一步。

错误和权限

  • 空名称、空 ID、空地址或缺少必需模型列表会在 SDK 或服务端被拒绝。

  • 地址探测和 Backend 探测会访问外部模型服务;应设置调用超时,并避免无界重试。

  • 创建、修改和删除属于 Workspace 模型操作,调用者必须具备对应权限。

  • service() / Service() 是与路由对齐的底层入口。常规代码优先使用 Handle;只有已确认 Product SDK 没有覆盖某项操作时才使用底层服务。

Backend 和 Endpoint 的字段与生命周期见 后端,路由见 路由