rogee
f923791d39
update
2026-07-12 12:20:23 +08:00
rogee
7f2d5579ff
fix: stabilize development config and account settings
2026-07-11 17:15:38 +08:00
rogee
762de6aa3b
feat: migrate worker job dispatch from DB polling to Redis Streams
...
- worker.go: add Redis fields, XADD on Enqueue, XREADGROUP BLOCK consumer
loop, sweep compensation for delayed/failed jobs, DB-polling fallback
when rdb is nil, XGroupCreateMkStream for idempotent consumer groups
- config.go: extend WorkerConfig with stream_prefix, consumer_group,
block_timeout_s, sweep_interval_s + defaults, env bindings, reloadable
- validator.go: validate new worker Redis fields
- bootstrap.go: fix concurrency bug (NewWorkerPoolWithOptions with Redis
+ cfg.Worker.Concurrency), reorder rdb init before worker pool
- config.dev.yaml/config.prod.yaml: add worker Redis params
- worker_test.go: 6 new miniredis tests (end-to-end, fallback, sweep,
multi-consumer competition, group creation, Redis failure recovery)
- config_test.go/reloader_test.go: adapt fixtures for new fields
2026-07-10 12:56:32 +08:00
rogee
05af5ebcbc
fix: harden fake channel — production guard, token validation, typing events, URL validation, capability narrowing
...
- Guard fake channel with GOCHAT_ENV check: skip init() registration,
bootstrap wiring, and inbox creation in production
- Reject empty-token webhooks in production (was silently skipped)
- Use PostgreSQL jsonb @> query for inbox lookup, keep SQLite fallback
- Replace isValidURL string-prefix hack with net/url.Parse
- Handle typing.start/typing.stop by returning nil (no garbage messages)
- Narrow Capabilities to only implemented features (Attachments, Replies)
- Hide fake channel from frontend channel list in production builds
2026-07-10 10:55:54 +08:00
rogee
9c852cd99b
add fake channel
2026-07-09 18:14:45 +08:00
rogee
0dabb8cfa5
docs: 整理文档目录结构 — 清理过时文档、归集功能子目录、统一命名规范
...
清理:
- 删除 34 份过时文档(gap reports/QA临时报告/验收报告/阶段性文档)
- 删除 docs/.hermes/skills 第三方 skills 副本(16 文件)
- 删除 skills-lock.json
目录归集:
- 根目录仅保留 README.md 索引
- product/ — 产品与架构设计(PRD + ARCHITECTURE + P2设计文档 + AI/企业路线图)
- tracking/ — Chatwoot parity 开发跟踪
- requirements/ — M01-M12 模块需求
- plans/ — 历史实现计划
- parity/ — 路由 parity 与前端契约
- qa/ — QA 报告与测试计划
- ops/ — 运维部署
命名规范:
- 全小写 kebab-case,禁止全大写文件名
- product/tracking/ops 用 NN- 序号前缀
- requirements 用 MNN- 两位零填充模块号
- plans/qa 用 YYYY-MM-DD- 日期前缀
- requirements M1-M9 零填充为 M01-M09(修复字典序)
同步更新:
- backend/cmd/route_parity/main.go 路径默认值
- backend/scripts/parity_frontend_smoke.sh 报告路径
- 所有 docs 内部交叉引用
- .gitignore 排除编译产物 (backend/gochat, backend/route_parity)
- 新增迁移 000052/000053
- 前端 WS 相关修改
2026-07-09 14:53:27 +08:00
rogee
af5c7c6bc7
Phase 3.3: Multi LLM Provider support (Anthropic Claude)
...
- anthropic_provider.go (new): AnthropicProvider implementing the Provider
interface using Claude's messages API. Handles:
- System prompt as top-level param (not in messages array)
- Content blocks response format → extract text
- SSE streaming with Anthropic event types (content_block_delta, message_stop)
- Anthropic-specific headers (x-api-key, anthropic-version)
- Retry with exponential backoff (shared logic with OpenAI provider)
- Embedding API returns error (Anthropic has no embeddings; OpenAI-compat
provider should be used for embeddings)
- NewProviderFromConfig factory function: selects AnthropicProvider for
provider="anthropic"/"claude", OpenAIProvider for all others
- bootstrap.go: use NewProviderFromConfig instead of hardcoded NewOpenAIProvider,
allowing config.captain.llm_provider to switch between providers
Note: domestic providers (Volcengine/Doubao/Qwen) use OpenAI-compatible API
and work with the existing OpenAIProvider by setting llm_base_url.
Verified: go build + go vet + go test all pass
2026-07-08 15:38:08 +08:00
rogee
b2f36a20a0
Phase 3.2: Function Calling — tool_call loop for AI services
...
- llm/provider.go: extend ChatMessage with ToolCalls, ToolCallID, Name
fields; add ToolCall + ToolCallFunction structs for parsing LLM
function call responses
- tool_execution_service.go (new): ToolExecutionService that converts
CaptainCustomTool → LLM ToolDefinition, executes HTTP tool calls
(GET/POST/PUT with bearer/basic/api-key auth), and runs the full
tool_call loop (LLM → tool_call → execute → result → LLM → final
answer) with maxIterations safeguard
- captain_conversation_service.go: add toolExecSvc field +
SetToolExecutionService method; use RunToolCallLoop in
generateConversationResponse when tools are available, with graceful
fallback to plain LLM call on error
- bootstrap.go: instantiate ToolExecutionService and inject into
CaptainConversationService
Verified: go build + go vet + go test all pass
2026-07-08 15:38:08 +08:00
rogee
c72e359e48
Phase 3.1: Help Center semantic search with pgvector
...
- ArticleEmbeddingRepo (new): Upsert, GetByArticleID, DeleteByArticleID,
SearchByEmbedding using pgvector cosine distance (vector_embedding column)
- ArticleEmbedding model: add VectorEmbedding pgvector.Vector field
alongside existing JSONB Embedding (backward compatible)
- ArticleService: add SemanticSearch() — generates query embedding via LLM,
searches articles by cosine similarity; add GenerateEmbedding() — creates
and stores article embedding from title+description+content
- ArticleHandler: add SemanticSearch endpoint
GET /portals/:portal_id/articles/semantic_search?query=...
- bootstrap.go: inject articleEmbeddingRepo + llmProvider into ArticleService
- router.go: register /articles/semantic_search route
- migration 000049: add vector(1536) column to article_embeddings table,
create ivfflat index, migrate existing JSONB data to vector format
Verified: go build + go vet + go test all pass
2026-07-08 15:38:08 +08:00
rogee
b769b9a3e4
Phase 2: AutoReplyRule integration + AgentBot Captain type
...
AutoReplyRule complete integration:
- bootstrap.go: instantiate AutoReplyRuleService + AutoReplyListener,
register listener on channel dispatcher for message.created events
- router.go: register /captain/auto_reply_rules CRUD + /evaluate routes
- auto_reply_rule_handler.go: fix c.Param(id) → c.Param(account_id),
override evalCtx.AccountID from path param
- auto_reply_rule_service.go: add JSON tags to AutoReplyEvaluationContext
for correct request body binding
- auto_reply_listener.go (new): EventListener that triggers on incoming
messages, evaluates active rules, composes reply (static/LLM/mixed),
respects DelaySeconds and OneTimeOnly flags, sends via MessageService
- migration 000048: create captain_auto_reply_rules table
AgentBot + Captain integration:
- agent_bot_listener.go: add captainConvSvc field + SetCaptainConversationService
method. In HandleEvent loop, check bot.BotType == captain and route
to CaptainConversationService.BuildConversationResponseByAccount
instead of webhook push. Extract assistant_id from bot.Config JSONB,
extract conversation_id from event data.
- bootstrap.go: inject captainConversationService into agentBotListener
CaptainConversationService improvement:
- generateConversationResponse: use assistant config for system prompt,
model name, and temperature instead of hardcoded values
Verified:
- go build ./... passes
- go vet passes on all internal packages
- go test passes (service + repository + llm, SQLite mode)
- Auto-reply CRUD: create/get/update/delete all work
- Auto-reply evaluate: correctly matches hello → should_reply=true,
correctly rejects non-matching message
- Existing routes unaffected (assistants, RAG, conversation respond)
- Migration 000048 creates captain_auto_reply_rules table successfully
2026-07-08 15:38:08 +08:00
rogee
42b8b6c7f9
Activate Captain AI features: config, RAG routes, conversation handler
...
Phase 1 of AI_FEATURE_ROADMAP.md:
1. config.yaml: Add captain configuration section (llm_provider, llm_model,
llm_api_key, llm_base_url, embedding_model, embedding_dims, max_tokens,
temperature). Secrets injected via GOCHAT_CAPTAIN_LLM_API_KEY env var.
2. RAG route registration:
- bootstrap.go: instantiate RAGService + RAGHandler, add to Handlers
- router.go: register POST /captain/rag/query + /captain/rag/index/:response_id
- rag_handler.go: fix account_id param name (was "id", route uses "account_id")
3. CaptainConversationService activation:
- Remove "_ = captainConversationService" ignore in bootstrap.go
- Create CaptainConversationHandler with BuildResponse endpoint
- Register POST /captain/conversations/:conversation_id/respond route
- Fix account_id param name in handler
Verified:
- go build ./... passes
- go vet passes on all modified packages
- go test passes (llm + service packages)
- Server starts with captain config loaded
- RAG query/index routes return proper handler responses (not 404)
- Conversation respond route returns proper skip for non-pending conversations
- Existing captain routes unaffected (assistants list still works)
2026-07-08 15:38:08 +08:00
rogee
e61b2acf6d
Bridge channel dispatcher events to WebSocket EventPublisher for real-time delivery
2026-07-08 09:02:44 +08:00
rogee
aeddedf2a3
Reorganize repo: backend/, deploy/, docs/ layout + AGENTS.md
...
Restructure the monorepo into clear top-level directories:
- backend/: Go module root (cmd, internal, pkg, configs, migrations,
docs/swagger, scripts, tests, go.mod, Makefile, .air.toml)
- deploy/: Docker (Dockerfile, docker-compose*), quickstart, fluentd
- docs/: project documentation + reports/ (moved from repo root)
- AGENTS.md: new AI coding-agent guide at repo root
Update all references to the new layout:
- Dockerfile: COPY backend/go.mod, COPY backend/ (context = repo root)
- docker-compose files: context ../.., dockerfile deploy/docker/Dockerfile,
env_file ../../.env, volume mounts ../../backend:/app
- deploy/quickstart/compose.yaml: dockerfile deploy/docker/Dockerfile
- CI: working-directory: backend for go commands, file deploy/docker/Dockerfile,
coverage path backend/coverage.out, health_check backend/scripts/
- backend/Makefile: docker target uses -f ../deploy/docker/Dockerfile ../
- README: architecture tree, quickstart, config paths updated
Move root stray scripts (rename_models.*, run_m11_tests.sh, verify_build.sh,
gorm_bool_main.go) to backend/scripts/legacy/. All moves via git mv to
preserve history. Build, vet, SQLite tests, and docker compose config verified.
2026-07-07 14:44:12 +08:00