diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/Agent.Core/Runtime/AgentRuntime.cs | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/src/Agent.Core/Runtime/AgentRuntime.cs b/src/Agent.Core/Runtime/AgentRuntime.cs index 333d557..9c051e9 100644 --- a/src/Agent.Core/Runtime/AgentRuntime.cs +++ b/src/Agent.Core/Runtime/AgentRuntime.cs @@ -266,7 +266,14 @@ public sealed class AgentRuntime(TaskRegistry registry, IOllamaClient ollama, Ag foreach (OllamaToolCall call in calls) { ToolExecutionResult toolResult; - try + bool outOfScopeEffect = IsOutOfScopeEffectCall(call, plannerTask.RequiredEffectTools); + if (outOfScopeEffect) + { + toolResult = new(false, + $"The '{call.Function.Name}' external effect belongs to another Planner Task. Perform only the current Task; required effect Tool(s): {string.Join(", ", plannerTask.RequiredEffectTools.Order(StringComparer.Ordinal))}.", + false, $"task_scope:{plannerTask.Id}:{call.Function.Name}"); + } + else try { toolResult = await _tools.DispatchAsync(taskId, call.Function.Name, call.Function.Arguments, cancellationToken).ConfigureAwait(false); } @@ -283,7 +290,7 @@ public sealed class AgentRuntime(TaskRegistry registry, IOllamaClient ollama, Ag // task_update is a metadata tool for graph bookkeeping; its failures should not block completion. bool isMetadataTool = call.Function.Name == "task_update"; if (toolResult.Success) unresolvedToolFailures.Remove(call.Function.Name); - else if (!isMetadataTool) unresolvedToolFailures[call.Function.Name] = toolResult.FailureFingerprint ?? toolResult.Output; + else if (!isMetadataTool && !outOfScopeEffect) unresolvedToolFailures[call.Function.Name] = toolResult.FailureFingerprint ?? toolResult.Output; // Record ExecutionResult in session for context summary. session.AppendExecutionResult(new ExecutionResult(taskId, call.Function.Name, toolResult.Success, toolResult.Output)); @@ -330,6 +337,14 @@ public sealed class AgentRuntime(TaskRegistry registry, IOllamaClient ollama, Ag return finalContent; } + private static bool IsOutOfScopeEffectCall(OllamaToolCall call, IReadOnlySet<string> requiredEffectTools) + { + bool createsExternalEffect = call.Function.Name is "file_edit" or "process_run" || + call.Function.Name == "dir" && call.Function.Arguments.TryGetProperty("operation", out JsonElement operation) && + operation.GetString() is "mkdir" or "rmdir"; + return createsExternalEffect && !requiredEffectTools.Contains(call.Function.Name); + } + /// <summary> /// Builds a TaskGraph summary for the prompt context (Design ยง9.2 item 6). /// Shows the current task position within the overall graph. |
