Packages

A Gleam framework for building AI agents — type-safe, multi-provider, with tool calling, streaming, and simulation testing

Current section

Files

Jump to
glean src glean@providers@sse.erl
Raw

src/glean@providers@sse.erl

-module(glean@providers@sse).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/glean/providers/sse.gleam").
-export([start_stream/4]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
?MODULEDOC(false).
-file("src/glean/providers/sse.gleam", 53).
?DOC(false).
-spec apply_headers(
gleam@http@request:request(binary()),
list({binary(), binary()})
) -> gleam@http@request:request(binary()).
apply_headers(Req, Headers) ->
gleam@list:fold(
Headers,
Req,
fun(R, H) ->
gleam@http@request:set_header(
R,
erlang:element(1, H),
erlang:element(2, H)
)
end
).
-file("src/glean/providers/sse.gleam", 22).
?DOC(false).
-spec start_stream(binary(), list({binary(), binary()}), binary(), integer()) -> {ok,
{gleam@erlang@process:subject(httpp@sse:s_s_e_event()),
gleam@erlang@process:subject(httpp@sse:s_s_e_manager_message())}} |
{error, binary()}.
start_stream(Url, Headers, Body, Timeout_ms) ->
Req_result = gleam@http@request:to(Url),
case Req_result of
{error, _} ->
{error, <<"Invalid URL: "/utf8, Url/binary>>};
{ok, Req} ->
Req@1 = begin
_pipe = Req,
_pipe@1 = gleam@http@request:set_method(_pipe, post),
_pipe@2 = gleam@http@request:set_header(
_pipe@1,
<<"content-type"/utf8>>,
<<"application/json"/utf8>>
),
_pipe@3 = apply_headers(_pipe@2, Headers),
gleam@http@request:map(
_pipe@3,
fun(_) -> gleam_stdlib:wrap_list(Body) end
)
end,
Subject = gleam@erlang@process:new_subject(),
case httpp@sse:event_source(Req@1, Timeout_ms, Subject) of
{error, _} ->
{error, <<"Failed to start SSE stream"/utf8>>};
{ok, {_, Manager_subject}} ->
{ok, {Subject, Manager_subject}}
end
end.