diff --git a/.changeset/hot-lies-flash.md b/.changeset/hot-lies-flash.md new file mode 100644 index 00000000000..dcd91e33e15 --- /dev/null +++ b/.changeset/hot-lies-flash.md @@ -0,0 +1,5 @@ +--- +"roo-cline": patch +--- + +Add metadata to create message diff --git a/src/api/index.ts b/src/api/index.ts index 3c5fec6d830..f831e58e8d1 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -29,8 +29,17 @@ export interface SingleCompletionHandler { completePrompt(prompt: string): Promise } +export interface ApiHandlerCreateMessageMetadata { + mode?: string + taskId: string +} + export interface ApiHandler { - createMessage(systemPrompt: string, messages: Anthropic.Messages.MessageParam[]): ApiStream + createMessage( + systemPrompt: string, + messages: Anthropic.Messages.MessageParam[], + metadata?: ApiHandlerCreateMessageMetadata, + ): ApiStream getModel(): { id: string; info: ModelInfo } diff --git a/src/api/providers/anthropic-vertex.ts b/src/api/providers/anthropic-vertex.ts index 4a4989bf093..a4ace61c6e8 100644 --- a/src/api/providers/anthropic-vertex.ts +++ b/src/api/providers/anthropic-vertex.ts @@ -11,7 +11,7 @@ import { getModelParams } from "../transform/model-params" import { ANTHROPIC_DEFAULT_MAX_TOKENS } from "./constants" import { BaseProvider } from "./base-provider" -import type { SingleCompletionHandler } from "../index" +import type { SingleCompletionHandler, ApiHandlerCreateMessageMetadata } from "../index" // https://docs.anthropic.com/en/api/claude-on-vertex-ai export class AnthropicVertexHandler extends BaseProvider implements SingleCompletionHandler { @@ -50,7 +50,11 @@ export class AnthropicVertexHandler extends BaseProvider implements SingleComple } } - override async *createMessage(systemPrompt: string, messages: Anthropic.Messages.MessageParam[]): ApiStream { + override async *createMessage( + systemPrompt: string, + messages: Anthropic.Messages.MessageParam[], + metadata?: ApiHandlerCreateMessageMetadata, + ): ApiStream { let { id, info: { supportsPromptCache }, diff --git a/src/api/providers/anthropic.ts b/src/api/providers/anthropic.ts index 4f839994b8b..9c84f388ef1 100644 --- a/src/api/providers/anthropic.ts +++ b/src/api/providers/anthropic.ts @@ -15,7 +15,7 @@ import { getModelParams } from "../transform/model-params" import { ANTHROPIC_DEFAULT_MAX_TOKENS } from "./constants" import { BaseProvider } from "./base-provider" -import type { SingleCompletionHandler } from "../index" +import type { SingleCompletionHandler, ApiHandlerCreateMessageMetadata } from "../index" export class AnthropicHandler extends BaseProvider implements SingleCompletionHandler { private options: ApiHandlerOptions @@ -34,7 +34,11 @@ export class AnthropicHandler extends BaseProvider implements SingleCompletionHa }) } - async *createMessage(systemPrompt: string, messages: Anthropic.Messages.MessageParam[]): ApiStream { + async *createMessage( + systemPrompt: string, + messages: Anthropic.Messages.MessageParam[], + metadata?: ApiHandlerCreateMessageMetadata, + ): ApiStream { let stream: AnthropicStream const cacheControl: CacheControlEphemeral = { type: "ephemeral" } let { id: modelId, betas = [], maxTokens, temperature, reasoning: thinking } = this.getModel() diff --git a/src/api/providers/base-openai-compatible-provider.ts b/src/api/providers/base-openai-compatible-provider.ts index 82eeb830331..ba9d67b6e38 100644 --- a/src/api/providers/base-openai-compatible-provider.ts +++ b/src/api/providers/base-openai-compatible-provider.ts @@ -5,7 +5,7 @@ import { ApiHandlerOptions, ModelInfo } from "../../shared/api" import { ApiStream } from "../transform/stream" import { convertToOpenAiMessages } from "../transform/openai-format" -import { SingleCompletionHandler } from "../index" +import type { SingleCompletionHandler, ApiHandlerCreateMessageMetadata } from "../index" import { DEFAULT_HEADERS } from "./constants" import { BaseProvider } from "./base-provider" @@ -60,7 +60,11 @@ export abstract class BaseOpenAiCompatibleProvider }) } - override async *createMessage(systemPrompt: string, messages: Anthropic.Messages.MessageParam[]): ApiStream { + override async *createMessage( + systemPrompt: string, + messages: Anthropic.Messages.MessageParam[], + metadata?: ApiHandlerCreateMessageMetadata, + ): ApiStream { const { id: model, info: { maxTokens: max_tokens }, diff --git a/src/api/providers/base-provider.ts b/src/api/providers/base-provider.ts index c03994b3345..edb15a3f85a 100644 --- a/src/api/providers/base-provider.ts +++ b/src/api/providers/base-provider.ts @@ -2,7 +2,7 @@ import { Anthropic } from "@anthropic-ai/sdk" import { ModelInfo } from "../../shared/api" -import { ApiHandler } from "../index" +import type { ApiHandler, ApiHandlerCreateMessageMetadata } from "../index" import { ApiStream } from "../transform/stream" import { countTokens } from "../../utils/countTokens" @@ -10,7 +10,11 @@ import { countTokens } from "../../utils/countTokens" * Base class for API providers that implements common functionality. */ export abstract class BaseProvider implements ApiHandler { - abstract createMessage(systemPrompt: string, messages: Anthropic.Messages.MessageParam[]): ApiStream + abstract createMessage( + systemPrompt: string, + messages: Anthropic.Messages.MessageParam[], + metadata?: ApiHandlerCreateMessageMetadata, + ): ApiStream abstract getModel(): { id: string; info: ModelInfo } /** diff --git a/src/api/providers/bedrock.ts b/src/api/providers/bedrock.ts index ae5b421a5a1..c3784414848 100644 --- a/src/api/providers/bedrock.ts +++ b/src/api/providers/bedrock.ts @@ -9,7 +9,6 @@ import { } from "@aws-sdk/client-bedrock-runtime" import { fromIni } from "@aws-sdk/credential-providers" import { Anthropic } from "@anthropic-ai/sdk" -import { SingleCompletionHandler } from "../" import { BedrockModelId, ModelInfo as SharedModelInfo, @@ -26,6 +25,7 @@ import { MultiPointStrategy } from "../transform/cache-strategy/multi-point-stra import { ModelInfo as CacheModelInfo } from "../transform/cache-strategy/types" import { AMAZON_BEDROCK_REGION_INFO } from "../../shared/aws_regions" import { convertToBedrockConverseMessages as sharedConverter } from "../transform/bedrock-converse-format" +import type { SingleCompletionHandler, ApiHandlerCreateMessageMetadata } from "../index" const BEDROCK_DEFAULT_TEMPERATURE = 0.3 const BEDROCK_MAX_TOKENS = 4096 @@ -189,7 +189,11 @@ export class AwsBedrockHandler extends BaseProvider implements SingleCompletionH this.client = new BedrockRuntimeClient(clientConfig) } - override async *createMessage(systemPrompt: string, messages: Anthropic.Messages.MessageParam[]): ApiStream { + override async *createMessage( + systemPrompt: string, + messages: Anthropic.Messages.MessageParam[], + metadata?: ApiHandlerCreateMessageMetadata, + ): ApiStream { let modelConfig = this.getModel() // Handle cross-region inference const usePromptCache = Boolean(this.options.awsUsePromptCache && this.supportsAwsPromptCache(modelConfig)) @@ -769,7 +773,7 @@ export class AwsBedrockHandler extends BaseProvider implements SingleCompletionH > = { ACCESS_DENIED: { patterns: ["access", "denied", "permission"], - messageTemplate: `You don't have access to the model specified. + messageTemplate: `You don't have access to the model specified. Please verify: 1. Try cross-region inference if you're using a foundation model diff --git a/src/api/providers/fake-ai.ts b/src/api/providers/fake-ai.ts index 68d028338e7..9c4f1ca7099 100644 --- a/src/api/providers/fake-ai.ts +++ b/src/api/providers/fake-ai.ts @@ -1,7 +1,7 @@ import { Anthropic } from "@anthropic-ai/sdk" -import { ApiHandler, SingleCompletionHandler } from ".." import { ApiHandlerOptions, ModelInfo } from "../../shared/api" import { ApiStream } from "../transform/stream" +import type { ApiHandler, SingleCompletionHandler, ApiHandlerCreateMessageMetadata } from "../index" interface FakeAI { /** @@ -18,7 +18,11 @@ interface FakeAI { */ removeFromCache?: () => void - createMessage(systemPrompt: string, messages: Anthropic.Messages.MessageParam[]): ApiStream + createMessage( + systemPrompt: string, + messages: Anthropic.Messages.MessageParam[], + metadata?: ApiHandlerCreateMessageMetadata, + ): ApiStream getModel(): { id: string; info: ModelInfo } countTokens(content: Array): Promise completePrompt(prompt: string): Promise @@ -52,8 +56,12 @@ export class FakeAIHandler implements ApiHandler, SingleCompletionHandler { this.ai = cachedFakeAi } - async *createMessage(systemPrompt: string, messages: Anthropic.Messages.MessageParam[]): ApiStream { - yield* this.ai.createMessage(systemPrompt, messages) + async *createMessage( + systemPrompt: string, + messages: Anthropic.Messages.MessageParam[], + metadata?: ApiHandlerCreateMessageMetadata, + ): ApiStream { + yield* this.ai.createMessage(systemPrompt, messages, metadata) } getModel(): { id: string; info: ModelInfo } { diff --git a/src/api/providers/gemini.ts b/src/api/providers/gemini.ts index d519d5e6295..31c802d2de1 100644 --- a/src/api/providers/gemini.ts +++ b/src/api/providers/gemini.ts @@ -10,7 +10,7 @@ import type { JWTInput } from "google-auth-library" import { ApiHandlerOptions, ModelInfo, GeminiModelId, geminiDefaultModelId, geminiModels } from "../../shared/api" import { safeJsonParse } from "../../shared/safeJsonParse" -import { SingleCompletionHandler } from "../index" +import type { SingleCompletionHandler, ApiHandlerCreateMessageMetadata } from "../index" import { convertAnthropicContentToGemini, convertAnthropicMessageToGemini } from "../transform/gemini-format" import type { ApiStream } from "../transform/stream" import { BaseProvider } from "./base-provider" @@ -54,7 +54,11 @@ export class GeminiHandler extends BaseProvider implements SingleCompletionHandl : new GoogleGenAI({ apiKey }) } - async *createMessage(systemInstruction: string, messages: Anthropic.Messages.MessageParam[]): ApiStream { + async *createMessage( + systemInstruction: string, + messages: Anthropic.Messages.MessageParam[], + metadata?: ApiHandlerCreateMessageMetadata, + ): ApiStream { const { id: model, thinkingConfig, maxOutputTokens, info } = this.getModel() const contents = messages.map(convertAnthropicMessageToGemini) diff --git a/src/api/providers/glama.ts b/src/api/providers/glama.ts index 6010c85d41d..e743f823994 100644 --- a/src/api/providers/glama.ts +++ b/src/api/providers/glama.ts @@ -9,7 +9,7 @@ import { ApiStream } from "../transform/stream" import { convertToOpenAiMessages } from "../transform/openai-format" import { addCacheBreakpoints } from "../transform/caching/anthropic" -import { SingleCompletionHandler } from "../index" +import type { SingleCompletionHandler, ApiHandlerCreateMessageMetadata } from "../index" import { RouterProvider } from "./router-provider" const GLAMA_DEFAULT_TEMPERATURE = 0 @@ -33,7 +33,11 @@ export class GlamaHandler extends RouterProvider implements SingleCompletionHand }) } - override async *createMessage(systemPrompt: string, messages: Anthropic.Messages.MessageParam[]): ApiStream { + override async *createMessage( + systemPrompt: string, + messages: Anthropic.Messages.MessageParam[], + metadata?: ApiHandlerCreateMessageMetadata, + ): ApiStream { const { id: modelId, info } = await this.fetchModel() const openAiMessages: OpenAI.Chat.ChatCompletionMessageParam[] = [ diff --git a/src/api/providers/human-relay.ts b/src/api/providers/human-relay.ts index 7a7f3c10a18..4abdf7b0c0a 100644 --- a/src/api/providers/human-relay.ts +++ b/src/api/providers/human-relay.ts @@ -4,7 +4,7 @@ import * as vscode from "vscode" import { ModelInfo } from "../../shared/api" import { getCommand } from "../../utils/commands" import { ApiStream } from "../transform/stream" -import { ApiHandler, SingleCompletionHandler } from "../index" +import type { ApiHandler, SingleCompletionHandler, ApiHandlerCreateMessageMetadata } from "../index" /** * Human Relay API processor * This processor does not directly call the API, but interacts with the model through human operations copy and paste. @@ -18,8 +18,13 @@ export class HumanRelayHandler implements ApiHandler, SingleCompletionHandler { * Create a message processing flow, display a dialog box to request human assistance * @param systemPrompt System prompt words * @param messages Message list + * @param metadata Optional metadata */ - async *createMessage(systemPrompt: string, messages: Anthropic.Messages.MessageParam[]): ApiStream { + async *createMessage( + systemPrompt: string, + messages: Anthropic.Messages.MessageParam[], + metadata?: ApiHandlerCreateMessageMetadata, + ): ApiStream { // Get the most recent user message const latestMessage = messages[messages.length - 1] diff --git a/src/api/providers/litellm.ts b/src/api/providers/litellm.ts index be88ede5f60..fc29f2c5f81 100644 --- a/src/api/providers/litellm.ts +++ b/src/api/providers/litellm.ts @@ -4,7 +4,7 @@ import { Anthropic } from "@anthropic-ai/sdk" // Keep for type usage only import { ApiHandlerOptions, litellmDefaultModelId, litellmDefaultModelInfo } from "../../shared/api" import { ApiStream, ApiStreamUsageChunk } from "../transform/stream" import { convertToOpenAiMessages } from "../transform/openai-format" -import { SingleCompletionHandler } from "../index" +import type { SingleCompletionHandler, ApiHandlerCreateMessageMetadata } from "../index" import { RouterProvider } from "./router-provider" /** @@ -26,7 +26,11 @@ export class LiteLLMHandler extends RouterProvider implements SingleCompletionHa }) } - override async *createMessage(systemPrompt: string, messages: Anthropic.Messages.MessageParam[]): ApiStream { + override async *createMessage( + systemPrompt: string, + messages: Anthropic.Messages.MessageParam[], + metadata?: ApiHandlerCreateMessageMetadata, + ): ApiStream { const { id: modelId, info } = await this.fetchModel() const openAiMessages: OpenAI.Chat.ChatCompletionMessageParam[] = [ diff --git a/src/api/providers/lmstudio.ts b/src/api/providers/lmstudio.ts index c750c32a267..e1aee5e53e1 100644 --- a/src/api/providers/lmstudio.ts +++ b/src/api/providers/lmstudio.ts @@ -2,12 +2,12 @@ import { Anthropic } from "@anthropic-ai/sdk" import OpenAI from "openai" import axios from "axios" -import { SingleCompletionHandler } from "../" import { ApiHandlerOptions, ModelInfo, openAiModelInfoSaneDefaults } from "../../shared/api" import { convertToOpenAiMessages } from "../transform/openai-format" import { ApiStream } from "../transform/stream" import { BaseProvider } from "./base-provider" import { XmlMatcher } from "../../utils/xml-matcher" +import type { SingleCompletionHandler, ApiHandlerCreateMessageMetadata } from "../index" const LMSTUDIO_DEFAULT_TEMPERATURE = 0 @@ -24,7 +24,11 @@ export class LmStudioHandler extends BaseProvider implements SingleCompletionHan }) } - override async *createMessage(systemPrompt: string, messages: Anthropic.Messages.MessageParam[]): ApiStream { + override async *createMessage( + systemPrompt: string, + messages: Anthropic.Messages.MessageParam[], + metadata?: ApiHandlerCreateMessageMetadata, + ): ApiStream { const openAiMessages: OpenAI.Chat.ChatCompletionMessageParam[] = [ { role: "system", content: systemPrompt }, ...convertToOpenAiMessages(messages), diff --git a/src/api/providers/mistral.ts b/src/api/providers/mistral.ts index 4daaa2ab855..58cd7c7952a 100644 --- a/src/api/providers/mistral.ts +++ b/src/api/providers/mistral.ts @@ -1,10 +1,10 @@ import { Anthropic } from "@anthropic-ai/sdk" import { Mistral } from "@mistralai/mistralai" -import { SingleCompletionHandler } from "../" import { ApiHandlerOptions, mistralDefaultModelId, MistralModelId, mistralModels, ModelInfo } from "../../shared/api" import { convertToMistralMessages } from "../transform/mistral-format" import { ApiStream } from "../transform/stream" import { BaseProvider } from "./base-provider" +import type { SingleCompletionHandler, ApiHandlerCreateMessageMetadata } from "../index" const MISTRAL_DEFAULT_TEMPERATURE = 0 @@ -41,7 +41,13 @@ export class MistralHandler extends BaseProvider implements SingleCompletionHand return "https://api.mistral.ai" } - override async *createMessage(systemPrompt: string, messages: Anthropic.Messages.MessageParam[]): ApiStream { + override async *createMessage( + systemPrompt: string, + messages: Anthropic.Messages.MessageParam[], + metadata?: ApiHandlerCreateMessageMetadata, + ): ApiStream { + const { id: model } = this.getModel() + const response = await this.client.chat.stream({ model: this.options.apiModelId || mistralDefaultModelId, messages: [{ role: "system", content: systemPrompt }, ...convertToMistralMessages(messages)], diff --git a/src/api/providers/ollama.ts b/src/api/providers/ollama.ts index 1b721a59093..ba2495c0959 100644 --- a/src/api/providers/ollama.ts +++ b/src/api/providers/ollama.ts @@ -2,7 +2,7 @@ import { Anthropic } from "@anthropic-ai/sdk" import OpenAI from "openai" import axios from "axios" -import { SingleCompletionHandler } from "../" +import type { SingleCompletionHandler, ApiHandlerCreateMessageMetadata } from "../index" import { ApiHandlerOptions, ModelInfo, openAiModelInfoSaneDefaults } from "../../shared/api" import { convertToOpenAiMessages } from "../transform/openai-format" import { convertToR1Format } from "../transform/r1-format" @@ -27,7 +27,11 @@ export class OllamaHandler extends BaseProvider implements SingleCompletionHandl }) } - override async *createMessage(systemPrompt: string, messages: Anthropic.Messages.MessageParam[]): ApiStream { + override async *createMessage( + systemPrompt: string, + messages: Anthropic.Messages.MessageParam[], + metadata?: ApiHandlerCreateMessageMetadata, + ): ApiStream { const modelId = this.getModel().id const useR1Format = modelId.toLowerCase().includes("deepseek-r1") const openAiMessages: OpenAI.Chat.ChatCompletionMessageParam[] = [ diff --git a/src/api/providers/openai-native.ts b/src/api/providers/openai-native.ts index 1999637228a..8ce7eaa5eff 100644 --- a/src/api/providers/openai-native.ts +++ b/src/api/providers/openai-native.ts @@ -15,7 +15,7 @@ import { convertToOpenAiMessages } from "../transform/openai-format" import { ApiStream } from "../transform/stream" import { getModelParams } from "../transform/model-params" -import type { SingleCompletionHandler } from "../index" +import type { SingleCompletionHandler, ApiHandlerCreateMessageMetadata } from "../index" import { BaseProvider } from "./base-provider" const OPENAI_NATIVE_DEFAULT_TEMPERATURE = 0 @@ -33,7 +33,11 @@ export class OpenAiNativeHandler extends BaseProvider implements SingleCompletio this.client = new OpenAI({ baseURL: this.options.openAiNativeBaseUrl, apiKey }) } - override async *createMessage(systemPrompt: string, messages: Anthropic.Messages.MessageParam[]): ApiStream { + override async *createMessage( + systemPrompt: string, + messages: Anthropic.Messages.MessageParam[], + metadata?: ApiHandlerCreateMessageMetadata, + ): ApiStream { const model = this.getModel() let id: "o3-mini" | "o3" | "o4-mini" | undefined diff --git a/src/api/providers/openai.ts b/src/api/providers/openai.ts index 73f5f0b8828..69d0040d0db 100644 --- a/src/api/providers/openai.ts +++ b/src/api/providers/openai.ts @@ -18,7 +18,7 @@ import { ApiStream, ApiStreamUsageChunk } from "../transform/stream" import { getModelParams } from "../transform/model-params" import { DEFAULT_HEADERS, DEEP_SEEK_DEFAULT_TEMPERATURE } from "./constants" -import type { SingleCompletionHandler } from "../index" +import type { SingleCompletionHandler, ApiHandlerCreateMessageMetadata } from "../index" import { BaseProvider } from "./base-provider" export const AZURE_AI_INFERENCE_PATH = "/models/chat/completions" @@ -71,7 +71,11 @@ export class OpenAiHandler extends BaseProvider implements SingleCompletionHandl } } - override async *createMessage(systemPrompt: string, messages: Anthropic.Messages.MessageParam[]): ApiStream { + override async *createMessage( + systemPrompt: string, + messages: Anthropic.Messages.MessageParam[], + metadata?: ApiHandlerCreateMessageMetadata, + ): ApiStream { const { info: modelInfo, reasoning } = this.getModel() const modelUrl = this.options.openAiBaseUrl ?? "" const modelId = this.options.openAiModelId ?? "" diff --git a/src/api/providers/requesty.ts b/src/api/providers/requesty.ts index c2e0a12bdd5..1c21af5241c 100644 --- a/src/api/providers/requesty.ts +++ b/src/api/providers/requesty.ts @@ -9,7 +9,7 @@ import { import { convertToOpenAiMessages } from "../transform/openai-format" import { calculateApiCostOpenAI } from "../../utils/cost" import { ApiStream, ApiStreamUsageChunk } from "../transform/stream" -import { SingleCompletionHandler } from "../" +import type { SingleCompletionHandler, ApiHandlerCreateMessageMetadata } from "../" import { BaseProvider } from "./base-provider" import { DEFAULT_HEADERS } from "./constants" import { getModels } from "./fetchers/modelCache" @@ -25,7 +25,14 @@ interface RequestyUsage extends OpenAI.CompletionUsage { total_cost?: number } -type RequestyChatCompletionParams = OpenAI.Chat.ChatCompletionCreateParams & {} +type RequestyChatCompletionParams = OpenAI.Chat.ChatCompletionCreateParams & { + requesty?: { + trace_id?: string + extra?: { + mode?: string + } + } +} export class RequestyHandler extends BaseProvider implements SingleCompletionHandler { protected options: ApiHandlerOptions @@ -75,7 +82,11 @@ export class RequestyHandler extends BaseProvider implements SingleCompletionHan } } - override async *createMessage(systemPrompt: string, messages: Anthropic.Messages.MessageParam[]): ApiStream { + override async *createMessage( + systemPrompt: string, + messages: Anthropic.Messages.MessageParam[], + metadata?: ApiHandlerCreateMessageMetadata, + ): ApiStream { const model = await this.fetchModel() let openAiMessages: OpenAI.Chat.ChatCompletionMessageParam[] = [ @@ -97,6 +108,12 @@ export class RequestyHandler extends BaseProvider implements SingleCompletionHan temperature: temperature, stream: true, stream_options: { include_usage: true }, + requesty: { + trace_id: metadata?.taskId, + extra: { + mode: metadata?.mode, + }, + }, } const stream = await this.client.chat.completions.create(completionParams) diff --git a/src/api/providers/unbound.ts b/src/api/providers/unbound.ts index 5e8dbf66b40..5ca38a85140 100644 --- a/src/api/providers/unbound.ts +++ b/src/api/providers/unbound.ts @@ -7,7 +7,7 @@ import { ApiStream, ApiStreamUsageChunk } from "../transform/stream" import { convertToOpenAiMessages } from "../transform/openai-format" import { addCacheBreakpoints } from "../transform/caching/anthropic" -import { SingleCompletionHandler } from "../index" +import type { SingleCompletionHandler, ApiHandlerCreateMessageMetadata } from "../index" import { RouterProvider } from "./router-provider" const DEFAULT_HEADERS = { @@ -32,7 +32,11 @@ export class UnboundHandler extends RouterProvider implements SingleCompletionHa }) } - override async *createMessage(systemPrompt: string, messages: Anthropic.Messages.MessageParam[]): ApiStream { + override async *createMessage( + systemPrompt: string, + messages: Anthropic.Messages.MessageParam[], + metadata?: ApiHandlerCreateMessageMetadata, + ): ApiStream { const { id: modelId, info } = await this.fetchModel() const openAiMessages: OpenAI.Chat.ChatCompletionMessageParam[] = [ diff --git a/src/api/providers/vscode-lm.ts b/src/api/providers/vscode-lm.ts index c06510c26c6..61aab91123f 100644 --- a/src/api/providers/vscode-lm.ts +++ b/src/api/providers/vscode-lm.ts @@ -1,12 +1,12 @@ import { Anthropic } from "@anthropic-ai/sdk" import * as vscode from "vscode" -import { SingleCompletionHandler } from "../" import { ApiStream } from "../transform/stream" import { convertToVsCodeLmMessages } from "../transform/vscode-lm-format" import { SELECTOR_SEPARATOR, stringifyVsCodeLmModelSelector } from "../../shared/vsCodeSelectorUtils" import { ApiHandlerOptions, ModelInfo, openAiModelInfoSaneDefaults } from "../../shared/api" import { BaseProvider } from "./base-provider" +import type { SingleCompletionHandler, ApiHandler, ApiHandlerCreateMessageMetadata } from "../index" /** * Handles interaction with VS Code's Language Model API for chat-based operations. @@ -148,6 +148,7 @@ export class VsCodeLmHandler extends BaseProvider implements SingleCompletionHan * * @param systemPrompt - The system prompt to initialize the conversation context * @param messages - An array of message parameters following the Anthropic message format + * @param metadata - Optional metadata for the message * * @yields {ApiStream} An async generator that yields either text chunks or tool calls from the model response * @@ -329,7 +330,11 @@ export class VsCodeLmHandler extends BaseProvider implements SingleCompletionHan return content } - override async *createMessage(systemPrompt: string, messages: Anthropic.Messages.MessageParam[]): ApiStream { + override async *createMessage( + systemPrompt: string, + messages: Anthropic.Messages.MessageParam[], + metadata?: ApiHandlerCreateMessageMetadata, + ): ApiStream { // Ensure clean state before starting a new request this.ensureCleanState() const client: vscode.LanguageModelChat = await this.getClient() diff --git a/src/api/providers/xai.ts b/src/api/providers/xai.ts index 58654f67321..280b6800f0e 100644 --- a/src/api/providers/xai.ts +++ b/src/api/providers/xai.ts @@ -9,7 +9,7 @@ import { getModelParams } from "../transform/model-params" import { DEFAULT_HEADERS } from "./constants" import { BaseProvider } from "./base-provider" -import { type SingleCompletionHandler } from "../index" +import type { SingleCompletionHandler, ApiHandlerCreateMessageMetadata } from "../index" const XAI_DEFAULT_TEMPERATURE = 0 @@ -38,7 +38,11 @@ export class XAIHandler extends BaseProvider implements SingleCompletionHandler return { id, info, ...params } } - override async *createMessage(systemPrompt: string, messages: Anthropic.Messages.MessageParam[]): ApiStream { + override async *createMessage( + systemPrompt: string, + messages: Anthropic.Messages.MessageParam[], + metadata?: ApiHandlerCreateMessageMetadata, + ): ApiStream { const { id: modelId, info: modelInfo, reasoning } = this.getModel() // Use the OpenAI-compatible API. diff --git a/src/core/task/Task.ts b/src/core/task/Task.ts index 4c307a3ed05..231a6049ad5 100644 --- a/src/core/task/Task.ts +++ b/src/core/task/Task.ts @@ -12,7 +12,7 @@ import { serializeError } from "serialize-error" import { TokenUsage, ToolUsage, ToolName, ContextCondense } from "../../schemas" // api -import { ApiHandler, buildApiHandler } from "../../api" +import { ApiHandler, ApiHandlerCreateMessageMetadata, buildApiHandler } from "../../api" import { ApiStream } from "../../api/transform/stream" // shared @@ -1499,6 +1499,7 @@ export class Task extends EventEmitter { alwaysApproveResubmit, requestDelaySeconds, experiments, + mode, autoCondenseContextPercent = 100, } = state ?? {} @@ -1614,7 +1615,12 @@ export class Task extends EventEmitter { } } - const stream = this.api.createMessage(systemPrompt, cleanConversationHistory) + const metadata: ApiHandlerCreateMessageMetadata = { + mode: mode, + taskId: this.taskId, + } + + const stream = this.api.createMessage(systemPrompt, cleanConversationHistory, metadata) const iterator = stream[Symbol.asyncIterator]() try {