diff --git a/src/extension/byok/vscode-node/anthropicProvider.ts b/src/extension/byok/vscode-node/anthropicProvider.ts index 2e34450536..d7b74abc14 100644 --- a/src/extension/byok/vscode-node/anthropicProvider.ts +++ b/src/extension/byok/vscode-node/anthropicProvider.ts @@ -161,14 +161,16 @@ export class AnthropicLMProvider implements BYOKModelProvider ({ - type: 'function', - function: { - name: tool.name, - description: tool.description, - parameters: tool.inputSchema - } - })), + body: { + tools: options.tools?.map((tool): OpenAiFunctionTool => ({ + type: 'function', + function: { + name: tool.name, + description: tool.description, + parameters: tool.inputSchema + } + })) + }, }); // Check if memory tool is present diff --git a/src/extension/byok/vscode-node/geminiNativeProvider.ts b/src/extension/byok/vscode-node/geminiNativeProvider.ts index 2c09c0994b..58419caa73 100644 --- a/src/extension/byok/vscode-node/geminiNativeProvider.ts +++ b/src/extension/byok/vscode-node/geminiNativeProvider.ts @@ -108,14 +108,16 @@ export class GeminiNativeBYOKLMProvider implements BYOKModelProvider ({ - type: 'function', - function: { - name: tool.name, - description: tool.description, - parameters: tool.inputSchema - } - })), + body: { + tools: options.tools?.map((tool): OpenAiFunctionTool => ({ + type: 'function', + function: { + name: tool.name, + description: tool.description, + parameters: tool.inputSchema + } + })) + } }); // Convert VS Code tools to Gemini function declarations diff --git a/src/extension/conversation/vscode-node/feedbackReporter.ts b/src/extension/conversation/vscode-node/feedbackReporter.ts index b64f7fe150..10e494836d 100644 --- a/src/extension/conversation/vscode-node/feedbackReporter.ts +++ b/src/extension/conversation/vscode-node/feedbackReporter.ts @@ -136,7 +136,7 @@ export class FeedbackReporter extends Disposable implements IFeedbackReporter { const responseDump = this._embedCodeblock('ASSISTANT', turn.responseMessage?.message || ''); const workspaceState = await this._instantiationService.createInstance(WorkspaceStateSnapshotHelper).captureWorkspaceStateSnapshot([]); const workspaceStateDump = this._embedCodeblock('WORKSPACE STATE', JSON.stringify(workspaceState, null, 2)); - const toolsDump = params?.tools ? this._embedCodeblock('TOOLS', JSON.stringify(params.tools, null, 2)) : ''; + const toolsDump = params?.body?.tools ? this._embedCodeblock('TOOLS', JSON.stringify(params.body.tools, null, 2)) : ''; const metadata = this._embedCodeblock('METADATA', `requestID: ${turn.id}\nmodel: ${params?.model}`); const edits = (await this._editLogService.getEditLog(turn.id))?.map((edit, i) => { return this._embedCodeblock(`EDIT ${i + 1}`, JSON.stringify(edit, null, 2)); diff --git a/src/extension/prompt/node/chatMLFetcher.ts b/src/extension/prompt/node/chatMLFetcher.ts index 15287deab5..e55d0ea6e8 100644 --- a/src/extension/prompt/node/chatMLFetcher.ts +++ b/src/extension/prompt/node/chatMLFetcher.ts @@ -131,9 +131,7 @@ export class ChatMLFetcherImpl extends AbstractChatMLFetcher { model: chatEndpoint.model, ourRequestId, location: opts.location, - postOptions, body: requestBody, - tools: requestBody.tools, ignoreStatefulMarker: opts.ignoreStatefulMarker }); let tokenCount = -1; diff --git a/src/extension/prompt/vscode-node/requestLoggerImpl.ts b/src/extension/prompt/vscode-node/requestLoggerImpl.ts index f0d8dc8c32..e9ae896b81 100644 --- a/src/extension/prompt/vscode-node/requestLoggerImpl.ts +++ b/src/extension/prompt/vscode-node/requestLoggerImpl.ts @@ -14,7 +14,7 @@ import { ILogService } from '../../../platform/log/common/logService'; import { messageToMarkdown } from '../../../platform/log/common/messageStringify'; import { IResponseDelta } from '../../../platform/networking/common/fetch'; import { IEndpointBody } from '../../../platform/networking/common/networking'; -import { AbstractRequestLogger, ChatRequestScheme, ILoggedElementInfo, ILoggedPendingRequest, ILoggedRequestInfo, ILoggedToolCall, LoggedInfo, LoggedInfoKind, LoggedRequest, LoggedRequestKind } from '../../../platform/requestLogger/node/requestLogger'; +import { AbstractRequestLogger, ChatRequestScheme, ILoggedElementInfo, ILoggedRequestInfo, ILoggedToolCall, LoggedInfo, LoggedInfoKind, LoggedRequest, LoggedRequestKind } from '../../../platform/requestLogger/node/requestLogger'; import { ThinkingData } from '../../../platform/thinking/common/thinking'; import { createFencedCodeBlock } from '../../../util/common/markdown'; import { assertNever } from '../../../util/vs/base/common/assert'; @@ -106,21 +106,6 @@ class LoggedRequestInfo implements ILoggedRequestInfo { }; } - // Extract prediction and tools like _renderRequestToMarkdown does - let prediction: string | undefined; - let tools; - const postOptions = this.entry.chatParams.postOptions && { ...this.entry.chatParams.postOptions }; - if (typeof postOptions?.prediction?.content === 'string') { - prediction = postOptions.prediction.content; - postOptions.prediction = undefined; - } - if ((this.entry.chatParams as ILoggedPendingRequest).tools) { - tools = (this.entry.chatParams as ILoggedPendingRequest).tools; - if (postOptions) { - postOptions.tools = undefined; - } - } - // Handle stateful marker like _renderRequestToMarkdown does let lastResponseId: { marker: string; modelId: string } | undefined; if (!this.entry.chatParams.ignoreStatefulMarker) { @@ -167,9 +152,8 @@ class LoggedRequestInfo implements ILoggedRequestInfo { this.entry.chatEndpoint.urlOrRequestMetadata?.type : undefined, model: this.entry.chatParams.model, maxPromptTokens: this.entry.chatEndpoint.modelMaxPromptTokens, - maxResponseTokens: this.entry.chatParams.postOptions?.max_tokens, + maxResponseTokens: this.entry.chatParams.body?.max_tokens, location: this.entry.chatParams.location, - postOptions: postOptions, reasoning: this.entry.chatParams.body?.reasoning, intent: this.entry.chatParams.intent, startTime: this.entry.startTime?.toISOString(), @@ -182,12 +166,12 @@ class LoggedRequestInfo implements ILoggedRequestInfo { serverRequestId: this.entry.type === LoggedRequestKind.ChatMLSuccess || this.entry.type === LoggedRequestKind.ChatMLFailure ? this.entry.result.serverRequestId : undefined, timeToFirstToken: this.entry.type === LoggedRequestKind.ChatMLSuccess ? this.entry.timeToFirstToken : undefined, usage: this.entry.type === LoggedRequestKind.ChatMLSuccess ? this.entry.usage : undefined, - tools: tools, + tools: this.entry.chatParams.body?.tools, }; const requestMessages = { messages: this.entry.chatParams.messages, - prediction: prediction + prediction: this.entry.chatParams.body?.prediction }; const response = responseData || errorInfo ? { @@ -573,7 +557,7 @@ export class RequestLogger extends AbstractRequestLogger { } result.push(`model : ${entry.chatParams.model}`); result.push(`maxPromptTokens : ${entry.chatEndpoint.modelMaxPromptTokens}`); - result.push(`maxResponseTokens: ${entry.chatParams.postOptions?.max_tokens}`); + result.push(`maxResponseTokens: ${entry.chatParams.body?.max_tokens}`); result.push(`location : ${entry.chatParams.location}`); result.push(`otherOptions : ${JSON.stringify(otherOptions)}`); if (entry.chatParams.body?.reasoning) { @@ -606,8 +590,8 @@ export class RequestLogger extends AbstractRequestLogger { result.push(`requestId : ${entry.result.requestId}`); result.push(`serverRequestId : ${entry.result.serverRequestId}`); } - if (entry.chatParams.tools) { - result.push(`tools : ${JSON.stringify(entry.chatParams.tools, undefined, 4)}`); + if (entry.chatParams.body?.tools) { + result.push(`tools : ${JSON.stringify(entry.chatParams.body.tools, undefined, 4)}`); } result.push(`~~~`); diff --git a/src/platform/endpoint/vscode-node/extChatEndpoint.ts b/src/platform/endpoint/vscode-node/extChatEndpoint.ts index d4df08f82e..a704d4b361 100644 --- a/src/platform/endpoint/vscode-node/extChatEndpoint.ts +++ b/src/platform/endpoint/vscode-node/extChatEndpoint.ts @@ -178,8 +178,9 @@ export class ExtensionContributedChatEndpoint implements IChatEndpoint { model: this.model, ourRequestId, location, - postOptions: requestOptions, - tools: requestOptions?.tools, + body: { + ...requestOptions + }, ignoreStatefulMarker: true }) : undefined; diff --git a/src/platform/requestLogger/node/requestLogger.ts b/src/platform/requestLogger/node/requestLogger.ts index 4caf167a04..18a3500d0c 100644 --- a/src/platform/requestLogger/node/requestLogger.ts +++ b/src/platform/requestLogger/node/requestLogger.ts @@ -8,7 +8,7 @@ import { HTMLTracer, IChatEndpointInfo, Raw, RenderPromptResult } from '@vscode/ import { AsyncLocalStorage } from 'async_hooks'; import type { Event } from 'vscode'; import { ChatFetchError, ChatFetchResponseType, ChatLocation, ChatResponses, FetchSuccess } from '../../../platform/chat/common/commonTypes'; -import { IResponseDelta, OpenAiFunctionTool, OpenAiResponsesFunctionTool, OptionalChatRequestParams } from '../../../platform/networking/common/fetch'; +import { IResponseDelta, OptionalChatRequestParams } from '../../../platform/networking/common/fetch'; import { IChatEndpoint, IEndpointBody } from '../../../platform/networking/common/networking'; import { createServiceIdentifier } from '../../../util/common/services'; import { Disposable } from '../../../util/vs/base/common/lifecycle'; @@ -128,7 +128,6 @@ export interface ILoggedToolCall { export interface ILoggedPendingRequest { messages: Raw.ChatMessage[]; - tools: (OpenAiFunctionTool | OpenAiResponsesFunctionTool)[] | undefined; ourRequestId: string; model: string; location: ChatLocation;