route.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import json
  2. import os
  3. import tempfile
  4. from fastapi import Request
  5. import requests
  6. from fastapi import APIRouter
  7. from pydantic import BaseModel
  8. from sqlalchemy import text
  9. from starlette.responses import FileResponse, HTMLResponse
  10. from common.log import log
  11. from app.gpt.service.intent import get_intent, ali_trans_success
  12. from core.templates import templates
  13. from database.db_mysql import async_db_session
  14. router = APIRouter()
  15. class Result(BaseModel):
  16. error: int = 0
  17. msg: str = ""
  18. class Response(BaseModel):
  19. result: Result = Result(error=0, msg="")
  20. @router.get("/recordlist", response_class=HTMLResponse)
  21. async def record_list(request: Request):
  22. async with async_db_session() as db:
  23. query = text("select * from records order by id desc")
  24. records = await db.execute(query)
  25. return templates.TemplateResponse(
  26. request=request, name="record_list.html", context={"records": records.fetchall()}
  27. )
  28. @router.get("/recordfile", summary="录音文件转发")
  29. async def record_file(filepath: str):
  30. url = "http://xycc.ascrm.cn/recordFile/download?file=" + filepath
  31. log.info("mp3 url: " + url)
  32. response = requests.get(url)
  33. response.raise_for_status() # 检查请求是否成功
  34. temp_dir = tempfile.mkdtemp(suffix='_xycc', prefix='record_')
  35. # 提取文件名
  36. file_name = os.path.basename(filepath)
  37. file_path = os.path.join(temp_dir, file_name)
  38. with open(file_path, 'wb') as f:
  39. f.write(response.content)
  40. return FileResponse(file_path, media_type="application/octet-stream", filename=file_name)
  41. @router.post("/ali_trans_callback", summary="阿里云录音文件识别回调地址")
  42. async def ali_trans_callback(body: dict):
  43. log.info(json.dumps(body, indent=4))
  44. await ali_trans_success(body)
  45. return Response()
  46. @router.post("/intent", summary="用户意图判断")
  47. async def user_intent(body: dict):
  48. log.info(json.dumps(body, indent=4))
  49. if 'notify' in body:
  50. intent = await get_intent(body)
  51. else:
  52. return Response(result=Result(error=1, msg="notify not found"))
  53. return Response()