Skip to content

Commit 7b92a88

Browse files
authored
[Revert] Including previous responseId for all the requests when compaction is enabled (#4868)
* Attach response output message IDs only to phased assistant messages * noop * Remove stray probe file * noop2 * Remove stray probe file * noop3 * Remove stray probe file * adding correct messageID for the outgoing messages * adding correct messageID for the outgoing messages * adding correct messageID for the outgoing messages * Update defaultIntentRequestHandler snapshots * [Revert:]including previous responseId for all the requests when compaction is enabled
1 parent 9eb7bb4 commit 7b92a88

13 files changed

Lines changed: 14 additions & 327 deletions

File tree

src/extension/conversation/vscode-node/languageModelAccess.ts

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@ import { EmbeddingType, getWellKnownEmbeddingTypeInfo, IEmbeddingsComputer } fro
1616
import { IEndpointProvider } from '../../../platform/endpoint/common/endpointProvider';
1717
import { CustomDataPartMimeTypes } from '../../../platform/endpoint/common/endpointTypes';
1818
import { ModelAliasRegistry } from '../../../platform/endpoint/common/modelAliasRegistry';
19-
import { encodePhaseData } from '../../../platform/endpoint/common/phaseDataContainer';
20-
import { encodeResponseOutputMessageId } from '../../../platform/endpoint/common/responseOutputMessageIdContainer';
2119
import { encodeStatefulMarker } from '../../../platform/endpoint/common/statefulMarkerContainer';
2220
import { AutoChatEndpoint } from '../../../platform/endpoint/node/autoChatEndpoint';
2321
import { IAutomodeService } from '../../../platform/endpoint/node/automodeService';
@@ -717,20 +715,6 @@ export class CopilotLanguageModelWrapper extends Disposable {
717715
);
718716
}
719717

720-
if (delta.phase) {
721-
progress.report(
722-
new vscode.LanguageModelDataPart(encodePhaseData({
723-
phase: delta.phase,
724-
}), CustomDataPartMimeTypes.PhaseData)
725-
);
726-
}
727-
728-
if (delta.responseOutputMessageId) {
729-
progress.report(
730-
new vscode.LanguageModelDataPart(encodeResponseOutputMessageId(delta.responseOutputMessageId), CustomDataPartMimeTypes.ResponseOutputMessageId)
731-
);
732-
}
733-
734718
return undefined;
735719
};
736720
return this._provideLanguageModelResponse(endpoint, messages, options, extensionId, finishCallback, token);

