never executed always true always false
1 module PureClaw.Agent.Memory
2 ( -- * Memory integration
3 autoRecall
4 , autoSave
5 ) where
6
7 import Data.Text (Text)
8 import Data.Text qualified as T
9
10 import Data.Map.Strict qualified as Map
11
12 import PureClaw.Core.Types
13 import PureClaw.Handles.Log
14 import PureClaw.Handles.Memory
15
16 -- | Minimum message length to trigger auto-save (characters).
17 minSaveLength :: Int
18 minSaveLength = 50
19
20 -- | Automatically recall relevant memories for a user message.
21 -- Returns formatted context to prepend to the system prompt, or
22 -- Nothing if no relevant memories are found.
23 autoRecall :: MemoryHandle -> LogHandle -> Text -> IO (Maybe Text)
24 autoRecall mh logger query = do
25 results <- _mh_search mh query defaultSearchConfig { _sc_maxResults = 3 }
26 if null results
27 then pure Nothing
28 else do
29 _lh_logDebug logger $ "Recalled " <> T.pack (show (length results)) <> " memories"
30 let formatted = T.unlines
31 [ "## Relevant memories"
32 , ""
33 , T.intercalate "\n\n" [ _sr_content r | r <- results ]
34 ]
35 pure (Just formatted)
36
37 -- | Automatically save an assistant response to memory if it's
38 -- long enough to be worth remembering.
39 autoSave :: MemoryHandle -> LogHandle -> Text -> IO ()
40 autoSave mh logger content
41 | T.length content < minSaveLength = pure ()
42 | otherwise = do
43 let source = MemorySource
44 { _ms_content = content
45 , _ms_metadata = Map.empty
46 }
47 result <- _mh_save mh source
48 case result of
49 Nothing -> pure ()
50 Just mid -> _lh_logDebug logger $ "Auto-saved memory: " <> unMemoryId mid