wagent-framework 1.5.2__tar.gz → 2.0.0a2__tar.gz
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.
- wagent_framework-2.0.0a2/PKG-INFO +262 -0
- wagent_framework-2.0.0a2/README.md +193 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/setup.py +28 -17
- wagent_framework-2.0.0a2/tests/test_agent_templates.py +38 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/tests/test_aop.py +56 -27
- wagent_framework-2.0.0a2/tests/test_cli.py +375 -0
- wagent_framework-2.0.0a2/tests/test_component_chain.py +62 -0
- wagent_framework-2.0.0a2/tests/test_compositions.py +102 -0
- wagent_framework-2.0.0a2/tests/test_container.py +234 -0
- wagent_framework-2.0.0a2/tests/test_deployment.py +50 -0
- wagent_framework-2.0.0a2/tests/test_doctor.py +11 -0
- wagent_framework-2.0.0a2/tests/test_evaluation.py +203 -0
- wagent_framework-2.0.0a2/tests/test_http_provider_templates.py +418 -0
- wagent_framework-2.0.0a2/tests/test_kernel_events.py +86 -0
- wagent_framework-2.0.0a2/tests/test_kernel_loading.py +70 -0
- wagent_framework-2.0.0a2/tests/test_kernel_plugins.py +169 -0
- wagent_framework-2.0.0a2/tests/test_kernel_registry.py +105 -0
- wagent_framework-2.0.0a2/tests/test_legacy_compat.py +111 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/tests/test_lifecycle.py +57 -2
- wagent_framework-2.0.0a2/tests/test_local_runtime.py +430 -0
- wagent_framework-2.0.0a2/tests/test_mcp_client.py +317 -0
- wagent_framework-2.0.0a2/tests/test_model_invocation.py +364 -0
- wagent_framework-2.0.0a2/tests/test_model_probing.py +259 -0
- wagent_framework-2.0.0a2/tests/test_model_routing.py +145 -0
- wagent_framework-2.0.0a2/tests/test_model_testing.py +139 -0
- wagent_framework-2.0.0a2/tests/test_model_types.py +97 -0
- wagent_framework-2.0.0a2/tests/test_observability.py +29 -0
- wagent_framework-2.0.0a2/tests/test_openai_compatible_provider.py +342 -0
- wagent_framework-2.0.0a2/tests/test_package_integrity.py +16 -0
- wagent_framework-2.0.0a2/tests/test_pricing.py +71 -0
- wagent_framework-2.0.0a2/tests/test_react_agent.py +785 -0
- wagent_framework-2.0.0a2/tests/test_sandbox.py +256 -0
- wagent_framework-2.0.0a2/tests/test_sandbox_runtime.py +302 -0
- wagent_framework-2.0.0a2/tests/test_sessions.py +163 -0
- wagent_framework-2.0.0a2/tests/test_timeout.py +43 -0
- wagent_framework-2.0.0a2/tests/test_tool_adapters.py +273 -0
- wagent_framework-2.0.0a2/tests/test_tool_loading.py +41 -0
- wagent_framework-2.0.0a2/tests/test_tool_runtime.py +162 -0
- wagent_framework-2.0.0a2/tests/test_tui.py +265 -0
- wagent_framework-2.0.0a2/tests/test_workflow_adapters.py +156 -0
- wagent_framework-2.0.0a2/tests/test_workflow_engine.py +322 -0
- wagent_framework-2.0.0a2/w_agent/__init__.py +795 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/w_agent/__main__.py +13 -4
- wagent_framework-2.0.0a2/w_agent/agents/__init__.py +61 -0
- wagent_framework-2.0.0a2/w_agent/agents/persistence.py +687 -0
- wagent_framework-2.0.0a2/w_agent/agents/react.py +1041 -0
- wagent_framework-2.0.0a2/w_agent/agents/templates.py +93 -0
- wagent_framework-2.0.0a2/w_agent/agents/types.py +345 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/w_agent/aop/proxy_factory.py +17 -17
- wagent_framework-2.0.0a2/w_agent/cli.py +1123 -0
- wagent_framework-2.0.0a2/w_agent/compat.py +87 -0
- wagent_framework-2.0.0a2/w_agent/compositions.py +348 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/w_agent/config/dynamic_config.py +6 -2
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/w_agent/container/bean_factory.py +250 -131
- wagent_framework-2.0.0a2/w_agent/core/decorators.py +245 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/w_agent/core/doctor.py +26 -19
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/w_agent/deployment/fastapi_depends.py +9 -7
- wagent_framework-2.0.0a2/w_agent/evaluation.py +430 -0
- wagent_framework-2.0.0a2/w_agent/kernel/__init__.py +73 -0
- wagent_framework-2.0.0a2/w_agent/kernel/events.py +124 -0
- wagent_framework-2.0.0a2/w_agent/kernel/exceptions.py +33 -0
- wagent_framework-2.0.0a2/w_agent/kernel/loading.py +81 -0
- wagent_framework-2.0.0a2/w_agent/kernel/plugins.py +518 -0
- wagent_framework-2.0.0a2/w_agent/kernel/registry.py +240 -0
- wagent_framework-2.0.0a2/w_agent/kernel/scope.py +93 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/w_agent/lifecycle/graceful_shutdown.py +6 -3
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/w_agent/lifecycle/manager.py +38 -37
- wagent_framework-2.0.0a2/w_agent/local_runtime.py +608 -0
- wagent_framework-2.0.0a2/w_agent/models/__init__.py +226 -0
- wagent_framework-2.0.0a2/w_agent/models/errors.py +38 -0
- wagent_framework-2.0.0a2/w_agent/models/http_provider.py +497 -0
- wagent_framework-2.0.0a2/w_agent/models/invocation.py +583 -0
- wagent_framework-2.0.0a2/w_agent/models/native_mappings.py +948 -0
- wagent_framework-2.0.0a2/w_agent/models/openai_compatible.py +767 -0
- wagent_framework-2.0.0a2/w_agent/models/pricing.py +198 -0
- wagent_framework-2.0.0a2/w_agent/models/probing.py +682 -0
- wagent_framework-2.0.0a2/w_agent/models/provider.py +123 -0
- wagent_framework-2.0.0a2/w_agent/models/routing.py +408 -0
- wagent_framework-2.0.0a2/w_agent/models/templates.py +432 -0
- wagent_framework-2.0.0a2/w_agent/models/types.py +395 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/w_agent/observability/logging.py +44 -31
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/w_agent/observability/metrics.py +37 -23
- wagent_framework-2.0.0a2/w_agent/resilience/bulkhead.py +52 -0
- wagent_framework-2.0.0a2/w_agent/resilience/timeout.py +56 -0
- wagent_framework-2.0.0a2/w_agent/sandbox/__init__.py +46 -0
- wagent_framework-2.0.0a2/w_agent/sandbox/docker.py +253 -0
- wagent_framework-2.0.0a2/w_agent/sandbox/process.py +149 -0
- wagent_framework-2.0.0a2/w_agent/sandbox/registry.py +64 -0
- wagent_framework-2.0.0a2/w_agent/sandbox/types.py +142 -0
- wagent_framework-2.0.0a2/w_agent/sandbox/unsafe_local.py +130 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/w_agent/scanner/cache.py +6 -6
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/w_agent/scanner/parallel_scanner.py +31 -9
- wagent_framework-2.0.0a2/w_agent/sessions.py +564 -0
- wagent_framework-2.0.0a2/w_agent/skills/sandbox/nsjail_sandbox.py +174 -0
- wagent_framework-2.0.0a2/w_agent/skills/sandbox/wasm_sandbox.py +259 -0
- wagent_framework-2.0.0a2/w_agent/testing/__init__.py +21 -0
- wagent_framework-2.0.0a2/w_agent/testing/model_provider.py +570 -0
- wagent_framework-2.0.0a2/w_agent/tools/__init__.py +139 -0
- wagent_framework-2.0.0a2/w_agent/tools/command_adapter.py +168 -0
- wagent_framework-2.0.0a2/w_agent/tools/execution.py +319 -0
- wagent_framework-2.0.0a2/w_agent/tools/http_adapter.py +217 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/w_agent/tools/langchain_adapter.py +122 -122
- wagent_framework-2.0.0a2/w_agent/tools/loading.py +56 -0
- wagent_framework-2.0.0a2/w_agent/tools/mcp_adapter.py +135 -0
- wagent_framework-2.0.0a2/w_agent/tools/mcp_client.py +870 -0
- wagent_framework-2.0.0a2/w_agent/tools/policies.py +97 -0
- wagent_framework-2.0.0a2/w_agent/tools/python.py +94 -0
- wagent_framework-2.0.0a2/w_agent/tools/registry.py +101 -0
- wagent_framework-2.0.0a2/w_agent/tools/sandbox_adapter.py +62 -0
- wagent_framework-2.0.0a2/w_agent/tools/types.py +166 -0
- wagent_framework-2.0.0a2/w_agent/tui.py +545 -0
- wagent_framework-2.0.0a2/w_agent/workflows/__init__.py +76 -0
- wagent_framework-2.0.0a2/w_agent/workflows/adapters.py +252 -0
- wagent_framework-2.0.0a2/w_agent/workflows/engine.py +441 -0
- wagent_framework-2.0.0a2/w_agent/workflows/persistence.py +363 -0
- wagent_framework-2.0.0a2/w_agent/workflows/registry.py +73 -0
- wagent_framework-2.0.0a2/w_agent/workflows/types.py +304 -0
- wagent_framework-2.0.0a2/wagent_framework.egg-info/PKG-INFO +262 -0
- wagent_framework-2.0.0a2/wagent_framework.egg-info/SOURCES.txt +160 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/wagent_framework.egg-info/entry_points.txt +1 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/wagent_framework.egg-info/requires.txt +16 -1
- wagent_framework-1.5.2/PKG-INFO +0 -716
- wagent_framework-1.5.2/README.md +0 -656
- wagent_framework-1.5.2/tests/test_container.py +0 -109
- wagent_framework-1.5.2/tests/test_sandbox.py +0 -68
- wagent_framework-1.5.2/w_agent/__init__.py +0 -85
- wagent_framework-1.5.2/w_agent/cli.py +0 -108
- wagent_framework-1.5.2/w_agent/core/decorators.py +0 -138
- wagent_framework-1.5.2/w_agent/resilience/bulkhead.py +0 -92
- wagent_framework-1.5.2/w_agent/resilience/timeout.py +0 -17
- wagent_framework-1.5.2/w_agent/skills/sandbox/nsjail_sandbox.py +0 -174
- wagent_framework-1.5.2/w_agent/skills/sandbox/wasm_sandbox.py +0 -242
- wagent_framework-1.5.2/w_agent/testing/__init__.py +0 -0
- wagent_framework-1.5.2/w_agent/tools/__init__.py +0 -0
- wagent_framework-1.5.2/wagent_framework.egg-info/PKG-INFO +0 -716
- wagent_framework-1.5.2/wagent_framework.egg-info/SOURCES.txt +0 -72
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/LICENSE +0 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/setup.cfg +0 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/tests/test.py +0 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/tests/test_config.py +0 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/tests/test_distributed_lock.py +0 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/tests/test_event_bus.py +0 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/tests/test_scanner.py +0 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/w_agent/aop/__init__.py +0 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/w_agent/aop/aspects.py +0 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/w_agent/aop/joinpoint.py +0 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/w_agent/aop/pointcut.py +0 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/w_agent/config/__init__.py +0 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/w_agent/container/__init__.py +0 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/w_agent/container/reflection_cache.py +0 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/w_agent/core/__init__.py +0 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/w_agent/core/agent.py +0 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/w_agent/core/event_bus.py +0 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/w_agent/deployment/__init__.py +0 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/w_agent/distributed/__init__.py +0 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/w_agent/distributed/lock.py +0 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/w_agent/distributed/lock_pool.py +0 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/w_agent/exceptions/__init__.py +0 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/w_agent/exceptions/framework_errors.py +0 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/w_agent/lifecycle/__init__.py +0 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/w_agent/lifecycle/order.py +0 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/w_agent/migration/__init__.py +0 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/w_agent/migration/migrate_previous.py +0 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/w_agent/observability/__init__.py +0 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/w_agent/observability/health.py +0 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/w_agent/observability/tracing.py +0 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/w_agent/resilience/__init__.py +0 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/w_agent/scanner/__init__.py +0 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/w_agent/security/__init__.py +0 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/w_agent/security/mcp_auth.py +0 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/w_agent/skills/__init__.py +0 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/w_agent/skills/sandbox/__init__.py +0 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/w_agent/skills/signature.py +0 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/w_agent/skills/skill.py +0 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/w_agent/testing/mock_utils.py +0 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/wagent_framework.egg-info/dependency_links.txt +0 -0
- {wagent_framework-1.5.2 → wagent_framework-2.0.0a2}/wagent_framework.egg-info/top_level.txt +0 -0
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: wagent-framework
|
|
3
|
+
Version: 2.0.0a2
|
|
4
|
+
Summary: Open, composable Python framework for building agents
|
|
5
|
+
Home-page: https://github.com/LuckyStar2456/W-Agent-FrameWork
|
|
6
|
+
Author: LuckyStar2456
|
|
7
|
+
Author-email: lucky_star_2456@example.com
|
|
8
|
+
License: MIT
|
|
9
|
+
Project-URL: Bug Reports, https://github.com/LuckyStar2456/W-Agent-FrameWork/issues
|
|
10
|
+
Project-URL: Source, https://github.com/LuckyStar2456/W-Agent-FrameWork
|
|
11
|
+
Keywords: agent framework AOP IOC sandbox
|
|
12
|
+
Classifier: Development Status :: 3 - Alpha
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
18
|
+
Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
|
|
19
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
20
|
+
Requires-Python: >=3.11
|
|
21
|
+
Description-Content-Type: text/markdown
|
|
22
|
+
License-File: LICENSE
|
|
23
|
+
Requires-Dist: pydantic
|
|
24
|
+
Requires-Dist: structlog
|
|
25
|
+
Requires-Dist: cryptography
|
|
26
|
+
Requires-Dist: msgpack
|
|
27
|
+
Requires-Dist: zstandard
|
|
28
|
+
Requires-Dist: pyjwt
|
|
29
|
+
Requires-Dist: asgiref
|
|
30
|
+
Requires-Dist: redis
|
|
31
|
+
Requires-Dist: packaging>=23
|
|
32
|
+
Requires-Dist: pyyaml>=6
|
|
33
|
+
Requires-Dist: typer<1,>=0.12
|
|
34
|
+
Requires-Dist: rich<15,>=13
|
|
35
|
+
Provides-Extra: fastapi
|
|
36
|
+
Requires-Dist: fastapi; extra == "fastapi"
|
|
37
|
+
Requires-Dist: uvicorn; extra == "fastapi"
|
|
38
|
+
Provides-Extra: langchain
|
|
39
|
+
Requires-Dist: langchain; extra == "langchain"
|
|
40
|
+
Provides-Extra: models
|
|
41
|
+
Requires-Dist: httpx<1,>=0.27; extra == "models"
|
|
42
|
+
Provides-Extra: mcp
|
|
43
|
+
Requires-Dist: httpx<1,>=0.27; extra == "mcp"
|
|
44
|
+
Provides-Extra: tui
|
|
45
|
+
Requires-Dist: textual<9,>=0.70; extra == "tui"
|
|
46
|
+
Provides-Extra: wasm
|
|
47
|
+
Requires-Dist: wasmer-sdk<0.2,>=0.1.2; platform_system != "Windows" and extra == "wasm"
|
|
48
|
+
Provides-Extra: opentelemetry
|
|
49
|
+
Requires-Dist: opentelemetry-api; extra == "opentelemetry"
|
|
50
|
+
Requires-Dist: opentelemetry-sdk; extra == "opentelemetry"
|
|
51
|
+
Requires-Dist: opentelemetry-exporter-otlp; extra == "opentelemetry"
|
|
52
|
+
Provides-Extra: testing
|
|
53
|
+
Requires-Dist: pytest; extra == "testing"
|
|
54
|
+
Requires-Dist: pytest-asyncio; extra == "testing"
|
|
55
|
+
Dynamic: author
|
|
56
|
+
Dynamic: author-email
|
|
57
|
+
Dynamic: classifier
|
|
58
|
+
Dynamic: description
|
|
59
|
+
Dynamic: description-content-type
|
|
60
|
+
Dynamic: home-page
|
|
61
|
+
Dynamic: keywords
|
|
62
|
+
Dynamic: license
|
|
63
|
+
Dynamic: license-file
|
|
64
|
+
Dynamic: project-url
|
|
65
|
+
Dynamic: provides-extra
|
|
66
|
+
Dynamic: requires-dist
|
|
67
|
+
Dynamic: requires-python
|
|
68
|
+
Dynamic: summary
|
|
69
|
+
|
|
70
|
+
# W-Agent
|
|
71
|
+
|
|
72
|
+
[English](./README_EN.md) | 简体中文
|
|
73
|
+
|
|
74
|
+
W-Agent 是一个面向本地开发者的 Python 开源 Agent 开发框架。它的目标不是提供托管平台或固定 Harness,而是提供稳定、可扩展的协议与可自由装配的模块,让开发者能够替换模型、路由、Agent Loop、Workflow、工具、状态、沙箱和界面实现。
|
|
75
|
+
|
|
76
|
+
当前稳定发布版本是 `1.5.2`,最新 Alpha 为 `2.0.0a2`。1.x 工程底座继续保留,微内核、模型、工具、单 Agent 与本地 Workflow 基础已经实现,其余下一代能力按路线图分阶段交付。文档使用明确状态标记,避免把规划能力描述为现有能力。
|
|
77
|
+
|
|
78
|
+
## 状态标记
|
|
79
|
+
|
|
80
|
+
| 标记 | 含义 |
|
|
81
|
+
|---|---|
|
|
82
|
+
| `Implemented` | 源码已经存在,并有相应测试或可执行入口 |
|
|
83
|
+
| `Planned` | 已决定实现,已进入明确路线图 |
|
|
84
|
+
| `Reserved` | 协议或扩展点会保留,但尚未承诺实现版本 |
|
|
85
|
+
| `Experimental` | 可以试用,但接口与行为可能变化 |
|
|
86
|
+
| `Deprecated` | 仅为迁移保留,不再扩展 |
|
|
87
|
+
|
|
88
|
+
## 项目定位
|
|
89
|
+
|
|
90
|
+
W-Agent 遵循以下原则:
|
|
91
|
+
|
|
92
|
+
- 核心协议稳定且可扩展,具体策略全部可替换。
|
|
93
|
+
- 内置实现只使用公开扩展接口,不享有私有能力。
|
|
94
|
+
- 显式 Python 装配、装饰器、配置文件和 Python entry point 最终进入同一个注册表。
|
|
95
|
+
- Agent Loop 与 Workflow 互通但不强行合并。
|
|
96
|
+
- 本地开发优先,不内置租户、计费或托管控制面。
|
|
97
|
+
- 默认执行不可信代码时使用沙箱;宿主机执行必须由用户明确授权。
|
|
98
|
+
- 已实现、计划实现和仅保留设计的能力必须在文档中区分。
|
|
99
|
+
|
|
100
|
+
## 当前能力
|
|
101
|
+
|
|
102
|
+
以下能力在 1.5.2 源码中为 `Implemented`:
|
|
103
|
+
|
|
104
|
+
- `BaseAgent.arun()` 基础抽象。
|
|
105
|
+
- IOC 容器、组件扫描、生命周期与依赖注入。
|
|
106
|
+
- AOP、重试、断路器、超时和舱壁隔离。
|
|
107
|
+
- 动态配置、事件总线、健康检查、日志、指标和链路追踪。
|
|
108
|
+
- Wasm 与 nsjail 技能沙箱,后端不可用时失败关闭。
|
|
109
|
+
- Skill 加载、签名校验、MCP JWT 认证、Redis 分布式锁。
|
|
110
|
+
- LangChain 工具适配、FastAPI 示例集成和测试辅助设施。
|
|
111
|
+
|
|
112
|
+
以下 Phase 1 能力在当前 `2.0.0a2` 源码中为 `Implemented`:
|
|
113
|
+
|
|
114
|
+
- `PluginSpec`、装饰器、YAML 引用与 Python entry point 发现。
|
|
115
|
+
- 统一、版本感知、分作用域的能力注册表与不可变快照。
|
|
116
|
+
- 插件依赖解析、生命周期、失败回滚、级联卸载和可撤销注册。
|
|
117
|
+
- `Application → Workspace → Session → Agent → Run → Step` 作用域。
|
|
118
|
+
- `publish`、`first`、`serial` 和 `pipeline` 事件模式。
|
|
119
|
+
|
|
120
|
+
以下 Phase 2A 能力在当前源码中也为 `Implemented`:
|
|
121
|
+
|
|
122
|
+
- Provider 中立的消息、能力、请求、响应和严格流事件协议。
|
|
123
|
+
- 统一 `ModelRegistry`、可替换 `ModelProvider` 和协作式取消令牌。
|
|
124
|
+
- 可解释的 Python 加权路由与安全 YAML 路由规则。
|
|
125
|
+
- L1 端点可达性嗅探、L2/L3 Provider 检查、显式授权的 L4/L5 主动探测、缓存和周期调度器。
|
|
126
|
+
- 严格配置化 Provider 的独立无副作用装配,以及 CLI/TUI 安全目录检查与显式授权主动生成探测。
|
|
127
|
+
- 可替换传输的 OpenAI-compatible Chat Completions Provider,适用于声明兼容接口的本地或远程服务。
|
|
128
|
+
- 可插拔的通用 HTTP 请求映射层与 JSON/SSE/NDJSON 传输。
|
|
129
|
+
- Anthropic、Gemini、Ollama、Qwen 原生模板,以及 DeepSeek、GLM、Qwen-compatible、Turbo AI/SIAM.AI 模板注册表。
|
|
130
|
+
- 同时支持完整收集和逐事件透传的 `ModelExecutor`;默认单次调用,可显式启用有界重试/故障转移,并记录不含 Prompt 的逐尝试 Token/失败审计。
|
|
131
|
+
- 注册即安全探测的 `ModelRegistrationProbeService` 与外部路由健康桥接;直接调用 `ModelRegistry.register()` 仍保持无副作用。
|
|
132
|
+
- 工具 Definition/Binding/Registry 分层、Python/HTTP/无 Shell 命令模板、MCP 绑定与 2026-07-28 stdio/Streamable HTTP 客户端、参数校验、权限/逐调用审批、超时/取消和 Prompt-free 审计。
|
|
133
|
+
- 可替换 `AgentLoop` 协议与有界单 Agent `ReactAgentLoop`,覆盖模型→工具→结果→模型闭环、严格 Token 预算、JSONL RunEvent/尝试账本记录和审批断点恢复。
|
|
134
|
+
- 应用提供的版本化价格表、普通/缓存输入与输出费用计量、失败关闭的 Run 费用预算,以及 Session/Checkpoint/评测费用可见性。
|
|
135
|
+
- 统一 `WorkflowRegistry`、可替换 `WorkflowEngineProtocol` 与 `LocalWorkflowEngine`,支持静态 DAG、状态图、Python 入口、节点事件、取消,以及内存/JSONL 节点边界暂停恢复。
|
|
136
|
+
- 统一 `SandboxProvider`/`SandboxRegistry`、Docker/OCI 生命周期后端、显式运行时授权的 `UnsafeLocalSandboxProvider`,以及受工具策略保护的 `sandbox_command_tool()`。
|
|
137
|
+
- Agent/Workflow 双向适配器,以及可完全覆盖的客服/RAG 与编码 Agent 模板。
|
|
138
|
+
- `CompositionManifest` 的确定性编码、安全预览,以及冲突安全的本地版本和别名管理。
|
|
139
|
+
- 本地 Session 创建/列表/归档、JSON 持久化、跨 Run 文本上下文与审批恢复协调。
|
|
140
|
+
- 严格本地 JSON 装配的文本 Agent CLI/TUI 运行入口,使用环境变量凭据引用、逐次调用确认、可见 Token/费用预算与计量。
|
|
141
|
+
- 确定性脚本化 Model Provider、显式授权的 JSONL 录制/顺序回放,以及本地评测运行器与脱敏 JSON 报告。
|
|
142
|
+
|
|
143
|
+
当前 `BaseAgent` 仍是简单的 1.x 抽象;`LegacyAgentAdapter` 已能把它严格桥接为文本 Workflow 节点,新的 ReAct Runtime 独立提供。专用 OpenAI Responses 与 vLLM 差异适配、模型跨流恢复、多模态/工具事件通用回放、并行或嵌套 Workflow、装配依赖安装/加载确认和完整交互 TUI 仍为 `Planned`,不能当作现成功能使用。Docker 后端已有模拟 CLI 生命周期测试,但不代表当前机器已安装或启动 Docker;厂商模板经过模拟传输测试,也不代表所有远程型号已经在线验证。
|
|
144
|
+
|
|
145
|
+
## 下一代模块图
|
|
146
|
+
|
|
147
|
+
```text
|
|
148
|
+
应用与模板 客服模板 / 编码模板 / 用户自定义装配
|
|
149
|
+
运行时 Agent Loop / Workflow / Session / Checkpoint
|
|
150
|
+
能力 Models / Router / Tools / RAG / Memory / Sandbox
|
|
151
|
+
微内核 Plugin / Registry / Lifecycle / Scope / Events
|
|
152
|
+
基础设施 Storage / Telemetry / CLI / TUI / Evaluation
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
下一代 API 直接从 `w_agent` 导出,不引入 `w_agent.v2` 命名空间。已实现的最小兼容层保留必要的 1.x Agent 复用路径。
|
|
156
|
+
|
|
157
|
+
## 安装现有版本
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
pip install wagent-framework
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
安装最新 Alpha:
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
pip install --pre wagent-framework==2.0.0a2
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
可选依赖:
|
|
170
|
+
|
|
171
|
+
```bash
|
|
172
|
+
pip install "wagent-framework[fastapi,langchain,opentelemetry]"
|
|
173
|
+
pip install "wagent-framework[models]"
|
|
174
|
+
pip install "wagent-framework[wasm]"
|
|
175
|
+
pip install "wagent-framework[tui]"
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
PyPI 1.x 支持 Python 3.9+;`2.0.0a2` 与后续 2.x Alpha 要求 Python 3.11+。
|
|
179
|
+
|
|
180
|
+
## 1.x 最小示例
|
|
181
|
+
|
|
182
|
+
```python
|
|
183
|
+
import asyncio
|
|
184
|
+
|
|
185
|
+
from w_agent import AgentComponent, BaseAgent, BeanFactory
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
@AgentComponent(name="hello_agent")
|
|
189
|
+
class HelloAgent(BaseAgent):
|
|
190
|
+
async def arun(self, prompt: str) -> str:
|
|
191
|
+
return f"Hello, {prompt}!"
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
async def main() -> None:
|
|
195
|
+
factory = BeanFactory()
|
|
196
|
+
factory.register_bean("hello_agent", HelloAgent())
|
|
197
|
+
agent = await factory.get_bean("hello_agent")
|
|
198
|
+
print(await agent.arun("W-Agent"))
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
asyncio.run(main())
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
这段代码只展示 1.x 兼容用法,不会自动接入新的 ReAct、模型或工具运行时。
|
|
205
|
+
|
|
206
|
+
## 本地开发体验
|
|
207
|
+
|
|
208
|
+
当前源码已提供:
|
|
209
|
+
|
|
210
|
+
```text
|
|
211
|
+
wagent init
|
|
212
|
+
wagent profile list
|
|
213
|
+
wagent probe <endpoint>
|
|
214
|
+
wagent provider-probe --mode safe|active|capability [--confirm-active-probe]
|
|
215
|
+
wagent doctor
|
|
216
|
+
wagent tui
|
|
217
|
+
wagent composition export
|
|
218
|
+
wagent composition inspect|save|list
|
|
219
|
+
wagent session create|list|show|archive|unarchive
|
|
220
|
+
wagent run "hello" --confirm-model-call --json
|
|
221
|
+
wagent evaluate cases.json --confirm-model-call --report report.json
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
CLI 和 TUI 只调用公开 Python API。当前 CLI/TUI 基础标记为 `Experimental`:已覆盖初始化、模板列表、安全/主动端点探测、装配管理/离线预览、本地 Session 生命周期、需逐次确认的配置化 Agent 运行与 Token 汇总、Agent Checkpoint 脱敏列表,以及 CLI 的 Catalog 工具选择、独立代码加载确认、权限授予、精确 Call ID 审批恢复和 CLI/TUI 隐私安全本地评测;TUI 工具批准执行、通用插件操作、Workflow Checkpoint 汇总和实时事件查看仍为 `Planned`。
|
|
225
|
+
|
|
226
|
+
## 工程装配分享
|
|
227
|
+
|
|
228
|
+
`Implemented`:开发者可以给框架装配命名和版本化,导出为可复制编码,并在无网络、无导入、无执行的阶段完成校验和风险预览。本地 Store 支持多版本与别名且拒绝静默覆盖冲突内容。依赖安装和插件加载确认仍为 `Planned`。
|
|
229
|
+
|
|
230
|
+
装配编码只携带可移植清单,不携带密钥,不默认打包任意源码,也不会在导入时自动执行不可信插件。详细设计见[工程装配分享](./docs/project-sharing.md)。
|
|
231
|
+
|
|
232
|
+
## 文档
|
|
233
|
+
|
|
234
|
+
- [文档索引](./docs/README.md)
|
|
235
|
+
- [架构设计](./docs/architecture.md)
|
|
236
|
+
- [路线图与能力状态](./docs/roadmap.md)
|
|
237
|
+
- [使用指南](./docs/guide.md)
|
|
238
|
+
- [开发者指南](./docs/developer.md)
|
|
239
|
+
- [API 状态与规划](./docs/api.md)
|
|
240
|
+
- [插件系统](./docs/plugin-system.md)
|
|
241
|
+
- [模型、路由与接口探测](./docs/model-routing.md)
|
|
242
|
+
- [HTTP Provider 与厂商模板](./docs/provider-templates.md)
|
|
243
|
+
- [工具注册、策略与执行](./docs/tools.md)
|
|
244
|
+
- [Agent Runtime 与 ReAct Loop](./docs/agents.md)
|
|
245
|
+
- [Session 生命周期与跨 Run 上下文](./docs/sessions.md)
|
|
246
|
+
- [本地配置化 Agent Runtime](./docs/local-runtime.md)
|
|
247
|
+
- [Workflow 与节点恢复](./docs/workflows.md)
|
|
248
|
+
- [沙箱与本地执行](./docs/sandbox.md)
|
|
249
|
+
- [CLI 与 TUI](./docs/tui.md)
|
|
250
|
+
- [本地测试、模型回放与评测](./docs/testing-evaluation.md)
|
|
251
|
+
- [1.x 迁移](./docs/migration-1x.md)
|
|
252
|
+
|
|
253
|
+
## 明确不做
|
|
254
|
+
|
|
255
|
+
- 不提供 W-Agent 托管平台或云控制面。
|
|
256
|
+
- 首版不内置租户、组织、计费和 SaaS 管理系统。
|
|
257
|
+
- 不把某一种 ReAct、Workflow 或模型协议写死为唯一实现。
|
|
258
|
+
- 不在未经确认的情况下自动安装、升级或执行第三方插件。
|
|
259
|
+
|
|
260
|
+
## 许可证
|
|
261
|
+
|
|
262
|
+
本项目采用 [MIT 许可证](./LICENSE)。
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
# W-Agent
|
|
2
|
+
|
|
3
|
+
[English](./README_EN.md) | 简体中文
|
|
4
|
+
|
|
5
|
+
W-Agent 是一个面向本地开发者的 Python 开源 Agent 开发框架。它的目标不是提供托管平台或固定 Harness,而是提供稳定、可扩展的协议与可自由装配的模块,让开发者能够替换模型、路由、Agent Loop、Workflow、工具、状态、沙箱和界面实现。
|
|
6
|
+
|
|
7
|
+
当前稳定发布版本是 `1.5.2`,最新 Alpha 为 `2.0.0a2`。1.x 工程底座继续保留,微内核、模型、工具、单 Agent 与本地 Workflow 基础已经实现,其余下一代能力按路线图分阶段交付。文档使用明确状态标记,避免把规划能力描述为现有能力。
|
|
8
|
+
|
|
9
|
+
## 状态标记
|
|
10
|
+
|
|
11
|
+
| 标记 | 含义 |
|
|
12
|
+
|---|---|
|
|
13
|
+
| `Implemented` | 源码已经存在,并有相应测试或可执行入口 |
|
|
14
|
+
| `Planned` | 已决定实现,已进入明确路线图 |
|
|
15
|
+
| `Reserved` | 协议或扩展点会保留,但尚未承诺实现版本 |
|
|
16
|
+
| `Experimental` | 可以试用,但接口与行为可能变化 |
|
|
17
|
+
| `Deprecated` | 仅为迁移保留,不再扩展 |
|
|
18
|
+
|
|
19
|
+
## 项目定位
|
|
20
|
+
|
|
21
|
+
W-Agent 遵循以下原则:
|
|
22
|
+
|
|
23
|
+
- 核心协议稳定且可扩展,具体策略全部可替换。
|
|
24
|
+
- 内置实现只使用公开扩展接口,不享有私有能力。
|
|
25
|
+
- 显式 Python 装配、装饰器、配置文件和 Python entry point 最终进入同一个注册表。
|
|
26
|
+
- Agent Loop 与 Workflow 互通但不强行合并。
|
|
27
|
+
- 本地开发优先,不内置租户、计费或托管控制面。
|
|
28
|
+
- 默认执行不可信代码时使用沙箱;宿主机执行必须由用户明确授权。
|
|
29
|
+
- 已实现、计划实现和仅保留设计的能力必须在文档中区分。
|
|
30
|
+
|
|
31
|
+
## 当前能力
|
|
32
|
+
|
|
33
|
+
以下能力在 1.5.2 源码中为 `Implemented`:
|
|
34
|
+
|
|
35
|
+
- `BaseAgent.arun()` 基础抽象。
|
|
36
|
+
- IOC 容器、组件扫描、生命周期与依赖注入。
|
|
37
|
+
- AOP、重试、断路器、超时和舱壁隔离。
|
|
38
|
+
- 动态配置、事件总线、健康检查、日志、指标和链路追踪。
|
|
39
|
+
- Wasm 与 nsjail 技能沙箱,后端不可用时失败关闭。
|
|
40
|
+
- Skill 加载、签名校验、MCP JWT 认证、Redis 分布式锁。
|
|
41
|
+
- LangChain 工具适配、FastAPI 示例集成和测试辅助设施。
|
|
42
|
+
|
|
43
|
+
以下 Phase 1 能力在当前 `2.0.0a2` 源码中为 `Implemented`:
|
|
44
|
+
|
|
45
|
+
- `PluginSpec`、装饰器、YAML 引用与 Python entry point 发现。
|
|
46
|
+
- 统一、版本感知、分作用域的能力注册表与不可变快照。
|
|
47
|
+
- 插件依赖解析、生命周期、失败回滚、级联卸载和可撤销注册。
|
|
48
|
+
- `Application → Workspace → Session → Agent → Run → Step` 作用域。
|
|
49
|
+
- `publish`、`first`、`serial` 和 `pipeline` 事件模式。
|
|
50
|
+
|
|
51
|
+
以下 Phase 2A 能力在当前源码中也为 `Implemented`:
|
|
52
|
+
|
|
53
|
+
- Provider 中立的消息、能力、请求、响应和严格流事件协议。
|
|
54
|
+
- 统一 `ModelRegistry`、可替换 `ModelProvider` 和协作式取消令牌。
|
|
55
|
+
- 可解释的 Python 加权路由与安全 YAML 路由规则。
|
|
56
|
+
- L1 端点可达性嗅探、L2/L3 Provider 检查、显式授权的 L4/L5 主动探测、缓存和周期调度器。
|
|
57
|
+
- 严格配置化 Provider 的独立无副作用装配,以及 CLI/TUI 安全目录检查与显式授权主动生成探测。
|
|
58
|
+
- 可替换传输的 OpenAI-compatible Chat Completions Provider,适用于声明兼容接口的本地或远程服务。
|
|
59
|
+
- 可插拔的通用 HTTP 请求映射层与 JSON/SSE/NDJSON 传输。
|
|
60
|
+
- Anthropic、Gemini、Ollama、Qwen 原生模板,以及 DeepSeek、GLM、Qwen-compatible、Turbo AI/SIAM.AI 模板注册表。
|
|
61
|
+
- 同时支持完整收集和逐事件透传的 `ModelExecutor`;默认单次调用,可显式启用有界重试/故障转移,并记录不含 Prompt 的逐尝试 Token/失败审计。
|
|
62
|
+
- 注册即安全探测的 `ModelRegistrationProbeService` 与外部路由健康桥接;直接调用 `ModelRegistry.register()` 仍保持无副作用。
|
|
63
|
+
- 工具 Definition/Binding/Registry 分层、Python/HTTP/无 Shell 命令模板、MCP 绑定与 2026-07-28 stdio/Streamable HTTP 客户端、参数校验、权限/逐调用审批、超时/取消和 Prompt-free 审计。
|
|
64
|
+
- 可替换 `AgentLoop` 协议与有界单 Agent `ReactAgentLoop`,覆盖模型→工具→结果→模型闭环、严格 Token 预算、JSONL RunEvent/尝试账本记录和审批断点恢复。
|
|
65
|
+
- 应用提供的版本化价格表、普通/缓存输入与输出费用计量、失败关闭的 Run 费用预算,以及 Session/Checkpoint/评测费用可见性。
|
|
66
|
+
- 统一 `WorkflowRegistry`、可替换 `WorkflowEngineProtocol` 与 `LocalWorkflowEngine`,支持静态 DAG、状态图、Python 入口、节点事件、取消,以及内存/JSONL 节点边界暂停恢复。
|
|
67
|
+
- 统一 `SandboxProvider`/`SandboxRegistry`、Docker/OCI 生命周期后端、显式运行时授权的 `UnsafeLocalSandboxProvider`,以及受工具策略保护的 `sandbox_command_tool()`。
|
|
68
|
+
- Agent/Workflow 双向适配器,以及可完全覆盖的客服/RAG 与编码 Agent 模板。
|
|
69
|
+
- `CompositionManifest` 的确定性编码、安全预览,以及冲突安全的本地版本和别名管理。
|
|
70
|
+
- 本地 Session 创建/列表/归档、JSON 持久化、跨 Run 文本上下文与审批恢复协调。
|
|
71
|
+
- 严格本地 JSON 装配的文本 Agent CLI/TUI 运行入口,使用环境变量凭据引用、逐次调用确认、可见 Token/费用预算与计量。
|
|
72
|
+
- 确定性脚本化 Model Provider、显式授权的 JSONL 录制/顺序回放,以及本地评测运行器与脱敏 JSON 报告。
|
|
73
|
+
|
|
74
|
+
当前 `BaseAgent` 仍是简单的 1.x 抽象;`LegacyAgentAdapter` 已能把它严格桥接为文本 Workflow 节点,新的 ReAct Runtime 独立提供。专用 OpenAI Responses 与 vLLM 差异适配、模型跨流恢复、多模态/工具事件通用回放、并行或嵌套 Workflow、装配依赖安装/加载确认和完整交互 TUI 仍为 `Planned`,不能当作现成功能使用。Docker 后端已有模拟 CLI 生命周期测试,但不代表当前机器已安装或启动 Docker;厂商模板经过模拟传输测试,也不代表所有远程型号已经在线验证。
|
|
75
|
+
|
|
76
|
+
## 下一代模块图
|
|
77
|
+
|
|
78
|
+
```text
|
|
79
|
+
应用与模板 客服模板 / 编码模板 / 用户自定义装配
|
|
80
|
+
运行时 Agent Loop / Workflow / Session / Checkpoint
|
|
81
|
+
能力 Models / Router / Tools / RAG / Memory / Sandbox
|
|
82
|
+
微内核 Plugin / Registry / Lifecycle / Scope / Events
|
|
83
|
+
基础设施 Storage / Telemetry / CLI / TUI / Evaluation
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
下一代 API 直接从 `w_agent` 导出,不引入 `w_agent.v2` 命名空间。已实现的最小兼容层保留必要的 1.x Agent 复用路径。
|
|
87
|
+
|
|
88
|
+
## 安装现有版本
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
pip install wagent-framework
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
安装最新 Alpha:
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
pip install --pre wagent-framework==2.0.0a2
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
可选依赖:
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
pip install "wagent-framework[fastapi,langchain,opentelemetry]"
|
|
104
|
+
pip install "wagent-framework[models]"
|
|
105
|
+
pip install "wagent-framework[wasm]"
|
|
106
|
+
pip install "wagent-framework[tui]"
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
PyPI 1.x 支持 Python 3.9+;`2.0.0a2` 与后续 2.x Alpha 要求 Python 3.11+。
|
|
110
|
+
|
|
111
|
+
## 1.x 最小示例
|
|
112
|
+
|
|
113
|
+
```python
|
|
114
|
+
import asyncio
|
|
115
|
+
|
|
116
|
+
from w_agent import AgentComponent, BaseAgent, BeanFactory
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
@AgentComponent(name="hello_agent")
|
|
120
|
+
class HelloAgent(BaseAgent):
|
|
121
|
+
async def arun(self, prompt: str) -> str:
|
|
122
|
+
return f"Hello, {prompt}!"
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
async def main() -> None:
|
|
126
|
+
factory = BeanFactory()
|
|
127
|
+
factory.register_bean("hello_agent", HelloAgent())
|
|
128
|
+
agent = await factory.get_bean("hello_agent")
|
|
129
|
+
print(await agent.arun("W-Agent"))
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
asyncio.run(main())
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
这段代码只展示 1.x 兼容用法,不会自动接入新的 ReAct、模型或工具运行时。
|
|
136
|
+
|
|
137
|
+
## 本地开发体验
|
|
138
|
+
|
|
139
|
+
当前源码已提供:
|
|
140
|
+
|
|
141
|
+
```text
|
|
142
|
+
wagent init
|
|
143
|
+
wagent profile list
|
|
144
|
+
wagent probe <endpoint>
|
|
145
|
+
wagent provider-probe --mode safe|active|capability [--confirm-active-probe]
|
|
146
|
+
wagent doctor
|
|
147
|
+
wagent tui
|
|
148
|
+
wagent composition export
|
|
149
|
+
wagent composition inspect|save|list
|
|
150
|
+
wagent session create|list|show|archive|unarchive
|
|
151
|
+
wagent run "hello" --confirm-model-call --json
|
|
152
|
+
wagent evaluate cases.json --confirm-model-call --report report.json
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
CLI 和 TUI 只调用公开 Python API。当前 CLI/TUI 基础标记为 `Experimental`:已覆盖初始化、模板列表、安全/主动端点探测、装配管理/离线预览、本地 Session 生命周期、需逐次确认的配置化 Agent 运行与 Token 汇总、Agent Checkpoint 脱敏列表,以及 CLI 的 Catalog 工具选择、独立代码加载确认、权限授予、精确 Call ID 审批恢复和 CLI/TUI 隐私安全本地评测;TUI 工具批准执行、通用插件操作、Workflow Checkpoint 汇总和实时事件查看仍为 `Planned`。
|
|
156
|
+
|
|
157
|
+
## 工程装配分享
|
|
158
|
+
|
|
159
|
+
`Implemented`:开发者可以给框架装配命名和版本化,导出为可复制编码,并在无网络、无导入、无执行的阶段完成校验和风险预览。本地 Store 支持多版本与别名且拒绝静默覆盖冲突内容。依赖安装和插件加载确认仍为 `Planned`。
|
|
160
|
+
|
|
161
|
+
装配编码只携带可移植清单,不携带密钥,不默认打包任意源码,也不会在导入时自动执行不可信插件。详细设计见[工程装配分享](./docs/project-sharing.md)。
|
|
162
|
+
|
|
163
|
+
## 文档
|
|
164
|
+
|
|
165
|
+
- [文档索引](./docs/README.md)
|
|
166
|
+
- [架构设计](./docs/architecture.md)
|
|
167
|
+
- [路线图与能力状态](./docs/roadmap.md)
|
|
168
|
+
- [使用指南](./docs/guide.md)
|
|
169
|
+
- [开发者指南](./docs/developer.md)
|
|
170
|
+
- [API 状态与规划](./docs/api.md)
|
|
171
|
+
- [插件系统](./docs/plugin-system.md)
|
|
172
|
+
- [模型、路由与接口探测](./docs/model-routing.md)
|
|
173
|
+
- [HTTP Provider 与厂商模板](./docs/provider-templates.md)
|
|
174
|
+
- [工具注册、策略与执行](./docs/tools.md)
|
|
175
|
+
- [Agent Runtime 与 ReAct Loop](./docs/agents.md)
|
|
176
|
+
- [Session 生命周期与跨 Run 上下文](./docs/sessions.md)
|
|
177
|
+
- [本地配置化 Agent Runtime](./docs/local-runtime.md)
|
|
178
|
+
- [Workflow 与节点恢复](./docs/workflows.md)
|
|
179
|
+
- [沙箱与本地执行](./docs/sandbox.md)
|
|
180
|
+
- [CLI 与 TUI](./docs/tui.md)
|
|
181
|
+
- [本地测试、模型回放与评测](./docs/testing-evaluation.md)
|
|
182
|
+
- [1.x 迁移](./docs/migration-1x.md)
|
|
183
|
+
|
|
184
|
+
## 明确不做
|
|
185
|
+
|
|
186
|
+
- 不提供 W-Agent 托管平台或云控制面。
|
|
187
|
+
- 首版不内置租户、组织、计费和 SaaS 管理系统。
|
|
188
|
+
- 不把某一种 ReAct、Workflow 或模型协议写死为唯一实现。
|
|
189
|
+
- 不在未经确认的情况下自动安装、升级或执行第三方插件。
|
|
190
|
+
|
|
191
|
+
## 许可证
|
|
192
|
+
|
|
193
|
+
本项目采用 [MIT 许可证](./LICENSE)。
|
|
@@ -3,13 +3,13 @@ import os
|
|
|
3
3
|
|
|
4
4
|
# 读取README.md作为长描述
|
|
5
5
|
here = os.path.abspath(os.path.dirname(__file__))
|
|
6
|
-
with open(os.path.join(here,
|
|
6
|
+
with open(os.path.join(here, "README.md"), "r", encoding="utf-8") as f:
|
|
7
7
|
long_description = f.read()
|
|
8
8
|
|
|
9
9
|
setup(
|
|
10
10
|
name="wagent-framework",
|
|
11
|
-
version="
|
|
12
|
-
description="
|
|
11
|
+
version="2.0.0a2",
|
|
12
|
+
description="Open, composable Python framework for building agents",
|
|
13
13
|
long_description=long_description,
|
|
14
14
|
long_description_content_type="text/markdown",
|
|
15
15
|
url="https://github.com/LuckyStar2456/W-Agent-FrameWork",
|
|
@@ -25,32 +25,43 @@ setup(
|
|
|
25
25
|
"zstandard",
|
|
26
26
|
"pyjwt",
|
|
27
27
|
"asgiref",
|
|
28
|
-
"redis"
|
|
28
|
+
"redis",
|
|
29
|
+
"packaging>=23",
|
|
30
|
+
"pyyaml>=6",
|
|
31
|
+
"typer>=0.12,<1",
|
|
32
|
+
"rich>=13,<15",
|
|
29
33
|
],
|
|
30
34
|
extras_require={
|
|
31
35
|
"fastapi": ["fastapi", "uvicorn"],
|
|
32
36
|
"langchain": ["langchain"],
|
|
33
|
-
"
|
|
34
|
-
"
|
|
35
|
-
"
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
"
|
|
40
|
-
|
|
37
|
+
"models": ["httpx>=0.27,<1"],
|
|
38
|
+
"mcp": ["httpx>=0.27,<1"],
|
|
39
|
+
"tui": ["textual>=0.70,<9"],
|
|
40
|
+
"wasm": ["wasmer-sdk>=0.1.2,<0.2; platform_system != 'Windows'"],
|
|
41
|
+
"opentelemetry": [
|
|
42
|
+
"opentelemetry-api",
|
|
43
|
+
"opentelemetry-sdk",
|
|
44
|
+
"opentelemetry-exporter-otlp",
|
|
45
|
+
],
|
|
46
|
+
"testing": ["pytest", "pytest-asyncio"],
|
|
41
47
|
},
|
|
48
|
+
entry_points={
|
|
49
|
+
"console_scripts": [
|
|
50
|
+
"wagent=w_agent.cli:main",
|
|
51
|
+
"w-agent=w_agent.cli:main",
|
|
52
|
+
]
|
|
53
|
+
},
|
|
42
54
|
classifiers=[
|
|
43
|
-
"Development Status ::
|
|
55
|
+
"Development Status :: 3 - Alpha",
|
|
44
56
|
"Intended Audience :: Developers",
|
|
45
57
|
"License :: OSI Approved :: MIT License",
|
|
46
|
-
"Programming Language :: Python :: 3.9",
|
|
47
|
-
"Programming Language :: Python :: 3.10",
|
|
48
58
|
"Programming Language :: Python :: 3.11",
|
|
49
59
|
"Programming Language :: Python :: 3.12",
|
|
60
|
+
"Programming Language :: Python :: 3.13",
|
|
50
61
|
"Topic :: Software Development :: Libraries :: Application Frameworks",
|
|
51
|
-
"Topic :: Software Development :: Libraries :: Python Modules"
|
|
62
|
+
"Topic :: Software Development :: Libraries :: Python Modules",
|
|
52
63
|
],
|
|
53
|
-
python_requires=">=3.
|
|
64
|
+
python_requires=">=3.11",
|
|
54
65
|
keywords="agent framework AOP IOC sandbox",
|
|
55
66
|
project_urls={
|
|
56
67
|
"Bug Reports": "https://github.com/LuckyStar2456/W-Agent-FrameWork/issues",
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import pytest
|
|
2
|
+
|
|
3
|
+
from w_agent import (
|
|
4
|
+
CODING_AGENT_TEMPLATE,
|
|
5
|
+
CUSTOMER_SUPPORT_AGENT_TEMPLATE,
|
|
6
|
+
TokenBudget,
|
|
7
|
+
coding_agent,
|
|
8
|
+
customer_support_agent,
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def test_customer_support_template_is_an_editable_definition():
|
|
13
|
+
definition = customer_support_agent(
|
|
14
|
+
name="my-support",
|
|
15
|
+
model="provider/model",
|
|
16
|
+
token_budget=TokenBudget(max_total_tokens=10_000),
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
assert definition.name == "my-support"
|
|
20
|
+
assert definition.model == "provider/model"
|
|
21
|
+
assert definition.max_steps == 8
|
|
22
|
+
assert definition.token_budget == TokenBudget(max_total_tokens=10_000)
|
|
23
|
+
assert "knowledge_search" in CUSTOMER_SUPPORT_AGENT_TEMPLATE.recommended_tools
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def test_coding_template_does_not_grant_tools_or_local_execution():
|
|
27
|
+
definition = coding_agent(max_steps=3, system_prompt="custom")
|
|
28
|
+
|
|
29
|
+
assert definition.name == "coding"
|
|
30
|
+
assert definition.max_steps == 3
|
|
31
|
+
assert definition.system_prompt == "custom"
|
|
32
|
+
assert definition.extensions == {}
|
|
33
|
+
assert "sandbox_command" in CODING_AGENT_TEMPLATE.recommended_tools
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def test_template_rejects_unknown_definition_fields():
|
|
37
|
+
with pytest.raises(TypeError):
|
|
38
|
+
coding_agent(unknown_option=True)
|