Packages
fnord
0.7.21
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/cmd/default.ex
defmodule Cmd.Default do
@moduledoc """
Converses with the default AI agent.
Conversations are a "floating window" of messages that are stored in the
default project.
"""
@behaviour Cmd
@impl Cmd
def spec() do
[
default: [
name: "default",
about: """
Converse with the default AI agent. This feature is *alpha* and not
fully functional yet. It uses the current directory to determine
whether it is within a project context. If it's within a project, it
can use the research tools, but it cannot yet access the project's
notes or past research. Please open an issue if you notice any bugs.
""",
options: [
prompt: [
value_name: "PROMPT",
long: "--prompt",
short: "-p",
help: "The prompt to ask the AI",
required: true
]
]
]
]
end
@impl Cmd
def run(opts, _subcommands, _unknown) do
with {:ok, prompt} when is_binary(prompt) <- Map.fetch(opts, :prompt),
{:ok, result} <- AI.Agent.Default.get_response(%{prompt: prompt}) do
IO.puts(result.response)
IO.puts("")
maybe_rollup(result.usage, result.num_msgs)
else
{:ok, nil} -> IO.puts("Error: The prompt cannot be empty")
:error -> IO.puts("Error: Missing required option --prompt")
end
end
# ----------------------------------------------------------------------------
# Rollups: Archive older messages as a summary when the size of the
# conversation exceeds a threshold based on the model's context window.
# ----------------------------------------------------------------------------
@rollup_prompt """
The conversation is beginning to fill the context window. Would you like to
archive older messages? Older messages will be archived as a monthly summary
for reference. The AI will continue to have access to those summaries.
"""
@rollup_context_threshold 0.1
defp maybe_rollup(usage, num_msgs) do
UI.log_usage(AI.Agent.Default.model(), usage)
UI.info("Conversation length: #{num_msgs} messages")
if usage / AI.Agent.Default.model().context > @rollup_context_threshold do
if UI.confirm(@rollup_prompt) do
last_interaction = Store.DefaultProject.Conversation.last_interaction()
AI.Agent.Default.Rollups.get_response(%{})
|> case do
{:ok, summaries} ->
Store.DefaultProject.Conversation.replace_messages(summaries ++ last_interaction)
UI.info("Summarized and archived older messages.")
{:error, reason} ->
UI.error("Failed to generate summaries: #{reason}")
end
else
UI.info("Conversation not consolidated.")
end
end
end
end