using System.Text.Json; using System.Text.Json.Serialization; namespace Agent.Core.Runtime; /// /// LLM-generated plan parsed from structured output. /// Each planned task contains a description, dependency references (by index), /// token budget class, PERT estimates, and the requires_external_effect attribute. /// public sealed class PlanResult { [JsonPropertyName("tasks")] public List Tasks { get; init; } = []; } public sealed class PlannedTask { [JsonPropertyName("description")] public string Description { get; init; } = string.Empty; [JsonPropertyName("dependencies")] public List Dependencies { get; init; } = []; [JsonPropertyName("budget_class")] public string BudgetClass { get; init; } = "4K"; [JsonPropertyName("optimistic_tokens")] public long OptimisticTokens { get; init; } [JsonPropertyName("most_likely_tokens")] public long MostLikelyTokens { get; init; } [JsonPropertyName("pessimistic_tokens")] public long PessimisticTokens { get; init; } [JsonPropertyName("requires_external_effect")] public bool RequiresExternalEffect { get; init; } [JsonPropertyName("required_effect_tools")] public List RequiredEffectTools { get; init; } = []; } /// /// JSON Schema for Ollama structured output during Planning. /// public static class PlanSchema { public static string Json => """{"type":"object","properties":{"tasks":{"type":"array","items":{"type":"object","properties":{"description":{"type":"string"},"dependencies":{"type":"array","items":{"type":"integer"}},"budget_class":{"type":"string","enum":["1K","2K","4K","8K","16K","32K","64K","128K"]},"optimistic_tokens":{"type":"integer","minimum":1},"most_likely_tokens":{"type":"integer","minimum":1},"pessimistic_tokens":{"type":"integer","minimum":1},"requires_external_effect":{"type":"boolean"},"required_effect_tools":{"type":"array","items":{"type":"string","enum":["file_edit","process_run","dir"]}}},"required":["description","dependencies","budget_class","optimistic_tokens","most_likely_tokens","pessimistic_tokens","requires_external_effect","required_effect_tools"]}}},"required":["tasks"]}"""; private static readonly JsonElement _element = JsonDocument.Parse(Json).RootElement.Clone(); public static JsonElement Element => _element; }