meeting_memory/tools/meeting_tools.py

116 lines
5.1 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

from __future__ import annotations
from pathlib import Path
from typing import Any
from meeting_memory.service import MeetingKnowledgeService
from .registry import ToolContext, ToolRegistry
def build_meeting_registry(data_dir: str | Path = "data") -> ToolRegistry:
registry = ToolRegistry()
meeting_service = MeetingKnowledgeService(data_dir=data_dir, workspace=Path.cwd())
registry.register(
name="import_meeting_transcript",
description="导入一份会议原文交给会议整理子Agent按项目梳理重点内容并把结果更新到指定知识库的同一份Markdown项目台账。",
parameters={
"type": "object",
"properties": {
"file_path": {"type": "string", "description": "会议转录文本文件路径。"},
"knowledge_base_id": {
"type": "string",
"description": "知识库ID对应 data/ 下的文件夹名。用户未说明时可以省略;工具会在只有一个知识库时自动使用该库。",
},
"team_id": {
"type": "string",
"description": "兼容旧参数:等同于 knowledge_base_id。新代码优先使用 knowledge_base_id。",
},
"meeting_date": {"type": "string", "description": "会议日期YYYY-MM-DD可省略。"},
},
"required": ["file_path"],
"additionalProperties": False,
},
handler=lambda ctx, args: _import_meeting(meeting_service, ctx, args),
)
registry.register(
name="query_knowledge",
description="查询指定知识库项目台账中的项目状态、待办、风险、指标、决策、完成事项和最近会议更新。",
parameters={
"type": "object",
"properties": {
"query": {"type": "string", "description": "用户查询。"},
"knowledge_base_id": {
"type": "string",
"description": "知识库ID对应 data/ 下的文件夹名。用户未说明时可以省略;工具会在只有一个知识库时自动使用该库。",
},
"team_id": {
"type": "string",
"description": "兼容旧参数:等同于 knowledge_base_id。新代码优先使用 knowledge_base_id。",
},
"limit": {"type": "integer", "description": "最多返回多少条命中。", "minimum": 1, "maximum": 20},
},
"required": ["query"],
"additionalProperties": False,
},
handler=lambda ctx, args: _query_knowledge(meeting_service, ctx, args),
)
registry.register(
name="list_knowledge_bases",
description="列出 data/ 下已有的知识库ID用于让用户或Web界面选择要查询的库。",
parameters={"type": "object", "properties": {}, "additionalProperties": False},
handler=lambda ctx, args: _list_knowledge_bases(meeting_service, ctx, args),
)
return registry
def _resolve_knowledge_base_arg(ctx: ToolContext, args: dict[str, Any]) -> str:
return str(
args.get("knowledge_base_id")
or args.get("team_id")
or ctx.session.get("last_knowledge_base_id")
or ctx.session.get("last_team_id")
or "default_team"
)
def _import_meeting(service: MeetingKnowledgeService, ctx: ToolContext, args: dict[str, Any]) -> dict[str, Any]:
file_path = str(args["file_path"])
knowledge_base_id = _resolve_knowledge_base_arg(ctx, args)
meeting_date = args.get("meeting_date")
live_event_sink = ctx.session.get("_live_event_sink")
def progress_callback(payload: dict[str, Any]) -> None:
if callable(live_event_sink):
live_event_sink({"kind": "subagent_progress", "payload": payload})
def should_cancel() -> bool:
return bool(ctx.session.get("_cancel_requested"))
result = service.import_meeting_transcript(
file_path=file_path,
knowledge_base_id=knowledge_base_id,
meeting_date=meeting_date,
progress_callback=progress_callback,
should_cancel=should_cancel,
)
ctx.session["last_knowledge_base_id"] = result.get("knowledge_base_id") or knowledge_base_id
ctx.session["last_team_id"] = result.get("knowledge_base_id") or knowledge_base_id
ctx.session["last_ledger_path"] = result.get("ledger_path")
return result
def _query_knowledge(service: MeetingKnowledgeService, ctx: ToolContext, args: dict[str, Any]) -> dict[str, Any]:
knowledge_base_id = _resolve_knowledge_base_arg(ctx, args)
limit = int(args.get("limit") or 8)
result = service.query_knowledge(query=str(args["query"]), knowledge_base_id=knowledge_base_id, limit=limit)
if result.get("knowledge_base_id"):
ctx.session["last_knowledge_base_id"] = result["knowledge_base_id"]
ctx.session["last_team_id"] = result["knowledge_base_id"]
return result
def _list_knowledge_bases(service: MeetingKnowledgeService, ctx: ToolContext, args: dict[str, Any]) -> dict[str, Any]:
return service.list_knowledge_bases()