feat: add OpencodeGo AI provider (deepseek-v4-flash) as primary, existing providers as fallback

This commit is contained in:
TradeMate Dev
2026-05-15 19:59:25 +08:00
parent ac51716097
commit 98e2542c52
5 changed files with 34 additions and 7 deletions
+2 -1
View File
@@ -4,5 +4,6 @@ from .deepl import DeepLProvider
from .local import LocalProvider from .local import LocalProvider
from .spark import SparkProvider from .spark import SparkProvider
from .sensenova import SensenovaProvider from .sensenova import SensenovaProvider
from .opencode_go import OpencodeGoProvider
__all__ = ["OpenAIProvider", "ClaudeProvider", "DeepLProvider", "LocalProvider", "SparkProvider", "SensenovaProvider"] __all__ = ["OpenAIProvider", "ClaudeProvider", "DeepLProvider", "LocalProvider", "SparkProvider", "SensenovaProvider", "OpencodeGoProvider"]
+7
View File
@@ -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}"
+12 -1
View File
@@ -1,6 +1,6 @@
from typing import Dict, Any, Optional, List from typing import Dict, Any, Optional, List
from app.ai.base import AIProvider 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.config import settings
from app.ai.trade_corpus import TradeCorpus from app.ai.trade_corpus import TradeCorpus
import logging import logging
@@ -34,6 +34,17 @@ class AIRouter:
except Exception as e: except Exception as e:
logger.warning(f"Sensenova init failed: {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: if settings.ANTHROPIC_API_KEY:
try: try:
self.providers["anthropic"] = ClaudeProvider(api_key=settings.ANTHROPIC_API_KEY) self.providers["anthropic"] = ClaudeProvider(api_key=settings.ANTHROPIC_API_KEY)
+9 -5
View File
@@ -43,6 +43,10 @@ class Settings(BaseSettings):
LOCAL_MODEL_ENABLED: bool = False LOCAL_MODEL_ENABLED: bool = False
LOCAL_MODEL_URL: str = "http://localhost:8001" 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_API_TOKEN: Optional[str] = None
WHATSAPP_PHONE_NUMBER_ID: Optional[str] = None WHATSAPP_PHONE_NUMBER_ID: Optional[str] = None
WHATSAPP_WEBHOOK_VERIFY_TOKEN: Optional[str] = None WHATSAPP_WEBHOOK_VERIFY_TOKEN: Optional[str] = None
@@ -63,11 +67,11 @@ class Settings(BaseSettings):
DEBUG: bool = True DEBUG: bool = True
AI_ROUTING: dict = { AI_ROUTING: dict = {
"translate": {"primary": "sensenova", "fallback": ["openai", "local"]}, "translate": {"primary": "opencode_go", "fallback": ["sensenova", "openai", "local"]},
"reply": {"primary": "sensenova", "fallback": ["anthropic", "local"]}, "reply": {"primary": "opencode_go", "fallback": ["sensenova", "anthropic", "local"]},
"marketing": {"primary": "sensenova", "fallback": ["openai", "local"]}, "marketing": {"primary": "opencode_go", "fallback": ["sensenova", "openai", "local"]},
"extract": {"primary": "sensenova", "fallback": ["openai"]}, "extract": {"primary": "opencode_go", "fallback": ["sensenova", "openai"]},
"quotation": {"primary": "sensenova", "fallback": ["openai"]}, "quotation": {"primary": "opencode_go", "fallback": ["sensenova", "openai"]},
} }
FREE_DAILY_TRANSLATE_CHARS: int = 5000 FREE_DAILY_TRANSLATE_CHARS: int = 5000
+4
View File
@@ -31,6 +31,10 @@ IFLYTEK_MODEL=astron-code-latest
LOCAL_MODEL_ENABLED=false LOCAL_MODEL_ENABLED=false
LOCAL_MODEL_URL=http://localhost:8001 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 Cloud API
WHATSAPP_API_TOKEN= WHATSAPP_API_TOKEN=
WHATSAPP_PHONE_NUMBER_ID= WHATSAPP_PHONE_NUMBER_ID=