From e856c766584ed933bed0b79c7ef47b6d98b0fb7e Mon Sep 17 00:00:00 2001 From: Ben Sima Date: Fri, 19 Dec 2025 16:41:01 -0500 Subject: Omni/Agent: wire prompt templating system to agents - Telegram.hs: add loadTelegramSystemPrompt with fallback - Subagent.hs: add loadSystemPromptForRole with fallback - Coder.hs: add loadCoderSystemPrompt with fallback - Ava.nix: add tmpfiles rules for /home/ava/prompts/ - Prompts.hs: fix test to expect .mustache extension Templates loaded at runtime from $AVA_DATA_ROOT/prompts/. Falls back to hardcoded prompts if templates not found. Amp-Thread-ID: https://ampcode.com/threads/T-019b3878-73be-77ec-97cc-d092a28d211e Co-authored-by: Amp --- Omni/Agent/Subagent/Coder.hs | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) (limited to 'Omni/Agent/Subagent/Coder.hs') diff --git a/Omni/Agent/Subagent/Coder.hs b/Omni/Agent/Subagent/Coder.hs index 523b035..865a97e 100644 --- a/Omni/Agent/Subagent/Coder.hs +++ b/Omni/Agent/Subagent/Coder.hs @@ -17,6 +17,8 @@ -- : out omni-agent-subagent-coder -- : dep aeson -- : dep async +-- : dep directory +-- : dep mustache -- : dep stm -- : dep time module Omni.Agent.Subagent.Coder @@ -52,6 +54,7 @@ import qualified Data.Aeson as Aeson import qualified Data.Text as Text import qualified Data.Time.Clock as Clock import qualified Omni.Agent.Engine as Engine +import qualified Omni.Agent.Prompts as Prompts import qualified Omni.Agent.Provider as Provider import qualified Omni.Agent.Tools as Tools import qualified Omni.Test as Test @@ -242,7 +245,22 @@ coderTools = Tools.searchAndReadTool ] --- | System prompt for the Coder subagent +-- | Load system prompt from template, falling back to hardcoded if unavailable +loadCoderSystemPrompt :: CoderConfig -> Maybe Text -> IO Text +loadCoderSystemPrompt cfg maybeInitState = do + let ctx = + Aeson.object + [ "namespace" .= coderNamespace cfg, + "task" .= coderTask cfg, + "context" .= coderContext cfg, + "init_state" .= maybeInitState + ] + result <- Prompts.renderPrompt "subagents/coder/system" ctx + case result of + Right prompt -> pure prompt + Left _err -> pure (coderSystemPrompt cfg maybeInitState) + +-- | Hardcoded fallback system prompt for the Coder subagent coderSystemPrompt :: CoderConfig -> Maybe Text -> Text coderSystemPrompt cfg maybeInitState = Text.unlines @@ -364,7 +382,7 @@ runWorkVerifyLoop openRouterKey cfg initState verifyAttempt accTokens accCost = -- Phase 2: Work (run the agent) let provider = Provider.defaultOpenRouter openRouterKey (coderModel cfg) - let systemPrompt = coderSystemPrompt cfg initState + systemPrompt <- loadCoderSystemPrompt cfg initState let guardrails = Engine.Guardrails { Engine.guardrailMaxCostCents = coderMaxCost cfg - accCost, -- cgit v1.2.3