Initial commit to new repository

This commit is contained in:
2026-04-03 18:22:19 +09:00
commit 4458bb0f52
7672 changed files with 452440 additions and 0 deletions

View 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)!;
}
}