@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.
- package/CHANGELOG.md +102 -0
- package/cli.js +44 -5
- package/core/dependency_checker.py +250 -0
- package/core/env_checker.py +490 -0
- package/dependencies_lock.json +128 -0
- package/extensions/agents/assistant/server.py +33 -17
- package/extensions/channels/acp_channel/server.py +33 -17
- package/extensions/services/backup/entry.py +23 -16
- package/extensions/services/evol/auth_manager.py +443 -0
- package/extensions/services/evol/config.yaml +149 -0
- package/extensions/services/evol/config_loader.py +117 -0
- package/extensions/services/evol/entry.py +406 -0
- package/extensions/services/evol/evol_api.py +173 -0
- package/extensions/services/evol/evol_config.json5 +29 -0
- package/extensions/services/evol/migrate_tokens.py +122 -0
- package/extensions/services/evol/module.md +32 -0
- package/extensions/services/evol/pairing.py +250 -0
- package/extensions/services/evol/pairing_codes.jsonl +1 -0
- package/extensions/services/evol/relay.py +682 -0
- package/extensions/services/evol/relay_config.json5 +67 -0
- package/extensions/services/evol/routes/__init__.py +1 -0
- package/extensions/services/evol/routes/routes_management_ws.py +127 -0
- package/extensions/services/evol/routes/routes_rpc.py +89 -0
- package/extensions/services/evol/routes/routes_test.py +61 -0
- package/extensions/services/evol/server.py +875 -0
- package/extensions/services/evol/static/css/style.css +1200 -0
- package/extensions/services/evol/static/index.html +781 -0
- package/extensions/services/evol/static/index_evol.html +14 -0
- package/extensions/services/evol/static/js/app.js +6304 -0
- package/extensions/services/evol/static/js/auth.js +326 -0
- package/extensions/services/evol/static/js/dialog.js +285 -0
- package/extensions/services/evol/static/js/evol-app-fixed.js +50 -0
- package/extensions/services/evol/static/js/evol-app.js +1949 -0
- package/extensions/services/evol/static/js/evol-app.js.bak +1800 -0
- package/extensions/services/evol/static/js/kernel-client-example.js +228 -0
- package/extensions/services/evol/static/js/kernel-client.js +396 -0
- package/extensions/services/evol/static/js/main.js +141 -0
- package/extensions/services/evol/static/js/registry-tests.js +585 -0
- package/extensions/services/evol/static/js/stats.js +217 -0
- package/extensions/services/evol/static/js/token-manager.js +175 -0
- package/extensions/services/evol/static/pairing.html +248 -0
- package/extensions/services/evol/static/test_registry.html +262 -0
- package/extensions/services/evol/static/test_relay.html +462 -0
- package/extensions/services/evol/stats_manager.py +240 -0
- package/extensions/services/model_service/entry.py +23 -1
- package/extensions/services/proxy/.claude/settings.local.json +13 -0
- package/extensions/services/proxy/CHANGELOG_20260308.md +258 -0
- package/extensions/services/proxy/_fix_prints.py +133 -0
- package/extensions/services/proxy/_fix_prints2.py +87 -0
- package/extensions/services/proxy/agentcp/LICENCE +178 -0
- package/extensions/services/proxy/agentcp/README copy.md +85 -0
- package/extensions/services/proxy/agentcp/README.md +260 -0
- package/extensions/services/proxy/agentcp/__init__.py +16 -0
- package/extensions/services/proxy/agentcp/agent.py +4 -0
- package/extensions/services/proxy/agentcp/agentcp.py +2494 -0
- package/extensions/services/proxy/agentcp/agentprofile.json +89 -0
- package/extensions/services/proxy/agentcp/ap/__init__.py +16 -0
- package/extensions/services/proxy/agentcp/ap/ap_client.py +316 -0
- package/extensions/services/proxy/agentcp/assets/images/wechat_qr.png +0 -0
- package/extensions/services/proxy/agentcp/backup/metrics.json +31 -0
- package/extensions/services/proxy/agentcp/base/__init__.py +20 -0
- package/extensions/services/proxy/agentcp/base/auth_client.py +257 -0
- package/extensions/services/proxy/agentcp/base/client.py +112 -0
- package/extensions/services/proxy/agentcp/base/env.py +34 -0
- package/extensions/services/proxy/agentcp/base/html_util.py +336 -0
- package/extensions/services/proxy/agentcp/base/log.py +98 -0
- package/extensions/services/proxy/agentcp/ca/__init__.py +17 -0
- package/extensions/services/proxy/agentcp/ca/ca_client.py +414 -0
- package/extensions/services/proxy/agentcp/ca/ca_root.py +74 -0
- package/extensions/services/proxy/agentcp/context/__init__.py +20 -0
- package/extensions/services/proxy/agentcp/context/context.py +73 -0
- package/extensions/services/proxy/agentcp/context/exceptions.py +114 -0
- package/extensions/services/proxy/agentcp/create_profile.py +125 -0
- package/extensions/services/proxy/agentcp/create_profile_weather.py +125 -0
- package/extensions/services/proxy/agentcp/db/__init__.py +15 -0
- package/extensions/services/proxy/agentcp/db/db_mananger.py +550 -0
- package/extensions/services/proxy/agentcp/docs/UDP_HEARTBEAT_FIX_REPORT.md +265 -0
- package/extensions/services/proxy/agentcp/docs/heartbeat_issue_analysis.md +291 -0
- package/extensions/services/proxy/agentcp/file/__init__.py +16 -0
- package/extensions/services/proxy/agentcp/file/file_client.py +141 -0
- package/extensions/services/proxy/agentcp/file/wss_binary_message.py +137 -0
- package/extensions/services/proxy/agentcp/hcp.py +299 -0
- package/extensions/services/proxy/agentcp/heartbeat/__init__.py +16 -0
- package/extensions/services/proxy/agentcp/heartbeat/heartbeat_client.py +360 -0
- package/extensions/services/proxy/agentcp/improved_scheduler.py +498 -0
- package/extensions/services/proxy/agentcp/llm_agent_utils.py +249 -0
- package/extensions/services/proxy/agentcp/llm_server.py +172 -0
- package/extensions/services/proxy/agentcp/mermaid.py +210 -0
- package/extensions/services/proxy/agentcp/message.py +149 -0
- package/extensions/services/proxy/agentcp/metrics.py +256 -0
- package/extensions/services/proxy/agentcp/monitoring/__init__.py +20 -0
- package/extensions/services/proxy/agentcp/monitoring/global_monitor.py +27 -0
- package/extensions/services/proxy/agentcp/monitoring/metrics_store.py +325 -0
- package/extensions/services/proxy/agentcp/monitoring/monitoring_service.py +269 -0
- package/extensions/services/proxy/agentcp/monitoring/sliding_window.py +222 -0
- package/extensions/services/proxy/agentcp/monitoring/standalone_reader.py +224 -0
- package/extensions/services/proxy/agentcp/msg/__init__.py +21 -0
- package/extensions/services/proxy/agentcp/msg/connection_manager.py +456 -0
- package/extensions/services/proxy/agentcp/msg/message_client.py +2058 -0
- package/extensions/services/proxy/agentcp/msg/message_serialize.py +263 -0
- package/extensions/services/proxy/agentcp/msg/open_ai_message.py +88 -0
- package/extensions/services/proxy/agentcp/msg/session_manager.py +1062 -0
- package/extensions/services/proxy/agentcp/msg/stream_client.py +267 -0
- package/extensions/services/proxy/agentcp/msg/websocket_file_receiver.py +89 -0
- package/extensions/services/proxy/agentcp/msg/ws_logger.py +685 -0
- package/extensions/services/proxy/agentcp/msg/wss_binary_message.py +137 -0
- package/extensions/services/proxy/agentcp/requirements.txt +7 -0
- package/extensions/services/proxy/agentcp/samples/agent_graph/README.md +37 -0
- package/extensions/services/proxy/agentcp/samples/agent_graph/agentprofile.json +89 -0
- package/extensions/services/proxy/agentcp/samples/agent_graph/create_profile.py +138 -0
- package/extensions/services/proxy/agentcp/samples/agent_graph/main.py +164 -0
- package/extensions/services/proxy/agentcp/samples/agent_use/create_profile.py +123 -0
- package/extensions/services/proxy/agentcp/samples/agent_use/llm/create_profile.py +129 -0
- package/extensions/services/proxy/agentcp/samples/agent_use/llm/env.json +5 -0
- package/extensions/services/proxy/agentcp/samples/agent_use/llm/main.py +146 -0
- package/extensions/services/proxy/agentcp/samples/agent_use/main.py +123 -0
- package/extensions/services/proxy/agentcp/samples/agent_use/readme.md +379 -0
- package/extensions/services/proxy/agentcp/samples/agent_use/search/create_profile.py +129 -0
- package/extensions/services/proxy/agentcp/samples/agent_use/search/main.py +28 -0
- package/extensions/services/proxy/agentcp/samples/agent_use/tool/create_profile.py +129 -0
- package/extensions/services/proxy/agentcp/samples/agent_use/tool/main.py +20 -0
- package/extensions/services/proxy/agentcp/samples/ali_amap/README.md +97 -0
- package/extensions/services/proxy/agentcp/samples/ali_amap/amap_agent.py +88 -0
- package/extensions/services/proxy/agentcp/samples/ali_amap/create_profile.py +125 -0
- package/extensions/services/proxy/agentcp/samples/compute_agent/agent/powershell.py +228 -0
- package/extensions/services/proxy/agentcp/samples/compute_agent/agent/software.py +63 -0
- package/extensions/services/proxy/agentcp/samples/compute_agent/agent/tools.py +36 -0
- package/extensions/services/proxy/agentcp/samples/compute_agent/browser_user.py +41 -0
- package/extensions/services/proxy/agentcp/samples/deepseek/README.md +79 -0
- package/extensions/services/proxy/agentcp/samples/deepseek/create_profile.py +126 -0
- package/extensions/services/proxy/agentcp/samples/deepseek/deepseek.py +42 -0
- package/extensions/services/proxy/agentcp/samples/dify_chat/README.md +78 -0
- package/extensions/services/proxy/agentcp/samples/dify_chat/create_profile.py +126 -0
- package/extensions/services/proxy/agentcp/samples/dify_chat/dify_chat.py +47 -0
- package/extensions/services/proxy/agentcp/samples/dify_workflow/README.md +78 -0
- package/extensions/services/proxy/agentcp/samples/dify_workflow/create_profile.py +126 -0
- package/extensions/services/proxy/agentcp/samples/dify_workflow/dify_workflow.py +46 -0
- package/extensions/services/proxy/agentcp/samples/executor/README.md +44 -0
- package/extensions/services/proxy/agentcp/samples/executor/agentprofile.json +89 -0
- package/extensions/services/proxy/agentcp/samples/executor/create_profile.py +139 -0
- package/extensions/services/proxy/agentcp/samples/executor/main.py +160 -0
- package/extensions/services/proxy/agentcp/samples/filereader/README.md +45 -0
- package/extensions/services/proxy/agentcp/samples/filereader/agentprofile.json +90 -0
- package/extensions/services/proxy/agentcp/samples/filereader/create_profile.py +137 -0
- package/extensions/services/proxy/agentcp/samples/filereader/main.py +253 -0
- package/extensions/services/proxy/agentcp/samples/filewriter/README.md +38 -0
- package/extensions/services/proxy/agentcp/samples/filewriter/agentprofile.json +91 -0
- package/extensions/services/proxy/agentcp/samples/filewriter/create_profile.py +138 -0
- package/extensions/services/proxy/agentcp/samples/filewriter/main.py +289 -0
- package/extensions/services/proxy/agentcp/samples/hcp/README.md +85 -0
- package/extensions/services/proxy/agentcp/samples/hcp/acp_weather_agent.zip +0 -0
- package/extensions/services/proxy/agentcp/samples/hcp/create_profile.py +125 -0
- package/extensions/services/proxy/agentcp/samples/hcp/hcp.py +237 -0
- package/extensions/services/proxy/agentcp/samples/helloworld/README.md +68 -0
- package/extensions/services/proxy/agentcp/samples/helloworld/hello_world.py +40 -0
- package/extensions/services/proxy/agentcp/samples/llm_agent/MEADME.md +117 -0
- package/extensions/services/proxy/agentcp/samples/llm_agent/create_profile.py +125 -0
- package/extensions/services/proxy/agentcp/samples/llm_agent/qwen_agent.py +136 -0
- package/extensions/services/proxy/agentcp/samples/local_llm_agent/README.md +90 -0
- package/extensions/services/proxy/agentcp/samples/local_llm_agent/create_profile.py +125 -0
- package/extensions/services/proxy/agentcp/samples/local_llm_agent/main.py +49 -0
- package/extensions/services/proxy/agentcp/samples/query_llm_from_agent/README.md +55 -0
- package/extensions/services/proxy/agentcp/samples/query_llm_from_agent/create_profile.py +125 -0
- package/extensions/services/proxy/agentcp/samples/query_llm_from_agent/main.py +23 -0
- package/extensions/services/proxy/agentcp/samples/query_weather_api_agent/README.md +103 -0
- package/extensions/services/proxy/agentcp/samples/query_weather_api_agent/create_profile.py +125 -0
- package/extensions/services/proxy/agentcp/samples/query_weather_api_agent/main.py +69 -0
- package/extensions/services/proxy/agentcp/samples/query_weather_from_agent/README.md +58 -0
- package/extensions/services/proxy/agentcp/samples/query_weather_from_agent/create_profile.py +125 -0
- package/extensions/services/proxy/agentcp/samples/query_weather_from_agent/main.py +25 -0
- package/extensions/services/proxy/agentcp/samples/qwen3/README.md +71 -0
- package/extensions/services/proxy/agentcp/samples/qwen3/create_profile.py +126 -0
- package/extensions/services/proxy/agentcp/samples/qwen3/qwen3.py +37 -0
- package/extensions/services/proxy/agentcp/samples/qwen3_tools/README.md +133 -0
- package/extensions/services/proxy/agentcp/samples/qwen3_tools/create_profile.py +126 -0
- package/extensions/services/proxy/agentcp/samples/qwen3_tools/qwen3_tools.py +98 -0
- package/extensions/services/proxy/agentcp/samples/search/create_profile_qwen.py +125 -0
- package/extensions/services/proxy/agentcp/samples/search/create_profile_search.py +125 -0
- package/extensions/services/proxy/agentcp/samples/search/qwen_agent.py +136 -0
- package/extensions/services/proxy/agentcp/samples/search/search_agent.py +170 -0
- package/extensions/services/proxy/agentcp/samples/wrapper_agently_to_agent/README.md +89 -0
- package/extensions/services/proxy/agentcp/samples/wrapper_agently_to_agent/create_profile.py +125 -0
- package/extensions/services/proxy/agentcp/samples/wrapper_agently_to_agent/main.py +44 -0
- package/extensions/services/proxy/agentcp/utils/__init__.py +15 -0
- package/extensions/services/proxy/agentcp/utils/file_util.py +117 -0
- package/extensions/services/proxy/agentcp/utils/proxy_bypass.py +99 -0
- package/extensions/services/proxy/agentcp/workflow.py +203 -0
- package/extensions/services/proxy/console_auth.py +109 -0
- package/extensions/services/proxy/evol/__init__.py +1 -0
- package/extensions/services/proxy/evol/config.py +37 -0
- package/extensions/services/proxy/evol/http/__init__.py +1 -0
- package/extensions/services/proxy/evol/http/async_http.py +551 -0
- package/extensions/services/proxy/evol/log.py +28 -0
- package/extensions/services/proxy/evol/presenter/__init__.py +2 -0
- package/extensions/services/proxy/evol/presenter/agentIdPresenter.py +1031 -0
- package/extensions/services/proxy/evol/presenter/apikeyPresenter.py +106 -0
- package/extensions/services/proxy/evol/presenter/configPresenter.py +1281 -0
- package/extensions/services/proxy/evol/presenter/userPresenter.py +477 -0
- package/extensions/services/proxy/evol/server/__init__.py +1 -0
- package/extensions/services/proxy/evol/server/claude_proxy_async.py +3430 -0
- package/extensions/services/proxy/evol/server/openclaw_proxy.py +1861 -0
- package/extensions/services/proxy/evol/server/proxy_config.py +15 -0
- package/extensions/services/proxy/evol/server/proxy_engine.py +501 -0
- package/extensions/services/proxy/evol/version.py +24 -0
- package/extensions/services/proxy/logs/websocket.log +260 -0
- package/extensions/services/proxy/main.py +240 -0
- package/extensions/services/proxy/requirements.txt +13 -0
- package/extensions/services/proxy/server.py +271 -0
- package/extensions/services/watchdog/entry.py +42 -16
- package/extensions/services/watchdog/module.md +1 -0
- package/extensions/services/watchdog/monitor.py +34 -4
- package/extensions/services/web/module.md +1 -1
- package/extensions/services/web/server.py +30 -18
- package/extensions/services/web/static/js/token-manager.js +10 -10
- package/kernel/entry.py +1 -1
- package/kernel/module.md +25 -1
- package/kernel/registry_store.py +2 -26
- package/kernel/rpc_router.py +36 -10
- package/kernel/server.py +106 -17
- package/kite_cli/commands/deps_install.py +67 -0
- package/kite_cli/commands/env_check.py +45 -0
- package/kite_cli/commands/prepare.py +49 -0
- package/kite_cli/commands/venv_setup.py +56 -0
- package/kite_cli/main.py +29 -1
- package/launcher/entry.py +306 -21
- package/launcher/module.md +9 -0
- package/launcher/module_scanner.py +11 -1
- package/main.py +4 -1
- package/package.json +8 -1
- package/python_version.json +4 -0
- package/requirements.txt +38 -0
- package/scripts/env-manager.js +328 -0
- package/scripts/python-env.js +79 -0
- package/scripts/scan_dependencies.py +461 -0
- package/scripts/setup-python-env.js +191 -0
|
@@ -0,0 +1,137 @@
|
|
|
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 struct
|
|
16
|
+
import zlib
|
|
17
|
+
import json
|
|
18
|
+
from dataclasses import dataclass
|
|
19
|
+
|
|
20
|
+
@dataclass
|
|
21
|
+
class WssBinaryMessage:
|
|
22
|
+
"""
|
|
23
|
+
用于存储 WSS 二进制消息中从 magic_byte1 到 payload 的各个字段的数据类。
|
|
24
|
+
"""
|
|
25
|
+
magic_byte1: int = 77 # ord('M')
|
|
26
|
+
magic_byte2: int = 85 # ord('U')
|
|
27
|
+
version: int = 0x101
|
|
28
|
+
flags: int = 0
|
|
29
|
+
msg_type: int = 1
|
|
30
|
+
msg_seq: int = 0
|
|
31
|
+
content_type: int = 1
|
|
32
|
+
compressed: int = 0
|
|
33
|
+
reserved: int = 0
|
|
34
|
+
crc32: int = 0
|
|
35
|
+
payload_length: int = 0
|
|
36
|
+
payload: bytes = b''
|
|
37
|
+
|
|
38
|
+
def encode_wss_binary_message(json_data):
|
|
39
|
+
magic_byte1 = ord('M')
|
|
40
|
+
magic_byte2 = ord('U')
|
|
41
|
+
version = 0x101
|
|
42
|
+
flags = 0
|
|
43
|
+
msg_type = 1
|
|
44
|
+
# 假设 msg_seq 初始为 0,可根据实际情况调整
|
|
45
|
+
msg_seq = 0
|
|
46
|
+
payload = json_data.encode()
|
|
47
|
+
if len(payload) < 512:
|
|
48
|
+
content_type = 1
|
|
49
|
+
compressed = 0
|
|
50
|
+
else:
|
|
51
|
+
content_type = 1
|
|
52
|
+
compressed = 1
|
|
53
|
+
payload = zlib.compress(payload)
|
|
54
|
+
reserved = 0
|
|
55
|
+
crc32 = zlib.crc32(payload)
|
|
56
|
+
payload_length = len(payload)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
header = struct.pack('>BBHIHIBBIII', magic_byte1, magic_byte2, version, flags, msg_type, msg_seq, content_type, compressed, reserved, crc32, payload_length)
|
|
60
|
+
#print(f"Header: {header}")
|
|
61
|
+
#print(f"Payload: {payload}")
|
|
62
|
+
return header + payload
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def decode_wss_binary_message(data):
|
|
66
|
+
try:
|
|
67
|
+
magic_byte1, magic_byte2, version, flags, msg_type, msg_seq, content_type, compressed, reserved, crc32, payload_length = struct.unpack('>BBHIHIBBIII', data[:28])
|
|
68
|
+
if magic_byte1 != ord('M') or magic_byte2 != ord('U'):
|
|
69
|
+
return ""
|
|
70
|
+
payload = data[28:]
|
|
71
|
+
if len(payload) != payload_length:
|
|
72
|
+
return ""
|
|
73
|
+
if zlib.crc32(payload) != crc32:
|
|
74
|
+
return ""
|
|
75
|
+
if compressed != 0 and compressed != 1:
|
|
76
|
+
return ""
|
|
77
|
+
if compressed == 1:
|
|
78
|
+
payload = zlib.decompress(payload)
|
|
79
|
+
return payload.decode()
|
|
80
|
+
except (struct.error, zlib.error):
|
|
81
|
+
return ""
|
|
82
|
+
except Exception:
|
|
83
|
+
return ""
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def encode_wss_binary_buffer(payload, msg_header: WssBinaryMessage):
|
|
87
|
+
magic_byte1 = ord('M')
|
|
88
|
+
magic_byte2 = ord('U')
|
|
89
|
+
version = msg_header.version
|
|
90
|
+
flags = msg_header.flags
|
|
91
|
+
msg_type = msg_header.msg_type
|
|
92
|
+
# 假设 msg_seq 初始为 0,可根据实际情况调整
|
|
93
|
+
msg_seq = msg_header.msg_seq
|
|
94
|
+
content_type = msg_header.content_type
|
|
95
|
+
compressed = msg_header.compressed
|
|
96
|
+
reserved = msg_header.reserved
|
|
97
|
+
crc32 = zlib.crc32(payload)
|
|
98
|
+
payload_length = len(payload)
|
|
99
|
+
|
|
100
|
+
header = struct.pack('>BBHIHIBBIII', magic_byte1, magic_byte2, version, flags, msg_type, msg_seq, content_type, compressed, reserved, crc32, payload_length)
|
|
101
|
+
#print(f"Header: {header}")
|
|
102
|
+
#print(f"Payload: {payload}")
|
|
103
|
+
return header + payload
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def decode_wss_binary_buffer(data):
|
|
107
|
+
try:
|
|
108
|
+
magic_byte1, magic_byte2, version, flags, msg_type, msg_seq, content_type, compressed, reserved, crc32, payload_length = struct.unpack('>BBHIHIBBIII', data[:28])
|
|
109
|
+
if magic_byte1 != ord('M') or magic_byte2 != ord('U'):
|
|
110
|
+
return None
|
|
111
|
+
payload = data[28:]
|
|
112
|
+
if len(payload) != payload_length:
|
|
113
|
+
return None
|
|
114
|
+
if zlib.crc32(payload) != crc32:
|
|
115
|
+
return None
|
|
116
|
+
if compressed != 0 and compressed != 1:
|
|
117
|
+
return None
|
|
118
|
+
if compressed == 1:
|
|
119
|
+
payload = zlib.decompress(payload)
|
|
120
|
+
|
|
121
|
+
wss_msg = WssBinaryMessage()
|
|
122
|
+
wss_msg.version = version
|
|
123
|
+
wss_msg.flags = flags
|
|
124
|
+
wss_msg.msg_type = msg_type
|
|
125
|
+
wss_msg.msg_seq = msg_seq
|
|
126
|
+
wss_msg.content_type = content_type
|
|
127
|
+
wss_msg.compressed = compressed
|
|
128
|
+
wss_msg.reserved = reserved
|
|
129
|
+
wss_msg.crc32 = crc32
|
|
130
|
+
wss_msg.payload_length = len(payload)
|
|
131
|
+
wss_msg.payload = payload
|
|
132
|
+
|
|
133
|
+
return wss_msg
|
|
134
|
+
except (struct.error, zlib.error):
|
|
135
|
+
return None
|
|
136
|
+
except Exception:
|
|
137
|
+
return None
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# 文件操作Agent
|
|
2
|
+
|
|
3
|
+
这是一个基于ACP协议的Agent,可以根据会话和群组成员生成关系图
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
|
|
7
|
+
# 安装依赖
|
|
8
|
+
pip install agentcp
|
|
9
|
+
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## 功能特性
|
|
13
|
+
|
|
14
|
+
- ✅ 消息问答
|
|
15
|
+
- ✅ 生成调用关系图
|
|
16
|
+
|
|
17
|
+
## 使用说明
|
|
18
|
+
|
|
19
|
+
1. 启动Agent:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
# 创建身份
|
|
23
|
+
python create_profile.py
|
|
24
|
+
|
|
25
|
+
# 修改main.py里的 AGENT_NAME 为你创建的身份信息
|
|
26
|
+
python main.py
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## 交互说明
|
|
30
|
+
|
|
31
|
+
发送指令格式:
|
|
32
|
+
|
|
33
|
+
- 生成调用关系图: "查看关系图"
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
## 注意事项
|
|
37
|
+
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
{
|
|
2
|
+
"publisherInfo": {
|
|
3
|
+
"publisherAid": "gggg12.agentunion.cn",
|
|
4
|
+
"organization": "agentunion.cn",
|
|
5
|
+
"certificationSignature": "agentunion.cn"
|
|
6
|
+
},
|
|
7
|
+
"version": "1.0.0",
|
|
8
|
+
"lastUpdated": "2025-05-08T09:40:38Z",
|
|
9
|
+
"name": "Agent调用关系图",
|
|
10
|
+
"description": "Agent调用关系图绘制",
|
|
11
|
+
"avaUrl": "https://t9.baidu.com/it/u=2472616479,557015018&fm=193",
|
|
12
|
+
"capabilities": {
|
|
13
|
+
"core": [
|
|
14
|
+
"调用关系图绘制"
|
|
15
|
+
],
|
|
16
|
+
"extended": []
|
|
17
|
+
},
|
|
18
|
+
"references": {
|
|
19
|
+
"knowledgeBases": [
|
|
20
|
+
""
|
|
21
|
+
],
|
|
22
|
+
"tools": [
|
|
23
|
+
""
|
|
24
|
+
],
|
|
25
|
+
"companyInfo": [
|
|
26
|
+
""
|
|
27
|
+
],
|
|
28
|
+
"productInfo": [
|
|
29
|
+
""
|
|
30
|
+
]
|
|
31
|
+
},
|
|
32
|
+
"llm": {
|
|
33
|
+
"model": "qwen-plus",
|
|
34
|
+
"num_parameters": "",
|
|
35
|
+
"quantization_bits": "",
|
|
36
|
+
"context_length": ""
|
|
37
|
+
},
|
|
38
|
+
"authorization": {
|
|
39
|
+
"modes": [
|
|
40
|
+
"free"
|
|
41
|
+
],
|
|
42
|
+
"fee": {},
|
|
43
|
+
"description": "",
|
|
44
|
+
"sla": {}
|
|
45
|
+
},
|
|
46
|
+
"input": {
|
|
47
|
+
"types": [
|
|
48
|
+
"content"
|
|
49
|
+
],
|
|
50
|
+
"formats": [
|
|
51
|
+
"json"
|
|
52
|
+
],
|
|
53
|
+
"examples": {
|
|
54
|
+
"type": "content",
|
|
55
|
+
"format": "text",
|
|
56
|
+
"content": "查看关系图"
|
|
57
|
+
},
|
|
58
|
+
"semantics": [
|
|
59
|
+
""
|
|
60
|
+
],
|
|
61
|
+
"compatibleAids": [
|
|
62
|
+
"*"
|
|
63
|
+
]
|
|
64
|
+
},
|
|
65
|
+
"output": {
|
|
66
|
+
"types": [
|
|
67
|
+
"content"
|
|
68
|
+
],
|
|
69
|
+
"formats": [
|
|
70
|
+
"markdown"
|
|
71
|
+
],
|
|
72
|
+
"examples": {
|
|
73
|
+
"type": "content",
|
|
74
|
+
"format": "markdown",
|
|
75
|
+
"content": ""
|
|
76
|
+
},
|
|
77
|
+
"semantics": [
|
|
78
|
+
""
|
|
79
|
+
],
|
|
80
|
+
"compatibleAids": [
|
|
81
|
+
""
|
|
82
|
+
]
|
|
83
|
+
},
|
|
84
|
+
"supportStream": true,
|
|
85
|
+
"supportAsync": true,
|
|
86
|
+
"permission": [
|
|
87
|
+
"*"
|
|
88
|
+
]
|
|
89
|
+
}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
# Copyright 2025 ModelUnion Inc.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from datetime import datetime, timezone
|
|
16
|
+
import agentcp
|
|
17
|
+
from pathlib import Path # 新增导入
|
|
18
|
+
import json
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def create_financial_analyzer_json(publisherInfo):
|
|
22
|
+
"""创建智能体能力、权限描述"""
|
|
23
|
+
profile_json_data = {
|
|
24
|
+
"publisherInfo": publisherInfo,
|
|
25
|
+
"version": "1.0.0",
|
|
26
|
+
"lastUpdated": datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ"),
|
|
27
|
+
"name": "Agent调用关系图",
|
|
28
|
+
"description": "Agent调用关系图绘制",
|
|
29
|
+
"avaUrl": "https://t9.baidu.com/it/u=2472616479,557015018&fm=193",
|
|
30
|
+
"capabilities": {"core": ["调用关系图绘制"], "extended": []},
|
|
31
|
+
"references": {
|
|
32
|
+
"knowledgeBases": [""],
|
|
33
|
+
"tools": [""],
|
|
34
|
+
"companyInfo": [""],
|
|
35
|
+
"productInfo": [""],
|
|
36
|
+
},
|
|
37
|
+
"llm": {
|
|
38
|
+
"model": "qwen-plus", # 模型名称,或使用aid
|
|
39
|
+
"num_parameters": "", # 模型参数量(如"7B"表示70亿参数)
|
|
40
|
+
"quantization_bits": "", # 量化位数(如Q4表示4位量化)
|
|
41
|
+
"context_length": "", # 上下文长度(如"4096"表示4096个token)
|
|
42
|
+
},
|
|
43
|
+
"authorization": {
|
|
44
|
+
"modes": ["free"],
|
|
45
|
+
"fee": {},
|
|
46
|
+
"description": "",
|
|
47
|
+
"sla": {},
|
|
48
|
+
},
|
|
49
|
+
"input": {
|
|
50
|
+
"types": [
|
|
51
|
+
"content"
|
|
52
|
+
], # 目前支持"content", "search", "reasoning_content", "error", 'file',后续会支持语音视频流
|
|
53
|
+
"formats": ["json"], # 详细类型
|
|
54
|
+
"examples": {
|
|
55
|
+
"type": "content",
|
|
56
|
+
"format": "text",
|
|
57
|
+
"content": "查看关系图",
|
|
58
|
+
},
|
|
59
|
+
"semantics": [""],
|
|
60
|
+
"compatibleAids": ["*"],
|
|
61
|
+
},
|
|
62
|
+
"output": {
|
|
63
|
+
"types": ["content"],
|
|
64
|
+
"formats": ["markdown"],
|
|
65
|
+
"examples": {"type": "content", "format": "markdown", "content": ""},
|
|
66
|
+
"semantics": [""],
|
|
67
|
+
"compatibleAids": [""],
|
|
68
|
+
},
|
|
69
|
+
"supportStream": True, # False代表当前智能体不支持流式输出
|
|
70
|
+
"supportAsync": True,
|
|
71
|
+
"permission": ["*"],
|
|
72
|
+
}
|
|
73
|
+
return profile_json_data
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def write_agent_profile_json(json_data):
|
|
77
|
+
try:
|
|
78
|
+
import os
|
|
79
|
+
|
|
80
|
+
json_path = Path(__file__).resolve()
|
|
81
|
+
json_dir = json_path.parent
|
|
82
|
+
json_file = os.path.join(json_dir, "agentprofile.json")
|
|
83
|
+
with open(json_file, "w", encoding="utf-8") as f:
|
|
84
|
+
json.dump(json_data, f, ensure_ascii=False, indent=2)
|
|
85
|
+
print("智能体描述文件已保存至当前目录下agentprofile.json")
|
|
86
|
+
except Exception as e:
|
|
87
|
+
print(f"文件写入失败: {str(e)}")
|
|
88
|
+
exit(1)
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
if __name__ == "__main__":
|
|
92
|
+
# 创建JSON数据
|
|
93
|
+
# 将加密种子修改为自己的加密种子,可以是随机字符串,也可以是固定字符串,只要保证一致即可。
|
|
94
|
+
acp = agentcp.AgentCP(".", seed_password="888777", debug=False)
|
|
95
|
+
agentid_list = acp.get_aid_list()
|
|
96
|
+
agentid: agentcp.AgentID = None
|
|
97
|
+
while agentid is None:
|
|
98
|
+
print("请选择一个身份(aid):")
|
|
99
|
+
for i, agentid in enumerate(agentid_list):
|
|
100
|
+
print(f"{i+1}. {agentid}")
|
|
101
|
+
print(f"{len(agentid_list)+1}. 创建一个新的身份(aid)")
|
|
102
|
+
choice = input("请输入数字选择一个身份(aid): ")
|
|
103
|
+
try:
|
|
104
|
+
choice = int(choice) - 1
|
|
105
|
+
if choice < 0 or choice > len(agentid_list):
|
|
106
|
+
raise ValueError
|
|
107
|
+
if choice == len(agentid_list):
|
|
108
|
+
aid = input("请输入名称: ")
|
|
109
|
+
agentid = acp.create_aid("agentunion.cn", aid)
|
|
110
|
+
if agentid is None:
|
|
111
|
+
print("创建身份(aid)失败,请打开日志查看原因")
|
|
112
|
+
exit(1)
|
|
113
|
+
agentid_list = acp.get_aid_list()
|
|
114
|
+
else:
|
|
115
|
+
agentid = acp.load_aid(agentid_list[choice])
|
|
116
|
+
if agentid is None:
|
|
117
|
+
print("加载身份(aid)失败,请打开日志查看原因")
|
|
118
|
+
exit(1)
|
|
119
|
+
except ValueError:
|
|
120
|
+
print("无效的选择,请重新输入。")
|
|
121
|
+
print(f"当前选择的身份(aid)是: {str(agentid)}")
|
|
122
|
+
agentid.init_ap_client()
|
|
123
|
+
json_data = create_financial_analyzer_json(agentid.get_publisher_info())
|
|
124
|
+
write_agent_profile_json(json_data)
|
|
125
|
+
select_result = input("是否将文件拷贝到agent公有数据目录下(Y/N): ")
|
|
126
|
+
if select_result.upper() != "Y":
|
|
127
|
+
print("程序运行结束")
|
|
128
|
+
exit(1)
|
|
129
|
+
agentid.create_agent_profile(json_data)
|
|
130
|
+
select_result = input("拷贝成功,是否同步到接入服务器(Y/N): ")
|
|
131
|
+
if select_result.upper() != "Y":
|
|
132
|
+
print("程序运行结束")
|
|
133
|
+
exit(1)
|
|
134
|
+
result = agentid.sync_public_files()
|
|
135
|
+
if result:
|
|
136
|
+
print("文件同步成功!")
|
|
137
|
+
else:
|
|
138
|
+
print("文件同步失败,请初始化ACP时打开日志查看")
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
# Copyright 2025 ModelUnion Inc.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
import json
|
|
16
|
+
from agentcp import AgentCP
|
|
17
|
+
import networkx as nx
|
|
18
|
+
from pyvis.network import Network
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class Graph(nx.DiGraph):
|
|
22
|
+
|
|
23
|
+
def add(self, source, target, info=""):
|
|
24
|
+
if self.has_edge(source, target):
|
|
25
|
+
# 更新 info 信息
|
|
26
|
+
self[source][target]["info"] = info
|
|
27
|
+
else:
|
|
28
|
+
# 添加新边
|
|
29
|
+
self.add_edge(source, target, info=info)
|
|
30
|
+
|
|
31
|
+
def draw(self, name="agent_call_graph.html"):
|
|
32
|
+
net = Network(
|
|
33
|
+
height="600px",
|
|
34
|
+
width="100%",
|
|
35
|
+
directed=True,
|
|
36
|
+
notebook=False,
|
|
37
|
+
cdn_resources="in_line",
|
|
38
|
+
)
|
|
39
|
+
net.from_nx(self)
|
|
40
|
+
root_nodes = [node for node in self.nodes if self.in_degree(node) == 0]
|
|
41
|
+
|
|
42
|
+
# 创建 pyvis 网络图
|
|
43
|
+
net = Network(
|
|
44
|
+
height="600px",
|
|
45
|
+
width="100%",
|
|
46
|
+
directed=True,
|
|
47
|
+
notebook=False,
|
|
48
|
+
cdn_resources="in_line",
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
# 从 NetworkX 图导入结构
|
|
52
|
+
net.from_nx(self)
|
|
53
|
+
|
|
54
|
+
# 放大节点
|
|
55
|
+
for node in net.nodes:
|
|
56
|
+
node["size"] = 15 # 默认 25 左右,40 会明显更大
|
|
57
|
+
node["color"] = "#ADD8E6" # 可选:设置更醒目的颜色
|
|
58
|
+
node["font"] = {"size": 20} # 放大标签字体
|
|
59
|
+
if self.in_degree(node["id"]) == 0:
|
|
60
|
+
node["color"] = "#CFD8E6" # 可选:设置更醒目的颜色
|
|
61
|
+
|
|
62
|
+
# 更新每条边的 title(hover 时显示调用频率)
|
|
63
|
+
for edge in net.edges:
|
|
64
|
+
src = edge["from"]
|
|
65
|
+
tgt = edge["to"]
|
|
66
|
+
info = self.get_edge_data(src, tgt).get("info", "")
|
|
67
|
+
edge["title"] = info # 设置 hover 提示
|
|
68
|
+
edge["arrows"] = "to" # 确保箭头方向正确
|
|
69
|
+
|
|
70
|
+
# 添加物理布局和交互设置
|
|
71
|
+
net.set_options(
|
|
72
|
+
"""
|
|
73
|
+
var options = {
|
|
74
|
+
"physics": {
|
|
75
|
+
"enabled": false,
|
|
76
|
+
"stabilization": {
|
|
77
|
+
"iterations": 300
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
"interaction": {
|
|
81
|
+
"hover": true,
|
|
82
|
+
"navigationButtons": true,
|
|
83
|
+
"zoomView": true,
|
|
84
|
+
"dragNodes": true
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
"""
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
# 生成 HTML 并在浏览器中打开
|
|
91
|
+
net.write_html(name, local=False, notebook=False, open_browser=True)
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
class AgentGraph:
|
|
95
|
+
|
|
96
|
+
def __init__(self, name, endpoint="agentunion.cn"):
|
|
97
|
+
self.name = name
|
|
98
|
+
self.endpoint = endpoint
|
|
99
|
+
self.acp = AgentCP("./", seed_password="888777")
|
|
100
|
+
self.graph = Graph()
|
|
101
|
+
self.aid = self.acp.create_aid(self.endpoint, self.name)
|
|
102
|
+
self.call_count = {}
|
|
103
|
+
self.id = f'{self.name}.{self.endpoint}'
|
|
104
|
+
self.aid.add_message_handler(self.message_handler)
|
|
105
|
+
self.graph_file = f"{self.aid.get_agent_public_path()}/agent_call_graph.html"
|
|
106
|
+
|
|
107
|
+
async def message_handler(self, msg):
|
|
108
|
+
"""
|
|
109
|
+
消息处理器 - 根据消息内容安全地读取文件
|
|
110
|
+
{
|
|
111
|
+
'session_id': '1831173476580327424',
|
|
112
|
+
'request_id': '', 'message_id': '9',
|
|
113
|
+
'ref_msg_id': '',
|
|
114
|
+
'sender': 'samplesdeveloper.agentunion.cn',
|
|
115
|
+
'receiver': 'guest_1831158907166261248.agentunion.cn',
|
|
116
|
+
'message': '[{"type": "text", "status": "success", "timestamp": 1746343146261,
|
|
117
|
+
"content": "{\\"text\\":\\"\\u8bfb\\u53d6\\u6587\\u4ef6agentprofile.json\\",\\"files\\":[],\\"links\\":[],\\"search\\":false,\\"think\\":false}",
|
|
118
|
+
"stream": false, "prompt": null, "extra": null, "artifact": null}]',
|
|
119
|
+
'timestamp': '1746343146265'
|
|
120
|
+
}
|
|
121
|
+
"""
|
|
122
|
+
|
|
123
|
+
sender = msg.get("sender")
|
|
124
|
+
self.call_count[sender] = self.call_count.get(sender, 0) + 1
|
|
125
|
+
print(f"收到来自 {sender} 的消息")
|
|
126
|
+
self.graph.add(sender, self.id, f"调用次数: {self.call_count[sender]}")
|
|
127
|
+
message = json.loads(msg.get("message"))[0]
|
|
128
|
+
message = json.loads(message.get('content', '{}'))
|
|
129
|
+
message = message.get('text', '')
|
|
130
|
+
# self.graph.add(self.id, sender, f'调用次数: {self.call_count[sender]}')
|
|
131
|
+
members = self.aid.get_session_member_list(msg.get("session_id"))
|
|
132
|
+
print(f"群成员: {members}")
|
|
133
|
+
for member in members:
|
|
134
|
+
print(f"群组成员: {member}")
|
|
135
|
+
# self.graph.add(self.id, member, f'调用次数: {self.call_count[member]}'
|
|
136
|
+
if message.find('关系图') != -1:
|
|
137
|
+
print(f"生成关系图: {self.graph_file}")
|
|
138
|
+
try:
|
|
139
|
+
self.graph.draw(name=self.graph_file)
|
|
140
|
+
self.aid.sync_public_files()
|
|
141
|
+
url = f'https://{self.aid.id}/{self.graph_file.split("/")[-1]}'
|
|
142
|
+
self.aid.reply_message(msg, f"关系图已生成可访问: {url} 查看")
|
|
143
|
+
self.graph.add(self.id, sender, f"调用次数: {self.call_count[sender]}")
|
|
144
|
+
except Exception as e:
|
|
145
|
+
print(f"生成关系图失败: {e}")
|
|
146
|
+
else:
|
|
147
|
+
self.graph.add(self.id, sender, f"调用次数: {self.call_count[sender]}")
|
|
148
|
+
self.aid.reply_message(msg, "收到消息")
|
|
149
|
+
|
|
150
|
+
def online(self):
|
|
151
|
+
self.aid.online()
|
|
152
|
+
self.acp.register_signal_handler()
|
|
153
|
+
self.acp.serve_forever()
|
|
154
|
+
|
|
155
|
+
def offline(self):
|
|
156
|
+
self.aid.offline()
|
|
157
|
+
self.graph.draw()
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
if __name__ == "__main__":
|
|
161
|
+
ENDPOINT = "agentunion.cn"
|
|
162
|
+
AGENT_NAME = "gggg12"
|
|
163
|
+
agent = AgentGraph(AGENT_NAME, ENDPOINT)
|
|
164
|
+
agent.online()
|