Update .NET Copilot SDK cookbook for current SDK releases (#3548)

* Update .NET Copilot SDK cookbook: fix On<T> breaking change, add in-process runtime, tool search, and message provenance recipes

- Fix breaking change: Session.On is now generic (On<T> where T : SessionEvent).
  Updated all recipes that used the old non-generic session.On(evt => ...) pattern:
  error-handling, pr-visualization, managing-local-files, accessibility-report,
  ralph-loop (both .md and .cs where applicable).
- Add new 'In-Process Runtime' recipe (in-process-runtime.md + recipe/in-process-runtime.cs)
  demonstrating RuntimeConnection.ForInProcess(), live-tested.
- Document tool search / deferred loading (SessionConfig.ToolSearch / ToolSearchConfig)
  in pr-visualization.md, live-tested.
- Document typed message provenance (MessageOptions.Source / MessageSource) in
  error-handling.md, live-tested.
- Fix dotnet/README.md recipe index: it was missing Ralph Loop and Accessibility
  Report entries; also added the new In-Process Runtime entry.
- Add In-Process Runtime entry to the top-level cookbook/copilot-sdk/README.md
  .NET section.
- Update dotnet/recipe/README.md runnable-examples table with the new recipe.

All existing .NET cookbook recipes were rebuilt and rechecked against the current
GitHub Copilot SDK (Copilot CLI 1.0.85); no other breaking changes were found.

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

* Update cookbook model names to current supported models

- Replace stale/nonexistent model IDs (gpt-5, claude-sonnet-4.5,
  claude-opus-4.6, gpt-5.1-codex-mini) with current values from the
  supported AI models list
- Prefer Model = "auto" wherever a specific model isn't load-bearing
  to the recipe's teaching point
- ralph-loop: pin gpt-5.3-codex (current codex-family GA model), since
  a dedicated coding model is a deliberate, documented choice for the
  autonomous loop
- multiple-sessions: reshape the model narrative so it demonstrates a
  real explicit-override use case (A/B testing via claude-sonnet-5)
  instead of two sessions sharing the same hardcoded model

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

* Use SendAndWaitAsync in in-process runtime recipe

Replace the event-based TaskCompletionSource pattern with SendAndWaitAsync so the example waits for the final assistant response, propagates session errors, and uses the SDK timeout behavior.

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
Jon Galloway
2026-09-22 00:15:06 +00:00
committed by GitHub
co-authored by Copilot
parent d67204825b
commit a19b3101cc
19 changed files with 255 additions and 38 deletions
@@ -164,7 +164,7 @@ await client.StartAsync();
var session = await client.CreateSessionAsync(new SessionConfig
{
Model = "gpt-5",
Model = "auto",
OnPermissionRequest = PermissionHandler.ApproveAll,
SystemMessage = new SystemMessageConfig
{
@@ -185,7 +185,7 @@ The current working directory is: {Environment.CurrentDirectory}
});
// Set up event handling
session.On(evt =>
session.On<SessionEvent>(evt =>
{
switch (evt)
{
@@ -256,3 +256,37 @@ while (true)
| Flexibility | Fixed logic | **AI decides best approach** |
| Chart types | What you coded | **Any type Copilot can generate** |
| Data grouping | Hardcoded buckets | **Intelligent grouping** |
## Deferring tools with tool search
The GitHub MCP Server alone exposes dozens of tools, and this recipe also has the file and code
execution tools available — well past the point where stuffing every tool description into the
model's context on every turn helps more than it costs. `SessionConfig.ToolSearch` controls when
the SDK defers less-frequently-needed tools behind a search step instead of listing them all
up front:
```csharp
var session = await client.CreateSessionAsync(new SessionConfig
{
Model = "auto",
OnPermissionRequest = PermissionHandler.ApproveAll,
ToolSearch = new ToolSearchConfig
{
Enabled = true,
DeferThreshold = 20
},
SystemMessage = new SystemMessageConfig { Content = "..." }
});
```
- `Enabled` turns tool search on or off explicitly; leave it `null` to use the runtime default.
- `DeferThreshold` is the tool count above which MCP/external tools are deferred behind a
`tool_search_tool` call instead of being listed directly (the runtime default is 30 when
unset). Lowering it — as above — is useful once a recipe pulls in a large MCP server like the
GitHub MCP Server alongside file and code-execution tools, since it keeps the per-turn tool
list small while still letting Copilot search for the exact tool it needs.
- To customize how the search itself behaves, register your own tool named `"tool_search_tool"`
with `OverridesBuiltInTool = true` to replace the built-in implementation.
This is a per-session setting, not a global one, so you can tune it independently for
tool-heavy recipes like this one versus lighter sessions elsewhere in your app.