-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, <>); [_ | 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, []).