AX Agent 최대 반복 횟수 상한을 500으로 확장
변경 목적:\n- 내부 설정의 최대 에이전트 패스 상한이 100으로 묶여 긴 Code 작업에서 반복 여유가 부족한 문제를 해소합니다.\n\n핵심 수정사항:\n- SettingsViewModel의 MaxAgentIterations 클램프를 1~500으로 상향했습니다.\n- SettingsWindow의 최대 반복 횟수 슬라이더와 안내 문구를 1~500 기준으로 맞추고 값 표시 폭을 넓혔습니다.\n- ChatWindow 오버레이 설정의 슬라이더, 텍스트 입력, 동기화 클램프를 모두 500 기준으로 통일했습니다.\n- AgentSettingsWindow의 로드/저장 파싱 상한도 500으로 맞춰 설정 경로 간 불일치를 제거했습니다.\n- README와 DEVELOPMENT 문서에 2026-04-15 20:19 (KST) 기준 변경 이력과 빌드 검증 결과를 반영했습니다.\n\n검증 결과:\n- dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_max_agent_iterations_500\\ -p:IntermediateOutputPath=obj\\verify_max_agent_iterations_500\\\n- 경고 0 / 오류 0
This commit is contained in:
@@ -1,5 +1,9 @@
|
|||||||
# AX Commander
|
# AX Commander
|
||||||
|
|
||||||
|
- 업데이트: 2026-04-15 20:19 (KST)
|
||||||
|
- AX Agent 내부 설정의 `최대 에이전트 패스` 상한을 100에서 500으로 확장했습니다. `src/AxCopilot/ViewModels/SettingsViewModel.cs`, `src/AxCopilot/Views/SettingsWindow.xaml`, `src/AxCopilot/Views/ChatWindow.xaml`, `src/AxCopilot/Views/ChatWindow.OverlaySettingsPresentation.cs`, `src/AxCopilot/Views/AgentSettingsWindow.xaml.cs`를 함께 조정해 일반 설정창, Code 탭 오버레이, 별도 에이전트 설정창에서 모두 같은 1~500 범위를 사용하도록 맞췄습니다.
|
||||||
|
- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_max_agent_iterations_500\\ -p:IntermediateOutputPath=obj\\verify_max_agent_iterations_500\\` 경고 0 / 오류 0
|
||||||
|
|
||||||
- 업데이트: 2026-04-15 20:16 (KST)
|
- 업데이트: 2026-04-15 20:16 (KST)
|
||||||
- AX Agent 입력창 위 시간·토큰 표시(`StreamMetricsLabel`)를 라이브 진행 문구(`PulseDotBar`)와 같은 행에서 분리했습니다. 이제 왼쪽 진행 안내가 여러 줄로 커져도 시간·토큰은 입력창 바로 위 오른쪽에 고정됩니다.
|
- AX Agent 입력창 위 시간·토큰 표시(`StreamMetricsLabel`)를 라이브 진행 문구(`PulseDotBar`)와 같은 행에서 분리했습니다. 이제 왼쪽 진행 안내가 여러 줄로 커져도 시간·토큰은 입력창 바로 위 오른쪽에 고정됩니다.
|
||||||
|
|
||||||
|
|||||||
+6
-1
@@ -1,4 +1,9 @@
|
|||||||
업데이트: 2026-04-15 17:41 (KST)
|
업데이트: 2026-04-15 20:19 (KST)
|
||||||
|
- AX Agent 반복 상한을 500으로 확장했습니다. `src/AxCopilot/ViewModels/SettingsViewModel.cs`의 `MaxAgentIterations` 클램프를 `1~500`으로 올리고, `src/AxCopilot/Views/SettingsWindow.xaml`의 슬라이더/힌트 문구도 같은 범위로 맞췄습니다.
|
||||||
|
- `src/AxCopilot/Views/ChatWindow.xaml`, `src/AxCopilot/Views/ChatWindow.OverlaySettingsPresentation.cs`, `src/AxCopilot/Views/AgentSettingsWindow.xaml.cs`도 함께 수정해 Code 탭 오버레이와 별도 에이전트 설정창이 여전히 100 또는 200에 묶이지 않도록 범위를 통일했습니다.
|
||||||
|
- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_max_agent_iterations_500\\ -p:IntermediateOutputPath=obj\\verify_max_agent_iterations_500\\` 경고 0 / 오류 0
|
||||||
|
|
||||||
|
업데이트: 2026-04-15 17:41 (KST)
|
||||||
- 워크스페이스 저장/복원 경로를 확장했습니다. `src/AxCopilot/Core/AppWorkspaceStateHelper.cs`는 파일 탐색기 현재 폴더 경로와 메모장 열린 파일 경로를 best-effort로 저장하고, `src/AxCopilot/Core/ProcessCommandLineHelper.cs`는 브라우저/메모장 공용 프로세스 명령줄 파싱을 담당합니다.
|
- 워크스페이스 저장/복원 경로를 확장했습니다. `src/AxCopilot/Core/AppWorkspaceStateHelper.cs`는 파일 탐색기 현재 폴더 경로와 메모장 열린 파일 경로를 best-effort로 저장하고, `src/AxCopilot/Core/ProcessCommandLineHelper.cs`는 브라우저/메모장 공용 프로세스 명령줄 파싱을 담당합니다.
|
||||||
- `src/AxCopilot/Core/ContextManager.cs`는 브라우저 외에도 탐색기/메모장 상태가 저장된 창을 새로 실행해 해당 경로/파일을 다시 열 수 있게 했고, 복원 중 새 창을 연속 실행할 때는 CPU 사용률·메모리 사용률·이미 실행한 창 수를 반영한 적응형 지연을 넣어 저사양 PC에서 복원 폭주를 줄이도록 했습니다.
|
- `src/AxCopilot/Core/ContextManager.cs`는 브라우저 외에도 탐색기/메모장 상태가 저장된 창을 새로 실행해 해당 경로/파일을 다시 열 수 있게 했고, 복원 중 새 창을 연속 실행할 때는 CPU 사용률·메모리 사용률·이미 실행한 창 수를 반영한 적응형 지연을 넣어 저사양 PC에서 복원 폭주를 줄이도록 했습니다.
|
||||||
- `src/AxCopilot/Models/AppSettings.cs`, `src/AxCopilot/ViewModels/SettingsViewModel.cs`, `src/AxCopilot/Views/SettingsWindow.xaml`에는 워크스페이스 복원 속도 제어 설정(`복원 속도 자동 조절`, `복원 기본 간격`, `복원 최대 간격`)을 추가했습니다.
|
- `src/AxCopilot/Models/AppSettings.cs`, `src/AxCopilot/ViewModels/SettingsViewModel.cs`, `src/AxCopilot/Views/SettingsWindow.xaml`에는 워크스페이스 복원 속도 제어 설정(`복원 속도 자동 조절`, `복원 기본 간격`, `복원 최대 간격`)을 추가했습니다.
|
||||||
|
|||||||
@@ -300,7 +300,7 @@ public class SettingsViewModel : INotifyPropertyChanged
|
|||||||
public int MaxAgentIterations
|
public int MaxAgentIterations
|
||||||
{
|
{
|
||||||
get => _maxAgentIterations;
|
get => _maxAgentIterations;
|
||||||
set { _maxAgentIterations = Math.Clamp(value, 1, 100); OnPropertyChanged(); }
|
set { _maxAgentIterations = Math.Clamp(value, 1, 500); OnPropertyChanged(); }
|
||||||
}
|
}
|
||||||
|
|
||||||
private int _maxRetryOnError;
|
private int _maxRetryOnError;
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ public partial class AgentSettingsWindow : Window
|
|||||||
ChkEnableCoworkVerification.IsChecked = _llm.EnableCoworkVerification;
|
ChkEnableCoworkVerification.IsChecked = _llm.EnableCoworkVerification;
|
||||||
ChkEnableProjectRules.IsChecked = _llm.EnableProjectRules;
|
ChkEnableProjectRules.IsChecked = _llm.EnableProjectRules;
|
||||||
ChkEnableAgentMemory.IsChecked = _llm.EnableAgentMemory;
|
ChkEnableAgentMemory.IsChecked = _llm.EnableAgentMemory;
|
||||||
TxtMaxAgentIterations.Text = Math.Clamp(_llm.MaxAgentIterations, 1, 200).ToString();
|
TxtMaxAgentIterations.Text = Math.Clamp(_llm.MaxAgentIterations, 1, 500).ToString();
|
||||||
ChkEnableCodeVerification.IsChecked = _llm.Code.EnableCodeVerification;
|
ChkEnableCodeVerification.IsChecked = _llm.Code.EnableCodeVerification;
|
||||||
ChkEnableParallelTools.IsChecked = _llm.EnableParallelTools;
|
ChkEnableParallelTools.IsChecked = _llm.EnableParallelTools;
|
||||||
ChkEnableWorktreeTools.IsChecked = _llm.Code.EnableWorktreeTools;
|
ChkEnableWorktreeTools.IsChecked = _llm.Code.EnableWorktreeTools;
|
||||||
@@ -571,7 +571,7 @@ public partial class AgentSettingsWindow : Window
|
|||||||
_llm.EnableCoworkVerification = ChkEnableCoworkVerification.IsChecked == true;
|
_llm.EnableCoworkVerification = ChkEnableCoworkVerification.IsChecked == true;
|
||||||
_llm.EnableProjectRules = ChkEnableProjectRules.IsChecked == true;
|
_llm.EnableProjectRules = ChkEnableProjectRules.IsChecked == true;
|
||||||
_llm.EnableAgentMemory = ChkEnableAgentMemory.IsChecked == true;
|
_llm.EnableAgentMemory = ChkEnableAgentMemory.IsChecked == true;
|
||||||
_llm.MaxAgentIterations = ParseInt(TxtMaxAgentIterations.Text, 25, 1, 200);
|
_llm.MaxAgentIterations = ParseInt(TxtMaxAgentIterations.Text, 25, 1, 500);
|
||||||
_llm.Code.EnableCodeVerification = ChkEnableCodeVerification.IsChecked == true;
|
_llm.Code.EnableCodeVerification = ChkEnableCodeVerification.IsChecked == true;
|
||||||
_llm.EnableParallelTools = ChkEnableParallelTools.IsChecked == true;
|
_llm.EnableParallelTools = ChkEnableParallelTools.IsChecked == true;
|
||||||
_llm.Code.EnableWorktreeTools = ChkEnableWorktreeTools.IsChecked == true;
|
_llm.Code.EnableWorktreeTools = ChkEnableWorktreeTools.IsChecked == true;
|
||||||
|
|||||||
@@ -472,7 +472,7 @@ public partial class ChatWindow
|
|||||||
CommitOverlayNumericInput(TxtOverlayMaxContextTokens, llm.MaxContextTokens, 1024, 1_000_000, value => llm.MaxContextTokens = value, normalizeOnInvalid: true);
|
CommitOverlayNumericInput(TxtOverlayMaxContextTokens, llm.MaxContextTokens, 1024, 1_000_000, value => llm.MaxContextTokens = value, normalizeOnInvalid: true);
|
||||||
CommitOverlayTemperatureInput(normalizeOnInvalid: true);
|
CommitOverlayTemperatureInput(normalizeOnInvalid: true);
|
||||||
CommitOverlayNumericInput(TxtOverlayMaxRetryOnError, llm.MaxRetryOnError, 0, 10, value => llm.MaxRetryOnError = value, normalizeOnInvalid: true);
|
CommitOverlayNumericInput(TxtOverlayMaxRetryOnError, llm.MaxRetryOnError, 0, 10, value => llm.MaxRetryOnError = value, normalizeOnInvalid: true);
|
||||||
CommitOverlayNumericInput(TxtOverlayMaxAgentIterations, llm.MaxAgentIterations, 1, 200, value => llm.MaxAgentIterations = value, normalizeOnInvalid: true);
|
CommitOverlayNumericInput(TxtOverlayMaxAgentIterations, llm.MaxAgentIterations, 1, 500, value => llm.MaxAgentIterations = value, normalizeOnInvalid: true);
|
||||||
CommitOverlayNumericInput(TxtOverlayFreeTierDelaySeconds, llm.FreeTierDelaySeconds, 0, 60, value => llm.FreeTierDelaySeconds = value, normalizeOnInvalid: true);
|
CommitOverlayNumericInput(TxtOverlayFreeTierDelaySeconds, llm.FreeTierDelaySeconds, 0, 60, value => llm.FreeTierDelaySeconds = value, normalizeOnInvalid: true);
|
||||||
CommitOverlayNumericInput(TxtOverlayMaxSubAgents, llm.MaxSubAgents, 1, 10, value => llm.MaxSubAgents = value, normalizeOnInvalid: true);
|
CommitOverlayNumericInput(TxtOverlayMaxSubAgents, llm.MaxSubAgents, 1, 10, value => llm.MaxSubAgents = value, normalizeOnInvalid: true);
|
||||||
CommitOverlayNumericInput(TxtOverlayToolHookTimeoutMs, llm.ToolHookTimeoutMs, 3000, 30000, value => llm.ToolHookTimeoutMs = value, normalizeOnInvalid: true);
|
CommitOverlayNumericInput(TxtOverlayToolHookTimeoutMs, llm.ToolHookTimeoutMs, 3000, 30000, value => llm.ToolHookTimeoutMs = value, normalizeOnInvalid: true);
|
||||||
@@ -599,11 +599,11 @@ public partial class ChatWindow
|
|||||||
if (TxtOverlayMaxRetryOnErrorValue != null)
|
if (TxtOverlayMaxRetryOnErrorValue != null)
|
||||||
TxtOverlayMaxRetryOnErrorValue.Text = Math.Clamp(llm.MaxRetryOnError, 0, 10).ToString();
|
TxtOverlayMaxRetryOnErrorValue.Text = Math.Clamp(llm.MaxRetryOnError, 0, 10).ToString();
|
||||||
if (TxtOverlayMaxAgentIterations != null)
|
if (TxtOverlayMaxAgentIterations != null)
|
||||||
TxtOverlayMaxAgentIterations.Text = Math.Clamp(llm.MaxAgentIterations, 1, 200).ToString();
|
TxtOverlayMaxAgentIterations.Text = Math.Clamp(llm.MaxAgentIterations, 1, 500).ToString();
|
||||||
if (SldOverlayMaxAgentIterations != null)
|
if (SldOverlayMaxAgentIterations != null)
|
||||||
SldOverlayMaxAgentIterations.Value = Math.Clamp(llm.MaxAgentIterations, 1, 100);
|
SldOverlayMaxAgentIterations.Value = Math.Clamp(llm.MaxAgentIterations, 1, 500);
|
||||||
if (TxtOverlayMaxAgentIterationsValue != null)
|
if (TxtOverlayMaxAgentIterationsValue != null)
|
||||||
TxtOverlayMaxAgentIterationsValue.Text = Math.Clamp(llm.MaxAgentIterations, 1, 100).ToString();
|
TxtOverlayMaxAgentIterationsValue.Text = Math.Clamp(llm.MaxAgentIterations, 1, 500).ToString();
|
||||||
if (TxtOverlayFreeTierDelaySeconds != null)
|
if (TxtOverlayFreeTierDelaySeconds != null)
|
||||||
TxtOverlayFreeTierDelaySeconds.Text = Math.Clamp(llm.FreeTierDelaySeconds, 0, 60).ToString();
|
TxtOverlayFreeTierDelaySeconds.Text = Math.Clamp(llm.FreeTierDelaySeconds, 0, 60).ToString();
|
||||||
if (SldOverlayFreeTierDelaySeconds != null)
|
if (SldOverlayFreeTierDelaySeconds != null)
|
||||||
@@ -1030,7 +1030,7 @@ public partial class ChatWindow
|
|||||||
if (_isOverlaySettingsSyncing || llm == null)
|
if (_isOverlaySettingsSyncing || llm == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var value = (int)Math.Round(Math.Clamp(e.NewValue, 1, 100));
|
var value = (int)Math.Round(Math.Clamp(e.NewValue, 1, 500));
|
||||||
llm.MaxAgentIterations = value;
|
llm.MaxAgentIterations = value;
|
||||||
if (TxtOverlayMaxAgentIterations != null)
|
if (TxtOverlayMaxAgentIterations != null)
|
||||||
TxtOverlayMaxAgentIterations.Text = value.ToString();
|
TxtOverlayMaxAgentIterations.Text = value.ToString();
|
||||||
@@ -1165,7 +1165,7 @@ public partial class ChatWindow
|
|||||||
if (_isOverlaySettingsSyncing)
|
if (_isOverlaySettingsSyncing)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (CommitOverlayNumericInput(TxtOverlayMaxAgentIterations, _settings.Settings.Llm.MaxAgentIterations, 1, 200, value => _settings.Settings.Llm.MaxAgentIterations = value, normalizeOnInvalid: false))
|
if (CommitOverlayNumericInput(TxtOverlayMaxAgentIterations, _settings.Settings.Llm.MaxAgentIterations, 1, 500, value => _settings.Settings.Llm.MaxAgentIterations = value, normalizeOnInvalid: false))
|
||||||
PersistOverlaySettingsState(refreshOverlayDeferredInputs: false);
|
PersistOverlaySettingsState(refreshOverlayDeferredInputs: false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4769,7 +4769,7 @@
|
|||||||
<Slider x:Name="SldOverlayMaxAgentIterations"
|
<Slider x:Name="SldOverlayMaxAgentIterations"
|
||||||
Width="150"
|
Width="150"
|
||||||
Minimum="1"
|
Minimum="1"
|
||||||
Maximum="100"
|
Maximum="500"
|
||||||
TickFrequency="1"
|
TickFrequency="1"
|
||||||
IsSnapToTickEnabled="True"
|
IsSnapToTickEnabled="True"
|
||||||
ValueChanged="SldOverlayMaxAgentIterations_ValueChanged"
|
ValueChanged="SldOverlayMaxAgentIterations_ValueChanged"
|
||||||
|
|||||||
@@ -5004,17 +5004,17 @@
|
|||||||
<Grid>
|
<Grid>
|
||||||
<StackPanel HorizontalAlignment="Left">
|
<StackPanel HorizontalAlignment="Left">
|
||||||
<TextBlock Style="{StaticResource RowLabel}" Text="최대 반복 횟수"/>
|
<TextBlock Style="{StaticResource RowLabel}" Text="최대 반복 횟수"/>
|
||||||
<TextBlock Style="{StaticResource RowHint}" Text="에이전트가 도구를 호출하며 반복할 수 있는 최대 횟수입니다. (1~100)"/>
|
<TextBlock Style="{StaticResource RowHint}" Text="에이전트가 도구를 호출하며 반복할 수 있는 최대 횟수입니다. (1~500)"/>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right" VerticalAlignment="Center">
|
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right" VerticalAlignment="Center">
|
||||||
<Slider Width="120" Minimum="1" Maximum="100" TickFrequency="1"
|
<Slider Width="120" Minimum="1" Maximum="500" TickFrequency="1"
|
||||||
IsSnapToTickEnabled="True"
|
IsSnapToTickEnabled="True"
|
||||||
Value="{Binding MaxAgentIterations, Mode=TwoWay}"
|
Value="{Binding MaxAgentIterations, Mode=TwoWay}"
|
||||||
VerticalAlignment="Center"/>
|
VerticalAlignment="Center"/>
|
||||||
<TextBlock Text="{Binding MaxAgentIterations}"
|
<TextBlock Text="{Binding MaxAgentIterations}"
|
||||||
FontSize="13" FontWeight="SemiBold" Foreground="{DynamicResource AccentColor}"
|
FontSize="13" FontWeight="SemiBold" Foreground="{DynamicResource AccentColor}"
|
||||||
Width="32" TextAlignment="Center" VerticalAlignment="Center"
|
Width="40" TextAlignment="Center" VerticalAlignment="Center"
|
||||||
Margin="8,0,0,0"/>
|
Margin="8,0,0,0"/>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</Grid>
|
</Grid>
|
||||||
</Border>
|
</Border>
|
||||||
|
|||||||
Reference in New Issue
Block a user