news 2026/9/17 11:51:22

Upsonic Agent Skills 深度解析:渐进式技能发现系统的完整实现指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Upsonic Agent Skills 深度解析:渐进式技能发现系统的完整实现指南

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(namedescription等)加上给 Agent 的详细指令正文
scripts/可选Agent 可以读取或执行的脚本(Python、bash 等)
references/可选参考文档(风格指南、速查表、OWASP 清单等)
assets/可选辅助文件(模板、字体、图标、示例数据)

整个设计遵循渐进式发现(progressive discovery)工作流:

  1. 浏览:Agent 仅在系统提示词中收到所有可用技能的摘要——技能名 + 一行描述 + 有哪些 scripts/references/assets;
  2. 加载:当 Agent 判断某技能与当前任务相关时,调用get_skill_instructions工具加载完整的 SKILL.md 正文;
  3. 引用/脚本/资产:按正文指引,再按需调用get_skill_referenceget_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 其余部分交互的入口,职责包括:

  1. 加载:遍历loaders(每个实现SkillLoader接口),同名技能冲突时后加载的覆盖先加载的(源码_load_skills会打出Duplicate skill name警告日志);
  2. 解析依赖strict_deps=True时对缺失依赖和依赖环抛出异常,否则仅告警;
  3. 提供访问器get_skillget_all_skillsget_skill_names
  4. 生成系统提示词片段:让 LLM 能"浏览"技能;
  5. 生成四个工具可调用对象:供 LLM 实际加载 instructions / references / scripts / assets;
  6. 追踪指标:逐技能记录load_countreference_access_count等;
  7. 可选能力:缓存结果、应用安全策略、通过 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_asset

prefix会改写__name__/__qualname__,避免任务级工具与 Agent 级工具命名冲突。Upsonic 对任务作用域技能使用prefix="task_"(见第 12 节)。

工具必填参数可选参数返回值(JSON 字符串)
get_skill_instructionsskill_name{skill_name, description, instructions, available_scripts, available_references, available_assets, dependencies, version, recommended_tools?}
get_skill_referenceskill_name, reference_path{skill_name, reference_path, content}
get_skill_scriptskill_name, script_pathexecute=False, args=None, timeout=30execute=False时:{skill_name, script_path, content}execute=True时:{stdout, stderr, returncode}
get_skill_assetskill_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等行解析出python3bashnode
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_dependenciesdetect_cyclesstrict_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 的真实解析:

  1. 可选执行validate_skill_directoryvalidate=True默认开启,开发期可关);
  2. 用正则^---\s*\n(.*?)\n---\s*\n?(.*)$把 frontmatter 与指令正文分开;
  3. pyyaml解析(无 pyyaml 时回退_parse_simple_frontmatter);
  4. 从顶层versionmetadata.version读取版本;
  5. 列出scripts/references/assets/下的文件(排序、跳过隐藏文件);
  6. 可选按version_constraintVersionConstraint过滤。

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 安装均可用),然后委托给LocalSkillsskills=[…]可选过滤暴露哪些内置技能;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.mdowasp-top-10.md
data-analysis数据清洗、探索、统计分析、A/B 测试、沟通profile_data.pystatistical-tests-guide.md
summarization高管/技术/研究/会议/变更日志摘要summary-templates.md

每个 SKILL.md 都有 YAML frontmatter(namedescriptionmetadata.versionmetadata.authormetadata.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"])时,Skillsutils.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_instructionsget_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_instructionstask_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_pathskill.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.pytest_skill_task_integration.pytest_skill_team_integration.pytest_skill_tool_prefixing.py(验证默认无前缀与task_前缀工具名,见 test_skill_tool_prefixing.py)、test_skill_version_filtering.pytest_skill_github_loader.pytest_skill_safety_policies.pytest_builtin_skills_agent.py等。

总结

Upsonic 的 Skills 系统用一套精炼的契约(SkillLoader.loadSkillSkills容器 → 四个工具)实现了"小提示词 + 大知识库"的渐进式能力供给:加载器家族覆盖本地、内联、内置与远程来源;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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/17 11:50:57

TikTokDownloader TikTok作品下载失效?为什么无法下载与3步快速修复

TikTokDownloader TikTok作品下载失效&#xff1f;为什么无法下载与3步快速修复 【免费下载链接】TikTokDownloader 抖音 / TikTok 平台作品下载/数据采集工具 项目地址: https://gitcode.com/GitHub_Trending/ti/TikTokDownloader 你在 TikTokDownloader 里输入 TikTok…

作者头像 李华
网站建设 2026/9/17 11:50:57

DX12图形API渲染管线实战:25集从设备到贴图三角形

图形学和图形API这两个词&#xff0c;最近被聊得越来越多&#xff0c;但真正愿意沉下去把底层渲染管线摸透的人并不多。DX12就是那道绕不过去的坎——它把内存管理、同步、资源状态的活儿全甩给开发者&#xff0c;写起来比旧版图形API啰嗦十倍&#xff0c;可一旦跑通&#xff0…

作者头像 李华
网站建设 2026/9/17 11:49:18

职场中的性别心理学:打破刻板印象-中国心理学会心理咨询师水平评价-心理咨询师培训机构-长春心理咨询师培训机构

职场中的性别心理学&#xff1a;打破刻板印象-中国心理学会心理咨询师水平评价-心理咨询师培训机构-长春心理咨询师培训机构尽管社会在性别平等方面取得了显著进步&#xff0c;但职场中的性别偏见仍然以显性或隐性的方式存在。"女性更情绪化""男性不适合做护理工…

作者头像 李华
网站建设 2026/9/17 11:48:15

DeepSeek API实战:文件处理与图表生成的多模态应用指南

简介&#xff1a;一份面向技术开发人员的DeepSeek多模态API实战指南&#xff0c;聚焦文件处理与图表生成两大核心场景&#xff0c;系统讲解如何通过API完成本地文件读取、格式转换、数据筛选与提取&#xff0c;以及折线图、柱状图、饼图等可视化图表的生成与自定义。文档共25页…

作者头像 李华