feat: add OpencodeGo AI provider (deepseek-v4-flash) as primary, existing providers as fallback
This commit is contained in:
@@ -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"]
|
||||||
|
|||||||
@@ -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}"
|
||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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=
|
||||||
|
|||||||
Reference in New Issue
Block a user