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 .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"]
+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 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)
+9 -5
View File
@@ -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