chat_tools.py 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. from fastapi import APIRouter, HTTPException
  2. from datetime import datetime
  3. from ..core.ark_client import config, client
  4. from ..schemas.chat import ChatMessage, ChatResponse, CircleRequest
  5. from ..db.souyue_mongo import get_mblog_by_id
  6. from ..db.mongo import get_circle_prompt
  7. router = APIRouter()
  8. def _build_prompt(product_text: str, prompt_config: dict) -> str:
  9. name = prompt_config.get("name", "兴趣圈")
  10. role = prompt_config.get("role", "活跃用户")
  11. style = prompt_config.get("style", "自然亲切,有活人感")
  12. keywords: list = prompt_config.get("keywords") or []
  13. forbidden: list = prompt_config.get("forbidden") or []
  14. lines = [
  15. f"你是{role},活跃在{name}兴趣圈。",
  16. "请根据以下帖子信息,生成一条10-30字的评论,要求:",
  17. "1. 内容指向性强,结合帖子具体内容",
  18. f"2. 风格:{style}",
  19. ]
  20. seq = 3
  21. if keywords:
  22. lines.append(f"{seq}. 适当融入关键词(自然使用):{', '.join(keywords)}")
  23. seq += 1
  24. if forbidden:
  25. lines.append(f"{seq}. 禁止使用以下词语:{', '.join(forbidden)}")
  26. seq += 1
  27. lines.append(f"{seq}. 语言自然,不要暴露你是AI")
  28. lines.append(f"\n帖子内容:{product_text}")
  29. return "\n".join(lines)
  30. # 评论帖子的马甲机器人,无状态,支持批量对多个帖子智能回复
  31. @router.post("/airesp", response_model=ChatResponse)
  32. async def generate_circle_comment(request: CircleRequest):
  33. doc = get_mblog_by_id(request.id)
  34. if not doc:
  35. raise HTTPException(status_code=404, detail="帖子不存在")
  36. title = doc.get("title", "")
  37. brief = doc.get("brief", "")
  38. nickname = doc.get("nickname", "")
  39. app_name = doc.get("appName", "")
  40. images: list = doc.get("images") or []
  41. product_text = f"主题:{title}\n摘要:{brief}\n发布者:{nickname}"
  42. if images:
  43. product_text += "\n图片:\n" + "\n".join(images)
  44. prompt_config = get_circle_prompt(app_name)
  45. prompt = _build_prompt(product_text, prompt_config)
  46. response = client.responses.create(
  47. model=config.MODEL_NAME,
  48. input=[{"role": "user", "content": prompt}],
  49. stream=False,
  50. store=False,
  51. )
  52. message_content = ""
  53. for item in response.output:
  54. if hasattr(item, 'type') and item.type == 'message' and hasattr(item, 'content'):
  55. if isinstance(item.content, list):
  56. for content_item in item.content:
  57. if hasattr(content_item, 'text'):
  58. message_content += content_item.text
  59. else:
  60. message_content += str(item.content)
  61. if not message_content:
  62. raise HTTPException(status_code=500, detail="AI未能生成评论")
  63. return ChatResponse(
  64. message=ChatMessage(role="assistant", content=message_content, timestamp=datetime.now()),
  65. model=response.model,
  66. usage=response.usage.model_dump() if response.usage else None,
  67. )