АРЧ АП11 - Вынести provider runtime policy из оркестрации и закрыть Phase 6 агентным прогоном
This commit is contained in:
@@ -0,0 +1,92 @@
|
||||
export const ASSISTANT_PROVIDER_EXECUTION_CONTRACT_SCHEMA_VERSION =
|
||||
"assistant_provider_execution_contract_v1" as const;
|
||||
|
||||
export interface ResolveAssistantProviderExecutionInput {
|
||||
llmProvider?: unknown;
|
||||
useMock?: unknown;
|
||||
baseUrl?: unknown;
|
||||
llmPreDecomposeReason?: unknown;
|
||||
}
|
||||
|
||||
export interface AssistantProviderExecutionContract {
|
||||
schema_version: typeof ASSISTANT_PROVIDER_EXECUTION_CONTRACT_SCHEMA_VERSION;
|
||||
policy_owner: "assistantProviderExecutionPolicy";
|
||||
provider_mode: "mock" | "openai" | "local" | "unknown";
|
||||
normalized_provider: "openai" | "local" | null;
|
||||
use_mock: boolean;
|
||||
base_url_configured: boolean;
|
||||
llm_runtime_unavailable_detected: boolean;
|
||||
living_mode_forced_deep: boolean;
|
||||
living_mode_forced_reason: string | null;
|
||||
reason_codes: string[];
|
||||
}
|
||||
|
||||
export interface AssistantProviderExecutionPolicy {
|
||||
normalizeProvider: (value: unknown) => "openai" | "local" | null;
|
||||
detectLlmRuntimeUnavailable: (reason: unknown) => boolean;
|
||||
resolveProviderExecutionState: (
|
||||
input: ResolveAssistantProviderExecutionInput
|
||||
) => AssistantProviderExecutionContract;
|
||||
}
|
||||
|
||||
export function createAssistantProviderExecutionPolicy(): AssistantProviderExecutionPolicy {
|
||||
function normalizeProvider(value: unknown): "openai" | "local" | null {
|
||||
return value === "local" ? "local" : value === "openai" ? "openai" : null;
|
||||
}
|
||||
|
||||
function detectLlmRuntimeUnavailable(reason: unknown): boolean {
|
||||
const source = String(reason ?? "").trim();
|
||||
if (!source) {
|
||||
return false;
|
||||
}
|
||||
return /(?:openai\s+api\s+key\s+is\s+missing|api\s+key\s+is\s+missing|missing\s+api\s+key|authentication|unauthoriz(?:ed|ation)|401\b)/iu.test(
|
||||
source
|
||||
);
|
||||
}
|
||||
|
||||
function resolveProviderExecutionState(
|
||||
input: ResolveAssistantProviderExecutionInput
|
||||
): AssistantProviderExecutionContract {
|
||||
const normalizedProvider = normalizeProvider(input?.llmProvider);
|
||||
const useMock = Boolean(input?.useMock);
|
||||
const baseUrlConfigured = String(input?.baseUrl ?? "").trim().length > 0;
|
||||
const llmRuntimeUnavailableDetected = detectLlmRuntimeUnavailable(input?.llmPreDecomposeReason);
|
||||
|
||||
const reasonCodes: string[] = [];
|
||||
if (useMock) {
|
||||
reasonCodes.push("mock_mode_enabled");
|
||||
}
|
||||
if (normalizedProvider === "local") {
|
||||
reasonCodes.push("provider_local");
|
||||
} else if (normalizedProvider === "openai") {
|
||||
reasonCodes.push("provider_openai");
|
||||
} else {
|
||||
reasonCodes.push("provider_unknown");
|
||||
}
|
||||
if (baseUrlConfigured) {
|
||||
reasonCodes.push("base_url_configured");
|
||||
}
|
||||
if (llmRuntimeUnavailableDetected) {
|
||||
reasonCodes.push("llm_runtime_unavailable");
|
||||
}
|
||||
|
||||
return {
|
||||
schema_version: ASSISTANT_PROVIDER_EXECUTION_CONTRACT_SCHEMA_VERSION,
|
||||
policy_owner: "assistantProviderExecutionPolicy",
|
||||
provider_mode: useMock ? "mock" : normalizedProvider ?? "unknown",
|
||||
normalized_provider: normalizedProvider,
|
||||
use_mock: useMock,
|
||||
base_url_configured: baseUrlConfigured,
|
||||
llm_runtime_unavailable_detected: llmRuntimeUnavailableDetected,
|
||||
living_mode_forced_deep: useMock,
|
||||
living_mode_forced_reason: useMock ? "mock_mode_keeps_deep_pipeline" : null,
|
||||
reason_codes: reasonCodes
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
normalizeProvider,
|
||||
detectLlmRuntimeUnavailable,
|
||||
resolveProviderExecutionState
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user