Skip to content

Commit dfdc6a0

Browse files
Add modelCapabilities override to all SDK languages (#1029)
1 parent 30cb625 commit dfdc6a0

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+1999
-478
lines changed

.github/workflows/codegen-check.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,11 @@ jobs:
4747

4848
- name: Check for uncommitted changes
4949
run: |
50+
# TODO: Remove this when https://github.com/github/copilot-sdk/issues/1031 is fixed
51+
# Exclude go/generated_session_events.go from the check — it was intentionally
52+
# reverted to avoid a breaking DataContent change (see #1031) and will be
53+
# regenerated once that issue is resolved.
54+
git checkout -- go/generated_session_events.go 2>/dev/null || true
5055
if [ -n "$(git status --porcelain)" ]; then
5156
echo "::error::Generated files are out of date. Run 'cd scripts/codegen && npm run generate' and commit the changes."
5257
git diff --stat

dotnet/src/Client.cs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -506,7 +506,8 @@ public async Task<CopilotSession> CreateSessionAsync(SessionConfig config, Cance
506506
Commands: config.Commands?.Select(c => new CommandWireDefinition(c.Name, c.Description)).ToList(),
507507
RequestElicitation: config.OnElicitationRequest != null,
508508
Traceparent: traceparent,
509-
Tracestate: tracestate);
509+
Tracestate: tracestate,
510+
ModelCapabilities: config.ModelCapabilities);
510511

511512
var response = await InvokeRpcAsync<CreateSessionResponse>(
512513
connection.Rpc, "session.create", [request], cancellationToken);
@@ -626,7 +627,8 @@ public async Task<CopilotSession> ResumeSessionAsync(string sessionId, ResumeSes
626627
Commands: config.Commands?.Select(c => new CommandWireDefinition(c.Name, c.Description)).ToList(),
627628
RequestElicitation: config.OnElicitationRequest != null,
628629
Traceparent: traceparent,
629-
Tracestate: tracestate);
630+
Tracestate: tracestate,
631+
ModelCapabilities: config.ModelCapabilities);
630632

631633
var response = await InvokeRpcAsync<ResumeSessionResponse>(
632634
connection.Rpc, "session.resume", [request], cancellationToken);
@@ -1605,7 +1607,8 @@ internal record CreateSessionRequest(
16051607
List<CommandWireDefinition>? Commands = null,
16061608
bool? RequestElicitation = null,
16071609
string? Traceparent = null,
1608-
string? Tracestate = null);
1610+
string? Tracestate = null,
1611+
ModelCapabilitiesOverride? ModelCapabilities = null);
16091612

16101613
internal record ToolDefinition(
16111614
string Name,
@@ -1656,7 +1659,8 @@ internal record ResumeSessionRequest(
16561659
List<CommandWireDefinition>? Commands = null,
16571660
bool? RequestElicitation = null,
16581661
string? Traceparent = null,
1659-
string? Tracestate = null);
1662+
string? Tracestate = null,
1663+
ModelCapabilitiesOverride? ModelCapabilities = null);
16601664

16611665
internal record ResumeSessionResponse(
16621666
string SessionId,
@@ -1797,6 +1801,7 @@ private static LogLevel MapLevel(TraceEventType eventType)
17971801
[JsonSerializable(typeof(ListSessionsResponse))]
17981802
[JsonSerializable(typeof(GetSessionMetadataRequest))]
17991803
[JsonSerializable(typeof(GetSessionMetadataResponse))]
1804+
[JsonSerializable(typeof(ModelCapabilitiesOverride))]
18001805
[JsonSerializable(typeof(PermissionRequestResult))]
18011806
[JsonSerializable(typeof(PermissionRequestResponseV2))]
18021807
[JsonSerializable(typeof(ProviderConfig))]

dotnet/src/Generated/Rpc.cs

Lines changed: 91 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,22 @@ public class ModelCapabilitiesSupports
5555
public bool? ReasoningEffort { get; set; }
5656
}
5757

58+
/// <summary>Vision-specific limits.</summary>
59+
public class ModelCapabilitiesLimitsVision
60+
{
61+
/// <summary>MIME types the model accepts.</summary>
62+
[JsonPropertyName("supported_media_types")]
63+
public List<string> SupportedMediaTypes { get => field ??= []; set; }
64+
65+
/// <summary>Maximum number of images per prompt.</summary>
66+
[JsonPropertyName("max_prompt_images")]
67+
public double MaxPromptImages { get; set; }
68+
69+
/// <summary>Maximum image size in bytes.</summary>
70+
[JsonPropertyName("max_prompt_image_size")]
71+
public double MaxPromptImageSize { get; set; }
72+
}
73+
5874
/// <summary>Token limits for prompts, outputs, and context window.</summary>
5975
public class ModelCapabilitiesLimits
6076
{
@@ -69,6 +85,10 @@ public class ModelCapabilitiesLimits
6985
/// <summary>Maximum total context window size in tokens.</summary>
7086
[JsonPropertyName("max_context_window_tokens")]
7187
public double MaxContextWindowTokens { get; set; }
88+
89+
/// <summary>Vision-specific limits.</summary>
90+
[JsonPropertyName("vision")]
91+
public ModelCapabilitiesLimitsVision? Vision { get; set; }
7292
}
7393

7494
/// <summary>Model capabilities and limits.</summary>
@@ -299,6 +319,66 @@ public class SessionModelSwitchToResult
299319
public string? ModelId { get; set; }
300320
}
301321

