feat/provider-routing
main
本 PR 完成阶段 E 的模型提供商与能力路由开发。用户可以在设置页选择带 Logo 的国内常用提供商预设,填写独立 API Key,并分别配置聊天、Embedding、音频转写和声纹匹配模型。
同时完善流式协议处理、提供商配置持久化、远程向量索引隔离,以及 Benchmark 的实际模型记录。阶段 F 的本地音频模型保持接口预留。
新增或完善以下预设:
前端采用带 Logo 的预设选择网格,支持预设与自定义连接配置:
协议层统一处理工具调用事件、可用的推理内容事件、Token 用量和结束状态。
内部带命名空间或超长的工具名会转换为协议允许的名称,并在响应中还原。对于工具名分片返回的情况,等待名称完整后再发送工具调用事件;文本内容仍逐片发送。
此外,完善超时、鉴权失败、限流、无效响应及截断流的处理。公开错误不直接回显上游响应正文,流式请求取消时会关闭底层迭代器和连接。
Embedding、音频转写和声纹匹配分别配置提供商、模型与相对端点,独立于默认聊天模型。
处理顺序:
hash-v1
远程能力路由当前支持 OpenAI Chat / Compatible HTTP 配置。
声纹匹配采用本应用自定义 multipart 契约,服务端需实现相应接口,不能直接视为通用厂商标准端点。
GET /api/model-routing
PUT /api/model-routing
POST /api/models/embeddings
POST /api/media/speaker-matches
POST /api/media/transcriptions
配置和响应增加以下校验:
409
0–1
1 byte–25 MiB
保留完整的本地 Hash / sqlite-vec 索引,同时将远程向量写入独立的 routed_block_vectors 表。
routed_block_vectors
远程向量空间由接口地址、端点、模型和实际维度共同区分。查询仅使用匹配空间,并要求覆盖全部当前 Block。
远程请求失败、索引缺失、不完整或损坏时,使用完整本地索引,不混合不同空间的向量评分。
全量重建调整为:
这解决了重建取消或失败时覆盖并发保存配置的问题。向量准备期间,旧索引仍可查询。
此前 Benchmark 可能实际使用远程 Embedding,却在报告中记录本地 hash-v1 的模型和维度。本 PR 改为逐样本记录实际执行路径:
source
model_id
记录同时出现在报告 cases 和 CaseCompleted SSE 事件中,不包含 API Key 或凭据引用。
cases
CaseCompleted
使用任务局部上下文隔离并发检索,避免不同评测相互覆盖记录。
运行快照中的 local_embedding 仅描述本地基线;实际模型归属以逐样本记录为准。
local_embedding
git diff --check
新增回归覆盖:
测试使用模拟 API 和隔离数据目录,未使用真实 API Key 进行厂商接口联调。
diarization
a75d81a
已同步审阅时的最新主分支,本地与远程一致,工作区干净。历次审阅发现的问题均已修复,最终复审未发现新的合并阻塞问题,建议合并。
审阅通过,同意合并。
此前发现的索引重建回滚覆盖配置、流式工具名称分片及 Benchmark 模型归属记录问题均已修复。最终复审未发现新的合并阻塞问题。
验证结果:
本次审阅基于提交 a75d81a。真实厂商 API 联调及本地小模型集成按后续阶段继续推进。
No dependencies set.
The note is not visible to the blocked user.
概述
本 PR 完成阶段 E 的模型提供商与能力路由开发。用户可以在设置页选择带 Logo 的国内常用提供商预设,填写独立 API Key,并分别配置聊天、Embedding、音频转写和声纹匹配模型。
同时完善流式协议处理、提供商配置持久化、远程向量索引隔离,以及 Benchmark 的实际模型记录。阶段 F 的本地音频模型保持接口预留。
提供商预设与配置界面
新增或完善以下预设:
前端采用带 Logo 的预设选择网格,支持预设与自定义连接配置:
模型协议与流式处理
协议层统一处理工具调用事件、可用的推理内容事件、Token 用量和结束状态。
内部带命名空间或超长的工具名会转换为协议允许的名称,并在响应中还原。对于工具名分片返回的情况,等待名称完整后再发送工具调用事件;文本内容仍逐片发送。
此外,完善超时、鉴权失败、限流、无效响应及截断流的处理。公开错误不直接回显上游响应正文,流式请求取消时会关闭底层迭代器和连接。
独立能力路由与本地回退
Embedding、音频转写和声纹匹配分别配置提供商、模型与相对端点,独立于默认聊天模型。
处理顺序:
当前本地能力状态
hash-v1确定性占位向量,尚未集成真实本地语义模型远程能力路由当前支持 OpenAI Chat / Compatible HTTP 配置。
声纹匹配采用本应用自定义 multipart 契约,服务端需实现相应接口,不能直接视为通用厂商标准端点。
接口与配置校验
GET /api/model-routingPUT /api/model-routingPOST /api/models/embeddingsPOST /api/media/speaker-matchesPOST /api/media/transcriptions配置和响应增加以下校验:
409,避免覆盖其他窗口已保存的配置。0–1数值。1 byte–25 MiB,远程响应读取设置大小上限。远程向量索引与重建
保留完整的本地 Hash / sqlite-vec 索引,同时将远程向量写入独立的
routed_block_vectors表。远程向量空间由接口地址、端点、模型和实际维度共同区分。查询仅使用匹配空间,并要求覆盖全部当前 Block。
远程请求失败、索引缺失、不完整或损坏时,使用完整本地索引,不混合不同空间的向量评分。
全量重建调整为:
这解决了重建取消或失败时覆盖并发保存配置的问题。向量准备期间,旧索引仍可查询。
Benchmark 模型归属记录
此前 Benchmark 可能实际使用远程 Embedding,却在报告中记录本地
hash-v1的模型和维度。本 PR 改为逐样本记录实际执行路径:source:API、本地、未使用向量或未完成向量检索。model_id、维度及本地模型版本。记录同时出现在报告
cases和CaseCompletedSSE 事件中,不包含 API Key 或凭据引用。使用任务局部上下文隔离并发检索,避免不同评测相互覆盖记录。
运行快照中的
local_embedding仅描述本地基线;实际模型归属以逐样本记录为准。审阅问题与修复结果
验证结果
git diff --check通过新增回归覆盖:
测试使用模拟 API 和隔离数据目录,未使用真实 API Key 进行厂商接口联调。
当前限制与后续工作
diarization。合并建议
feat/provider-routinga75d81a已同步审阅时的最新主分支,本地与远程一致,工作区干净。历次审阅发现的问题均已修复,最终复审未发现新的合并阻塞问题,建议合并。
审阅通过,同意合并。
此前发现的索引重建回滚覆盖配置、流式工具名称分片及 Benchmark 模型归属记录问题均已修复。最终复审未发现新的合并阻塞问题。
验证结果:
本次审阅基于提交
a75d81a。真实厂商 API 联调及本地小模型集成按后续阶段继续推进。