Skip to content
This repository was archived by the owner on May 20, 2026. It is now read-only.

Commit 1556e47

Browse files
TylerLeonhardtlramos15Copilot
authored
Ensure claude code respects model picker (#4614) (#4626)
* Ensure claude code respects model picker * Update src/extension/chatSessions/claude/node/test/claudeCodeModels.spec.ts --------- Co-authored-by: Logan Ramos <loganramos@microsoft.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
1 parent 1197698 commit 1556e47

5 files changed

Lines changed: 19 additions & 11 deletions

File tree

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "copilot-chat",
33
"displayName": "GitHub Copilot Chat",
44
"description": "AI chat features powered by Copilot",
5-
"version": "0.41.0",
5+
"version": "0.41.1",
66
"build": "1",
77
"internalAIKey": "1058ec22-3c95-4951-8443-f26c1f325911",
88
"completionsCoreVersion": "1.378.1799",

src/extension/chatSessions/claude/node/claudeCodeModels.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ export interface IClaudeCodeModels {
3737
getDefaultModel(): Promise<string>;
3838
setDefaultModel(modelId: string | undefined): Promise<void>;
3939
getModels(): Promise<ClaudeCodeModelInfo[]>;
40+
/**
41+
* Gets the filtered list of Claude chat endpoints that support the Messages API.
42+
*/
43+
getEndpoints(): Promise<IChatEndpoint[]>;
4044
/**
4145
* Maps an SDK model ID to the best matching endpoint model ID.
4246
* SDK model IDs are raw Anthropic API model IDs (e.g., 'claude-opus-4-5-20251101').
@@ -151,6 +155,10 @@ export class ClaudeCodeModels extends Disposable implements IClaudeCodeModels {
151155
return endpoints.map(e => ({ id: e.model, name: e.name, multiplier: e.multiplier }));
152156
}
153157

158+
public async getEndpoints(): Promise<IChatEndpoint[]> {
159+
return this._getEndpoints();
160+
}
161+
154162
private async _fetchAvailableEndpoints(): Promise<IChatEndpoint[]> {
155163
try {
156164
const endpoints = await this.endpointProvider.getAllChatEndpoints();
@@ -159,6 +167,7 @@ export class ClaudeCodeModels extends Disposable implements IClaudeCodeModels {
159167
// and use the Messages API (required for Claude Code)
160168
const claudeEndpoints = endpoints.filter(e =>
161169
e.supportsToolCalls &&
170+
e.showInModelPicker &&
162171
(e.family?.toLowerCase().includes('claude') || e.model?.toLowerCase().includes('claude')) &&
163172
e.apiType === 'messages'
164173
);

src/extension/chatSessions/claude/node/claudeLanguageModelServer.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { Raw } from '@vscode/prompt-tsx';
99
import * as http from 'http';
1010
import { IChatMLFetcher, Source } from '../../../../platform/chat/common/chatMLFetcher';
1111
import { ChatLocation, ChatResponse } from '../../../../platform/chat/common/commonTypes';
12-
import { CustomModel, EndpointEditToolName, IEndpointProvider } from '../../../../platform/endpoint/common/endpointProvider';
12+
import { CustomModel, EndpointEditToolName } from '../../../../platform/endpoint/common/endpointProvider';
1313
import { AnthropicMessagesProcessor } from '../../../../platform/endpoint/node/messagesApi';
1414
import { ILogService } from '../../../../platform/log/common/logService';
1515
import { FinishedCallback, OptionalChatRequestParams } from '../../../../platform/networking/common/fetch';
@@ -26,6 +26,7 @@ import { Disposable, toDisposable } from '../../../../util/vs/base/common/lifecy
2626
import { SSEParser } from '../../../../util/vs/base/common/sseParser';
2727
import { generateUuid } from '../../../../util/vs/base/common/uuid';
2828
import { IInstantiationService } from '../../../../util/vs/platform/instantiation/common/instantiation';
29+
import { IClaudeCodeModels } from './claudeCodeModels';
2930
import { IClaudeSessionStateService } from './claudeSessionStateService';
3031

3132
/**
@@ -75,10 +76,10 @@ export class ClaudeLanguageModelServer extends Disposable {
7576

7677
constructor(
7778
@ILogService private readonly logService: ILogService,
78-
@IEndpointProvider private readonly endpointProvider: IEndpointProvider,
7979
@IClaudeSessionStateService private readonly sessionStateService: IClaudeSessionStateService,
8080
@IRequestLogger private readonly requestLogger: IRequestLogger,
8181
@IInstantiationService private readonly instantiationService: IInstantiationService,
82+
@IClaudeCodeModels private readonly claudeCodeModels: IClaudeCodeModels,
8283
) {
8384
super();
8485
this.config = {
@@ -155,9 +156,7 @@ export class ClaudeLanguageModelServer extends Disposable {
155156
try {
156157
const requestBody: AnthropicMessagesRequest = JSON.parse(bodyString);
157158

158-
const allEndpoints = await this.endpointProvider.getAllChatEndpoints();
159-
// Filter to only endpoints that support the Messages API and are eligible for model picker (i.e. not hidden)
160-
const endpoints = allEndpoints.filter(e => e.apiType === 'messages' && e.showInModelPicker);
159+
const endpoints = await this.claudeCodeModels.getEndpoints();
161160
if (endpoints.length === 0) {
162161
this.error('No Claude models with Messages API available');
163162
this.sendErrorResponse(res, 404, 'not_found_error', 'No Claude models with Messages API available');

src/extension/chatSessions/claude/node/test/claudeCodeModels.spec.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -269,17 +269,17 @@ describe('ClaudeCodeModels', () => {
269269
expect(models).toHaveLength(0);
270270
});
271271

272-
it('does not filter by showInModelPicker', async () => {
272+
it('does filter by showInModelPicker', async () => {
273273
const service = createServiceWithEndpoints([
274274
createMockEndpoint({ model: 'claude-sonnet-4-model', name: 'Claude Sonnet 4', family: 'claude-sonnet-4', showInModelPicker: true }),
275275
createMockEndpoint({ model: 'claude-hidden', name: 'Claude Hidden', family: 'claude-hidden-1', showInModelPicker: false }),
276276
]);
277277

278278
const models = await service.getModels();
279279

280-
expect(models).toHaveLength(2);
280+
expect(models).toHaveLength(1);
281281
const modelIds = models.map(m => m.id).sort();
282-
expect(modelIds).toEqual(['claude-hidden', 'claude-sonnet-4-model']);
282+
expect(modelIds).toEqual(['claude-sonnet-4-model']);
283283
});
284284
});
285285

0 commit comments

Comments
 (0)