40 lines
1.4 KiB
Python
40 lines
1.4 KiB
Python
from fastapi import APIRouter, HTTPException, Request
|
|
from fastapi.responses import StreamingResponse
|
|
from service import JEmbeddingService
|
|
from utils import jingrow_api_verify_and_billing
|
|
from settings import settings
|
|
import json
|
|
|
|
|
|
router = APIRouter(prefix=settings.router_prefix)
|
|
service = JEmbeddingService()
|
|
|
|
|
|
@router.post(settings.generate_route)
|
|
@jingrow_api_verify_and_billing(api_name=settings.api_name)
|
|
async def generate_embeddings(data: dict, request: Request):
|
|
try:
|
|
if "texts" not in data or not isinstance(data["texts"], list):
|
|
raise HTTPException(status_code=400, detail="缺少texts参数或类型错误")
|
|
vectors = await service.embed(data["texts"])
|
|
return {"success": True, "embeddings": vectors, "successful_count": len(vectors)}
|
|
except HTTPException:
|
|
raise
|
|
except Exception as e:
|
|
raise HTTPException(status_code=400, detail=str(e))
|
|
|
|
|
|
@router.post(settings.batch_route)
|
|
@jingrow_api_verify_and_billing(api_name=settings.api_name)
|
|
async def generate_embeddings_stream(data: dict, request: Request):
|
|
if "items" not in data or not isinstance(data["items"], list) or len(data["items"]) == 0:
|
|
raise HTTPException(status_code=400, detail="items不能为空")
|
|
|
|
async def streamer():
|
|
async for result in service.process_batch(data["items"]):
|
|
yield json.dumps(result) + "\n"
|
|
|
|
return StreamingResponse(streamer(), media_type="application/x-ndjson")
|
|
|
|
|