Microsoft Agent Framework — Harness 装进来的那些零件,逐个拆开看
目录概述一、能力积木一览逐个看暴露的工具与状态1.1 默认启用的上下文 Provider1.2 按需启用的上下文 Provider1.3 装饰器与默认工具1.4 Loop 与 LoopEvaluator让智能体跑到满意为止1.5 工具审批别再问了到底怎么触发二、再深一层Skills / Compaction / Shell / CodeAct2.1 Skills四阶段渐进式披露2.2 Compaction不止一种策略2.3 Shell本地直跑还是容器沙箱2.4 CodeAct让模型写代码而非逐条发出工具调用三、积木之间怎么协作3.1 规划闭环AgentMode Todo Loop3.2 防丢互补FileMemory Compaction关键在读写时机3.3 无人值守安全ToolApproval Loop 危险工具的审批四、配置开关HarnessAgentOptions 速查模块的扩展性示例最小用法从 IChatClient 到成品智能体进阶用法开压缩 续跑 裁剪总结附公开 API 速查表概述基于 Microsoft Agent FrameworkMAF.NET1.11.1版本。Harness 核心类型Microsoft.Agents.AI.Harness门面以及核心包里被它装配的各 Provider——Todo / Mode / 文件 / Skills / Compaction 等均带[Experimental(MAAI001)]标记——这里的实验性指API 表面在后续版本可能调整生产使用请锁定版本不是说能力不成熟正式使用需在项目里#pragma warning disable MAAI001或在.csproj里抑制该诊断。上一篇Microsoft Agent Framework — 只有三个文件Harness 凭什么扛起一个生产级 Agent把 Harness 的骨架讲清了它是个极薄的装配层自己不造零件只负责挑选 排序 对齐并交代了装了哪些零件、按什么顺序装。这一篇接着往下钻逐个零件看每个积木给模型暴露了哪些工具、状态存在哪、有哪些档位可调、怎么裁剪、怎么扩展以及几块零件之间怎么协作。一句话承上上一篇回答装了什么、怎么装这一篇回答每个零件具体怎么用、怎么改。一、能力积木一览逐个看暴露的工具与状态上一篇给了装了哪些零件的清单这一节换个视角——逐个积木看它给模型暴露了哪些工具、状态存在哪、怎么关这是你做能力裁剪时的速查表。Provider 的状态大多存在会话的AgentSessionStateBag里、跨同一会话的多次调用保持FileAccess 是例外——它操作的是跨会话共享的目录自身不持会话状态。1.1 默认启用的上下文 Provider积木作用暴露给模型的工具关闭开关TodoProvider待办清单承载多步规划。引导模型把复杂任务拆成可追踪的 todo逐项完成/删除todos_add/todos_complete/todos_remove/todos_get_remaining/todos_get_allDisableTodoProviderAgentModeProvider模式机。默认两种模式plan交互式规划问清楚再干与execute自主执行不打扰用户。当前模式被写进系统指令mode_set/mode_getDisableAgentModeProviderFileMemoryProvider会话级文件记忆。每条记忆是一个独立文件可带_description.md摘要用于把大块数据/计划落盘避免被上下文压缩丢掉file_memory_save_file/file_memory_read_file/file_memory_delete_file/file_memory_list_files/file_memory_search_filesDisableFileMemoryFileAccessProvider共享工作目录读写。与 FileMemory 不同它操作的是跨会话、跨智能体可见的持久目录适合读输入数据、写产出物file_access_save_file/file_access_read_file/file_access_delete_file/file_access_list_files/file_access_list_subdirectories/file_access_search_filesDisableFileAccessAgentSkillsProvider渐进式技能披露Agent Skills 规范。先在系统提示里广告技能名描述再按需load_skill加载正文、read_skill_resource读资源、run_skill_script跑脚本load_skill/read_skill_resource/run_skill_scriptDisableAgentSkillsProvider几个容易混淆的点FileMemory 与 FileAccess 的区别前者是智能体的私人草稿纸每个会话在{cwd}/agent-file-memory/下开自己的{时间戳}_{guid}子目录会话隔离后者是公共工作区直接用{cwd}/working跨会话共享。一个偏记笔记防遗忘一个偏读写真实文件产物。FileAccess 全部工具默认都要审批它们都是ApprovalRequiredAIFunction。Harness 提供了两条现成的自动审批规则——ReadOnlyToolsAutoApprovalRule只放过只读工具和AllToolsAutoApprovalRule全放过配合ToolApprovalAgent使用。1.2 按需启用的上下文 Provider积木触发条件作用BackgroundAgentsProvider设置HarnessAgentOptions.BackgroundAgents把工作委派给后台子智能体并发执行。主智能体可启动任务、等待首个完成、取结果、续跑、清理。暴露background_agents_*系列工具ShellEnvironmentProvider设置HarnessAgentOptions.ShellExecutor每会话探测一次 OS / shell 家族版本 / 当前目录 / 可用 CLI把这些写进系统提示避免模型用 bash 语法对着 PowerShell 乱发命令。同时把ShellExecutor注册成可调用工具CompactionProvider同时提供MaxContextWindowTokens与MaxOutputTokens且未DisableCompaction或直接给CompactionStrategy每次调用前对消息做在途压缩保留工具调用/结果的配对完整性防止长循环把上下文窗口撑爆BackgroundAgentsProvider有个硬约束每个后台智能体必须有非空且大小写不敏感唯一的Name否则构造时抛ArgumentException。每个后台任务的状态由BackgroundTaskStatus枚举刻画——Running/Completed/Failed/Lost其中Lost表示在途引用丢了比如进程重启后追不回最终状态这恰好呼应了 Harness 面向跑很久、偶尔崩的长任务定位。1.3 装饰器与默认工具ToolApprovalAgent默认开——前面已述别再问了审批 多请求排队。规则分两档按工具名整体批准、按工具名 精确参数批准都持久化在会话状态里。OpenTelemetryAgent默认开——OTel 埋点。默认源名称为Experimental.Microsoft.Agents.AI。LoopAgent仅当配置LoopEvaluators——自动续跑详见下一节。HostedWebSearchTool默认开——托管 Web 搜索工具由模型服务端托管执行需所接模型 / Provider 支持托管 Web 搜索才生效不支持时用DisableWebSearch关掉。1.4 Loop 与 LoopEvaluator让智能体跑到满意为止LoopAgent是 Harness 里相对独立、也最有意思的一块。它的判定权完全交给一组LoopEvaluator——评估器只做纯判断看一眼LoopContext返回一个LoopEvaluation要不要继续、给下一圈带什么反馈不负责管理会话、也不负责构造下一圈的输入消息那是LoopAgent的事。开箱即用的评估器有评估器停止/继续判据CompletionMarkerLoopEvaluator输出里出现/未出现某个完成标记字符串TodoCompletionLoopEvaluatorTodoProvider 里是否还有未完成项可限定只在某些模式下生效如executeAIJudgeLoopEvaluator用一个AI 裁判对本轮结果打分裁决JudgeVerdictBackgroundTaskCompletionLoopEvaluator后台任务是否全部完成DelegateLoopEvaluator你给一个委托自己写判定逻辑多个评估器按顺序判定顺序即优先级第一个要求继续的评估器胜出它的反馈驱动下一圈其余不再评估只有当所有评估器都要求停止时循环才停。此外还有一道全局安全阀LoopAgentOptions.MaxIterations默认 10无论评估器怎么说都不会超。还有一个重要的安全行为某一圈若产生了待处理的工具审批请求循环会停下来把审批返回给调用方而不会自作主张地替你批准。LoopAgentOptions.FreshContextPerIteration控制每圈是复用同一会话、只把反馈作为下一圈输入默认 false靠会话历史接续还是每圈从原始输入 聚合反馈日志重新开始、并重置会话true此时被包的智能体必须支持会话序列化。评估器的输入输出契约。写自定义评估器时你拿到的是LoopContext、要返回的是LoopEvaluationLoopContext输入携带本轮全部判定依据被包的Agent、Session、首轮InitialMessages、当前Iteration1 起、刚跑完那轮的LastResponse、历轮累积的Feedback日志以及一个跨轮共享的AdditionalProperties包。评估器自身应当无状态、可并发复用任何本次运行的临时状态都该塞进AdditionalProperties而不是写到评估器字段里。LoopEvaluation输出只有三种结局Stop()停Continue(feedback)继续并把一段反馈交给LoopAgent去构造下一圈输入ContinueWithMessages(messages)继续但绕过LoopAgent 的反馈/消息构造由你给出下一圈逐字发送的消息适合要发非 user 角色、多条消息或非文本内容的场景。AIJudgeLoopEvaluator值得单独说一句它另起一个裁判对话客户端不带任何工具 / 会话 / 中间件把原始诉求 智能体最新回复喂进去要一个结构化的JudgeVerdict若模型不支持结构化输出则退回解析VERDICT: DONE/VERDICT: MORE文本标记判定模糊时按 MORE 处理宁可继续也不轻易收尾。它的判据可用Criteria注入你的验收标准。这种LLM 当裁判的循环既贵又有概率波动官方明确建议给它配一个更紧的MaxIterations。1.5 工具审批别再问了到底怎么触发1.3 提到ToolApprovalAgent把规则分两档持久化这里补上调用方到底怎么把规则种进去。机制是一对进出方向出站智能体 → 调用方内层智能体抛出ToolApprovalRequestContent时中间件先拿已记录的规则匹配命中的直接自动批准剩下没命中的一次只把第一个呈现给调用方其余排队逐个处理。入站调用方 → 智能体调用方若想以后别再问了不是回普通的批准而是回一个AlwaysApproveToolApprovalResponseContent。中间件会把它拆开——把内层的普通批准转发给智能体同时把标准批准规则写进会话状态。这个“始终批准”响应不用自己手写而是用ToolApprovalRequestContent上的两个扩展方法对应两档粒度CreateAlwaysApproveToolResponse()—— 按工具名整体批准以后这个工具的所有调用都自动放过不看参数。CreateAlwaysApproveToolWithArgumentsResponse()—— 按工具名 精确参数批准只有参数完全一致的后续调用才自动放过。规则存在会话里、跨多次运行存活。这套机制正是无人值守的安全基石既能让重复的安全操作不再反复打扰又能把粒度收紧到只放过这一组参数。二、再深一层Skills / Compaction / Shell / CodeAct第一节的表格给了暴露什么工具、什么时候启用。但有四块能力光看一行表格不够——它们各自是一个小系统值得单独说一层内部怎么运作。其中CodeAct 是上一篇没提到的新成员。2.1 Skills四阶段渐进式披露AgentSkillsProvider实现了 Agent Skills 规范的渐进式披露核心目的是省 token不把一堆技能正文常驻系统提示而是分四步按需加载——广告只把技能名 描述注入系统提示加载模型决定用某技能load_skill取回完整正文读资源read_skill_resource按需读技能附带的参考资料跑脚本run_skill_script执行技能脚本。这三个工具默认都要审批都是ApprovalRequiredAIFunctionProvider 提供一条只读自动审批规则可放过加载 / 读资源两个读操作、只对跑脚本仍要人工确认。技能来源是抽象的AgentSkillsSource——文件系统递归扫SKILL.md、内存、甚至 C# 代码定义都行还能用装饰器去重 / 过滤 / 合并。延伸阅读Skills 能单独成篇——渐进式披露的完整设计、技能文件怎么写、来源与装饰器怎么组合我在Microsoft Agent Framework — 一篇讲透 Agent Skills里专门讲过。2.2 Compaction不止一种策略第一节说CompactionProvider做在途压缩但压缩策略其实是一族。它们都作用于原子组保住工具调用 / 结果的配对靠Trigger何时压Target压到哪停两个谓词驱动策略做法TruncationCompactionStrategy删最旧的非系统消息组SlidingWindowCompactionStrategy按用户轮次删最旧的轮比 token 截断更可预测ToolResultCompactionStrategy把旧的工具调用折叠成简短摘要SummarizationCompactionStrategy用 LLM 把旧消息总结成一条摘要ContextWindowCompactionStrategy两阶段先折叠工具结果、后截断从模型规格自动算阈值HarnessAgent 给了两个 token 上限时默认用的就是最后那个ContextWindowCompactionStrategy。2.3 Shell本地直跑还是容器沙箱ShellExecutor是命令执行的可插拔后端两种实现的安全立场截然不同LocalShellExecutor——在宿主机直接起 shell无隔离审批在环就是安全边界。支持持久模式跨命令保留cd/ 变量对编码智能体更友好。DockerShellExecutor——容器沙箱默认严格基线--network none、非 root、只读根文件系统、能力裁剪……容器是安全边界。另有ShellEnvironmentProvider每会话探测一次 OS / shell / CWD / 可用 CLI 注入系统提示治模型对着 PowerShell 发 bash 语法的病。2.4 CodeAct让模型写代码而非逐条发出工具调用CodeAct 是另一种范式模型不逐个发出结构化工具调用而是写一段代码在沙箱里跑代码里再通过call_tool(...)回调宿主工具。它适合需要写代码验证而非凭推理的任务算数、正则、数据清洗。两个实现Microsoft.Agents.AI.Hyperlight——VM 级隔离沙箱每轮快照 / 恢复干净态沙箱即安全边界Microsoft.Agents.AI.LocalCodeAct——不是沙箱本地子进程跑 PythonAST 白名单校验 资源限制靠外部环境隔离。CodeAct 不是 Harness 默认装的通过HarnessAgentOptions.AIContextProviders [codeAct]作为额外 Provider 挂进去与TodoProvider等平级。Harness_Step04_CodeExecution示例就是全家桶 CodeAct。三、积木之间怎么协作单看每块积木只是零件真正让它们组成能干长活的智能体的是几条协作关系。3.1 规划闭环AgentMode Todo Loop这是 Research 类智能体的主骨架三块零件各管一段AgentMode的plan模式守则要求先把任务拆成 todo、写计划、请用户批准批准后切到execute自主推进TodoCompletionLoopEvaluator限定execute模式盯着TodoProvider只要还有未完成项LoopAgent就再跑一圈直到清空或撞上MaxIterations。拼起来就是规划 → 执行 → 自动续跑到干完的闭环。3.2 防丢互补FileMemory Compaction关键在读写时机长任务最怕中间结论被压缩砍掉。FileMemory 和 Compaction 正好互补而要理解互补在哪得先看清 FileMemory 的读写时机写只在模型调file_memory_save_file时落盘正文每次 save / delete 还会重建索引文件memories.md。读分两类——每轮调用前框架自动读memories.md索引并注入告诉模型你存过哪些文件但只给名字 描述正文则要模型自己调file_memory_read_file才读。所以示例指令里那句“把最终报告存进文件记忆好让它熬过压缩、之后还能再引用”是这样生效的即使压缩砍掉了正文每轮注入的索引还在提醒模型“有这份报告”需要时再file_memory_read_file调回。一个“推索引、拉正文”的设计——省 token 又不丢关键产物。3.3 无人值守安全ToolApproval Loop 危险工具的审批要让智能体长时间自己跑又不失控靠三层配合FileAccess/Shell/Skills 脚本这些危险工具默认是ApprovalRequiredAIFunctionToolApproval让重复的安全操作可以别再问了两档粒度规则持久化而写 / 删这类仍可留给人工LoopAgent在自动续跑时遇到待审批请求会停下来交还调用方绝不替你批。三者合起来常规操作不打扰、危险操作有闸、自动循环不越权。四、配置开关HarnessAgentOptions 速查HarnessAgentOptions基本就是上面所有积木的开关面板 替身注入口。按用途归类记忆身份 Id / Name / Description 压缩 MaxContextWindowTokens / MaxOutputTokens / CompactionStrategy / DisableCompaction 指令 HarnessInstructionsHarness 级通用守则 ChatOptions.Instructions业务指令 工具循环 MaximumIterationsPerRequest / ChatOptions.Tools / DisableWebSearch 对话历史 ChatHistoryProvider默认 InMemory 审批 DisableToolAutoApproval / ToolApprovalAgentOptions / DisableNonApprovalRequiredFunctionBypassing 遥测 DisableOpenTelemetry / OpenTelemetrySourceName 续跑 LoopEvaluators / LoopAgentOptions Provider 开关 DisableTodoProvider / DisableAgentModeProvider / DisableFileMemory / DisableFileAccess / DisableAgentSkillsProvider Provider 替身 FileMemoryStore / FileAccessStore / AgentSkillsSource / AgentModeProviderOptions 可选 Provider BackgroundAgents(Options) / ShellExecutor(Options.NET) 追加扩展 AIContextProviders把你自己的 Provider 也挂进去设计上的取舍很清楚默认全开、按需关闭。也就是说你AsHarnessAgent()不传任何 Options拿到的就是一个满配的智能体想做减法时用Disable*想换实现时用对应的替身属性。压缩策略的优先级值得单独记DisableCompactiontrue→ 不压缩否则若给了自定义CompactionStrategy→ 用它忽略两个 token 参数否则两个 token 参数都给了 → 自动构造ContextWindowCompactionStrategy否则不压缩。模块的扩展性Harness 的扩展性来自三个层面从换零件到换配方再到绕过门面① 换文件存储后端AgentFileStore。FileMemory 和 FileAccess 都不直接碰文件系统而是依赖抽象基类AgentFileStore。框架内置了FileSystemAgentFileStore本地磁盘和InMemoryAgentFileStore内存适合测试。AgentFileStore的契约很干净——WriteFileAsync/ReadFileAsync/DeleteFileAsync/ListFilesAsync/ListDirectoriesAsync等路径一律用正斜杠且不得用..逃逸根目录。你完全可以实现一个BlobAgentFileStore把记忆写进 Azure Blob、或S3AgentFileStore写进对象存储然后通过FileMemoryStore/FileAccessStore注入。② 换/加判定与行为零件。自定义LoopEvaluator继承抽象基类实现EvaluateAsync或直接用DelegateLoopEvaluator包一个委托就能定义什么时候算干完了。自定义模式AgentModeProviderOptions.Modes可以替换掉默认的plan/execute定义你自己的工作流模式机。自定义技能源AgentSkillsSource可换成非文件系统的技能来源。自定义审批规则ToolApprovalAgentOptions.AutoApprovalRules接受任意FuncFunctionCallContent, ValueTaskbool配合内置的AllToolsAutoApprovalRule/ 各 Provider 提供的只读规则。③ 追加任意上下文 Provider。AIContextProviders选项让你把自己写的AIContextProvider比如一个公司知识库检索 Provider和 Harness 自带的一起挂上去不必二选一。④ 绕过门面、手工装配。这是最彻底的扩展方式。既然HarnessAgent只是按 Options 拼积木当它的配方不满足你时你可以不用它直接拿核心包的TodoProvider、CompactionProvider、LoopAgent、ToolApprovalAgent等积木用ChatClientBuilder/AIAgentBuilder拼一套自己的 Harness。每块积木都给了独立的装配入口如builder.UseToolApproval(...)、new LoopAgent(inner, evaluators)不依赖门面——这正是上一篇说的组合而非封装在使用侧的落点每块零件都能脱离门面单独用。⑤ 改写每个 Provider 注入的提示词。这是个容易被忽略但很有用的扩展点几乎每个 Provider 的 Options 都有一个Instructions属性可以整段替换掉它默认往系统提示里注入的那段话。比如嫌默认的 todo 守则太啰嗦、想让模式机讲中文、想给文件记忆加上团队规范——都不用改源码传Instructions即可。注意有占位符约定AgentModeProviderOptions.Instructions必须含{available_modes}和{current_mode}BackgroundAgentsProviderOptions.Instructions用{background_agents}注入智能体清单。TodoProviderOptions还额外提供SuppressTodoListMessage/TodoListMessageBuilder来控制每轮注入的待办摘要消息。⑥ 从宿主代码直接读写 Provider 状态。Provider 不只是给模型用的它们也对外暴露了公开方法让宿主程序绕过模型直接操作状态——例如TodoProvider.GetAllTodosAsync(session)读当前待办、AgentModeProvider.GetMode/SetMode读写当前模式。官方示例里的/todos、/mode控制台命令就是这么实现的不发起一次模型调用直接查 / 改会话状态。你做自己的 UI比如在客户端侧栏画一个实时待办面板时这是关键钩子。示例Harness 的官方示例在dotnet/samples/02-agents/Harness/下分两组。Step 系列能力分步演示示例演示重点Harness_Step01_Research用 HarnessAgent 做交互式研究规划模式 待办管理 文件记忆 压缩 续跑Harness_Step02_Research_WithBackgroundAgents/WithSubAgents用BackgroundAgentsProvider把股价查询并发委派给后台搜索智能体Harness_Step03_DataProcessing用FileAccessProvider让智能体读写 CSV 数据文件Harness_Step04_CodeExecution让智能体执行代码Harness_Step05_Loop用LoopAgent包住 HarnessAgent按LoopEvaluator完成标记 / 谓词 / AI 裁判 / 审批感知决定何时停Build Your Own Claw 系列配套博客从零搭理财助理Claw_Step01_MeetYourClaw是最小起点——一个带自定义get_stock_price工具、Web 搜索和规划能力的 HarnessAgent。最小用法从 IChatClient 到成品智能体Claw_Step01的核心其实就两步——构造一个IChatClient然后AsHarnessAgent加业务指令和自定义工具AIAgent agent chatClient.AsHarnessAgent(new HarnessAgentOptions { ChatOptions new ChatOptions { Instructions instructions, // 业务指令理财助理人设 Tools [StockTools.CreateGetStockPriceTool()], // 自定义工具 Reasoning new() { Effort ReasoningEffort.Medium }, }, });这一行背后Todo / AgentMode / FileMemory / FileAccess / Skills / 工具审批 / Web 搜索 / OpenTelemetry 全都默认装好了。你只补了理财助理人设和查股价工具这两样真正属于你的业务的东西。进阶用法开压缩 续跑 裁剪Harness_Step01_Research展示了一份更接近生产的配置——开启上下文压缩、关掉 FileAccess、用TodoCompletionLoopEvaluator让 execute 模式下所有待办没清完就自动再跑一圈.AsHarnessAgent(new HarnessAgentOptions { MaxContextWindowTokens 1_050_000, // 给了这两个 token 上限 → 自动开启压缩 MaxOutputTokens 128_000, Name ResearchAgent, DisableFileAccess true, // 这个研究场景不需要共享工作目录 OpenTelemetrySourceName Harness.Research, FileMemoryStore new FileSystemAgentFileStore( // 把记忆落到指定目录 Path.Combine(AppContext.BaseDirectory, agent-files)), LoopEvaluators [ new TodoCompletionLoopEvaluator( new TodoCompletionLoopEvaluatorOptions { Modes [execute] }), ], LoopAgentOptions new LoopAgentOptions { MaxIterations 10 }, // 安全阀 ChatOptions new ChatOptions { /* 研究方法论指令 WebBrowsingTool */ }, });这段把本文讲的几块东西都串起来了token 上限触发压缩、DisableFileAccess做减法、FileMemoryStore换存储后端、LoopEvaluatorsMaxIterations配出自主续跑但有上限的行为。对照着读前面那些开关就都落地了。总结把零件逐个拆开后几条值得记住的积木大多是AIContextProvider往每次调用注入指令 / 消息 / 工具少数是DelegatingAIAgent装饰器ToolApproval / Loop / OpenTelemetry状态基本都在会话状态袋里、跨同一会话存活默认全开、按需做减法。而真正把这些零件串成能干长活的智能体的是它们之间的协作——规划闭环、压缩与文件记忆互补防丢、审批与续跑共守无人值守安全。适用场景研究 / 调研类智能体——规划 多源检索 把中间结论落盘防丢正是 Todo WebSearch FileMemory 压缩的组合拳。编码 / 数据处理类智能体——需要读写真实文件、执行命令/代码对应 FileAccess Shell 工具审批。长时无人值守任务——别再问了审批 Loop 自动续跑 每步历史落盘可恢复是为跑很久、偶尔崩、要能接着跑设计的。需要并行的复杂任务——用 BackgroundAgents 把可并行的子任务甩出去并发做。最佳实践策略从满配开始做减法而非加法。先AsHarnessAgent()拿满配再用Disable*关掉这个场景明显用不上的如纯研究关掉 FileAccess比从零拼更不容易漏东西。长任务务必配 token 上限以启用压缩。不开压缩的长循环迟早撑爆上下文窗口给MaxContextWindowTokensMaxOutputTokens是最省事的开启方式。**无人值守时审批规则要够用且最小**。优先用只读自动审批规则如 FileAccess 的ReadOnlyToolsAutoApprovalRule把写/删这类危险操作仍留给人工确认AllToolsAutoApprovalRule只在完全可信环境用。**续跑一定要设MaxIterations**。LoopEvaluator的判定可能因模型行为而迟迟不收敛全局安全阀是兜底。生产环境换掉默认存储与凭据。默认的FileSystemAgentFileStore写在{cwd}下多实例部署时要换成共享/远端后端自定义AgentFileStore示例里的DefaultAzureCredential在生产应换成更明确的凭据。配方不合用就别硬扭门面。当你的需求和 HarnessAgent 的固执默认冲突过多时直接用核心包的积木手工装配往往更清爽——门面薄正是为此而设计。附公开 API 速查表按积木族列出核心包Microsoft.Agents.AI/Harness/下的主要公开类型Skills / Compaction / Shell / CodeAct 见第二节内部状态类如*State等未列积木族主要公开类型TodoTodoProvider/TodoProviderOptions/TodoItemAgentModeAgentModeProvider/AgentModeProviderOptions含嵌套AgentModeFileMemoryFileMemoryProvider/FileMemoryProviderOptions/FileMemoryState/FileListEntryFileAccessFileAccessProvider/FileAccessProviderOptionsFileStoreAgentFileStore抽象 /FileSystemAgentFileStore/InMemoryAgentFileStore/FileSearchResult/FileSearchMatchBackgroundAgentsBackgroundAgentsProvider/BackgroundAgentsProviderOptions/BackgroundTaskInfo/BackgroundTaskStatus枚举LoopLoopAgent/LoopAgentOptions/LoopEvaluator抽象 /LoopContext/LoopEvaluation/AIJudgeLoopEvaluator/CompletionMarkerLoopEvaluator/TodoCompletionLoopEvaluator/BackgroundTaskCompletionLoopEvaluator/DelegateLoopEvaluator各评估器多带一个同名*OptionsToolApprovalToolApprovalAgent/ToolApprovalAgentOptions/ToolApprovalAgentBuilderExtensionsUseToolApproval /ToolApprovalRequestContentExtensionsCreateAlwaysApprove* /AlwaysApproveToolApprovalResponseContent门面独立包HarnessAgent/HarnessAgentOptions/ChatClientHarnessExtensionsAsHarnessAgent下一篇引入地址