-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathobserve.sql
More file actions
137 lines (127 loc) · 7.31 KB
/
Copy pathobserve.sql
File metadata and controls
137 lines (127 loc) · 7.31 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
-- Observe DB schema
-- Agent Loop 可观测性数据库
-- 版本:5 (2026-05-02)
PRAGMA journal_mode = WAL;
PRAGMA synchronous = NORMAL;
-- ─────────────────────────────────────────────
-- 1. turns 每轮 agent 对话
-- ─────────────────────────────────────────────
CREATE TABLE IF NOT EXISTS turns (
id INTEGER PRIMARY KEY AUTOINCREMENT,
ts TEXT NOT NULL, -- ISO8601 UTC
source TEXT NOT NULL, -- 'agent'
session_key TEXT NOT NULL,
turn_id TEXT,
assistant_message_id TEXT,
user_msg TEXT, -- 用户原文
llm_output TEXT NOT NULL DEFAULT '', -- LLM 最终输出完整文本
raw_llm_output TEXT, -- 装饰/清洗前的原始模型输出
meme_tag TEXT, -- 命中的 <meme:tag>
meme_media_count INTEGER, -- 命中的媒体数量
tool_calls TEXT, -- JSON: [{name, args, result}](每次 tool 调用)
tool_chain_json TEXT, -- JSON: [{text, calls:[{name,args,result}]}] 完整迭代链路
history_window INTEGER, -- 下一轮实际保留的 history 窗口
history_messages INTEGER, -- 保留 history 的消息条数(展开后)
history_chars INTEGER, -- 保留 history 序列化后的字符数
history_tokens INTEGER, -- 保留 history 的估算 token
prompt_tokens INTEGER, -- 当前 prompt 底座估算 token
next_turn_baseline_tokens INTEGER, -- 下一轮基线占用估算 token
react_iteration_count INTEGER, -- 本轮 ReAct 调用 LLM 的次数
react_input_sum_tokens INTEGER, -- 本轮所有 LLM 输入估算 token 累计
react_input_peak_tokens INTEGER, -- 本轮最大一次 LLM 输入估算 token
react_final_input_tokens INTEGER, -- 最后一次 LLM 输入估算 token
model_output_tokens INTEGER, -- 本轮全部模型调用的真实输出 token
react_cache_prompt_tokens INTEGER, -- DeepSeek KV cache: 本轮输入中 hit+miss tokens
react_cache_hit_tokens INTEGER, -- DeepSeek KV cache: 本轮缓存命中 tokens
error TEXT -- NULL = 正常
);
CREATE INDEX IF NOT EXISTS ix_turns_sk_ts ON turns (session_key, ts);
CREATE INDEX IF NOT EXISTS ix_turns_source ON turns (source, ts);
CREATE UNIQUE INDEX IF NOT EXISTS ux_turns_assistant_message_id ON turns (assistant_message_id) WHERE assistant_message_id IS NOT NULL;
CREATE INDEX IF NOT EXISTS ix_turns_cache_recent ON turns (ts DESC, id DESC) WHERE react_cache_prompt_tokens IS NOT NULL;
CREATE INDEX IF NOT EXISTS ix_turns_agent_cache_recent ON turns (ts DESC, id DESC) WHERE source = 'agent' AND react_cache_prompt_tokens IS NOT NULL;
CREATE TABLE IF NOT EXISTS kv_cache_totals (
id INTEGER PRIMARY KEY CHECK (id = 1),
turn_count INTEGER NOT NULL,
tracked_turn_count INTEGER NOT NULL,
prompt_tokens INTEGER NOT NULL,
hit_tokens INTEGER NOT NULL,
passive_prompt_tokens INTEGER NOT NULL,
passive_hit_tokens INTEGER NOT NULL,
passive_tracked_turn_count INTEGER NOT NULL,
proactive_prompt_tokens INTEGER NOT NULL,
proactive_hit_tokens INTEGER NOT NULL,
proactive_tracked_turn_count INTEGER NOT NULL,
last_tracked_at TEXT
);
CREATE TABLE IF NOT EXISTS kv_cache_projection_state (
id INTEGER PRIMARY KEY CHECK (id = 1),
schema_version INTEGER NOT NULL,
last_turn_id INTEGER NOT NULL
);
-- ─────────────────────────────────────────────
-- 2. rag_queries 当前 memory 检索记录
-- ─────────────────────────────────────────────
CREATE TABLE IF NOT EXISTS rag_queries (
id INTEGER PRIMARY KEY AUTOINCREMENT,
ts TEXT NOT NULL,
caller TEXT NOT NULL, -- passive | proactive | explicit
session_key TEXT NOT NULL,
query TEXT NOT NULL, -- rewrite 后的检索 query
orig_query TEXT, -- 改写前原文,NULL = 未改写
aux_queries TEXT, -- JSON: ["hypothesis1", ...] HyDE 假想条目
hits_json TEXT, -- JSON: [{id, type, score, summary, injected}]
injected_count INTEGER NOT NULL DEFAULT 0,
route_decision TEXT, -- "RETRIEVE" | "NO_RETRIEVE" | NULL
error TEXT
);
CREATE INDEX IF NOT EXISTS ix_rq_sk_ts ON rag_queries (session_key, ts);
CREATE INDEX IF NOT EXISTS ix_rq_caller ON rag_queries (caller, ts);
-- ─────────────────────────────────────────────
-- 3. memory_writes post-response 记忆写入记录
-- ─────────────────────────────────────────────
CREATE TABLE IF NOT EXISTS memory_writes (
id INTEGER PRIMARY KEY AUTOINCREMENT,
ts TEXT NOT NULL,
session_key TEXT NOT NULL,
source_ref TEXT,
action TEXT NOT NULL, -- 'write' | 'supersede'
memory_type TEXT, -- write 时填写
item_id TEXT, -- write: 'new:xxx' or 'reinforced:xxx'
summary TEXT, -- write 时填写
superseded_ids TEXT, -- supersede: JSON 数组
error TEXT
);
CREATE INDEX IF NOT EXISTS ix_mw_sk_ts ON memory_writes (session_key, ts);
CREATE INDEX IF NOT EXISTS ix_mw_action ON memory_writes (action, ts);
-- ─────────────────────────────────────────────
-- 4. global_errors 全局异常聚合
-- ─────────────────────────────────────────────
CREATE TABLE IF NOT EXISTS global_errors (
id INTEGER PRIMARY KEY AUTOINCREMENT,
fingerprint TEXT NOT NULL,
bucket TEXT NOT NULL,
source TEXT NOT NULL,
logger_name TEXT,
error_type TEXT,
message TEXT,
traceback_text TEXT,
level TEXT,
first_ts TEXT NOT NULL,
last_ts TEXT NOT NULL,
count INTEGER NOT NULL DEFAULT 1,
session_keys TEXT,
flow TEXT,
phase TEXT,
turn TEXT,
tick TEXT,
status TEXT NOT NULL DEFAULT 'active'
);
CREATE UNIQUE INDEX IF NOT EXISTS ux_gerr_fp_bucket ON global_errors (fingerprint, bucket);
CREATE INDEX IF NOT EXISTS ix_gerr_last_ts ON global_errors (last_ts);
CREATE INDEX IF NOT EXISTS ix_gerr_type ON global_errors (error_type, last_ts);
-- 淘汰策略(由 retention.py 执行,不在 schema 里 enforce)
-- turns: 180 天
-- rag_queries: 90 天
-- 例外:error IS NOT NULL 的行永久保留
-- ─────────────────────────────────────────────