summaryrefslogtreecommitdiff
path: root/Omni/Agent/Subagent
diff options
context:
space:
mode:
authorBen Sima <ben@bensima.com>2025-12-19 16:41:01 -0500
committerBen Sima <ben@bensima.com>2025-12-19 16:41:01 -0500
commite856c766584ed933bed0b79c7ef47b6d98b0fb7e (patch)
treea630081a106678533837c8e284d04146b2593cb5 /Omni/Agent/Subagent
parent37d6503342ef9e171fef88960f7baceaa4d1a641 (diff)
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 <amp@ampcode.com>
Diffstat (limited to 'Omni/Agent/Subagent')
-rw-r--r--Omni/Agent/Subagent/Coder.hs22
1 files changed, 20 insertions, 2 deletions
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,