wb-agent 0.1.0__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.
Files changed (31) hide show
  1. wb_agent-0.1.0/PKG-INFO +12 -0
  2. wb_agent-0.1.0/README.md +534 -0
  3. wb_agent-0.1.0/pyproject.toml +28 -0
  4. wb_agent-0.1.0/setup.cfg +4 -0
  5. wb_agent-0.1.0/tests/test_auto_invoke.py +241 -0
  6. wb_agent-0.1.0/tests/test_code_agent_executor.py +154 -0
  7. wb_agent-0.1.0/tests/test_context.py +156 -0
  8. wb_agent-0.1.0/tests/test_model_config_propagation.py +370 -0
  9. wb_agent-0.1.0/tests/test_prompt_shell.py +116 -0
  10. wb_agent-0.1.0/tests/test_skill_executor.py +313 -0
  11. wb_agent-0.1.0/tests/test_sync_call_llm.py +487 -0
  12. wb_agent-0.1.0/tests/test_watcher.py +120 -0
  13. wb_agent-0.1.0/wb_agent/__init__.py +248 -0
  14. wb_agent-0.1.0/wb_agent/code_agent.py +1090 -0
  15. wb_agent-0.1.0/wb_agent/core/__init__.py +0 -0
  16. wb_agent-0.1.0/wb_agent/core/auto_invoke.py +263 -0
  17. wb_agent-0.1.0/wb_agent/core/client.py +100 -0
  18. wb_agent-0.1.0/wb_agent/core/context.py +416 -0
  19. wb_agent-0.1.0/wb_agent/core/executor.py +337 -0
  20. wb_agent-0.1.0/wb_agent/core/prompt_shell.py +143 -0
  21. wb_agent-0.1.0/wb_agent/core/skill.py +65 -0
  22. wb_agent-0.1.0/wb_agent/core/watcher.py +147 -0
  23. wb_agent-0.1.0/wb_agent/dev.py +357 -0
  24. wb_agent-0.1.0/wb_agent/platform_model.py +116 -0
  25. wb_agent-0.1.0/wb_agent/runner.py +12 -0
  26. wb_agent-0.1.0/wb_agent.egg-info/PKG-INFO +12 -0
  27. wb_agent-0.1.0/wb_agent.egg-info/SOURCES.txt +29 -0
  28. wb_agent-0.1.0/wb_agent.egg-info/dependency_links.txt +1 -0
  29. wb_agent-0.1.0/wb_agent.egg-info/entry_points.txt +2 -0
  30. wb_agent-0.1.0/wb_agent.egg-info/requires.txt +8 -0
  31. wb_agent-0.1.0/wb_agent.egg-info/top_level.txt +1 -0
