Current section
Files
Jump to
Current section
Files
src/glean@provider.erl
-module(glean@provider).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/glean/provider.gleam").
-export([default_settings/0, result_text/1, result_tool_calls/1]).
-export_type([provider/0, generate_request/0, generate_result/0, generated_content/0, model_settings/0, tool_spec/0, tool_choice/0, response_format/0]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
-type provider() :: {provider,
binary(),
binary(),
fun((generate_request()) -> {ok, generate_result()} |
{error, glean@error:glean_error()}),
fun((generate_request(), fun((glean@stream:stream_event()) -> nil)) -> {ok,
generate_result()} |
{error, glean@error:glean_error()})}.
-type generate_request() :: {generate_request,
list(glean@message:message()),
model_settings(),
list(tool_spec()),
tool_choice(),
response_format()}.
-type generate_result() :: {generate_result,
list(generated_content()),
glean@error:finish_reason(),
glean@stream:usage(),
binary()}.
-type generated_content() :: {generated_text, binary()} |
{generated_reasoning, binary()} |
{generated_tool_call, binary(), binary(), binary()}.
-type model_settings() :: {model_settings,
gleam@option:option(integer()),
gleam@option:option(float()),
gleam@option:option(float()),
gleam@option:option(integer()),
gleam@option:option(list(binary())),
gleam@option:option(integer()),
gleam@option:option(float()),
gleam@option:option(float())}.
-type tool_spec() :: {tool_spec, binary(), binary(), glean@schema:schema()}.
-type tool_choice() :: auto | required | no_tools | {specific_tool, binary()}.
-type response_format() :: text_format |
{json_format,
gleam@option:option(glean@schema:schema()),
gleam@option:option(binary())}.
-file("src/glean/provider.gleam", 96).
?DOC(" Default model settings (all None — provider uses its defaults).\n").
-spec default_settings() -> model_settings().
default_settings() ->
{model_settings, none, none, none, none, none, none, none, none}.
-file("src/glean/provider.gleam", 115).
-spec collect_text_content(list(generated_content()), binary()) -> binary().
collect_text_content(Content, Acc) ->
case Content of
[] ->
Acc;
[{generated_text, Text} | Rest] ->
collect_text_content(Rest, <<Acc/binary, Text/binary>>);
[_ | Rest@1] ->
collect_text_content(Rest@1, Acc)
end.
-file("src/glean/provider.gleam", 110).
?DOC(" Extract all text content from a generate result.\n").
-spec result_text(generate_result()) -> binary().
result_text(Result) ->
_pipe = erlang:element(2, Result),
collect_text_content(_pipe, <<""/utf8>>).
-file("src/glean/provider.gleam", 131).
-spec collect_tool_call_content(
list(generated_content()),
list({binary(), binary(), binary()})
) -> list({binary(), binary(), binary()}).
collect_tool_call_content(Content, Acc) ->
case Content of
[] ->
lists:reverse(Acc);
[{generated_tool_call, Id, Name, Args} | Rest] ->
collect_tool_call_content(Rest, [{Id, Name, Args} | Acc]);
[_ | Rest@1] ->
collect_tool_call_content(Rest@1, Acc)
end.
-file("src/glean/provider.gleam", 124).
?DOC(" Extract tool calls from generated content.\n").
-spec result_tool_calls(generate_result()) -> list({binary(),
binary(),
binary()}).
result_tool_calls(Result) ->
_pipe = erlang:element(2, Result),
collect_tool_call_content(_pipe, []).