ГЛОБАЛЬНЫЙ РЕФАКТОРИНГ АРХИТЕКТУРЫ - Рефакторинг этапов 2.12.23: декомпозиция deep-turn пайплайна ассистента в runtime-адаптеры
This commit is contained in:
@@ -0,0 +1,131 @@
|
||||
import type { UnifiedRetrievalResult } from "../types/assistant";
|
||||
import type { AssistantExecutionPlanItem } from "./assistantQueryPlanning";
|
||||
import { normalizeRetrievalResult } from "./retrievalResultNormalizer";
|
||||
|
||||
export interface AssistantLiveTemporalHint {
|
||||
as_of_date: string | null;
|
||||
period_from: string | null;
|
||||
period_to: string | null;
|
||||
source: string | null;
|
||||
}
|
||||
|
||||
export interface AssistantRetrievalCallRecord {
|
||||
fragment_id: string;
|
||||
requirement_ids: string[];
|
||||
route: string;
|
||||
status: "skipped" | "executed" | "failed";
|
||||
query_text: string;
|
||||
reason: string | null;
|
||||
}
|
||||
|
||||
export interface AssistantRetrievalRawResultRecord {
|
||||
fragment_id: string;
|
||||
route: string;
|
||||
raw_result: unknown;
|
||||
}
|
||||
|
||||
export interface AssistantDeepTurnRetrievalExecutionInput {
|
||||
executionPlan: AssistantExecutionPlanItem[];
|
||||
liveTemporalHint: AssistantLiveTemporalHint | null;
|
||||
executeRouteRuntime: (
|
||||
route: string,
|
||||
fragmentText: string,
|
||||
options: {
|
||||
temporalHint: AssistantLiveTemporalHint | null;
|
||||
}
|
||||
) => Promise<unknown>;
|
||||
mapNoRouteReason: (reason: string | null) => string;
|
||||
buildSkippedResult: (item: AssistantExecutionPlanItem) => UnifiedRetrievalResult;
|
||||
normalizeRetrievalResultFn?: typeof normalizeRetrievalResult;
|
||||
}
|
||||
|
||||
export interface AssistantDeepTurnRetrievalExecutionOutput {
|
||||
retrievalCalls: AssistantRetrievalCallRecord[];
|
||||
retrievalResultsRaw: AssistantRetrievalRawResultRecord[];
|
||||
retrievalResults: UnifiedRetrievalResult[];
|
||||
}
|
||||
|
||||
function buildRouteExecutorErrorRawResult(route: string, message: string): Record<string, unknown> {
|
||||
return {
|
||||
status: "error",
|
||||
result_type: "summary",
|
||||
items: [],
|
||||
summary: {
|
||||
route
|
||||
},
|
||||
evidence: [],
|
||||
why_included: [],
|
||||
selection_reason: [],
|
||||
risk_factors: [],
|
||||
business_interpretation: [],
|
||||
confidence: "low",
|
||||
limitations: ["Route executor failed."],
|
||||
errors: [message]
|
||||
};
|
||||
}
|
||||
|
||||
export async function executeAssistantDeepTurnRetrievalPlan(
|
||||
input: AssistantDeepTurnRetrievalExecutionInput
|
||||
): Promise<AssistantDeepTurnRetrievalExecutionOutput> {
|
||||
const normalizeRetrievalResultSafe = input.normalizeRetrievalResultFn ?? normalizeRetrievalResult;
|
||||
const retrievalCalls: AssistantRetrievalCallRecord[] = [];
|
||||
const retrievalResultsRaw: AssistantRetrievalRawResultRecord[] = [];
|
||||
const retrievalResults: UnifiedRetrievalResult[] = [];
|
||||
|
||||
for (const planItem of input.executionPlan) {
|
||||
if (!planItem.should_execute) {
|
||||
retrievalCalls.push({
|
||||
fragment_id: planItem.fragment_id,
|
||||
requirement_ids: planItem.requirement_ids,
|
||||
route: planItem.route,
|
||||
status: "skipped",
|
||||
query_text: planItem.fragment_text,
|
||||
reason: input.mapNoRouteReason(planItem.no_route_reason)
|
||||
});
|
||||
retrievalResults.push(input.buildSkippedResult(planItem));
|
||||
continue;
|
||||
}
|
||||
|
||||
retrievalCalls.push({
|
||||
fragment_id: planItem.fragment_id,
|
||||
requirement_ids: planItem.requirement_ids,
|
||||
route: planItem.route,
|
||||
status: "executed",
|
||||
query_text: planItem.fragment_text,
|
||||
reason: null
|
||||
});
|
||||
|
||||
try {
|
||||
const raw = await input.executeRouteRuntime(planItem.route, planItem.fragment_text, {
|
||||
temporalHint: input.liveTemporalHint
|
||||
});
|
||||
retrievalResultsRaw.push({
|
||||
fragment_id: planItem.fragment_id,
|
||||
route: planItem.route,
|
||||
raw_result: raw
|
||||
});
|
||||
retrievalResults.push(
|
||||
normalizeRetrievalResultSafe(planItem.fragment_id, planItem.requirement_ids, planItem.route, raw as any)
|
||||
);
|
||||
} catch (error) {
|
||||
const message = error instanceof Error ? error.message : String(error);
|
||||
retrievalCalls[retrievalCalls.length - 1].status = "failed";
|
||||
retrievalCalls[retrievalCalls.length - 1].reason = message;
|
||||
const rawError = buildRouteExecutorErrorRawResult(planItem.route, message);
|
||||
retrievalResultsRaw.push({
|
||||
fragment_id: planItem.fragment_id,
|
||||
route: planItem.route,
|
||||
raw_result: rawError
|
||||
});
|
||||
retrievalResults.push(
|
||||
normalizeRetrievalResultSafe(planItem.fragment_id, planItem.requirement_ids, planItem.route, rawError as any)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
retrievalCalls,
|
||||
retrievalResultsRaw,
|
||||
retrievalResults
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user