Packages
langchain
0.8.4
0.9.2
0.9.1
0.9.0
0.8.14
0.8.13
0.8.12
0.8.11
0.8.10
0.8.9
0.8.8
0.8.7
0.8.6
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.0
0.6.3
0.6.2
0.6.1
0.6.0
0.5.2
0.5.1
0.5.0
0.4.1
0.4.0
0.4.0-rc.3
0.4.0-rc.2
0.4.0-rc.1
0.4.0-rc.0
0.3.3
0.3.2
0.3.1
0.3.0
0.3.0-rc.2
0.3.0-rc.1
0.3.0-rc.0
0.2.0
0.1.10
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
Elixir implementation of a LangChain style framework that lets Elixir projects integrate with and leverage LLMs.
Current section
Files
Jump to
Current section
Files
lib/utils/parser/llama3_2_custom_tool_parser.ex
if Code.ensure_loaded?(NimbleParsec) do
defmodule LangChain.Utils.Parser.LLAMA_3_2_CustomToolParser do
import NimbleParsec
# Basic components
whitespace = ascii_char([?\s, ?\t]) |> ignore()
optional_whitespace = whitespace |> repeat() |> ignore()
# Function name parser
function_name =
ascii_string([?a..?z, ?A..?Z, ?_], 1)
|> concat(ascii_string([?a..?z, ?A..?Z, ?0..?9, ?_], min: 0))
|> reduce({Enum, :join, []})
|> unwrap_and_tag(:function_name)
# Parameter value parsers
quoted_string =
ignore(ascii_char([?', ?"]))
|> ascii_string([not: ?\", not: ?'], min: 0)
|> ignore(ascii_char([?', ?"]))
number = integer(min: 1)
param_value = choice([quoted_string, number])
# Parameter key-value pair
param_pair =
optional_whitespace
|> ascii_string([?a..?z, ?A..?Z, ?_], min: 1)
|> ignore(string("="))
|> concat(param_value)
|> tag(:param)
# Parameters list
parameters =
param_pair
|> repeat(ignore(string(",")) |> concat(param_pair))
|> wrap()
|> unwrap_and_tag(:parameters)
parse_function_call =
function_name
|> ignore(string("("))
|> optional(parameters)
|> ignore(string(")"))
|> wrap()
|> unwrap_and_tag(:function_call)
# Complete function call parser
defparsec(
:parse_function_calls,
ignore(string("["))
|> optional(parse_function_call)
|> repeat(ignore(string(",")) |> concat(parse_function_call))
|> ignore(string("]"))
|> eos()
)
defp map_params(function_call) do
function_call
|> Keyword.get(:parameters, [])
|> Enum.map(fn {:param, [key, value]} -> {key, value} end)
|> Map.new()
end
defp map_function({:function_call, function_call}) do
%{
function_name: Keyword.get(function_call, :function_name),
parameters: map_params(function_call)
}
end
def parse(input) when is_binary(input) do
case parse_function_calls(input) do
{:ok, result, "", _, _, _} ->
{:ok, Enum.map(result, &map_function/1)}
{:error, reason, _, _, _, _} ->
{:error, reason}
end
end
end
end