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:
chenxin committed 2026-08-27 10:02:44 +08:00
1 parent 0d383725b5
commit 462d570751
129 files changed
+81 -15867

No files matched your search

-54
View File
@@ -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);