summaryrefslogtreecommitdiff
path: root/tests/Agent.Core.Tests/PromptAndRuntimeTests.cs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/Agent.Core.Tests/PromptAndRuntimeTests.cs')
-rw-r--r--tests/Agent.Core.Tests/PromptAndRuntimeTests.cs27
1 files changed, 24 insertions, 3 deletions
diff --git a/tests/Agent.Core.Tests/PromptAndRuntimeTests.cs b/tests/Agent.Core.Tests/PromptAndRuntimeTests.cs
index 082ea9b..b7f27e7 100644
--- a/tests/Agent.Core.Tests/PromptAndRuntimeTests.cs
+++ b/tests/Agent.Core.Tests/PromptAndRuntimeTests.cs
@@ -275,7 +275,7 @@ public sealed class PromptAndRuntimeTests
{
TaskRegistry registry = new();
var ollama = new ThinkRetryOllamaClient(succeedOnRetry: true);
- var runtime = new AgentRuntime(registry, ollama, new AgentRuntimeSettings("", "en", [], "sandbox"));
+ var runtime = new AgentRuntime(registry, ollama, new AgentRuntimeSettings("execution-only-marker", "en", [], "sandbox"));
TaskSnapshot task = registry.Enqueue("analyze", null, 0.7);
registry.Transition(task.TaskId, AgentTaskState.Planning);
@@ -291,6 +291,8 @@ public sealed class PromptAndRuntimeTests
message.Role == "system" && message.Content.Contains("one implementation-and-verification Task", StringComparison.Ordinal));
Assert.Contains(ollama.PlanningMessages[1], message =>
message.Role == "system" && message.Content.Contains("Do not call or execute any Tool", StringComparison.Ordinal));
+ Assert.DoesNotContain(ollama.PlanningMessages.SelectMany(static messages => messages), message =>
+ message.Content.Contains("execution-only-marker", StringComparison.Ordinal));
}
[Fact]
@@ -311,6 +313,23 @@ public sealed class PromptAndRuntimeTests
}
[Fact]
+ public async Task Split_coding_plan_is_rejected_and_retried_with_specific_correction()
+ {
+ TaskRegistry registry = new();
+ var ollama = new ThinkRetryOllamaClient(succeedOnRetry: true, semanticSplitFirst: true);
+ var runtime = new AgentRuntime(registry, ollama, new AgentRuntimeSettings("", "en", [], "sandbox"));
+ TaskSnapshot task = registry.Enqueue("implement and test", null, null);
+ registry.Transition(task.TaskId, AgentTaskState.Planning);
+
+ await runtime.ExecuteAsync(task.TaskId, TestContext.Current.CancellationToken);
+
+ Assert.True(registry.TryGet(task.TaskId, null, out TaskSnapshot? completed));
+ Assert.Equal(AgentTaskState.Completed, completed!.State);
+ Assert.Contains(ollama.PlanningMessages[1], message => message.Role == "system" &&
+ message.Content.Contains("cannot depend on a separate file_edit Task", StringComparison.Ordinal));
+ }
+
+ [Fact]
public async Task Failed_context_summary_does_not_delete_original_context()
{
var sessions = new SessionStore();
@@ -610,7 +629,7 @@ public sealed class PromptAndRuntimeTests
}
}
- private sealed class ThinkRetryOllamaClient(bool succeedOnRetry) : IOllamaClient
+ private sealed class ThinkRetryOllamaClient(bool succeedOnRetry, bool semanticSplitFirst = false) : IOllamaClient
{
public List<bool?> ThinkOverrides { get; } = [];
public List<double?> Temperatures { get; } = [];
@@ -623,7 +642,9 @@ public sealed class PromptAndRuntimeTests
ThinkOverrides.Add(thinkOverride);
Temperatures.Add(temperatureOverride);
PlanningMessages.Add(messages);
- string content = ThinkOverrides.Count == 2 && succeedOnRetry
+ string content = ThinkOverrides.Count == 1 && semanticSplitFirst
+ ? """{"tasks":[{"description":"edit","dependencies":[],"budget_class":"4K","optimistic_tokens":10,"most_likely_tokens":20,"pessimistic_tokens":30,"requires_external_effect":true,"required_tools":["file_edit"]},{"description":"verify and correct","dependencies":[0],"budget_class":"4K","optimistic_tokens":10,"most_likely_tokens":20,"pessimistic_tokens":30,"requires_external_effect":true,"required_tools":["file_edit","process_run"]}]}"""
+ : ThinkOverrides.Count == 2 && succeedOnRetry
? """
Here is the requested plan.