M4b:ai_provider 删除手术①-⑥——神识全面接管模型出口
- ① 后端删除 app/ai_provider/(38 文件,含 anthropic/openai 格式、billing、audio、embedding)、services/ai_provider_admin.py、core/config/model_config.py、tests/ai_provider/(21 文件) - ② 连带退役 application/agent/(旧 Agent 循环/steer/follow-up/确认注册表)、application/skill_executor.py、app/skills/(python skills 孤儿)、endpoints/audio.py、application/imports.py(ProviderManager 消费方);settings 端点收敛为生成偏好 - ③ runs.py 修剪:AgentRunRegistry/steer/follow-up/confirmations 端点退役,保留 list/get/events/cancel/stream;safety 确认改为直接落库裁决(pending→approved/denied) - ④ 前端删除:models 页、ModelGatewayView、gateway.ts、GatewayPanel(玄关)、ModelGatewayPanel/ModelStrategyForm、audio.ts/useVoiceInput、网关类型与 mock;设置页收敛为外观/语言/通知 - ⑤ 配置收敛:config/models|providers|pricing.example.yaml 归档 shenshi/config/;.env.example 删 provider keys/MODEL_ENDPOINT_POOL/MODEL_CONFIG_PATH,收敛 SHENSHI_* - ⑥ 验收:rg 审计灵台 Provider SDK import 与 ai_provider 引用归零;后端 528 passed(2 个预存失败经 HEAD 复跑验证与本手术无关)、前端 type-check+201 passed、神识 go vet+test、BFF 4 passed
This commit is contained in:
1 parent
0d383725b5
commit
462d570751
129 files changed
+81
-15867
No files matched your search
@@ -64,12 +64,6 @@ function paginate<T>(items: T[]) {
|
||||
};
|
||||
}
|
||||
|
||||
/** mock 内存态:模型 endpoint 覆盖(模拟 DB 覆盖,refresh 重置) */
|
||||
const _mockModelOverrides: Record<
|
||||
string,
|
||||
Record<string, Record<string, unknown>>
|
||||
> = {};
|
||||
|
||||
/**
|
||||
* 路由匹配:命中返回 MockResult,未命中返回 undefined。
|
||||
* @param method HTTP 方法
|
||||
@@ -88,54 +82,6 @@ export function resolveMock(
|
||||
// —— 健康检查 ——
|
||||
if (m === "GET" && path === "/health") return ok(data.health);
|
||||
|
||||
// —— 设置:模型网关状态(GET /settings/models,provider 密钥脱敏 + endpoint 覆盖标记)——
|
||||
if (m === "GET" && path === "/settings/models") {
|
||||
const gw = JSON.parse(JSON.stringify(data.modelGateway));
|
||||
for (const model of gw.models) {
|
||||
for (const ep of model.endpoints ?? []) {
|
||||
const ov = _mockModelOverrides[model.name]?.[ep.name];
|
||||
ep.priority = ov?.priority ?? ep.priority ?? 10;
|
||||
ep.base_url_env = `${(ep.provider ?? "").toUpperCase()}_BASE_URL`;
|
||||
ep.api_key_env = `${(ep.provider ?? "").toUpperCase()}_API_KEY`;
|
||||
ep.is_overridden = Boolean(ov);
|
||||
ep.has_url_override = Boolean(ov && ov.base_url);
|
||||
ep.has_key_override = Boolean(ov && ov.api_key);
|
||||
if (ov) {
|
||||
if (ov.status) ep.status = ov.status;
|
||||
if (ov.weight !== undefined) ep.weight = ov.weight;
|
||||
}
|
||||
}
|
||||
}
|
||||
return ok(gw);
|
||||
}
|
||||
{
|
||||
const mt = path.match(/^\/settings\/models\/([^/]+)\/endpoints\/([^/]+)$/);
|
||||
if (mt && m === "PATCH") {
|
||||
const model = mt[1];
|
||||
const endpoint = mt[2];
|
||||
const body = (json ?? {}) as Record<string, unknown>;
|
||||
_mockModelOverrides[model] = _mockModelOverrides[model] || {};
|
||||
_mockModelOverrides[model][endpoint] = {
|
||||
...(_mockModelOverrides[model][endpoint] ?? {}),
|
||||
...body,
|
||||
};
|
||||
const ov = _mockModelOverrides[model][endpoint];
|
||||
// 返回脱敏 endpoint(不回 base_url/api_key 原值)
|
||||
return ok({
|
||||
name: endpoint,
|
||||
provider: "",
|
||||
status: (ov.status as string | undefined) ?? "active",
|
||||
weight: ov.weight as number | undefined,
|
||||
priority: ov.priority as number | undefined,
|
||||
is_overridden: true,
|
||||
has_url_override: Boolean(ov.base_url),
|
||||
has_key_override: Boolean(ov.api_key),
|
||||
base_url_env: "",
|
||||
api_key_env: "",
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// —— 设置:生成参数偏好(GET / PATCH /settings/preferences)——
|
||||
if (m === "GET" && path === "/settings/preferences") {
|
||||
return ok(data.generationPreferences);
|
||||
|
||||
Reference in new issue
Block a user