返回资源广场

Skills 资源 / 技能包

configuring-model-profiles

注册并核验两类配置档——提供方配置档控制模型怎么被构造(初始化参数注入),装具配置档控制模型造好后智能体怎么跑(系统提示后缀、工具与中间件裁剪)。Use when 想给某个提供方统一设初始化参数、要给某个型号追加调优提示、注册了配置档却发现没生效、给一家注册的配置档意外影响了别的模型、或排除中间件时报 ValueError 时。涵盖两类配置档的注册写法、两条 model 解析路径下的命中差异、离线核验手段、可剥与不可剥边界;不含换模型本身(见 swapping-agent-models)。

SKILL.md 技能文档

能力目标

会写两类配置档的注册代码、知道各自在什么条件下才命中、并能用离线手段确认它真的进了配置——而不是靠问模型「你的系统提示里有没有这句」这种不可靠的验证。

前置

  • 已能构造智能体并接入模型(见 bootstrapping-deepagents-env、swapping-agent-models)。
  • 一个必须先记住的事实:model 参数传实例时框架原样透传该对象、传字符串时框架会另行构造模型。这条分叉决定了下面两类配置档的命中与否。
  • 配置档接口当前标注为测试阶段,可能小幅变动。

实操流程

  1. 注册提供方配置档,控制模型怎么被构造。三个注入口分别是静态初始化参数、构造前的副作用钩子、运行时派生参数;注册语义是叠加合并、不是整体替换:

    from deepagents import ProviderProfile, register_provider_profile
    from deepagents._models import resolve_model
    
    register_provider_profile(
        "deepseek",
        ProviderProfile(init_kwargs={"temperature": 0}),
    )
    
    model_str = resolve_model("deepseek:deepseek-chat")
    print(model_str.temperature)   # 0.0 ← 来自配置档的初始化参数
    
  2. 让提供方配置档生效的唯一路径是字符串写法。要用它就把 model= 写成 "提供方:型号":

    agent = create_deep_agent(model="deepseek:deepseek-chat")
    

    坚持用预配置实例写法的话,就在构造函数里手动设参数,别指望这类配置档。

  3. 查一个提供方当前的内置配置档,避免被隐式默认值绊倒:

    from deepagents.profiles.provider.provider_profiles import get_provider_profile
    print(dict(get_provider_profile("openai:gpt-4o").init_kwargs))
    

    内置的 OpenAI 配置档会默认启用其新版响应接口,换到该家模型时要知道这个默认行为。

  4. 注册装具配置档,控制模型造好后智能体怎么跑。它有七个字段:系统提示后缀、整体替换基础系统提示、覆盖工具描述、排除工具、排除中间件、追加中间件、配置默认通用子智能体。键可以是提供方名,也可以是完整的「提供方:型号」:

    from deepagents import HarnessProfile, register_harness_profile
    
    register_harness_profile(
        "deepseek:deepseek-chat",
        HarnessProfile(system_prompt_suffix="[标记] 这段后缀由配置档注入。"),
    )
    

    要把配置写进配置文件就用它的声明式可序列化子集(不含追加中间件字段);要在代码里运行时注册就用全量类型。

  5. 想知道「按型号调优」到底是什么,直接把内置配置档的后缀打印出来看——它就是一段普通文本:

    from deepagents.profiles.harness._openai_codex import _SYSTEM_PROMPT_SUFFIX as CODEX_SUFFIX
    from deepagents.profiles.harness._anthropic_sonnet_4_6 import _SYSTEM_PROMPT_SUFFIX as SONNET_SUFFIX
    print(CODEX_SUFFIX)
    print(SONNET_SUFFIX)
    

    两段后缀格式不同(一段是 Markdown 分节、一段是 XML 标签),对应各模型训练时偏好的系统提示风格。

  6. 离线核验配置档是否命中,别去问模型。用查找函数直接取出该模型会拿到的配置档对象:

    from deepagents.profiles.harness.harness_profiles import _harness_profile_for_model
    profile = _harness_profile_for_model(model, None)   # 第二参为 None 即实例路径
    print(MARKER in (profile.system_prompt_suffix or ""))
    
  7. 要看行为层证据,就在后缀里放一条可观测的格式指令(例如要求输出末尾打印一个固定格式行),再做挂与不挂两组对照,比较输出差异。

