diff --git a/skills/greeting-demo/SKILL.md b/.agents/skills/greeting-demo/SKILL.md similarity index 100% rename from skills/greeting-demo/SKILL.md rename to .agents/skills/greeting-demo/SKILL.md diff --git a/skills/python-scratchpad/SKILL.md b/.agents/skills/python-scratchpad/SKILL.md similarity index 95% rename from skills/python-scratchpad/SKILL.md rename to .agents/skills/python-scratchpad/SKILL.md index 638a0122..987a789a 100644 --- a/skills/python-scratchpad/SKILL.md +++ b/.agents/skills/python-scratchpad/SKILL.md @@ -21,7 +21,7 @@ Workflow: 1. If the task needs computation or a repeatable transformation, activate this skill. 2. If you need examples, call `read_skill_file` for `references/examples.md`. 3. Write a short Python script for the exact task. -4. Prefer `run_python_script` with the script in its `script` argument. +4. Prefer `execute_code`. 5. Use the script output in the final answer. 6. Keep scripts small and task-specific. diff --git a/skills/python-scratchpad/references/examples.md b/.agents/skills/python-scratchpad/references/examples.md similarity index 100% rename from skills/python-scratchpad/references/examples.md rename to .agents/skills/python-scratchpad/references/examples.md diff --git a/skills/rest-api-caller/SKILL.md b/.agents/skills/rest-api-caller/SKILL.md similarity index 89% rename from skills/rest-api-caller/SKILL.md rename to .agents/skills/rest-api-caller/SKILL.md index 8ee132d7..074a1747 100644 --- a/skills/rest-api-caller/SKILL.md +++ b/.agents/skills/rest-api-caller/SKILL.md @@ -1,7 +1,7 @@ --- name: rest-api-caller description: Call REST APIs from Python, parse JSON responses, and report the useful fields back to the user. -allowed-tools: run_python_script execute_code +allowed-tools: execute_code --- # REST API Caller @@ -14,14 +14,14 @@ This skill is intended for: - endpoints where the user specifies headers, query params, or environment variable names Requirements: -- The agent should have access to `run_python_script` or `execute_code`. +- The agent should have access to `execute_code`. Workflow: 1. Activate this skill when the task requires calling an API. 2. If you need examples, call `read_skill_file` for `references/examples.md`. 3. Write a short Python script that performs the request. 4. Prefer the `requests` library if available in the environment. -5. Prefer `run_python_script`; if it is unavailable, fall back to `execute_code`. +5. Prefer `execute_code`. 6. Parse the response and print only the fields needed for the final answer. 7. Summarize the API result clearly for the user. diff --git a/skills/rest-api-caller/references/examples.md b/.agents/skills/rest-api-caller/references/examples.md similarity index 100% rename from skills/rest-api-caller/references/examples.md rename to .agents/skills/rest-api-caller/references/examples.md diff --git a/docs/user_guide/en/nodes/agent.md b/docs/user_guide/en/nodes/agent.md index 8333bcbb..37485b00 100755 --- a/docs/user_guide/en/nodes/agent.md +++ b/docs/user_guide/en/nodes/agent.md @@ -33,14 +33,14 @@ The Agent node is the most fundamental node type in the DevAll platform, used to | Field | Type | Default | Description | |-------|------|---------|-------------| | `enabled` | bool | `false` | Enable Agent Skills discovery for this node | -| `allow` | list[object] | `[]` | Optional allowlist of skills from the project-level `skills/` directory; each entry uses `name` | +| `allow` | list[object] | `[]` | Optional allowlist of skills from the project-level `.agents/skills/` directory; each entry uses `name` | ### Agent Skills Notes -- Skills are discovered from the fixed project-level `skills/` directory. +- Skills are discovered from the fixed project-level `.agents/skills/` directory. - The runtime exposes two built-in skill tools: `activate_skill` and `read_skill_file`. - `read_skill_file` only works after the relevant skill has been activated. -- Skill `SKILL.md` frontmatter may include optional `allowed-tools` using the Agent Skills spec format, for example `allowed-tools: run_python_script execute_code`. +- Skill `SKILL.md` frontmatter may include optional `allowed-tools` using the Agent Skills spec format, for example `allowed-tools: execute_code`. - If a selected skill requires tools that are not bound on the node, that skill is skipped at runtime. - If no compatible skills remain, the agent is explicitly instructed not to claim skill usage. diff --git a/docs/user_guide/zh/nodes/agent.md b/docs/user_guide/zh/nodes/agent.md index 2d8d36d0..555d56d4 100755 --- a/docs/user_guide/zh/nodes/agent.md +++ b/docs/user_guide/zh/nodes/agent.md @@ -33,14 +33,14 @@ Agent 节点是 DevAll 平台中最核心的节点类型,用于调用大语言 | 字段 | 类型 | 默认值 | 说明 | |------|------|--------|------| | `enabled` | bool | `false` | 是否为该节点启用 Agent Skills | -| `allow` | list[object] | `[]` | 可选的技能白名单,来源于项目级 `skills/` 目录;每个条目使用 `name` | +| `allow` | list[object] | `[]` | 可选的技能白名单,来源于项目级 `.agents/skills/` 目录;每个条目使用 `name` | ### Agent Skills 说明 -- 技能统一从固定的项目级 `skills/` 目录中发现。 +- 技能统一从固定的项目级 `.agents/skills/` 目录中发现。 - 运行时会暴露两个内置技能工具:`activate_skill` 和 `read_skill_file`。 - `read_skill_file` 只有在对应技能已经激活后才可用。 -- 技能 `SKILL.md` 的 frontmatter 可以包含可选的 `allowed-tools`,格式遵循 Agent Skills 规范,例如 `allowed-tools: run_python_script execute_code`。 +- 技能 `SKILL.md` 的 frontmatter 可以包含可选的 `allowed-tools`,格式遵循 Agent Skills 规范,例如 `allowed-tools: execute_code`。 - 如果某个已选择技能依赖的工具没有绑定到当前节点,该技能会在运行时被跳过。 - 如果最终没有任何兼容技能可用,Agent 会被明确告知不要声称自己使用了技能。 diff --git a/entity/configs/node/skills.py b/entity/configs/node/skills.py index f27713a7..3d51e576 100644 --- a/entity/configs/node/skills.py +++ b/entity/configs/node/skills.py @@ -18,7 +18,7 @@ from entity.configs.base import ( REPO_ROOT = Path(__file__).resolve().parents[3] -DEFAULT_SKILLS_ROOT = (REPO_ROOT / "skills").resolve() +DEFAULT_SKILLS_ROOT = (REPO_ROOT / ".agents" / "skills").resolve() def _discover_default_skills() -> List[tuple[str, str]]: if not DEFAULT_SKILLS_ROOT.exists() or not DEFAULT_SKILLS_ROOT.is_dir(): return [] diff --git a/runtime/node/agent/skills/manager.py b/runtime/node/agent/skills/manager.py index 0d20c4e8..ff4a21f9 100644 --- a/runtime/node/agent/skills/manager.py +++ b/runtime/node/agent/skills/manager.py @@ -11,7 +11,7 @@ from entity.tool_spec import ToolSpec REPO_ROOT = Path(__file__).resolve().parents[4] -DEFAULT_SKILLS_ROOT = (REPO_ROOT / "skills").resolve() +DEFAULT_SKILLS_ROOT = (REPO_ROOT / ".agents" / "skills").resolve() MAX_SKILL_FILE_BYTES = 128 * 1024 @@ -126,6 +126,7 @@ class AgentSkillManager: self._skills_by_name: Dict[str, SkillMetadata] | None = None self._skill_content_cache: Dict[str, str] = {} self._activation_state: Dict[str, bool] = {} + self._current_skill_name: str | None = None self._discovery_warnings: List[str] = [] def discover(self) -> List[SkillMetadata]: @@ -176,6 +177,7 @@ class AgentSkillManager: cached = skill.skill_file.read_text(encoding="utf-8") self._skill_content_cache[skill.name] = cached self._activation_state[skill.name] = True + self._current_skill_name = skill.name return { "skill_name": skill.name, "path": str(skill.skill_file), @@ -214,10 +216,12 @@ class AgentSkillManager: return bool(self._activation_state.get(skill_name)) def active_skill(self) -> SkillMetadata | None: - for skill in self.discover(): - if self.is_activated(skill.name): - return skill - return None + if self._current_skill_name is None: + return None + skills = self._skills_by_name + if skills is None: + return None + return skills.get(self._current_skill_name) def discovery_warnings(self) -> List[str]: self.discover()