Current section
Files
Jump to
Current section
Files
src/openrouter_client@internal.erl
-module(openrouter_client@internal).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([decode_openrouter_response/1]).
-export_type([openrouter_response/0, choice/0, log_probs/0, message/0, usage/0, openrouter_error/0]).
-type openrouter_response() :: {openrouter_response,
binary(),
binary(),
binary(),
binary(),
integer(),
list(choice()),
usage()}.
-type choice() :: {choice, log_probs(), binary(), integer(), message()}.
-type log_probs() :: {log_probs, list(binary()), list(binary())}.
-type message() :: {message, binary(), binary(), binary()}.
-type usage() :: {usage, integer(), integer(), integer()}.
-type openrouter_error() :: invalid_api_key |
invalid_response |
no_credits_left |
misc |
{http_request_error, binary()} |
empty_response |
{decode_error, gleam@json:decode_error()}.
-file("/home/simon/projects/openrouter_client/src/openrouter_client/internal.gleam", 49).
-spec decode_openrouter_response(binary()) -> {ok, openrouter_response()} |
{error, openrouter_error()}.
decode_openrouter_response(Json_string) ->
Logprobs_decoder = gleam@dynamic:decode2(
fun(Field@0, Field@1) -> {log_probs, Field@0, Field@1} end,
gleam@dynamic:field(
<<"content"/utf8>>,
gleam@dynamic:list(fun gleam@dynamic:string/1)
),
gleam@dynamic:field(
<<"refusal"/utf8>>,
gleam@dynamic:list(fun gleam@dynamic:string/1)
)
),
Message_decoder = gleam@dynamic:decode3(
fun(Field@0, Field@1, Field@2) -> {message, Field@0, Field@1, Field@2} end,
gleam@dynamic:field(<<"role"/utf8>>, fun gleam@dynamic:string/1),
gleam@dynamic:field(<<"content"/utf8>>, fun gleam@dynamic:string/1),
gleam@dynamic:field(<<"refusal"/utf8>>, fun gleam@dynamic:string/1)
),
Choice_decoder = gleam@dynamic:decode4(
fun(Field@0, Field@1, Field@2, Field@3) -> {choice, Field@0, Field@1, Field@2, Field@3} end,
gleam@dynamic:field(<<"logprobs"/utf8>>, Logprobs_decoder),
gleam@dynamic:field(
<<"finish_reason"/utf8>>,
fun gleam@dynamic:string/1
),
gleam@dynamic:field(<<"index"/utf8>>, fun gleam@dynamic:int/1),
gleam@dynamic:field(<<"message"/utf8>>, Message_decoder)
),
Usage_decoder = gleam@dynamic:decode3(
fun(Field@0, Field@1, Field@2) -> {usage, Field@0, Field@1, Field@2} end,
gleam@dynamic:field(<<"prompt_tokens"/utf8>>, fun gleam@dynamic:int/1),
gleam@dynamic:field(
<<"completion_tokens"/utf8>>,
fun gleam@dynamic:int/1
),
gleam@dynamic:field(<<"total_tokens"/utf8>>, fun gleam@dynamic:int/1)
),
Decoder = gleam@dynamic:decode7(
fun(Field@0, Field@1, Field@2, Field@3, Field@4, Field@5, Field@6) -> {openrouter_response, Field@0, Field@1, Field@2, Field@3, Field@4, Field@5, Field@6} end,
gleam@dynamic:field(<<"id"/utf8>>, fun gleam@dynamic:string/1),
gleam@dynamic:field(<<"provider"/utf8>>, fun gleam@dynamic:string/1),
gleam@dynamic:field(<<"model"/utf8>>, fun gleam@dynamic:string/1),
gleam@dynamic:field(<<"object"/utf8>>, fun gleam@dynamic:string/1),
gleam@dynamic:field(<<"created"/utf8>>, fun gleam@dynamic:int/1),
gleam@dynamic:field(
<<"choices"/utf8>>,
gleam@dynamic:list(Choice_decoder)
),
gleam@dynamic:field(<<"usage"/utf8>>, Usage_decoder)
),
_pipe = gleam@json:decode(Json_string, Decoder),
gleam@result:map_error(_pipe, fun(E) -> {decode_error, E} end).