Upsonic Agent Skills 深度解析:渐进式技能发现系统的完整实现指南
【免费下载链接】gpt-computer-assistantBuild autonomous AI agents in Python.项目地址: https://gitcode.com/GitHub_Trending/gp/gpt-computer-assistant
导读
本文以 documents/ai/explanation/skills/skills.md 为核心骨架,结合 src/upsonic/skills/ 的实际源码实现,完整剖析 Upsonic 的 Agent Skills(渐进式工具/指令发现)系统。你将掌握:Skill 包的组成规范(SKILL.md、scripts、references、assets)、系统提示词中技能摘要的注入机制、四个技能访问工具的调用契约、本地/内联/内置/GitHub/URL 五类加载器的用法、版本约束、依赖解析、缓存与安全防护,以及 Skills 如何与 Agent、Task、Team 深度集成。读完本文即可在自己的 Agent 中落地一套"小提示词、大知识库"的按需加载体系。
1. Skills 是什么:为 Agent 打包可发现、可加载的领域专长
在 Upsonic 中,一个Skill是一个自包含的领域专长包,可以被Agent或单个Task按需发现和加载。它由四部分组成:
| 组成 | 是否必需 | 用途 |
|---|---|---|
SKILL.md | 必需 | YAML frontmatter(name、description等)加上给 Agent 的详细指令正文 |
scripts/ | 可选 | Agent 可以读取或执行的脚本(Python、bash 等) |
references/ | 可选 | 参考文档(风格指南、速查表、OWASP 清单等) |
assets/ | 可选 | 辅助文件(模板、字体、图标、示例数据) |
整个设计遵循渐进式发现(progressive discovery)工作流:
- 浏览:Agent 仅在系统提示词中收到所有可用技能的摘要——技能名 + 一行描述 + 有哪些 scripts/references/assets;
- 加载:当 Agent 判断某技能与当前任务相关时,调用
get_skill_instructions工具加载完整的 SKILL.md 正文; - 引用/脚本/资产:按正文指引,再按需调用
get_skill_reference、get_skill_script(读取或执行)、get_skill_asset拉取真正需要的片段。
这样系统提示词始终保持精简,而背后庞大的知识库可以在恰好需要的那一刻(just-in-time)被激活。Agent 遵循的具体规则由Skills.get_system_prompt_section写入提示词:
1. Browse — review the skill summaries below 2. Load — call get_skill_instructions(skill_name) when a task matches 3. Reference — get_skill_reference for documentation 4. Scripts — get_skill_script(execute=True/False) for code除基本加载外,该包还覆盖:多种来源加载(本地文件系统、内联对象、内置库、GitHub 仓库、通用 URL 归档)、按 Agent Skills 规范校验、依赖解析、基于 embedding 的可选自动选择、内存 TTL 缓存、逐技能指标、安全引擎集成,以及 semver 风格的版本约束。
2. 目录结构与模块地图
src/upsonic/skills/ ├── __init__.py # 公共 API 再导出 ├── skill.py # Skill 数据类(纯数据容器) ├── skills.py # Skills 容器 —— 加载与调度工具 ├── validator.py # SKILL.md frontmatter 的规范校验 ├── metrics.py # SkillMetrics 数据类(逐技能计数器) ├── version.py # SkillVersion + VersionConstraint(semver) ├── cache.py # SkillCache(内存 TTL 缓存) ├── utils.py # 路径安全、shebang 解析、run_script ├── dependency.py # 依赖环检测 + 拓扑排序 ├── loader/ │ ├── __init__.py │ ├── base.py # SkillLoader ABC │ ├── local.py # LocalSkills(文件系统) │ ├── inline.py # InlineSkills(编程式) │ ├── builtin.py # BuiltinSkills(随 Upsonic 内置) │ ├── remote_base.py # RemoteSkillLoader(带缓存下载基类) │ ├── github.py # GitHubSkills(仓库 tarball) │ └── url.py # URLSkills(.tar.gz / .zip) └── builtins/ # 随 Upsonic 发布的技能 ├── code-review/ # SKILL.md + references/(owasp-top-10、severity-guide) ├──>@dataclass class Skill: name: str description: str instructions: str # SKILL.md 正文(frontmatter 之后的所有内容) source_path: str # 技能文件夹的文件系统路径 scripts: List[str] # scripts/ 下的文件名 references: List[str] # references/ 下的文件名 assets: List[str] # assets/ 下的文件名 metadata: Optional[Dict] license: Optional[str] compatibility: Optional[str] allowed_tools: Optional[List[str]] version: Optional[str] dependencies: List[str]三个辅助方法:
| 方法 | 用途 |
|---|---|
to_dict() | 序列化为字典,用于存储 / 跨进程传输 |
from_dict() | 从字典重建对象 |
__repr__ | 紧凑表示,如Skill(name='code-review', scripts=0…) |
4.Skills容器:编排中枢
skills.py 中的Skills是 Upsonic 其余部分交互的入口,职责包括:
- 加载:遍历
loaders(每个实现SkillLoader接口),同名技能冲突时后加载的覆盖先加载的(源码_load_skills会打出Duplicate skill name警告日志); - 解析依赖:
strict_deps=True时对缺失依赖和依赖环抛出异常,否则仅告警; - 提供访问器:
get_skill、get_all_skills、get_skill_names; - 生成系统提示词片段:让 LLM 能"浏览"技能;
- 生成四个工具可调用对象:供 LLM 实际加载 instructions / references / scripts / assets;
- 追踪指标:逐技能记录
load_count、reference_access_count等; - 可选能力:缓存结果、应用安全策略、通过 embedding 自动选择最相关技能。
构造函数签名(与源码 skills.py 完全一致):
Skills( loaders: List[SkillLoader], strict_deps: bool = False, cache_ttl: Optional[int] = None, # 秒;提供后启用 SkillCache on_load: Optional[Callable] = None, on_script_execute: Optional[Callable] = None, on_reference_access: Optional[Callable] = None, auto_select: bool = False, # 将提示词过滤为相关技能 max_skills: int = 5, # auto_select 开启时的上限 embedding_provider: Optional[Any] = None, policy: Optional[Any] = None, # safety_engine 策略或列表 )4.1get_system_prompt_section(task_description=None)
渲染一个带 XML 标签的区块,列出可用技能以及它们各自的 scripts/references/assets 名称,让 LLM 知道什么可以调用。当auto_select=True且提供了embedding_provider时,会通过_select_relevant_skills用余弦相似度(源码 skills.py 的_cosine_similarity,纯 Python 实现)过滤出与任务最相似的 top-max_skills个技能。示例输出:
<skills_system> ## What are Skills? Skills are packages of domain expertise … ## IMPORTANT: How to Use Skills 1. get_skill_instructions(skill_name) - Load the full instructions 2. get_skill_reference(skill_name, reference_path) - Access documentation 3. get_skill_script(skill_name, script_path, execute=False) - Read or run scripts 4. get_skill_asset(skill_name, asset_path) - Read asset files ## Available Skills <skill> <name>code-review</name> <description>Perform structured code reviews …</description> <scripts>none</scripts> <references>owasp-top-10.md, severity-guide.md</references> </skill> <skill> <name>data-analysis</name> <description>Analyze, explore, clean, and visualize datasets …</description> <scripts>profile_data.py</scripts> <references>statistical-tests-guide.md</references> </skill> … </skills_system>该结果在设置了cache_ttl时按f"system_prompt:{task_description or ''}"键缓存。提示词中还包含一条重要提醒:技能名不是可调用函数,必须使用四个技能访问工具;且references是文档而非可执行文件,仅当<scripts>列出真实脚本时才应调用get_skill_script。
4.2get_tools(prefix="")—— 四个工具可调用对象
tools = skills.get_tools() # 返回四个普通 Python 可调用对象 # 顺序:get_skill_instructions, get_skill_reference, get_skill_script, get_skill_assetprefix会改写__name__/__qualname__,避免任务级工具与 Agent 级工具命名冲突。Upsonic 对任务作用域技能使用prefix="task_"(见第 12 节)。
| 工具 | 必填参数 | 可选参数 | 返回值(JSON 字符串) |
|---|---|---|---|
get_skill_instructions | skill_name | — | {skill_name, description, instructions, available_scripts, available_references, available_assets, dependencies, version, recommended_tools?} |
get_skill_reference | skill_name, reference_path | — | {skill_name, reference_path, content} |
get_skill_script | skill_name, script_path | execute=False, args=None, timeout=30 | execute=False时:{skill_name, script_path, content};execute=True时:{stdout, stderr, returncode} |
get_skill_asset | skill_name, asset_path | — | {skill_name, asset_path, content} |
失败模式一律返回 JSON(绝不抛出异常),让 LLM 可以自行恢复:
{"error": "Skill 'foo' not found", "available_skills": "code-review,>@classmethod def merge(cls, *instances: "Skills") -> "Skills": combined: Dict[str, Skill] = {} for inst in instances: combined.update(inst._skills) return cls(loaders=[InlineSkills(list(combined.values()))])4.4 其他辅助方法
| 方法 | 说明 |
|---|---|
copy() | 浅拷贝:共享 loaders/skills,但指标全新——Team._propagate_skills用它让每个 Agent 独立计量自己 |
reload() | 清空技能字典与缓存,重新执行_load_skills(磁盘技能被编辑时可热更新) |
get_metrics() | 返回Dict[str, SkillMetrics] |
get_active_skill_metrics()/get_active_skill_tools() | 返回 Agent 实际加载过的技能的allowed_tools并集,可用于工具绑定策略 |
__len__、__contains__ | 便捷运算符 |
5. 校验:Agent Skills 规范执行
validator.py 实现公开的validate_skill_directory(path)与validate_metadata(meta, skill_dir)。返回人类可读错误列表(空列表即合法)。强制规则(对应源码 validator.py):
| 字段 | 规则 |
|---|---|
name | 非空、≤ 64 字符、小写、仅字母数字与连字符、首尾及连续不得出现连字符、必须与目录名一致(NFKC 归一化后比较) |
description | 非空、≤ 1024 字符、不得包含<或>(防止提示词注入) |
compatibility | 字符串,≤ 500 字符 |
license | 字符串 |
allowed-tools | 字符串列表 |
dependencies | 字符串列表 |
metadata | 字典 |
| frontmatter 键 | 仅允许{name, description, version, license, allowed-tools, metadata, compatibility, dependencies} |
校验器还会检查 SKILL.md 必须以---开头且 frontmatter 正确闭合(否则抛SkillParseError)。如果环境未安装pyyaml,会回退到_simple_yaml_parse,保证最小化安装也能工作。
6. 版本控制:SkillVersion+VersionConstraint
version.py 提供 semver 风格版本与复合约束:
SkillVersion.parse("1.2.3") # -> SkillVersion(1, 2, 3) VersionConstraint(">=1.0,<2").satisfies(SkillVersion(1, 4, 0)) # True每个逗号分隔段支持的运算符:>=、<=、>、<、==、!=。LocalSkills(version_constraint="…")用它过滤返回的技能——不满足约束、版本无效或无版本的技能,其处理逻辑在 local.py:无版本技能默认仍被包含,并输出 debug 日志。
7. 缓存:SkillCache
cache.py 是一个极简内存 TTL 缓存,按字符串键存储,由Skills在传入cache_ttl时创建(默认 TTL 300 秒,Skills传入时以cache_ttl为准)。缓存两类数据:
system_prompt:<task_description>——get_system_prompt_section的输出;instructions:<skill_name>——_get_skill_instructions的输出。
invalidate()清空全部条目(Skills.reload()会调用它)。
8. 安全与脚本执行:utils.py
utils.py 是安全关键模块:
| 函数 | 职责 |
|---|---|
is_safe_path(base, requested) | 解析requested并确认其停留在base内(Path.resolve()+is_relative_to),防路径穿越 |
parse_shebang(script_path) | 从#!/usr/bin/env -S node等行解析出python3、bash、node |
get_interpreter_command(name) | 将python*映射到sys.executable,从而保留当前虚拟环境 |
run_script(...) | subprocess.run+ timeout;Windows 下因无法原生执行 shebang,会先解析 shebang 再构造命令 |
read_file_safe(path) | UTF-8 读取,错误显式上抛 |
ScriptResult是一个小数据类(stdout, stderr, returncode),由run_script返回。Unix 下run_script的执行策略:有 shebang 则用映射后的解释器;.py后缀默认sys.executable;.sh/.bash默认bash;否则确保可执行位后直接执行。
9. 依赖图算法:dependency.py
dependency.py 提供三个图算法:
get_missing_dependencies(skills) -> Dict[name, [missing_dep, …]] detect_cycles(skills) -> List[List[name]] # 三色 DFS resolve_load_order(skills) -> List[name] # Kahn 拓扑排序Skills._load_skills加载完成后调用get_missing_dependencies和detect_cycles:strict_deps=True时任一问题都致命(抛SkillValidationError),否则仅记 warning。resolve_load_order面向需要按依赖顺序遍历技能的调用方,检测到环时会抛SkillValidationError并报告环路径。
10. 加载器家族:从文件系统到远程归档
10.1SkillLoader—— 唯一接口契约
loader/base.py:
class SkillLoader(abc.ABC): @abc.abstractmethod def load(self) -> List[Skill]: ...整个契约只有这一个方法。任何实现它的类都可以接入Skills(loaders=[…])。
10.2LocalSkills—— 文件系统主力加载器
loader/local.py 接受两类路径:
- 单个技能文件夹(内部直接含
SKILL.md); - 技能文件夹的父目录。
它完成 SKILL.md 的真实解析:
- 可选执行
validate_skill_directory(validate=True默认开启,开发期可关); - 用正则
^---\s*\n(.*?)\n---\s*\n?(.*)$把 frontmatter 与指令正文分开; - 用
pyyaml解析(无 pyyaml 时回退_parse_simple_frontmatter); - 从顶层
version或metadata.version读取版本; - 列出
scripts/、references/、assets/下的文件(排序、跳过隐藏文件); - 可选按
version_constraint用VersionConstraint过滤。
10.3InlineSkills—— 编程式注册
loader/inline.py 包装内存中的Skill对象列表,用于两种场景:用户代码不落盘直接注册技能;Skills.merge作为快照 loader。validate=True时通过validate_metadata执行 name/description/dependency 规则(默认False)。
10.4BuiltinSkills—— 随包内置技能
loader/builtin.py 通过importlib.resources.files(...)定位upsonic.skills.builtins/(可编辑安装与 wheel 安装均可用),然后委托给LocalSkills。skills=[…]可选过滤暴露哪些内置技能;available_skills()列出所有含SKILL.md的内置文件夹名。内置技能预校验,默认validate=False。
10.5RemoteSkillLoader—— 下载型加载器基类
loader/remote_base.py 为任何需要下载的加载器实现公共逻辑:
- 每来源独立缓存目录
~/.upsonic/skills_cache/<loader_name>/<sha256-of-source-key 前16位>/; - 通过
.cache_meta.json文件实现 TTL 新鲜度检查(默认cache_ttl=3600秒); force_refresh绕过缓存强制重新下载;- 解压后委托
LocalSkills加载。
子类只需实现_download(target_dir)与_source_key()两个抽象方法。
10.6GitHubSkills—— 从 GitHub 仓库加载
loader/github.py 下载https://api.github.com/repos/{owner}/{name}/tarball/{branch},经httpx流式读取,受_MAX_DOWNLOAD_SIZE = 100 MB守卫,仅解压path/(默认skills/)下的文件。自动识别 tarball 根前缀,跳过符号链接与含..的穿越条目;支持GITHUB_TOKEN/GH_TOKEN环境变量鉴权;skills=[…]可限制只取 tarball 内的特定技能目录。需要httpx(未安装时抛SkillDownloadError并给出安装提示)。
10.7URLSkills—— 通用 URL 归档
loader/url.py 与 GitHub 版本形态相同,但面向任意 URL 上的.tar.gz/.tgz或.zip归档。从扩展名或 zip 魔数PK\x03\x04自动识别归档类型,同样具备 100MB 上限与路径穿越/符号链接防护。
11. 内置技能一览
builtins/目录随 Upsonic 发布三个预校验技能:
| 技能 | 教给 Agent 什么 | 脚本 | 参考文档 |
|---|---|---|---|
code-review | 多维代码评审(正确性、安全性、性能…) | — | severity-guide.md、owasp-top-10.md |
data-analysis | 数据清洗、探索、统计分析、A/B 测试、沟通 | profile_data.py | statistical-tests-guide.md |
summarization | 高管/技术/研究/会议/变更日志摘要 | — | summary-templates.md |
每个 SKILL.md 都有 YAML frontmatter(name、description、metadata.version、metadata.author、metadata.tags)和以第二人称写就的详细指令(例如"在发表任何评论前通读全部代码")。例如 builtins/data-analysis/SKILL.md 明确指引 LLM 使用哪个工具调用:
- Execute `profile_data.py` with a data file path to get a quick profile … - Load `statistical-tests-guide.md` when choosing statistical tests …配套脚本 builtins/data-analysis/scripts/profile_data.py 是真实可运行的带argparseCLI 的 Python 程序——当 Agent 调用get_skill_script("data-analysis", "profile_data.py", execute=True, args=["data.csv", "--output", "json"])时,Skills经utils.run_script真正 shell 出去执行并返回 stdout/stderr/returncode。
12. 与 Upsonic 框架的集成
12.1Agent.skills
在 src/upsonic/agent/agent.py:
# Register skill tools if skills are provided if self.skills is not None: self.tools.extend(self.skills.get_tools())构造时,四个技能工具(get_skill_instructions…get_skill_asset)像普通工具一样被追加进 Agent 的工具列表。Agent.skill_metrics()暴露Skills.get_metrics()。
12.2Task.skills
Task.__init__接受可选skills参数(src/upsonic/tasks/tasks.py)。运行时 Agent 以带前缀的方式注册任务级技能工具(agent.py):
# Register task-level skill tools with prefix to avoid name collision if hasattr(task, 'skills') and task.skills is not None: tools_to_register.extend(task.skills.get_tools(prefix="task_"))这让同一个 Agent 可以同时暴露两套独立技能库(自己的 + 任务的)而不产生命名冲突——任务级版本名为task_get_skill_instructions、task_get_skill_reference等。任务还会通过Task._pickle/_unpickle用 cloudpickle 序列化技能,使其在跨进程调度中存活。
12.3 系统提示词构造
src/upsonic/agent/context_managers/system_prompt_manager.py 决定注入哪个技能摘要区:
agent_skills = getattr(self.agent, 'skills', None) task_skills = getattr(self.task, 'skills', None) if self.task else None if agent_skills is not None and task_skills is not None: from upsonic.skills import Skills merged = Skills.merge(agent_skills, task_skills) # task overrides agent skills_section = merged.get_system_prompt_section() elif agent_skills is not None: skills_section = agent_skills.get_system_prompt_section() else: skills_section = task_skills.get_system_prompt_section() if skills_section: prompt_parts.append(skills_section)这就是<skills_system>区块进入每个系统提示词的方式。
12.4Team传播
src/upsonic/team/team.py 的_propagate_skills沿团队图递归传播技能:
- 每个
Agent实体获得自己的Skills.copy()(保证逐 Agent 指标独立); - 若实体已有技能,团队用
Skills.merge(skills, entity.skills)合并(实体技能冲突时获胜); entity.add_tools(entity.skills.get_tools())在每个接收 Agent 上重新注册四个工具;- 子
Team递归处理。
12.5 Autonomous Agent
src/upsonic/agent/autonomous_agent/autonomous_agent.py 将skills参数直通底层Agent构造函数(skills=skills),因此 prebuilt 自治代理同样继承渐进式发现流程。
13. 端到端实战:从配置到技能执行
13.1 组装一个带技能的 Agent
from upsonic import Agent, Task from upsonic.skills import ( Skills, LocalSkills, BuiltinSkills, GitHubSkills, InlineSkills, Skill ) skills = Skills( loaders=[ BuiltinSkills(), # 随 Upsonic 内置 LocalSkills("/etc/team-skills"), # 团队共享文件系统 LocalSkills("./project-skills", # 项目专属 + 版本约束 version_constraint=">=1.0.0,<2.0.0"), GitHubSkills(repo="acme/skills-library", branch="main", path="skills/"), InlineSkills([ # 编程式注册 Skill(name="hello", description="Say hi politely.", instructions="Always greet the user by name.", source_path=""), ]), ], cache_ttl=600, # 缓存指令 10 分钟 strict_deps=False, auto_select=False, # 置 True + embedding_provider 可启用过滤 ) agent = Agent( model="anthropic/claude-sonnet-4-6", skills=skills, )13.2 Agent 在系统提示词中看到什么
容器通过get_system_prompt_section注入<skills_system>区块,列出每个已加载技能的摘要、可用脚本/引用/资产,以及"如何使用技能工具"的规则和 4 步渐进式发现工作流。
13.3 LLM 选中技能后发生了什么
第 1 步 Browse—— 模型阅读摘要区块。
第 2 步 Load—— 模型发出工具调用:
{"tool": "get_skill_instructions", "args": {"skill_name": "data-analysis"}}Skills._get_skill_instructions的内部流程(skills.py):
- 检查
SkillCache(键instructions:data-analysis); - 查找
Skill对象,不存在则返回带available_skills的错误 JSON; - 将技能名加入
self._active_skills(供工具绑定策略使用); - 对指令正文运行安全策略(
_validate_content),被拦截时返回{"error": "Content blocked by policy: …"}; - 记录
metrics.record_load(chars=len(result)); - 触发
on_load(name, description)回调(若配置); - 缓存并返回 JSON 字符串。
第 3 步 Reference—— 模型需要统计检验决策矩阵:
{"tool": "get_skill_reference", "args": {"skill_name": "data-analysis", "reference_path": "statistical-tests-guide.md"}}经is_safe_path针对<source_path>/references/校验,read_file_safe读取,策略检查,更新指标后以 JSON 返回。
第 4 步 Script—— 模型调用内置剖析脚本:
{"tool": "get_skill_script", "args": {"skill_name": "data-analysis", "script_path": "profile_data.py", "execute": true, "args": ["data.csv", "--output", "json"], "timeout": 30}}_get_skill_script的流程(skills.py):
- 校验
script_path在skill.scripts中; - 经
is_safe_path解析到<source_path>/scripts/下; - 调用
utils.run_script—— 解析 shebang(#!/usr/bin/env python3),把python3映射为sys.executable以复用当前虚拟环境,执行subprocess.run(..., timeout=30, cwd=skill.source_path); - 返回
{stdout, stderr, returncode}JSON; - 递增
metrics.script_execution_count;超时返回Script execution timed out after 30 seconds错误 JSON。
第 5 步 Asset—— 资产文件通过get_skill_asset(skill_name, asset_path)直接返回文件内容(模板、字体、示例 CSV 等)。
13.4 清理、可观测性与错误路径
agent.skill_metrics()返回Dict[str, dict]逐技能计数器,可用于遥测与技能策展("哪些技能配得上提示词里的位置");Skills.get_active_skill_tools()返回模型实际加载过的技能声明的allowed_tools并集,让 Upsonic 其他部分可依据技能激活状态门控其他工具;- 所有错误(技能不存在、路径非法、穿越尝试、超时、策略拦截、解释器缺失)都以 JSON 字符串返回而非抛出,LLM 可以继续对话并自我恢复;
Skills.reload()失效缓存并重跑加载器,适合磁盘技能运行时被编辑的场景;- 远程加载器按
~/.upsonic/skills_cache/<loader>/<hash>/落盘缓存,由 loader 自身的cache_ttl控制新鲜度(与Skills(cache_ttl=…)的内存提示词缓存相互独立)。
最终效果:Upsonic Agent 拥有一座可选择性取用的结构化专长库,只为实际决定使用的技能支付提示词 token 成本,而框架把加载、校验、沙箱、缓存与可观测性都从 Agent 作者那里抽走。
14. 测试验证
仓库为 Skills 系统提供了完整的测试覆盖,可作为行为契约参考:
- 单元测试:tests/unit_tests/skills/test_skills_container.py(容器初始化、多 loader 加载、后 loader 覆盖、访问器)、tests/unit_tests/skills/test_skill_loaders.py、tests/unit_tests/skills/test_skill_metrics.py;
- 冒烟测试:tests/smoke_tests/skills/ 下的
test_skill_agent_integration.py、test_skill_task_integration.py、test_skill_team_integration.py、test_skill_tool_prefixing.py(验证默认无前缀与task_前缀工具名,见 test_skill_tool_prefixing.py)、test_skill_version_filtering.py、test_skill_github_loader.py、test_skill_safety_policies.py、test_builtin_skills_agent.py等。
总结
Upsonic 的 Skills 系统用一套精炼的契约(SkillLoader.load→Skill→Skills容器 → 四个工具)实现了"小提示词 + 大知识库"的渐进式能力供给:加载器家族覆盖本地、内联、内置与远程来源;validator、is_safe_path、安全策略与超时机制共同构成安全边界;版本约束、依赖解析、TTL 缓存与逐技能指标让大规模技能库可治理、可观测。结合 Agent、Task、Team 的三级集成(前缀命名、Skills.merge、_propagate_skills),你可以把同一套技能体系平滑地从小型单 Agent 扩展到多智能体团队。
【免费下载链接】gpt-computer-assistantBuild autonomous AI agents in Python.项目地址: https://gitcode.com/GitHub_Trending/gp/gpt-computer-assistant
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考