사내 모드 외부 LLM 범위를 테스트와 문서로 고정함

Gemini와 Claude만 외부 LLM 차단 대상으로 유지하고 Ollama와 vLLM은 사내/사외 모두 허용된다는 기준을 회귀 테스트로 추가했다.

깨진 인코딩으로 읽히던 LlmOperationModeTests를 정리하고 README 및 DEVELOPMENT 문서에 정책 정의와 검증 결과를 함께 반영했다.

검증: dotnet build 경고 0 오류 0, LlmOperationModeTests 5건 통과.
This commit is contained in:
2026-04-15 16:41:45 +09:00
parent f4351aa0eb
commit 78b3aa2801
3 changed files with 67 additions and 6 deletions

View File

@@ -22,8 +22,8 @@ public class LlmOperationModeTests
[new ChatMessage { Role = "user", Content = "test" }]);
var ex = await action.Should().ThrowAsync<InvalidOperationException>();
ex.Which.Message.Should().Contain("사내 모드");
ex.Which.Message.Should().Contain("외부 LLM 호출이 차단");
ex.Which.Message.Should().Contain("외부 LLM 호출이 차단됩니다");
ex.Which.Message.Should().Contain("Gemini");
}
[Fact]
@@ -42,7 +42,7 @@ public class LlmOperationModeTests
tools);
var ex = await action.Should().ThrowAsync<InvalidOperationException>();
ex.Which.Message.Should().Contain("사내 모드");
ex.Which.Message.Should().Contain("외부 LLM 호출이 차단됩니다");
ex.Which.Message.Should().Contain("Claude");
}
@@ -61,8 +61,49 @@ public class LlmOperationModeTests
[new ChatMessage { Role = "user", Content = "test" }]);
var ex = await action.Should().ThrowAsync<InvalidOperationException>();
ex.Which.Message.Should().NotContain("사내 모드에서는 외부 LLM 호출이 차단");
ex.Which.Message.Should().Contain("API");
ex.Which.Message.Should().NotContain("외부 LLM 호출이 차단됩니다");
ex.Which.Message.Should().Contain("API");
}
[Fact]
public async Task SendAsync_InternalMode_AllowsOllamaToProceedPastExternalLlmGuard()
{
var settings = new SettingsService();
settings.Settings.OperationMode = OperationModePolicy.InternalMode;
settings.Settings.Llm.Service = "ollama";
settings.Settings.Llm.Model = "qwen2.5-coder";
settings.Settings.Llm.OllamaModel = "qwen2.5-coder";
settings.Settings.Llm.OllamaEndpoint = "http://127.0.0.1:1";
using var llm = new LlmService(settings);
var action = async () => await llm.SendAsync(
[new ChatMessage { Role = "user", Content = "test" }]);
var ex = await action.Should().ThrowAsync<Exception>();
ex.Which.Message.Should().NotContain("외부 LLM 호출이 차단됩니다");
ex.Which.Message.Should().NotContain("Gemini");
ex.Which.Message.Should().NotContain("Claude");
}
[Fact]
public async Task SendAsync_InternalMode_AllowsVllmToProceedPastExternalLlmGuard()
{
var settings = new SettingsService();
settings.Settings.OperationMode = OperationModePolicy.InternalMode;
settings.Settings.Llm.Service = "vllm";
settings.Settings.Llm.Model = "qwen2.5-coder";
settings.Settings.Llm.VllmModel = "qwen2.5-coder";
settings.Settings.Llm.VllmEndpoint = "http://127.0.0.1:1";
using var llm = new LlmService(settings);
var action = async () => await llm.SendAsync(
[new ChatMessage { Role = "user", Content = "test" }]);
var ex = await action.Should().ThrowAsync<Exception>();
ex.Which.Message.Should().NotContain("외부 LLM 호출이 차단됩니다");
ex.Which.Message.Should().NotContain("Gemini");
ex.Which.Message.Should().NotContain("Claude");
}
}