Skip to content

Commit 4778c24

Browse files
committed
Add tests for new ProviderConfig fields
Extends existing provider-forwarding/serialization tests across all 4 SDKs to cover modelId, wireModel, maxPromptTokens, and maxOutputTokens. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent f993631 commit 4778c24

4 files changed

Lines changed: 111 additions & 1 deletion

File tree

dotnet/test/Unit/SerializationTests.cs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,19 +20,31 @@ public void ProviderConfig_CanSerializeHeaders_WithSdkOptions()
2020
var original = new ProviderConfig
2121
{
2222
BaseUrl = "https://example.com/provider",
23-
Headers = new Dictionary<string, string> { ["Authorization"] = "Bearer provider-token" }
23+
Headers = new Dictionary<string, string> { ["Authorization"] = "Bearer provider-token" },
24+
ModelId = "gpt-4o",
25+
WireModel = "my-finetune-v3",
26+
MaxPromptTokens = 100_000,
27+
MaxOutputTokens = 4096
2428
};
2529

2630
var json = JsonSerializer.Serialize(original, options);
2731
using var document = JsonDocument.Parse(json);
2832
var root = document.RootElement;
2933
Assert.Equal("https://example.com/provider", root.GetProperty("baseUrl").GetString());
3034
Assert.Equal("Bearer provider-token", root.GetProperty("headers").GetProperty("Authorization").GetString());
35+
Assert.Equal("gpt-4o", root.GetProperty("modelId").GetString());
36+
Assert.Equal("my-finetune-v3", root.GetProperty("wireModel").GetString());
37+
Assert.Equal(100_000, root.GetProperty("maxPromptTokens").GetInt32());
38+
Assert.Equal(4096, root.GetProperty("maxOutputTokens").GetInt32());
3139

3240
var deserialized = JsonSerializer.Deserialize<ProviderConfig>(json, options);
3341
Assert.NotNull(deserialized);
3442
Assert.Equal("https://example.com/provider", deserialized.BaseUrl);
3543
Assert.Equal("Bearer provider-token", deserialized.Headers!["Authorization"]);
44+
Assert.Equal("gpt-4o", deserialized.ModelId);
45+
Assert.Equal("my-finetune-v3", deserialized.WireModel);
46+
Assert.Equal(100_000, deserialized.MaxPromptTokens);
47+
Assert.Equal(4096, deserialized.MaxOutputTokens);
3648
}
3749

3850
[Fact]

go/types_test.go

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,3 +151,69 @@ func TestSessionSendRequest_JSONIncludesRequestHeaders(t *testing.T) {
151151
t.Fatalf("expected Authorization header, got %v", headers["Authorization"])
152152
}
153153
}
154+
155+
156+
func TestProviderConfig_JSONIncludesAllFields(t *testing.T) {
157+
cfg := ProviderConfig{
158+
BaseURL: "https://example.com/provider",
159+
APIKey: "test-key",
160+
Headers: map[string]string{"Authorization": "Bearer provider-token"},
161+
ModelID: "gpt-4o",
162+
WireModel: "my-finetune-v3",
163+
MaxPromptTokens: 100000,
164+
MaxOutputTokens: 4096,
165+
}
166+
167+
data, err := json.Marshal(cfg)
168+
if err != nil {
169+
t.Fatalf("failed to marshal ProviderConfig: %v", err)
170+
}
171+
172+
var decoded map[string]any
173+
if err := json.Unmarshal(data, &decoded); err != nil {
174+
t.Fatalf("failed to unmarshal ProviderConfig: %v", err)
175+
}
176+
177+
if decoded["baseUrl"] != "https://example.com/provider" {
178+
t.Errorf("expected baseUrl to round-trip, got %v", decoded["baseUrl"])
179+
}
180+
if decoded["modelId"] != "gpt-4o" {
181+
t.Errorf("expected modelId 'gpt-4o', got %v", decoded["modelId"])
182+
}
183+
if decoded["wireModel"] != "my-finetune-v3" {
184+
t.Errorf("expected wireModel 'my-finetune-v3', got %v", decoded["wireModel"])
185+
}
186+
if decoded["maxPromptTokens"] != float64(100000) {
187+
t.Errorf("expected maxPromptTokens 100000, got %v", decoded["maxPromptTokens"])
188+
}
189+
if decoded["maxOutputTokens"] != float64(4096) {
190+
t.Errorf("expected maxOutputTokens 4096, got %v", decoded["maxOutputTokens"])
191+
}
192+
headers, ok := decoded["headers"].(map[string]any)
193+
if !ok {
194+
t.Fatalf("expected headers object, got %T", decoded["headers"])
195+
}
196+
if headers["Authorization"] != "Bearer provider-token" {
197+
t.Errorf("expected Authorization header, got %v", headers["Authorization"])
198+
}
199+
}
200+
201+
func TestProviderConfig_JSONOmitsUnsetTokenFields(t *testing.T) {
202+
cfg := ProviderConfig{BaseURL: "https://example.com/provider"}
203+
204+
data, err := json.Marshal(cfg)
205+
if err != nil {
206+
t.Fatalf("failed to marshal ProviderConfig: %v", err)
207+
}
208+
209+
var decoded map[string]any
210+
if err := json.Unmarshal(data, &decoded); err != nil {
211+
t.Fatalf("failed to unmarshal ProviderConfig: %v", err)
212+
}
213+
214+
for _, field := range []string{"modelId", "wireModel", "maxPromptTokens", "maxOutputTokens", "headers"} {
215+
if _, present := decoded[field]; present {
216+
t.Errorf("expected %q to be omitted when unset, got %v", field, decoded[field])
217+
}
218+
}
219+
}