@@ -0,0 +1,12 @@
1
+ Metadata-Version: 2.4
2
+ Name: wb-agent
3
+ Version: 0.1.0
4
+ Summary: Workbench Agent SDK — base classes for custom agents and skills
5
+ Requires-Python: >=3.12
6
+ Requires-Dist: httpx>=0.27.0
7
+ Requires-Dist: pyyaml>=6.0
8
+ Requires-Dist: openai>=1.0.0
9
+ Provides-Extra: dev
10
+ Requires-Dist: pytest>=8.0; extra == "dev"
11
+ Requires-Dist: pytest-asyncio>=0.24; extra == "dev"
12
+ Requires-Dist: pytest-mock>=3.14; extra == "dev"
@@ -0,0 +1,534 @@
1
+ # wb-agent SDK 用户指南
2
+
3
+ 把你的项目变成 CodeAgent。
4
+
5
+ ---
6
+
7
+ ## 一、SDK 提供了什么
8
+
9
+ 安装 `wb-agent` 后,你可以从 `wb_agent` 包 import 以下内容:
10
+
11
+ ### 1. Agent 基类
12
+
13
+ | import | 用途 |
14
+ |--------|------|
15
+ | `CodeAgent` | 你的 Agent 继承这个类,实现 `run()` 方法 |
16
+ | `AgentContext` | 平台注入的运行时上下文(替代 CodeAgent 的另一种方式) |
17
+ | `BaseSkill`, `param` | 用 Python 类的方式定义 Skill(可选) |
18
+ | `AgentRunner` | `CodeAgent` 别名,向后兼容 |
19
+
20
+ ### 2. 全局函数(核心 API)
21
+
22
+ | import | 用途 |
23
+ |--------|------|
24
+ | `call_llm(prompt)` | 调用平台模型。在 `run()`、skill 脚本、测试脚本里都能用 |
25
+ | `async_call_llm(prompt)` | `call_llm` 的异步版本 |
26
+ | `call_llm_stream(prompt)` | 流式调用 LLM |
27
+ | `use_skills(message)` | 自动编排:LLM 自主选择 skill 循环调用,直到完成 |
28
+ | `use_skill(name, **params)` | 直接调用指定 skill |
29
+ | `bind_agent(agent)` | 绑定当前 agent 到上下文变量(由 `CodeAgent.__init__()` 自动调用) |
30
+ | `log(msg)` | 发送日志事件 |
31
+ | `progress(cur, total)` | 发送进度事件 |
32
+ | `send_stream(content)` | 发送流式文本 |
33
+ | `send_text(text)` | 发送最终结果(文本) |
34
+ | `send_result(dict)` | 发送最终结果(结构化) |
35
+ | `emit_usage(prompt, completion, total)` | 上报 token 用量 |
36
+ | `set_debug(True)` | 开启彩色终端日志 |
37
+
38
+ ### 3. 本地开发工具
39
+
40
+ | 命令 | 用途 |
41
+ |------|------|
42
+ | `wb-agent-dev /path/to/project` | 启动本地 Web 测试服务,自动读取 `manifest.yaml` 渲染输入界面 |
43
+ | `python -m wb_agent.dev /path/to/project` | 同上 |
44
+
45
+ `wb-agent dev` 会在浏览器中打开一个测试界面,配置模型参数和输入后点"运行",实时看到 Agent 输出。不需要部署到平台就能调试。
46
+
47
+ ### 4. 平台模型工具(测试 / 独立环境用)
48
+
49
+ | import / method | 用途 |
50
+ |--------|------|
51
+ | `agent.set_model_config(config)` | CodeAgent 方法,注入模型配置到当前进程和子进程环境 |
52
+ | `call_via_env(prompt)` | 仅靠 `AGENT_*` 环境变量调用模型 |
53
+ | `make_client()` | 从环境变量创建 OpenAI 客户端 |
54
+ | `make_bound_call_llm(config)` | 绑定配置的 call_llm 工厂 |
55
+ | `wb_agent.platform_model.env_model_config()` | 读取当前 `AGENT_*` 环境变量 |
56
+ | `wb_agent.platform_model.inject_model_env(config)` | 将配置写入 `AGENT_*` 环境变量 |
57
+
58
+ ### 5. Skill 执行器
59
+
60
+ | import | 用途 |
61
+ |--------|------|
62
+ | `SkillExecutor` | 执行器抽象基类 |
63
+ | `SkillResult` | 执行结果(stdout, stderr, exit_code) |
64
+ | `ExecutionContext` | 执行上下文(env, timeout, skill_dir) |
65
+ | `CliSkillExecutor` | 以子进程方式执行 CLI 脚本 |
66
+ | `PythonSkillExecutor` | 用 `exec()` 执行内联 Python skill |
67
+ | `PlatformToolExecutor` | 包装平台 tool._invoke() |
68
+ | `get_executor(type_name)` | 按类型名获取执行器实例 |
69
+
70
+ `register_skills()` 和 `use_skill()` 自动按 skill 类型选择对应执行器。一般不需要直接使用。
71
+
72
+ ### 6. 部署 & 其他工具
73
+
74
+ | import | 用途 |
75
+ |--------|------|
76
+ | `register_agent(...)` | 将 Agent 打包为 tar.gz 并上传到 Workbench 平台 |
77
+ | `execute_shell_commands_in_prompt(...)` | 在 skill prompt 中嵌入 shell 命令执行 |
78
+ | `ShellPermissionError` | shell 命令被拒绝时的异常类型 |
79
+
80
+ ---
81
+
82
+ ## 二、改造指南:5 步把你的项目变成 CodeAgent
83
+
84
+ ### Step 1:`pyproject.toml` — 加依赖
85
+
86
+ 如果你的项目还没有 `pyproject.toml`,新增一个:
87
+
88
+ ```toml
89
+ [project]
90
+ name = "my-agent"
91
+ version = "0.1.0"
92
+ requires-python = ">=3.12"
93
+ dependencies = ["wb-agent"]
94
+
95
+ # (本地开发时)如果 SDK 在本地路径
96
+ [tool.uv.sources]
97
+ wb-agent = { path = "../../backend/sdk", editable = true }
98
+ ```
99
+
100
+ 如果已有 `pyproject.toml`,只需要在 `dependencies` 里加一行 `"wb-agent"`。
101
+
102
+ **对照参考:** `self_agents/numina-lean-agent-main/pyproject.toml`
103
+
104
+ ---
105
+
106
+ ### Step 2:`run.py` — 创建 Agent 入口
107
+
108
+ 这是核心文件,需要新增。最小骨架:
109
+
110
+ ```python
111
+ from wb_agent import CodeAgent
112
+
113
+ class MyAgent(CodeAgent):
114
+ async def run(self):
115
+ # 1. 获取输入
116
+ prompt = self.input_message
117
+
118
+ # 2. 调 LLM 处理
119
+ result = await self.call_llm(prompt)
120
+
121
+ # 3. 返回结果
122
+ self.send_text(result)
123
+ ```
124
+
125
+ 完整版本(带 skill 注册和系统提示词):
126
+
127
+ ```python
128
+ from pathlib import Path
129
+ from wb_agent import CodeAgent, log
130
+
131
+ class MyAgent(CodeAgent):
132
+ def __init__(self):
133
+ super().__init__()
134
+ root = Path(__file__).resolve().parent
135
+ self.register_skills(str(root / "skills"))
136
+ self._load_system_prompt()
137
+
138
+ def _load_system_prompt(self):
139
+ prompt_file = Path(__file__).resolve().parent / "prompts" / "main.md"
140
+ if prompt_file.exists():
141
+ self._system_prompt = prompt_file.read_text(encoding="utf-8")
142
+
143
+ async def run(self):
144
+ prompt = self.input_message
145
+ if not prompt:
146
+ return "请输入内容"
147
+ log(f"处理输入: {prompt[:50]}...")
148
+
149
+ if self._skill_map:
150
+ # 让 LLM 自主选择 skill
151
+ result = await self.use_skills(prompt, max_iterations=10)
152
+ else:
153
+ result = await self.call_llm(prompt)
154
+
155
+ self.send_text(result)
156
+ return result
157
+ ```
158
+
159
+ **关键说明:**
160
+
161
+ | 方法 | 作用 |
162
+ |------|------|
163
+ | `self.input_message` | 从平台获取用户输入(字符串) |
164
+ | `self.input_file` | 从平台获取输入文件路径 |
165
+ | `await self.call_llm(prompt)` | 调用平台模型,返回文本 |
166
+ | `await self.use_skills(prompt)` | 让 LLM 自动选 skill 循环调用 |
167
+ | `self.send_text(text)` | 输出结果到平台 |
168
+ | `self.log(msg)` | 写日志 |
169
+
170
+ 如果你不想写 `async` 函数,有同步版:
171
+
172
+ ```python
173
+ def run(self): # 同步版 run()
174
+ result = self.call_llm_sync(...)
175
+ result = self.use_skills_sync(...)
176
+ result = self.use_skill_sync(...)
177
+ self.send_text(result)
178
+ ```
179
+
180
+ **对照参考:** `self_agents/numina-lean-agent-main/run.py`
181
+
182
+ ---
183
+
184
+ ### Step 3:`skills/` — 将你的工具函数包装成 Skill(可选)
185
+
186
+ Skill 是 LLM 可以调用的工具。有两种格式:
187
+
188
+ #### 格式 A:CLI Skill(推荐,最常用)
189
+
190
+ 需要两个文件:
191
+
192
+ **① `skills/cli/<name>.py` — 可执行脚本**
193
+
194
+ SDK 用 AST 解析脚本中的 `argparse` 参数,自动生成 LLM 的 function calling schema。
195
+
196
+ ```python
197
+ #!/usr/bin/env python3
198
+ """一个简短描述,LLM 会根据它决定何时调用。"""
199
+ import argparse
200
+
201
+ parser = argparse.ArgumentParser()
202
+ parser.add_argument("input", help="输入参数")
203
+ parser.add_argument("--verbose", action="store_true", help="详细输出")
204
+ args = parser.parse_args()
205
+
206
+ # 调用你的现有业务逻辑
207
+ # from your_module import your_func
208
+ # result = your_func(args.input)
209
+
210
+ print(result) # 标准输出作为 skill 返回值
211
+ ```
212
+
213
+ **② `skills/reference-<name>.md` — 描述文件**
214
+
215
+ ```markdown
216
+ # <name>
217
+
218
+ 一句话描述这个 skill 的用途和何时调用。
219
+ ```
220
+
221
+ **注册原理:** `register_skills("skills/")` 扫描所有 `reference-*.md`,在 `cli/` 下找同名脚本,AST 解析 `argparse.add_argument()` 定义参数。
222
+
223
+ **对照参考:** `skills/cli/bash.py` + `skills/reference-bash.md`
224
+
225
+ #### 格式 B:Python Skill(SKILL.md 新格式)
226
+
227
+ 所有定义在一个文件里:
228
+
229
+ ```markdown
230
+ ---
231
+ name: <skill-name>
232
+ description: LLM 看到的 skill 描述
233
+ parameters:
234
+ - name: input
235
+ type: string
236
+ description: 输入说明
237
+ required: true
238
+ - name: verbose
239
+ type: boolean
240
+ description: 是否详细输出
241
+ required: false
242
+ ---
243
+
244
+ ```python
245
+ def <skill-name>(input: str, verbose: bool = False) -> dict:
246
+ """函数的 docstring 不会影响 LLM,描述在 YAML 里。"""
247
+ # 调用你的现有逻辑
248
+ # from your_module import your_func
249
+ # return your_func(input)
250
+ return {"result": ...}
251
+ ```
252
+ ```
253
+
254
+ **注册原理:** SDK 解析 YAML frontmatter 获取参数 schema,提取 ` ```python ` 代码块作为 `exec()` 执行的源码。
255
+
256
+ ---
257
+
258
+ ### Step 4:测试
259
+
260
+ #### 方式一:全局函数测试(最轻量,任意环境)
261
+
262
+ ```python
263
+ # test_quick.py
264
+ import os
265
+ os.environ["AGENT_BASE_URL"] = "https://api.xxx.com/v1"
266
+ os.environ["AGENT_API_KEY"] = "sk-xxx"
267
+ os.environ["AGENT_MODEL"] = "your-model"
268
+
269
+ from wb_agent import call_llm, use_skill, set_debug
270
+
271
+ set_debug(True)
272
+
273
+ # 测试 LLM 调用
274
+ result = call_llm("你好")
275
+ print(result)
276
+
277
+ # 测试单个 skill
278
+ result = use_skill("my-skill", input="test")
279
+ print(result)
280
+ ```
281
+
282
+ #### 方式二:Agent 实例测试
283
+
284
+ ```python
285
+ # test_agent.py
286
+ import os
287
+ from run import MyAgent
288
+
289
+ agent = MyAgent()
290
+ agent.set_model_config({
291
+ "base_url": "https://api.xxx.com/v1",
292
+ "api_key": "sk-xxx",
293
+ "model_name": "your-model",
294
+ })
295
+
296
+ os.environ["PLATFORM_INPUT_MESSAGE"] = "你的测试输入"
297
+
298
+ agent.set_debug(True)
299
+ result = agent.run()
300
+ print(result)
301
+ ```
302
+
303
+ `set_model_config()` 会将配置写入 `AGENT_*` 环境变量,确保子进程 skill 也能调用同一模型。
304
+
305
+ #### 方式三:模拟平台注入测试(最贴近生产)
306
+
307
+ ```python
308
+ # test_with_fake_llm.py
309
+ import os, asyncio
310
+ from openai import AsyncOpenAI
311
+
312
+ class FakeLLM:
313
+ def __init__(self):
314
+ self.client = AsyncOpenAI(
315
+ api_key="sk-xxx",
316
+ base_url="https://api.xxx.com/v1",
317
+ )
318
+ async def invoke_llm(self, messages, tools=None, **kwargs):
319
+ r = await self.client.chat.completions.create(
320
+ model="your-model", messages=messages, tools=tools or None,
321
+ )
322
+ msg = r.choices[0].message
323
+ class _R:
324
+ content = msg.content or ""
325
+ return _R()
326
+
327
+ async def test():
328
+ from run import MyAgent
329
+ agent = MyAgent()
330
+ agent._llm = FakeLLM()
331
+ os.environ["PLATFORM_INPUT_MESSAGE"] = "测试输入"
332
+ await agent.run()
333
+
334
+ asyncio.run(test())
335
+ ```
336
+
337
+ **对照参考:** `self_agents/numina-lean-agent-main/test_local.py`
338
+
339
+ ---
340
+
341
+ ### Step 5:`manifest.yaml` — 部署到 Workbench 平台(可选)
342
+
343
+ ```yaml
344
+ name: 你的 Agent 名称
345
+ description: "简短描述"
346
+ entrypoint: "run.py"
347
+ avatar: "🤖"
348
+ max_iteration: 20
349
+ input:
350
+ type: text
351
+ output:
352
+ type: text
353
+ ```
354
+
355
+ 然后使用 SDK 的打包命令上传:
356
+
357
+ ```python
358
+ from wb_agent import register_agent
359
+ register_agent(
360
+ api_url="http://your-platform.com",
361
+ name="My Agent",
362
+ project_dir=".",
363
+ )
364
+ ```
365
+
366
+ **对照参考:** `self_agents/numina-lean-agent-main/manifest.yaml`
367
+
368
+ ---
369
+
370
+ ## 三、使用 wb-agent dev 工具
371
+
372
+ SDK 提供了一个本地开发服务,让你在浏览器中测试 Agent,不需要部署到 Workbench 平台。
373
+
374
+ ### 启动
375
+
376
+ ```bash
377
+ # 在 Agent 项目目录中
378
+ wb-agent-dev .
379
+
380
+ # 或指定目录和端口
381
+ wb-agent-dev /path/to/my-agent/ --port 8080
382
+ ```
383
+
384
+ ### 工作原理
385
+
386
+ ```
387
+ wb-agent-dev ./my-agent/
388
+
389
+ ├── 读取 manifest.yaml → 确定输入类型 (text / file)
390
+ ├── 启动 HTTP 服务 (http://localhost:8080)
391
+
392
+
393
+ ┌─────────────────────────────────────┐
394
+ │ 浏览器打开 http://localhost:8080 │
395
+ │ │
396
+ │ ┌─ 模型配置 ─────────────────┐ │
397
+ │ │ Base URL / API Key / Model │ │
398
+ │ └────────────────────────────┘ │
399
+ │ ┌─ 输入 ─────────────────────┐ │
400
+ │ │ text: textarea │ │
401
+ │ │ file: 文件选择器 │ │
402
+ │ └────────────────────────────┘ │
403
+ │ [▶ 运行] │
404
+ │ │
405
+ │ ┌─ 输出 (实时 SSE) ──────────┐ │
406
+ │ │ ℹ 正在启动... │ │
407
+ │ │ ⚙ Tool: lean_check(...) │ │
408
+ │ │ ✔ Result: ... │ │
409
+ │ └────────────────────────────┘ │
410
+ └─────────────────────────────────────┘
411
+
412
+
413
+ 后端: 生成 wrapper → 设置 AGENT_* env
414
+ → 子进程运行 run.py
415
+ → stdout JSON 事件 → SSE → 前端
416
+ ```
417
+
418
+ ### 它做了什么
419
+
420
+ | 步骤 | 说明 |
421
+ |------|------|
422
+ | 1 | 读取 `manifest.yaml`,根据 `input.type` 渲染 textarea 或文件选择器 |
423
+ | 2 | 用户填入 Base URL / API Key / Model,点运行 |
424
+ | 3 | 设置 `AGENT_*` 环境变量,生成一个临时 wrapper 脚本 |
425
+ | 4 | 子进程执行 wrapper → 导入 `run.py` → 找到 `CodeAgent` 子类 → 实例化 → 调用 `run()` |
426
+ | 5 | Agent 输出的 JSON 事件通过 SSE 实时推送到浏览器 |
427
+ | 6 | 运行结束后自动清理临时文件 |
428
+
429
+ ### 注意事项
430
+
431
+ - **不要在生产环境使用** — 仅用于本地开发调试
432
+ - `manifest.yaml` 中的 `entrypoint` 必须指向包含 `CodeAgent` 子类的文件
433
+ - 模型配置也可以在终端中通过 `AGENT_*` 环境变量预设,这样浏览器打开时自动填入
434
+
435
+ ---
436
+
437
+ ## 四、函数速查表
438
+
439
+ ### CodeAgent 方法
440
+
441
+ | 方法 | 说明 |
442
+ |------|------|
443
+ | `__init__(debug=False)` | 初始化,自动绑定全局引用 |
444
+ | `run()` | **必须重写**。Agent 主逻辑 |
445
+ | `call_llm(prompt)` | 异步调用平台 LLM |
446
+ | `call_llm_stream(prompt)` | 异步流式调用 LLM |
447
+ | `call_llm_sync(prompt)` | 同步版 call_llm |
448
+ | `use_skills(message, max_iterations=10)` | 异步 auto-invoke 循环 |
449
+ | `use_skills_sync(message, max_iterations=10)` | 同步版 use_skills |
450
+ | `use_skill(name, **params)` | 异步调用指定 skill |
451
+ | `use_skill_sync(name, **params)` | 同步版 use_skill |
452
+ | `set_model_config(config)` | 注入模型配置到进程和子进程环境 |
453
+ | `register_skills(path)` | 批量注册 skill 目录 |
454
+ | `register_skill(path)` | 注册单个 skill 目录 |
455
+ | `watch_skills(path)` | 热重载 skill |
456
+ | `list_skills()` | 列出已注册 skill |
457
+ | `set_debug(enabled=True)` | 开启/关闭调试日志 |
458
+ | `send_text(text)` | 输出纯文本结果 |
459
+ | `send_result(dict)` | 输出结构化结果 |
460
+ | `send_stream(content)` | 输出流式文本片段 |
461
+ | `send_thought(thought, ...)` | 输出思考过程 |
462
+ | `log(message, level)` | 输出日志 |
463
+ | `progress(current, total)` | 输出进度 |
464
+ | `emit_usage(p, c, t)` | 上报 token 用量 |
465
+ | `write_file(filename, content)` | 写入输出文件 |
466
+ | `write_output(filename, content)` | `write_file` 的别名 |
467
+ | `reset_conversation()` | 清空对话历史 |
468
+ | `bind_agent(agent)` | 绑定 agent 到上下文变量(全局函数能用) |
469
+
470
+ ### CodeAgent 属性
471
+
472
+ | 属性 | 说明 |
473
+ |------|------|
474
+ | `input_message` | 用户输入文本 |
475
+ | `input_file` | 用户输入文件路径 |
476
+ | `input_files` | 多文件输入路径列表 |
477
+ | `output_dir` | 输出目录路径 |
478
+ | `conversation` | 当前对话历史列表 |
479
+
480
+ ### 全局函数
481
+
482
+ | 函数 | 说明 |
483
+ |------|------|
484
+ | `call_llm(prompt)` | 调用平台模型。自动检测上下文(CodeAgent / 独立环境) |
485
+ | `async_call_llm(prompt)` | 异步版 call_llm |
486
+ | `call_llm_stream(prompt)` | 流式版 call_llm |
487
+ | `use_skills(message)` | auto-invoke 编排 |
488
+ | `use_skill(name, **params)` | 调用指定 skill |
489
+ | `bind_agent(agent)` | 绑定当前 agent 到上下文变量 |
490
+ | `log(message)` | 发送日志 |
491
+ | `progress(current, total)` | 发送进度 |
492
+ | `send_stream(content)` | 发送流式文本 |
493
+ | `send_text(text)` | 发送文本结果 |
494
+ | `send_result(dict)` | 发送结构化结果 |
495
+ | `emit_usage(p, c, t)` | 上报用量 |
496
+ | `set_debug(True)` | 开启调试输出 |
497
+
498
+ ### 环境变量
499
+
500
+ | 变量 | 说明 | 设置方 |
501
+ |------|------|--------|
502
+ | `AGENT_BASE_URL` | LLM API 地址 | `set_model_config()` 或平台注入 |
503
+ | `AGENT_API_KEY` | LLM API Key | 同上 |
504
+ | `AGENT_MODEL` | 模型名称 | 同上 |
505
+ | `PLATFORM_INPUT_MESSAGE` | 用户输入文本 | Workbench 平台 |
506
+ | `PLATFORM_INPUT_FILE` | 用户输入文件路径 | Workbench 平台 |
507
+ | `PLATFORM_INPUT_FILES` | 多文件路径(分号分隔) | Workbench 平台 |
508
+ | `PLATFORM_OUTPUT_DIR` | 输出目录 | Workbench 平台 |
509
+
510
+ ---
511
+
512
+ ### 推荐的项目结构(完整示例)
513
+
514
+ ```
515
+ my-agent/
516
+ ├── pyproject.toml # 依赖声明
517
+ ├── run.py # CodeAgent 入口
518
+ ├── manifest.yaml # 平台部署配置(可选)
519
+ ├── prompts/
520
+ │ └── main.md # 系统提示词
521
+ ├── skills/
522
+ │ ├── reference-my_tool.md # CLI skill 描述
523
+ │ ├── reference-another.md
524
+ │ ├── cli/
525
+ │ │ ├── my_tool.py # CLI skill 脚本
526
+ │ │ └── another.py
527
+ │ ├── python-skill/ # Python skill(SKILL.md 格式)
528
+ │ │ └── SKILL.md
529
+ │ └── .../
530
+ ├── tests/
531
+ │ └── test_agent.py
532
+ ├── your_module.py # 你现有的业务代码
533
+ └── ...
534
+ ```
@@ -0,0 +1,28 @@
1
+ [build-system]
2
+ requires = ["setuptools>=64.0"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "wb-agent"
7
+ version = "0.1.0"
8
+ description = "Workbench Agent SDK — base classes for custom agents and skills"
9
+ requires-python = ">=3.12"
10
+ dependencies = [
11
+ "httpx>=0.27.0",
12
+ "pyyaml>=6.0",
13
+ "openai>=1.0.0",
14
+ ]
15
+
16
+ [project.scripts]
17
+ wb-agent-dev = "wb_agent.dev:main"
18
+
19
+ [project.optional-dependencies]
20
+ dev = [
21
+ "pytest>=8.0",
22
+ "pytest-asyncio>=0.24",
23
+ "pytest-mock>=3.14",
24
+ ]
25
+
26
+ [tool.pytest.ini_options]
27
+ asyncio_mode = "auto"
28
+ testpaths = ["tests"]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+