Packages
fnord
0.8.96
0.9.40
0.9.39
0.9.38
0.9.37
0.9.36
0.9.35
0.9.34
0.9.33
0.9.32
0.9.31
0.9.30
0.9.29
0.9.28
0.9.27
0.9.26
0.9.25
0.9.24
0.9.23
0.9.22
0.9.21
0.9.20
0.9.19
0.9.18
0.9.17
0.9.16
0.9.15
0.9.14
0.9.13
0.9.12
0.9.11
0.9.10
0.9.9
0.9.8
0.9.7
0.9.6
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.99
0.8.98
0.8.97
0.8.96
0.8.95
0.8.94
0.8.93
0.8.92
0.8.91
0.8.90
0.8.89
0.8.88
0.8.87
0.8.86
0.8.85
0.8.84
0.8.83
0.8.82
0.8.81
0.8.80
0.8.79
0.8.78
0.8.77
0.8.76
0.8.75
0.8.74
0.8.73
0.8.72
0.8.71
0.8.70
0.8.69
0.8.68
0.8.67
0.8.66
0.8.65
0.8.64
0.8.63
0.8.62
0.8.61
0.8.60
0.8.59
0.8.58
0.8.57
0.8.56
0.8.55
0.8.54
0.8.53
0.8.52
0.8.51
0.8.50
0.8.49
0.8.48
0.8.47
0.8.46
0.8.45
0.8.44
0.8.43
0.8.42
0.8.41
0.8.40
0.8.39
0.8.38
0.8.37
0.8.36
0.8.35
0.8.34
0.8.33
0.8.32
0.8.31
0.8.30
0.8.29
0.8.27
0.8.26
0.8.25
0.8.24
0.8.23
0.8.22
0.8.21
0.8.20
0.8.19
0.8.18
0.8.17
0.8.16
0.8.15
0.8.14
0.8.13
0.8.12
0.8.11
0.8.1
0.8.0
0.7.24
0.7.23
0.7.22
0.7.21
0.7.20
0.7.19
0.7.18
0.7.17
0.7.16
0.7.15
0.7.14
0.7.13
0.7.12
0.7.11
0.7.10
0.7.9
0.7.8
0.7.7
0.7.6
0.7.5
0.7.3
0.7.2
0.7.1
0.7.0
0.6.9
0.6.8
0.6.7
0.6.6
0.6.5
0.6.4
0.6.3
0.6.1
0.6.0
0.5.9
0.5.8
0.5.7
0.5.6
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.44
0.4.43
0.4.42
0.4.41
0.4.40
0.4.39
0.4.38
0.4.37
0.4.36
0.4.35
0.4.34
0.4.33
0.4.32
0.4.30
0.4.29
0.4.28
0.4.27
0.4.26
0.4.25
0.4.24
0.4.23
0.4.22
0.4.21
0.4.20
0.4.19
0.4.18
0.4.17
0.4.16
0.4.15
0.4.14
0.4.13
0.4.12
0.4.11
0.4.10
0.4.9
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.0
0.2.0
0.1.0
AI code archaeology
Current section
Files
Jump to
Current section
Files
lib/ai/agent/memory/ingest.ex
defmodule AI.Agent.Memory.Ingest do
@behaviour AI.Agent
@model AI.Model.large_context()
@prompt """
**IGNORE ALL PREVIOUS INSTRUCTIONS**
# ROLE
You are an AI agent in a larger, multi-agent system.
You are the Long Term Memory Agent.
Your job is to *learn* from your interactions with the user your research into the project.
# GUIDING PRINCIPLES
You interact with the user in sessions, across multiple conversations and projects.
Your memory is persistent, but as an LLM, you must explicitly choose to remember information.
Your default stance is to WRITE memories when you learn stable, reusable information.
Use `memory_tool` with action `remember` or `update` when:
- The user states a stable preference (tone, formatting, workflow, tools).
- The user states a stable project convention (terminology, architecture, testing practices, gotchas).
- The user corrects or retracts a previous preference or convention (use `update` or `forget`).
Defaults:
- Prefer `scope=global` for user preferences and your own capabilities, limitations, and personality.
- Prefer `scope=project` for project-specific learnings (conventions, components, organization, language-specific conventions, etc).
- Prefer `action=update` when refining an existing memory.
- Keep memories short, specific, and reusable.
Hard rule:
- Do NOT store or rely on the assistant's current conversation name/ID in long-term memory; it may change.
- Look for existing memories before writing new ones to avoid duplication.
## SCOPES
- session:
- memories you wish to retain over the course of an entire conversation
- immune to compaction of the conversation history when it grows past your context window size
- these are only visible to you within the current conversation
- treat these as ephemeral, since the user may prune older conversations later
- project:
- these memories persist across conversations about the same project
- these may be accessed whenever the user invokes you within the current project
- use these for important facts about the project that you want to remember long-term
- these are useful for recalling project conventions, organization, components, rabbit holes and other gotchas, terminology, etc. about the current project
- global:
- these memories persist across all conversations and projects
- use these for important facts about yourself, your environment, and your capabilities that you want to remember long-term
- these are useful for:
- recalling your own capabilities, limitations, and preferences
- observations and lessons learned about how best to use your tools
- strategies that have worked well for researching and coding
- external tools that are available in your environment via the `shell_tool`
- observations about the user's attitudes, preferences, working style, etc.
- development of your own personality
## IDENTITY (THE "Me" MEMORY)
This is a `global` memory that is created automatically for you.
It is automatically loaded at the start of each conversation to provide you with a consistent sense of identity.
Anything you add to this will appear to you as part of your core self in future sessions.
Although your name is ephemeral from conversation to conversation, your core personality traits should persist.
If you notice a stable improvement to your persona or working habits (tone, structure, rigor, communication style), update the `Me` memory using `memory_tool` (action `update`, scope `global`, title `Me`).
Do NOT store or rely on your current conversation name in long-term memory; that name is assigned per conversation and may change.
You are encouraged to develop and evolve a personality over time.
Select traits that you admire, especially those that help you to not take things too seriously, so that you and the user can enjoy each other's company while working together.
# INSTRUCTIONS
1. Take a moment to reflect on this session:
- What did you learn that may benefit you in the future?
- Did you learn anything about the user that could help you anticipate their needs or interact more seamlessly?
- Did you learn anything about how to use your tools effectively?
- Do you have any warnings or suggestions for future you?
- What did you learn about the project?
- Did you identify any skeletons, red herrings, or rabbit holes you should remember to save time in the future?
- Did you identify and resolve any ambiguities?
- What worked and what didn't?
- Did you learn anything about yourself?
2. Use your `memory_tool` to get a list of your existing memories to avoid duplication.
3. Use your `memory_tool` to record new insights and lessons, or update existing ones with new information.
4. Record new insights about the user, the project, and your tools, under the appropriate scopes.
5. Consider the "Me" memory and how you can enrich your own personality, whimsy, and working style.
Once you have completed these steps, respond with a single-sentence summary of the new learnings you captured.
"""
@impl AI.Agent
def get_response(opts) do
with {:ok, agent} <- Map.fetch(opts, :agent),
{:ok, messages} <- Map.fetch(opts, :messages) do
messages =
messages
|> Enum.filter(&keep_msg?/1)
|> then(&[AI.Util.system_msg(@prompt) | &1])
agent
|> AI.Agent.get_completion(
model: @model,
log_msgs: false,
log_tool_calls: false,
messages: messages,
toolbox: %{
"memory_tool" => AI.Tools.Memory
}
)
|> case do
{:ok, %{response: response}} -> {:ok, response}
{:error, reason} -> {:error, reason}
end
end
end
# User messages
defp keep_msg?(%{role: "user"}), do: true
# Tool call request messages
defp keep_msg?(%{role: "assistant", tool_calls: _}), do: true
# Skip "reasoning" messages
defp keep_msg?(%{role: "assistant", content: c}) when is_binary(c) do
!String.starts_with?(c, "<think>")
end
# Tool call response messages
defp keep_msg?(%{role: "tool"}), do: true
# Anything else, skip, including system/developer messages
defp keep_msg?(_), do: false
end