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/ai/tools/default/notes.ex
defmodule AI.Tools.Default.Notes do
@behaviour AI.Tools
@impl AI.Tools
def ui_note_on_request(%{"op" => "create", "text" => text}) do
{"Creating note", String.slice(text, 0, 50) <> "..."}
end
def ui_note_on_request(%{"op" => "update", "text" => text}) do
{"Updating note", String.slice(text, 0, 50) <> "..."}
end
def ui_note_on_request(%{"op" => "delete", "id" => id}) do
{"Deleting note", id}
end
def ui_note_on_request(%{"op" => "search", "needle" => needle}) do
{"Searching notes for", String.slice(needle, 0, 50) <> "..."}
end
@impl AI.Tools
def ui_note_on_result(%{"op" => "create"}, result) do
{"Note created", "ID: #{result}"}
end
def ui_note_on_result(%{"op" => "update"}, result) do
{"Note updated", "ID: #{result}"}
end
def ui_note_on_result(%{"op" => "delete"}, result) do
{"Note deleted", "ID: #{result}"}
end
def ui_note_on_result(%{"op" => "search"} = args, result) do
{"Search results for '#{args["needle"]}'", result}
end
@impl AI.Tools
def read_args(args) do
args
|> Map.fetch("op")
|> case do
{:ok, "create"} ->
with {:ok, text} <- Map.fetch(args, "text") do
{:ok, %{"op" => "create", "text" => String.trim(text)}}
else
_ -> {:error, :missing_argument, "text"}
end
{:ok, "update"} ->
with {:ok, id} <- Map.fetch(args, "id"),
{:ok, text} <- Map.fetch(args, "text") do
{:ok, %{"op" => "update", "id" => String.trim(id), "text" => String.trim(text)}}
else
_ -> {:error, :missing_argument, "id, text"}
end
{:ok, "delete"} ->
with {:ok, id} <- Map.fetch(args, "id") do
{:ok, %{"op" => "delete", "id" => String.trim(id)}}
else
_ -> {:error, :missing_argument, "id"}
end
{:ok, "search"} ->
with {:ok, needle} <- Map.fetch(args, "needle") do
{:ok, %{"op" => "search", "needle" => String.trim(needle)}}
else
_ -> {:error, :missing_argument, "needle"}
end
:error ->
{:error, :missing_argument, "op"}
{:ok, other} when is_binary(other) ->
{:error, :invalid_argument, "op"}
end
end
@impl AI.Tools
def spec do
%{
type: "function",
function: %{
name: "notes",
description: """
Add a note to your personal notes. This is useful for keeping track of
important information or reminders.
""",
parameters: %{
type: "object",
required: ["op"],
properties: %{
op: %{
type: "string",
description: "Valid options: [create | update | delete | search]"
},
id: %{
type: "string",
description:
"The ID of the note to update or delete. Required for update/delete operations."
},
text: %{
type: "string",
description: "The text of the note. Required for create/update operations."
},
needle: %{
type: "string",
description: """
The text to search for in your notes.
Returns a JSONL list of notes whose text contained the needle (case insensitive).
Required for search operations.
"""
}
}
}
}
}
end
@impl AI.Tools
def call(%{"op" => "create", "text" => text}) do
with {:ok, id} <- Store.DefaultProject.Notes.create(text) do
{:ok, "Note created succesfully (ID: #{id})"}
end
end
def call(%{"op" => "update", "id" => id, "text" => text}) do
with {:ok, id} <- Store.DefaultProject.Notes.update(id, text) do
{:ok, "Note updated successfully (ID: #{id})"}
end
end
def call(%{"op" => "delete", "id" => id}) do
with {:ok, id} <- Store.DefaultProject.Notes.delete(id) do
{:ok, "Note deleted successfully (ID: #{id})"}
end
end
def call(%{"op" => "search", "needle" => needle}) do
results = Store.DefaultProject.Notes.search(needle)
{:ok,
"""
Search results for '#{needle}':
```jsonl
#{results}
```
"""}
end
end