src/extension/conversation/vscode-node/languageModelAccessPrompt.tsx

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@ import { AssistantMessage, PromptElement, PromptElementProps, SystemMessage, Too
88
import * as vscode from 'vscode';
99
import { LanguageModelTextPart } from 'vscode';
1010
import { CustomDataPartMimeTypes } from '../../../platform/endpoint/common/endpointTypes';
11-
import { decodePhaseData, PhaseDataContainer } from '../../../platform/endpoint/common/phaseDataContainer';
12-
import { decodeResponseOutputMessageId, ResponseOutputMessageIdContainer } from '../../../platform/endpoint/common/responseOutputMessageIdContainer';
1311
import { decodeStatefulMarker, StatefulMarkerContainer } from '../../../platform/endpoint/common/statefulMarkerContainer';
1412
import { ThinkingDataContainer } from '../../../platform/endpoint/common/thinkingDataContainer';
1513
import { SafetyRules } from '../../prompts/node/base/safetyRules';
@@ -37,12 +35,6 @@ export class LanguageModelAccessPrompt extends PromptElement<Props> {
3735
.map(part => part.value).join(''));
3836

3937
} else if (message.role === vscode.LanguageModelChatMessageRole.Assistant) {
40-
const phaseDataPart = message.content.find(part => part instanceof vscode.LanguageModelDataPart && part.mimeType === CustomDataPartMimeTypes.PhaseData) as vscode.LanguageModelDataPart | undefined;
41-
const phaseData = phaseDataPart && decodePhaseData(phaseDataPart.data);
42-
const responseOutputMessageIdPart = message.content.find(part => part instanceof vscode.LanguageModelDataPart && part.mimeType === CustomDataPartMimeTypes.ResponseOutputMessageId) as vscode.LanguageModelDataPart | undefined;
43-
const responseOutputMessageId = responseOutputMessageIdPart
44-
? decodeResponseOutputMessageId(responseOutputMessageIdPart.data)
45-
: phaseData?.responseOutputMessageId;
4638
const statefulMarkerPart = message.content.find(part => part instanceof vscode.LanguageModelDataPart && part.mimeType === CustomDataPartMimeTypes.StatefulMarker) as vscode.LanguageModelDataPart | undefined;
4739
const statefulMarker = statefulMarkerPart && decodeStatefulMarker(statefulMarkerPart.data);
4840
const filteredContent = message.content.filter(part => !(part instanceof vscode.LanguageModelDataPart));
@@ -53,9 +45,7 @@ export class LanguageModelAccessPrompt extends PromptElement<Props> {
5345

5446
const statefulMarkerElement = statefulMarker && <StatefulMarkerContainer statefulMarker={statefulMarker} />;
5547
const thinkingElement = thinking && thinking.id && <ThinkingDataContainer thinking={{ id: thinking.id, text: thinking.value, metadata: thinking.metadata }} />;
56-
const responseOutputMessageIdElement = responseOutputMessageId && <ResponseOutputMessageIdContainer responseOutputMessageId={responseOutputMessageId} />;
57-
const phaseElement = phaseData && <PhaseDataContainer phase={phaseData.phase} />;
58-
chatMessages.push(<AssistantMessage name={message.name} toolCalls={toolCalls.map(tc => ({ id: tc.callId, type: 'function', function: { name: tc.name, arguments: JSON.stringify(tc.input) } }))}>{statefulMarkerElement}{thinkingElement}{responseOutputMessageIdElement}{phaseElement}{content?.value}</AssistantMessage>);
48+
chatMessages.push(<AssistantMessage name={message.name} toolCalls={toolCalls.map(tc => ({ id: tc.callId, type: 'function', function: { name: tc.name, arguments: JSON.stringify(tc.input) } }))}>{statefulMarkerElement}{content?.value}{thinkingElement}</AssistantMessage>);
5949
} else if (message.role === vscode.LanguageModelChatMessageRole.User) {
6050
for (const part of message.content) {
6151
if (part instanceof vscode.LanguageModelToolResultPart2 || part instanceof vscode.LanguageModelToolResultPart) {

src/extension/intents/node/toolCallingLoop.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1208,7 +1208,6 @@ export abstract class ToolCallingLoop<TOptions extends IToolCallingLoopOptions =
12081208
let statefulMarker: string | undefined;
12091209
const toolCalls: IToolCall[] = [];
12101210
let thinkingItem: ThinkingDataItem | undefined;
1211-
let responseOutputMessageId: string | undefined;
12121211
const rawEffort = this.options.request.modelConfiguration?.reasoningEffort;
12131212
const reasoningEffort = typeof rawEffort === 'string' ? rawEffort : undefined;
12141213
const shouldDisableThinking = isContinuation && isAnthropicFamily(endpoint) && !ToolCallingLoop.messagesContainThinking(effectiveBuildPromptResult.messages);
@@ -1239,9 +1238,6 @@ export abstract class ToolCallingLoop<TOptions extends IToolCallingLoopOptions =
12391238
if (delta.statefulMarker) {
12401239
statefulMarker = delta.statefulMarker;
12411240
}
1242-
if (delta.responseOutputMessageId) {
1243-
responseOutputMessageId = delta.responseOutputMessageId;
1244-
}
12451241
if (delta.thinking) {
12461242
thinkingItem = ThinkingDataItem.createOrUpdate(thinkingItem, delta.thinking);
12471243
}
@@ -1337,7 +1333,6 @@ export abstract class ToolCallingLoop<TOptions extends IToolCallingLoopOptions =
13371333
response: fetchResult.value,
13381334
toolCalls,
13391335
toolInputRetry,
1340-
responseOutputMessageId,
13411336
statefulMarker,
13421337
thinking: thinkingItem,
13431338
phase,

src/extension/prompt/common/intents.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ export interface IToolCallRound {
3131
toolInputRetry: number;
3232
toolCalls: IToolCall[];
3333
thinking?: ThinkingData;
34-
responseOutputMessageId?: string;
3534
statefulMarker?: string;
3635
/** Compaction data from the Responses API, round-tripped in outgoing requests */
3736
compaction?: OpenAIContextManagementResponse;

src/extension/prompt/common/toolCallRound.ts

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ export class ToolCallRound implements IToolCallRound {
1818
public summary: string | undefined;
1919
public phase?: string;
2020
public phaseModelId?: string;
21-
public responseOutputMessageId?: string;
2221

2322
/**
2423
* Creates a ToolCallRound from an existing IToolCallRound object.
@@ -30,7 +29,6 @@ export class ToolCallRound implements IToolCallRound {
3029
params.toolCalls,
3130
params.toolInputRetry,
3231
params.id,
33-
params.responseOutputMessageId,
3432
params.statefulMarker,
3533
params.thinking,
3634
params.timestamp,
@@ -47,7 +45,6 @@ export class ToolCallRound implements IToolCallRound {
4745
* @param toolCalls The tool calls made by the assistant
4846
* @param toolInputRetry The number of times this round has been retried due to tool input validation failures
4947
* @param id A stable identifier for this round
50-
* @param responseOutputMessageId Optional message ID from the responses API, used for associating the assistant's response with tool call results
5148
* @param statefulMarker Optional stateful marker used with the responses API
5249
* @param thinking Optional thinking/reasoning data
5350
* @param timestamp Epoch millis when this round started (defaults to `Date.now()`)
@@ -57,14 +54,11 @@ export class ToolCallRound implements IToolCallRound {
5754
public readonly toolCalls: IToolCall[] = [],
5855
public readonly toolInputRetry: number = 0,
5956
public readonly id: string = ToolCallRound.generateID(),
60-
responseOutputMessageId?: string,
6157
public readonly statefulMarker?: string,
6258
public readonly thinking?: ThinkingData,
6359
public readonly timestamp: number = Date.now(),
6460
public readonly compaction?: OpenAIContextManagementResponse,
65-
) {
66-
this.responseOutputMessageId = responseOutputMessageId;
67-
}
61+
) { }
6862

6963
private static generateID(): string {
7064
return generateUuid();

src/extension/prompt/node/test/__snapshots__/defaultIntentRequestHandler.spec.ts.snap

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ exports[`defaultIntentRequestHandler > ChatResult metadata after multiple turns
2727
"phase": undefined,
2828
"phaseModelId": undefined,
2929
"response": "response number 0",
30-
"responseOutputMessageId": undefined,
3130
"statefulMarker": undefined,
3231
"summary": undefined,
3332
"thinking": undefined,
@@ -47,7 +46,6 @@ exports[`defaultIntentRequestHandler > ChatResult metadata after multiple turns
4746
"phase": undefined,
4847
"phaseModelId": undefined,
4948
"response": "response number 1",
50-
"responseOutputMessageId": undefined,
5149
"statefulMarker": undefined,
5250
"summary": undefined,
5351
"thinking": undefined,
@@ -67,7 +65,6 @@ exports[`defaultIntentRequestHandler > ChatResult metadata after multiple turns
6765
"phase": undefined,
6866
"phaseModelId": undefined,
6967
"response": "response number 2",
70-
"responseOutputMessageId": undefined,
7168
"statefulMarker": undefined,
7269
"summary": undefined,
7370
"thinking": undefined,
@@ -106,7 +103,6 @@ exports[`defaultIntentRequestHandler > ChatResult metadata after multiple turns
106103
"phase": undefined,
107104
"phaseModelId": undefined,
108105
"response": "response number 3",
109-
"responseOutputMessageId": undefined,
110106
"statefulMarker": undefined,
111107
"summary": undefined,
112108
"thinking": undefined,
@@ -126,7 +122,6 @@ exports[`defaultIntentRequestHandler > ChatResult metadata after multiple turns
126122
"phase": undefined,
127123
"phaseModelId": undefined,
128124
"response": "response number 4",
129-
"responseOutputMessageId": undefined,
130125
"statefulMarker": undefined,
131126
"summary": undefined,
132127
"thinking": undefined,
@@ -146,7 +141,6 @@ exports[`defaultIntentRequestHandler > ChatResult metadata after multiple turns
146141
"phase": undefined,
147142
"phaseModelId": undefined,
148143
"response": "response number 5",
149-
"responseOutputMessageId": undefined,
150144
"statefulMarker": undefined,
151145
"summary": undefined,
152146
"thinking": undefined,
@@ -228,7 +222,6 @@ exports[`defaultIntentRequestHandler > confirms on max tool call iterations, and
228222
"phase": undefined,
229223
"phaseModelId": undefined,
230224
"response": "response number 0",
231-
"responseOutputMessageId": undefined,
232225
"statefulMarker": undefined,
233226
"summary": undefined,
234227
"thinking": undefined,
@@ -248,7 +241,6 @@ exports[`defaultIntentRequestHandler > confirms on max tool call iterations, and
248241
"phase": undefined,
249242
"phaseModelId": undefined,
250243
"response": "response number 1",
251-
"responseOutputMessageId": undefined,
252244
"statefulMarker": undefined,
253245
"summary": undefined,
254246
"thinking": undefined,
@@ -268,7 +260,6 @@ exports[`defaultIntentRequestHandler > confirms on max tool call iterations, and
268260
"phase": undefined,
269261
"phaseModelId": undefined,
270262
"response": "response number 2",
271-
"responseOutputMessageId": undefined,
272263
"statefulMarker": undefined,
273264
"summary": undefined,
274265
"thinking": undefined,
@@ -288,7 +279,6 @@ exports[`defaultIntentRequestHandler > confirms on max tool call iterations, and
288279
"phase": undefined,
289280
"phaseModelId": undefined,
290281
"response": "response number 3",
291-
"responseOutputMessageId": undefined,
292282
"statefulMarker": undefined,
293283
"summary": undefined,
294284
"thinking": undefined,
@@ -350,7 +340,6 @@ exports[`defaultIntentRequestHandler > confirms on max tool call iterations, and
350340
"phase": undefined,
351341
"phaseModelId": undefined,
352342
"response": "response number 4",
353-
"responseOutputMessageId": undefined,
354343
"statefulMarker": undefined,
355344
"summary": undefined,
356345
"thinking": undefined,
@@ -370,7 +359,6 @@ exports[`defaultIntentRequestHandler > confirms on max tool call iterations, and
370359
"phase": undefined,
371360
"phaseModelId": undefined,
372361
"response": "response number 5",
373-
"responseOutputMessageId": undefined,
374362
"statefulMarker": undefined,
375363
"summary": undefined,
376364
"thinking": undefined,
@@ -390,7 +378,6 @@ exports[`defaultIntentRequestHandler > confirms on max tool call iterations, and
390378
"phase": undefined,
391379
"phaseModelId": undefined,
392380
"response": "response number 6",
393-
"responseOutputMessageId": undefined,
394381
"statefulMarker": undefined,
395382
"summary": undefined,
396383
"thinking": undefined,
@@ -410,7 +397,6 @@ exports[`defaultIntentRequestHandler > confirms on max tool call iterations, and
410397
"phase": undefined,
411398
"phaseModelId": undefined,
412399
"response": "response number 7",
413-
"responseOutputMessageId": undefined,
414400
"statefulMarker": undefined,
415401
"summary": undefined,
416402
"thinking": undefined,
@@ -2553,7 +2539,6 @@ exports[`defaultIntentRequestHandler > makes a successful request with a single
25532539
"phase": undefined,
25542540
"phaseModelId": undefined,
25552541
"response": "some response here :)",
2556-
"responseOutputMessageId": undefined,
25572542
"statefulMarker": undefined,
25582543
"summary": undefined,
25592544
"thinking": undefined,
@@ -2886,7 +2871,6 @@ exports[`defaultIntentRequestHandler > makes a tool call turn 1`] = `
28862871
"phase": undefined,
28872872
"phaseModelId": undefined,
28882873
"response": "some response here :)",
2889-
"responseOutputMessageId": undefined,
28902874
"statefulMarker": undefined,
28912875
"summary": undefined,
28922876
"thinking": undefined,
@@ -2906,7 +2890,6 @@ exports[`defaultIntentRequestHandler > makes a tool call turn 1`] = `
29062890
"phase": undefined,
29072891
"phaseModelId": undefined,
29082892
"response": "response to tool call",
2909-
"responseOutputMessageId": undefined,
29102893
"statefulMarker": undefined,
29112894
"summary": undefined,
29122895
"thinking": undefined,

src/extension/prompts/node/panel/toolCalling.tsx

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import { CompactionDataContainer } from '../../../../platform/endpoint/common/co
1515
import { IEndpointProvider } from '../../../../platform/endpoint/common/endpointProvider';
1616
import { CacheType } from '../../../../platform/endpoint/common/endpointTypes';
1717
import { PhaseDataContainer } from '../../../../platform/endpoint/common/phaseDataContainer';
18-
import { ResponseOutputMessageIdContainer } from '../../../../platform/endpoint/common/responseOutputMessageIdContainer';
1918
import { StatefulMarkerContainer } from '../../../../platform/endpoint/common/statefulMarkerContainer';
2019
import { ThinkingDataContainer } from '../../../../platform/endpoint/common/thinkingDataContainer';
2120
import { IFileSystemService } from '../../../../platform/filesystem/common/fileSystemService';
@@ -119,14 +118,12 @@ export class ChatToolCalls extends PromptElement<ChatToolCallsProps, void> {
119118
// Don't include this when rendering and triggering summarization
120119
const statefulMarker = round.statefulMarker && <StatefulMarkerContainer statefulMarker={{ modelId: this.promptEndpoint.model, marker: round.statefulMarker }} />;
121120
const thinking = (!this.props.isHistorical) && round.thinking && <ThinkingDataContainer thinking={round.thinking} />;
122-
const responseOutputMessageId = round.responseOutputMessageId && <ResponseOutputMessageIdContainer responseOutputMessageId={round.responseOutputMessageId} />;
123121
const phase = (round.phase && round.phaseModelId === this.promptEndpoint.model) ? <PhaseDataContainer phase={round.phase} /> : undefined;
124122
const compaction = round.compaction && <CompactionDataContainer compaction={round.compaction} />;
125123
children.push(
126124
<AssistantMessage toolCalls={assistantToolCalls}>
127125
{statefulMarker}
128126
{thinking}
129-
{responseOutputMessageId}
130127
{phase}
131128
{compaction}
132129
{round.response}

src/platform/endpoint/common/endpointTypes.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ export namespace CustomDataPartMimeTypes {
99
export const ThinkingData = 'thinking';
1010
export const ContextManagement = 'context_management';
1111
export const PhaseData = 'phase_data';
12-
export const ResponseOutputMessageId = 'response_output_message_id';
1312
}
1413

1514
export const CacheType = 'ephemeral';

src/platform/endpoint/common/phaseDataContainer.tsx

Lines changed: 5 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,9 @@
55
import { BasePromptElementProps, PromptElement, Raw } from '@vscode/prompt-tsx';
66
import { CustomDataPartMimeTypes } from './endpointTypes';
77

8-
export interface IPhaseData {
9-
phase: string;
10-
responseOutputMessageId?: string;
11-
}
12-
13-
interface IPhaseDataOpaque extends IPhaseData {
8+
interface IPhaseDataOpaque {
149
type: typeof CustomDataPartMimeTypes.PhaseData;
10+
phase: string;
1511
}
1612

1713
export interface IPhaseDataContainerProps extends BasePromptElementProps {
@@ -31,41 +27,17 @@ export class PhaseDataContainer extends PromptElement<IPhaseDataContainerProps>
3127
}
3228

3329
/**
34-
* Attempts to parse a Raw opaque content part into phase metadata, if the type matches.
30+
* Attempts to parse a Raw opaque content part into a phase string, if the type matches.
3531
*/
36-
export function rawPartAsPhaseData(part: Raw.ChatCompletionContentPartOpaque): IPhaseData | undefined {
32+
export function rawPartAsPhaseData(part: Raw.ChatCompletionContentPartOpaque): string | undefined {
3733
const value = part.value as unknown;
3834
if (!value || typeof value !== 'object') {
3935
return;
4036
}
4137

4238
const data = value as IPhaseDataOpaque;
4339
if (data.type === CustomDataPartMimeTypes.PhaseData && typeof data.phase === 'string') {
44-
return {
45-
phase: data.phase,
46-
responseOutputMessageId: typeof data.responseOutputMessageId === 'string' ? data.responseOutputMessageId : undefined,
47-
};
40+
return data.phase;
4841
}
4942
return;
5043
}
51-
52-
export function encodePhaseData(phaseData: IPhaseData): Uint8Array {
53-
return new TextEncoder().encode(JSON.stringify(phaseData));
54-
}
55-
56-
export function decodePhaseData(data: Uint8Array): IPhaseData {
57-
const decoded = new TextDecoder().decode(data);
58-
try {
59-
const parsed = JSON.parse(decoded) as Partial<IPhaseData>;
60-
if (typeof parsed.phase === 'string') {
61-
return {
62-
phase: parsed.phase,
63-
responseOutputMessageId: typeof parsed.responseOutputMessageId === 'string' ? parsed.responseOutputMessageId : undefined,
64-
};
65-
}
66-
} catch {
67-
// Backward compatibility with older data parts that encoded only the phase string.
68-
}
69-
70-
return { phase: decoded };
71-
}

0 commit comments

Comments
 (0)