ГЛОБАЛЬНЫЙ РЕФАКТОРИНГ АРХИТЕКТУРЫ - Рефакторинг этапов 2.12.23: декомпозиция deep-turn пайплайна ассистента в runtime-адаптеры

This commit is contained in:
2026-04-10 19:22:40 +03:00
parent 19dbaff741
commit 80d108e506
116 changed files with 13949 additions and 2039 deletions
@@ -93,6 +93,7 @@ interface RunSummary {
llm_provider: string | null;
model: string | null;
use_mock: boolean | null;
analysis_date: string | null;
prompt_version: string | null;
schema_version: string | null;
suite_id: string | null;
@@ -1012,6 +1013,7 @@ function buildRunSummary(run: IndexedRun): RunSummary {
llm_provider: llmProvider,
model,
use_mock: toBooleanSafe(run.report.use_mock),
analysis_date: toStringSafe(run.report.analysis_date),
prompt_version: toStringSafe(run.report.prompt_version),
schema_version: toStringSafe(run.report.schema_version),
suite_id: toStringSafe(run.report.suite_id),
+37 -2
View File
@@ -35,6 +35,7 @@ interface EvalAsyncJob {
eval_target: EvalTarget;
run_id: string;
case_set_file: string | null;
analysis_date: string | null;
total_cases: number;
completed_cases: number;
cases: EvalAsyncCaseInfo[];
@@ -131,6 +132,32 @@ function normalizeCaseIds(value: unknown): string[] | undefined {
return normalized.length > 0 ? normalized : undefined;
}
function normalizeAnalysisDate(value: unknown): string | undefined {
if (typeof value !== "string") {
return undefined;
}
const trimmed = value.trim();
const match = trimmed.match(/^(\d{4})-(\d{2})-(\d{2})$/);
if (!match) {
return undefined;
}
const year = Number(match[1]);
const month = Number(match[2]);
const day = Number(match[3]);
if (!Number.isFinite(year) || !Number.isFinite(month) || !Number.isFinite(day)) {
return undefined;
}
const candidate = new Date(Date.UTC(year, month - 1, day));
if (
candidate.getUTCFullYear() !== year ||
candidate.getUTCMonth() + 1 !== month ||
candidate.getUTCDate() !== day
) {
return undefined;
}
return `${match[1]}-${match[2]}-${match[3]}`;
}
function buildEvalPayloadFromBody(body: Record<string, unknown>): {
normalizeConfig: Omit<NormalizeRequestPayload, "userQuestion" | "context">;
caseIds?: string[];
@@ -140,7 +167,11 @@ function buildEvalPayloadFromBody(body: Record<string, unknown>): {
rawQuestions?: string;
evalTarget: EvalTarget;
compareWithReportFile?: string;
analysisDate?: string;
} {
const analysisDate =
normalizeAnalysisDate(body.analysis_date) ??
normalizeAnalysisDate(body.analysisDate);
return {
normalizeConfig: (body.normalizeConfig ?? {}) as Omit<NormalizeRequestPayload, "userQuestion" | "context">,
caseIds: normalizeCaseIds(body.caseIds),
@@ -154,7 +185,8 @@ function buildEvalPayloadFromBody(body: Record<string, unknown>): {
? body.compare_with_report_file
: typeof body.comparisonBaselineReportFile === "string"
? body.comparisonBaselineReportFile
: undefined
: undefined,
analysisDate
};
}
@@ -300,6 +332,7 @@ function snapshotJob(job: EvalAsyncJob): Record<string, unknown> {
eval_target: job.eval_target,
run_id: job.run_id,
case_set_file: job.case_set_file,
analysis_date: job.analysis_date,
total_cases: job.total_cases,
completed_cases: job.completed_cases,
error: job.error,
@@ -314,7 +347,8 @@ function snapshotJob(job: EvalAsyncJob): Record<string, unknown> {
: toRecord(job.report.metrics) && typeof toRecord(job.report.metrics)?.score_index === "number"
? Number(toRecord(job.report.metrics)?.score_index)
: null,
cases_total: typeof job.report.cases_total === "number" ? Number(job.report.cases_total) : null
cases_total: typeof job.report.cases_total === "number" ? Number(job.report.cases_total) : null,
analysis_date: toStringSafe(job.report.analysis_date) ?? job.analysis_date
}
: null
};
@@ -377,6 +411,7 @@ export function buildEvalRouter(services: AppServices): Router {
eval_target: payload.evalTarget,
run_id: runId,
case_set_file: runtimeCaseSetFile,
analysis_date: payload.analysisDate ?? null,
total_cases: caseSeeds.length,
completed_cases: 0,
cases: caseSeeds.map((item) => ({