- widget/i18n/index.js: only import en.json and zh_CN.json (the only locale files present); remove 40+ imports for missing locale JSONs that caused Vite compile failure and global white screen - dashboard/i18n/index.js: remove unused locale imports for consistency - Remove 62 unused locale JSON files from widget/i18n/locale/ - Minor: update index.html, test helpers, e2e test, languages spec
29 KiB
GoChat AI 功能支持评估与开发路线图
调研日期:2026-07-08 基于代码库:main 分支 @
e61b2ac对标项目:Chatwoot Captain AI (enterprise edition)
目录
1. 评估摘要
GoChat 已搭建了一套对标 Chatwoot Captain AI 的完整基础设施,覆盖了 LLM Provider 抽象层、 数据模型、Service 业务逻辑、Handler/路由、前端 UI 组件和后台 Worker。约 90% 的 AI 代码 已经写好,但存在若干"最后一公里"接缝未缝合的问题,导致部分功能无法实际运行。
核心结论:
- 可用功能:Copilot 侧边栏对话、回复建议、会话摘要、改写润色、标签建议、跟进任务、 会话洞察、文档同步、批量 AI 操作、助手 CRUD/Playground、帮助中心文章 AI 翻译
- 代码就绪但未接入:RAG 知识库问答(路由未注册)、自动回复规则(未接入消息流程)、
CaptainConversationService(被
_ =忽略) - 完全缺失:帮助中心语义搜索、AgentBot + Captain 端到端 AI 客服、多 LLM Provider 支持
- 配置缺口:config.yaml 无 captain 配置段,LLM API Key 未注入,AI 功能处于"空转"状态
整体评估:基础设施成熟度高(9/10),功能可用度中等(5/10),需补齐配置与接缝工作。
2. 当前 AI 基础设施盘点
2.1 LLM Provider 层
文件:backend/internal/llm/provider.go + openai_provider.go
Provider接口定义三个核心能力:ChatCompletion— 同步对话补全CreateEmbedding— 文本向量化ChatCompletionStream— SSE 流式对话补全(callback 模式)
OpenAIProvider实现完整:- 支持自定义
baseURL(兼容国内厂商如火山引擎/豆包/通义千问) - SSE 流式解析(自研
sseReader+sseLineScanner,处理[DONE]信号) - 指数退避重试(1s→2s→4s,最多 3 次,429/5xx 可重试)
- API 错误结构化解析(
APIError类型)
- 支持自定义
- 数据结构:
ChatRequest/ChatResponse/ChatMessage/EmbeddingRequest/EmbeddingResponse/StreamChunk/ToolDefinition/ToolFunction - 问题:
ToolDefinition已定义但从未在调用时传入 LLM
2.2 数据模型层
文件:backend/internal/model/captain_models.go + copilot_models.go + auto_reply_rule_models.go + article_embedding.go
| 模型 | 表名 | 说明 |
|---|---|---|
CaptainAssistant |
captain_assistants |
AI 助手核心实体(config/guardrails/response_guidelines JSONB) |
CaptainDocument |
captain_documents |
知识库文档(网页/PDF,含 content_fingerprint 去重) |
CaptainAssistantResponse |
captain_assistant_responses |
FAQ 条目,带 pgvector 1536 维 embedding |
CaptainScenario |
captain_scenarios |
多场景 agent 配置(instruction + tools JSONB) |
CaptainCustomTool |
captain_custom_tools |
自定义 HTTP 工具(endpoint/auth/param_schema/request_template) |
CaptainInbox |
captain_inboxes |
助手↔收件箱绑定 |
CaptainPreference |
captain_preferences |
账户级 AI 偏好(tone/language/auto_label/auto_reply 等) |
CaptainAutoReplyRule |
captain_auto_reply_rules |
自动回复规则(static/llm/mixed 三模式) |
CopilotThread |
copilot_threads |
Copilot 对话线程(account_id + user_id + assistant_id) |
CopilotMessage |
copilot_messages |
线程消息(JSONB content,支持 thinking/tool_result) |
CopilotSuggestionMessage |
copilot_suggestion_messages |
会话级建议(reply/suggestion/summary,pending/accepted/rejected) |
ArticleEmbedding |
article_embeddings |
帮助中心文章向量嵌入(JSONB 存储向量) |
CopilotThread.PreviousHistory()方法将消息历史转为 LLM[]ChatMessage格式CopilotMessage.BeforeSave()验证 JSONB key 白名单(content/reasoning/function_name/reply_suggestion)
2.3 Service 层
| Service | 文件 | 职责 | LLM 依赖 |
|---|---|---|---|
CaptainAssistantService |
captain_assistant_service.go |
助手 CRUD + Playground 对话 + GenerateResponse RAG 问答 |
✅ |
CaptainTaskService |
captain_task_service.go |
回复建议 / 摘要 / 改写(含 Stream 版本) | ✅ |
CaptainTaskExtendedService |
captain_task_extended_service.go |
批量标签建议 + 跟进任务 | ✅ |
CopilotService |
copilot_service.go |
Copilot 线程管理 + 异步响应生成 | ✅ |
CopilotContextService |
copilot_context_service.go |
会话上下文组装(消息/联系人/历史) | ✅ |
RAGService |
rag_service.go |
RAG 全流程:embedding→pgvector 搜索→LLM 生成 | ✅ |
ConversationInsightService |
conversation_insight_service.go |
参与者分析 / 行动项 / 标签建议 | ✅ |
CaptainConversationService |
captain_conversation_service.go |
会话级 AI 自动响应(handoff 模式) | ✅ |
CaptainDocumentService |
captain_document_service.go |
文档爬取/同步/embedding 生成 | ✅ |
CaptainBulkActionService |
captain_bulk_action_service.go |
批量 AI 操作 | ✅ |
CaptainAssistantResponseService |
captain_assistant_response_service.go |
FAQ 生成与处理 | ✅ |
SystemPromptBuilder |
system_prompt_builder.go |
统一 prompt 构建 | — |
LLMArticleTranslationBackend |
article_service.go |
帮助中心文章 AI 翻译 | ✅ |
2.4 Handler + 路由层
已注册路由(/api/v1/accounts/:account_id/captain/):
# Assistant CRUD + 关联
assistants GET/POST/PUT/DELETE
assistants/:id/inboxes GET/POST/DELETE
assistants/:id/playground POST
assistants/:id/documents POST/GET/DELETE
assistants/:id/scenarios POST/GET/PUT/DELETE
# Document / Scenario / CustomTool
documents GET/POST/DELETE + /:id/sync
scenarios GET/POST/PUT/DELETE
custom_tools GET/POST/PUT/DELETE
# Copilot
copilot_threads GET/POST/GET/:id/DELETE/:id
copilot_threads/:id/copilot_messages GET/POST
copilot_threads/:id/messages POST
copilot_messages GET/POST
copilot/suggest_replies POST
copilot/summarize POST
copilot/translate POST
copilot/stream GET (SSE)
# Tasks (AI 任务)
tasks/reply_suggestion POST (+ /stream SSE)
tasks/summarize POST (+ /stream SSE)
tasks/rewrite POST (+ /stream SSE)
tasks/label_suggestion GET
tasks/follow_up GET
# Insight
conversation_insights/:id/analyze_participants POST
conversation_insights/:id/extract_action_items POST
conversation_insights/:id/suggest_labels POST
# Preference / Response / Bulk
preferences GET/PUT
assistant_responses CRUD + /process
bulk_actions POST
2.5 前端层
| 组件/文件 | 路径 | 说明 |
|---|---|---|
| Captain 设置页 | routes/dashboard/settings/captain/Index.vue |
模型选择 + 功能开关(label_suggestion/help_center_search/audio_transcription) |
| ModelSelector | routes/dashboard/settings/captain/components/ModelSelector.vue |
按 feature 选择 LLM 模型 |
| FeatureToggle | routes/dashboard/settings/captain/components/FeatureToggle.vue |
AI 功能开关 |
| CopilotContainer | components/copilot/CopilotContainer.vue |
侧边栏 Copilot 聊天面板 |
| Copilot (next) | components-next/copilot/Copilot.vue |
新版 Copilot 组件 |
| useCaptain | composables/useCaptain.js |
Captain 功能开关/配额/错误处理 |
| useCopilotReply | composables/useCopilotReply.js |
回复建议/改写/摘要的 composable |
| useLabelSuggestions | composables/useLabelSuggestions.js |
标签建议 |
| API 客户端 | api/captain/ |
12 个文件:assistant/document/tasks/copilotThreads/copilotMessages/preferences/scenarios/tools/bulkActions/inboxes/customTools/response |
Feature Flags(featureFlags.js):
CAPTAIN=captain_integrationCAPTAIN_V2=captain_integration_v2CAPTAIN_TASKS=captain_tasksCAPTAIN_CUSTOM_TOOLS=custom_toolsCAPTAIN_DOCUMENT_AUTO_SYNC=captain_document_auto_sync
2.6 后台 Worker
| Worker | 文件 | 任务类型 | 说明 |
|---|---|---|---|
| CaptainDocumentWorker | captain_document_worker.go |
6 种任务 | 文档同步/爬取/页面解析/embedding 更新/调度 |
| CopilotResponseWorker | copilot_response_worker.go |
1 种任务 | 异步 Copilot 响应生成 |
| CaptainConversationWorker | captain_conversation_service.go 内 |
1 种任务 | 会话响应构建(但 service 被 _ = 忽略) |
2.7 配置层
文件:backend/internal/config/config.go
CaptainConfig 结构体已定义:
type CaptainConfig struct {
Enabled bool
LLMProvider string // openai, azure, custom
LLMModel string // gpt-4o, gpt-3.5-turbo
LLMAPIKey string
LLMBaseURL string // 自定义端点
EmbeddingModel string // text-embedding-3-small
EmbeddingDims int // 1536
MaxTokens int
Temperature float64
}
LLMConfig()方法将CaptainConfig转为 provider 友好格式- 支持热重载(
config.goreloader 中包含 captain 字段) - ENV 映射:
GOCHAT_CAPTAIN_ENABLED/GOCHAT_CAPTAIN_LLM_PROVIDER/GOCHAT_CAPTAIN_LLM_MODEL/GOCHAT_CAPTAIN_LLM_API_KEY/GOCHAT_CAPTAIN_LLM_BASE_URL等
问题:backend/configs/config.yaml 中没有 captain 配置段,所有 Captain 字段为默认零值。
bootstrap.go:536 创建 OpenAIProvider 时传入空 API Key 和空 BaseURL。
3. Chatwoot AI 功能对照表
| Chatwoot Captain 功能 | GoChat 状态 | 说明 |
|---|---|---|
| Captain Assistant(AI 助手配置) | ✅ 完整 | 模型/服务/handler/路由/前端全链路 |
| Copilot(客服侧边栏 AI 助手) | ✅ 完整 | 含 SSE 流式 + 异步 Worker |
| Reply Suggestion(回复建议) | ✅ 完整 | 含流式 + RAG 上下文 |
| Summarize(会话摘要) | ✅ 完整 | 含流式 |
| Rewrite(改写润色) | ✅ 完整 | 含流式,7 种操作 |
| Label Suggestion(标签建议) | ✅ 完整 | 单会话 + 批量 |
| Follow-up Task(跟进任务) | ✅ 完整 | 批量 |
| Knowledge Base / RAG(知识库问答) | ⚠️ 代码完整,路由未注册 | RAGService + RAGHandler 存在但未接入 |
| Document Sync(文档爬取同步) | ✅ 完整 | 6 种 Worker 任务 |
| Custom Tools(Function Calling 定义) | ✅ 模型+服务完整 | 但 LLM 调用时未传 tools 参数 |
| Captain Preferences(AI 偏好) | ✅ 完整 | tone/language/auto_label/auto_reply |
| Auto-Reply Rules(自动回复规则) | ⚠️ 模型完整,未接入 | 模型+基础 service,无路由,无消息钩子 |
| Conversation Insight(会话洞察) | ✅ 完整 | 参与者分析/行动项/标签 |
| Bulk Actions(批量 AI 操作) | ✅ 完整 | |
| Help Center 语义搜索 | ❌ 缺失 | ArticleEmbedding 表存在但无搜索方法 |
| AgentBot + Captain(端到端 AI 客服) | ❌ 缺失 | AgentBot 仅支持 webhook 类型 |
| Captain Conversation Auto-Response | ⚠️ 代码存在,被忽略 | bootstrap.go:594 _ = captainConversationService |
| Article AI 翻译 | ✅ 完整 | LLMArticleTranslationBackend |
| Multi-Provider LLM | ❌ 仅 OpenAI | 无 Anthropic/国内模型 provider 实现 |
| Token 用量统计与配额 | ❌ 缺失 | 前端有 captainLimits 结构,后端无统计 |
| AI 审计日志 | ❌ 缺失 |
4. 关键缺口分析
缺口 G1:config.yaml 缺少 captain 配置段
- 影响:所有 AI 功能无法实际调用 LLM(API Key 为空)
- 位置:
backend/configs/config.yaml缺少 captain 段;bootstrap.go:536传入空值 - 修复成本:极低(加几行 YAML + .env 注入)
缺口 G2:RAG 路由未注册
- 影响:知识库问答 API 无法访问
- 位置:
RAGHandler代码完整(rag_handler.go),但bootstrap.go未实例化RAGService/RAGHandler,router.go未注册/captain/rag/*路由 - 修复成本:低(~20 行 bootstrap + router 代码)
缺口 G3:AutoReplyRule 未接入
- 影响:无法实现"消息进来 → AI 自动回复"
- 位置:
auto_reply_rule_models.go模型完整(static/llm/mixed),但:- 无完整的条件匹配引擎
- 无消息接收时的规则匹配钩子
- 无路由注册
- 修复成本:中(需实现条件匹配 + 消息流程集成)
缺口 G4:CaptainConversationService 被忽略
- 影响:会话级 AI 自动响应(handoff 模式)不可用
- 位置:
bootstrap.go:594_ = captainConversationService - 修复成本:中(需接入消息接收流程 + handoff 逻辑)
缺口 G5:AgentBot 仅支持 Webhook
- 影响:无法实现"AgentBot 绑定 Captain Assistant → 端到端 AI 客服"
- 位置:
agent_bot.go只有 webhook 推送模式 - 修复成本:中高(需扩展 AgentBot 类型 + 消息路由)
缺口 G6:Help Center 语义搜索缺失
- 影响:帮助中心文章无法语义搜索
- 位置:
ArticleEmbedding表存在,article_service.go无搜索方法 - 修复成本:中(需实现 embedding 生成 + pgvector 搜索 + API + 前端)
缺口 G7:Function Calling 未实际使用
- 影响:CustomTool 定义了但 LLM 调用时未传 tools 参数,AI 无法调用工具
- 位置:
llm/provider.go的ToolDefinition已定义;captain_task_service.go/captain_conversation_service.go的ChatRequest未设置Tools字段 - 修复成本:中(需实现 tool_call 循环 + HTTP 执行 + 结果回传)
缺口 G8:多 LLM Provider 支持
- 影响:仅支持 OpenAI 兼容 API,无法直接使用 Anthropic/本地模型
- 位置:
llm/下只有openai_provider.go - 修复成本:中(每个 provider ~200 行实现 + 接口适配)
5. 开发路线图
阶段 1:激活现有 AI 功能(P0,1-2 天)
目标:让已写好的 90% 代码真正跑起来,实现"配置即可用"。
前提:需要一个可用的 LLM API Key(OpenAI 或兼容端点)。
任务 1.1:config.yaml 添加 captain 配置段
文件:backend/configs/config.yaml
captain:
enabled: true
llm_provider: "openai" # openai, azure, custom
llm_model: "gpt-4o-mini" # 可按需改为 gpt-4o / gpt-3.5-turbo
llm_api_key: "" # 通过 .env: GOCHAT_CAPTAIN_LLM_API_KEY 注入
llm_base_url: "https://api.openai.com/v1" # 国内可改为火山引擎/豆芽等端点
embedding_model: "text-embedding-3-small"
embedding_dims: 1536
max_tokens: 1024
temperature: 0.7
同时更新 config.dev.yaml 和 config.prod.yaml 的 captain 段(如有)。
验收:go run cmd/gochat/main.go serve 启动后,日志输出 LLM provider 初始化成功。
任务 1.2:注册 RAG 路由
文件修改:
-
backend/internal/app/bootstrap.go:- 实例化
RAGService(注入captainAssistantResponseRepo+captainAssistantRepo+llmProvider) - 实例化
RAGHandler(注入RAGService) - 添加到
Handlers结构体
- 实例化
-
backend/internal/router/router.go:// RAG Knowledge Base Q&A rag := captain.Group("/rag") { rag.POST("/query", h.RAG.Query) rag.POST("/index/:response_id", h.RAG.IndexResponse) }
验收:curl -X POST /api/v1/accounts/1/captain/rag/query -d '{"assistant_id":1,"question":"test"}'
返回非 404。
任务 1.3:取消 CaptainConversationService 忽略
文件:backend/internal/app/bootstrap.go:594
将 _ = captainConversationService 改为注入到 Handlers 或消息处理流程。
最小改动:将其传入 CaptainAssistantHandler 或新建一个 handler 方法,
供后续阶段 2 的 AgentBot 集成使用。
验收:编译通过,captainConversationService 不再被忽略。
任务 1.4:端到端验证
配置真实 LLM API Key 后测试:
- Playground 对话:
POST /captain/assistants/:id/playground - 回复建议:
POST /captain/tasks/reply_suggestion - RAG 问答:
POST /captain/rag/query - Copilot 流式:
GET /captain/copilot/stream - 前端 Copilot 面板对话
交付物:AI 功能在开发环境完整可用。
阶段 2:自动回复与端到端 AI 客服(P1,3-5 天)
目标:实现"客户消息进来 → AI 自动响应"的闭环。
任务 2.1:AutoReplyRule 完整接入
子任务:
-
条件匹配引擎(
auto_reply_rule_service.go):- 实现
MatchRules(ctx, accountID, conversationID, messageContent) ([]CaptainAutoReplyRule, error) - 支持 condition 字段:
message_content(contains/regex/equals)、sender_type、conversation_status、language、keywords - 按 priority 排序,返回第一个匹配的规则
- 实现
-
消息钩子集成:
- 在消息接收流程(
channel/incoming.go或message_service.go)中, 消息入库后调用AutoReplyRuleService.MatchRules - 匹配到规则时:
static模式:直接发送ResponseTextllm模式:调用CaptainAssistantService.GenerateResponse生成回复mixed模式:static 前缀 + LLM 正文
- 尊重
DelaySeconds和OneTimeOnly配置 - 通过 WorkerPool 异步执行(避免阻塞消息接收)
- 在消息接收流程(
-
路由注册:
autoReplyRules := captain.Group("/auto_reply_rules") { autoReplyRules.GET("", h.AutoReplyRule.List) autoReplyRules.POST("", h.AutoReplyRule.Create) autoReplyRules.GET("/:rule_id", h.AutoReplyRule.Get) autoReplyRules.PUT("/:rule_id", h.AutoReplyRule.Update) autoReplyRules.DELETE("/:rule_id", h.AutoReplyRule.Delete) } -
前端:
- 复用 Chatwoot 前端 auto-reply 设置页(如已 vendored)
- 新增 API 客户端
api/captain/autoReplyRules.js
验收:创建一条 llm 模式规则 → 发送匹配消息 → AI 自动回复。
任务 2.2:AgentBot + Captain 集成
子任务:
-
扩展 AgentBot 模型(
agent_bot.go):- 新增
BotType字段:webhook(现有) /captain(新增) captain类型时关联AssistantID
- 新增
-
消息路由:
- 在消息分配逻辑中,当 inbox 的 AgentBot 类型为
captain时, 消息直接路由到CaptainConversationService.BuildConversationResponseByAccount - AI 生成的回复作为
agent_bot消息发送到会话
- 在消息分配逻辑中,当 inbox 的 AgentBot 类型为
-
Handoff 逻辑:
CaptainConversationResponse.Action == "handoff"时,将会话转给人工客服- 更新会话 status + assignee
-
前端:
- AgentBot 管理页支持选择
captain类型 + 关联 Assistant
- AgentBot 管理页支持选择
验收:配置一个 captain 类型 AgentBot → 客户发消息 → AI 自动回复 → AI 判断需转人工时 handoff。
任务 2.3:CaptainConversationService 完整接入
子任务:
-
工具调用实现:
- 将
CaptainCustomTool列表转为llm.ToolDefinition传入ChatRequest.Tools - 解析 LLM 返回的
tool_call→ 执行 HTTP 请求(按 CustomTool 的 endpoint/auth/template) - 将 tool 结果回传 LLM → 继续生成
- 将
-
可用工具(
AvailableTools已定义 7 个):add_contact_note/add_private_note/update_priorityadd_label_to_conversation/faq_lookup/resolve_conversation/handoff- 实现每个工具的执行函数
验收:AI 能在对话中调用自定义工具(如查询订单、添加标签)。
阶段 3:增强 AI 能力深度(P2,1-2 周)
任务 3.1:Help Center 语义搜索
子任务:
article_service.go添加SearchByEmbedding(ctx, query, limit)方法- 调用
llmProvider.CreateEmbedding生成查询向量 - pgvector 余弦相似度搜索
ArticleEmbedding表
- 调用
- 文章创建/更新时自动生成 embedding(通过 Worker 异步)
- API:
GET /api/v1/portals/:portal_id/articles/search?q=... - 前端帮助中心搜索框接入
验收:搜索"如何重置密码"能找到相关文章(即使标题不含"重置")。
任务 3.2:Function Calling 完整实现
详见阶段 2 任务 2.3 的工具调用实现。此阶段将其推广到所有 AI 服务:
CopilotService— Copilot 对话中可调用工具CaptainTaskService— 回复建议时可调用 FAQ 查询工具CaptainAssistantService.GenerateResponse— Playground 对话中可调用工具
任务 3.3:多 LLM Provider 支持
子任务:
llm/anthropic_provider.go— Claude 系列(不同 API 格式,需适配)llm/volcengine_provider.go— 火山引擎/豆包(OpenAI 兼容,可能只需 baseURL 配置)llm/qwen_provider.go— 通义千问(OpenAI 兼容)- Provider 工厂函数:根据
config.captain.llm_provider选择实现 - 前端
ModelSelector已有 UI,后端按 feature(editor/assistant/copilot)支持不同模型
验收:配置 llm_provider: "anthropic" 后,AI 功能使用 Claude 模型。
任务 3.4:上下文窗口优化
子任务:
CopilotContextService实现 token 计数(tiktoken Go 库或近似估算)- 滑动窗口截断:超过 token 上限时,截断早期消息
- 长会话自动摘要:超过阈值时,用 LLM 摘要历史消息作为 system 上下文
- 配置项:
captain.max_context_tokens(默认 4096)
验收:100+ 条消息的长会话不会超出 token 限制,AI 仍能理解上下文。
阶段 4:企业级能力(P3,2-4 周,按需)
任务 4.1:AI 用量统计与配额
- 按 account/user 统计 token 消耗(prompt_tokens + completion_tokens)
- 存储到
captain_usage_logs表 - 配额限制:前端
captainLimits结构已存在,后端实现拦截逻辑 - 用量仪表盘:
GET /captain/usage返回统计数据 - 前端设置页展示用量进度条
任务 4.2:AI 响应质量管控
CopilotSuggestionMessage的accepted/rejected状态反馈循环- 基于反馈优化 prompt(few-shot 示例注入:被接受的回复作为正例)
- A/B 测试框架:同一请求发到两个模型/prompt 配置,比较接受率
- 质量指标:接受率、拒绝率、编辑率(用户发送前修改了多少)
任务 4.3:多语言 AI
CaptainPreference.Language传入 LLM system prompt- 回复建议/摘要/改写尊重目标语言
- Help Center 文章跨语言语义搜索(embedding 包含语言信息)
- Auto-Reply Rule 的
language条件匹配
任务 4.4:AI 审计日志
- 记录每次 AI 调用:prompt / response / model / token 消耗 / user / timestamp / feature
- 存储到
captain_audit_logs表 - API:
GET /captain/audit_logs(管理员可见) - 合规审计支持:导出 CSV / 按时间范围筛选
6. 风险评估与依赖
6.1 技术风险
| 风险 | 影响 | 缓解措施 |
|---|---|---|
| LLM API 调用超时/失败 | AI 功能不可用 | 已有重试机制(3 次指数退避);需加 fallback 策略(降级到静态回复) |
| pgvector 维度不匹配 | RAG 搜索失败 | 当前固定 1536 维(text-embedding-3-small);更换 embedding 模型时需迁移 |
| Token 消耗成本 | 生产环境费用 | 阶段 4 实现配额限制;阶段 1-3 开发环境用 gpt-4o-mini 控制成本 |
| SSE 连接稳定性 | 流式响应中断 | 已有 X-Accel-Buffering: no;需加心跳机制和断线重连 |
| 并发 LLM 调用 | 速率限制 | 需实现请求队列 + 限流(令牌桶) |
6.2 外部依赖
| 依赖 | 用途 | 状态 |
|---|---|---|
| LLM API(OpenAI/兼容) | Chat + Embedding | 需配置 API Key |
| pgvector 扩展 | 向量搜索 | ✅ 已安装(PG 17 + pgvector) |
| 帮助中心爬取 | 文档同步 | 需 HTTP 客户端(已有 resty) |
6.3 前端依赖
前端代码来自 Chatwoot Vue 3 vendored,AI 相关 UI 组件已存在(CopilotContainer、Captain 设置页、 ModelSelector、FeatureToggle)。阶段 1-2 的前端改动极小,主要是确保 API 端点与前端调用路径一致。
7. 附录:关键文件索引
后端
| 文件 | 说明 |
|---|---|
backend/internal/llm/provider.go |
LLM Provider 接口 + 数据结构 |
backend/internal/llm/openai_provider.go |
OpenAI 兼容 Provider 实现 |
backend/internal/model/captain_models.go |
Captain 全部数据模型 |
backend/internal/model/copilot_models.go |
Copilot 线程/消息/建议模型 |
backend/internal/model/auto_reply_rule_models.go |
自动回复规则模型 |
backend/internal/model/article_embedding.go |
帮助中心文章 embedding |
backend/internal/config/config.go |
CaptainConfig 配置结构 |
backend/internal/app/bootstrap.go |
依赖注入(LLM Provider + Captain Services) |
backend/internal/router/router.go |
路由注册(captain 命名空间 ~L1319-1489) |
backend/internal/service/captain_assistant_service.go |
助手 CRUD + Playground + RAG |
backend/internal/service/captain_task_service.go |
回复建议/摘要/改写(含 Stream) |
backend/internal/service/captain_task_extended_service.go |
批量标签/跟进 |
backend/internal/service/copilot_service.go |
Copilot 线程管理 |
backend/internal/service/copilot_context_service.go |
会话上下文组装 |
backend/internal/service/rag_service.go |
RAG 全流程 |
backend/internal/service/conversation_insight_service.go |
会话洞察 |
backend/internal/service/captain_conversation_service.go |
会话级 AI 响应(被忽略) |
backend/internal/service/captain_document_service.go |
文档同步 |
backend/internal/service/captain_document_worker.go |
文档 Worker |
backend/internal/service/copilot_response_worker.go |
Copilot 响应 Worker |
backend/internal/service/system_prompt_builder.go |
Prompt 构建 |
backend/internal/handler/api/v1/rag_handler.go |
RAG Handler(未接入) |
backend/internal/handler/api/v1/sse_stream_handler.go |
SSE 流式 Handler |
backend/internal/handler/api/v1/captain_assistant_handler.go |
助手 Handler |
backend/internal/handler/api/v1/captain_task_handler_test.go |
任务 Handler 测试 |
backend/internal/handler/api/v1/auto_reply_rule_handler.go |
自动回复规则 Handler |
前端
| 文件 | 说明 |
|---|---|
frontend/app/javascript/dashboard/routes/dashboard/settings/captain/Index.vue |
Captain 设置页 |
frontend/app/javascript/dashboard/routes/dashboard/settings/captain/components/ModelDropdown.vue |
模型下拉选择 |
frontend/app/javascript/dashboard/components/copilot/CopilotContainer.vue |
Copilot 侧边栏 |
frontend/app/javascript/dashboard/components-next/copilot/Copilot.vue |
新版 Copilot 组件 |
frontend/app/javascript/dashboard/composables/useCaptain.js |
Captain composable |
frontend/app/javascript/dashboard/composables/useCopilotReply.js |
回复建议 composable |
frontend/app/javascript/dashboard/composables/useLabelSuggestions.js |
标签建议 composable |
frontend/app/javascript/dashboard/api/captain/*.js |
12 个 API 客户端 |
frontend/app/javascript/dashboard/featureFlags.js |
Feature flags 定义 |
配置
| 文件 | 说明 |
|---|---|
backend/configs/config.yaml |
基础配置(缺少 captain 段) |
backend/internal/config/config.go |
CaptainConfig 结构体 + ENV 映射 |
文档
| 文件 | 说明 |
|---|---|
docs/comparison/M10-captain-chatwoot-vs-gochat.md |
Chatwoot vs GoChat 模型级对比 |
docs/PRD.md |
产品需求文档 |
路线图时间线总览
阶段 1 (P0, 1-2天) 阶段 2 (P1, 3-5天) 阶段 3 (P2, 1-2周) 阶段 4 (P3, 2-4周)
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 1.1 config.yaml │ │ 2.1 AutoReply │ │ 3.1 HC 语义搜索 │ │ 4.1 用量统计 │
│ captain 段 │ │ 规则接入 │ │ 3.2 Function │ │ 4.2 质量管控 │
│ 1.2 RAG 路由 │ │ 2.2 AgentBot + │ │ Calling 推广│ │ 4.3 多语言 AI │
│ 1.3 取消忽略 │ │ Captain 集成 │ │ 3.3 多 Provider │ │ 4.4 审计日志 │
│ 1.4 端到端验证 │ │ 2.3 工具调用实现 │ │ 3.4 上下文优化 │ │ │
└─────────────────┘ └─────────────────┘ └─────────────────┘ └─────────────────┘
▲ 激活现有功能 ▲ 自动回复闭环 ▲ 智能化增强 ▲ 企业级能力
│ │ │ │
└── 最高优先级 ───────┴── 核心价值 ──────────┴── 渐进增强 ───────────┴── 按需实现
文档结束。如需开始执行阶段 1 的修改,请告知。