update model card

This commit is contained in:
qixinbo
2026-03-14 20:58:38 +08:00
parent 6089192575
commit 69c5537a45
4 changed files with 227 additions and 34 deletions
+59
View File
@@ -6,6 +6,7 @@ from fastapi.security import HTTPAuthorizationCredentials, HTTPBearer
from jose import jwt, JWTError
from pydantic import BaseModel, Field
from app.core.security import SECRET_KEY, ALGORITHM
from litellm import completion
router = APIRouter()
security = HTTPBearer()
@@ -56,6 +57,13 @@ class LLMConfigUpdate(BaseModel):
extra_headers: Optional[Dict[str, str]] = None
is_active: Optional[bool] = None
class TestConnectionRequest(BaseModel):
provider: str
model: str
api_key: Optional[str] = None
api_base: Optional[str] = None
extra_headers: Optional[Dict[str, str]] = None
def get_current_user(credentials: HTTPAuthorizationCredentials = Depends(security)) -> CurrentUser:
unauthorized = HTTPException(
@@ -152,3 +160,54 @@ def delete_llm_config(config_id: str, _: CurrentUser = Depends(get_admin_user)):
raise HTTPException(status_code=404, detail="LLM configuration not found")
_save_data(data)
return {"message": "LLM configuration deleted successfully"}
@router.post("/llm/test")
def test_connection(request: TestConnectionRequest, _: CurrentUser = Depends(get_admin_user)):
try:
# Use litellm to test connection
# litellm handles many providers
kwargs = {
"model": request.model,
"messages": [{"role": "user", "content": "Hello"}],
"max_tokens": 5
}
if request.api_key:
kwargs["api_key"] = request.api_key
if request.api_base:
kwargs["api_base"] = request.api_base
if request.extra_headers:
kwargs["extra_headers"] = request.extra_headers
# For OpenAI-compatible endpoints that are not standard OpenAI (like Local, vLLM etc)
# usually user sets provider to "openai" and api_base to their custom URL.
# litellm usually works well if we pass custom_llm_provider="openai" if provider is openai but custom url
# If provider is "local" or "openai", we generally use "openai" format
if request.provider == "local":
kwargs["custom_llm_provider"] = "openai"
elif request.provider:
kwargs["custom_llm_provider"] = request.provider
# If user explicitly selected provider in UI, we might want to respect that
# But litellm completion main arg is 'model'.
# If the UI 'model' input doesn't have prefix, we might need to add it or pass custom_llm_provider.
# Simple heuristic: if provider is set, try to pass it if litellm supports it or just rely on env vars/args
# For this simple test, we just try to call it.
try:
response = completion(**kwargs)
except Exception as first_error:
error_text = str(first_error)
if request.provider and "Provider NOT provided" in error_text and "/" not in request.model:
retry_kwargs = kwargs.copy()
retry_kwargs["model"] = f"{request.provider}/{request.model}"
response = completion(**retry_kwargs)
else:
raise first_error
return {"success": True, "message": "Connection successful", "details": str(response)}
except Exception as e:
raise HTTPException(status_code=400, detail=f"Connection failed: {str(e)}")
+8 -4
View File
@@ -1,12 +1,16 @@
[
{
"id": "m1773487590",
"provider": "zhipuai",
"provider": "openai",
"model": "glm-4-7-251222",
"api_key": "secret",
"api_key": "4a54896c-dac5-4aa6-b618-558dfbd89e4a",
"api_base": "https://ark.cn-beijing.volces.com/api/v3",
"extra_headers": null,
"is_active": true
"extra_headers": {},
"is_active": true,
"name": "glm-4-7-251222",
"model_type": "\u5927\u8bed\u8a00\u6a21\u578b",
"base_model": "glm-4-7-251222",
"protocol_type": "OpenAI"
},
{
"id": "deny1",