AiBot.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. """
  4. @Time : 2024/10/18 10:04
  5. @File : AiBot.py
  6. @Desc :
  7. """
  8. import sys
  9. sys.path.append("..")
  10. from config import (
  11. get_logger,
  12. INTENT_ERROR,
  13. END,
  14. HANGUP,
  15. TRANSFER,
  16. UNK
  17. )
  18. from fastapi import FastAPI
  19. import uvicorn
  20. from interface import reqRobot, ChatResponse
  21. from database import *
  22. from scene import Dialog,Msg
  23. from entity import Error
  24. import traceback
  25. from util import insert_log, timetic
  26. from prometheus_fastapi_instrumentator import Instrumentator, metrics
  27. from prometheus_client import Counter
  28. #from prometheus_client import Summary
  29. logger=get_logger("log")
  30. # my_counter = Counter(
  31. # name="unk_event",
  32. # documentation="intention for other event"
  33. # )
  34. app = FastAPI()
  35. # 服务监控,qps,latent, cpu利用率
  36. instrumentator = Instrumentator()
  37. # instrumentator.add(my_counter)
  38. instrumentator.instrument(app).expose(app)
  39. # @app.on_event("startup")
  40. # async def _startup():
  41. # instrumentator.expose(app)
  42. @app.post("/botservice")
  43. @timetic
  44. def botservice(reqbot:reqRobot):
  45. bid, uid, code, asr = reqbot.taskId, reqbot.userId, reqbot.nodeId, reqbot.asrText
  46. session_id, record_id = reqbot.sessionId, reqbot.recordId
  47. logger.info("智能客服:botId: {},session:{}, uid: {}, nodeId: {}, ASR: {}".format(bid, session_id, uid, code, asr))
  48. scene = get_status_cache(uid, bid, "status", session_id)
  49. #scene.case.code="1.00"
  50. if scene is None:
  51. scene = Dialog()
  52. try:
  53. cur_code = scene.get_current_code(bid)
  54. logger.info(f"智能客服:uid:{uid},sessionId:{session_id},code:{code}, cur_code:{cur_code}")
  55. if code == cur_code:
  56. option = scene.mapping_semantics(code, asr, bid, uid, session_id)
  57. # if option[-1]['title'] == UNK:
  58. # my_counter.inc()
  59. logger.info(f"智能客服:uid:{uid},sessionId:{session_id},code:{code},opt:{option}")
  60. if not option:
  61. return ChatResponse(code=Error.error_intent.value, message=INTENT_ERROR).to_json_string()
  62. msg = scene.dialogue(Msg(code=code,
  63. option=option,
  64. asr=asr,
  65. session=session_id,
  66. record=record_id,
  67. ),bid, uid,session_id)
  68. if msg.code == END:
  69. with_status_cache(uid, bid, 'result', session_id, scene)
  70. del_cache(uid, bid, 'status', session_id)
  71. insert_log(bid, uid, session_id, scene)
  72. return ChatResponse(code=200, message="success").to_json_string()
  73. else:
  74. with_status_cache(uid, bid, 'status', session_id, scene)
  75. insert_log(bid, uid, session_id, scene)
  76. if msg.action in [HANGUP, TRANSFER]:
  77. del_cache(uid, bid, 'status', session_id)
  78. with_status_cache(uid, bid, 'result', session_id, scene)
  79. return ChatResponse().from_msg(msg).to_json_string()
  80. else:
  81. msg = scene.get_current_content(bid, uid)
  82. if code == "start" or code is None:
  83. scene.case.code = cur_code
  84. with_status_cache(uid, bid, 'status', session_id, scene)
  85. insert_log(bid, uid, session_id, scene)
  86. return ChatResponse().from_msg(msg).to_json_string()
  87. except Exception as e:
  88. logger.error(e)
  89. #del_cache(uid, bid, 'status', session_id)
  90. return ChatResponse(code=Error.error.value, message="internal error").to_json_string()
  91. if __name__ == '__main__':
  92. uvicorn.run("AiBot:app", host='0.0.0.0', port=40072,workers=1)