From 29652c3ad47eabf438d25ae951a40965da62d620 Mon Sep 17 00:00:00 2001 From: lacvet Date: Sun, 5 Apr 2026 16:26:15 +0900 Subject: [PATCH] =?UTF-8?q?AX=20Agent=20=EB=82=B4=EB=B6=80=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=20=EC=84=9C=EB=B9=84=EC=8A=A4=20=EC=A0=84=ED=99=98?= =?UTF-8?q?=EA=B3=BC=20=ED=85=8C=EB=A7=88=20=EB=85=B8=EC=B6=9C=20=EC=A0=95?= =?UTF-8?q?=EB=A6=AC\n\n-=20=EA=B3=B5=ED=86=B5=20=ED=83=AD=EC=9D=98=20?= =?UTF-8?q?=EC=84=9C=EB=B9=84=EC=8A=A4=20=EC=83=81=EC=84=B8=20=ED=8C=A8?= =?UTF-8?q?=EB=84=90=EC=9D=84=20=EC=A3=BC=EC=86=8C=20=EC=9E=85=EB=A0=A5?= =?UTF-8?q?=EA=B3=BC=20API=20=ED=82=A4=20=ED=8C=A8=EB=84=90=EB=A1=9C=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC=ED=95=98=EA=B3=A0=20Gemini/Claude=EC=97=90?= =?UTF-8?q?=EC=84=9C=EB=8A=94=20=EC=A3=BC=EC=86=8C=20=EC=9E=85=EB=A0=A5?= =?UTF-8?q?=EC=9D=84=20=EC=88=A8=EA=B8=B0=EB=8F=84=EB=A1=9D=20=EC=A1=B0?= =?UTF-8?q?=EC=A0=95\n-=20=EC=84=9C=EB=B9=84=EC=8A=A4=20=EB=B3=80=EA=B2=BD?= =?UTF-8?q?=20=EC=A7=81=ED=9B=84=20=ED=98=84=EC=9E=AC=20=EC=84=9C=EB=B9=84?= =?UTF-8?q?=EC=8A=A4,=20=ED=98=84=EC=9E=AC=20=EB=AA=A8=EB=8D=B8,=20?= =?UTF-8?q?=EB=9D=BC=EB=B2=A8=EC=9D=B4=20=EC=A6=89=EC=8B=9C=20=EA=B0=B1?= =?UTF-8?q?=EC=8B=A0=EB=90=98=EB=8F=84=EB=A1=9D=20=EB=82=B4=EB=B6=80=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20=EC=83=88=EB=A1=9C=EA=B3=A0=EC=B9=A8=20?= =?UTF-8?q?=EA=B2=BD=EB=A1=9C=20=EB=B3=B4=EA=B0=95\n-=20=ED=85=8C=EB=A7=88?= =?UTF-8?q?=20=EC=8A=A4=ED=83=80=EC=9D=BC=EA=B3=BC=20=ED=85=8C=EB=A7=88=20?= =?UTF-8?q?=EB=AA=A8=EB=93=9C=EB=A5=BC=20=EC=84=9C=EB=B9=84=EC=8A=A4/?= =?UTF-8?q?=EB=AA=A8=EB=8D=B8=20=EB=B0=94=EB=A1=9C=20=EC=95=84=EB=9E=98?= =?UTF-8?q?=EB=A1=9C=20=EC=9D=B4=EB=8F=99=ED=95=B4=20=EA=B3=B5=ED=86=B5=20?= =?UTF-8?q?=ED=83=AD=EC=97=90=EC=84=9C=20=EB=B0=94=EB=A1=9C=20=EB=B3=B4?= =?UTF-8?q?=EC=9D=B4=EA=B2=8C=20=EC=9E=AC=EB=B0=B0=EC=B9=98\n-=20README?= =?UTF-8?q?=EC=99=80=20DEVELOPMENT=20=EB=AC=B8=EC=84=9C=EC=97=90=20?= =?UTF-8?q?=EB=82=B4=EB=B6=80=20=EC=84=A4=EC=A0=95=20=EA=B3=B5=ED=86=B5=20?= =?UTF-8?q?=ED=83=AD=20=EC=88=98=EC=A0=95=20=EC=9D=B4=EB=A0=A5=20=EB=B0=8F?= =?UTF-8?q?=20=EA=B2=80=EC=A6=9D=20=EA=B2=B0=EA=B3=BC=20=EB=B0=98=EC=98=81?= =?UTF-8?q?\n\n=EA=B2=80=EC=A6=9D=20=EA=B2=B0=EA=B3=BC\n-=20dotnet=20build?= =?UTF-8?q?=20src/AxCopilot/AxCopilot.csproj=20-c=20Release=20-v=20minimal?= =?UTF-8?q?=20-p:OutputPath=3Dbin\\verify\\=20-p:IntermediateOutputPath=3D?= =?UTF-8?q?obj\\verify\\\n-=20=EA=B2=BD=EA=B3=A0=200=20/=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=200?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 + docs/DEVELOPMENT.md | 5 + src/AxCopilot/Views/ChatWindow.xaml | 211 +++++++++++++------------ src/AxCopilot/Views/ChatWindow.xaml.cs | 20 ++- 4 files changed, 135 insertions(+), 106 deletions(-) diff --git a/README.md b/README.md index 1618603..e933886 100644 --- a/README.md +++ b/README.md @@ -888,6 +888,11 @@ ow + toggle 시각 언어로 통일했습니다. - [ChatWindow.xaml](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml) 에서는 빈 상태 제목/설명 폰트도 함께 키워 이 화면 전반의 글자 크기가 너무 작아 보이지 않게 보정했습니다. - 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify\\ -p:IntermediateOutputPath=obj\\verify\\` 경고 0 / 오류 0 - 업데이트: 2026-04-05 19:02 (KST) +- AX Agent 내부 설정 공통 탭의 서비스 전환 UX를 다시 바로잡았습니다. [ChatWindow.xaml](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml) 에서 서비스 상세 영역을 `주소 입력`과 `API 키` 패널로 분리해 이름을 부여했고, `테마 스타일`과 `테마 모드`도 서비스/모델 바로 아래에서 보이도록 공통 설정 상단으로 옮겼습니다. +- [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs) 에서는 `RefreshOverlayServiceFieldVisibility(...)` 를 추가해 `Gemini/Claude` 선택 시 주소 입력 패널을 접고 API 키만 전체 폭으로 보이게 만들었습니다. `Ollama/vLLM` 은 기존처럼 주소와 키를 함께 보여줍니다. +- 같은 파일의 `SetOverlayService(...)` 는 저장 직후 `RefreshOverlayVisualState(true)` 를 다시 호출하도록 바꿔, 현재 서비스/현재 모델/라벨이 즉시 갱신되게 했습니다. 이제 Gemini를 눌렀는데도 `현재 서비스=Ollama`, `Ollama 서버 주소`가 남아 있는 어긋남을 줄였습니다. +- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify\\ -p:IntermediateOutputPath=obj\\verify\\` 경고 0 / 오류 0 +- 업데이트: 2026-04-05 19:10 (KST) --- diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md index d772d7b..0eea4c0 100644 --- a/docs/DEVELOPMENT.md +++ b/docs/DEVELOPMENT.md @@ -4648,3 +4648,8 @@ ow + toggle ?쒓컖 ?몄뼱濡??ㅼ떆 ?뺣젹?덈떎. - [ChatWindow.xaml](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml) 에서는 `EmptyStateTitle`, `EmptyStateDesc` 폰트를 키워 현재 빈 상태 화면 전반의 글자 크기도 함께 보정했습니다. - 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\verify\ -p:IntermediateOutputPath=obj\verify\` 경고 0 / 오류 0 - 업데이트: 2026-04-05 19:02 (KST) +- AX Agent 내부 설정 공통 탭의 서비스/테마 배치를 다시 정리했습니다. [ChatWindow.xaml](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml) 에서 서비스 상세 패널을 `OverlayEndpointFieldPanel`, `OverlayApiKeyFieldPanel`로 분리하고, `테마 스타일`, `테마 모드` 블록을 서비스/모델 상세 바로 아래로 이동해 공통 탭에서 바로 보이게 조정했습니다. +- [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs) 에 `RefreshOverlayServiceFieldVisibility(...)` 를 추가했습니다. 이 메서드는 `Gemini/Claude` 선택 시 주소 입력 패널을 접고 API 키 패널을 전체 폭으로 확장하며, `Ollama/vLLM` 은 주소+키 2열 구성을 유지합니다. `RefreshOverlayVisualState(...)` 에도 이 가시성 동기화를 추가했습니다. +- 같은 파일의 `SetOverlayService(...)` 는 설정 저장 직후 `RefreshOverlayVisualState(loadDeferredInputs: true)` 를 강제 호출하도록 바꿨습니다. 내부 설정에서 서비스 카드를 눌렀을 때 `현재 서비스`, `현재 모델`, 주소/키 라벨이 즉시 바뀌지 않던 문제를 바로잡기 위한 변경입니다. +- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\verify\ -p:IntermediateOutputPath=obj\verify\` 경고 0 / 오류 0 +- 업데이트: 2026-04-05 19:10 (KST) diff --git a/src/AxCopilot/Views/ChatWindow.xaml b/src/AxCopilot/Views/ChatWindow.xaml index d0e0129..3f7a32c 100644 --- a/src/AxCopilot/Views/ChatWindow.xaml +++ b/src/AxCopilot/Views/ChatWindow.xaml @@ -2672,7 +2672,8 @@ - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/AxCopilot/Views/ChatWindow.xaml.cs b/src/AxCopilot/Views/ChatWindow.xaml.cs index 43a4792..f31d427 100644 --- a/src/AxCopilot/Views/ChatWindow.xaml.cs +++ b/src/AxCopilot/Views/ChatWindow.xaml.cs @@ -14534,6 +14534,7 @@ public partial class ChatWindow : Window RefreshOverlayModeButtons(); RefreshOverlayTokenPresetCards(); RefreshOverlayServiceFieldLabels(service); + RefreshOverlayServiceFieldVisibility(service); BuildOverlayModelChips(service); BuildOverlayRegisteredModelsPanel(service); RefreshOverlayAdvancedChoiceButtons(); @@ -16402,19 +16403,33 @@ public partial class ChatWindow : Window break; case "gemini": OverlayEndpointLabel.Text = "기본 서버 주소"; - OverlayEndpointHint.Text = "Gemini는 기본 주소를 사용합니다. 비워두면 기본값을 사용합니다."; + OverlayEndpointHint.Text = "Gemini는 내부 기본 주소를 사용합니다."; OverlayApiKeyLabel.Text = "Gemini API 키"; OverlayApiKeyHint.Text = "외부 호출에 필요한 키를 입력합니다."; break; default: OverlayEndpointLabel.Text = "기본 서버 주소"; - OverlayEndpointHint.Text = "Claude는 기본 주소를 사용합니다. 비워두면 기본값을 사용합니다."; + OverlayEndpointHint.Text = "Claude는 내부 기본 주소를 사용합니다."; OverlayApiKeyLabel.Text = "Claude API 키"; OverlayApiKeyHint.Text = "외부 호출에 필요한 키를 입력합니다."; break; } } + private void RefreshOverlayServiceFieldVisibility(string service) + { + if (OverlayEndpointFieldPanel == null || OverlayApiKeyFieldPanel == null) + return; + + var hideEndpoint = string.Equals(service, "gemini", StringComparison.OrdinalIgnoreCase) + || string.Equals(service, "claude", StringComparison.OrdinalIgnoreCase); + + OverlayEndpointFieldPanel.Visibility = hideEndpoint ? Visibility.Collapsed : Visibility.Visible; + OverlayApiKeyFieldPanel.Margin = hideEndpoint ? new Thickness(0) : new Thickness(6, 0, 0, 0); + Grid.SetColumn(OverlayApiKeyFieldPanel, hideEndpoint ? 0 : 1); + Grid.SetColumnSpan(OverlayApiKeyFieldPanel, hideEndpoint ? 2 : 1); + } + private string GetOverlayServiceEndpoint(string service) { var llm = _settings.Settings.Llm; @@ -16793,6 +16808,7 @@ public partial class ChatWindow : Window ? preferredModel : candidates.FirstOrDefault().Id ?? llm.Model; PersistOverlaySettingsState(refreshOverlayDeferredInputs: true); + RefreshOverlayVisualState(loadDeferredInputs: true); } private void BtnOverlayOperationMode_Click(object sender, RoutedEventArgs e)