Packages
fnord
0.8.12
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/file/contents.ex
defmodule AI.Tools.File.Contents do
@behaviour AI.Tools
@impl AI.Tools
def is_available?, do: true
@impl AI.Tools
def ui_note_on_request(%{"file" => file, "line_numbers" => true}) do
{"Retrieving file +ln", file}
end
def ui_note_on_request(%{"file" => file}) do
{"Retrieving file -ln", file}
end
@impl AI.Tools
def ui_note_on_result(_args, _result), do: nil
@impl AI.Tools
def read_args(args), do: {:ok, args}
@impl AI.Tools
def spec() do
%{
type: "function",
function: %{
name: "file_contents_tool",
description: """
Display the contents of a file in the project. Note that this retrieves
the ENTIRE file. If the file is large, this may fail due to limits on
the size of messages, or it may pull so much content into your context
window that you forget the user's prompt or begin hallucinating
responses. If you only need to learn specific facts or extract a
section of code, use the file_info_tool to preserve your context
window.
""",
parameters: %{
type: "object",
required: ["file"],
properties: %{
file: %{
type: "string",
description: """
The file whose contents you wish to review. It must be the
complete path provided by the file_search_tool or file_list_tool.
"""
},
line_numbers: %{
type: "boolean",
description: "If true (default), prefix each line with its 1-based line number.",
default: true
}
}
}
}
}
end
@impl AI.Tools
def call(%{"file" => file} = args) do
line_numbers = Map.get(args, "line_numbers", true)
with {:ok, content} <- AI.Tools.get_file_contents(file) do
output =
content
|> maybe_number_lines(line_numbers)
|> wrap_content(file)
{:ok, output}
else
{:error, :enoent} ->
{:error,
"""
The requested file (#{args["file"]}) does not exist.
- If the file name is correct, verify the path using the search or the file listing tool.
- It may have been added since the most recent reindexing of the project.
- If the file is only present in a topic branch that has not yet been merged, it may not be visible to this tool.
"""}
{:error, reason} ->
{:error, reason}
end
end
defp wrap_content(text, file) do
"""
[file_contents_tool] Contents of #{file}:
```
#{text}
```
"""
end
defp maybe_number_lines(text, true), do: Util.numbered_lines(text, "\t")
defp maybe_number_lines(text, _), do: text
end