from fastapi import APIRouter, Depends, UploadFile, File from app.core.response import success_response, error_response, ResponseModel from app.core.ai_client import ai_client from app.api.deps import get_current_user from app.models.user import UserDB import logging from app.core.qcloud import qcloud_manager from pydantic import BaseModel from typing import Optional from app.core.qwen_client import qwen_client router = APIRouter() class ExtractPickupCodeRequest(BaseModel): url: str class VLRequest(BaseModel): imageData: Optional[bytes] = None url: Optional[str] = None prompt: Optional[str] = None user_content: Optional[str] = None @router.post("/recognition/pickup_code_with_url", response_model=ResponseModel) async def extract_pickup_code_with_url( data: ExtractPickupCodeRequest ): """从图片 URL 中提取取件码""" if not data.url: return error_response(code=400, message="URL 不能为空") try: # 调用 AI 客户端提取取件码 result = await ai_client.extract_pickup_code(url=data.url) if "error" in result: return error_response(code=500, message=result.get("message", "提取取件码失败")) # 返回原始数据和格式化文本 return success_response(data=result) except Exception as e: logging.exception(f"提取取件码失败: {str(e)}") return error_response(code=500, message=f"提取取件码失败: {str(e)}") @router.post("/recognition/pickup_code", response_model=ResponseModel) async def extract_pickup_code( file: UploadFile = File(...) ): """从图片中提取取件码""" try: # 检查文件类型 if not file.content_type.startswith('image/'): return error_response(code=400, message="只能上传图片文件") # 读取图片内容 image_data = await file.read() # 调用 AI 客户端提取取件码 result = await ai_client.extract_pickup_code(image_data=image_data) if "error" in result: return error_response(code=500, message=result.get("message", "提取取件码失败")) # 返回原始数据和格式化文本 return success_response(data=result) except Exception as e: logging.exception(f"提取取件码失败: {str(e)}") return error_response(code=500, message=f"提取取件码失败: {str(e)}") @router.post("/qw/vl", response_model=ResponseModel) async def extract_pickup_code_with_url( data: VLRequest ): """从图片 URL 中提取取件码""" try: # 调用 AI 客户端提取取件码 result = await qwen_client.vl(imageData=data.imageData, url=data.url, prompt=data.prompt, user_content=data.user_content) if "error" in result: return error_response(code=500, message=result.get("message", "返回失败")) # 返回原始数据和格式化文本 return success_response(data=result) except Exception as e: logging.exception(f"vl失败: {str(e)}") return error_response(code=500, message=f"vl失败: {str(e)}")