Current section
Files
Jump to
Current section
Files
src/gloq.erl
-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.