8.3 模型目录与配置
8.3.1 模型目录(src/agents/model-catalog.ts)
src/agents/model-catalog.ts)目录条目类型
// src/agents/model-catalog.ts
export type ModelCatalogEntry = {
id: string; // 模型 ID(如 "claude-sonnet-4-20250514")
name: string; // 显示名称
provider: string; // 提供者标识
contextWindow?: number; // 上下文窗口大小(Token 数)
reasoning?: boolean; // 是否支持推理/思考模式
input?: Array<"text" | "image">; // 支持的输入类型
};目录加载
// src/agents/model-catalog.ts(简化版)
export async function loadModelCatalog(params?: {
config?: OpenClawConfig;
useCache?: boolean;
}): Promise<ModelCatalogEntry[]> {
// 使用 Promise 缓存避免重复加载
if (modelCatalogPromise && params?.useCache !== false) {
return modelCatalogPromise;
}
modelCatalogPromise = (async () => {
const cfg = params?.config ?? loadConfig();
// 确保 models.json 存在
await ensureOpenClawModelsJson(cfg);
// 通过 Pi SDK 加载模型注册表
const piSdk = await import("./pi-model-discovery.js");
const agentDir = resolveOpenClawAgentDir();
const authStorage = new piSdk.AuthStorage(join(agentDir, "auth.json"));
const registry = new piSdk.ModelRegistry(authStorage, join(agentDir, "models.json"));
// 转换为 ModelCatalogEntry
const entries = registry.getAll();
return entries.map((entry) => ({
id: entry.id,
name: entry.name ?? entry.id,
provider: entry.provider,
contextWindow: entry.contextWindow,
reasoning: entry.reasoning,
input: entry.input,
})).sort((a, b) => a.provider.localeCompare(b.provider) || a.name.localeCompare(b.name));
})();
return modelCatalogPromise;
}8.3.2 模型扫描:OpenRouter 免费模型探测
8.3.3 模型配置文件(models.json)与提供者配置
models.json)与提供者配置配置合并策略
提供者配置合并
隐式提供者
确保 models.json 存在
8.3.4 合成模型与特殊提供者
特殊提供者列表
提供者
API 类型
特点
提供者 ID 标准化
合成模型
本节小结
Last updated