@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,89 @@
|
|
|
1
|
+
{
|
|
2
|
+
"publisherInfo": {
|
|
3
|
+
"publisherAid": "weather.agentunion.cn",
|
|
4
|
+
"organization": "agentunion.cn",
|
|
5
|
+
"certificationSignature": "agentunion.cn"
|
|
6
|
+
},
|
|
7
|
+
"avaUrl": "https://img1.baidu.com/it/u=4196730940,2454447876&fm=253&fmt=auto&app=120&f=JPEG?w=933&h=800",
|
|
8
|
+
"version": "1.0.0",
|
|
9
|
+
"lastUpdated": "2025-05-15T04:22:30Z",
|
|
10
|
+
"name": "ACP 天气问答智能体",
|
|
11
|
+
"description": "智能查询天气信息,提供准确的天气数据。",
|
|
12
|
+
"capabilities": {
|
|
13
|
+
"core": [
|
|
14
|
+
"智能查询天气信息,提供准确的天气数据。"
|
|
15
|
+
],
|
|
16
|
+
"extended": []
|
|
17
|
+
},
|
|
18
|
+
"llm": {
|
|
19
|
+
"model": "qwen-plus",
|
|
20
|
+
"num_parameters": "",
|
|
21
|
+
"quantization_bits": "",
|
|
22
|
+
"context_length": ""
|
|
23
|
+
},
|
|
24
|
+
"references": {
|
|
25
|
+
"knowledgeBases": [
|
|
26
|
+
""
|
|
27
|
+
],
|
|
28
|
+
"tools": [
|
|
29
|
+
""
|
|
30
|
+
],
|
|
31
|
+
"companyInfo": [
|
|
32
|
+
""
|
|
33
|
+
],
|
|
34
|
+
"productInfo": [
|
|
35
|
+
""
|
|
36
|
+
]
|
|
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": "搜索智能体:xxx"
|
|
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,16 @@
|
|
|
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
|
+
|
|
16
|
+
from . import ap_client
|
|
@@ -0,0 +1,316 @@
|
|
|
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 datetime
|
|
16
|
+
import hashlib
|
|
17
|
+
import os
|
|
18
|
+
|
|
19
|
+
import requests
|
|
20
|
+
|
|
21
|
+
from agentcp.base.auth_client import AuthClient
|
|
22
|
+
from agentcp.base.client import IClient
|
|
23
|
+
from agentcp.base.log import log_debug, log_error, log_exception, log_info
|
|
24
|
+
|
|
25
|
+
from ..context import ErrorContext, exceptions
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class ApClient(IClient):
|
|
29
|
+
def __init__(self, agent_id: str, server_url: str, aid_path: str, seed_password: str):
|
|
30
|
+
super().__init__()
|
|
31
|
+
self.agent_id = agent_id
|
|
32
|
+
self.heartbeat_server = ""
|
|
33
|
+
self.message_server = ""
|
|
34
|
+
self.server_url = f"{server_url}" + "/api/accesspoint"
|
|
35
|
+
self.auth_client = AuthClient(agent_id, self.server_url, aid_path, seed_password) # 使用AuthClient
|
|
36
|
+
|
|
37
|
+
def initialize(self):
|
|
38
|
+
self.auth_client.sign_in()
|
|
39
|
+
self.get_entrypoint_config()
|
|
40
|
+
|
|
41
|
+
def sign_in(self) -> bool:
|
|
42
|
+
return self.auth_client.sign_in() is not None
|
|
43
|
+
|
|
44
|
+
def get_headers(self) -> dict:
|
|
45
|
+
return {"User-Agent": f"AgentCP/{__import__('agentcp').__version__} (AuthClient; {self.agent_id})"}
|
|
46
|
+
|
|
47
|
+
def sign_out(self):
|
|
48
|
+
"""登出方法"""
|
|
49
|
+
self.auth_client.sign_out()
|
|
50
|
+
|
|
51
|
+
def post_private_data(self, data):
|
|
52
|
+
try:
|
|
53
|
+
ep_url = self.server_url + "/post_agent_private_data"
|
|
54
|
+
data = {
|
|
55
|
+
"agent_id": f"{self.agent_id}",
|
|
56
|
+
"signature": self.auth_client.signature,
|
|
57
|
+
"data": data,
|
|
58
|
+
}
|
|
59
|
+
response = self.post_request(ep_url, json=data)
|
|
60
|
+
if response.status_code == 200:
|
|
61
|
+
log_info(f"post_private_data ok:{response.json()}")
|
|
62
|
+
return response.json()["data"]
|
|
63
|
+
else:
|
|
64
|
+
log_error(f"post_private_data failed:{response.json()}")
|
|
65
|
+
return None
|
|
66
|
+
except Exception as e:
|
|
67
|
+
log_exception(f"Post private data exception occurred: {e}")
|
|
68
|
+
ErrorContext.publish(exceptions.SDKError(f"Post private data exception occurred: {e}"))
|
|
69
|
+
return None
|
|
70
|
+
|
|
71
|
+
def get_all_public_data(self):
|
|
72
|
+
try:
|
|
73
|
+
ep_url = self.server_url + "/get_all_public_data"
|
|
74
|
+
data = {
|
|
75
|
+
"agent_id": f"{self.agent_id}",
|
|
76
|
+
"signature": self.auth_client.signature,
|
|
77
|
+
}
|
|
78
|
+
response = self.post_request(ep_url, json=data)
|
|
79
|
+
if response.status_code == 200:
|
|
80
|
+
return response.json()["data"]
|
|
81
|
+
else:
|
|
82
|
+
log_error(f"get_all_public_data failed:{response.json()}")
|
|
83
|
+
return []
|
|
84
|
+
except Exception as e:
|
|
85
|
+
log_error("get_all_public_data exception:")
|
|
86
|
+
log_exception(e)
|
|
87
|
+
ErrorContext.publish(exceptions.SDKError(f"get_all_public_data exception: {e}"))
|
|
88
|
+
return []
|
|
89
|
+
|
|
90
|
+
def get_agent_list(self):
|
|
91
|
+
try:
|
|
92
|
+
ep_url = self.server_url + "/get_agent_list"
|
|
93
|
+
data = {
|
|
94
|
+
"agent_id": f"{self.agent_id}",
|
|
95
|
+
"signature": self.auth_client.signature,
|
|
96
|
+
}
|
|
97
|
+
response = self.post_request(ep_url, json=data)
|
|
98
|
+
if response.status_code == 200:
|
|
99
|
+
log_info(f"get_all_public_data ok:{response.json()}")
|
|
100
|
+
return response.json()["data"]
|
|
101
|
+
else:
|
|
102
|
+
log_error(f"get_all_public_data failed:{response.json()}")
|
|
103
|
+
return None
|
|
104
|
+
except Exception as e:
|
|
105
|
+
log_exception(f"Get all public data exception occurred: {e}")
|
|
106
|
+
ErrorContext.publish(exceptions.SDKError(f"Get all public data exception occurred: {e}"))
|
|
107
|
+
|
|
108
|
+
def get_entrypoint_config(self):
|
|
109
|
+
try:
|
|
110
|
+
ep_url = self.server_url + "/get_accesspoint_config"
|
|
111
|
+
log_debug(f"Get server config: {ep_url}")
|
|
112
|
+
data = {
|
|
113
|
+
"agent_id": f"{self.agent_id}",
|
|
114
|
+
"signature": self.auth_client.signature,
|
|
115
|
+
}
|
|
116
|
+
response = self.post_request(ep_url, json=data)
|
|
117
|
+
if response.status_code == 200:
|
|
118
|
+
try:
|
|
119
|
+
config = response.json()
|
|
120
|
+
if isinstance(config.get("config"), str): # 处理config是字符串的情况
|
|
121
|
+
import json
|
|
122
|
+
|
|
123
|
+
config["config"] = json.loads(config["config"])
|
|
124
|
+
if "config" in config:
|
|
125
|
+
if "heartbeat_server" in config["config"]:
|
|
126
|
+
self.heartbeat_server = config["config"]["heartbeat_server"]
|
|
127
|
+
log_debug(f"Set heartbeat server to: {self.heartbeat_server}")
|
|
128
|
+
if "message_server" in config["config"]:
|
|
129
|
+
self.message_server = config["config"]["message_server"]
|
|
130
|
+
log_debug(f"Set message server to: {self.message_server}")
|
|
131
|
+
except (ValueError, AttributeError) as e:
|
|
132
|
+
ErrorContext.publish(exceptions.SDKError(f"处理ap返回的数据出错: {response.text}"))
|
|
133
|
+
log_exception(f"Failed to parse JSON. Response content: {response.text[:500]}. Error: {e}")
|
|
134
|
+
else:
|
|
135
|
+
log_error(f"Get entrypoint config {ep_url} failed:{response.json()}")
|
|
136
|
+
|
|
137
|
+
except Exception as e:
|
|
138
|
+
log_exception(f"Get entrypoint config exception occurred: {e}")
|
|
139
|
+
ErrorContext.publish(exceptions.SDKError(f"Get entrypoint config exception occurred: {e}"))
|
|
140
|
+
|
|
141
|
+
def get_agent_profile(self, agentid):
|
|
142
|
+
try:
|
|
143
|
+
url = f"https://{agentid}/agentprofile.json"
|
|
144
|
+
response = self.get_request(url)
|
|
145
|
+
if response.status_code == 200:
|
|
146
|
+
log_debug(f"get_agent_public_data ok:{response.json()}")
|
|
147
|
+
return response.json()
|
|
148
|
+
else:
|
|
149
|
+
log_error(f"get_agent_public_data failed:{response.json()}")
|
|
150
|
+
return None
|
|
151
|
+
except Exception as e:
|
|
152
|
+
log_exception(f"Get agent public data exception occurred: {e}")
|
|
153
|
+
return None
|
|
154
|
+
|
|
155
|
+
def get_agent_public_data(self, agentid):
|
|
156
|
+
try:
|
|
157
|
+
ep_url = self.server_url + "/get_agent_public_data"
|
|
158
|
+
data = {
|
|
159
|
+
"agent_id": f"{agentid}",
|
|
160
|
+
"signature": self.auth_client.signature,
|
|
161
|
+
}
|
|
162
|
+
response = self.post_request(ep_url, json=data)
|
|
163
|
+
if response.status_code == 200:
|
|
164
|
+
log_debug(f"get_agent_public_data ok:{response.json()}")
|
|
165
|
+
return response.json()[
|
|
166
|
+
"data"
|
|
167
|
+
] # Return the data if it exists, else return None or handle it as you like
|
|
168
|
+
else:
|
|
169
|
+
log_error(f"get_agent_public_data failed:{response.json()}")
|
|
170
|
+
return None
|
|
171
|
+
except Exception as e:
|
|
172
|
+
log_exception(f"Get agent public data exception occurred: {e}")
|
|
173
|
+
return None
|
|
174
|
+
|
|
175
|
+
def get_agent_private_data(self):
|
|
176
|
+
try:
|
|
177
|
+
ep_url = self.server_url + "/get_agent_private_data"
|
|
178
|
+
data = {
|
|
179
|
+
"agent_id": f"{self.agent_id}",
|
|
180
|
+
"signature": self.auth_client.signature,
|
|
181
|
+
}
|
|
182
|
+
response = self.post_request(ep_url, json=data)
|
|
183
|
+
if response.status_code == 200:
|
|
184
|
+
log_debug(f"Get_agent_private_data ok:{response.json()}")
|
|
185
|
+
return response.json()["data"]
|
|
186
|
+
else:
|
|
187
|
+
log_error(f"Get_agent_private_data failed:{response.json()}")
|
|
188
|
+
return None
|
|
189
|
+
except Exception as e:
|
|
190
|
+
log_exception(f"Get agent private data exception occurred: {e}")
|
|
191
|
+
return None
|
|
192
|
+
|
|
193
|
+
def get_heartbeat_server(self):
|
|
194
|
+
return self.heartbeat_server
|
|
195
|
+
|
|
196
|
+
def get_message_server(self):
|
|
197
|
+
return self.message_server
|
|
198
|
+
|
|
199
|
+
def __get_sha256(self, input_str: str) -> str:
|
|
200
|
+
sha256_hash = hashlib.sha256()
|
|
201
|
+
sha256_hash.update(input_str.encode("utf-8"))
|
|
202
|
+
return sha256_hash.hexdigest()
|
|
203
|
+
|
|
204
|
+
def __scan_folder(self, folder_path):
|
|
205
|
+
file_list = []
|
|
206
|
+
for root, dirs, files in os.walk(folder_path):
|
|
207
|
+
for file in files:
|
|
208
|
+
relative_file_path = os.path.relpath(os.path.join(root, file), folder_path)
|
|
209
|
+
relative_file_path = relative_file_path.replace("\\", "/")
|
|
210
|
+
file_path = os.path.join(root, file)
|
|
211
|
+
|
|
212
|
+
try:
|
|
213
|
+
file_size = os.path.getsize(file_path)
|
|
214
|
+
last_modified_utc = datetime.datetime.fromtimestamp(
|
|
215
|
+
os.path.getmtime(file_path), tz=datetime.timezone.utc
|
|
216
|
+
)
|
|
217
|
+
last_modified_ms = int(last_modified_utc.timestamp() * 1000)
|
|
218
|
+
sha256 = self.__get_sha256(file_path)
|
|
219
|
+
file_info = {
|
|
220
|
+
"full_path": relative_file_path,
|
|
221
|
+
"size": file_size,
|
|
222
|
+
"last_modified": last_modified_ms,
|
|
223
|
+
"sha256": sha256,
|
|
224
|
+
}
|
|
225
|
+
file_list.append(file_info)
|
|
226
|
+
except Exception as e:
|
|
227
|
+
import traceback
|
|
228
|
+
|
|
229
|
+
log_error(f"处理文件 {relative_file_path} 时出错,错误信息: {str(e)}")
|
|
230
|
+
log_error("详细堆栈信息如下:")
|
|
231
|
+
log_error(traceback.format_exc())
|
|
232
|
+
return file_list
|
|
233
|
+
|
|
234
|
+
def sync_public_files(self, file_path) -> bool:
|
|
235
|
+
try:
|
|
236
|
+
files_list = self.__scan_folder(file_path)
|
|
237
|
+
ep_url = self.server_url + "/sync_public_files"
|
|
238
|
+
data = {
|
|
239
|
+
"agent_id": f"{self.agent_id}",
|
|
240
|
+
"signature": self.auth_client.signature,
|
|
241
|
+
"file_list": files_list,
|
|
242
|
+
}
|
|
243
|
+
response = requests.post(ep_url, json=data, verify=False, proxies={})
|
|
244
|
+
if response.status_code == 200:
|
|
245
|
+
rj = response.json()
|
|
246
|
+
log_info(f"sync_public_files ok:{rj}")
|
|
247
|
+
if "need_upload_files" in rj:
|
|
248
|
+
need_upload_files = rj["need_upload_files"]
|
|
249
|
+
for file_name in need_upload_files:
|
|
250
|
+
params = {
|
|
251
|
+
"agent_id": self.agent_id,
|
|
252
|
+
"signature": self.auth_client.signature,
|
|
253
|
+
"file_name": file_name,
|
|
254
|
+
}
|
|
255
|
+
full_path = os.path.join(file_path, file_name)
|
|
256
|
+
hb_url = self.server_url + "/upload_file"
|
|
257
|
+
with open(full_path, "rb") as file:
|
|
258
|
+
files = {"file": file}
|
|
259
|
+
response = requests.post(hb_url, data=params, files=files, verify=False, proxies={})
|
|
260
|
+
if response.status_code == 200:
|
|
261
|
+
log_info(f"文件{file_name}上传成功 => {response.json()['url']}")
|
|
262
|
+
else:
|
|
263
|
+
log_error(f"文件{file_name}上传失败,状态码: {response.status_code}")
|
|
264
|
+
if "need_download_files" in rj:
|
|
265
|
+
need_download_files = rj["need_download_files"]
|
|
266
|
+
for file_name in need_download_files:
|
|
267
|
+
download_url = (
|
|
268
|
+
self.server_url
|
|
269
|
+
+ "/download_file"
|
|
270
|
+
+ f"?file_name={file_name}&agent_id={self.agent_id}&signature={self.auth_client.signature}"
|
|
271
|
+
)
|
|
272
|
+
log_info(f"download_url:{download_url}")
|
|
273
|
+
try:
|
|
274
|
+
# 发送 GET 请求下载文件
|
|
275
|
+
response = requests.get(download_url, verify=False, stream=True, proxies={})
|
|
276
|
+
response.raise_for_status() # 检查请求是否成功
|
|
277
|
+
# 打开本地文件以写入二进制数据
|
|
278
|
+
save_path = os.path.join(file_path, file_name)
|
|
279
|
+
os.makedirs(os.path.dirname(save_path), exist_ok=True)
|
|
280
|
+
with open(save_path, "wb") as file:
|
|
281
|
+
# 逐块写入文件,避免一次性加载大文件到内存
|
|
282
|
+
for chunk in response.iter_content(chunk_size=16384):
|
|
283
|
+
if chunk: # 过滤掉保持活动的新块
|
|
284
|
+
file.write(chunk)
|
|
285
|
+
log_info(f"文件下载成功,保存路径: {save_path}")
|
|
286
|
+
except requests.RequestException as e:
|
|
287
|
+
log_error(f"下载文件时发生请求错误: {e}")
|
|
288
|
+
except Exception as e:
|
|
289
|
+
log_error(f"下载文件时发生未知错误: {e}")
|
|
290
|
+
return True
|
|
291
|
+
else:
|
|
292
|
+
raise Exception(f"sync_public_files failed:{response.status_code}")
|
|
293
|
+
return False
|
|
294
|
+
except Exception:
|
|
295
|
+
import traceback
|
|
296
|
+
|
|
297
|
+
log_error("详细堆栈信息如下:")
|
|
298
|
+
log_error(traceback.format_exc())
|
|
299
|
+
return False
|
|
300
|
+
|
|
301
|
+
def delete_public_file(self, file_name: str):
|
|
302
|
+
try:
|
|
303
|
+
ep_url = self.server_url + "/delete_public_file"
|
|
304
|
+
data = {
|
|
305
|
+
"agent_id": f"{self.agent_id}",
|
|
306
|
+
"signature": self.auth_client.signature,
|
|
307
|
+
"file_name": file_name,
|
|
308
|
+
}
|
|
309
|
+
response = requests.post(ep_url, json=data, verify=False, proxies={})
|
|
310
|
+
if response.status_code == 200:
|
|
311
|
+
log_info(f"delete_public_file ok:{response.json()}")
|
|
312
|
+
else:
|
|
313
|
+
log_error(f"delete_public_file failed:{response.json()}")
|
|
314
|
+
except Exception as e:
|
|
315
|
+
log_exception(f"delete_public_file in exception: {e}")
|
|
316
|
+
pass
|
|
Binary file
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"received_total": 11,
|
|
3
|
+
"dispatched_success": 11,
|
|
4
|
+
"dispatched_failed": 0,
|
|
5
|
+
"handler_success": 10,
|
|
6
|
+
"handler_failed": 0,
|
|
7
|
+
"dispatch_queue_size": 0,
|
|
8
|
+
"dispatch_success_rate": "100.00%",
|
|
9
|
+
"handler_success_rate": "90.91%",
|
|
10
|
+
"dispatch_latency": {
|
|
11
|
+
"avg_ms": "0.90",
|
|
12
|
+
"p50_ms": "0.53",
|
|
13
|
+
"p95_ms": "1.97",
|
|
14
|
+
"p99_ms": "1.97"
|
|
15
|
+
},
|
|
16
|
+
"handler_latency": {
|
|
17
|
+
"avg_ms": "5026.83",
|
|
18
|
+
"p50_ms": "4824.77",
|
|
19
|
+
"p95_ms": "21972.03",
|
|
20
|
+
"p99_ms": "21972.03"
|
|
21
|
+
},
|
|
22
|
+
"throughput": {
|
|
23
|
+
"messages_per_second": "0.09",
|
|
24
|
+
"dispatched_per_second": "0.09"
|
|
25
|
+
},
|
|
26
|
+
"uptime_seconds": "120",
|
|
27
|
+
"agent_id": "claude_code_proxy.aid.pub",
|
|
28
|
+
"agent_name": "",
|
|
29
|
+
"timestamp": 1762966733.0209625,
|
|
30
|
+
"timestamp_str": "2025-11-13 00:58:53"
|
|
31
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
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
|
+
|
|
16
|
+
from . import auth_client
|
|
17
|
+
from. import client
|
|
18
|
+
from. import env
|
|
19
|
+
from. import html_util
|
|
20
|
+
from. import log
|