diff options
Diffstat (limited to 'src/Agent.Core')
| -rw-r--r-- | src/Agent.Core/Runtime/PlannerService.cs | 25 | ||||
| -rw-r--r-- | src/Agent.Core/Tools/TaskGraphToolHandler.cs | 8 |
2 files changed, 26 insertions, 7 deletions
diff --git a/src/Agent.Core/Runtime/PlannerService.cs b/src/Agent.Core/Runtime/PlannerService.cs index 7a450d0..110e476 100644 --- a/src/Agent.Core/Runtime/PlannerService.cs +++ b/src/Agent.Core/Runtime/PlannerService.cs @@ -55,7 +55,15 @@ public sealed class PlannerService(IOllamaClient ollama, AgentRuntimeSettings se if (plan is null || plan.Tasks.Count == 0) return CreateFallbackGraph(request); - TaskGraph graph = BuildTaskGraph(plan, request); + TaskGraph graph; + try + { + graph = BuildTaskGraph(plan, request); + } + catch + { + return CreateFallbackGraph(request); + } session.TaskGraphs[taskId] = graph; return graph; } @@ -116,10 +124,21 @@ public sealed class PlannerService(IOllamaClient ollama, AgentRuntimeSettings se } string description = string.IsNullOrWhiteSpace(pt.Description) ? originalRequest : pt.Description; - PlannerTask task = graph.AddTask(description, budgetClass, estimate, dependencies, pt.RequiresExternalEffect); - idMap.Add(task.Id); + try + { + PlannerTask task = graph.AddTask(description, budgetClass, estimate, dependencies, pt.RequiresExternalEffect); + idMap.Add(task.Id); + } + catch (PlannerValidationException) + { + // If a task fails validation (e.g., bad estimate, cycle), fall back to single-task graph. + return CreateFallbackGraph(originalRequest); + } } + // If all tasks were filtered out, fall back. + if (graph.Count == 0) return CreateFallbackGraph(originalRequest); + return graph; } diff --git a/src/Agent.Core/Tools/TaskGraphToolHandler.cs b/src/Agent.Core/Tools/TaskGraphToolHandler.cs index edc1cc5..10094d3 100644 --- a/src/Agent.Core/Tools/TaskGraphToolHandler.cs +++ b/src/Agent.Core/Tools/TaskGraphToolHandler.cs @@ -21,13 +21,13 @@ public sealed class TaskGraphToolHandler(int maxTasks = 32, SessionStore? sessio TaskGraph graph = new(maxTasks); if (sessions is not null && sessions.TryGet(sessionId, out AgentSession? session) && session is not null) { - if (!session.TaskGraphs.TryAdd(taskId, graph)) - throw new InvalidOperationException($"TaskGraph for '{taskId}' already exists in session '{sessionId}'."); + // PlanAsync may have already created a TaskGraph for this taskId. + // If so, keep the planned graph; otherwise add a new empty one. + session.TaskGraphs.TryAdd(taskId, graph); } else { - if (!_fallbackGraphs.TryAdd(taskId, graph)) - throw new InvalidOperationException($"TaskGraph for '{taskId}' already exists."); + _fallbackGraphs.TryAdd(taskId, graph); } } |
