6d658b4f4d
- 工具系统从 kilostar/plugin/tool_plugin/ 迁移到 data/toolset/(manifest.json 声明式) - 新增 plugin_runtime 模块:BaseOrganization / GlobalPluginManager / loader / tool_bridge - 新增 org_task + org_task_event 表及 DAO(alembic 0009) - 新增 /api/v1/plugin 路由(submit/status/stream/install/reload) - 新增 data/plugin/example_dept 示例重型插件 - regulatory_node 支持聊天历史上下文注入 - send_file 改为 artifact 存盘 + SSE 推送下载链接 - 前端 WorkflowFileCard 组件 + ToolSettings README 渲染 - utils 整理:合并 access/role_check、standalone_proxy→ray_compat、删除废弃模块 - 项目结构文档移至 docs/STRUCTURE.md 并详细展开 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
64 lines
1.9 KiB
Python
64 lines
1.9 KiB
Python
"""组织事件协议:组织 → 前端/PG 的统一推送格式。"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import time
|
|
from dataclasses import dataclass, field
|
|
from typing import Any, Dict, List, Literal
|
|
|
|
OrgEventType = Literal[
|
|
"log", # 普通文本日志
|
|
"step", # 阶段推进(agent 切换、工具调用前后)
|
|
"artifact", # 生成了产物(沿用 send_file 的 url 协议)
|
|
"approval_request", # 需要用户审批
|
|
"done", # 任务完成
|
|
"error", # 任务失败
|
|
]
|
|
|
|
|
|
@dataclass
|
|
class OrgEvent:
|
|
"""组织事件:一个 task 的执行过程会产生一连串这种事件。
|
|
|
|
被 SSE 推给前端面板,被 DAO 追加到 ``org_task.events`` JSONB 字段。
|
|
序列化用 ``to_dict``,反序列化用 ``from_dict``。
|
|
"""
|
|
|
|
task_id: str
|
|
type: OrgEventType
|
|
payload: Dict[str, Any] = field(default_factory=dict)
|
|
ts: float = field(default_factory=time.time)
|
|
|
|
def to_dict(self) -> Dict[str, Any]:
|
|
return {
|
|
"task_id": self.task_id,
|
|
"type": self.type,
|
|
"payload": self.payload,
|
|
"ts": self.ts,
|
|
}
|
|
|
|
@classmethod
|
|
def from_dict(cls, data: Dict[str, Any]) -> "OrgEvent":
|
|
return cls(
|
|
task_id=data["task_id"],
|
|
type=data["type"],
|
|
payload=data.get("payload", {}),
|
|
ts=data.get("ts", time.time()),
|
|
)
|
|
|
|
|
|
@dataclass
|
|
class TaskState:
|
|
"""组织内存中的任务状态(重启不保留,但事件流通过 PG 持久化)。"""
|
|
|
|
task_id: str
|
|
org_name: str
|
|
trace_id: str
|
|
user_id: str
|
|
status: Literal["pending", "running", "completed", "failed"] = "pending"
|
|
description: str = ""
|
|
source: Literal["cabinet", "user"] = "user"
|
|
events: List[OrgEvent] = field(default_factory=list)
|
|
result: Any = None
|
|
error: str | None = None
|