muse-agent-example/db/ddl/113-example代理事件账本.sql

62 lines
3.9 KiB
PL/PgSQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- 代理事件账本:把任意 Agent 框架(pi/codex/opencode…)子代理执行的事件流统一留痕。
-- 合同(07-Agent与Skill领域 §2 框架派发):框架适配器把框架原生事件归一为闭集事件类型,
-- 逐条追加写入;本表只存身份、用量、成本与安全摘要,不存 prompt/正文原文(原文进 raw 表)。
-- 设计边界:框架名不做闭集(接缝必须开放给任意框架);事件序号由适配器在运行内单调分配。
CREATE TABLE IF NOT EXISTS example_agent_event (
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
run_id VARCHAR(64) NOT NULL, -- -> example_run.run_id(软引用)
seq INTEGER NOT NULL, -- 运行内事件序号,从 1 单调递增
event_type VARCHAR(32) NOT NULL, -- 闭集,见 chk_example_agent_event_type
framework VARCHAR(32) NOT NULL, -- pi/codex/opencode…(框架适配器自报,开放集)
agent_role VARCHAR(32), -- writer/planner/detector/judge/extractor
tool_name VARCHAR(64), -- tool.* 事件的框架工具名
status VARCHAR(16), -- ok/error
requested_model_id VARCHAR(64), -- 派发策略请求的模型(框架解析前)
actual_model_id VARCHAR(64), -- 供应商实际执行模型
input_tokens BIGINT,
output_tokens BIGINT,
cached_tokens BIGINT,
cost_usd NUMERIC(14,8), -- 供应商报告或价目表计算;未知为 NULL
raw_ref BIGINT, -- -> example_raw_content.id(软引用)
details JSONB NOT NULL DEFAULT '{}'::jsonb, -- 安全摘要:usage 细分/stopReason/哈希/sessionId/errorCode
creator VARCHAR(64) NOT NULL DEFAULT 'agent-trace',
create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
tenant_id BIGINT NOT NULL DEFAULT 0,
CONSTRAINT uq_example_agent_event_run_seq UNIQUE (run_id, seq),
CONSTRAINT chk_example_agent_event_type CHECK (event_type IN
('run.started','agent.started','model.completed','tool.started','tool.completed',
'agent.completed','agent.failed','run.completed','run.failed')),
CONSTRAINT chk_example_agent_event_seq CHECK (seq >= 1),
CONSTRAINT chk_example_agent_event_status CHECK (status IS NULL OR status IN ('ok','error')),
CONSTRAINT chk_example_agent_event_model_named CHECK
(event_type <> 'model.completed' OR actual_model_id IS NOT NULL)
);
CREATE INDEX IF NOT EXISTS idx_example_agent_event_run ON example_agent_event(tenant_id, run_id, seq);
CREATE INDEX IF NOT EXISTS idx_example_agent_event_role ON example_agent_event(tenant_id, agent_role, event_type);
-- append-only:禁改禁删禁 TRUNCATE(与 example_run_receipt 同款守护)
CREATE OR REPLACE FUNCTION reject_example_agent_event_mutation()
RETURNS TRIGGER
LANGUAGE plpgsql
AS $$
BEGIN
RAISE EXCEPTION 'example_agent_event 是 append-only 表,禁止 UPDATE/DELETE';
END;
$$;
CREATE OR REPLACE TRIGGER trg_example_agent_event_append_only
BEFORE UPDATE OR DELETE ON example_agent_event
FOR EACH ROW EXECUTE FUNCTION reject_example_agent_event_mutation();
CREATE OR REPLACE TRIGGER trg_example_agent_event_no_truncate
BEFORE TRUNCATE ON example_agent_event
FOR EACH STATEMENT EXECUTE FUNCTION example_reject_truncate();
COMMENT ON TABLE example_agent_event IS
'代理事件账本(append-only):框架适配器归一后的子代理执行事件流;prompt/正文原文在 raw 表,本表只留身份与用量。';
COMMENT ON COLUMN example_agent_event.framework IS
'执行框架名(pi/codex/opencode…),开放集;模型策略由派发方决定并记录在 requested_model_id。';
COMMENT ON COLUMN example_agent_event.details IS
'安全摘要 JSON:usage 细分、stopReason、spec/prompt/输出哈希、sessionId、errorCode;不含正文原文。';