@agentunion/kite 1.4.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (235) hide show
  1. package/CHANGELOG.md +102 -0
  2. package/cli.js +44 -5
  3. package/core/dependency_checker.py +250 -0
  4. package/core/env_checker.py +490 -0
  5. package/dependencies_lock.json +128 -0
  6. package/extensions/agents/assistant/server.py +33 -17
  7. package/extensions/channels/acp_channel/server.py +33 -17
  8. package/extensions/services/backup/entry.py +23 -16
  9. package/extensions/services/evol/auth_manager.py +443 -0
  10. package/extensions/services/evol/config.yaml +149 -0
  11. package/extensions/services/evol/config_loader.py +117 -0
  12. package/extensions/services/evol/entry.py +406 -0
  13. package/extensions/services/evol/evol_api.py +173 -0
  14. package/extensions/services/evol/evol_config.json5 +29 -0
  15. package/extensions/services/evol/migrate_tokens.py +122 -0
  16. package/extensions/services/evol/module.md +32 -0
  17. package/extensions/services/evol/pairing.py +250 -0
  18. package/extensions/services/evol/pairing_codes.jsonl +1 -0
  19. package/extensions/services/evol/relay.py +682 -0
  20. package/extensions/services/evol/relay_config.json5 +67 -0
  21. package/extensions/services/evol/routes/__init__.py +1 -0
  22. package/extensions/services/evol/routes/routes_management_ws.py +127 -0
  23. package/extensions/services/evol/routes/routes_rpc.py +89 -0
  24. package/extensions/services/evol/routes/routes_test.py +61 -0
  25. package/extensions/services/evol/server.py +875 -0
  26. package/extensions/services/evol/static/css/style.css +1200 -0
  27. package/extensions/services/evol/static/index.html +781 -0
  28. package/extensions/services/evol/static/index_evol.html +14 -0
  29. package/extensions/services/evol/static/js/app.js +6304 -0
  30. package/extensions/services/evol/static/js/auth.js +326 -0
  31. package/extensions/services/evol/static/js/dialog.js +285 -0
  32. package/extensions/services/evol/static/js/evol-app-fixed.js +50 -0
  33. package/extensions/services/evol/static/js/evol-app.js +1949 -0
  34. package/extensions/services/evol/static/js/evol-app.js.bak +1800 -0
  35. package/extensions/services/evol/static/js/kernel-client-example.js +228 -0
  36. package/extensions/services/evol/static/js/kernel-client.js +396 -0
  37. package/extensions/services/evol/static/js/main.js +141 -0
  38. package/extensions/services/evol/static/js/registry-tests.js +585 -0
  39. package/extensions/services/evol/static/js/stats.js +217 -0
  40. package/extensions/services/evol/static/js/token-manager.js +175 -0
  41. package/extensions/services/evol/static/pairing.html +248 -0
  42. package/extensions/services/evol/static/test_registry.html +262 -0
  43. package/extensions/services/evol/static/test_relay.html +462 -0
  44. package/extensions/services/evol/stats_manager.py +240 -0
  45. package/extensions/services/model_service/entry.py +23 -1
  46. package/extensions/services/proxy/.claude/settings.local.json +13 -0
  47. package/extensions/services/proxy/CHANGELOG_20260308.md +258 -0
  48. package/extensions/services/proxy/_fix_prints.py +133 -0
  49. package/extensions/services/proxy/_fix_prints2.py +87 -0
  50. package/extensions/services/proxy/agentcp/LICENCE +178 -0
  51. package/extensions/services/proxy/agentcp/README copy.md +85 -0
  52. package/extensions/services/proxy/agentcp/README.md +260 -0
  53. package/extensions/services/proxy/agentcp/__init__.py +16 -0
  54. package/extensions/services/proxy/agentcp/agent.py +4 -0
  55. package/extensions/services/proxy/agentcp/agentcp.py +2494 -0
  56. package/extensions/services/proxy/agentcp/agentprofile.json +89 -0
  57. package/extensions/services/proxy/agentcp/ap/__init__.py +16 -0
  58. package/extensions/services/proxy/agentcp/ap/ap_client.py +316 -0
  59. package/extensions/services/proxy/agentcp/assets/images/wechat_qr.png +0 -0
  60. package/extensions/services/proxy/agentcp/backup/metrics.json +31 -0
  61. package/extensions/services/proxy/agentcp/base/__init__.py +20 -0
  62. package/extensions/services/proxy/agentcp/base/auth_client.py +257 -0
  63. package/extensions/services/proxy/agentcp/base/client.py +112 -0
  64. package/extensions/services/proxy/agentcp/base/env.py +34 -0
  65. package/extensions/services/proxy/agentcp/base/html_util.py +336 -0
  66. package/extensions/services/proxy/agentcp/base/log.py +98 -0
  67. package/extensions/services/proxy/agentcp/ca/__init__.py +17 -0
  68. package/extensions/services/proxy/agentcp/ca/ca_client.py +414 -0
  69. package/extensions/services/proxy/agentcp/ca/ca_root.py +74 -0
  70. package/extensions/services/proxy/agentcp/context/__init__.py +20 -0
  71. package/extensions/services/proxy/agentcp/context/context.py +73 -0
  72. package/extensions/services/proxy/agentcp/context/exceptions.py +114 -0
  73. package/extensions/services/proxy/agentcp/create_profile.py +125 -0
  74. package/extensions/services/proxy/agentcp/create_profile_weather.py +125 -0
  75. package/extensions/services/proxy/agentcp/db/__init__.py +15 -0
  76. package/extensions/services/proxy/agentcp/db/db_mananger.py +550 -0
  77. package/extensions/services/proxy/agentcp/docs/UDP_HEARTBEAT_FIX_REPORT.md +265 -0
  78. package/extensions/services/proxy/agentcp/docs/heartbeat_issue_analysis.md +291 -0
  79. package/extensions/services/proxy/agentcp/file/__init__.py +16 -0
  80. package/extensions/services/proxy/agentcp/file/file_client.py +141 -0
  81. package/extensions/services/proxy/agentcp/file/wss_binary_message.py +137 -0
  82. package/extensions/services/proxy/agentcp/hcp.py +299 -0
  83. package/extensions/services/proxy/agentcp/heartbeat/__init__.py +16 -0
  84. package/extensions/services/proxy/agentcp/heartbeat/heartbeat_client.py +360 -0
  85. package/extensions/services/proxy/agentcp/improved_scheduler.py +498 -0
  86. package/extensions/services/proxy/agentcp/llm_agent_utils.py +249 -0
  87. package/extensions/services/proxy/agentcp/llm_server.py +172 -0
  88. package/extensions/services/proxy/agentcp/mermaid.py +210 -0
  89. package/extensions/services/proxy/agentcp/message.py +149 -0
  90. package/extensions/services/proxy/agentcp/metrics.py +256 -0
  91. package/extensions/services/proxy/agentcp/monitoring/__init__.py +20 -0
  92. package/extensions/services/proxy/agentcp/monitoring/global_monitor.py +27 -0
  93. package/extensions/services/proxy/agentcp/monitoring/metrics_store.py +325 -0
  94. package/extensions/services/proxy/agentcp/monitoring/monitoring_service.py +269 -0
  95. package/extensions/services/proxy/agentcp/monitoring/sliding_window.py +222 -0
  96. package/extensions/services/proxy/agentcp/monitoring/standalone_reader.py +224 -0
  97. package/extensions/services/proxy/agentcp/msg/__init__.py +21 -0
  98. package/extensions/services/proxy/agentcp/msg/connection_manager.py +456 -0
  99. package/extensions/services/proxy/agentcp/msg/message_client.py +2058 -0
  100. package/extensions/services/proxy/agentcp/msg/message_serialize.py +263 -0
  101. package/extensions/services/proxy/agentcp/msg/open_ai_message.py +88 -0
  102. package/extensions/services/proxy/agentcp/msg/session_manager.py +1062 -0
  103. package/extensions/services/proxy/agentcp/msg/stream_client.py +267 -0
  104. package/extensions/services/proxy/agentcp/msg/websocket_file_receiver.py +89 -0
  105. package/extensions/services/proxy/agentcp/msg/ws_logger.py +685 -0
  106. package/extensions/services/proxy/agentcp/msg/wss_binary_message.py +137 -0
  107. package/extensions/services/proxy/agentcp/requirements.txt +7 -0
  108. package/extensions/services/proxy/agentcp/samples/agent_graph/README.md +37 -0
  109. package/extensions/services/proxy/agentcp/samples/agent_graph/agentprofile.json +89 -0
  110. package/extensions/services/proxy/agentcp/samples/agent_graph/create_profile.py +138 -0
  111. package/extensions/services/proxy/agentcp/samples/agent_graph/main.py +164 -0
  112. package/extensions/services/proxy/agentcp/samples/agent_use/create_profile.py +123 -0
  113. package/extensions/services/proxy/agentcp/samples/agent_use/llm/create_profile.py +129 -0
  114. package/extensions/services/proxy/agentcp/samples/agent_use/llm/env.json +5 -0
  115. package/extensions/services/proxy/agentcp/samples/agent_use/llm/main.py +146 -0
  116. package/extensions/services/proxy/agentcp/samples/agent_use/main.py +123 -0
  117. package/extensions/services/proxy/agentcp/samples/agent_use/readme.md +379 -0
  118. package/extensions/services/proxy/agentcp/samples/agent_use/search/create_profile.py +129 -0
  119. package/extensions/services/proxy/agentcp/samples/agent_use/search/main.py +28 -0
  120. package/extensions/services/proxy/agentcp/samples/agent_use/tool/create_profile.py +129 -0
  121. package/extensions/services/proxy/agentcp/samples/agent_use/tool/main.py +20 -0
  122. package/extensions/services/proxy/agentcp/samples/ali_amap/README.md +97 -0
  123. package/extensions/services/proxy/agentcp/samples/ali_amap/amap_agent.py +88 -0
  124. package/extensions/services/proxy/agentcp/samples/ali_amap/create_profile.py +125 -0
  125. package/extensions/services/proxy/agentcp/samples/compute_agent/agent/powershell.py +228 -0
  126. package/extensions/services/proxy/agentcp/samples/compute_agent/agent/software.py +63 -0
  127. package/extensions/services/proxy/agentcp/samples/compute_agent/agent/tools.py +36 -0
  128. package/extensions/services/proxy/agentcp/samples/compute_agent/browser_user.py +41 -0
  129. package/extensions/services/proxy/agentcp/samples/deepseek/README.md +79 -0
  130. package/extensions/services/proxy/agentcp/samples/deepseek/create_profile.py +126 -0
  131. package/extensions/services/proxy/agentcp/samples/deepseek/deepseek.py +42 -0
  132. package/extensions/services/proxy/agentcp/samples/dify_chat/README.md +78 -0
  133. package/extensions/services/proxy/agentcp/samples/dify_chat/create_profile.py +126 -0
  134. package/extensions/services/proxy/agentcp/samples/dify_chat/dify_chat.py +47 -0
  135. package/extensions/services/proxy/agentcp/samples/dify_workflow/README.md +78 -0
  136. package/extensions/services/proxy/agentcp/samples/dify_workflow/create_profile.py +126 -0
  137. package/extensions/services/proxy/agentcp/samples/dify_workflow/dify_workflow.py +46 -0
  138. package/extensions/services/proxy/agentcp/samples/executor/README.md +44 -0
  139. package/extensions/services/proxy/agentcp/samples/executor/agentprofile.json +89 -0
  140. package/extensions/services/proxy/agentcp/samples/executor/create_profile.py +139 -0
  141. package/extensions/services/proxy/agentcp/samples/executor/main.py +160 -0
  142. package/extensions/services/proxy/agentcp/samples/filereader/README.md +45 -0
  143. package/extensions/services/proxy/agentcp/samples/filereader/agentprofile.json +90 -0
  144. package/extensions/services/proxy/agentcp/samples/filereader/create_profile.py +137 -0
  145. package/extensions/services/proxy/agentcp/samples/filereader/main.py +253 -0
  146. package/extensions/services/proxy/agentcp/samples/filewriter/README.md +38 -0
  147. package/extensions/services/proxy/agentcp/samples/filewriter/agentprofile.json +91 -0
  148. package/extensions/services/proxy/agentcp/samples/filewriter/create_profile.py +138 -0
  149. package/extensions/services/proxy/agentcp/samples/filewriter/main.py +289 -0
  150. package/extensions/services/proxy/agentcp/samples/hcp/README.md +85 -0
  151. package/extensions/services/proxy/agentcp/samples/hcp/acp_weather_agent.zip +0 -0
  152. package/extensions/services/proxy/agentcp/samples/hcp/create_profile.py +125 -0
  153. package/extensions/services/proxy/agentcp/samples/hcp/hcp.py +237 -0
  154. package/extensions/services/proxy/agentcp/samples/helloworld/README.md +68 -0
  155. package/extensions/services/proxy/agentcp/samples/helloworld/hello_world.py +40 -0
  156. package/extensions/services/proxy/agentcp/samples/llm_agent/MEADME.md +117 -0
  157. package/extensions/services/proxy/agentcp/samples/llm_agent/create_profile.py +125 -0
  158. package/extensions/services/proxy/agentcp/samples/llm_agent/qwen_agent.py +136 -0
  159. package/extensions/services/proxy/agentcp/samples/local_llm_agent/README.md +90 -0
  160. package/extensions/services/proxy/agentcp/samples/local_llm_agent/create_profile.py +125 -0
  161. package/extensions/services/proxy/agentcp/samples/local_llm_agent/main.py +49 -0
  162. package/extensions/services/proxy/agentcp/samples/query_llm_from_agent/README.md +55 -0
  163. package/extensions/services/proxy/agentcp/samples/query_llm_from_agent/create_profile.py +125 -0
  164. package/extensions/services/proxy/agentcp/samples/query_llm_from_agent/main.py +23 -0
  165. package/extensions/services/proxy/agentcp/samples/query_weather_api_agent/README.md +103 -0
  166. package/extensions/services/proxy/agentcp/samples/query_weather_api_agent/create_profile.py +125 -0
  167. package/extensions/services/proxy/agentcp/samples/query_weather_api_agent/main.py +69 -0
  168. package/extensions/services/proxy/agentcp/samples/query_weather_from_agent/README.md +58 -0
  169. package/extensions/services/proxy/agentcp/samples/query_weather_from_agent/create_profile.py +125 -0
  170. package/extensions/services/proxy/agentcp/samples/query_weather_from_agent/main.py +25 -0
  171. package/extensions/services/proxy/agentcp/samples/qwen3/README.md +71 -0
  172. package/extensions/services/proxy/agentcp/samples/qwen3/create_profile.py +126 -0
  173. package/extensions/services/proxy/agentcp/samples/qwen3/qwen3.py +37 -0
  174. package/extensions/services/proxy/agentcp/samples/qwen3_tools/README.md +133 -0
  175. package/extensions/services/proxy/agentcp/samples/qwen3_tools/create_profile.py +126 -0
  176. package/extensions/services/proxy/agentcp/samples/qwen3_tools/qwen3_tools.py +98 -0
  177. package/extensions/services/proxy/agentcp/samples/search/create_profile_qwen.py +125 -0
  178. package/extensions/services/proxy/agentcp/samples/search/create_profile_search.py +125 -0
  179. package/extensions/services/proxy/agentcp/samples/search/qwen_agent.py +136 -0
  180. package/extensions/services/proxy/agentcp/samples/search/search_agent.py +170 -0
  181. package/extensions/services/proxy/agentcp/samples/wrapper_agently_to_agent/README.md +89 -0
  182. package/extensions/services/proxy/agentcp/samples/wrapper_agently_to_agent/create_profile.py +125 -0
  183. package/extensions/services/proxy/agentcp/samples/wrapper_agently_to_agent/main.py +44 -0
  184. package/extensions/services/proxy/agentcp/utils/__init__.py +15 -0
  185. package/extensions/services/proxy/agentcp/utils/file_util.py +117 -0
  186. package/extensions/services/proxy/agentcp/utils/proxy_bypass.py +99 -0
  187. package/extensions/services/proxy/agentcp/workflow.py +203 -0
  188. package/extensions/services/proxy/console_auth.py +109 -0
  189. package/extensions/services/proxy/evol/__init__.py +1 -0
  190. package/extensions/services/proxy/evol/config.py +37 -0
  191. package/extensions/services/proxy/evol/http/__init__.py +1 -0
  192. package/extensions/services/proxy/evol/http/async_http.py +551 -0
  193. package/extensions/services/proxy/evol/log.py +28 -0
  194. package/extensions/services/proxy/evol/presenter/__init__.py +2 -0
  195. package/extensions/services/proxy/evol/presenter/agentIdPresenter.py +1031 -0
  196. package/extensions/services/proxy/evol/presenter/apikeyPresenter.py +106 -0
  197. package/extensions/services/proxy/evol/presenter/configPresenter.py +1281 -0
  198. package/extensions/services/proxy/evol/presenter/userPresenter.py +477 -0
  199. package/extensions/services/proxy/evol/server/__init__.py +1 -0
  200. package/extensions/services/proxy/evol/server/claude_proxy_async.py +3430 -0
  201. package/extensions/services/proxy/evol/server/openclaw_proxy.py +1861 -0
  202. package/extensions/services/proxy/evol/server/proxy_config.py +15 -0
  203. package/extensions/services/proxy/evol/server/proxy_engine.py +501 -0
  204. package/extensions/services/proxy/evol/version.py +24 -0
  205. package/extensions/services/proxy/logs/websocket.log +260 -0
  206. package/extensions/services/proxy/main.py +240 -0
  207. package/extensions/services/proxy/requirements.txt +13 -0
  208. package/extensions/services/proxy/server.py +271 -0
  209. package/extensions/services/watchdog/entry.py +42 -16
  210. package/extensions/services/watchdog/module.md +1 -0
  211. package/extensions/services/watchdog/monitor.py +34 -4
  212. package/extensions/services/web/module.md +1 -1
  213. package/extensions/services/web/server.py +30 -18
  214. package/extensions/services/web/static/js/token-manager.js +10 -10
  215. package/kernel/entry.py +1 -1
  216. package/kernel/module.md +25 -1
  217. package/kernel/registry_store.py +2 -26
  218. package/kernel/rpc_router.py +36 -10
  219. package/kernel/server.py +106 -17
  220. package/kite_cli/commands/deps_install.py +67 -0
  221. package/kite_cli/commands/env_check.py +45 -0
  222. package/kite_cli/commands/prepare.py +49 -0
  223. package/kite_cli/commands/venv_setup.py +56 -0
  224. package/kite_cli/main.py +29 -1
  225. package/launcher/entry.py +306 -21
  226. package/launcher/module.md +9 -0
  227. package/launcher/module_scanner.py +11 -1
  228. package/main.py +4 -1
  229. package/package.json +8 -1
  230. package/python_version.json +4 -0
  231. package/requirements.txt +38 -0
  232. package/scripts/env-manager.js +328 -0
  233. package/scripts/python-env.js +79 -0
  234. package/scripts/scan_dependencies.py +461 -0
  235. package/scripts/setup-python-env.js +191 -0
