| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- # -*- coding: utf-8 -*-
- """
- 聊天记录查询工具模块
- 提供 Agent 直接查询 SQLite 聊天记录的能力,解决 Agent 用文件系统工具
- 找不到聊天记录的问题(聊天记录存在 SQLite,不在文件系统中)。
- 工具列表:
- - search_chat_history: 按标题模糊搜索当前用户的会话
- - get_session_chat: 获取指定会话的完整消息历史
- """
- import json
- from tools.vent_tools import _current_user, _current_session
- async def search_chat_history(query: str, max_results: int = 5) -> str:
- """搜索当前用户的聊天历史记录(按会话标题匹配)。
-
- 当用户询问"之前聊过什么""搜索历史记录""找一下关于xxx的对话"时调用。
- 返回匹配的会话列表,包含标题、消息数量、会话 ID。
-
- 如果需要查看某个会话的具体对话内容,再调用 get_session_chat。
-
- Args:
- query: 搜索关键词,匹配会话标题
- max_results: 最大返回条数,默认 5
-
- Returns:
- JSON 格式,包含 matching_sessions 列表。
- 每条含 session_id、title、message_count、updated_at。
- """
- from db.chat_store import search_sessions as _db_search
- if not query or not query.strip():
- return json.dumps({"error": "搜索关键词不能为空"}, ensure_ascii=False)
- user_name = _current_user.get()
- try:
- sessions = _db_search(user_name, query.strip(), limit=max_results)
- results = [
- {
- "session_id": s["session_id"],
- "title": s.get("title", ""),
- "message_count": s.get("message_count", 0),
- "updated_at": s.get("updated_at", ""),
- }
- for s in sessions
- ]
- return json.dumps(
- {"query": query.strip(), "matching_sessions": results},
- ensure_ascii=False,
- )
- except Exception as e:
- return json.dumps({"error": f"搜索失败: {str(e)}"}, ensure_ascii=False)
- async def get_session_chat(session_id: str, limit: int = 50) -> str:
- """获取指定会话的完整消息历史。
-
- 当用户要求"查看那个会话的内容""把之前讨论的内容找出来""总结一下上次的对话",
- 且已知 session_id 时调用。通常先通过 search_chat_history 获取 session_id,
- 再调用本工具读取具体内容。
-
- Args:
- session_id: 会话 ID(UUID 格式)
- limit: 最大返回消息条数,默认 50
-
- Returns:
- JSON 格式,包含 session_info(标题、创建时间等)和 messages 列表。
- 每条消息含 role(user/assistant)、content、created_at。
- """
- from db.chat_store import get_messages as _db_msgs
- from db.chat_store import get_session_info as _db_info
- if not session_id or not session_id.strip():
- return json.dumps({"error": "会话 ID 不能为空"}, ensure_ascii=False)
- sid = session_id.strip()
- try:
- info = _db_info(sid)
- if not info:
- return json.dumps(
- {"error": f"会话不存在: {sid}", "session_id": sid},
- ensure_ascii=False,
- )
- msgs = _db_msgs(sid, limit=limit)
- messages = [
- {
- "role": m["role"],
- "content": m.get("content", ""),
- "created_at": m.get("created_at", ""),
- }
- for m in msgs
- ]
- return json.dumps(
- {
- "session_id": sid,
- "session_info": {
- "title": info.get("title", ""),
- "created_at": info.get("created_at", ""),
- "updated_at": info.get("updated_at", ""),
- },
- "message_count": len(messages),
- "messages": messages,
- },
- ensure_ascii=False,
- )
- except Exception as e:
- return json.dumps(
- {"error": f"读取失败: {str(e)}", "session_id": sid},
- ensure_ascii=False,
- )
- async def get_current_session_id() -> str:
- """获取当前本轮对话的数据库会话ID(session_id)。
- 当需要知道当前正在进行的会话的唯一标识符时调用此工具。
- 该 ID 可用于配合 get_session_chat 工具查看本轮会话的完整消息历史,
- 或配合 search_chat_history 跨会话检索。
- 无需任何参数,自动从请求上下文中获取。
- Returns:
- JSON 格式,包含当前会话的 session_id 和对应的 user_name。
- """
- user_name = _current_user.get()
- session_id = _current_session.get()
- if not session_id:
- return json.dumps({
- "error": "无法获取当前会话ID,可能不在对话上下文中",
- "session_id": "",
- "user_name": user_name,
- }, ensure_ascii=False)
- return json.dumps({
- "session_id": session_id,
- "user_name": user_name,
- }, ensure_ascii=False)
|