@agentunion/kite 1.3.2 → 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 (293) hide show
  1. package/CHANGELOG.md +302 -0
  2. package/cli.js +119 -4
  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/entry.py +111 -1
  7. package/extensions/agents/assistant/server.py +279 -215
  8. package/extensions/channels/acp_channel/entry.py +111 -1
  9. package/extensions/channels/acp_channel/module.md +23 -22
  10. package/extensions/channels/acp_channel/server.py +279 -215
  11. package/extensions/event_hub_bench/entry.py +107 -1
  12. package/extensions/services/backup/entry.py +306 -21
  13. package/extensions/services/backup/module.md +24 -22
  14. package/extensions/services/evol/auth_manager.py +443 -0
  15. package/extensions/services/evol/config.yaml +149 -0
  16. package/extensions/services/evol/config_loader.py +117 -0
  17. package/extensions/services/evol/entry.py +406 -0
  18. package/extensions/services/evol/evol_api.py +173 -0
  19. package/extensions/services/evol/evol_config.json5 +29 -0
  20. package/extensions/services/evol/migrate_tokens.py +122 -0
  21. package/extensions/services/evol/module.md +32 -0
  22. package/extensions/services/evol/pairing.py +250 -0
  23. package/extensions/services/evol/pairing_codes.jsonl +1 -0
  24. package/extensions/services/evol/relay.py +682 -0
  25. package/extensions/services/evol/relay_config.json5 +67 -0
  26. package/extensions/services/evol/routes/__init__.py +1 -0
  27. package/extensions/services/evol/routes/routes_management_ws.py +127 -0
  28. package/extensions/services/evol/routes/routes_rpc.py +89 -0
  29. package/extensions/services/evol/routes/routes_test.py +61 -0
  30. package/extensions/services/evol/server.py +875 -0
  31. package/extensions/services/evol/static/css/style.css +1200 -0
  32. package/extensions/services/evol/static/index.html +781 -0
  33. package/extensions/services/evol/static/index_evol.html +14 -0
  34. package/extensions/services/evol/static/js/app.js +6304 -0
  35. package/extensions/services/evol/static/js/auth.js +326 -0
  36. package/extensions/services/evol/static/js/dialog.js +285 -0
  37. package/extensions/services/evol/static/js/evol-app-fixed.js +50 -0
  38. package/extensions/services/evol/static/js/evol-app.js +1949 -0
  39. package/extensions/services/evol/static/js/evol-app.js.bak +1800 -0
  40. package/extensions/services/evol/static/js/kernel-client-example.js +228 -0
  41. package/extensions/services/evol/static/js/kernel-client.js +396 -0
  42. package/extensions/services/evol/static/js/main.js +141 -0
  43. package/extensions/services/evol/static/js/registry-tests.js +585 -0
  44. package/extensions/services/evol/static/js/stats.js +217 -0
  45. package/extensions/services/evol/static/js/token-manager.js +175 -0
  46. package/extensions/services/evol/static/pairing.html +248 -0
  47. package/extensions/services/evol/static/test_registry.html +262 -0
  48. package/extensions/services/evol/static/test_relay.html +462 -0
  49. package/extensions/services/evol/stats_manager.py +240 -0
  50. package/extensions/services/model_service/entry.py +167 -19
  51. package/extensions/services/model_service/module.md +21 -22
  52. package/extensions/services/proxy/.claude/settings.local.json +13 -0
  53. package/extensions/services/proxy/CHANGELOG_20260308.md +258 -0
  54. package/extensions/services/proxy/_fix_prints.py +133 -0
  55. package/extensions/services/proxy/_fix_prints2.py +87 -0
  56. package/extensions/services/proxy/agentcp/LICENCE +178 -0
  57. package/extensions/services/proxy/agentcp/README copy.md +85 -0
  58. package/extensions/services/proxy/agentcp/README.md +260 -0
  59. package/extensions/services/proxy/agentcp/__init__.py +16 -0
  60. package/extensions/services/proxy/agentcp/agent.py +4 -0
  61. package/extensions/services/proxy/agentcp/agentcp.py +2494 -0
  62. package/extensions/services/proxy/agentcp/agentprofile.json +89 -0
  63. package/extensions/services/proxy/agentcp/ap/__init__.py +16 -0
  64. package/extensions/services/proxy/agentcp/ap/ap_client.py +316 -0
  65. package/extensions/services/proxy/agentcp/assets/images/wechat_qr.png +0 -0
  66. package/extensions/services/proxy/agentcp/backup/metrics.json +31 -0
  67. package/extensions/services/proxy/agentcp/base/__init__.py +20 -0
  68. package/extensions/services/proxy/agentcp/base/auth_client.py +257 -0
  69. package/extensions/services/proxy/agentcp/base/client.py +112 -0
  70. package/extensions/services/proxy/agentcp/base/env.py +34 -0
  71. package/extensions/services/proxy/agentcp/base/html_util.py +336 -0
  72. package/extensions/services/proxy/agentcp/base/log.py +98 -0
  73. package/extensions/services/proxy/agentcp/ca/__init__.py +17 -0
  74. package/extensions/services/proxy/agentcp/ca/ca_client.py +414 -0
  75. package/extensions/services/proxy/agentcp/ca/ca_root.py +74 -0
  76. package/extensions/services/proxy/agentcp/context/__init__.py +20 -0
  77. package/extensions/services/proxy/agentcp/context/context.py +73 -0
  78. package/extensions/services/proxy/agentcp/context/exceptions.py +114 -0
  79. package/extensions/services/proxy/agentcp/create_profile.py +125 -0
  80. package/extensions/services/proxy/agentcp/create_profile_weather.py +125 -0
  81. package/extensions/services/proxy/agentcp/db/__init__.py +15 -0
  82. package/extensions/services/proxy/agentcp/db/db_mananger.py +550 -0
  83. package/extensions/services/proxy/agentcp/docs/UDP_HEARTBEAT_FIX_REPORT.md +265 -0
  84. package/extensions/services/proxy/agentcp/docs/heartbeat_issue_analysis.md +291 -0
  85. package/extensions/services/proxy/agentcp/file/__init__.py +16 -0
  86. package/extensions/services/proxy/agentcp/file/file_client.py +141 -0
  87. package/extensions/services/proxy/agentcp/file/wss_binary_message.py +137 -0
  88. package/extensions/services/proxy/agentcp/hcp.py +299 -0
  89. package/extensions/services/proxy/agentcp/heartbeat/__init__.py +16 -0
  90. package/extensions/services/proxy/agentcp/heartbeat/heartbeat_client.py +360 -0
  91. package/extensions/services/proxy/agentcp/improved_scheduler.py +498 -0
  92. package/extensions/services/proxy/agentcp/llm_agent_utils.py +249 -0
  93. package/extensions/services/proxy/agentcp/llm_server.py +172 -0
  94. package/extensions/services/proxy/agentcp/mermaid.py +210 -0
  95. package/extensions/services/proxy/agentcp/message.py +149 -0
  96. package/extensions/services/proxy/agentcp/metrics.py +256 -0
  97. package/extensions/services/proxy/agentcp/monitoring/__init__.py +20 -0
  98. package/extensions/services/proxy/agentcp/monitoring/global_monitor.py +27 -0
  99. package/extensions/services/proxy/agentcp/monitoring/metrics_store.py +325 -0
  100. package/extensions/services/proxy/agentcp/monitoring/monitoring_service.py +269 -0
  101. package/extensions/services/proxy/agentcp/monitoring/sliding_window.py +222 -0
  102. package/extensions/services/proxy/agentcp/monitoring/standalone_reader.py +224 -0
  103. package/extensions/services/proxy/agentcp/msg/__init__.py +21 -0
  104. package/extensions/services/proxy/agentcp/msg/connection_manager.py +456 -0
  105. package/extensions/services/proxy/agentcp/msg/message_client.py +2058 -0
  106. package/extensions/services/proxy/agentcp/msg/message_serialize.py +263 -0
  107. package/extensions/services/proxy/agentcp/msg/open_ai_message.py +88 -0
  108. package/extensions/services/proxy/agentcp/msg/session_manager.py +1062 -0
  109. package/extensions/services/proxy/agentcp/msg/stream_client.py +267 -0
  110. package/extensions/services/proxy/agentcp/msg/websocket_file_receiver.py +89 -0
  111. package/extensions/services/proxy/agentcp/msg/ws_logger.py +685 -0
  112. package/extensions/services/proxy/agentcp/msg/wss_binary_message.py +137 -0
  113. package/extensions/services/proxy/agentcp/requirements.txt +7 -0
  114. package/extensions/services/proxy/agentcp/samples/agent_graph/README.md +37 -0
  115. package/extensions/services/proxy/agentcp/samples/agent_graph/agentprofile.json +89 -0
  116. package/extensions/services/proxy/agentcp/samples/agent_graph/create_profile.py +138 -0
  117. package/extensions/services/proxy/agentcp/samples/agent_graph/main.py +164 -0
  118. package/extensions/services/proxy/agentcp/samples/agent_use/create_profile.py +123 -0
  119. package/extensions/services/proxy/agentcp/samples/agent_use/llm/create_profile.py +129 -0
  120. package/extensions/services/proxy/agentcp/samples/agent_use/llm/env.json +5 -0
  121. package/extensions/services/proxy/agentcp/samples/agent_use/llm/main.py +146 -0
  122. package/extensions/services/proxy/agentcp/samples/agent_use/main.py +123 -0
  123. package/extensions/services/proxy/agentcp/samples/agent_use/readme.md +379 -0
  124. package/extensions/services/proxy/agentcp/samples/agent_use/search/create_profile.py +129 -0
  125. package/extensions/services/proxy/agentcp/samples/agent_use/search/main.py +28 -0
  126. package/extensions/services/proxy/agentcp/samples/agent_use/tool/create_profile.py +129 -0
  127. package/extensions/services/proxy/agentcp/samples/agent_use/tool/main.py +20 -0
  128. package/extensions/services/proxy/agentcp/samples/ali_amap/README.md +97 -0
  129. package/extensions/services/proxy/agentcp/samples/ali_amap/amap_agent.py +88 -0
  130. package/extensions/services/proxy/agentcp/samples/ali_amap/create_profile.py +125 -0
  131. package/extensions/services/proxy/agentcp/samples/compute_agent/agent/powershell.py +228 -0
  132. package/extensions/services/proxy/agentcp/samples/compute_agent/agent/software.py +63 -0
  133. package/extensions/services/proxy/agentcp/samples/compute_agent/agent/tools.py +36 -0
  134. package/extensions/services/proxy/agentcp/samples/compute_agent/browser_user.py +41 -0
  135. package/extensions/services/proxy/agentcp/samples/deepseek/README.md +79 -0
  136. package/extensions/services/proxy/agentcp/samples/deepseek/create_profile.py +126 -0
  137. package/extensions/services/proxy/agentcp/samples/deepseek/deepseek.py +42 -0
  138. package/extensions/services/proxy/agentcp/samples/dify_chat/README.md +78 -0
  139. package/extensions/services/proxy/agentcp/samples/dify_chat/create_profile.py +126 -0
  140. package/extensions/services/proxy/agentcp/samples/dify_chat/dify_chat.py +47 -0
  141. package/extensions/services/proxy/agentcp/samples/dify_workflow/README.md +78 -0
  142. package/extensions/services/proxy/agentcp/samples/dify_workflow/create_profile.py +126 -0
  143. package/extensions/services/proxy/agentcp/samples/dify_workflow/dify_workflow.py +46 -0
  144. package/extensions/services/proxy/agentcp/samples/executor/README.md +44 -0
  145. package/extensions/services/proxy/agentcp/samples/executor/agentprofile.json +89 -0
  146. package/extensions/services/proxy/agentcp/samples/executor/create_profile.py +139 -0
  147. package/extensions/services/proxy/agentcp/samples/executor/main.py +160 -0
  148. package/extensions/services/proxy/agentcp/samples/filereader/README.md +45 -0
  149. package/extensions/services/proxy/agentcp/samples/filereader/agentprofile.json +90 -0
  150. package/extensions/services/proxy/agentcp/samples/filereader/create_profile.py +137 -0
  151. package/extensions/services/proxy/agentcp/samples/filereader/main.py +253 -0
  152. package/extensions/services/proxy/agentcp/samples/filewriter/README.md +38 -0
  153. package/extensions/services/proxy/agentcp/samples/filewriter/agentprofile.json +91 -0
  154. package/extensions/services/proxy/agentcp/samples/filewriter/create_profile.py +138 -0
  155. package/extensions/services/proxy/agentcp/samples/filewriter/main.py +289 -0
  156. package/extensions/services/proxy/agentcp/samples/hcp/README.md +85 -0
  157. package/extensions/services/proxy/agentcp/samples/hcp/acp_weather_agent.zip +0 -0
  158. package/extensions/services/proxy/agentcp/samples/hcp/create_profile.py +125 -0
  159. package/extensions/services/proxy/agentcp/samples/hcp/hcp.py +237 -0
  160. package/extensions/services/proxy/agentcp/samples/helloworld/README.md +68 -0
  161. package/extensions/services/proxy/agentcp/samples/helloworld/hello_world.py +40 -0
  162. package/extensions/services/proxy/agentcp/samples/llm_agent/MEADME.md +117 -0
  163. package/extensions/services/proxy/agentcp/samples/llm_agent/create_profile.py +125 -0
  164. package/extensions/services/proxy/agentcp/samples/llm_agent/qwen_agent.py +136 -0
  165. package/extensions/services/proxy/agentcp/samples/local_llm_agent/README.md +90 -0
  166. package/extensions/services/proxy/agentcp/samples/local_llm_agent/create_profile.py +125 -0
  167. package/extensions/services/proxy/agentcp/samples/local_llm_agent/main.py +49 -0
  168. package/extensions/services/proxy/agentcp/samples/query_llm_from_agent/README.md +55 -0
  169. package/extensions/services/proxy/agentcp/samples/query_llm_from_agent/create_profile.py +125 -0
  170. package/extensions/services/proxy/agentcp/samples/query_llm_from_agent/main.py +23 -0
  171. package/extensions/services/proxy/agentcp/samples/query_weather_api_agent/README.md +103 -0
  172. package/extensions/services/proxy/agentcp/samples/query_weather_api_agent/create_profile.py +125 -0
  173. package/extensions/services/proxy/agentcp/samples/query_weather_api_agent/main.py +69 -0
  174. package/extensions/services/proxy/agentcp/samples/query_weather_from_agent/README.md +58 -0
  175. package/extensions/services/proxy/agentcp/samples/query_weather_from_agent/create_profile.py +125 -0
  176. package/extensions/services/proxy/agentcp/samples/query_weather_from_agent/main.py +25 -0
  177. package/extensions/services/proxy/agentcp/samples/qwen3/README.md +71 -0
  178. package/extensions/services/proxy/agentcp/samples/qwen3/create_profile.py +126 -0
  179. package/extensions/services/proxy/agentcp/samples/qwen3/qwen3.py +37 -0
  180. package/extensions/services/proxy/agentcp/samples/qwen3_tools/README.md +133 -0
  181. package/extensions/services/proxy/agentcp/samples/qwen3_tools/create_profile.py +126 -0
  182. package/extensions/services/proxy/agentcp/samples/qwen3_tools/qwen3_tools.py +98 -0
  183. package/extensions/services/proxy/agentcp/samples/search/create_profile_qwen.py +125 -0
  184. package/extensions/services/proxy/agentcp/samples/search/create_profile_search.py +125 -0
  185. package/extensions/services/proxy/agentcp/samples/search/qwen_agent.py +136 -0
  186. package/extensions/services/proxy/agentcp/samples/search/search_agent.py +170 -0
  187. package/extensions/services/proxy/agentcp/samples/wrapper_agently_to_agent/README.md +89 -0
  188. package/extensions/services/proxy/agentcp/samples/wrapper_agently_to_agent/create_profile.py +125 -0
  189. package/extensions/services/proxy/agentcp/samples/wrapper_agently_to_agent/main.py +44 -0
  190. package/extensions/services/proxy/agentcp/utils/__init__.py +15 -0
  191. package/extensions/services/proxy/agentcp/utils/file_util.py +117 -0
  192. package/extensions/services/proxy/agentcp/utils/proxy_bypass.py +99 -0
  193. package/extensions/services/proxy/agentcp/workflow.py +203 -0
  194. package/extensions/services/proxy/console_auth.py +109 -0
  195. package/extensions/services/proxy/evol/__init__.py +1 -0
  196. package/extensions/services/proxy/evol/config.py +37 -0
  197. package/extensions/services/proxy/evol/http/__init__.py +1 -0
  198. package/extensions/services/proxy/evol/http/async_http.py +551 -0
  199. package/extensions/services/proxy/evol/log.py +28 -0
  200. package/extensions/services/proxy/evol/presenter/__init__.py +2 -0
  201. package/extensions/services/proxy/evol/presenter/agentIdPresenter.py +1031 -0
  202. package/extensions/services/proxy/evol/presenter/apikeyPresenter.py +106 -0
  203. package/extensions/services/proxy/evol/presenter/configPresenter.py +1281 -0
  204. package/extensions/services/proxy/evol/presenter/userPresenter.py +477 -0
  205. package/extensions/services/proxy/evol/server/__init__.py +1 -0
  206. package/extensions/services/proxy/evol/server/claude_proxy_async.py +3430 -0
  207. package/extensions/services/proxy/evol/server/openclaw_proxy.py +1861 -0
  208. package/extensions/services/proxy/evol/server/proxy_config.py +15 -0
  209. package/extensions/services/proxy/evol/server/proxy_engine.py +501 -0
  210. package/extensions/services/proxy/evol/version.py +24 -0
  211. package/extensions/services/proxy/logs/websocket.log +260 -0
  212. package/extensions/services/proxy/main.py +240 -0
  213. package/extensions/services/proxy/requirements.txt +13 -0
  214. package/extensions/services/proxy/server.py +271 -0
  215. package/extensions/services/watchdog/entry.py +215 -26
  216. package/extensions/services/watchdog/module.md +1 -0
  217. package/extensions/services/watchdog/monitor.py +178 -38
  218. package/extensions/services/web/WEBSOCKET_STATUS.md +143 -0
  219. package/extensions/services/web/config_example.py +35 -0
  220. package/extensions/services/web/config_loader.py +110 -0
  221. package/extensions/services/web/entry.py +114 -26
  222. package/extensions/services/web/module.md +35 -24
  223. package/extensions/services/web/pairing.py +250 -0
  224. package/extensions/services/web/pairing_codes.jsonl +16 -0
  225. package/extensions/services/web/relay.py +643 -0
  226. package/extensions/services/web/relay_config.json5 +67 -0
  227. package/extensions/services/web/routes/routes_management_ws.py +127 -0
  228. package/extensions/services/web/routes/routes_rpc.py +89 -0
  229. package/extensions/services/web/routes/routes_test.py +61 -0
  230. package/extensions/services/web/routes/schemas.py +0 -22
  231. package/extensions/services/web/server.py +434 -99
  232. package/extensions/services/web/static/css/style.css +67 -28
  233. package/extensions/services/web/static/index.html +234 -44
  234. package/extensions/services/web/static/js/app.js +1335 -48
  235. package/extensions/services/web/static/js/kernel-client-example.js +161 -0
  236. package/extensions/services/web/static/js/kernel-client.js +383 -0
  237. package/extensions/services/web/static/js/registry-tests.js +558 -0
  238. package/extensions/services/web/static/js/token-manager.js +175 -0
  239. package/extensions/services/web/static/pairing.html +248 -0
  240. package/extensions/services/web/static/test_registry.html +262 -0
  241. package/extensions/services/web/web_config.json5 +29 -0
  242. package/kernel/entry.py +120 -32
  243. package/kernel/event_hub.py +141 -16
  244. package/kernel/module.md +60 -33
  245. package/kernel/registry_store.py +45 -36
  246. package/kernel/rpc_router.py +152 -59
  247. package/kernel/server.py +322 -26
  248. package/kite_cli/__init__.py +3 -0
  249. package/kite_cli/__main__.py +5 -0
  250. package/kite_cli/commands/__init__.py +1 -0
  251. package/kite_cli/commands/clean.py +101 -0
  252. package/kite_cli/commands/deps_install.py +67 -0
  253. package/kite_cli/commands/doctor.py +35 -0
  254. package/kite_cli/commands/env_check.py +45 -0
  255. package/kite_cli/commands/history.py +111 -0
  256. package/kite_cli/commands/info.py +96 -0
  257. package/kite_cli/commands/install.py +313 -0
  258. package/kite_cli/commands/list.py +143 -0
  259. package/kite_cli/commands/log.py +81 -0
  260. package/kite_cli/commands/prepare.py +49 -0
  261. package/kite_cli/commands/rollback.py +88 -0
  262. package/kite_cli/commands/search.py +73 -0
  263. package/kite_cli/commands/uninstall.py +85 -0
  264. package/kite_cli/commands/update.py +118 -0
  265. package/kite_cli/commands/venv_setup.py +56 -0
  266. package/kite_cli/core/__init__.py +1 -0
  267. package/kite_cli/core/checker.py +142 -0
  268. package/kite_cli/core/dependency.py +229 -0
  269. package/kite_cli/core/downloader.py +209 -0
  270. package/kite_cli/core/install_info.py +40 -0
  271. package/kite_cli/core/tool_installer.py +397 -0
  272. package/kite_cli/core/validator.py +78 -0
  273. package/kite_cli/main.py +317 -0
  274. package/kite_cli/utils/__init__.py +1 -0
  275. package/kite_cli/utils/i18n.py +252 -0
  276. package/kite_cli/utils/interactive.py +63 -0
  277. package/kite_cli/utils/operation_log.py +77 -0
  278. package/kite_cli/utils/paths.py +34 -0
  279. package/kite_cli/utils/version.py +308 -0
  280. package/launcher/entry.py +1124 -178
  281. package/launcher/logging_setup.py +104 -0
  282. package/launcher/module.md +46 -37
  283. package/launcher/module_scanner.py +11 -1
  284. package/main.py +4 -1
  285. package/package.json +9 -1
  286. package/python_version.json +4 -0
  287. package/requirements.txt +38 -0
  288. package/scripts/env-manager.js +328 -0
  289. package/scripts/plan_manager.py +315 -0
  290. package/scripts/python-env.js +79 -0
  291. package/scripts/scan_dependencies.py +461 -0
  292. package/scripts/setup-python-env.js +191 -0
  293. package/extensions/services/web/routes/routes_modules.py +0 -249
