跳到主要内容

LLM Provider

LLM 能力通过统一 provider 接口注入 workflow。业务 workflow 不直接绑定 OpenAI、Anthropic 或其它 SDK;当前真实调用统一走 Vercel AI SDK 适配。

Workflow 支持两种 provider 来源:项目自己的 LLM_* 环境变量,以及当前登录账户在 Workflow Server 上开通的安全代理配置。前者保留用于自有密钥和兼容项目;后者适合由 Server 统一管理上游 Key、订阅和余额权限的场景。

服务器 AI 配置

使用 workflow.getServerLLMCredentials() 获取当前账户可选的配置和模型:

const credentials = await workflow.getServerLLMCredentials({ signal: abortSignal });
const selected = credentials.find((item) => item.id === providerId) ?? credentials[0];
const provider = selected.createProvider({ model: selected.models[0] });

返回对象公开稳定的配置 ID、名称、平台、Core provider 类型、模型列表和逐模型 modelDetails。真实 Sub2API Key 只在 Workflow Server 内存中短暂存在;一小时代理凭据由 Core 闭包保存和刷新,不是返回对象的字段。OpenAI 分组映射为 openai-responses,Anthropic 分组映射为 anthropic;未知平台不会成为可选配置。

返回数组按当前账号在 Desktop 或 Web “AI 配置”中保存的使用偏好排列。未配置偏好时保持分组 ID 升序;新开放分组追加到既有偏好之后。Server 在生成目录时跳过停用、订阅失效、无有效 Key、平台不支持或模型不可用的配置,因此 credentials[0] 始终是当前偏好中第一个可用项。显式选择的配置失效后,workflow 可以继续使用 find(...) ?? credentials[0] 回退;已经开始的模型请求不会自动切换 provider 或重新发送。

Sub2API 当前模型目录决定模型是否可用;Workflow Server 的版本化模型能力目录为返回的模型补充显示名称、视觉、联网、推理和工具调用能力。workflow 应从与当前模型 ID 对应的 modelDetails 读取能力,不自行按名称推断。只有 capabilities.webSearchtrue 时才使用 selected.createProvider({ model, webSearch: true });Core 和代理都会按所选模型校验。

普通 LLM 调用使用 createProvider()。必须接收 HTTP base URL 的 agent SDK 可以使用 startLLMProxyBridge() 创建与当前配置协议匹配的运行期 loopback 桥;OpenAI Responses 使用 /responses,Anthropic 使用 /messages。只支持 OpenAI Responses 的兼容调用方也可以继续使用 startOpenAIProxyBridge()。桥运行结束后必须关闭,agent 子进程只能看到本地地址和占位 Key,不能读取真实 Sub2API Key 或 Workflow Server 短期代理凭据。

Desktop 本地 resolver 使用当前登录的 Server URL/API Key。Server Web、账号 API Key 和已登录 Embed 运行时,Server 会签发只在 resolver/run 子进程生命周期内有效的 capability。匿名 Embed、Webhook 和没有用户身份的管理员 Key 不开放账户 AI 配置。

创建 provider ref

推荐在 workflow 中创建 provider ref:

const llmProvider = workflow.createLLMProviderRef("default", () => {
return workflow.createLLMProviderFromEnv();
});

节点运行时会解析 provider,避免业务代码在模块加载阶段就读取环境变量。

LLM 节点

非流式节点:

const llmNode = workflow.createLLMNode<Input>({
name: "answer-llm",
provider: llmProvider,
mapInput(input) {
return {
system: "你是一个简洁助手。",
prompt: input.message,
maxOutputTokens: 300,
};
},
});

流式节点:

const llmStreamNode = workflow.createLLMStreamNode<Input>({
name: "answer-stream",
provider: llmProvider,
mapInput(input) {
return {
messages: [{ role: "user", content: input.message }],
temperature: 0.2,
};
},
});

项目环境变量

workflow.createLLMProviderFromEnv() 会读取:

  • LLM_TYPE
  • LLM_API_KEY
  • LLM_BASE_URL
  • LLM_MODEL

这些值由 workflow.getEnv 统一获取,所以本地 CLI、Desktop 本地环境变量和 server 环境变量都可以使用相同名称。

createLLMProviderFromEnv() 继续用于自有 provider,不会自动读取服务器 AI 配置。需要账户配置时显式使用 getServerLLMCredentials()。后者按 WORKFLOW_LLM_SERVER_URL/TOKENWORKFLOW_SERVER_URL/ADMIN_KEY、workspace CLI 登录态的顺序选择完整连接对,不会混用不同来源的 URL 和 token。

Provider 类型

当前 provider factory 支持的类型来自 LLM_PROVIDER_TYPES。未配置模型时,会按 provider 类型选择默认模型。测试时可以使用 mock provider。

输出与错误

LLM provider 调用失败会被包装为 workflow 错误并进入执行报告。用户可见输出应通过 output node 产生,而不是直接依赖 provider 的原始返回。

AI SDK 将模型不支持的可选调用参数报告为 unsupportedcompatibility warning,例如 reasoning 模型忽略 temperature。这类 warning 不会中断调用;模型支持的参数仍正常生效,不支持的参数由 Provider 降级处理,具体信息保存在 providerMetadata["workflow-code"].warnings。参数值非法、鉴权失败、模型不可用或上游请求失败仍属于真实调用错误,不会被降级。