Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .env-template
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ INTERNAL_KEY=<internal key for worker-to-backend authentication>
# GOOGLE_API_KEY=<your-google-api-key>
# GROQ_API_KEY=<your-groq-api-key>
# NOVITA_API_KEY=<your-novita-api-key>
# ASTRAFLOW_API_KEY=<your-astraflow-api-key> # Global: https://astraflow.ucloud-global.com
# ASTRAFLOW_CN_API_KEY=<your-astraflow-cn-api-key> # China: https://astraflow.ucloud.cn
# OPEN_ROUTER_API_KEY=<your-openrouter-api-key>

# Remote Embeddings (Optional - for using a remote embeddings API instead of local SentenceTransformer)
Expand Down
4 changes: 4 additions & 0 deletions application/core/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,8 @@ class Settings(BaseSettings):
HUGGINGFACE_API_KEY: Optional[str] = None
OPEN_ROUTER_API_KEY: Optional[str] = None
NOVITA_API_KEY: Optional[str] = None
ASTRAFLOW_API_KEY: Optional[str] = None
ASTRAFLOW_CN_API_KEY: Optional[str] = None

OPENAI_API_BASE: Optional[str] = None # azure openai api base url
OPENAI_API_VERSION: Optional[str] = None # azure openai api version
Expand Down Expand Up @@ -206,6 +208,8 @@ def _normalize_pgvector_connection_string_validator(cls, v):
"GROQ_API_KEY",
"HUGGINGFACE_API_KEY",
"NOVITA_API_KEY",
"ASTRAFLOW_API_KEY",
"ASTRAFLOW_CN_API_KEY",
"EMBEDDINGS_KEY",
"FALLBACK_LLM_API_KEY",
"QDRANT_API_KEY",
Expand Down
35 changes: 35 additions & 0 deletions application/llm/astraflow.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
from application.core.settings import settings
from application.llm.openai import OpenAILLM

ASTRAFLOW_BASE_URL = "https://api-us-ca.umodelverse.ai/v1"
ASTRAFLOW_CN_BASE_URL = "https://api.modelverse.cn/v1"


class AstraflowLLM(OpenAILLM):
"""Astraflow global endpoint (OpenAI-compatible)."""

provider_name = "astraflow"

def __init__(self, api_key=None, user_api_key=None, base_url=None, *args, **kwargs):
super().__init__(
api_key=api_key or settings.ASTRAFLOW_API_KEY or settings.API_KEY,
user_api_key=user_api_key,
base_url=base_url or ASTRAFLOW_BASE_URL,
*args,
**kwargs,
)


class AstraflowCNLLM(OpenAILLM):
"""Astraflow China endpoint (OpenAI-compatible)."""

provider_name = "astraflow_cn"

def __init__(self, api_key=None, user_api_key=None, base_url=None, *args, **kwargs):
super().__init__(
api_key=api_key or settings.ASTRAFLOW_CN_API_KEY or settings.API_KEY,
user_api_key=user_api_key,
base_url=base_url or ASTRAFLOW_CN_BASE_URL,
*args,
**kwargs,
)
3 changes: 3 additions & 0 deletions application/llm/providers/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

from typing import Dict, List

from application.llm.providers.astraflow import AstraflowCNProvider, AstraflowProvider
from application.llm.providers.anthropic import AnthropicProvider
from application.llm.providers.azure_openai import AzureOpenAIProvider
from application.llm.providers.base import Provider
Expand Down Expand Up @@ -40,6 +41,8 @@
GroqProvider(),
OpenRouterProvider(),
NovitaProvider(),
AstraflowProvider(),
AstraflowCNProvider(),
HuggingFaceProvider(),
LlamaCppProvider(),
PremAIProvider(),
Expand Down
40 changes: 40 additions & 0 deletions application/llm/providers/astraflow.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
from __future__ import annotations

from typing import Optional

from application.llm.astraflow import AstraflowCNLLM, AstraflowLLM
from application.llm.providers._apikey_or_llm_name import (
filter_models_by_llm_name,
get_api_key,
)
from application.llm.providers.base import Provider


class AstraflowProvider(Provider):
"""Astraflow global endpoint — OpenAI-compatible, 200+ models."""

name = "astraflow"
llm_class = AstraflowLLM

def get_api_key(self, settings) -> Optional[str]:
return get_api_key(settings, self.name, settings.ASTRAFLOW_API_KEY)

def filter_yaml_models(self, settings, models):
return filter_models_by_llm_name(
settings, self.name, settings.ASTRAFLOW_API_KEY, models
)


class AstraflowCNProvider(Provider):
"""Astraflow China endpoint — OpenAI-compatible, 200+ models."""

name = "astraflow_cn"
llm_class = AstraflowCNLLM

def get_api_key(self, settings) -> Optional[str]:
return get_api_key(settings, self.name, settings.ASTRAFLOW_CN_API_KEY)

def filter_yaml_models(self, settings, models):
return filter_models_by_llm_name(
settings, self.name, settings.ASTRAFLOW_CN_API_KEY, models
)
Loading