-module(gloq). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]). -export([default_groq_request/0, new_groq_request/0, with_key/2, with_user/2, with_context/2, with_model/2, with_frequency_penalty/2, with_logprobs/2, with_max_tokens/2, with_n/2, with_parallel_tool_calls/2, with_presence_penalty/2, with_seed/2, with_stop/2, with_stream/2, with_temperature/2, with_top_p/2, build/1, send/1, view_models/1]). -export_type([groq_request_builder/0]). -type groq_request_builder() :: {groq_request_builder, binary(), binary(), binary(), binary(), gleam@option:option(float()), gleam@option:option(boolean()), gleam@option:option(integer()), gleam@option:option(integer()), gleam@option:option(boolean()), gleam@option:option(float()), gleam@option:option(integer()), gleam@option:option(binary()), gleam@option:option(boolean()), gleam@option:option(float()), gleam@option:option(float())}. -spec default_groq_request() -> groq_request_builder(). default_groq_request() -> {groq_request_builder, <<""/utf8>>, <<"user"/utf8>>, <<""/utf8>>, <<"llama3-8b-8192"/utf8>>, {some, +0.0}, {some, false}, none, {some, 1}, {some, true}, {some, +0.0}, none, none, {some, false}, {some, 1.0}, {some, 1.0}}. -spec new_groq_request() -> groq_request_builder(). new_groq_request() -> erlang:setelement( 5, erlang:setelement( 4, erlang:setelement( 3, erlang:setelement(2, default_groq_request(), <<""/utf8>>), <<""/utf8>> ), <<""/utf8>> ), <<""/utf8>> ). -spec with_key(groq_request_builder(), binary()) -> groq_request_builder(). with_key(Builder, Key) -> erlang:setelement(2, Builder, Key). -spec with_user(groq_request_builder(), binary()) -> groq_request_builder(). with_user(Builder, User) -> erlang:setelement(3, Builder, User). -spec with_context(groq_request_builder(), binary()) -> groq_request_builder(). with_context(Builder, Context) -> erlang:setelement(4, Builder, Context). -spec with_model(groq_request_builder(), binary()) -> groq_request_builder(). with_model(Builder, Model) -> erlang:setelement(5, Builder, Model). -spec with_frequency_penalty(groq_request_builder(), float()) -> groq_request_builder(). with_frequency_penalty(Builder, Frequency_penalty) -> erlang:setelement(6, Builder, {some, Frequency_penalty}). -spec with_logprobs(groq_request_builder(), boolean()) -> groq_request_builder(). with_logprobs(Builder, Logprobs) -> erlang:setelement(7, Builder, {some, Logprobs}). -spec with_max_tokens(groq_request_builder(), integer()) -> groq_request_builder(). with_max_tokens(Builder, Max_tokens) -> erlang:setelement(8, Builder, {some, Max_tokens}). -spec with_n(groq_request_builder(), integer()) -> groq_request_builder(). with_n(Builder, N) -> erlang:setelement(9, Builder, {some, N}). -spec with_parallel_tool_calls(groq_request_builder(), boolean()) -> groq_request_builder(). with_parallel_tool_calls(Builder, Parallel_tool_calls) -> erlang:setelement(10, Builder, {some, Parallel_tool_calls}). -spec with_presence_penalty(groq_request_builder(), float()) -> groq_request_builder(). with_presence_penalty(Builder, Presence_penalty) -> erlang:setelement(11, Builder, {some, Presence_penalty}). -spec with_seed(groq_request_builder(), integer()) -> groq_request_builder(). with_seed(Builder, Seed) -> erlang:setelement(12, Builder, {some, Seed}). -spec with_stop(groq_request_builder(), binary()) -> groq_request_builder(). with_stop(Builder, Stop) -> erlang:setelement(13, Builder, {some, Stop}). -spec with_stream(groq_request_builder(), boolean()) -> groq_request_builder(). with_stream(Builder, Stream) -> erlang:setelement(14, Builder, {some, Stream}). -spec with_temperature(groq_request_builder(), float()) -> groq_request_builder(). with_temperature(Builder, Temperature) -> erlang:setelement(15, Builder, {some, Temperature}). -spec with_top_p(groq_request_builder(), float()) -> groq_request_builder(). with_top_p(Builder, Top_p) -> erlang:setelement(16, Builder, {some, Top_p}). -spec build(groq_request_builder()) -> gleam@http@request:request(binary()). build(Builder) -> Body = gleam@json:object( [{<<"messages"/utf8>>, gleam@json:array( [gleam@json:object( [{<<"role"/utf8>>, gleam@json:string( erlang:element(3, Builder) )}, {<<"content"/utf8>>, gleam@json:string( erlang:element(4, Builder) )}] )], fun(X) -> X end )}, {<<"model"/utf8>>, gleam@json:string(erlang:element(5, Builder))}, {<<"frequency_penalty"/utf8>>, gleam@json:float( gleam@option:unwrap(erlang:element(6, Builder), +0.0) )}, {<<"logprobs"/utf8>>, gleam@json:bool( gleam@option:unwrap(erlang:element(7, Builder), false) )}, {<<"max_tokens"/utf8>>, gleam@json:int( gleam@option:unwrap(erlang:element(8, Builder), 8192) )}, {<<"n"/utf8>>, gleam@json:int( gleam@option:unwrap(erlang:element(9, Builder), 1) )}, {<<"parallel_tool_calls"/utf8>>, gleam@json:bool( gleam@option:unwrap(erlang:element(10, Builder), true) )}, {<<"presence_penalty"/utf8>>, gleam@json:float( gleam@option:unwrap(erlang:element(11, Builder), +0.0) )}, {<<"seed"/utf8>>, gleam@json:int( gleam@option:unwrap(erlang:element(12, Builder), 0) )}, {<<"stop"/utf8>>, gleam@json:string( gleam@option:unwrap( erlang:element(13, Builder), <<""/utf8>> ) )}, {<<"stream"/utf8>>, gleam@json:bool( gleam@option:unwrap(erlang:element(14, Builder), false) )}, {<<"temperature"/utf8>>, gleam@json:float( gleam@option:unwrap(erlang:element(15, Builder), 1.0) )}, {<<"top_p"/utf8>>, gleam@json:float( gleam@option:unwrap(erlang:element(16, Builder), 1.0) )}] ), _pipe = gleam@http@request:new(), _pipe@1 = gleam@http@request:set_method(_pipe, post), _pipe@2 = gleam@http@request:set_host(_pipe@1, <<"api.groq.com"/utf8>>), _pipe@3 = gleam@http@request:set_path( _pipe@2, <<"/openai/v1/chat/completions"/utf8>> ), _pipe@4 = gleam@http@request:set_header( _pipe@3, <<"Authorization"/utf8>>, <<"Bearer "/utf8, (erlang:element(2, Builder))/binary>> ), _pipe@5 = gleam@http@request:set_header( _pipe@4, <<"Content-Type"/utf8>>, <<"application/json"/utf8>> ), gleam@http@request:set_body(_pipe@5, gleam@json:to_string(Body)). -spec send(groq_request_builder()) -> binary(). send(Builder) -> Req = build(Builder), Res = gleam@hackney:send(Req), case Res of {ok, R} -> erlang:element(4, R); {error, _} -> <<"Error, Request Failed"/utf8>> end. -spec view_models(binary()) -> gleam@http@request:request(binary()). view_models(Api_key) -> Request = begin _pipe = gleam@http@request:new(), _pipe@1 = gleam@http@request:set_method(_pipe, get), _pipe@2 = gleam@http@request:set_host(_pipe@1, <<"api.groq.com"/utf8>>), _pipe@3 = gleam@http@request:set_path( _pipe@2, <<"/openai/v1/models"/utf8>> ), _pipe@4 = gleam@http@request:set_header( _pipe@3, <<"Authorization"/utf8>>, <<"Bearer "/utf8, Api_key/binary>> ), gleam@http@request:set_header( _pipe@4, <<"Content-Type"/utf8>>, <<"application/json"/utf8>> ) end, Request.