namespace AxCopilot.Services.Agent; public static class ModelExecutionProfileCatalog { public sealed record ExecutionPolicy( string Key, string Label, bool ForceInitialToolCall, bool ForceToolCallAfterPlan, double? ToolTemperatureCap, int NoToolResponseThreshold, int NoToolRecoveryMaxRetries, int PlanExecutionRetryMax, int DocumentPlanRetryMax, bool PreferAggressiveDocumentFallback, bool ReduceEarlyMemoryPressure, bool EnablePostToolVerification, bool EnableCodeQualityGates, bool EnableDocumentVerificationGate, bool EnableParallelReadBatch, int MaxParallelReadBatch, int CodeVerificationGateMaxRetries, int HighImpactBuildTestGateMaxRetries, int FinalReportGateMaxRetries, int CodeDiffGateMaxRetries, int RecentExecutionGateMaxRetries, int ExecutionSuccessGateMaxRetries, int DocumentVerificationGateMaxRetries, int TerminalEvidenceGateMaxRetries, /// /// true이면 첫 번째 LLM 호출 직전 마지막 user 메시지로 도구 호출 강제 reminder를 주입합니다. /// IBM Qwen 등 system prompt instruction을 약하게 따르는 chatty 모델용. /// bool InjectPreCallToolReminder = false); public static string Normalize(string? key) { var normalized = (key ?? "").Trim().ToLowerInvariant(); return normalized switch { "tool_call_strict" => "tool_call_strict", "reasoning_first" => "reasoning_first", "fast_readonly" => "fast_readonly", "document_heavy" => "document_heavy", _ => "balanced", }; } public static ExecutionPolicy Get(string? key) => Normalize(key) switch { "tool_call_strict" => new ExecutionPolicy( "tool_call_strict", "도구 호출 우선", ForceInitialToolCall: true, ForceToolCallAfterPlan: true, ToolTemperatureCap: 0.2, NoToolResponseThreshold: 1, NoToolRecoveryMaxRetries: 4, // IBM/Qwen 등 chatty 모델: 재시도 횟수 늘려 도구 호출 강제 PlanExecutionRetryMax: 2, DocumentPlanRetryMax: 0, PreferAggressiveDocumentFallback: false, ReduceEarlyMemoryPressure: true, EnablePostToolVerification: false, EnableCodeQualityGates: true, EnableDocumentVerificationGate: false, EnableParallelReadBatch: true, MaxParallelReadBatch: 8, CodeVerificationGateMaxRetries: 1, HighImpactBuildTestGateMaxRetries: 1, FinalReportGateMaxRetries: 1, CodeDiffGateMaxRetries: 1, RecentExecutionGateMaxRetries: 0, ExecutionSuccessGateMaxRetries: 0, DocumentVerificationGateMaxRetries: 0, TerminalEvidenceGateMaxRetries: 1, InjectPreCallToolReminder: true), // IBM/Qwen: 첫 호출 직전 reminder 주입으로 이중 강제 "reasoning_first" => new ExecutionPolicy( "reasoning_first", "추론 우선", ForceInitialToolCall: false, ForceToolCallAfterPlan: false, ToolTemperatureCap: 0.45, NoToolResponseThreshold: 2, NoToolRecoveryMaxRetries: 2, PlanExecutionRetryMax: 2, DocumentPlanRetryMax: 2, PreferAggressiveDocumentFallback: false, ReduceEarlyMemoryPressure: false, EnablePostToolVerification: false, EnableCodeQualityGates: true, EnableDocumentVerificationGate: false, EnableParallelReadBatch: true, MaxParallelReadBatch: 6, CodeVerificationGateMaxRetries: 1, HighImpactBuildTestGateMaxRetries: 1, FinalReportGateMaxRetries: 0, CodeDiffGateMaxRetries: 0, RecentExecutionGateMaxRetries: 0, ExecutionSuccessGateMaxRetries: 0, DocumentVerificationGateMaxRetries: 0, TerminalEvidenceGateMaxRetries: 1), "fast_readonly" => new ExecutionPolicy( "fast_readonly", "읽기 속도 우선", ForceInitialToolCall: true, ForceToolCallAfterPlan: false, ToolTemperatureCap: 0.25, NoToolResponseThreshold: 1, NoToolRecoveryMaxRetries: 1, PlanExecutionRetryMax: 1, DocumentPlanRetryMax: 1, PreferAggressiveDocumentFallback: false, ReduceEarlyMemoryPressure: true, EnablePostToolVerification: false, EnableCodeQualityGates: false, EnableDocumentVerificationGate: false, EnableParallelReadBatch: true, MaxParallelReadBatch: 10, CodeVerificationGateMaxRetries: 0, HighImpactBuildTestGateMaxRetries: 0, FinalReportGateMaxRetries: 0, CodeDiffGateMaxRetries: 0, RecentExecutionGateMaxRetries: 0, ExecutionSuccessGateMaxRetries: 0, DocumentVerificationGateMaxRetries: 0, TerminalEvidenceGateMaxRetries: 0), "document_heavy" => new ExecutionPolicy( "document_heavy", "문서 생성 우선", ForceInitialToolCall: false, ForceToolCallAfterPlan: false, ToolTemperatureCap: 0.35, NoToolResponseThreshold: 1, NoToolRecoveryMaxRetries: 1, PlanExecutionRetryMax: 1, DocumentPlanRetryMax: 0, PreferAggressiveDocumentFallback: true, ReduceEarlyMemoryPressure: true, EnablePostToolVerification: false, EnableCodeQualityGates: false, EnableDocumentVerificationGate: false, EnableParallelReadBatch: true, MaxParallelReadBatch: 6, CodeVerificationGateMaxRetries: 0, HighImpactBuildTestGateMaxRetries: 0, FinalReportGateMaxRetries: 0, CodeDiffGateMaxRetries: 0, RecentExecutionGateMaxRetries: 0, ExecutionSuccessGateMaxRetries: 0, DocumentVerificationGateMaxRetries: 0, TerminalEvidenceGateMaxRetries: 1), _ => new ExecutionPolicy( "balanced", "균형", ForceInitialToolCall: true, ForceToolCallAfterPlan: false, ToolTemperatureCap: 0.35, NoToolResponseThreshold: 2, NoToolRecoveryMaxRetries: 2, PlanExecutionRetryMax: 2, DocumentPlanRetryMax: 0, PreferAggressiveDocumentFallback: false, ReduceEarlyMemoryPressure: false, EnablePostToolVerification: false, EnableCodeQualityGates: true, EnableDocumentVerificationGate: false, EnableParallelReadBatch: true, MaxParallelReadBatch: 6, CodeVerificationGateMaxRetries: 1, HighImpactBuildTestGateMaxRetries: 1, FinalReportGateMaxRetries: 0, CodeDiffGateMaxRetries: 0, RecentExecutionGateMaxRetries: 0, ExecutionSuccessGateMaxRetries: 0, DocumentVerificationGateMaxRetries: 0, TerminalEvidenceGateMaxRetries: 1), }; }