Files
westey 96d242fa7f .NET: Remove required token params from HarnessAgent, make compaction opt-in (#6409)
* Move token params from HarnessAgent constructor to options

Remove the required maxContextWindowTokens and maxOutputTokens
constructor parameters from HarnessAgent and AsHarnessAgent, replacing
them with optional MaxContextWindowTokens and MaxOutputTokens properties
on HarnessAgentOptions.

When both values are provided, compaction is enabled as before (in-loop
CompactionProvider and chat reducer on the default InMemoryChatHistory
Provider). When either is null, compaction is disabled entirely, making
it opt-in.

New constructor: HarnessAgent(IChatClient, HarnessAgentOptions?,
ILoggerFactory?, IServiceProvider?)

Closes #6333

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Improving comments.

* feat: Add custom CompactionStrategy and DisableCompaction to HarnessAgentOptions

Allow users to provide their own CompactionStrategy via options, with
a clear priority system:
1. DisableCompaction=true: no compaction regardless of other settings
2. Custom CompactionStrategy provided: use it (token params ignored)
3. Both MaxContextWindowTokens and MaxOutputTokens set: default strategy
4. Otherwise: no compaction

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: Address PR review comments on compaction opt-in

- Update chatClient param XML doc to reflect compaction is opt-in
- Strengthen compaction tests to assert ChatReducer is null/not-null
  rather than just asserting construction succeeds

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
96d242fa7f · 2026-06-09 13:06:00 +00:00
History
..

What this sample demonstrates

This sample demonstrates how to use a HarnessAgent with the Harness AIContextProviders (TodoProvider and AgentModeProvider) for interactive research tasks with web search capabilities powered by Azure AI Foundry. The HarnessAgent pre-configures function invocation, per-service-call chat history persistence, and context-window compaction.

Key features showcased:

  • HarnessAgent — a pre-configured agent that wraps a ChatClientAgent with function invocation, per-service-call persistence, and context-window compaction
  • ToolApproval — the agent is wrapped with UseToolApproval() to allow auto-approving tools once confirmed
  • Web Search — the agent can search the web for current information via ResponseTool.CreateWebSearchTool()
  • TodoProvider — the agent creates and manages a todo list to track research questions
  • AgentModeProvider — the agent switches between "plan" mode (breaking down the topic) and "execute" mode (answering each research question)
  • Interactive conversation — you can review the agent's plan, provide feedback, and approve before execution begins
  • Streaming output — responses are streamed token-by-token for a natural experience
  • /todos command — view the current todo list at any time without invoking the agent
  • Mode-based coloring — console output is colored based on the agent's current mode (cyan for plan, green for execute)

Prerequisites

Before running this sample, ensure you have:

  1. An Azure AI Foundry project with a deployed model (e.g., gpt-5.4)
  2. Azure CLI installed and authenticated (az login)

Environment Variables

Set the following environment variables:

# Required: Your Azure AI Foundry OpenAI endpoint
export AZURE_FOUNDRY_OPENAI_ENDPOINT="https://your-project.services.ai.azure.com/openai/v1/"

# Optional: Model deployment name (defaults to gpt-5.4)
export AZURE_AI_MODEL_DEPLOYMENT_NAME="gpt-5.4"

Running the Sample

cd dotnet
dotnet run --project samples/02-agents/Harness/Harness_Step01_Research

What to Expect

The sample starts an interactive conversation loop. You can:

  1. Enter a research topic — the agent will analyze it and create a plan with todos
  2. Review and adjust — provide feedback on the plan, ask for changes, or approve it
  3. Type /todos — to see the current todo list at any time
  4. Watch execution — once approved, tell the agent to proceed and it will work through each todo
  5. Type exit — to end the session

The prompt and agent output are colored by the current mode: cyan during planning, green during execution.