


























@@ -120,6 +120,7 @@ type RuntimeParityTranscriptRecord = {
120120};
121121122122type RuntimeParityMockRequestSnapshot = {
123+allInputText?: string;
123124plannedToolName?: string;
124125plannedToolArgs?: unknown;
125126toolOutput?: string;
@@ -798,6 +799,20 @@ function resolveRuntimeParityToolCalls(params: {
798799return params.mockToolCalls;
799800}
800801802+function filterMockRequestsForParentPrompt(
803+requests: RuntimeParityMockRequestSnapshot[],
804+parentPrompt: string,
805+) {
806+const normalizedParentPrompt = normalizeTextForParity(parentPrompt);
807+if (!normalizedParentPrompt) {
808+return requests;
809+}
810+const matching = requests.filter((request) =>
811+normalizeTextForParity(request.allInputText ?? "").includes(normalizedParentPrompt),
812+);
813+return matching.length > 0 ? matching : requests;
814+}
815+801816function summarizeSentinelErrorClass(findings: readonly GatewayLogSentinelFinding[]) {
802817if (findings.length === 0) {
803818return undefined;
@@ -993,6 +1008,7 @@ async function loadRuntimeParityTranscripts(params: {
99310089941009async function loadRuntimeParityMockToolCalls(
9951010mockBaseUrl: string | undefined,
1011+parentPrompt: string,
9961012): Promise<RuntimeParityToolCall[] | null> {
9971013const normalizedBaseUrl = mockBaseUrl?.trim().replace(/\/+$/u, "");
9981014if (!normalizedBaseUrl) {
@@ -1018,12 +1034,15 @@ async function loadRuntimeParityMockToolCalls(
10181034}
10191035const requests = payload.filter(isMessageRecord).map(
10201036(entry): RuntimeParityMockRequestSnapshot => ({
1037+allInputText: readNonEmptyString(entry.allInputText),
10211038plannedToolName: readNonEmptyString(entry.plannedToolName),
10221039plannedToolArgs: entry.plannedToolArgs ?? null,
10231040toolOutput: readNonEmptyString(entry.toolOutput) ?? "",
10241041}),
10251042);
1026-return resolveToolCallOrderFromMockRequests(requests);
1043+return resolveToolCallOrderFromMockRequests(
1044+filterMockRequestsForParentPrompt(requests, parentPrompt),
1045+);
10271046} catch {
10281047return null;
10291048}
@@ -1039,7 +1058,12 @@ export async function captureRuntimeParityCell(
10391058});
10401059const transcriptRecords = buildTranscriptRecords(transcriptBytes);
10411060const transcriptToolCalls = resolveToolCallOrder(transcriptRecords);
1042-const mockToolCalls = await loadRuntimeParityMockToolCalls(params.mockBaseUrl);
1061+const parentPrompt =
1062+transcriptRecords
1063+.filter((record) => record.role === "user" && !isToolResultLikeMessage(record.message))
1064+.map((record) => extractAssistantText(record.message))
1065+.find(Boolean) ?? "";
1066+const mockToolCalls = await loadRuntimeParityMockToolCalls(params.mockBaseUrl, parentPrompt);
10431067const gatewayLogs = params.gateway.logs?.();
10441068const sentinelFindings = [
10451069 ...scanGatewayLogSentinels(gatewayLogs),
@@ -1087,6 +1111,7 @@ export async function runRuntimeParityScenario(params: {
1087111110881112export const testing = {
10891113 classifyRuntimeParityCells,
1114+ filterMockRequestsForParentPrompt,
10901115 resolveRuntimeParityToolCalls,
10911116 resolveToolCallOrderFromMockRequests,
10921117};
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。