Feature: session filesystem support across all four SDKs
The sessionFs feature introduced earlier in Node.js is now available across .NET, Go, and Python too, so you can redirect session-scoped storage (events, checkpoints, temp files, workspace state) to your own backing store instead of the runtime's default local filesystem. This is especially useful for serverless and multi-tenant hosts. (#1036)
// TypeScript
const client = new CopilotClient({
sessionFs: { initialCwd: "/", sessionStatePath: "/s", conventions: "posix" },
});
const session = await client.createSession({
createSessionFsHandler: () => ({ readFile: async () => "...", writeFile: async () => { /* ... */ }, /* ... */ })
});// C#
var client = new CopilotClient(new CopilotClientOptions {
SessionFs = new()
{
InitialCwd = "/",
SessionStatePath = "/",
Conventions = SessionFsSetProviderRequestConventions.Posix
}
});
var session = await client.CreateSessionAsync(new SessionConfig
{
CreateSessionFsHandler = _ => new MySessionFsHandler(/* ... */) // e.g., map to in-memory storage, etc
});For a full end-to-end sample of a multi-user hosted system using sessionFs, see https://github.com/github/copilot-sdk-server-sample
Feature: override model capabilities when creating a session or switching models
All SDKs can now override individual model capabilities such as vision support without replacing the full capabilities object. This makes BYOK and custom-provider scenarios easier, and lets you change behavior mid-session with setModel/SetModelAsync. (#1029)
const session = await client.createSession({
modelCapabilities: { supports: { vision: false } },
});
await session.setModel("claude-sonnet-4.5", { modelCapabilities: { supports: { vision: true } } });await session.SetModelAsync("claude-sonnet-4.5", reasoningEffort: null,
modelCapabilities: new ModelCapabilitiesOverride { Supports = new ModelCapabilitiesOverrideSupports { Vision = true } });Feature: enableConfigDiscovery for automatic MCP and skill discovery
All SDKs now expose enableConfigDiscovery, allowing the runtime to automatically discover MCP server configs and skill directories from the working directory and merge them with any explicitly supplied configuration. Explicit values still win on name collisions. (#1044)
const session = await client.createSession({
enableConfigDiscovery: true,
});var session = await client.CreateSessionAsync(new SessionConfig {
EnableConfigDiscovery = true,
});Improvement: safer per-event data types in Go
The Go SDK no longer flattens all session event payloads into one giant optional struct. event.Data is now a per-event typed interface, so adding a new event type no longer risks silently changing the shape of existing ones. (#1037)
switch d := event.Data.(type) {
case *copilot.AssistantMessageData:
fmt.Println(d.Content)
}
⚠️ Breaking change (Go):event.Datais now aSessionEventDatainterface rather than a flat struct, so consumers must use type assertions or type switches. This update also applies some Go-style initialism renames such asUi→UIandUri→URI.
Other changes
- bugfix: [.NET] [Go] ignore unknown hook types from newer CLI versions instead of failing the session, improving forward compatibility with runtime updates (#1013)
- improvement: [Go] harden the internal JSON-RPC transport and framing logic, including stricter protocol validation and better handling of exact error payload JSON (#949)