Browse Source

feat: 新增多轮互动的接口

zhangwl 1 month ago
parent
commit
55fe686c34
3 changed files with 76 additions and 2 deletions
  1. 2 0
      .env
  2. 65 2
      app/routers/chat_tools.py
  3. 9 0
      app/schemas/chat.py

+ 2 - 0
.env

@@ -1,6 +1,8 @@
 # ark的key , 也就是火山引擎的key - 云享生态,后续需要改成根据包名进行映射
 # ark的key , 也就是火山引擎的key - 云享生态,后续需要改成根据包名进行映射
 ARK_API_KEY=ark-95d3c2b6-b694-46b8-a3b2-5b573e1596ca-cf7e4
 ARK_API_KEY=ark-95d3c2b6-b694-46b8-a3b2-5b573e1596ca-cf7e4
 ARK_BASE_URL=https://ark.cn-beijing.volces.com/api/v3
 ARK_BASE_URL=https://ark.cn-beijing.volces.com/api/v3
+# 知识库的api key
+ARK_KNOW_API_KEY=W1D0N6X3GAQTFJXWAYAV09CPPMRZ8VP01YRXE028HTB2ZZPDBC4G60R30C9P6CVK8
 
 
 # 豆包的2.0模型 doubao-seed-2-0-lite-260215
 # 豆包的2.0模型 doubao-seed-2-0-lite-260215
 #MODEL_NAME=ep-20260430173618-626ng
 #MODEL_NAME=ep-20260430173618-626ng

+ 65 - 2
app/routers/chat_tools.py

@@ -4,12 +4,12 @@ from datetime import datetime
 from ..core.ark_client import get_client
 from ..core.ark_client import get_client
 from ..config.config import Config
 from ..config.config import Config
 from ..schemas.chat import ChatMessage, ChatResponse, CommentRequest, CirclePromptConfig, HistoricalFigure, \
 from ..schemas.chat import ChatMessage, ChatResponse, CommentRequest, CirclePromptConfig, HistoricalFigure, \
-    RephraseRequest, FigureUpsert, GroupChatRequest
+    RephraseRequest, FigureUpsert, GroupChatRequest, PostCommentBotRequest
 from ..db.souyue_mongo import get_mblog_by_id
 from ..db.souyue_mongo import get_mblog_by_id
 from ..db.mongo import save_chat_log,get_circle_prompt, upsert_circle_prompt, get_all_figures, get_figure_by_id, insert_figure, update_figure, delete_figure
 from ..db.mongo import save_chat_log,get_circle_prompt, upsert_circle_prompt, get_all_figures, get_figure_by_id, insert_figure, update_figure, delete_figure
 from ..utils.chat_utils import  get_web_search_tools, get_knowledge_search_tools
 from ..utils.chat_utils import  get_web_search_tools, get_knowledge_search_tools
 from ..db.ai_config import get_config_by_app_name
 from ..db.ai_config import get_config_by_app_name
-from ..db.mongo import  save_chat_history, get_chat_history, delete_chat_history, get_sessions
+from ..db.mongo import  save_chat_history, get_chat_history, delete_chat_history, get_sessions, get_last_response_id
 router = APIRouter()
 router = APIRouter()
 
 
 import re
 import re
@@ -399,3 +399,66 @@ async def group_chat(
     return {
     return {
         "data": result,
         "data": result,
     }
     }
+
+
+_POST_COMMENT_BOT_BASE_PROMPT = "你是一个评论区智能助手,帮助用户理解帖子内容并回答问题。回复简洁自然,使用纯文本。"
+
+
+@router.post("/postCommentBot")
+async def post_comment_bot(request: PostCommentBotRequest):
+    session_id = f"post_{request.post_id}_{request.user_id}"
+    previous_response_id = get_last_response_id(request.user_id, session_id)
+    is_first_turn = (previous_response_id is None)
+
+    system_text = _POST_COMMENT_BOT_BASE_PROMPT
+    if is_first_turn:
+        doc = get_mblog_by_id(request.post_id)
+        if not doc:
+            raise HTTPException(status_code=404, detail="帖子不存在")
+        system_text += f"\n\n【当前帖子信息】\n标题:{doc.get('title', '')}\n摘要:{doc.get('brief', '')}"
+        if request.parent_comment:
+            system_text += f"\n\n【用户正在回复的评论】\n{request.parent_comment}"
+
+    system_msg = {"role": "system", "content": [{"type": "input_text", "text": system_text}]}
+
+    save_chat_history(
+        user_id=request.user_id, session_id=session_id,
+        role="user", content=request.message, timestamp=datetime.now(),
+    )
+
+    ai_config = get_config_by_app_name(request.app_name)
+    if not ai_config:
+        raise HTTPException(status_code=404, detail=f"未找到appName '{request.app_name}' 的配置")
+    client = get_client(request.app_name)
+
+    response = client.responses.create(
+        model=Config.MODEL_NAME,
+        input=[system_msg, {"role": "user", "content": request.message}],
+        stream=False,
+        store=True,
+        previous_response_id=previous_response_id,
+        text={"format": {"type": "text"}},
+    )
+
+    result = ""
+    for item in response.output:
+        if hasattr(item, 'type') and item.type == 'message' and hasattr(item, 'content'):
+            if isinstance(item.content, list):
+                for c in item.content:
+                    if hasattr(c, 'text'):
+                        result += c.text
+            else:
+                result += str(item.content)
+
+    result = _strip_markdown(result)
+
+    if not result:
+        raise HTTPException(status_code=500, detail="AI未能生成回复")
+
+    save_chat_history(
+        user_id=request.user_id, session_id=session_id,
+        role="assistant", content=result, timestamp=datetime.now(),
+        response_id=response.id,
+    )
+
+    return {"data": result}

+ 9 - 0
app/schemas/chat.py

@@ -85,3 +85,12 @@ class GroupChatRequest(BaseModel):
     message: str  #@机器人的消息
     message: str  #@机器人的消息
     user_id: str # 用户编号= IM中的account
     user_id: str # 用户编号= IM中的account
     app_name: str #IM群所对应的app包名
     app_name: str #IM群所对应的app包名
+
+
+# 帖子评论区机器人多轮对话
+class PostCommentBotRequest(BaseModel):
+    post_id: str                              # 帖子 MongoDB ObjectId
+    user_id: str                              # 评论用户账号
+    app_name: str                             # app 包名
+    message: str                              # @机器人的消息内容
+    parent_comment: Optional[str] = None      # 被回复的评论原文(场景2)