-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathmodel.py
More file actions
139 lines (111 loc) · 4.22 KB
/
model.py
File metadata and controls
139 lines (111 loc) · 4.22 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
138
139
"""Conversation Service 领域模型。
定义会话、事件、状态等核心数据结构,以及表名常量。
"""
from __future__ import annotations
from dataclasses import dataclass, field
from enum import Enum
import json
from typing import Any, Optional
# ---------------------------------------------------------------------------
# 表名常量(支持通过 table_prefix 自定义)
# ---------------------------------------------------------------------------
DEFAULT_CONVERSATION_TABLE = "conversation"
DEFAULT_EVENT_TABLE = "event"
DEFAULT_STATE_TABLE = "state"
DEFAULT_APP_STATE_TABLE = "app_state"
DEFAULT_USER_STATE_TABLE = "user_state"
DEFAULT_CONVERSATION_SECONDARY_INDEX = "conversation_secondary_index"
DEFAULT_CONVERSATION_SEARCH_INDEX = "conversation_search_index"
DEFAULT_STATE_SEARCH_INDEX = "state_search_index"
# ---------------------------------------------------------------------------
# 枚举
# ---------------------------------------------------------------------------
class StateScope(str, Enum):
"""状态作用域。
三级 State 是 ADK 的概念,其他框架按需使用。
- APP: 应用级状态(agent_id 维度)
- USER: 用户级状态(agent_id + user_id 维度)
- SESSION: 会话级状态(agent_id + user_id + session_id 维度)
"""
APP = "app"
USER = "user"
SESSION = "session"
# ---------------------------------------------------------------------------
# 领域对象
# ---------------------------------------------------------------------------
@dataclass
class ConversationSession:
"""会话对象。
Attributes:
agent_id: 智能体 ID(分区键)。
user_id: 用户 ID。
session_id: 会话 ID。
created_at: 创建时间(纳秒时间戳)。
updated_at: 最后更新时间(纳秒时间戳)。
is_pinned: 是否置顶。
summary: 会话摘要。
labels: 会话标签(JSON 字符串)。
framework: 框架标识,如 'adk' / 'langchain' / 'langgraph'。
extensions: 框架扩展数据(JSON 序列化后存储)。
version: 乐观锁版本号。
"""
agent_id: str
user_id: str
session_id: str
created_at: int
updated_at: int
is_pinned: bool = False
summary: Optional[str] = None
labels: Optional[str] = None
framework: Optional[str] = None
extensions: Optional[dict[str, Any]] = None
version: int = 0
@dataclass
class ConversationEvent:
"""事件对象。
统一用 Event 抽象,Message 是 Event 的子集。
Attributes:
agent_id: 智能体 ID(分区键)。
user_id: 用户 ID。
session_id: 会话 ID。
seq_id: 事件序号(OTS AUTO_INCREMENT 生成,写入前为 None)。
type: 事件类型。
content: 事件数据(JSON 序列化后存储)。
created_at: 创建时间(纳秒时间戳)。
updated_at: 最后更新时间(纳秒时间戳)。
version: 乐观锁版本号。
raw_event: 框架原生 Event 的完整 JSON 序列化(可选)。
用于精确还原框架特定的 Event 对象(如 ADK Event)。
LangChain 等不使用此字段的框架默认为 None。
"""
agent_id: str
user_id: str
session_id: str
seq_id: Optional[int]
type: str
content: dict[str, Any] = field(default_factory=dict)
created_at: int = 0
updated_at: int = 0
version: int = 0
raw_event: Optional[str] = None
def content_as_json(self) -> str:
"""将 content 序列化为 JSON 字符串。"""
return json.dumps(self.content, ensure_ascii=False)
@staticmethod
def content_from_json(raw: str) -> dict[str, Any]:
"""从 JSON 字符串反序列化 content。"""
result: dict[str, Any] = json.loads(raw)
return result
@dataclass
class StateData:
"""状态数据对象。
Attributes:
state: 状态字典。
created_at: 创建时间(纳秒时间戳)。
updated_at: 最后更新时间(纳秒时间戳)。
version: 乐观锁版本号。
"""
state: dict[str, Any] = field(default_factory=dict)
created_at: int = 0
updated_at: int = 0
version: int = 0