-module(glopenai@container). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/glopenai/container.gleam"). -export([memory_limit_to_json/1, memory_limit_decoder/0, container_expires_after_anchor_to_json/1, container_expires_after_anchor_decoder/0, container_expires_after_to_json/1, container_expires_after_decoder/0, container_resource_decoder/0, container_file_resource_decoder/0, new_create_request/1, with_file_ids/2, with_expires_after/2, with_memory_limit/2, create_container_request_to_json/1, empty_list_containers_query/0, empty_list_container_files_query/0, create_request/2, create_response/1, list_request/1, list_request_with_query/2, list_response/1, retrieve_request/2, retrieve_response/1, delete_request/2, delete_response/1, file_create_request/4, file_create_response/1, file_list_request/2, file_list_request_with_query/3, file_list_response/1, file_retrieve_request/3, file_retrieve_response/1, file_delete_request/3, file_delete_response/1, file_content_request/3, file_content_response/1]). -export_type([memory_limit/0, container_expires_after_anchor/0, container_expires_after/0, container_resource/0, container_list_resource/0, delete_container_response/0, container_file_resource/0, container_file_list_resource/0, delete_container_file_response/0, create_container_request/0, container_file_upload/0, list_order/0, list_containers_query/0, list_container_files_query/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 memory_limit() :: one_gigabyte | four_gigabytes | sixteen_gigabytes | sixty_four_gigabytes. -type container_expires_after_anchor() :: last_active_at. -type container_expires_after() :: {container_expires_after, container_expires_after_anchor(), integer()}. -type container_resource() :: {container_resource, binary(), binary(), binary(), integer(), binary(), gleam@option:option(container_expires_after()), gleam@option:option(integer()), memory_limit()}. -type container_list_resource() :: {container_list_resource, binary(), list(container_resource()), gleam@option:option(binary()), gleam@option:option(binary()), boolean()}. -type delete_container_response() :: {delete_container_response, binary(), binary(), boolean()}. -type container_file_resource() :: {container_file_resource, binary(), binary(), binary(), integer(), integer(), binary(), binary()}. -type container_file_list_resource() :: {container_file_list_resource, binary(), list(container_file_resource()), gleam@option:option(binary()), gleam@option:option(binary()), boolean()}. -type delete_container_file_response() :: {delete_container_file_response, binary(), binary(), boolean()}. -type create_container_request() :: {create_container_request, binary(), gleam@option:option(list(binary())), gleam@option:option(container_expires_after()), gleam@option:option(memory_limit())}. -type container_file_upload() :: {upload_bytes, binary(), binary(), bitstring()} | {upload_by_file_id, binary()}. -type list_order() :: asc | desc. -type list_containers_query() :: {list_containers_query, gleam@option:option(integer()), gleam@option:option(list_order()), gleam@option:option(binary())}. -type list_container_files_query() :: {list_container_files_query, gleam@option:option(integer()), gleam@option:option(list_order()), gleam@option:option(binary())}. -file("src/glopenai/container.gleam", 45). -spec memory_limit_to_json(memory_limit()) -> gleam@json:json(). memory_limit_to_json(Limit) -> gleam@json:string(case Limit of one_gigabyte -> <<"1g"/utf8>>; four_gigabytes -> <<"4g"/utf8>>; sixteen_gigabytes -> <<"16g"/utf8>>; sixty_four_gigabytes -> <<"64g"/utf8>> end). -file("src/glopenai/container.gleam", 54). -spec memory_limit_decoder() -> gleam@dynamic@decode:decoder(memory_limit()). memory_limit_decoder() -> gleam@dynamic@decode:then( {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Value) -> case Value of <<"1g"/utf8>> -> gleam@dynamic@decode:success(one_gigabyte); <<"4g"/utf8>> -> gleam@dynamic@decode:success(four_gigabytes); <<"16g"/utf8>> -> gleam@dynamic@decode:success(sixteen_gigabytes); <<"64g"/utf8>> -> gleam@dynamic@decode:success(sixty_four_gigabytes); _ -> gleam@dynamic@decode:failure( one_gigabyte, <<"MemoryLimit"/utf8>> ) end end ). -file("src/glopenai/container.gleam", 72). -spec container_expires_after_anchor_to_json(container_expires_after_anchor()) -> gleam@json:json(). container_expires_after_anchor_to_json(Anchor) -> gleam@json:string(case Anchor of last_active_at -> <<"last_active_at"/utf8>> end). -file("src/glopenai/container.gleam", 80). -spec container_expires_after_anchor_decoder() -> gleam@dynamic@decode:decoder(container_expires_after_anchor()). container_expires_after_anchor_decoder() -> gleam@dynamic@decode:then( {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Value) -> case Value of <<"last_active_at"/utf8>> -> gleam@dynamic@decode:success(last_active_at); _ -> gleam@dynamic@decode:failure( last_active_at, <<"ContainerExpiresAfterAnchor"/utf8>> ) end end ). -file("src/glopenai/container.gleam", 95). -spec container_expires_after_to_json(container_expires_after()) -> gleam@json:json(). container_expires_after_to_json(Expires) -> gleam@json:object( [{<<"anchor"/utf8>>, container_expires_after_anchor_to_json( erlang:element(2, Expires) )}, {<<"minutes"/utf8>>, gleam@json:int(erlang:element(3, Expires))}] ). -file("src/glopenai/container.gleam", 104). -spec container_expires_after_decoder() -> gleam@dynamic@decode:decoder(container_expires_after()). container_expires_after_decoder() -> gleam@dynamic@decode:field( <<"anchor"/utf8>>, container_expires_after_anchor_decoder(), fun(Anchor) -> gleam@dynamic@decode:field( <<"minutes"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_int/1}, fun(Minutes) -> gleam@dynamic@decode:success( {container_expires_after, Anchor, Minutes} ) end ) end ). -file("src/glopenai/container.gleam", 128). -spec container_resource_decoder() -> gleam@dynamic@decode:decoder(container_resource()). container_resource_decoder() -> gleam@dynamic@decode:field( <<"id"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Id) -> gleam@dynamic@decode:field( <<"object"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Object) -> gleam@dynamic@decode:field( <<"name"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Name) -> gleam@dynamic@decode:field( <<"created_at"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_int/1}, fun(Created_at) -> gleam@dynamic@decode:field( <<"status"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Status) -> gleam@dynamic@decode:optional_field( <<"expires_after"/utf8>>, none, gleam@dynamic@decode:optional( container_expires_after_decoder( ) ), fun(Expires_after) -> gleam@dynamic@decode:optional_field( <<"last_active_at"/utf8>>, none, gleam@dynamic@decode:optional( {decoder, fun gleam@dynamic@decode:decode_int/1} ), fun(Last_active_at) -> gleam@dynamic@decode:field( <<"memory_limit"/utf8>>, memory_limit_decoder( ), fun( Memory_limit ) -> gleam@dynamic@decode:success( {container_resource, Id, Object, Name, Created_at, Status, Expires_after, Last_active_at, Memory_limit} ) end ) end ) end ) end ) end ) end ) end ) end ). -file("src/glopenai/container.gleam", 168). -spec container_list_resource_decoder() -> gleam@dynamic@decode:decoder(container_list_resource()). container_list_resource_decoder() -> gleam@dynamic@decode:field( <<"object"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Object) -> gleam@dynamic@decode:field( <<"data"/utf8>>, gleam@dynamic@decode:list(container_resource_decoder()), fun(Data) -> gleam@dynamic@decode:optional_field( <<"first_id"/utf8>>, none, gleam@dynamic@decode:optional( {decoder, fun gleam@dynamic@decode:decode_string/1} ), fun(First_id) -> gleam@dynamic@decode:optional_field( <<"last_id"/utf8>>, none, gleam@dynamic@decode:optional( {decoder, fun gleam@dynamic@decode:decode_string/1} ), fun(Last_id) -> gleam@dynamic@decode:field( <<"has_more"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_bool/1}, fun(Has_more) -> gleam@dynamic@decode:success( {container_list_resource, Object, Data, First_id, Last_id, Has_more} ) end ) end ) end ) end ) end ). -file("src/glopenai/container.gleam", 195). -spec delete_container_response_decoder() -> gleam@dynamic@decode:decoder(delete_container_response()). delete_container_response_decoder() -> gleam@dynamic@decode:field( <<"id"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Id) -> gleam@dynamic@decode:field( <<"object"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Object) -> gleam@dynamic@decode:field( <<"deleted"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_bool/1}, fun(Deleted) -> gleam@dynamic@decode:success( {delete_container_response, Id, Object, Deleted} ) end ) end ) end ). -file("src/glopenai/container.gleam", 222). -spec container_file_resource_decoder() -> gleam@dynamic@decode:decoder(container_file_resource()). container_file_resource_decoder() -> gleam@dynamic@decode:field( <<"id"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Id) -> gleam@dynamic@decode:field( <<"object"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Object) -> gleam@dynamic@decode:field( <<"container_id"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Container_id) -> gleam@dynamic@decode:field( <<"created_at"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_int/1}, fun(Created_at) -> gleam@dynamic@decode:field( <<"bytes"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_int/1}, fun(Bytes) -> gleam@dynamic@decode:field( <<"path"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Path) -> gleam@dynamic@decode:field( <<"source"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Source) -> gleam@dynamic@decode:success( {container_file_resource, Id, Object, Container_id, Created_at, Bytes, Path, Source} ) end ) end ) end ) end ) end ) end ) end ). -file("src/glopenai/container.gleam", 253). -spec container_file_list_resource_decoder() -> gleam@dynamic@decode:decoder(container_file_list_resource()). container_file_list_resource_decoder() -> gleam@dynamic@decode:field( <<"object"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Object) -> gleam@dynamic@decode:field( <<"data"/utf8>>, gleam@dynamic@decode:list(container_file_resource_decoder()), fun(Data) -> gleam@dynamic@decode:optional_field( <<"first_id"/utf8>>, none, gleam@dynamic@decode:optional( {decoder, fun gleam@dynamic@decode:decode_string/1} ), fun(First_id) -> gleam@dynamic@decode:optional_field( <<"last_id"/utf8>>, none, gleam@dynamic@decode:optional( {decoder, fun gleam@dynamic@decode:decode_string/1} ), fun(Last_id) -> gleam@dynamic@decode:field( <<"has_more"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_bool/1}, fun(Has_more) -> gleam@dynamic@decode:success( {container_file_list_resource, Object, Data, First_id, Last_id, Has_more} ) end ) end ) end ) end ) end ). -file("src/glopenai/container.gleam", 285). -spec delete_container_file_response_decoder() -> gleam@dynamic@decode:decoder(delete_container_file_response()). delete_container_file_response_decoder() -> gleam@dynamic@decode:field( <<"id"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Id) -> gleam@dynamic@decode:field( <<"object"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Object) -> gleam@dynamic@decode:field( <<"deleted"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_bool/1}, fun(Deleted) -> gleam@dynamic@decode:success( {delete_container_file_response, Id, Object, Deleted} ) end ) end ) end ). -file("src/glopenai/container.gleam", 313). -spec new_create_request(binary()) -> create_container_request(). new_create_request(Name) -> {create_container_request, Name, none, none, none}. -file("src/glopenai/container.gleam", 322). -spec with_file_ids(create_container_request(), list(binary())) -> create_container_request(). with_file_ids(Request, File_ids) -> {create_container_request, erlang:element(2, Request), {some, File_ids}, erlang:element(4, Request), erlang:element(5, Request)}. -file("src/glopenai/container.gleam", 329). -spec with_expires_after(create_container_request(), container_expires_after()) -> create_container_request(). with_expires_after(Request, Expires_after) -> {create_container_request, erlang:element(2, Request), erlang:element(3, Request), {some, Expires_after}, erlang:element(5, Request)}. -file("src/glopenai/container.gleam", 336). -spec with_memory_limit(create_container_request(), memory_limit()) -> create_container_request(). with_memory_limit(Request, Memory_limit) -> {create_container_request, erlang:element(2, Request), erlang:element(3, Request), erlang:element(4, Request), {some, Memory_limit}}. -file("src/glopenai/container.gleam", 343). -spec create_container_request_to_json(create_container_request()) -> gleam@json:json(). create_container_request_to_json(Request) -> glopenai@internal@codec:object_with_optional( [{<<"name"/utf8>>, gleam@json:string(erlang:element(2, Request))}], [glopenai@internal@codec:optional_field( <<"file_ids"/utf8>>, erlang:element(3, Request), fun(Ids) -> gleam@json:array(Ids, fun gleam@json:string/1) end ), glopenai@internal@codec:optional_field( <<"expires_after"/utf8>>, erlang:element(4, Request), fun container_expires_after_to_json/1 ), glopenai@internal@codec:optional_field( <<"memory_limit"/utf8>>, erlang:element(5, Request), fun memory_limit_to_json/1 )] ). -file("src/glopenai/container.gleam", 388). -spec order_to_string(list_order()) -> binary(). order_to_string(Order) -> case Order of asc -> <<"asc"/utf8>>; desc -> <<"desc"/utf8>> end. -file("src/glopenai/container.gleam", 403). -spec empty_list_containers_query() -> list_containers_query(). empty_list_containers_query() -> {list_containers_query, none, none, none}. -file("src/glopenai/container.gleam", 425). -spec empty_list_container_files_query() -> list_container_files_query(). empty_list_container_files_query() -> {list_container_files_query, none, none, none}. -file("src/glopenai/container.gleam", 439). -spec optional_string_pair( binary(), gleam@option:option(IFS), fun((IFS) -> binary()) ) -> list({binary(), binary()}). optional_string_pair(Key, Value, Encode) -> case Value of {some, V} -> [{Key, Encode(V)}]; none -> [] end. -file("src/glopenai/container.gleam", 407). -spec list_containers_query_pairs(list_containers_query()) -> list({binary(), binary()}). list_containers_query_pairs(Query) -> lists:append( [optional_string_pair( <<"limit"/utf8>>, erlang:element(2, Query), fun erlang:integer_to_binary/1 ), optional_string_pair( <<"order"/utf8>>, erlang:element(3, Query), fun order_to_string/1 ), optional_string_pair( <<"after"/utf8>>, erlang:element(4, Query), fun(S) -> S end )] ). -file("src/glopenai/container.gleam", 429). -spec list_container_files_query_pairs(list_container_files_query()) -> list({binary(), binary()}). list_container_files_query_pairs(Query) -> lists:append( [optional_string_pair( <<"limit"/utf8>>, erlang:element(2, Query), fun erlang:integer_to_binary/1 ), optional_string_pair( <<"order"/utf8>>, erlang:element(3, Query), fun order_to_string/1 ), optional_string_pair( <<"after"/utf8>>, erlang:element(4, Query), fun(S) -> S end )] ). -file("src/glopenai/container.gleam", 454). -spec create_request(glopenai@config:config(), create_container_request()) -> gleam@http@request:request(binary()). create_request(Config, Request) -> glopenai@internal:post_request( Config, <<"/containers"/utf8>>, create_container_request_to_json(Request) ). -file("src/glopenai/container.gleam", 465). -spec create_response(gleam@http@response:response(binary())) -> {ok, container_resource()} | {error, glopenai@error:glopenai_error()}. create_response(Response) -> glopenai@internal:parse_response(Response, container_resource_decoder()). -file("src/glopenai/container.gleam", 471). -spec list_request(glopenai@config:config()) -> gleam@http@request:request(binary()). list_request(Config) -> glopenai@internal:get_request(Config, <<"/containers"/utf8>>). -file("src/glopenai/container.gleam", 475). -spec list_request_with_query(glopenai@config:config(), list_containers_query()) -> gleam@http@request:request(binary()). list_request_with_query(Config, Query) -> _pipe = glopenai@internal:get_request(Config, <<"/containers"/utf8>>), gleam@http@request:set_query(_pipe, list_containers_query_pairs(Query)). -file("src/glopenai/container.gleam", 483). -spec list_response(gleam@http@response:response(binary())) -> {ok, container_list_resource()} | {error, glopenai@error:glopenai_error()}. list_response(Response) -> glopenai@internal:parse_response( Response, container_list_resource_decoder() ). -file("src/glopenai/container.gleam", 489). -spec retrieve_request(glopenai@config:config(), binary()) -> gleam@http@request:request(binary()). retrieve_request(Config, Container_id) -> glopenai@internal:get_request( Config, <<"/containers/"/utf8, Container_id/binary>> ). -file("src/glopenai/container.gleam", 493). -spec retrieve_response(gleam@http@response:response(binary())) -> {ok, container_resource()} | {error, glopenai@error:glopenai_error()}. retrieve_response(Response) -> glopenai@internal:parse_response(Response, container_resource_decoder()). -file("src/glopenai/container.gleam", 499). -spec delete_request(glopenai@config:config(), binary()) -> gleam@http@request:request(binary()). delete_request(Config, Container_id) -> glopenai@internal:delete_request( Config, <<"/containers/"/utf8, Container_id/binary>> ). -file("src/glopenai/container.gleam", 503). -spec delete_response(gleam@http@response:response(binary())) -> {ok, delete_container_response()} | {error, glopenai@error:glopenai_error()}. delete_response(Response) -> glopenai@internal:parse_response( Response, delete_container_response_decoder() ). -file("src/glopenai/container.gleam", 518). ?DOC( " Build a multipart `POST /containers/{container_id}/files` request.\n" "\n" " When uploading raw bytes, the caller supplies `boundary` explicitly — it\n" " must not appear inside `data`. The `file_id` variant still goes through\n" " multipart (matching the Rust client) but carries only a single text field.\n" ). -spec file_create_request( glopenai@config:config(), binary(), container_file_upload(), binary() ) -> gleam@http@request:request(bitstring()). file_create_request(Config, Container_id, Upload, Boundary) -> Parts = case Upload of {upload_bytes, Filename, Content_type, Data} -> [{file_part, <<"file"/utf8>>, Filename, Content_type, Data}]; {upload_by_file_id, File_id} -> [{field_part, <<"file_id"/utf8>>, File_id}] end, glopenai@internal:multipart_request( Config, post, <<<<"/containers/"/utf8, Container_id/binary>>/binary, "/files"/utf8>>, Parts, Boundary ). -file("src/glopenai/container.gleam", 546). -spec file_create_response(gleam@http@response:response(binary())) -> {ok, container_file_resource()} | {error, glopenai@error:glopenai_error()}. file_create_response(Response) -> glopenai@internal:parse_response( Response, container_file_resource_decoder() ). -file("src/glopenai/container.gleam", 552). -spec file_list_request(glopenai@config:config(), binary()) -> gleam@http@request:request(binary()). file_list_request(Config, Container_id) -> glopenai@internal:get_request( Config, <<<<"/containers/"/utf8, Container_id/binary>>/binary, "/files"/utf8>> ). -file("src/glopenai/container.gleam", 559). -spec file_list_request_with_query( glopenai@config:config(), binary(), list_container_files_query() ) -> gleam@http@request:request(binary()). file_list_request_with_query(Config, Container_id, Query) -> _pipe = glopenai@internal:get_request( Config, <<<<"/containers/"/utf8, Container_id/binary>>/binary, "/files"/utf8>> ), gleam@http@request:set_query(_pipe, list_container_files_query_pairs(Query)). -file("src/glopenai/container.gleam", 568). -spec file_list_response(gleam@http@response:response(binary())) -> {ok, container_file_list_resource()} | {error, glopenai@error:glopenai_error()}. file_list_response(Response) -> glopenai@internal:parse_response( Response, container_file_list_resource_decoder() ). -file("src/glopenai/container.gleam", 574). -spec file_retrieve_request(glopenai@config:config(), binary(), binary()) -> gleam@http@request:request(binary()). file_retrieve_request(Config, Container_id, File_id) -> glopenai@internal:get_request( Config, <<<<<<"/containers/"/utf8, Container_id/binary>>/binary, "/files/"/utf8>>/binary, File_id/binary>> ). -file("src/glopenai/container.gleam", 585). -spec file_retrieve_response(gleam@http@response:response(binary())) -> {ok, container_file_resource()} | {error, glopenai@error:glopenai_error()}. file_retrieve_response(Response) -> glopenai@internal:parse_response( Response, container_file_resource_decoder() ). -file("src/glopenai/container.gleam", 591). -spec file_delete_request(glopenai@config:config(), binary(), binary()) -> gleam@http@request:request(binary()). file_delete_request(Config, Container_id, File_id) -> glopenai@internal:delete_request( Config, <<<<<<"/containers/"/utf8, Container_id/binary>>/binary, "/files/"/utf8>>/binary, File_id/binary>> ). -file("src/glopenai/container.gleam", 602). -spec file_delete_response(gleam@http@response:response(binary())) -> {ok, delete_container_file_response()} | {error, glopenai@error:glopenai_error()}. file_delete_response(Response) -> glopenai@internal:parse_response( Response, delete_container_file_response_decoder() ). -file("src/glopenai/container.gleam", 611). ?DOC( " Build a request for the raw file content. The body is returned as bytes\n" " (typed as `String` to keep the sans-IO signature uniform; clients that\n" " need strict binary handling should use `httpc.send_bits` and decode).\n" ). -spec file_content_request(glopenai@config:config(), binary(), binary()) -> gleam@http@request:request(binary()). file_content_request(Config, Container_id, File_id) -> glopenai@internal:get_request( Config, <<<<<<<<"/containers/"/utf8, Container_id/binary>>/binary, "/files/"/utf8>>/binary, File_id/binary>>/binary, "/content"/utf8>> ). -file("src/glopenai/container.gleam", 625). ?DOC( " Parse a file-content response. On 2xx returns the raw body string.\n" " On non-2xx attempts to decode an API error, falling back to\n" " `UnexpectedResponse`.\n" ). -spec file_content_response(gleam@http@response:response(binary())) -> {ok, binary()} | {error, glopenai@error:glopenai_error()}. file_content_response(Response) -> case (erlang:element(2, Response) >= 200) andalso (erlang:element( 2, Response ) < 300) of true -> {ok, erlang:element(4, Response)}; false -> case gleam@json:parse( erlang:element(4, Response), glopenai@error:wrapped_error_decoder() ) of {ok, Api_error} -> {error, {api_response_error, erlang:element(2, Response), Api_error}}; {error, _} -> {error, {unexpected_response, erlang:element(2, Response), erlang:element(4, Response)}} end end.