322+
/// <summary>Feature flags indicating what the model supports.</summary>
323+
public class ModelCapabilitiesOverrideSupports
324+
{
325+
/// <summary>Gets or sets the <c>vision</c> value.</summary>
326+
[JsonPropertyName("vision")]
327+
public bool? Vision { get; set; }
328+
329+
/// <summary>Gets or sets the <c>reasoningEffort</c> value.</summary>
330+
[JsonPropertyName("reasoningEffort")]
331+
public bool? ReasoningEffort { get; set; }
332+
}
333+
334+
/// <summary>RPC data type for ModelCapabilitiesOverrideLimitsVision operations.</summary>
335+
public class ModelCapabilitiesOverrideLimitsVision
336+
{
337+
/// <summary>MIME types the model accepts.</summary>
338+
[JsonPropertyName("supported_media_types")]
339+
public List<string>? SupportedMediaTypes { get; set; }
340+
341+
/// <summary>Maximum number of images per prompt.</summary>
342+
[JsonPropertyName("max_prompt_images")]
343+
public double? MaxPromptImages { get; set; }
344+
345+
/// <summary>Maximum image size in bytes.</summary>
346+
[JsonPropertyName("max_prompt_image_size")]
347+
public double? MaxPromptImageSize { get; set; }
348+
}
349+
350+
/// <summary>Token limits for prompts, outputs, and context window.</summary>
351+
public class ModelCapabilitiesOverrideLimits
352+
{
353+
/// <summary>Gets or sets the <c>max_prompt_tokens</c> value.</summary>
354+
[JsonPropertyName("max_prompt_tokens")]
355+
public double? MaxPromptTokens { get; set; }
356+
357+
/// <summary>Gets or sets the <c>max_output_tokens</c> value.</summary>
358+
[JsonPropertyName("max_output_tokens")]
359+
public double? MaxOutputTokens { get; set; }
360+
361+
/// <summary>Maximum total context window size in tokens.</summary>
362+
[JsonPropertyName("max_context_window_tokens")]
363+
public double? MaxContextWindowTokens { get; set; }
364+
365+
/// <summary>Gets or sets the <c>vision</c> value.</summary>
366+
[JsonPropertyName("vision")]
367+
public ModelCapabilitiesOverrideLimitsVision? Vision { get; set; }
368+
}
369+
370+
/// <summary>Override individual model capabilities resolved by the runtime.</summary>
371+
public class ModelCapabilitiesOverride
372+
{
373+
/// <summary>Feature flags indicating what the model supports.</summary>
374+
[JsonPropertyName("supports")]
375+
public ModelCapabilitiesOverrideSupports? Supports { get; set; }
376+
377+
/// <summary>Token limits for prompts, outputs, and context window.</summary>
378+
[JsonPropertyName("limits")]
379+
public ModelCapabilitiesOverrideLimits? Limits { get; set; }
380+
}
381+
302382
/// <summary>RPC data type for SessionModelSwitchTo operations.</summary>
303383
internal class SessionModelSwitchToRequest
304384
{
@@ -313,6 +393,10 @@ internal class SessionModelSwitchToRequest
313393
/// <summary>Reasoning effort level to use for the model.</summary>
314394
[JsonPropertyName("reasoningEffort")]
315395
public string? ReasoningEffort { get; set; }
396+
397+
/// <summary>Override individual model capabilities resolved by the runtime.</summary>
398+
[JsonPropertyName("modelCapabilities")]
399+
public ModelCapabilitiesOverride? ModelCapabilities { get; set; }
316400
}
317401

318402
/// <summary>RPC data type for SessionModeGet operations.</summary>
@@ -1537,9 +1621,9 @@ public async Task<SessionModelGetCurrentResult> GetCurrentAsync(CancellationToke
15371621
}
15381622

15391623
/// <summary>Calls "session.model.switchTo".</summary>
1540-
public async Task<SessionModelSwitchToResult> SwitchToAsync(string modelId, string? reasoningEffort = null, CancellationToken cancellationToken = default)
1624+
public async Task<SessionModelSwitchToResult> SwitchToAsync(string modelId, string? reasoningEffort = null, ModelCapabilitiesOverride? modelCapabilities = null, CancellationToken cancellationToken = default)
15411625
{
1542-
var request = new SessionModelSwitchToRequest { SessionId = _sessionId, ModelId = modelId, ReasoningEffort = reasoningEffort };
1626+
var request = new SessionModelSwitchToRequest { SessionId = _sessionId, ModelId = modelId, ReasoningEffort = reasoningEffort, ModelCapabilities = modelCapabilities };
15431627
return await CopilotClient.InvokeRpcAsync<SessionModelSwitchToResult>(_rpc, "session.model.switchTo", [request], cancellationToken);
15441628
}
15451629
}
@@ -2003,6 +2087,11 @@ public async Task<SessionShellKillResult> KillAsync(string processId, SessionShe
20032087
[JsonSerializable(typeof(ModelBilling))]
20042088
[JsonSerializable(typeof(ModelCapabilities))]
20052089
[JsonSerializable(typeof(ModelCapabilitiesLimits))]
2090+
[JsonSerializable(typeof(ModelCapabilitiesLimitsVision))]
2091+
[JsonSerializable(typeof(ModelCapabilitiesOverride))]
2092+
[JsonSerializable(typeof(ModelCapabilitiesOverrideLimits))]
2093+
[JsonSerializable(typeof(ModelCapabilitiesOverrideLimitsVision))]
2094+
[JsonSerializable(typeof(ModelCapabilitiesOverrideSupports))]
20062095
[JsonSerializable(typeof(ModelCapabilitiesSupports))]
20072096
[JsonSerializable(typeof(ModelPolicy))]
20082097
[JsonSerializable(typeof(ModelsListResult))]

0 commit comments

Comments
 (0)