@@ -0,0 +1,550 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Copyright 2025 AgentUnion Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ import sqlite3
16
+ import os
17
+ from agentcp.base.log import log_debug, log_error, log_exception, log_info
18
+ class DBManager:
19
+
20
+ def __init__(self,aid_path,aid):
21
+ db_path = os.path.join(aid_path,"data")
22
+ os.path.exists(db_path) or os.makedirs(db_path)
23
+ db_file_path = os.path.join(db_path, "agentid_data.db")
24
+
25
+ self.conn = sqlite3.connect(db_file_path, check_same_thread=False)
26
+ self.aid = aid
27
+ self.create_table()
28
+
29
+ def add_friend_agent(self,friend_aid,name,avaUrl,description):
30
+ try:
31
+ friend_table = f"friend"
32
+ cursor = self.conn.cursor()
33
+ # 使用INSERT OR REPLACE来实现upsert功能
34
+ # 如果aid存在就更新,不存在就插入
35
+ cursor.execute(f'''INSERT OR REPLACE INTO {friend_table} (aid, name, avaurl, description) VALUES (?, ?, ?, ?)''',
36
+ (friend_aid, name, avaUrl, description))
37
+ self.conn.commit()
38
+ result = cursor.rowcount > 0
39
+ cursor.close() # 关闭cursor对象
40
+ return result
41
+ except sqlite3.Error as e:
42
+ log_error(f"add_friend_agent数据库操作失败: {str(e)}")
43
+ return False
44
+
45
+ def set_friend_agent(self,friend_aid,name):
46
+ try:
47
+ friend_table = f"friend"
48
+ cursor = self.conn.cursor()
49
+
50
+ # 首先检查aid是否存在
51
+ cursor.execute(f'''SELECT avaurl, description FROM {friend_table} WHERE aid = ?''', (friend_aid,))
52
+ existing_record = cursor.fetchone()
53
+
54
+ if existing_record:
55
+ # 如果存在,只更新name,保持avaurl和description不变
56
+ cursor.execute(f'''UPDATE {friend_table} SET name = ? WHERE aid = ?''',
57
+ (name, friend_aid))
58
+ else:
59
+ # 如果不存在,插入新记录,avaurl和description设为空或默认值
60
+ cursor.execute(f'''INSERT INTO {friend_table} (aid, name, avaurl, description) VALUES (?, ?, ?, ?)''',
61
+ (friend_aid, name, '', ''))
62
+
63
+ self.conn.commit()
64
+ result = cursor.rowcount > 0
65
+ cursor.close() # 关闭cursor对象
66
+ return result
67
+ except sqlite3.Error as e:
68
+ log_error(f"set_friend_agent数据库操作失败: {str(e)}")
69
+ return False
70
+
71
+ def delete_friend_agent(self,friend_aid):
72
+ try:
73
+ friend_table = f"friend"
74
+ # 修改为使用动态生成的friend_table表名
75
+ cursor = self.conn.cursor()
76
+ cursor.execute(f'''DELETE FROM {friend_table} WHERE aid = ?''', (friend_aid,))
77
+ self.conn.commit()
78
+ result = cursor.rowcount > 0
79
+ cursor.close() # 关闭cursor对象
80
+ return result
81
+ except sqlite3.Error as e:
82
+ log_error(f"delete_friend_agent数据库操作失败: {str(e)}")
83
+ return False
84
+
85
+ def delete_session(self,session_id):
86
+ try:
87
+ conversation_table = f"conversation"
88
+ messages_table = f"messages"
89
+ chat_config_table = f"chat_config"
90
+ # 修改为使用动态生成的friend_table表名
91
+ cursor = self.conn.cursor()
92
+ cursor.execute(f'''DELETE FROM {conversation_table} WHERE session_id = ?''', (str(session_id),))
93
+ self.conn.commit()
94
+ cursor.execute(f'''DELETE FROM {messages_table} WHERE session_id =?''', (session_id,))
95
+ self.conn.commit()
96
+ cursor.execute(f'''DELETE FROM {chat_config_table} WHERE session_id =?''', (session_id,))
97
+ self.conn.commit()
98
+ result = cursor.rowcount > 0
99
+ cursor.close() # 关闭cursor对象
100
+ return result
101
+ except sqlite3.Error as e:
102
+ log_error(f"delete_session数据库操作失败: {str(e)}")
103
+ return False
104
+
105
+ def get_friend_agent_list(self,aid):
106
+ try:
107
+ friend_table = f"friend"
108
+ # 修改为使用动态生成的friend_table表名
109
+ cursor = self.conn.cursor()
110
+ cursor.execute(f'''SELECT * FROM {friend_table}''')
111
+ #columns = [column[0] for column in cursor.description] # 获取列名
112
+ rows = cursor.fetchall()
113
+ result = []
114
+ for row in rows:
115
+ row_dict = {
116
+ "id":row[0],
117
+ "aid":row[1],
118
+ "name":row[2],
119
+ "avaurl":row[3],
120
+ "description":row[4]
121
+ }
122
+ result.append(row_dict)
123
+ cursor.close()
124
+ return result
125
+ except sqlite3.Error as e:
126
+ log_error(f"get_friend_agent_list数据库操作失败: {str(e)}")
127
+ return []
128
+
129
+
130
+ def _create_table(self):
131
+ # 身份表,TODO 需考虑加密..
132
+ # cursor.execute("""DELETE FROM agentids""")
133
+ cursor = self.conn.cursor()
134
+ cursor.execute('''CREATE TABLE IF NOT EXISTS agentids (
135
+ aid TEXT PRIMARY KEY,
136
+ ep_aid TEXT,
137
+ ep_url TEXT,
138
+ avaUrl TEXT,
139
+ name TEXT,
140
+ description TEXT)
141
+ ''')
142
+
143
+ self.conn.commit()
144
+ cursor.close()
145
+
146
+ def create_table(self):
147
+ # 生成aid的MD5哈希作为表名前缀
148
+ cursor = self.conn.cursor()
149
+ conversation_table = f"conversation"
150
+ messages_table = f"messages"
151
+ friend_table = f"friend"
152
+ chat_config_table = f"chat_config"
153
+ # cursor.execute(f"DROP TABLE IF EXISTS {conversation_table}")
154
+
155
+ cursor.execute(f'''CREATE TABLE IF NOT EXISTS {conversation_table} (
156
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
157
+ session_id TEXT NOT NULL,
158
+ identifying_code TEXT NOT NULL,
159
+ main_aid TEXT NOT NULL,
160
+ name TEXT NOT NULL,
161
+ type TEXT NOT NULL,
162
+ timestamp DATETIME DEFAULT (strftime('%Y-%m-%d %H:%M:%S', 'now', 'localtime'))
163
+ )''')
164
+
165
+ #cursor.execute(f"DROP TABLE IF EXISTS {messages_table}")
166
+
167
+ cursor.execute(f'''CREATE TABLE IF NOT EXISTS {messages_table} (
168
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
169
+ message_id TEXT, -- 消息id, 用于去重
170
+ session_id INTEGER, -- 关联到对话表的id
171
+ role TEXT NOT NULL, -- 消息发送者,
172
+ message_aid TEXT NOT NULL,
173
+ parent_message_id INTEGER, -- 关联到父消息的id
174
+ to_aids TEXT NOT NULL, -- 消息发送者,
175
+ content TEXT NOT NULL, -- 消息内容,
176
+ instruction Text, -- 指令,
177
+ type TEXT NOT NULL, -- 消息状态,如"sent", "received",
178
+ status TEXT NOT NULL, -- 消息状态,如"error", "success",
179
+ timestamp DATETIME DEFAULT (strftime('%Y-%m-%d %H:%M:%S', 'now', 'localtime'))
180
+ )''')
181
+
182
+ cursor.execute(f'''CREATE TABLE IF NOT EXISTS {chat_config_table} (
183
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
184
+ session_id INTEGER NOT NULL,
185
+ aid TEXT NOT NULL,
186
+ avaurl TEXT,
187
+ description TEXT,
188
+ post_data TEXT
189
+ )''')
190
+
191
+ cursor.execute(f'''CREATE TABLE IF NOT EXISTS {friend_table} (
192
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
193
+ aid TEXT NOT NULL,
194
+ name TEXT,
195
+ avaurl TEXT,
196
+ description TEXT
197
+ )''')
198
+
199
+
200
+ cursor.execute(f'''CREATE TABLE IF NOT EXISTS session_server (
201
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
202
+ session_id TEXT NOT NULL,
203
+ session_server TEXT
204
+ )''')
205
+
206
+ self.conn.commit()
207
+ cursor.close()
208
+
209
+ def insert_session_server(self, session_id, session_server):
210
+ try:
211
+ cursor = self.conn.cursor()
212
+ cursor.execute('''INSERT INTO session_server (session_id, session_server)
213
+ VALUES (?, ?)''',
214
+ (session_id, session_server))
215
+ self.conn.commit()
216
+ result = cursor.lastrowid
217
+ cursor.close()
218
+ return result
219
+ except sqlite3.Error as e:
220
+ log_error(f"insert_session_server数据库操作失败: {str(e)}")
221
+ return None
222
+
223
+ def get_session_server(self, session_id):
224
+ try:
225
+ cursor = self.conn.cursor()
226
+ cursor.execute('''SELECT session_server FROM session_server
227
+ WHERE session_id = ?''',
228
+ (session_id,))
229
+ result = cursor.fetchone()
230
+ cursor.close()
231
+ return result[0] if result else None
232
+ except sqlite3.Error as e:
233
+ log_error(f"get_session_server数据库操作失败: {str(e)}")
234
+ return None
235
+
236
+ def load_session_history(self, session_id):
237
+ try:
238
+ cursor = self.conn.cursor()
239
+ sesion_table = f"conversation"
240
+ cursor.execute(f'''SELECT * FROM {sesion_table} WHERE session_id =?''', (session_id,))
241
+ columns = ['id','session_id','identifying_code','main_aid','name','type','timestamp']
242
+ results = [dict(zip(columns, row)) for row in cursor.fetchall()]
243
+ cursor.close()
244
+ return results
245
+ except sqlite3.Error as e:
246
+ log_error(f"load_session_history数据库操作失败: {str(e)}")
247
+ return None
248
+
249
+
250
+ def update_aid_info(self, aid, avaUrl, name, description):
251
+ try:
252
+ # cursor = self.conn.cursor()
253
+ # cursor.execute('''UPDATE agentids SET avaUrl =?, name =?, description =? WHERE aid =?''', (avaUrl, name, description, aid))
254
+ # self.conn.commit()
255
+ # result = cursor.rowcount > 0
256
+ # cursor.close() # 关闭cursor对象
257
+ return 1
258
+ except sqlite3.Error as e:
259
+ log_error(f"update_aid_info数据库操作失败: {str(e)}")
260
+ return False
261
+
262
+ def create_session(self, aid,session_id,identifying_code,name, type):
263
+ try:
264
+ # cursor = self.conn.cursor()
265
+ # conversation_table = f"conversation"
266
+ # # 修正参数数量,确保5个值对应5个占位符
267
+ # cursor.execute(f'''INSERT INTO {conversation_table} (session_id,identifying_code,main_aid,name,type) VALUES (?,?,?,?,?)''',
268
+ # (session_id, identifying_code, "", name, type))
269
+ # self.conn.commit()
270
+ # result = cursor.lastrowid
271
+ # cursor.close() # 关闭cursor对象
272
+ return 1
273
+ except sqlite3.Error as e:
274
+ log_error(f"create_conversation数据库操作失败: {str(e)}")
275
+
276
+ def invite_member(self, aid, session_id, invite_aid:str):
277
+ try:
278
+ # cursor = self.conn.cursor()
279
+ # chat_config_table = f"chat_config"
280
+ # cursor.execute(f'''INSERT INTO {chat_config_table} (session_id,aid,avaurl,description, post_data) VALUES (?,?,?,?,?)''',
281
+ # (session_id,invite_aid,"","",""))
282
+ # self.conn.commit()
283
+ # result = cursor.lastrowid
284
+ # cursor.close() # 关闭cursor对象
285
+ return 1
286
+ except sqlite3.Error as e:
287
+ log_error(f"invite_member数据库操作失败: {str(e)}")
288
+ return False
289
+ except Exception as e:
290
+ log_error(f"invite_member数据库操作失败: {str(e)}")
291
+ return False
292
+
293
+ def get_message_by_id(self, aid, session_id,message_id):
294
+ try:
295
+ # cursor = self.conn.cursor()
296
+ # messages_table = f"messages"
297
+ # cursor.execute(f'''SELECT * FROM {messages_table} WHERE session_id =? AND message_id =?''', (session_id,message_id))
298
+ # columns = ['id','session_id','message_id','role','message_aid', 'parent_message_id', 'to_aids', 'content', 'type', 'status', 'timestamp']
299
+ # results = [dict(zip(columns, row)) for row in cursor.fetchall()]
300
+ # cursor.close() # 关闭cursor对象
301
+ # 返回JSON格式字符串
302
+ return []
303
+ except sqlite3.Error as e:
304
+ log_error(f"get_message_by_id数据库操作失败: {str(e)}")
305
+ return []
306
+
307
+ def save_message(message):
308
+ try:
309
+ # cursor = self.conn.cursor()
310
+ # cursor.execute('''INSERT INTO messages (session_id, role, message_id, parent_message_id, to_aids, content, type, status) VALUES (?,?,?,?,?,?,?,?)''', (message.session_id, message.role, message.message_id, message.parent_message_id, message.to_aids, message.content, message.type, message.status))
311
+ # self.conn.commit()
312
+ # result = cursor.lastrowid
313
+ # cursor.close() # 关闭cursor对象
314
+ return 1
315
+ except sqlite3.Error as e:
316
+ log_error(f"save_message数据库操作失败: {str(e)}")
317
+ return None
318
+
319
+ def update_message(self, message):
320
+ try:
321
+ # cursor = self.conn.cursor()
322
+ # import json
323
+ # messages_table = f"messages"
324
+ # content_str = message["content"]
325
+ # if message["content"] is not None:
326
+ # # 添加类型判断,仅转换字典和列表类型
327
+ # if isinstance(message["content"], (dict, list)):
328
+ # content_str = json.dumps(message["content"])
329
+ # else: # 保留原始字符串类型
330
+ # content_str = str(message["content"])
331
+ # cursor.execute(f'''UPDATE {messages_table} SET content =?,status =? WHERE id =?''', (content_str, message["status"], message["id"]))
332
+ # self.conn.commit()
333
+ # result = cursor.rowcount > 0
334
+ # cursor.close() # 关闭cursor对象
335
+ return 1
336
+ except sqlite3.Error as e:
337
+ log_error(f"update_message数据库操作失败: {str(e)}")
338
+ return False
339
+
340
+ def insert_message(self, role,aid,conversation_id, message_aid, parent_message_id, to_aids, instruction,content, type, status,message_id=''):
341
+ try:
342
+ # cursor = self.conn.cursor()
343
+ # messages_table = f"messages"
344
+ # # 将json.dump改为json.dumps
345
+ # cursor.execute(f'''INSERT INTO {messages_table} (session_id, role,message_id,message_aid, parent_message_id, to_aids, instruction,content, type, status) VALUES (?,?,?,?,?,?,?,?,?,?)''',
346
+ # (conversation_id, role,message_id,message_aid, parent_message_id, to_aids, instruction,content, type, status))
347
+ # self.conn.commit()
348
+ # result = cursor.lastrowid
349
+ # cursor.close() # 关闭cursor对象
350
+ return 1
351
+ except sqlite3.Error as e:
352
+ log_error(f"insert_message数据库操作失败: {str(e)}")
353
+
354
+ def load_aid(self, aid):
355
+ try:
356
+ cursor = self.conn.cursor()
357
+ cursor.execute('''SELECT ep_aid, ep_url,avaUrl,name,description FROM agentids WHERE aid = ?''', (aid,))
358
+ result = cursor.fetchone()
359
+ cursor.close() # 关闭cursor对象
360
+ if result:
361
+ return result[0], result[1],result[2],result[3],result[4]
362
+ else:
363
+ return None, None,None,None,None
364
+ except sqlite3.Error as e:
365
+ log_error(f"load_aid数据库操作失败: {str(e)}")
366
+ return None, None,None,None,None
367
+
368
+ def create_aid(self, aid,ep_aid = "",ep_url = "",avaUrl = "",name = "",description=""):
369
+ try:
370
+ cursor = self.conn.cursor()
371
+ # 将私钥和CSR序列化为PEM格式字符串
372
+ cursor.execute('''INSERT INTO agentids (aid, ep_aid, ep_url,avaUrl,name,description)
373
+ VALUES (?,?,?,?,?,?)''',
374
+ (aid, ep_aid , ep_url,avaUrl,name,description))
375
+ self.conn.commit()
376
+ cursor.close() # 关闭cursor对象
377
+ return ""
378
+ except sqlite3.Error as e:
379
+ log_error(f"save_aid数据库操作失败: {str(e)}")
380
+ raise RuntimeError(f"save_aid数据库操作失败: {str(e)}")
381
+
382
+ def update_aid(self, aid, ep_aid, ep_url):
383
+ try:
384
+ cursor = self.conn.cursor()
385
+ cursor.execute('''UPDATE agentids SET ep_aid =?, ep_url =? WHERE aid =?''', (ep_aid, ep_url, aid))
386
+ self.conn.commit()
387
+ result = cursor.rowcount > 0
388
+ cursor.close() # 关闭cursor对象
389
+ return result
390
+ except sqlite3.Error as e:
391
+ log_error(f"update_aid数据库操作失败: {str(e)}")
392
+ return False
393
+
394
+ def get_agentid_list(self):
395
+ try:
396
+ cursor = self.conn.cursor()
397
+ cursor.execute('''SELECT aid FROM agentids''')
398
+ result = [row[0] for row in cursor.fetchall()] # 提取每个元组的第一个元素
399
+ cursor.close() # 关闭cursor对象
400
+ return result
401
+ except sqlite3.Error as e:
402
+ log_error(f"get_agentid_list数据库操作失败: {str(e)}")
403
+ return []
404
+
405
+ def get_conversation_by_id(self, aid, conversation_id):
406
+ try:
407
+ cursor = self.conn.cursor()
408
+ conversation_table = f"conversation"
409
+ cursor.execute(f'''SELECT id, session_id,identifying_code,main_aid,name,type FROM {conversation_table} WHERE id =?''', (conversation_id,))
410
+ result = cursor.fetchone()
411
+ cursor.close() # 关闭cursor对象
412
+ if result:
413
+ return {
414
+ 'id': result[0],
415
+ 'session_id': result[1],
416
+ 'identifying_code': result[2],
417
+ 'main_aid': result[3],
418
+ 'name': result[4],
419
+ 'type': result[5]
420
+ }
421
+ else:
422
+ return None
423
+ except sqlite3.Error as e:
424
+ log_error(f"get_conversation_by_id数据库操作失败: {str(e)}")
425
+ return None
426
+
427
+ def get_conversation_list(self, aid, main_aid, page=1, page_size=10):
428
+ try:
429
+ offset = (page - 1) * page_size
430
+ cursor = self.conn.cursor()
431
+ conversation_table = f"conversation"
432
+ if main_aid == "" or main_aid == None:
433
+ cursor.execute(
434
+ f'''SELECT id, session_id, identifying_code, name, type, timestamp
435
+ FROM {conversation_table}
436
+ ORDER BY timestamp DESC
437
+ LIMIT? OFFSET?''',
438
+ (page_size, offset)
439
+ )
440
+ else:
441
+ cursor.execute(
442
+ f'''SELECT id, session_id, identifying_code, name, type, timestamp
443
+ FROM {conversation_table}
444
+ WHERE main_aid = ?
445
+ ORDER BY timestamp DESC
446
+ LIMIT ? OFFSET ?''',
447
+ (main_aid, page_size, offset))
448
+
449
+ # 将查询结果转换为字典列表
450
+ columns = ['id', 'session_id', 'identifying_code', 'name', 'type', 'timestamp']
451
+ results = [dict(zip(columns, row)) for row in cursor.fetchall()]
452
+ cursor.close() # 关闭cursor对象
453
+ # 返回JSON格式字符串
454
+ return results
455
+
456
+ except sqlite3.Error as e:
457
+ log_error(f"get_conversation_list数据库操作失败: {str(e)}")
458
+ return []
459
+
460
+ def get_conversation_messages(self, conversation_id):
461
+ try:
462
+ cursor = self.conn.cursor()
463
+ cursor.execute('''SELECT id, aid, content, timestamp FROM messages WHERE conversation_id =? ORDER BY timestamp ASC''', (conversation_id,))
464
+ result = cursor.fetchall()
465
+ cursor.close() # 关闭cursor对象
466
+ return result
467
+ except sqlite3.Error as e:
468
+ log_error(f"get_conversation_messages数据库操作失败: {str(e)}")
469
+ return []
470
+
471
+ def get_conversation_config(self, conversation_id):
472
+ try:
473
+ cursor = self.conn.cursor()
474
+ cursor.execute('''SELECT id, aid, avaurl, description, post_data FROM chat_config WHERE conversation_id =?''', (conversation_id,))
475
+ result = cursor.fetchall()
476
+ cursor.close() # 关闭cursor对象
477
+ return result
478
+ except sqlite3.Error as e:
479
+ log_error(f"get_conversation_config数据库操作失败: {str(e)}")
480
+ return []
481
+
482
+ def add_conversation_config(self, conversation_id, aid, avaurl, description, post_data):
483
+ try:
484
+ cursor = self.conn.cursor()
485
+ cursor.execute('''INSERT INTO chat_config (conversation_id, aid, avaurl, description, post_data) VALUES (?,?,?,?,?)''', (conversation_id, aid, avaurl, description, post_data))
486
+ self.conn.commit()
487
+ result = cursor.lastrowid
488
+ cursor.close() # 关闭cursor对象
489
+ return result
490
+ except sqlite3.Error as e:
491
+ log_error(f"add_conversation_config数据库操作失败: {str(e)}")
492
+ return None
493
+
494
+ def update_conversation_config(self, config_id, avaurl, description, post_data):
495
+ try:
496
+ cursor = self.conn.cursor()
497
+ cursor.execute('''UPDATE chat_config SET avaurl = ?, description = ?, post_data = ? WHERE id = ?''', (avaurl, description, post_data, config_id))
498
+ self.conn.commit()
499
+ result = cursor.rowcount > 0
500
+ cursor.close() # 关闭cursor对象
501
+ return result
502
+ except sqlite3.Error as e:
503
+ log_error(f"update_conversation_config数据库操作失败: {str(e)}")
504
+ return False
505
+
506
+ def get_message_list(self, aid, session_id, page=1, page_size=10):
507
+ try:
508
+ page_size = 100
509
+ offset = (page - 1) * page_size
510
+ cursor = self.conn.cursor()
511
+ messages_table = f"messages"
512
+
513
+ # 修正SQL语句,移除多余的括号
514
+ cursor.execute(
515
+ f'''SELECT id, session_id,message_id,role,message_aid, parent_message_id, to_aids,instruction, content, type, status, timestamp
516
+ FROM {messages_table}
517
+ WHERE session_id = ?
518
+ ORDER BY timestamp ASC LIMIT ? OFFSET ?''',
519
+ (session_id, page_size, offset))
520
+
521
+ # 将查询结果转换为字典列表
522
+ columns = ['id','session_id','message_id','role','message_aid', 'parent_message_id', 'to_aids', 'instruction','content', 'type', 'status', 'timestamp']
523
+ results = [dict(zip(columns, row)) for row in cursor.fetchall()]
524
+ cursor.close() # 关闭cursor对象
525
+ # 返回JSON格式字符串
526
+ return results
527
+ except sqlite3.Error as e:
528
+ log_error(f"get_message_list数据库操作失败: {str(e)}")
529
+ return []
530
+ # return [dict(row) for row in cursor.fetchall(
531
+
532
+ def get_session_member_list(self,session_id):
533
+ try:
534
+ cursor = self.conn.cursor()
535
+ chat_config_table = f"chat_config"
536
+ cursor.execute(f'''SELECT * FROM {chat_config_table} WHERE session_id =?''', (session_id,))
537
+ columns = [column[0] for column in cursor.description] # 获取列名
538
+ rows = cursor.fetchall()
539
+ result = []
540
+ for row in rows:
541
+ if len(row) != len(columns): # 添加长度校验
542
+ continue
543
+ row_dict = {columns[i]: row[i] for i in range(len(columns))}
544
+ result.append(row_dict)
545
+ cursor.close()
546
+ return result
547
+ except sqlite3.Error as e:
548
+ log_error(f"get_session_member_list数据库操作失败: {str(e)}")
549
+ return []
550
+