Commit Graph
2 Commits
Author SHA1 Message Date
rogee 8e1caa8f49 Replace hand-written LLM layer with CloudWeGo Eino framework
EinoProvider (eino_provider.go, new):
- Implements GoChat's llm.Provider interface by delegating to Eino's
  model.BaseChatModel (Generate + Stream) and embedding.Embedder
- Converts GoChat ChatMessage ↔ Eino schema.Message (role/content/tool_calls)
- Converts Eino ResponseMeta (FinishReason/Usage) → GoChat ChatResponse
- Converts Eino StreamReader → GoChat onChunk callback for SSE streaming
- Embedder type alias = eino's embedding.Embedder interface

NewProviderFromConfig factory:
- Uses eino-ext/components/model/openai.NewChatModel for chat model
- Uses eino-ext/components/embedding/openai.NewEmbedder for embeddings
- Works for all OpenAI-compatible providers (OpenAI/Azure/Ark/Doubao/Qwen)
  by setting llm_base_url in config
- Graceful fallback to hand-written OpenAIProvider if Eino init fails
- Removed previous Anthropic provider switch (Eino's OpenAI impl handles
  Claude via OpenAI-compat endpoint)

Dependencies added:
- github.com/cloudwego/eino v0.9.12 (core framework)
- github.com/cloudwego/eino-ext/components/model/openai v0.1.13
- github.com/cloudwego/eino-ext/components/embedding/openai

Verified:
- go build ./... passes
- go vet passes (llm + app packages)
- go test passes (llm + service, SQLite mode)
- Server starts with Eino provider initialized
- All existing routes work (assistants, auto-reply, RAG, conversation)
- RAG query reaches Eino provider (fails on LLM call without API key,
  confirming Eino is the active provider)
2026-07-08 15:38:08 +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