116 lines
5.1 KiB
Python
116 lines
5.1 KiB
Python
|
|
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()
|
|||
|
|
|