import json import os import tempfile from fastapi import Request import requests from fastapi import APIRouter from pydantic import BaseModel from sqlalchemy import text from starlette.responses import FileResponse, HTMLResponse from common.log import log from app.gpt.service.intent import get_intent, ali_trans_success from core.templates import templates from database.db_mysql import async_db_session router = APIRouter() class Result(BaseModel): error: int = 0 msg: str = "" class Response(BaseModel): result: Result = Result(error=0, msg="") @router.get("/recordlist", response_class=HTMLResponse) async def record_list(request: Request): async with async_db_session() as db: query = text("select * from records order by id desc") records = await db.execute(query) return templates.TemplateResponse( request=request, name="record_list.html", context={"records": records.fetchall()} ) @router.get("/recordfile", summary="录音文件转发") async def record_file(filepath: str): url = "http://xycc.ascrm.cn/recordFile/download?file=" + filepath log.info("mp3 url: " + url) response = requests.get(url) response.raise_for_status() # 检查请求是否成功 temp_dir = tempfile.mkdtemp(suffix='_xycc', prefix='record_') # 提取文件名 file_name = os.path.basename(filepath) file_path = os.path.join(temp_dir, file_name) with open(file_path, 'wb') as f: f.write(response.content) return FileResponse(file_path, media_type="application/octet-stream", filename=file_name) @router.post("/ali_trans_callback", summary="阿里云录音文件识别回调地址") async def ali_trans_callback(body: dict): log.info(json.dumps(body, indent=4)) await ali_trans_success(body) return Response() @router.post("/intent", summary="用户意图判断") async def user_intent(body: dict): log.info(json.dumps(body, indent=4)) if 'notify' in body: intent = await get_intent(body) else: return Response(result=Result(error=1, msg="notify not found")) return Response()