校验回路

  • 提供方配置档:字符串路径构造出的模型的对应属性值等于你注册的值(如温度为 0.0)。想再加一层证据,就用温度为 0 时输出确定的特性,同一任务连跑两遍看输出是否完全一致。
  • 装具配置档:第 6 步的离线核验返回 True;再做一组挂与不挂后缀的对照,挂的一组输出里出现你埋的固定格式行、不挂的没有,且两组都正常调用了内置工具(说明差异只来自后缀)。
  • 反向对照:把同一个后缀注册到一个够不着的键上,离线核验应返回 False——这条确认你的键写对了。

常见陷阱

  • 注册成功却完全没生效:提供方配置档在实例路径下静默失效。框架解析 model 时先做类型判断,是模型实例就原样返回,注入配置档那一整段根本没机会执行。同一个注册,字符串路径下温度变成 0.0、实例路径下仍是你构造时写的 0.7。它不是「错的」,只是这条路径上不生效。
  • 以为两类配置档行为一致:装具配置档在实例路径下仍能命中——它不走模型解析那条路,而是用模型自报的提供方标识去反查注册表。两者形成非对称:一个失效、一个命中。
  • 给某一家注册的配置档意外影响了一批模型:凡是用通用 OpenAI 客户端类包装的模型,自报的提供方标识都是 openai,所以注册在这个键下的装具配置档会被所有兼容端点模型命中。要精确控制就注册到完整的「提供方:型号」键上。
  • 问模型「你的系统提示里有没有这个标记」:模型无法自省自己的系统提示,回答不可靠、同一脚本两次跑还会翻转。一律走第 6 步的离线核验。
  • 排除装具骨架中间件:文件系统与子智能体两件中间件属于骨架、不可排除,构造时会抛 ValueError 并在消息里给出替代方案。想隐藏某个工具就用排除工具字段,或把默认通用子智能体关掉,而不是去剥骨架。
  • 用替身函数拦截注入过程来验证:模块加载时已经完成导入绑定,替换原模块属性影响不到这个已绑定的引用,拦不到调用。看属性值本身比看调用日志更直观可靠。
  • 配置档生效不等于行为一定变:后缀里的指令能否被执行,还取决于底层模型的指令遵循能力。遵循能力弱的模型可能注入了也不照做。

适用范围与前置条件

  • 已能构造智能体并接入模型(见 bootstrapping-deepagents-env、swapping-agent-models)。
  • 一个必须先记住的事实:model 参数传实例时框架原样透传该对象、传字符串时框架会另行构造模型。这条分叉决定了下面两类配置档的命中与否。
  • 配置档接口当前标注为测试阶段,可能小幅变动。

怎么使用