nodejs/test/client.test.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,10 @@ describe("CopilotClient", () => {
224224
provider: {
225225
baseUrl: "https://example.com/provider",
226226
headers: { Authorization: "Bearer provider-token" },
227+
modelId: "gpt-4o",
228+
wireModel: "my-finetune-v3",
229+
maxPromptTokens: 100_000,
230+
maxOutputTokens: 4096,
227231
},
228232
});
229233

@@ -232,6 +236,10 @@ describe("CopilotClient", () => {
232236
expect.objectContaining({
233237
baseUrl: "https://example.com/provider",
234238
headers: { Authorization: "Bearer provider-token" },
239+
modelId: "gpt-4o",
240+
wireModel: "my-finetune-v3",
241+
maxPromptTokens: 100_000,
242+
maxOutputTokens: 4096,
235243
})
236244
);
237245
spy.mockRestore();
@@ -255,6 +263,10 @@ describe("CopilotClient", () => {
255263
provider: {
256264
baseUrl: "https://example.com/provider",
257265
headers: { Authorization: "Bearer resume-token" },
266+
modelId: "gpt-4o",
267+
wireModel: "my-finetune-v3",
268+
maxPromptTokens: 100_000,
269+
maxOutputTokens: 4096,
258270
},
259271
});
260272

@@ -263,6 +275,10 @@ describe("CopilotClient", () => {
263275
expect.objectContaining({
264276
baseUrl: "https://example.com/provider",
265277
headers: { Authorization: "Bearer resume-token" },
278+
modelId: "gpt-4o",
279+
wireModel: "my-finetune-v3",
280+
maxPromptTokens: 100_000,
281+
maxOutputTokens: 4096,
266282
})
267283
);
268284
spy.mockRestore();

python/test_client.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -564,12 +564,20 @@ async def mock_request(method, params):
564564
provider={
565565
"base_url": "https://example.com/provider",
566566
"headers": {"Authorization": "Bearer provider-token"},
567+
"model_id": "gpt-4o",
568+
"wire_model": "my-finetune-v3",
569+
"max_prompt_tokens": 100_000,
570+
"max_output_tokens": 4096,
567571
},
568572
)
569573

570574
provider = captured["session.create"]["provider"]
571575
assert provider["baseUrl"] == "https://example.com/provider"
572576
assert provider["headers"] == {"Authorization": "Bearer provider-token"}
577+
assert provider["modelId"] == "gpt-4o"
578+
assert provider["wireModel"] == "my-finetune-v3"
579+
assert provider["maxPromptTokens"] == 100_000
580+
assert provider["maxOutputTokens"] == 4096
573581
finally:
574582
await client.force_stop()
575583

@@ -599,12 +607,20 @@ async def mock_request(method, params):
599607
provider={
600608
"base_url": "https://example.com/provider",
601609
"headers": {"Authorization": "Bearer resume-token"},
610+
"model_id": "gpt-4o",
611+
"wire_model": "my-finetune-v3",
612+
"max_prompt_tokens": 100_000,
613+
"max_output_tokens": 4096,
602614
},
603615
)
604616

605617
provider = captured["session.resume"]["provider"]
606618
assert provider["baseUrl"] == "https://example.com/provider"
607619
assert provider["headers"] == {"Authorization": "Bearer resume-token"}
620+
assert provider["modelId"] == "gpt-4o"
621+
assert provider["wireModel"] == "my-finetune-v3"
622+
assert provider["maxPromptTokens"] == 100_000
623+
assert provider["maxOutputTokens"] == 4096
608624
finally:
609625
await client.force_stop()
610626

0 commit comments

Comments
 (0)