Initial commit to new repository
This commit is contained in:
111
src/AxCopilot.Tests/Services/LlmRuntimeOverrideTests.cs
Normal file
111
src/AxCopilot.Tests/Services/LlmRuntimeOverrideTests.cs
Normal file
@@ -0,0 +1,111 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Reflection;
|
||||
using AxCopilot.Models;
|
||||
using AxCopilot.Services;
|
||||
using AxCopilot.Services.Agent;
|
||||
using FluentAssertions;
|
||||
using Xunit;
|
||||
|
||||
namespace AxCopilot.Tests.Services;
|
||||
|
||||
public class LlmRuntimeOverrideTests
|
||||
{
|
||||
[Fact]
|
||||
public void PushInferenceOverride_PopInferenceOverride_RestoresPreviousState()
|
||||
{
|
||||
var settings = new SettingsService();
|
||||
settings.Settings.Llm.Service = "ollama";
|
||||
settings.Settings.Llm.Model = "base-model";
|
||||
settings.Settings.Llm.Temperature = 0.7;
|
||||
|
||||
using var llm = new LlmService(settings);
|
||||
|
||||
llm.PushRouteOverride("gemini", "gemini-2.5-pro");
|
||||
llm.PushInferenceOverride(temperature: 0.2, reasoningEffort: "high");
|
||||
|
||||
llm.GetCurrentModelInfo().service.Should().Be("gemini");
|
||||
llm.GetCurrentModelInfo().model.Should().Be("gemini-2.5-pro");
|
||||
InvokePrivate<double>(llm, "ResolveTemperature").Should().Be(0.2);
|
||||
InvokePrivate<string?>(llm, "ResolveReasoningEffort").Should().Be("high");
|
||||
|
||||
llm.PopInferenceOverride();
|
||||
llm.GetCurrentModelInfo().service.Should().Be("gemini");
|
||||
llm.GetCurrentModelInfo().model.Should().Be("gemini-2.5-pro");
|
||||
InvokePrivate<double>(llm, "ResolveTemperature").Should().Be(0.7);
|
||||
InvokePrivate<string?>(llm, "ResolveReasoningEffort").Should().BeNull();
|
||||
|
||||
llm.ClearRouteOverride();
|
||||
llm.GetCurrentModelInfo().service.Should().Be("ollama");
|
||||
llm.GetCurrentModelInfo().model.Should().Be("base-model");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void AgentLoop_ResolveSkillRuntimeOverrides_MapsModelAndEffort()
|
||||
{
|
||||
var settings = new SettingsService();
|
||||
settings.Settings.Llm.Service = "ollama";
|
||||
settings.Settings.Llm.Model = "base-model";
|
||||
settings.Settings.Llm.RegisteredModels =
|
||||
[
|
||||
new RegisteredModel
|
||||
{
|
||||
Alias = "gpt-5.4",
|
||||
EncryptedModelName = "gpt-5.4",
|
||||
Service = "vllm",
|
||||
}
|
||||
];
|
||||
|
||||
using var llm = new LlmService(settings);
|
||||
var loop = new AgentLoopService(llm, ToolRegistry.CreateDefault(), settings);
|
||||
var messages = new List<ChatMessage>
|
||||
{
|
||||
new()
|
||||
{
|
||||
Role = "system",
|
||||
Content = """
|
||||
[Skill Runtime Policy]
|
||||
- preferred_model: gpt-5.4
|
||||
- reasoning_effort: high
|
||||
- execution_context: fork
|
||||
- allowed_tools: Read, process
|
||||
- hook_names: lint-pre, verify-post
|
||||
- hook_filters: lint-pre@pre@file_edit, verify-post@post@*
|
||||
"""
|
||||
},
|
||||
new() { Role = "user", Content = "test" }
|
||||
};
|
||||
|
||||
var method = typeof(AgentLoopService).GetMethod(
|
||||
"ResolveSkillRuntimeOverrides",
|
||||
BindingFlags.NonPublic | BindingFlags.Instance);
|
||||
method.Should().NotBeNull();
|
||||
|
||||
var result = method!.Invoke(loop, [messages]);
|
||||
result.Should().NotBeNull();
|
||||
|
||||
var resultType = result!.GetType();
|
||||
resultType.GetProperty("Service")!.GetValue(result)!.Should().Be("vllm");
|
||||
resultType.GetProperty("Model")!.GetValue(result)!.Should().Be("gpt-5.4");
|
||||
resultType.GetProperty("ReasoningEffort")!.GetValue(result)!.Should().Be("high");
|
||||
resultType.GetProperty("Temperature")!.GetValue(result)!.Should().Be(0.2);
|
||||
resultType.GetProperty("RequireForkExecution")!.GetValue(result)!.Should().Be(true);
|
||||
|
||||
var allowedSet = (IReadOnlySet<string>)resultType.GetProperty("AllowedToolNames")!.GetValue(result)!;
|
||||
allowedSet.Should().Contain("file_read");
|
||||
allowedSet.Should().Contain("process");
|
||||
|
||||
var hookSet = (IReadOnlySet<string>)resultType.GetProperty("HookNames")!.GetValue(result)!;
|
||||
hookSet.Should().Contain("lint-pre");
|
||||
hookSet.Should().Contain("verify-post");
|
||||
|
||||
var filters = (IReadOnlyList<object>)resultType.GetProperty("HookFilters")!.GetValue(result)!;
|
||||
filters.Should().NotBeEmpty();
|
||||
}
|
||||
|
||||
private static T InvokePrivate<T>(object instance, string methodName)
|
||||
{
|
||||
var method = instance.GetType().GetMethod(methodName, BindingFlags.NonPublic | BindingFlags.Instance);
|
||||
method.Should().NotBeNull();
|
||||
return (T)method!.Invoke(instance, null)!;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user