使用步骤

  1. 注册提供方配置档,控制模型怎么被构造。三个注入口分别是静态初始化参数、构造前的副作用钩子、运行时派生参数;注册语义是叠加合并、不是整体替换:

    from deepagents import ProviderProfile, register_provider_profile
    from deepagents._models import resolve_model
    
    register_provider_profile(
        "deepseek",
        ProviderProfile(init_kwargs={"temperature": 0}),
    )
    
    model_str = resolve_model("deepseek:deepseek-chat")
    print(model_str.temperature)   # 0.0 ← 来自配置档的初始化参数
    
  2. 让提供方配置档生效的唯一路径是字符串写法。要用它就把 model= 写成 "提供方:型号":

    agent = create_deep_agent(model="deepseek:deepseek-chat")
    

    坚持用预配置实例写法的话,就在构造函数里手动设参数,别指望这类配置档。

  3. 查一个提供方当前的内置配置档,避免被隐式默认值绊倒:

    from deepagents.profiles.provider.provider_profiles import get_provider_profile
    print(dict(get_provider_profile("openai:gpt-4o").init_kwargs))
    

    内置的 OpenAI 配置档会默认启用其新版响应接口,换到该家模型时要知道这个默认行为。

  4. 注册装具配置档,控制模型造好后智能体怎么跑。它有七个字段:系统提示后缀、整体替换基础系统提示、覆盖工具描述、排除工具、排除中间件、追加中间件、配置默认通用子智能体。键可以是提供方名,也可以是完整的「提供方:型号」:

    from deepagents import HarnessProfile, register_harness_profile
    
    register_harness_profile(
        "deepseek:deepseek-chat",
        HarnessProfile(system_prompt_suffix="[标记] 这段后缀由配置档注入。"),
    )
    

    要把配置写进配置文件就用它的声明式可序列化子集(不含追加中间件字段);要在代码里运行时注册就用全量类型。

  5. 想知道「按型号调优」到底是什么,直接把内置配置档的后缀打印出来看——它就是一段普通文本:

    from deepagents.profiles.harness._openai_codex import _SYSTEM_PROMPT_SUFFIX as CODEX_SUFFIX
    from deepagents.profiles.harness._anthropic_sonnet_4_6 import _SYSTEM_PROMPT_SUFFIX as SONNET_SUFFIX
    print(CODEX_SUFFIX)
    print(SONNET_SUFFIX)
    

    两段后缀格式不同(一段是 Markdown 分节、一段是 XML 标签),对应各模型训练时偏好的系统提示风格。

  6. 离线核验配置档是否命中,别去问模型。用查找函数直接取出该模型会拿到的配置档对象:

    from deepagents.profiles.harness.harness_profiles import _harness_profile_for_model
    profile = _harness_profile_for_model(model, None)   # 第二参为 None 即实例路径
    print(MARKER in (profile.system_prompt_suffix or ""))
    
  7. 要看行为层证据,就在后缀里放一条可观测的格式指令(例如要求输出末尾打印一个固定格式行),再做挂与不挂两组对照,比较输出差异。

继续探索

全部资源
Skills 资源 / 技能包

bootstrapping-deepagents-env

在一台干净机器上装好 DeepAgents 运行环境、接入一个 OpenAI 兼容大模型凭证,并跑通第一个 create_deep_agent 工具调用闭环。Use when 需要初始化 DeepAgents 开发环境、系统 Python 版本不达标装不上包、不确定装到了哪个版本、接 DeepSeek 之类国产模型报 ImportError 或 404 这类环境层故障时。涵盖解释器版本核对、虚拟环境置备、主包与提供方包安装、版本核验、凭证注入、最小示例验收;不含 Agent 各项能力的用法(见 tracking-task-progress-with-todos 等能力型 skill)。

Skills 资源 / 技能包

inspecting-agent-graph-and-tools

把一个 create_deep_agent 建出来的智能体拆开看:列出执行图节点、列出实际挂载的工具、捕获框架预装的中间件清单、抓取每轮真正发给模型的工具集。Use when 需要确认某项能力是否真的挂上了、排查「我的工具去哪了 / 这些工具哪来的 / 内置工具到底几个」、验证自定义中间件是否进了图、或要在改配置前后做结构对照时。涵盖图节点自省、工具清单反查、中间件清单捕获、编译期与运行期工具集差异;不含具体能力的用法。

Skills 资源 / 技能包

tracking-task-progress-with-todos

让智能体把多步任务拆成结构化待办清单写进状态,并从调用结果里取出清单、渲染成实时进度、兜底检测「勾完清单却没给答案」的失败形态。Use when 需要给长任务做进度面板、想稳定触发 write_todos、发现规划没被触发、或要把 todos 推给前端 UI 与日志时。涵盖稳定触发写法、取清单的两条路径、三态进度渲染、失败形态检测;不含子任务委派(见 delegating-subtasks-to-subagents)。