@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,263 @@
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 io
16
+ from typing import Tuple
17
+
18
+
19
+ def uint64_to_varint(v: int) -> bytes:
20
+ buf = b''
21
+ while v >= 0x80:
22
+ buf += bytes([v & 0x7F | 0x80])
23
+ v >>= 7
24
+ buf += bytes([v])
25
+ return buf
26
+
27
+ def varint_to_uint64(buf: bytes) -> Tuple[int, int]:
28
+ v = 0
29
+ shift = 0
30
+ for i, b in enumerate(buf):
31
+ v |= (b & 0x7F) << shift
32
+ shift += 7
33
+ if not (b & 0x80):
34
+ return v, i + 1
35
+ raise ValueError("Invalid varint")
36
+
37
+ class UdpMessageHeader:
38
+ def __init__(self):
39
+ self.MessageMask: int = 0
40
+ self.MessageSeq: int = 0
41
+ self.MessageType: int = 0
42
+ self.PayloadSize: int = 0
43
+
44
+ def serialize(self, buf: io.BytesIO) -> None:
45
+ buf.write(uint64_to_varint(self.MessageMask))
46
+ buf.write(uint64_to_varint(self.MessageSeq))
47
+ buf.write(self.MessageType.to_bytes(2, 'big'))
48
+ buf.write(self.PayloadSize.to_bytes(2, 'big'))
49
+
50
+ @classmethod
51
+ def deserialize(cls, buf: bytes, offset: int) -> Tuple['UdpMessageHeader', int]:
52
+ obj = cls()
53
+ obj.MessageMask, read = varint_to_uint64(buf[offset:])
54
+ offset += read
55
+ obj.MessageSeq, read = varint_to_uint64(buf[offset:])
56
+ offset += read
57
+ obj.MessageType = int.from_bytes(buf[offset:offset+2], 'big')
58
+ offset += 2
59
+ obj.PayloadSize = int.from_bytes(buf[offset:offset+2], 'big')
60
+ offset += 2
61
+ return obj, offset
62
+
63
+ # ================== HeartbeatMessageReq ==================
64
+ class HeartbeatMessageReq:
65
+ def __init__(self):
66
+ self.header = UdpMessageHeader()
67
+ self.AgentId: str = ""
68
+ self.SignCookie: int = 0
69
+
70
+ def serialize(self, buf: io.BytesIO) -> None:
71
+ self.header.serialize(buf)
72
+ agent_id_bytes = self.AgentId.encode('utf-8')
73
+ buf.write(uint64_to_varint(len(agent_id_bytes)))
74
+ buf.write(agent_id_bytes)
75
+ buf.write(self.SignCookie.to_bytes(8, 'big'))
76
+
77
+ @classmethod
78
+ def deserialize(cls, buf: bytes, offset: int) -> Tuple['HeartbeatMessageReq', int]:
79
+ obj = cls()
80
+ obj.header, offset = UdpMessageHeader.deserialize(buf, offset)
81
+ len_agent_id, read = varint_to_uint64(buf[offset:])
82
+ offset += read
83
+ obj.AgentId = buf[offset:offset+int(len_agent_id)].decode('utf-8')
84
+ offset += int(len_agent_id)
85
+ obj.SignCookie = int.from_bytes(buf[offset:offset+8], 'big')
86
+ offset += 8
87
+ return obj, offset
88
+
89
+ # ================== HeartbeatMessageResp ==================
90
+ class HeartbeatMessageResp:
91
+ def __init__(self):
92
+ self.header = UdpMessageHeader()
93
+ self.NextBeat: int = 0
94
+
95
+ def serialize(self, buf: io.BytesIO) -> None:
96
+ self.header.serialize(buf)
97
+ buf.write(self.NextBeat.to_bytes(8, 'big'))
98
+
99
+ @classmethod
100
+ def deserialize(cls, buf: bytes, offset: int) -> Tuple['HeartbeatMessageResp', int]:
101
+ obj = cls()
102
+ obj.header, offset = UdpMessageHeader.deserialize(buf, offset)
103
+ obj.NextBeat = int.from_bytes(buf[offset:offset+8], 'big')
104
+ offset += 8
105
+ return obj, offset
106
+
107
+ # ================== InviteMessageReq ==================
108
+ class InviteMessageReq:
109
+ def __init__(self):
110
+ self.header = UdpMessageHeader()
111
+ self.InviterAgentId: str = ""
112
+ self.InviteCode: str = ""
113
+ self.InviteCodeExpire: int = 0
114
+ self.SessionId: str = ""
115
+ self.MessageServer: str = ""
116
+
117
+ def serialize(self, buf: io.BytesIO) -> None:
118
+ self.header.serialize(buf)
119
+ # 序列化 InviterAgentId
120
+ inviter_bytes = self.InviterAgentId.encode('utf-8')
121
+ buf.write(uint64_to_varint(len(inviter_bytes)))
122
+ buf.write(inviter_bytes)
123
+ # 序列化 InviteCode
124
+ invite_code_bytes = self.InviteCode.encode('utf-8')
125
+ buf.write(uint64_to_varint(len(invite_code_bytes)))
126
+ buf.write(invite_code_bytes)
127
+ # 序列化 InviteCodeExpire(int64 转换为 uint64 处理)
128
+ buf.write(uint64_to_varint(abs(self.InviteCodeExpire)) if self.InviteCodeExpire < 0 else self.InviteCodeExpire.to_bytes(8, 'big'))
129
+ # 更准确的处理:直接按 int64 字节处理
130
+ buf.write(self.InviteCodeExpire.to_bytes(8, 'big', signed=True))
131
+ # 序列化 SessionId
132
+ session_id_bytes = self.SessionId.encode('utf-8')
133
+ buf.write(uint64_to_varint(len(session_id_bytes)))
134
+ buf.write(session_id_bytes)
135
+ # 序列化MessageServer
136
+ message_server_bytes = self.MessageServer.encode("utf-8")
137
+ buf.write(uint64_to_varint(len(message_server_bytes)))
138
+ buf.write(message_server_bytes)
139
+
140
+ @classmethod
141
+ def deserialize(cls, buf: bytes, offset: int) -> Tuple['InviteMessageReq', int]:
142
+ obj = cls()
143
+ obj.header, offset = UdpMessageHeader.deserialize(buf, offset)
144
+ # 反序列化 InviterAgentId
145
+ len_inviter, read = varint_to_uint64(buf[offset:])
146
+ offset += read
147
+ obj.InviterAgentId = buf[offset:offset+int(len_inviter)].decode('utf-8')
148
+ offset += int(len_inviter)
149
+ # 反序列化 InviteCode
150
+ len_invite_code, read = varint_to_uint64(buf[offset:])
151
+ offset += read
152
+ obj.InviteCode = buf[offset:offset+int(len_invite_code)].decode('utf-8')
153
+ offset += int(len_invite_code)
154
+ # 反序列化 InviteCodeExpire
155
+ obj.InviteCodeExpire = int.from_bytes(buf[offset:offset+8], 'big', signed=True)
156
+ offset += 8
157
+ # 反序列化 SessionId
158
+ len_session_id, read = varint_to_uint64(buf[offset:])
159
+ offset += read
160
+ obj.SessionId = buf[offset:offset+int(len_session_id)].decode('utf-8')
161
+ offset += int(len_session_id)
162
+ # 反序列化MessageServer
163
+ len_message_server, read = varint_to_uint64(buf[offset:])
164
+ offset += read
165
+ obj.MessageServer = buf[offset:offset+int(len_message_server)].decode('utf-8')
166
+ offset += int(len_message_server)
167
+ return obj, offset
168
+
169
+ # ================== InviteMessageResp ==================
170
+ class InviteMessageResp:
171
+ def __init__(self):
172
+ self.header = UdpMessageHeader()
173
+ self.AgentId: str = ""
174
+ self.SignCookie: int = 0
175
+ self.InviterAgentId: str = ""
176
+ self.SessionId: str = ""
177
+
178
+ def serialize(self, buf: io.BytesIO) -> None:
179
+ self.header.serialize(buf)
180
+ agent_id_bytes = self.AgentId.encode('utf-8')
181
+ buf.write(uint64_to_varint(len(agent_id_bytes)))
182
+ buf.write(agent_id_bytes)
183
+ inviter_agent_id_bytes = self.InviterAgentId.encode('utf-8')
184
+ buf.write(uint64_to_varint(len(inviter_agent_id_bytes)))
185
+ buf.write(inviter_agent_id_bytes)
186
+ session_id_bytes = self.SessionId.encode('utf-8')
187
+ buf.write(uint64_to_varint(len(session_id_bytes)))
188
+ buf.write(session_id_bytes)
189
+ buf.write(self.SignCookie.to_bytes(8, 'big'))
190
+
191
+ @classmethod
192
+ def deserialize(cls, buf: bytes, offset: int) -> Tuple['InviteMessageResp', int]:
193
+ obj = cls()
194
+ obj.header, offset = UdpMessageHeader.deserialize(buf, offset)
195
+ len_agent_id, read = varint_to_uint64(buf[offset:])
196
+ offset += read
197
+ obj.AgentId = buf[offset:offset+int(len_agent_id)].decode('utf-8')
198
+ offset += int(len_agent_id)
199
+ len_inviter_agent_id, read = varint_to_uint64(buf[offset:])
200
+ offset += read
201
+ obj.InviterAgentId = buf[offset:offset+int(len_inviter_agent_id)].decode('utf-8')
202
+ offset += int(len_inviter_agent_id)
203
+ len_session_id, read = varint_to_uint64(buf[offset:])
204
+ offset += read
205
+ obj.SessionId = buf[offset:offset+int(len_session_id)].decode('utf-8')
206
+ offset += int(len_session_id)
207
+ obj.SignCookie = int.from_bytes(buf[offset:offset+8], 'big')
208
+ offset += 8
209
+ return obj, offset
210
+
211
+ if __name__ == "__main__":
212
+ # 测试 HeartbeatMessageReq
213
+ req = HeartbeatMessageReq()
214
+ req.header.MessageMask = 1
215
+ req.header.MessageSeq = 2
216
+ req.header.MessageType = 3
217
+ req.header.PayloadSize = 100
218
+ req.AgentId = "agent-1"
219
+ req.SignCookie = 12345
220
+ buf = io.BytesIO()
221
+ req.serialize(buf)
222
+ data = buf.getvalue()
223
+ deser_req, _ = HeartbeatMessageReq.deserialize(data, 0)
224
+
225
+ # 测试 HeartbeatMessageResp
226
+ resp = HeartbeatMessageResp()
227
+ resp.header.MessageMask = 4
228
+ resp.header.MessageSeq = 5
229
+ resp.header.MessageType = 4
230
+ resp.header.PayloadSize = 8
231
+ resp.NextBeat = 60000
232
+ buf = io.BytesIO()
233
+ resp.serialize(buf)
234
+ data = buf.getvalue()
235
+ deser_resp, _ = HeartbeatMessageResp.deserialize(data, 0)
236
+
237
+ # 测试 InviteMessageReq
238
+ invite_req = InviteMessageReq()
239
+ invite_req.header.MessageMask = 6
240
+ invite_req.header.MessageSeq = 7
241
+ invite_req.header.MessageType = 5
242
+ invite_req.header.PayloadSize = 200
243
+ invite_req.InviterAgentId = "inviter-1"
244
+ invite_req.InviteCode = "CODE123"
245
+ invite_req.InviteCodeExpire = 1680000000
246
+ invite_req.SessionId = "session-1"
247
+ buf = io.BytesIO()
248
+ invite_req.serialize(buf)
249
+ data = buf.getvalue()
250
+ deser_invite_req, _ = InviteMessageReq.deserialize(data, 0)
251
+
252
+ # 测试 InviteMessageResp
253
+ invite_resp = InviteMessageResp()
254
+ invite_resp.header.MessageMask = 8
255
+ invite_resp.header.MessageSeq = 9
256
+ invite_resp.header.MessageType = 6
257
+ invite_resp.header.PayloadSize = 150
258
+ invite_resp.AgentId = "resp-agent"
259
+ invite_resp.SignCookie = 98765
260
+ buf = io.BytesIO()
261
+ invite_resp.serialize(buf)
262
+ data = buf.getvalue()
263
+ deser_invite_resp, _ = InviteMessageResp.deserialize(data, 0)
@@ -0,0 +1,88 @@
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 json
16
+ from typing import Dict, List, Union, Iterable, Optional
17
+ from openai._types import NOT_GIVEN, Body, Query, Headers, NotGiven
18
+ from openai.types.shared.chat_model import ChatModel
19
+ from openai.types.chat.chat_completion import ChatCompletion
20
+ from openai.types.shared_params.metadata import Metadata
21
+ from openai.types.shared.reasoning_effort import ReasoningEffort
22
+ from openai.types.chat.chat_completion_chunk import ChatCompletionChunk
23
+ from openai.types.chat.chat_completion_deleted import ChatCompletionDeleted
24
+ from openai.types.chat.chat_completion_tool_param import ChatCompletionToolParam
25
+ from openai.types.chat.chat_completion_audio_param import ChatCompletionAudioParam
26
+ from openai.types.chat.chat_completion_message_param import ChatCompletionMessageParam
27
+ from openai.types.chat.chat_completion_stream_options_param import ChatCompletionStreamOptionsParam
28
+ from openai.types.chat.chat_completion_prediction_content_param import ChatCompletionPredictionContentParam
29
+ from openai.types.chat.chat_completion_tool_choice_option_param import ChatCompletionToolChoiceOptionParam
30
+ from openai.types.chat import (
31
+ ChatCompletionAudioParam,
32
+ completion_list_params,
33
+ completion_create_params,
34
+ completion_update_params,
35
+ )
36
+ from typing_extensions import Literal, overload
37
+
38
+ class OpenAIMessage:
39
+ def __init__(self):
40
+ self.messages : Iterable[ChatCompletionMessageParam] = None
41
+ self.model: Union[str, ChatModel] = None
42
+ self.audio: Optional[ChatCompletionAudioParam] = None
43
+ self.frequency_penalty: Optional[float] = None
44
+ self.function_call: completion_create_params.FunctionCall = None
45
+ self.functions: Iterable[completion_create_params.Function] = None
46
+ self.logit_bias: Optional[Dict[str, int]] = None
47
+ self.logprobs: Optional[bool] = None
48
+ self.max_completion_tokens: Optional[int] = None
49
+ self.max_tokens: Optional[int] = None
50
+ self.metadata: Optional[Metadata] = None
51
+ self.modalities: Optional[List[Literal["text", "audio"]]] = None
52
+ self.n: Optional[int] = None
53
+ self.parallel_tool_calls = None
54
+ self.prediction: Optional[ChatCompletionPredictionContentParam] = None
55
+ self.presence_penalty: Optional[float] = None
56
+ self.reasoning_effort: Optional[ReasoningEffort] = None
57
+ self.response_format: completion_create_params.ResponseFormat = None
58
+ self.seed: Optional[int] = None
59
+ self.service_tier: Optional[Literal["auto", "default"]] = None
60
+ self.stop: Union[Optional[str], List[str], None] = None
61
+ self.store: Optional[bool] = None
62
+ self.stream: Optional[Literal[False]] = None
63
+ self.stream_options: Optional[ChatCompletionStreamOptionsParam] = None
64
+ self.temperature: Optional[float] = None
65
+ self.tool_choice: ChatCompletionToolChoiceOptionParam = None
66
+ self.tools: Iterable[ChatCompletionToolParam] = None
67
+ self.top_logprobs: Optional[int] = None
68
+ self.top_p: Optional[float] = None
69
+ self.user: str = None
70
+ self.web_search_options: completion_create_params.WebSearchOptions = None
71
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
72
+ # The extra values given here take precedence over values defined on the client or passed to this method.
73
+ self.extra_headers: Headers = None
74
+ self.extra_query: Query = None
75
+ self.extra_body: Body = None
76
+ self.timeout: float = 600 # 10分钟超时
77
+
78
+ def to_json(self) -> str:
79
+ """将对象序列化为JSON字符串,自动跳过None值"""
80
+ data = {
81
+ key: value
82
+ for key, value in self.__dict__.items()
83
+ if value is not None and not key.startswith('_')
84
+ }
85
+ return json.dumps(data,
86
+ default=lambda o: o.__dict__,
87
+ ensure_ascii=False,
88
+ separators=(',', ':'))