feat(worker): let Claude set the cheapest model per generated task via MCP
AddTask, planning CreateChildTask, and SuggestImprovement now accept an optional alias-validated model (haiku/sonnet/opus; blank = inherit) so the model is chosen at creation time instead of a follow-up set_task_config call. The planning, system, and improvement prompts instruct Claude to pick the cheapest capable model (haiku < sonnet < opus). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -39,12 +39,36 @@ public sealed class SuggestImprovementTests : IDisposable
|
||||
using var ctx = _db.CreateContext();
|
||||
var svc = new TaskRunMcpService(new TaskRepository(ctx), AccessorFor("caller"),
|
||||
new HubBroadcaster(new FakeHubContext()));
|
||||
var dto = await svc.SuggestImprovement("Refactor X", "details", default);
|
||||
var dto = await svc.SuggestImprovement("Refactor X", "details", model: null, default);
|
||||
var child = await new TaskRepository(ctx).GetByIdAsync(dto.ChildTaskId);
|
||||
Assert.Equal("caller", child!.ParentTaskId);
|
||||
Assert.Equal("caller", child.CreatedBy);
|
||||
Assert.Equal(TaskStatus.Idle, child.Status);
|
||||
Assert.Equal("l1", child.ListId);
|
||||
Assert.Null(child.Model);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task SuggestImprovement_persists_normalized_model()
|
||||
{
|
||||
await SeedCallerAsync("caller", parentId: null);
|
||||
using var ctx = _db.CreateContext();
|
||||
var svc = new TaskRunMcpService(new TaskRepository(ctx), AccessorFor("caller"),
|
||||
new HubBroadcaster(new FakeHubContext()));
|
||||
var dto = await svc.SuggestImprovement("Refactor X", "details", model: "HAIKU", default);
|
||||
var child = await new TaskRepository(ctx).GetByIdAsync(dto.ChildTaskId);
|
||||
Assert.Equal("haiku", child!.Model);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task SuggestImprovement_rejects_unknown_model()
|
||||
{
|
||||
await SeedCallerAsync("caller", parentId: null);
|
||||
using var ctx = _db.CreateContext();
|
||||
var svc = new TaskRunMcpService(new TaskRepository(ctx), AccessorFor("caller"),
|
||||
new HubBroadcaster(new FakeHubContext()));
|
||||
await Assert.ThrowsAsync<ArgumentException>(
|
||||
() => svc.SuggestImprovement("x", "y", model: "gpt4", default));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
@@ -56,6 +80,6 @@ public sealed class SuggestImprovementTests : IDisposable
|
||||
var svc = new TaskRunMcpService(new TaskRepository(ctx), AccessorFor("child"),
|
||||
new HubBroadcaster(new FakeHubContext()));
|
||||
await Assert.ThrowsAsync<InvalidOperationException>(
|
||||
() => svc.SuggestImprovement("nested", "x", default));
|
||||
() => svc.SuggestImprovement("nested", "x", model: null, default));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user