豆豆友情提示:这是一个非官方 GitHub 代理镜像,主要用于网络测试或访问加速。请勿在此进行登录、注册或处理任何敏感信息。进行这些操作请务必访问官方网站 github.com。 Raw 内容也通过此代理提供。
Skip to content

Commit 9e668cb

Browse files
yemohyleyemohyleYevhen Mohylevskyy
andauthored
Yemohyle/subagent telem (#4916)
* initial commit fix request id for subagent and add parentToolCallId * change logging to info * fix headerRequestId missing * fix * fix... * remove debug logging * change back runSubagent changes --------- Co-authored-by: Yevhen Mohylevskyy <yevhenmohylevskyy@Yevhens-MacBook-Pro-2.local>
1 parent 19af311 commit 9e668cb

File tree

7 files changed

+21
-4
lines changed

7 files changed

+21
-4
lines changed

src/extension/prompt/node/chatMLFetcher.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ export class ChatMLFetcherImpl extends AbstractChatMLFetcher {
175175

176176
const baseTelemetry = TelemetryData.createAndMarkAsIssued({
177177
...telemetryProperties,
178+
headerRequestId: ourRequestId,
178179
baseModel: chatEndpoint.model,
179180
uiKind: ChatLocation.toString(location)
180181
});
@@ -1086,6 +1087,8 @@ export class ChatMLFetcherImpl extends AbstractChatMLFetcher {
10861087
});
10871088

10881089
const modelRequestId = getRequestId(connection.responseHeaders);
1090+
// Preserve ourRequestId as headerRequestId if the server didn't echo x-request-id
1091+
modelRequestId.headerRequestId = modelRequestId.headerRequestId || ourRequestId;
10891092
telemetryData.extendWithRequestId(modelRequestId);
10901093

10911094
for (const [key, value] of Object.entries(request)) {
@@ -1094,8 +1097,6 @@ export class ChatMLFetcherImpl extends AbstractChatMLFetcher {
10941097
} // Skip messages (PII)
10951098
telemetryData.properties[`request.option.${key}`] = JSON.stringify(value) ?? 'undefined';
10961099
}
1097-
1098-
telemetryData.properties['headerRequestId'] = ourRequestId;
10991100
this._telemetryService.sendGHTelemetryEvent('request.sent', telemetryData.properties, telemetryData.measurements);
11001101

11011102
const requestStart = Date.now();
@@ -1396,6 +1397,8 @@ export class ChatMLFetcherImpl extends AbstractChatMLFetcher {
13961397
// This ID is hopefully the one the same as ourRequestId, but it is not guaranteed.
13971398
// If they are different then we will override the original one we set in telemetryData above.
13981399
const modelRequestId = getRequestId(response.headers);
1400+
// Preserve ourRequestId as headerRequestId if the server didn't echo x-request-id
1401+
modelRequestId.headerRequestId = modelRequestId.headerRequestId || ourRequestId;
13991402
telemetryData.extendWithRequestId(modelRequestId);
14001403

14011404
// TODO: Add response length (requires parsing)

src/extension/prompt/node/executionSubagentToolCallingLoop.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ export interface IExecutionSubagentToolCallingLoopOptions extends IToolCallingLo
3434
promptText: string;
3535
/** Optional pre-generated subagent invocation ID. If not provided, a new UUID will be generated. */
3636
subAgentInvocationId?: string;
37+
/** The tool_call_id from the parent agent's LLM response that triggered this subagent invocation. */
38+
parentToolCallId?: string;
3739
}
3840

3941
export class ExecutionSubagentToolCallingLoop extends ToolCallingLoop<IExecutionSubagentToolCallingLoopOptions> {
@@ -139,10 +141,12 @@ export class ExecutionSubagentToolCallingLoop extends ToolCallingLoop<IExecution
139141
// This loop is inside a tool called from another request, so never user initiated
140142
userInitiatedRequest: false,
141143
telemetryProperties: {
144+
requestId: this.options.subAgentInvocationId,
142145
messageId: randomUUID(),
143146
messageSource: 'chat.editAgent',
144147
subType: 'subagent/execution',
145-
conversationId: this.options.conversation.sessionId
148+
conversationId: this.options.conversation.sessionId,
149+
parentToolCallId: this.options.parentToolCallId,
146150
},
147151
}, token);
148152
}

