chore: layout optimize

This commit is contained in:
qixinbo
2026-03-29 14:44:32 +08:00
parent 74fb360df6
commit 22e1891a57
10 changed files with 1316 additions and 925 deletions
+96
View File
@@ -0,0 +1,96 @@
from typing import List, Optional
from fastapi import APIRouter, HTTPException, Depends
from openai import OpenAI
from app.schemas.embedding_model import (
EmbeddingModelConfig,
EmbeddingModelConfigCreate,
EmbeddingModelConfigUpdate,
EmbeddingModelConnectionTestRequest
)
from app.services.embedding_model_store import embedding_model_store
from app.services.openai_compat import normalize_openai_base_url
from app.api.llm import get_admin_user, get_current_user, CurrentUser
router = APIRouter()
def _mask_api_key(value: Optional[str]) -> Optional[str]:
if not value:
return None
if len(value) <= 8:
return "*" * len(value)
return f"{value[:4]}{'*' * (len(value) - 8)}{value[-4:]}"
@router.get("/embedding-models", response_model=List[EmbeddingModelConfig])
def list_embedding_models(current_user: CurrentUser = Depends(get_current_user)):
models = embedding_model_store.list_models()
for m in models:
if not current_user.is_admin:
m["api_key"] = None
return models
@router.post("/embedding-models", response_model=EmbeddingModelConfig)
def create_embedding_model(payload: EmbeddingModelConfigCreate, _: CurrentUser = Depends(get_admin_user)):
return embedding_model_store.create_model(payload.model_dump())
@router.get("/embedding-models/{model_id}", response_model=EmbeddingModelConfig)
def get_embedding_model(model_id: str, current_user: CurrentUser = Depends(get_current_user)):
model = embedding_model_store.get_model(model_id)
if not model:
raise HTTPException(status_code=404, detail="Embedding model not found")
if not current_user.is_admin:
model["api_key"] = None
return model
@router.put("/embedding-models/{model_id}", response_model=EmbeddingModelConfig)
def update_embedding_model(model_id: str, payload: EmbeddingModelConfigUpdate, _: CurrentUser = Depends(get_admin_user)):
model = embedding_model_store.update_model(model_id, payload.model_dump(exclude_unset=True))
if not model:
raise HTTPException(status_code=404, detail="Embedding model not found")
return model
@router.delete("/embedding-models/{model_id}")
def delete_embedding_model(model_id: str, _: CurrentUser = Depends(get_admin_user)):
deleted = embedding_model_store.delete_model(model_id)
if not deleted:
raise HTTPException(status_code=404, detail="Embedding model not found")
return {"status": "success"}
@router.post("/embedding-models/test")
def test_embedding_model_connection(payload: EmbeddingModelConnectionTestRequest, _: CurrentUser = Depends(get_admin_user)):
api_base = normalize_openai_base_url(payload.api_base or "")
api_key = payload.api_key
model_name = (payload.model or "").strip()
if not api_base:
raise HTTPException(status_code=400, detail="API Base is required")
if not api_key:
raise HTTPException(status_code=400, detail="API Key is required")
if not model_name:
raise HTTPException(status_code=400, detail="Model name is required")
try:
client = OpenAI(
api_key=api_key,
base_url=api_base,
)
embedding_resp = client.embeddings.create(
model=model_name,
input="connection test",
)
except Exception as exc:
raise HTTPException(status_code=400, detail=f"Embedding call failed: {exc}")
dimension = None
if getattr(embedding_resp, "data", None):
first = embedding_resp.data[0]
vector = getattr(first, "embedding", None)
if isinstance(vector, list):
dimension = len(vector)
return {
"success": True,
"message": "Connection successful",
"model_name": model_name,
"embedding_dimension": dimension,
}