АРЧ АП11 - Выделить route policy adapter для архитектуры assistant runtime

This commit is contained in:
2026-04-15 23:10:46 +03:00
parent 1d95ed9b60
commit 9d5928125d
6 changed files with 207 additions and 16 deletions
@@ -1,3 +1,5 @@
import { runAssistantRoutePolicyRuntime } from "./assistantRoutePolicyRuntimeAdapter";
export interface BuildAssistantAddressOrchestrationRuntimeInput {
userMessage: string;
sessionItems: unknown[];
@@ -195,15 +197,17 @@ export async function buildAssistantAddressOrchestrationRuntime(
}
const followupContext = carryover?.followupContext ?? null;
const orchestrationDecision = input.resolveAssistantOrchestrationDecision({
const routePolicyRuntime = runAssistantRoutePolicyRuntime({
rawUserMessage: input.userMessage,
effectiveAddressUserMessage: addressInputMessage,
followupContext,
llmPreDecomposeMeta: addressPreDecompose,
sessionItems: input.sessionItems,
sessionOrganizationScope: input.sessionOrganizationScope ?? null,
useMock: input.useMock
useMock: input.useMock,
resolveAssistantOrchestrationDecision: input.resolveAssistantOrchestrationDecision
});
const orchestrationDecision = routePolicyRuntime.orchestrationDecision;
const dialogContinuationContract = input.buildAddressDialogContinuationContractV2(
input.userMessage,
addressInputMessage,
@@ -215,11 +219,8 @@ export async function buildAssistantAddressOrchestrationRuntime(
toolGateDecision: orchestrationDecision.toolGateDecision ?? null,
toolGateReason: orchestrationDecision.toolGateReason ?? null,
dialogContinuationContract,
orchestrationContract: orchestrationDecision.orchestrationContract ?? null
};
const livingModeDecision = {
mode: orchestrationDecision.livingMode,
reason: orchestrationDecision.livingReason
orchestrationContract: orchestrationDecision.orchestrationContract ?? null,
routePolicyContract: routePolicyRuntime.routePolicyContract
};
return {
@@ -228,6 +229,6 @@ export async function buildAssistantAddressOrchestrationRuntime(
carryover,
orchestrationDecision,
addressRuntimeMeta,
livingModeDecision
livingModeDecision: routePolicyRuntime.livingModeDecision
};
}
@@ -0,0 +1,79 @@
export const ASSISTANT_ROUTE_POLICY_RUNTIME_SCHEMA_VERSION = "assistant_route_policy_runtime_v1" as const;
export interface RunAssistantRoutePolicyRuntimeInput {
rawUserMessage: string;
effectiveAddressUserMessage: string;
followupContext: unknown;
llmPreDecomposeMeta: Record<string, unknown>;
sessionItems?: unknown[];
sessionOrganizationScope?: unknown;
useMock: boolean;
resolveAssistantOrchestrationDecision: (input: {
rawUserMessage: string;
effectiveAddressUserMessage: string;
followupContext: unknown;
llmPreDecomposeMeta: Record<string, unknown>;
sessionItems?: unknown[];
sessionOrganizationScope?: unknown;
useMock: boolean;
}) => Record<string, unknown>;
}
export interface AssistantRoutePolicyRuntimeContract {
schema_version: typeof ASSISTANT_ROUTE_POLICY_RUNTIME_SCHEMA_VERSION;
policy_owner: "assistantRoutePolicyRuntimeAdapter";
decision_source: "resolveAssistantOrchestrationDecision";
living_mode: unknown;
living_reason: unknown;
tool_gate_decision: unknown;
tool_gate_reason: unknown;
has_followup_context: boolean;
has_orchestration_contract: boolean;
}
export interface RunAssistantRoutePolicyRuntimeOutput {
orchestrationDecision: Record<string, unknown>;
livingModeDecision: {
mode: unknown;
reason: unknown;
};
routePolicyContract: AssistantRoutePolicyRuntimeContract;
}
function hasObject(value: unknown): boolean {
return Boolean(value && typeof value === "object");
}
export function runAssistantRoutePolicyRuntime(
input: RunAssistantRoutePolicyRuntimeInput
): RunAssistantRoutePolicyRuntimeOutput {
const orchestrationDecision = input.resolveAssistantOrchestrationDecision({
rawUserMessage: input.rawUserMessage,
effectiveAddressUserMessage: input.effectiveAddressUserMessage,
followupContext: input.followupContext,
llmPreDecomposeMeta: input.llmPreDecomposeMeta,
sessionItems: input.sessionItems,
sessionOrganizationScope: input.sessionOrganizationScope,
useMock: input.useMock
});
const livingModeDecision = {
mode: orchestrationDecision.livingMode,
reason: orchestrationDecision.livingReason
};
return {
orchestrationDecision,
livingModeDecision,
routePolicyContract: {
schema_version: ASSISTANT_ROUTE_POLICY_RUNTIME_SCHEMA_VERSION,
policy_owner: "assistantRoutePolicyRuntimeAdapter",
decision_source: "resolveAssistantOrchestrationDecision",
living_mode: livingModeDecision.mode,
living_reason: livingModeDecision.reason,
tool_gate_decision: orchestrationDecision.toolGateDecision ?? null,
tool_gate_reason: orchestrationDecision.toolGateReason ?? null,
has_followup_context: hasObject(input.followupContext),
has_orchestration_contract: hasObject(orchestrationDecision.orchestrationContract)
}
};
}