src/extension/prompt/node/searchSubagentToolCallingLoop.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ export interface ISearchSubagentToolCallingLoopOptions extends IToolCallingLoopO
3535
promptText: string;
3636
/** Optional pre-generated subagent invocation ID. If not provided, a new UUID will be generated. */
3737
subAgentInvocationId?: string;
38+
/** The tool_call_id from the parent agent's LLM response that triggered this subagent invocation. */
39+
parentToolCallId?: string;
3840
}
3941

4042
export class SearchSubagentToolCallingLoop extends ToolCallingLoop<ISearchSubagentToolCallingLoopOptions> {
@@ -153,10 +155,12 @@ export class SearchSubagentToolCallingLoop extends ToolCallingLoop<ISearchSubage
153155
// This loop is inside a tool called from another request, so never user initiated
154156
userInitiatedRequest: false,
155157
telemetryProperties: {
158+
requestId: this.options.subAgentInvocationId,
156159
messageId: randomUUID(),
157160
messageSource: 'chat.editAgent',
158161
subType: 'subagent/search',
159-
conversationId: this.options.conversation.sessionId
162+
conversationId: this.options.conversation.sessionId,
163+
parentToolCallId: this.options.parentToolCallId,
160164
},
161165
requestKindOptions: { kind: 'subagent' }
162166
}, token);

src/extension/tools/node/executionSubagentTool.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ class ExecutionSubagentTool implements ICopilotTool<IExecutionSubagentParams> {
6767
location: request.location,
6868
promptText: options.input.query,
6969
subAgentInvocationId: subAgentInvocationId,
70+
parentToolCallId: options.chatStreamToolCallId,
7071
});
7172

7273
const stream = this._inputContext?.stream && ChatResponseStreamImpl.filter(

src/extension/tools/node/searchSubagentTool.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ class SearchSubagentTool implements ICopilotTool<ISearchSubagentParams> {
7777
location: request.location,
7878
promptText: options.input.query,
7979
subAgentInvocationId: subAgentInvocationId,
80+
parentToolCallId: options.chatStreamToolCallId,
8081
});
8182

8283
const stream = this._inputContext?.stream && ChatResponseStreamImpl.filter(

src/platform/networking/common/networking.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,8 @@ export type IChatRequestTelemetryProperties = {
214214
subType?: string;
215215
/** For a subagent: The request ID of the parent request that invoked this subagent. */
216216
parentRequestId?: string;
217+
/** For a subagent: The tool_call_id from the parent agent's LLM response that triggered this subagent invocation. */
218+
parentToolCallId?: string;
217219
}
218220

219221
export interface ICreateEndpointBodyOptions extends IMakeChatRequestOptions {

src/platform/networking/node/chatStream.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -390,6 +390,7 @@ function sendModelCallTelemetry(telemetryService: ITelemetryService, messageData
390390

391391
// Send one telemetry event per chunk
392392
for (let chunkIndex = 0; chunkIndex < chunks.length; chunkIndex++) {
393+
const parentToolCallId = telemetryData.properties.parentToolCallId;
393394
const modelCallData = TelemetryData.createAndMarkAsIssued({
394395
modelCallId,
395396
conversationId, // Trajectory identifier linking main and supplementary calls
@@ -402,6 +403,7 @@ function sendModelCallTelemetry(telemetryService: ITelemetryService, messageData
402403
...(requestTurn !== undefined && { requestTurn: requestTurn.toString() }), // Add requestTurn only for input calls
403404
...(requestOptionsId && { requestOptionsId }), // Add requestOptionsId for input calls
404405
...(telemetryData.properties.turnIndex && { turnIndex: telemetryData.properties.turnIndex }), // Add turnIndex from original telemetryData
406+
...(parentToolCallId && { parentToolCallId }), // Link subagent calls to parent tool invocation
405407
}, telemetryData.measurements); // Include measurements from original telemetryData
406408

407409
telemetryService.sendInternalMSFTTelemetryEvent(eventName, modelCallData.properties, modelCallData.measurements);

0 commit comments

Comments
 (0)