getServerLLMCredentials
workflow.getServerLLMCredentials() 从当前连接的 Workflow Server 获取用户已经开通且启用的 AI 配置。真实 Sub2API Key 始终由 Server 读取并注入上游请求,不会进入 workflow 进程、Desktop、浏览器响应或返回对象。
返回数组按当前账号保存的 provider 使用偏好排序。Server 会跳过当前不可用的配置,后续有效项保持相对顺序;显式 provider 已失效时可回退到 credentials[0]。这一行为只发生在目录选择阶段,不会重放已经开始的流式请求、工具调用或普通模型请求。
签名
workflow.getServerLLMCredentials(options?: {
signal?: AbortSignal;
}): Promise<WorkflowServerLLMCredential[]>
interface WorkflowServerLLMCredential {
readonly id: string;
readonly name: string;
readonly platform: string;
readonly providerType: LLMProviderType;
readonly models: readonly string[];
readonly modelDetails: readonly {
readonly id: string;
readonly name: string;
readonly capabilities: {
readonly vision: boolean;
readonly webSearch: boolean;
readonly reasoning: boolean;
readonly toolCalling: boolean;
};
}[];
createProvider(options: {
model: string;
system?: string;
defaults?: LLMCallSettings;
webSearch?: boolean;
}): LLMProvider;
startOpenAIProxyBridge(options?: {
signal?: AbortSignal;
}): Promise<{
baseUrl: string;
apiKey: string;
close(): Promise<void>;
}>;
startLLMProxyBridge(options?: {
signal?: AbortSignal;
}): Promise<{
baseUrl: string;
apiKey: string;
close(): Promise<void>;
}>;
}
连接来源
Core 按以下顺序选择完整的 URL/token 对,不会把不同来源混用:
WORKFLOW_LLM_SERVER_URL与WORKFLOW_LLM_SERVER_TOKENWORKFLOW_SERVER_URL与WORKFLOW_SERVER_ADMIN_KEY- workspace CLI 保存的登录态
显式环境变量只配置一半时会直接报错。Server runner 会为具有用户身份的 resolver 和 run 注入进程生命周期 capability;匿名 Embed、Webhook 和没有用户身份的管理员 Key 不能取得用户 AI 配置。
示例
const credentials = await workflow.getServerLLMCredentials({
signal: abortSignal,
});
const selected = credentials.find((item) => item.id === providerId) ?? credentials[0];
if (!selected || !selected.models.includes(model)) {
throw new workflow.WorkflowError({
type: "input_validation",
message: "所选 AI 配置或模型不可用。",
});
}
const provider = selected.createProvider({ model });
models 仍由 Sub2API 当前分组实时模型列表决定,modelDetails 由 Workflow Server 的版本化模型能力目录补充显示名称以及视觉、联网、推理和工具调用能力。目录无法识别的模型不会被移出 models,但四项能力均为 false,不会按名称临时猜测。
只有所选模型的 modelDetails[].capabilities.webSearch 为 true 时才能传入 webSearch: true。Core 会为 OpenAI Responses 注入 web_search provider tool,为 Anthropic Messages 注入版本化 Web Search tool;能力未声明时会在发起请求前拒绝。代理端还会从请求体读取模型并再次检查,不能用旧参数或直接调用代理绕过。
需要把系统 AI 配置交给只接受 HTTP base URL 的 agent SDK 时,可以启动与配置协议匹配的临时本地桥:
const bridge = await selected.startLLMProxyBridge({ signal: abortSignal });
try {
const client = new AgentSdk({ baseUrl: bridge.baseUrl, apiKey: bridge.apiKey });
await client.run({ model });
} finally {
await bridge.close();
}
本地桥只绑定随机 127.0.0.1 端口和路径。OpenAI Responses 配置只开放 /responses,Anthropic 配置只开放 /messages;两者都限制请求体为 50 MiB,并支持 JSON、SSE 流式响应和取消。apiKey 只是本地占位值,不是 Sub2API Key、Workflow Server 登录凭据或一小时代理凭据。调用方必须在成功、失败和取消路径关闭桥。
startOpenAIProxyBridge() 保留给只支持 OpenAI Responses 的现有调用方。它会拒绝 Anthropic 配置;新 agent 集成优先使用 startLLMProxyBridge()。
凭据刷新
Server 签发的一小时代理凭据保存在 Core 闭包中,不作为对象字段公开。每次 provider 或本地桥请求前会检查有效期;不足 60 秒时触发刷新,同一对象上的并发刷新会合并。刷新失败但旧凭据仍有效时继续使用旧凭据,过期后返回明确的 provider 错误。已经建立的流式请求只在开始时验证凭据,不会因为传输期间到期而中断。
错误
| 场景 | 类型 | 行为 |
|---|---|---|
| 没有完整 Server 连接 | input_validation | 要求登录或成对配置 URL/token。 |
| 当前账户没有可用配置 | input_validation | 要求开通订阅或启用余额计费配置。 |
| 目录协议无效、刷新失败或配置失效 | provider_call | 不返回代理 token、真实 Key 或上游错误正文。 |