62 lines
3.9 KiB
PL/PgSQL
62 lines
3.9 KiB
PL/PgSQL
-- 代理事件账本:把任意 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;不含正文原文。';
|