diff --git a/backend/app/ai/providers/__init__.py b/backend/app/ai/providers/__init__.py index d6344d6..922edf3 100644 --- a/backend/app/ai/providers/__init__.py +++ b/backend/app/ai/providers/__init__.py @@ -4,5 +4,6 @@ from .deepl import DeepLProvider from .local import LocalProvider from .spark import SparkProvider from .sensenova import SensenovaProvider +from .opencode_go import OpencodeGoProvider -__all__ = ["OpenAIProvider", "ClaudeProvider", "DeepLProvider", "LocalProvider", "SparkProvider", "SensenovaProvider"] +__all__ = ["OpenAIProvider", "ClaudeProvider", "DeepLProvider", "LocalProvider", "SparkProvider", "SensenovaProvider", "OpencodeGoProvider"] diff --git a/backend/app/ai/providers/opencode_go.py b/backend/app/ai/providers/opencode_go.py new file mode 100644 index 0000000..21775bd --- /dev/null +++ b/backend/app/ai/providers/opencode_go.py @@ -0,0 +1,7 @@ +from app.ai.providers.openai import OpenAIProvider + + +class OpencodeGoProvider(OpenAIProvider): + def __init__(self, api_key: str, model: str = "deepseek-v4-flash", base_url: str = "https://opencode.ai/zen/go/v1"): + super().__init__(api_key=api_key, model=model, base_url=base_url) + self._name = f"opencode-go-{model}" diff --git a/backend/app/ai/router.py b/backend/app/ai/router.py index ca997ca..bea0ef4 100644 --- a/backend/app/ai/router.py +++ b/backend/app/ai/router.py @@ -1,6 +1,6 @@ from typing import Dict, Any, Optional, List from app.ai.base import AIProvider -from app.ai.providers import OpenAIProvider, ClaudeProvider, DeepLProvider, LocalProvider, SparkProvider, SensenovaProvider +from app.ai.providers import OpenAIProvider, ClaudeProvider, DeepLProvider, LocalProvider, SparkProvider, SensenovaProvider, OpencodeGoProvider from app.config import settings from app.ai.trade_corpus import TradeCorpus import logging @@ -34,6 +34,17 @@ class AIRouter: except Exception as e: logger.warning(f"Sensenova init failed: {e}") + if settings.OPENCODE_GO_API_KEY: + try: + self.providers["opencode_go"] = OpencodeGoProvider( + api_key=settings.OPENCODE_GO_API_KEY, + model=settings.OPENCODE_GO_MODEL, + base_url=settings.OPENCODE_GO_BASE_URL, + ) + logger.info("OpencodeGo provider ready") + except Exception as e: + logger.warning(f"OpencodeGo init failed: {e}") + if settings.ANTHROPIC_API_KEY: try: self.providers["anthropic"] = ClaudeProvider(api_key=settings.ANTHROPIC_API_KEY) diff --git a/backend/app/config.py b/backend/app/config.py index e8392f9..3edf264 100644 --- a/backend/app/config.py +++ b/backend/app/config.py @@ -43,6 +43,10 @@ class Settings(BaseSettings): LOCAL_MODEL_ENABLED: bool = False LOCAL_MODEL_URL: str = "http://localhost:8001" + OPENCODE_GO_API_KEY: Optional[str] = None + OPENCODE_GO_BASE_URL: str = "https://opencode.ai/zen/go/v1" + OPENCODE_GO_MODEL: str = "deepseek-v4-flash" + WHATSAPP_API_TOKEN: Optional[str] = None WHATSAPP_PHONE_NUMBER_ID: Optional[str] = None WHATSAPP_WEBHOOK_VERIFY_TOKEN: Optional[str] = None @@ -63,11 +67,11 @@ class Settings(BaseSettings): DEBUG: bool = True AI_ROUTING: dict = { - "translate": {"primary": "sensenova", "fallback": ["openai", "local"]}, - "reply": {"primary": "sensenova", "fallback": ["anthropic", "local"]}, - "marketing": {"primary": "sensenova", "fallback": ["openai", "local"]}, - "extract": {"primary": "sensenova", "fallback": ["openai"]}, - "quotation": {"primary": "sensenova", "fallback": ["openai"]}, + "translate": {"primary": "opencode_go", "fallback": ["sensenova", "openai", "local"]}, + "reply": {"primary": "opencode_go", "fallback": ["sensenova", "anthropic", "local"]}, + "marketing": {"primary": "opencode_go", "fallback": ["sensenova", "openai", "local"]}, + "extract": {"primary": "opencode_go", "fallback": ["sensenova", "openai"]}, + "quotation": {"primary": "opencode_go", "fallback": ["sensenova", "openai"]}, } FREE_DAILY_TRANSLATE_CHARS: int = 5000 diff --git a/deploy/backend/.env.production b/deploy/backend/.env.production index 059229f..9072abe 100644 --- a/deploy/backend/.env.production +++ b/deploy/backend/.env.production @@ -31,6 +31,10 @@ IFLYTEK_MODEL=astron-code-latest LOCAL_MODEL_ENABLED=false LOCAL_MODEL_URL=http://localhost:8001 +OPENCODE_GO_API_KEY= +OPENCODE_GO_BASE_URL=https://opencode.ai/zen/go/v1 +OPENCODE_GO_MODEL=deepseek-v4-flash + # WhatsApp Cloud API WHATSAPP_API_TOKEN= WHATSAPP_PHONE_NUMBER_ID=