Packages
langchain
0.4.0-rc.3
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