@@ -0,0 +1,260 @@
1
+ [2026-03-07 23:36:26] [INFO] [CONN ATTEMPT] conn_id=1, reason=new_connection, url=wss://msg.aid.pub/api/message/session?agent_id=evol_1760289753_6.aid.pub&signatu...
2
+ [2026-03-07 23:36:26] [INFO] ============================================================
3
+ CONNECTION ESTABLISHED
4
+ ============================================================
5
+ Connection ID : 1
6
+ Time : 2026-03-07 23:36:26.649616
7
+ URL : wss://msg.aid.pub/api/message/session?agent_id=evol_1760289753_6.aid.pub&signature=eyJhbGciOiJIUzM4N...
8
+ agent_id : evol_1760289753_6.aid.pub
9
+ ping_interval : 3
10
+ has_handler : True
11
+ ============================================================
12
+ [2026-03-07 23:36:26] [DEBUG] [THREAD] conn_id=1, thread=cleanup, action=started
13
+ [2026-03-07 23:36:26] [DEBUG] [THREAD] conn_id=1, thread=health_check, action=started
14
+ [2026-03-07 23:36:26] [INFO] [ON_OPEN] conn_id=1, status=SUCCESS, handler=SessionManager
15
+ [2026-03-07 23:45:31] [INFO] [CONN ATTEMPT] conn_id=1, reason=new_connection, url=wss://msg.aid.pub/api/message/session?agent_id=evol_1760289753_6.aid.pub&signatu...
16
+ [2026-03-07 23:45:31] [INFO] ============================================================
17
+ CONNECTION ESTABLISHED
18
+ ============================================================
19
+ Connection ID : 1
20
+ Time : 2026-03-07 23:45:31.735878
21
+ URL : wss://msg.aid.pub/api/message/session?agent_id=evol_1760289753_6.aid.pub&signature=eyJhbGciOiJIUzM4N...
22
+ agent_id : evol_1760289753_6.aid.pub
23
+ ping_interval : 3
24
+ has_handler : True
25
+ ============================================================
26
+ [2026-03-07 23:45:31] [DEBUG] [THREAD] conn_id=1, thread=cleanup, action=started
27
+ [2026-03-07 23:45:31] [DEBUG] [THREAD] conn_id=1, thread=health_check, action=started
28
+ [2026-03-07 23:45:31] [INFO] [ON_OPEN] conn_id=1, status=SUCCESS, handler=SessionManager
29
+ [2026-03-07 23:50:04] [INFO] [CONN ATTEMPT] conn_id=1, reason=new_connection, url=wss://msg.aid.pub/api/message/session?agent_id=evol_1760289753_6.aid.pub&signatu...
30
+ [2026-03-07 23:50:04] [INFO] ============================================================
31
+ CONNECTION ESTABLISHED
32
+ ============================================================
33
+ Connection ID : 1
34
+ Time : 2026-03-07 23:50:04.436579
35
+ URL : wss://msg.aid.pub/api/message/session?agent_id=evol_1760289753_6.aid.pub&signature=eyJhbGciOiJIUzM4N...
36
+ agent_id : evol_1760289753_6.aid.pub
37
+ ping_interval : 3
38
+ has_handler : True
39
+ ============================================================
40
+ [2026-03-07 23:50:04] [DEBUG] [THREAD] conn_id=1, thread=cleanup, action=started
41
+ [2026-03-07 23:50:04] [DEBUG] [THREAD] conn_id=1, thread=health_check, action=started
42
+ [2026-03-07 23:50:04] [INFO] [ON_OPEN] conn_id=1, status=SUCCESS, handler=SessionManager
43
+ [2026-03-08 00:02:04] [INFO] [CONN ATTEMPT] conn_id=1, reason=new_connection, url=wss://msg.aid.pub/api/message/session?agent_id=evol_1760289753_6.aid.pub&signatu...
44
+ [2026-03-08 00:02:04] [INFO] ============================================================
45
+ CONNECTION ESTABLISHED
46
+ ============================================================
47
+ Connection ID : 1
48
+ Time : 2026-03-08 00:02:04.873722
49
+ URL : wss://msg.aid.pub/api/message/session?agent_id=evol_1760289753_6.aid.pub&signature=eyJhbGciOiJIUzM4N...
50
+ agent_id : evol_1760289753_6.aid.pub
51
+ ping_interval : 3
52
+ has_handler : True
53
+ ============================================================
54
+ [2026-03-08 00:02:04] [DEBUG] [THREAD] conn_id=1, thread=cleanup, action=started
55
+ [2026-03-08 00:02:04] [DEBUG] [THREAD] conn_id=1, thread=health_check, action=started
56
+ [2026-03-08 00:02:04] [INFO] [ON_OPEN] conn_id=1, status=SUCCESS, handler=SessionManager
57
+ [2026-03-08 00:03:04] [DEBUG] [MSG RECV] conn_id=1, type=stats, size=0, total_messages=11, interval_seconds=60, loop_duration=60, avg_msg_size_kb=0.5, throughput_kb_s=0, total_bytes_mb=0.0, large_msg_count=0
58
+ [2026-03-08 00:16:08] [INFO] [CONN ATTEMPT] conn_id=1, reason=new_connection, url=wss://msg.aid.pub/api/message/session?agent_id=evol_1760289753_6.aid.pub&signatu...
59
+ [2026-03-08 00:16:09] [INFO] ============================================================
60
+ CONNECTION ESTABLISHED
61
+ ============================================================
62
+ Connection ID : 1
63
+ Time : 2026-03-08 00:16:09.139611
64
+ URL : wss://msg.aid.pub/api/message/session?agent_id=evol_1760289753_6.aid.pub&signature=eyJhbGciOiJIUzM4N...
65
+ agent_id : evol_1760289753_6.aid.pub
66
+ ping_interval : 3
67
+ has_handler : True
68
+ ============================================================
69
+ [2026-03-08 00:16:09] [DEBUG] [THREAD] conn_id=1, thread=cleanup, action=started
70
+ [2026-03-08 00:16:09] [DEBUG] [THREAD] conn_id=1, thread=health_check, action=started
71
+ [2026-03-08 00:16:09] [INFO] [ON_OPEN] conn_id=1, status=SUCCESS, handler=SessionManager
72
+ [2026-03-08 00:16:29] [ERROR] XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
73
+ CONNECTION CLOSED (DETAILED)
74
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
75
+ Connection ID : 1
76
+ Close Time : 2026-03-08 00:16:29.200332
77
+ Close Code : 1006
78
+ Close Reason : (empty)
79
+ Connection Duration: 20.05s
80
+ Messages Received : 7
81
+ Time Since Pong : 0.54s
82
+ --- Extra Info ---
83
+ ws_url : wss://msg.aid.pub/api/message/session?agent_id=evol_1760289753_6.aid.pub&signatu
84
+ agent_id : evol_1760289753_6.aid.pub
85
+ code_meaning : 异常关闭 (Abnormal Closure) - 连接意外断开,未收到关闭帧。常见原因:网络中断、服务器崩溃、防火墙/代理断开、心跳超时
86
+ recent_msg_types : create_session_ack, invite_agent_ack, session_message_ack, system_message, member_list, session_message, leave_session_ack
87
+ max_msg_size_kb : 0.7
88
+ total_bytes_kb : 2.6
89
+ large_msg_count : 0
90
+ exception_type : ConnectionClosedError
91
+ exception_detail : sent 1000 (OK); no close frame received
92
+ --- Diagnosis ---
93
+ Code 1006 表示异常关闭,可能的原因:
94
+ 1. 网络中断或不稳定
95
+ 2. 服务器主动断开但未发送关闭帧
96
+ 3. 心跳超时(检查 ping_interval 和 ping_timeout 配置)
97
+ 4. 防火墙/代理/负载均衡器超时断开
98
+ 5. 连接仅存活 20.1s,可能是认证失败或服务器拒绝
99
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
100
+ [2026-03-08 00:16:29] [WARNING] ================================================================================
101
+ CONNECTION DISCONNECTED
102
+ ================================================================================
103
+ Connection ID : 1
104
+ Disconnect Time : 2026-03-08 00:16:29.201645
105
+ Close Code : 1006
106
+ Reason :
107
+ Pending Requests : 0
108
+ Extra Info : {"agent_id": "evol_1760289753_6.aid.pub", "server_url": "https://msg.aid.pub/api/message", "is_current_connection": true, "current_conn_id": 1}
109
+ ================================================================================
110
+ [2026-03-08 00:16:29] [INFO] [FULL RESET] conn_id=1, step=partial_reset_complete, detail=部分重置完成,准备重连
111
+ [2026-03-08 00:19:34] [INFO] [CONN ATTEMPT] conn_id=1, reason=new_connection, url=wss://msg.aid.pub/api/message/session?agent_id=evol_1760289753_6.aid.pub&signatu...
112
+ [2026-03-08 00:19:34] [INFO] ============================================================
113
+ CONNECTION ESTABLISHED
114
+ ============================================================
115
+ Connection ID : 1
116
+ Time : 2026-03-08 00:19:34.274703
117
+ URL : wss://msg.aid.pub/api/message/session?agent_id=evol_1760289753_6.aid.pub&signature=eyJhbGciOiJIUzM4N...
118
+ agent_id : evol_1760289753_6.aid.pub
119
+ ping_interval : 3
120
+ has_handler : True
121
+ ============================================================
122
+ [2026-03-08 00:19:34] [DEBUG] [THREAD] conn_id=1, thread=cleanup, action=started
123
+ [2026-03-08 00:19:34] [DEBUG] [THREAD] conn_id=1, thread=health_check, action=started
124
+ [2026-03-08 00:19:34] [INFO] [ON_OPEN] conn_id=1, status=SUCCESS, handler=SessionManager
125
+ [2026-03-08 00:50:55] [INFO] [CONN ATTEMPT] conn_id=1, reason=new_connection, url=wss://msg.aid.pub/api/message/session?agent_id=evol_1760289753_6.aid.pub&signatu...
126
+ [2026-03-08 00:50:56] [INFO] ============================================================
127
+ CONNECTION ESTABLISHED
128
+ ============================================================
129
+ Connection ID : 1
130
+ Time : 2026-03-08 00:50:56.177923
131
+ URL : wss://msg.aid.pub/api/message/session?agent_id=evol_1760289753_6.aid.pub&signature=eyJhbGciOiJIUzM4N...
132
+ agent_id : evol_1760289753_6.aid.pub
133
+ ping_interval : 3
134
+ has_handler : True
135
+ ============================================================
136
+ [2026-03-08 00:50:56] [DEBUG] [THREAD] conn_id=1, thread=cleanup, action=started
137
+ [2026-03-08 00:50:56] [DEBUG] [THREAD] conn_id=1, thread=health_check, action=started
138
+ [2026-03-08 00:50:56] [INFO] [ON_OPEN] conn_id=1, status=SUCCESS, handler=SessionManager
139
+ [2026-03-08 00:51:58] [DEBUG] [MSG RECV] conn_id=1, type=stats, size=0, total_messages=8, interval_seconds=62, loop_duration=62, avg_msg_size_kb=0.3, throughput_kb_s=0, total_bytes_mb=0.0, large_msg_count=0
140
+ [2026-03-08 00:53:36] [INFO] [CONN ATTEMPT] conn_id=1, reason=new_connection, url=wss://msg.aid.pub/api/message/session?agent_id=evol_1760289753_6.aid.pub&signatu...
141
+ [2026-03-08 00:53:37] [INFO] ============================================================
142
+ CONNECTION ESTABLISHED
143
+ ============================================================
144
+ Connection ID : 1
145
+ Time : 2026-03-08 00:53:37.194120
146
+ URL : wss://msg.aid.pub/api/message/session?agent_id=evol_1760289753_6.aid.pub&signature=eyJhbGciOiJIUzM4N...
147
+ agent_id : evol_1760289753_6.aid.pub
148
+ ping_interval : 3
149
+ has_handler : True
150
+ ============================================================
151
+ [2026-03-08 00:53:37] [DEBUG] [THREAD] conn_id=1, thread=cleanup, action=started
152
+ [2026-03-08 00:53:37] [DEBUG] [THREAD] conn_id=1, thread=health_check, action=started
153
+ [2026-03-08 00:53:37] [INFO] [ON_OPEN] conn_id=1, status=SUCCESS, handler=SessionManager
154
+ [2026-03-08 00:54:02] [ERROR] XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
155
+ CONNECTION CLOSED (DETAILED)
156
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
157
+ Connection ID : 1
158
+ Close Time : 2026-03-08 00:54:02.251251
159
+ Close Code : 1006
160
+ Close Reason : (empty)
161
+ Connection Duration: 25.05s
162
+ Messages Received : 7
163
+ Time Since Pong : 0.69s
164
+ --- Extra Info ---
165
+ ws_url : wss://msg.aid.pub/api/message/session?agent_id=evol_1760289753_6.aid.pub&signatu
166
+ agent_id : evol_1760289753_6.aid.pub
167
+ code_meaning : 异常关闭 (Abnormal Closure) - 连接意外断开,未收到关闭帧。常见原因:网络中断、服务器崩溃、防火墙/代理断开、心跳超时
168
+ recent_msg_types : create_session_ack, invite_agent_ack, session_message_ack, system_message, member_list, session_message, leave_session_ack
169
+ max_msg_size_kb : 0.7
170
+ total_bytes_kb : 2.6
171
+ large_msg_count : 0
172
+ exception_type : ConnectionClosedError
173
+ exception_detail : sent 1000 (OK); no close frame received
174
+ --- Diagnosis ---
175
+ Code 1006 表示异常关闭,可能的原因:
176
+ 1. 网络中断或不稳定
177
+ 2. 服务器主动断开但未发送关闭帧
178
+ 3. 心跳超时(检查 ping_interval 和 ping_timeout 配置)
179
+ 4. 防火墙/代理/负载均衡器超时断开
180
+ 5. 连接仅存活 25.1s,可能是认证失败或服务器拒绝
181
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
182
+ [2026-03-08 00:54:02] [WARNING] ================================================================================
183
+ CONNECTION DISCONNECTED
184
+ ================================================================================
185
+ Connection ID : 1
186
+ Disconnect Time : 2026-03-08 00:54:02.253080
187
+ Close Code : 1006
188
+ Reason :
189
+ Pending Requests : 0
190
+ Extra Info : {"agent_id": "evol_1760289753_6.aid.pub", "server_url": "https://msg.aid.pub/api/message", "is_current_connection": true, "current_conn_id": 1}
191
+ ================================================================================
192
+ [2026-03-08 00:54:02] [INFO] [FULL RESET] conn_id=1, step=partial_reset_complete, detail=部分重置完成,准备重连
193
+ [2026-03-08 01:07:56] [INFO] [CONN ATTEMPT] conn_id=1, reason=new_connection, url=wss://msg.aid.pub/api/message/session?agent_id=evol_1760289753_6.aid.pub&signatu...
194
+ [2026-03-08 01:07:56] [INFO] ============================================================
195
+ CONNECTION ESTABLISHED
196
+ ============================================================
197
+ Connection ID : 1
198
+ Time : 2026-03-08 01:07:56.501473
199
+ URL : wss://msg.aid.pub/api/message/session?agent_id=evol_1760289753_6.aid.pub&signature=eyJhbGciOiJIUzM4N...
200
+ agent_id : evol_1760289753_6.aid.pub
201
+ ping_interval : 3
202
+ has_handler : True
203
+ ============================================================
204
+ [2026-03-08 01:07:56] [DEBUG] [THREAD] conn_id=1, thread=cleanup, action=started
205
+ [2026-03-08 01:07:56] [DEBUG] [THREAD] conn_id=1, thread=health_check, action=started
206
+ [2026-03-08 01:07:56] [INFO] [ON_OPEN] conn_id=1, status=SUCCESS, handler=SessionManager
207
+ [2026-03-08 01:41:44] [INFO] [CONN ATTEMPT] conn_id=1, reason=new_connection, url=wss://msg.aid.pub/api/message/session?agent_id=evol_1772904026_1.aid.pub&signatu...
208
+ [2026-03-08 01:41:45] [INFO] ============================================================
209
+ CONNECTION ESTABLISHED
210
+ ============================================================
211
+ Connection ID : 1
212
+ Time : 2026-03-08 01:41:45.128171
213
+ URL : wss://msg.aid.pub/api/message/session?agent_id=evol_1772904026_1.aid.pub&signature=eyJhbGciOiJIUzM4N...
214
+ agent_id : evol_1772904026_1.aid.pub
215
+ ping_interval : 3
216
+ has_handler : True
217
+ ============================================================
218
+ [2026-03-08 01:41:45] [DEBUG] [THREAD] conn_id=1, thread=cleanup, action=started
219
+ [2026-03-08 01:41:45] [DEBUG] [THREAD] conn_id=1, thread=health_check, action=started
220
+ [2026-03-08 01:41:45] [INFO] [ON_OPEN] conn_id=1, status=SUCCESS, handler=SessionManager
221
+ [2026-03-08 01:43:20] [DEBUG] [MSG RECV] conn_id=1, type=stats, size=0, total_messages=6, interval_seconds=95, loop_duration=95, avg_msg_size_kb=0.3, throughput_kb_s=0, total_bytes_mb=0.0, large_msg_count=0
222
+ [2026-03-08 08:37:51] [DEBUG] [MSG RECV] conn_id=1, type=stats, size=0, total_messages=17, interval_seconds=24871, loop_duration=24966, avg_msg_size_kb=0.4, throughput_kb_s=0, total_bytes_mb=0.0, large_msg_count=0
223
+ [2026-03-08 08:37:52] [ERROR] XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
224
+ CONNECTION CLOSED (DETAILED)
225
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
226
+ Connection ID : 1
227
+ Close Time : 2026-03-08 08:37:52.245927
228
+ Close Code : 1006
229
+ Close Reason : (empty)
230
+ Connection Duration: 24967.10s
231
+ Messages Received : 18
232
+ Time Since Pong : 0.30s
233
+ --- Extra Info ---
234
+ ws_url : wss://msg.aid.pub/api/message/session?agent_id=evol_1772904026_1.aid.pub&signatu
235
+ agent_id : evol_1772904026_1.aid.pub
236
+ code_meaning : 异常关闭 (Abnormal Closure) - 连接意外断开,未收到关闭帧。常见原因:网络中断、服务器崩溃、防火墙/代理断开、心跳超时
237
+ recent_msg_types : member_list, session_message_ack, session_message, invite_agent_ack, session_message_ack, session_message, invite_agent_ack, session_message_ack, leave_session_ack, leave_session_ack
238
+ max_msg_size_kb : 0.7
239
+ total_bytes_kb : 6.7
240
+ large_msg_count : 0
241
+ exception_type : ConnectionClosedError
242
+ exception_detail : sent 1000 (OK); no close frame received
243
+ --- Diagnosis ---
244
+ Code 1006 表示异常关闭,可能的原因:
245
+ 1. 网络中断或不稳定
246
+ 2. 服务器主动断开但未发送关闭帧
247
+ 3. 心跳超时(检查 ping_interval 和 ping_timeout 配置)
248
+ 4. 防火墙/代理/负载均衡器超时断开
249
+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
250
+ [2026-03-08 08:37:52] [WARNING] ================================================================================
251
+ CONNECTION DISCONNECTED
252
+ ================================================================================
253
+ Connection ID : 1
254
+ Disconnect Time : 2026-03-08 08:37:52.250383
255
+ Close Code : 1006
256
+ Reason :
257
+ Pending Requests : 0
258
+ Extra Info : {"agent_id": "evol_1772904026_1.aid.pub", "server_url": "https://msg.aid.pub/api/message", "is_current_connection": true, "current_conn_id": 1}
259
+ ================================================================================
260
+ [2026-03-08 08:37:52] [INFO] [FULL RESET] conn_id=1, step=partial_reset_complete, detail=部分重置完成,准备重连
@@ -0,0 +1,240 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Evol Sample Backend - 独立控制台程序
4
+
5
+ 脱离 Electron 桌面应用,通过控制台交互完成登录,
6
+ 然后在端口 12655 上提供与 Evol 完全一致的 4 个代理服务。
7
+
8
+ 启动流程:
9
+ 1. 初始化配置目录
10
+ 2. 检查本地 token(fsss2 文件 < 7天有效)
11
+ 3. 若无有效 token → 控制台登录(手机号 + 验证码)
12
+ 4. 同步用户信息 & AID 上线
13
+ 5. 启动 FastAPI 服务器(端口 12655)
14
+ """
15
+
16
+ import asyncio
17
+ import logging
18
+ import os
19
+ import platform
20
+ import socket
21
+ import subprocess
22
+ import sys
23
+
24
+ # 配置日志
25
+ logging.basicConfig(
26
+ level=logging.INFO,
27
+ format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
28
+ datefmt="%Y-%m-%d %H:%M:%S",
29
+ )
30
+ logger = logging.getLogger("evol_sample")
31
+
32
+ # 抑制 agentid logger 的重复输出(它自带 handler,不需要 root handler 再输出一遍)
33
+ logging.getLogger("agentid").propagate = False
34
+ logging.getLogger("agentid").setLevel(logging.WARNING)
35
+
36
+
37
+ def kill_port(port: int):
38
+ """如果端口被占用,强制杀掉占用进程"""
39
+ sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
40
+ try:
41
+ sock.bind(("127.0.0.1", port))
42
+ sock.close()
43
+ return # 端口空闲,无需处理
44
+ except OSError:
45
+ sock.close()
46
+
47
+ print(f"[Port] 端口 {port} 被占用,正在清理...")
48
+
49
+ try:
50
+ if platform.system() == "Windows":
51
+ # netstat 找到占用端口的 PID
52
+ result = subprocess.run(
53
+ ["netstat", "-ano"],
54
+ capture_output=True, text=True, timeout=5
55
+ )
56
+ for line in result.stdout.splitlines():
57
+ if f":{port}" in line and "LISTENING" in line:
58
+ pid = line.strip().split()[-1]
59
+ if pid.isdigit() and int(pid) != os.getpid():
60
+ subprocess.run(["taskkill", "/PID", pid, "/F"],
61
+ capture_output=True, timeout=5)
62
+ print(f"[Port] 已杀掉进程 PID={pid}")
63
+ else:
64
+ # Unix: lsof + kill
65
+ result = subprocess.run(
66
+ ["lsof", "-ti", f":{port}"],
67
+ capture_output=True, text=True, timeout=5
68
+ )
69
+ for pid in result.stdout.strip().splitlines():
70
+ if pid.isdigit() and int(pid) != os.getpid():
71
+ os.kill(int(pid), 9)
72
+ print(f"[Port] 已杀掉进程 PID={pid}")
73
+ except Exception as e:
74
+ print(f"[Port] 清理失败: {e},请手动杀掉占用端口 {port} 的进程")
75
+ sys.exit(1)
76
+
77
+
78
+ async def async_main():
79
+ """异步主流程"""
80
+
81
+ # 使用系统自动分配端口
82
+ PORT = 0 # 0 表示让系统自动分配可用端口
83
+
84
+ print("\n" + "=" * 60)
85
+ print(" Evol Sample Backend")
86
+ print(" Port: Auto-assigned by system")
87
+ print("=" * 60)
88
+
89
+ # Step 1: 初始化配置目录
90
+ from pathlib import Path
91
+ evol_dir = Path.home() / ".evol"
92
+ evol_dir.mkdir(exist_ok=True)
93
+ (evol_dir / "default").mkdir(exist_ok=True)
94
+ print(f"\n[Init] Config dir: {evol_dir}")
95
+
96
+ # Step 2: 检查本地 token
97
+ from console_auth import check_token_valid, console_login
98
+
99
+ if check_token_valid():
100
+ print("[Auth] Token valid, skip login")
101
+ else:
102
+ print("[Auth] Token invalid or expired, need login")
103
+ await console_login()
104
+
105
+ # Step 3: 同步用户信息 & AID 上线
106
+ print("\n[AID] Starting AID login...")
107
+ from evol.presenter.userPresenter import userPresenter
108
+
109
+ if not userPresenter.is_logged_in():
110
+ print("[AID] Error: User not logged in after auth flow")
111
+ sys.exit(1)
112
+
113
+ aid_result = await userPresenter.user_agent_login()
114
+
115
+ if aid_result.get("status") != "success":
116
+ print(f"[AID] Error: AID login failed: {aid_result.get('error', 'unknown')}")
117
+ sys.exit(1)
118
+
119
+ aid_id = aid_result.get("aid", "unknown")
120
+ print(f"\nEvol: {aid_id} is online")
121
+
122
+ # Step 3.5: 获取 Evol 本地密钥
123
+ evol_api_key = None
124
+ try:
125
+ from evol.presenter.apikeyPresenter import apikeyPresenter
126
+ evol_api_key = await apikeyPresenter.get_first_api_key()
127
+ except Exception as e:
128
+ print(f"[Key] Warning: 获取 Evol 密钥失败: {e}")
129
+
130
+ # Step 3.6: 拉取模型列表和用户信息
131
+ print("\n[Info] Fetching models and user info...")
132
+ try:
133
+ # 拉取模型列表
134
+ from evol.server.openclaw_proxy import get_models_list
135
+ models_data = get_models_list()
136
+ model_count = len(models_data.get("data", []))
137
+ print(f"[Models] Found {model_count} available models:")
138
+ for model in models_data.get("data", [])[:5]: # 只显示前5个
139
+ print(f" - {model.get('id', 'unknown')}")
140
+ if model_count > 5:
141
+ print(f" ... and {model_count - 5} more")
142
+
143
+ # 获取用户信息
144
+ from evol.presenter.userPresenter import userPresenter
145
+ user_info = userPresenter.get_user_info()
146
+ if user_info:
147
+ print(f"[User] Logged in as: {user_info.get('phone', 'unknown')}")
148
+ print(f"[User] User ID: {user_info.get('id', 'unknown')}")
149
+
150
+ except Exception as e:
151
+ print(f"[Info] Warning: 获取信息失败: {e}")
152
+
153
+ # Step 4: 移除 asyncio 事件循环自动安装的信号处理器,防止外部信号触发任务取消
154
+ import signal
155
+ loop = asyncio.get_running_loop()
156
+ if hasattr(loop, 'remove_signal_handler'):
157
+ for sig in (signal.SIGTERM, signal.SIGINT):
158
+ try:
159
+ loop.remove_signal_handler(sig)
160
+ except (NotImplementedError, OSError):
161
+ pass
162
+
163
+ # Step 5: 启动 FastAPI 服务器
164
+ print(f"\n[Server] Starting server...")
165
+
166
+ # 获取一个可用端口
167
+ import socket
168
+ sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
169
+ sock.bind(('', 0))
170
+ actual_port = sock.getsockname()[1]
171
+ sock.close()
172
+
173
+ # 显示服务器信息
174
+ print(f"\n[Server] Server will start on port {actual_port}")
175
+ print(f"[Server] ANTHROPIC_BASE_URL = http://127.0.0.1:{actual_port}/claude-proxy")
176
+ print(f"[Server] OPENAI_BASE_URL = http://127.0.0.1:{actual_port}/openclaw-proxy/v1")
177
+ print(f"[Server] Health check = http://127.0.0.1:{actual_port}/health")
178
+ if evol_api_key:
179
+ print(f"[Server] Evol API Key = {evol_api_key}")
180
+ else:
181
+ print(f"[Server] Evol API Key = (未获取到,请在 Evol 平台创建密钥)")
182
+ print(f"\nPress Ctrl+C to stop.\n")
183
+
184
+ # 启动服务器(阻塞)
185
+ from server import run_server
186
+ await run_server(port=actual_port)
187
+
188
+
189
+ def _graceful_shutdown():
190
+ """执行优雅关闭:下线 AgentID、清理 AgentCP 资源"""
191
+ try:
192
+ from evol.presenter.userPresenter import userPresenter
193
+ # 下线 AgentID
194
+ if userPresenter.agentId is not None:
195
+ aid_id = userPresenter.agentId.id
196
+ try:
197
+ userPresenter.agentId.offline()
198
+ print(f"[Shutdown] AgentID {aid_id} 已下线")
199
+ except Exception as e:
200
+ print(f"[Shutdown] AgentID 下线失败: {e}")
201
+ userPresenter.agentId = None
202
+ # 清理 AgentCP 实例
203
+ acp = userPresenter._agentcp_instance
204
+ if acp is not None:
205
+ try:
206
+ acp.shutdown_flag.set()
207
+ for aid in acp.aid_map.values():
208
+ if hasattr(aid, "offline"):
209
+ aid.offline()
210
+ print("[Shutdown] AgentCP 资源已清理")
211
+ except Exception as e:
212
+ print(f"[Shutdown] AgentCP 清理失败: {e}")
213
+ except Exception as e:
214
+ print(f"[Shutdown] 清理过程异常: {e}")
215
+
216
+
217
+ def main():
218
+ """入口函数"""
219
+ import signal
220
+ # 忽略 SIGTERM,防止父进程或系统管理器发送终止信号导致服务器退出
221
+ signal.signal(signal.SIGTERM, signal.SIG_IGN)
222
+ # Windows 上忽略 SIGBREAK(Ctrl+Break)
223
+ if hasattr(signal, 'SIGBREAK'):
224
+ signal.signal(signal.SIGBREAK, signal.SIG_IGN)
225
+ try:
226
+ asyncio.run(async_main())
227
+ except KeyboardInterrupt:
228
+ print("\n\nShutting down...")
229
+ _graceful_shutdown()
230
+ sys.exit(0)
231
+ except SystemExit:
232
+ raise
233
+ except Exception as e:
234
+ logger.error(f"Fatal error: {e}", exc_info=True)
235
+ _graceful_shutdown()
236
+ sys.exit(1)
237
+
238
+
239
+ if __name__ == "__main__":
240
+ main()
@@ -0,0 +1,13 @@
1
+ # Evol Sample Backend - Minimal Dependencies
2
+
3
+ # HTTP/Network
4
+ httpx~=0.28.0
5
+ aiohttp~=3.11.0
6
+ certifi>=2023.7.22
7
+
8
+ # Web Framework
9
+ fastapi>=0.115.0
10
+ uvicorn[standard]>=0.32.0
11
+
12
+ # AgentCP
13
+ agentcp~=0.1.99