按用户指示做**一包提交**,不按工作流拆分。本提交刻意混合了多条并行线:
· 本地 ASR 接管:audio 成为与 chat/embed/image/video 同等的路由类别
(IsLocalRoute 单一判据、audio 健康探测、default_audio_route、
auto 占位、GET /api/ai/routes/audio、回退云端时界面明示「音频已出网」)
· LLM 调用层:ctx 贯穿、ToolCall/ToolSchema、EmptyCompletionError /
TransientUpstreamError(按错误类型而非文案判重试)
· 编排 Agent:general_assistant orchestrate/persistence/spec_driver
· 联网搜索:internal/search(playwright)
· 网盘:backend + 前端
· 前端 UI:导航/路由/工作台若干页
· 交付文档:DELIVERY.md / AR04 / 部署文档的「无 Python」表述据实改写,
新增 eai_agentplatform-asr.service、asr.env、clonezilla-cleanup 清 ~/asr-poc
不分拆的原因:dev 早期,粒度不该打断工作节奏。且实测过——这些改动
**在编译上是同一个单元**(llm.go 的 ctx 签名变更牵动 12 个调用点,
chat_message.go 的 ctx 改动又与编排重写同处一个 hunk),拆出来的中间态编不过。
详见 TOP_CODING_RULES.md G14.5 与 bugs_and_errors.md E09。
Co-Authored-By: Claude Code <noreply@anthropic.com>
40 lines
1.4 KiB
Go
40 lines
1.4 KiB
Go
package api
|
||
|
||
import (
|
||
"context"
|
||
"fmt"
|
||
"strconv"
|
||
|
||
"github.com/gin-gonic/gin"
|
||
|
||
"eai_agentplatform/backend/internal/ai"
|
||
"eai_agentplatform/backend/internal/config"
|
||
"eai_agentplatform/backend/internal/web"
|
||
)
|
||
|
||
// parseID 解析路径中的 uint id,失败返回 false 并已写入错误响应
|
||
func parseID(c *gin.Context, name string) (uint, bool) {
|
||
id, err := strconv.ParseUint(c.Param(name), 10, 64)
|
||
if err != nil || id == 0 {
|
||
web.Fail(c, web.NewBadRequest("无效的 "+name))
|
||
return 0, false
|
||
}
|
||
return uint(id), true
|
||
}
|
||
|
||
// generateWithDefaultRoute 取通用文本生成路由后调用 LLM(非流式 + 回退链)。
|
||
//
|
||
// 用于请求体里没有 ai_route_id、服务端自行挑路由的场景。路由名沿用代码里既有惯例
|
||
// "title_gen"(agent_routes 里指向通用 chat 模型);GetRoute 本身在查不到时会回落到
|
||
// ai_config.json 的 default_route,所以这里只可能在配置整体不可用时失败。
|
||
//
|
||
// 存在的意义:取代此前 ai.GenerateWithFallback(nil, …) 的写法。传 nil 会让
|
||
// ai.buildRouteChain 直接报错——历史上前者会让调用方必 500。
|
||
func generateWithDefaultRoute(ctx context.Context, messages []ai.Message) (string, error) {
|
||
aiRoute, err := config.GetRoute("title_gen")
|
||
if err != nil || aiRoute == nil {
|
||
return "", fmt.Errorf("通用文本生成路由不可用: %w", err)
|
||
}
|
||
return ai.GenerateWithFallback(ctx, aiRoute, messages)
|
||
}
|