Packages

A Gleam library for building and orchestrating agents on the BEAM.

Current section

Files

Jump to
pig src pig@obs@events.erl
Raw

src/pig@obs@events.erl

-module(pig@obs@events).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/pig/obs/events.gleam").
-export([system_time/0, execute_telemetry/3, inference_start_name/0, inference_stop_name/0, inference_exception_name/0, tool_start_name/0, tool_stop_name/0, tool_exception_name/0, tool_blocked_name/0, all_event_names/0, event_name/1, name_to_string/1, emit/1, emit_start/2, emit_stop/3, emit_exception/2, decode/1]).
-export_type([event/0, raw_captured_event/0, session_end_reason/0, hook_point/0, hook_action_detail/0, session_event/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.
?MODULEDOC(
" Telemetry event definitions for the pig library.\n"
"\n"
" A single `Event` union type with typed variants for every pig event.\n"
" One `emit(Event)` function, one `event_name(Event)` accessor.\n"
"\n"
" Uses a thin Erlang FFI (`pig_obs_ffi`) that wraps `:telemetry.execute/3`\n"
" and converts string-keyed dicts to atom-keyed maps.\n"
" All pig telemetry events as typed variants. Construct these directly\n"
" and pass to `emit()`.\n"
).
-type event() :: {inference_start, binary(), integer()} |
{inference_stop,
binary(),
integer(),
integer(),
gleam@option:option(binary()),
gleam@option:option(pig_protocol@stop_reason:stop_reason()),
gleam@option:option(integer()),
gleam@option:option(integer())} |
{inference_exception, binary(), integer(), binary()} |
{tool_start, binary(), binary(), binary()} |
{tool_stop, binary(), binary(), integer(), binary()} |
{tool_exception, binary(), binary(), binary()}.
-type raw_captured_event() :: {raw_captured_event,
list(binary()),
gleam@dict:dict(binary(), integer()),
gleam@dict:dict(binary(), binary())}.
-type session_end_reason() :: normal_end |
{error_end, pig_protocol@error:ai_error()} |
{max_iterations_exceeded, integer()} |
interrupted.
-type hook_point() :: before_tool_call |
after_tool_call |
before_inference |
after_inference |
on_error |
on_complete |
on_session_start |
on_session_shutdown.
-type hook_action_detail() :: {hook_action_detail, binary(), binary()}.
-type session_event() :: {session_started,
gleam@option:option(binary()),
gleam@option:option(binary()),
binary(),
gleam@option:option(binary()),
gleam@option:option(binary())} |
{inference_started, binary(), integer()} |
{inference_completed,
pig_protocol@message:message(),
gleam@option:option(binary()),
gleam@option:option(binary()),
gleam@option:option(pig_protocol@stop_reason:stop_reason()),
gleam@option:option(integer()),
gleam@option:option(integer()),
integer(),
list(pig_protocol@message:message())} |
{tool_started, pig_protocol@message:tool_call()} |
{tool_executed, pig_protocol@message:tool_call(), binary(), integer()} |
{tool_blocked, pig_protocol@message:tool_call(), binary(), binary()} |
{hook_acted, binary(), hook_point(), hook_action_detail()} |
{inference_failed,
pig_protocol@error:ai_error(),
integer(),
list(pig_protocol@message:message())} |
{session_ended, session_end_reason()}.
-file("src/pig/obs/events.gleam", 31).
?DOC(" Get the current monotonic system time. Used for duration measurements.\n").
-spec system_time() -> integer().
system_time() ->
pig_obs_ffi:system_time().
-file("src/pig/obs/events.gleam", 38).
?DOC(
" Public wrapper for the FFI execute function.\n"
" This allows other modules (like the dispatcher) to emit telemetry events\n"
" without exposing the FFI implementation directly.\n"
).
-spec execute_telemetry(
list(binary()),
gleam@dict:dict(binary(), integer()),
gleam@dict:dict(binary(), binary())
) -> nil.
execute_telemetry(Name, Measurements, Metadata) ->
pig_obs_ffi:execute(Name, Measurements, Metadata).
-file("src/pig/obs/events.gleam", 72).
-spec inference_start_name() -> list(binary()).
inference_start_name() ->
[<<"pig"/utf8>>, <<"inference"/utf8>>, <<"start"/utf8>>].
-file("src/pig/obs/events.gleam", 76).
-spec inference_stop_name() -> list(binary()).
inference_stop_name() ->
[<<"pig"/utf8>>, <<"inference"/utf8>>, <<"stop"/utf8>>].
-file("src/pig/obs/events.gleam", 80).
-spec inference_exception_name() -> list(binary()).
inference_exception_name() ->
[<<"pig"/utf8>>, <<"inference"/utf8>>, <<"exception"/utf8>>].
-file("src/pig/obs/events.gleam", 84).
-spec tool_start_name() -> list(binary()).
tool_start_name() ->
[<<"pig"/utf8>>, <<"tool"/utf8>>, <<"start"/utf8>>].
-file("src/pig/obs/events.gleam", 88).
-spec tool_stop_name() -> list(binary()).
tool_stop_name() ->
[<<"pig"/utf8>>, <<"tool"/utf8>>, <<"stop"/utf8>>].
-file("src/pig/obs/events.gleam", 92).
-spec tool_exception_name() -> list(binary()).
tool_exception_name() ->
[<<"pig"/utf8>>, <<"tool"/utf8>>, <<"exception"/utf8>>].
-file("src/pig/obs/events.gleam", 96).
-spec tool_blocked_name() -> list(binary()).
tool_blocked_name() ->
[<<"pig"/utf8>>, <<"tool"/utf8>>, <<"blocked"/utf8>>].
-file("src/pig/obs/events.gleam", 101).
?DOC(" All pig event names, useful for attaching a listener to everything.\n").
-spec all_event_names() -> list(list(binary())).
all_event_names() ->
[inference_start_name(),
inference_stop_name(),
inference_exception_name(),
tool_start_name(),
tool_stop_name(),
tool_exception_name(),
tool_blocked_name()].
-file("src/pig/obs/events.gleam", 114).
?DOC(" Get the telemetry event name for a given event.\n").
-spec event_name(event()) -> list(binary()).
event_name(Event) ->
case Event of
{inference_start, _, _} ->
inference_start_name();
{inference_stop, _, _, _, _, _, _, _} ->
inference_stop_name();
{inference_exception, _, _, _} ->
inference_exception_name();
{tool_start, _, _, _} ->
tool_start_name();
{tool_stop, _, _, _, _} ->
tool_stop_name();
{tool_exception, _, _, _} ->
tool_exception_name()
end.
-file("src/pig/obs/events.gleam", 128).
?DOC(" Convert an event name list to a dot-separated string for display.\n").
-spec name_to_string(list(binary())) -> binary().
name_to_string(Name) ->
gleam@string:join(Name, <<"."/utf8>>).
-file("src/pig/obs/events.gleam", 269).
-spec maybe_insert_string(
gleam@dict:dict(binary(), binary()),
binary(),
gleam@option:option(binary())
) -> gleam@dict:dict(binary(), binary()).
maybe_insert_string(Dict, Key, Value) ->
case Value of
{some, V} ->
gleam@dict:insert(Dict, Key, V);
none ->
Dict
end.
-file("src/pig/obs/events.gleam", 258).
-spec maybe_insert_int(
gleam@dict:dict(binary(), integer()),
binary(),
gleam@option:option(integer())
) -> gleam@dict:dict(binary(), integer()).
maybe_insert_int(Dict, Key, Value) ->
case Value of
{some, V} ->
gleam@dict:insert(Dict, Key, V);
none ->
Dict
end.
-file("src/pig/obs/events.gleam", 135).
?DOC(" Emit a typed telemetry event.\n").
-spec emit(event()) -> nil.
emit(Event) ->
case Event of
{inference_start, Model, Message_count} ->
Measurements = maps:from_list(
[{<<"system_time"/utf8>>, pig_obs_ffi:system_time()},
{<<"message_count"/utf8>>, Message_count}]
),
Metadata = maps:from_list([{<<"model"/utf8>>, Model}]),
pig_obs_ffi:execute(inference_start_name(), Measurements, Metadata);
{inference_stop,
Model@1,
Message_count@1,
Duration_ms,
Response_id,
Stop_reason,
Input_tokens,
Output_tokens} ->
Base_measurements = maps:from_list(
[{<<"system_time"/utf8>>, pig_obs_ffi:system_time()},
{<<"duration"/utf8>>, Duration_ms},
{<<"message_count"/utf8>>, Message_count@1}]
),
Measurements@1 = begin
_pipe = Base_measurements,
_pipe@1 = maybe_insert_int(
_pipe,
<<"input_tokens"/utf8>>,
Input_tokens
),
maybe_insert_int(
_pipe@1,
<<"output_tokens"/utf8>>,
Output_tokens
)
end,
Base_metadata = maps:from_list([{<<"model"/utf8>>, Model@1}]),
Metadata@1 = begin
_pipe@2 = Base_metadata,
_pipe@3 = maybe_insert_string(
_pipe@2,
<<"response_id"/utf8>>,
Response_id
),
maybe_insert_string(
_pipe@3,
<<"stop_reason"/utf8>>,
gleam@option:map(
Stop_reason,
fun pig_protocol@stop_reason:to_string/1
)
)
end,
pig_obs_ffi:execute(
inference_stop_name(),
Measurements@1,
Metadata@1
);
{inference_exception, Model@2, Message_count@2, Error_type} ->
Measurements@2 = maps:from_list(
[{<<"system_time"/utf8>>, pig_obs_ffi:system_time()},
{<<"message_count"/utf8>>, Message_count@2}]
),
Metadata@2 = maps:from_list(
[{<<"model"/utf8>>, Model@2},
{<<"error_type"/utf8>>, Error_type}]
),
pig_obs_ffi:execute(
inference_exception_name(),
Measurements@2,
Metadata@2
);
{tool_start, Tool_name, Tool_call_id, Arguments_json} ->
Measurements@3 = maps:from_list(
[{<<"system_time"/utf8>>, pig_obs_ffi:system_time()}]
),
Metadata@3 = maps:from_list(
[{<<"tool_name"/utf8>>, Tool_name},
{<<"tool_call_id"/utf8>>, Tool_call_id},
{<<"arguments_json"/utf8>>, Arguments_json}]
),
pig_obs_ffi:execute(tool_start_name(), Measurements@3, Metadata@3);
{tool_stop, Tool_name@1, Tool_call_id@1, Duration_ms@1, Result} ->
Measurements@4 = maps:from_list(
[{<<"system_time"/utf8>>, pig_obs_ffi:system_time()},
{<<"duration"/utf8>>, Duration_ms@1}]
),
Metadata@4 = maps:from_list(
[{<<"tool_name"/utf8>>, Tool_name@1},
{<<"tool_call_id"/utf8>>, Tool_call_id@1},
{<<"result"/utf8>>, Result}]
),
pig_obs_ffi:execute(tool_stop_name(), Measurements@4, Metadata@4);
{tool_exception, Tool_name@2, Tool_call_id@2, Arguments_json@1} ->
Measurements@5 = maps:from_list(
[{<<"system_time"/utf8>>, pig_obs_ffi:system_time()}]
),
Metadata@5 = maps:from_list(
[{<<"tool_name"/utf8>>, Tool_name@2},
{<<"tool_call_id"/utf8>>, Tool_call_id@2},
{<<"arguments_json"/utf8>>, Arguments_json@1}]
),
pig_obs_ffi:execute(
tool_exception_name(),
Measurements@5,
Metadata@5
)
end.
-file("src/pig/obs/events.gleam", 230).
?DOC(" Emit a custom start event with auto-populated system_time measurement.\n").
-spec emit_start(list(binary()), gleam@dict:dict(binary(), binary())) -> nil.
emit_start(Name, Meta) ->
Measurements = maps:from_list(
[{<<"system_time"/utf8>>, pig_obs_ffi:system_time()}]
),
pig_obs_ffi:execute(Name, Measurements, Meta).
-file("src/pig/obs/events.gleam", 236).
?DOC(" Emit a custom stop event with duration and system_time measurements.\n").
-spec emit_stop(list(binary()), integer(), gleam@dict:dict(binary(), binary())) -> nil.
emit_stop(Name, Duration_ms, Meta) ->
Measurements = maps:from_list(
[{<<"system_time"/utf8>>, pig_obs_ffi:system_time()},
{<<"duration"/utf8>>, Duration_ms}]
),
pig_obs_ffi:execute(Name, Measurements, Meta).
-file("src/pig/obs/events.gleam", 250).
?DOC(" Emit a custom exception event with auto-populated system_time measurement.\n").
-spec emit_exception(list(binary()), gleam@dict:dict(binary(), binary())) -> nil.
emit_exception(Name, Meta) ->
Measurements = maps:from_list(
[{<<"system_time"/utf8>>, pig_obs_ffi:system_time()}]
),
pig_obs_ffi:execute(Name, Measurements, Meta).
-file("src/pig/obs/events.gleam", 280).
-spec maybe_get_string(gleam@dict:dict(binary(), binary()), binary()) -> gleam@option:option(binary()).
maybe_get_string(Dict, Key) ->
case gleam_stdlib:map_get(Dict, Key) of
{ok, V} ->
{some, V};
{error, nil} ->
none
end.
-file("src/pig/obs/events.gleam", 287).
-spec maybe_get_int(gleam@dict:dict(binary(), integer()), binary()) -> gleam@option:option(integer()).
maybe_get_int(Dict, Key) ->
case gleam_stdlib:map_get(Dict, Key) of
{ok, V} ->
{some, V};
{error, nil} ->
none
end.
-file("src/pig/obs/events.gleam", 308).
?DOC(
" Decode a raw captured event into a typed Event.\n"
" Panics on unknown event names or missing fields (internal consistency).\n"
).
-spec decode(raw_captured_event()) -> event().
decode(Raw) ->
case erlang:element(2, Raw) of
[<<"pig"/utf8>>, <<"inference"/utf8>>, <<"start"/utf8>>] ->
Model@1 = case gleam_stdlib:map_get(
erlang:element(4, Raw),
<<"model"/utf8>>
) of
{ok, Model} -> Model;
_assert_fail ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
file => <<?FILEPATH/utf8>>,
module => <<"pig/obs/events"/utf8>>,
function => <<"decode"/utf8>>,
line => 311,
value => _assert_fail,
start => 10195,
'end' => 10249,
pattern_start => 10206,
pattern_end => 10215})
end,
Count@1 = case gleam_stdlib:map_get(
erlang:element(3, Raw),
<<"message_count"/utf8>>
) of
{ok, Count} -> Count;
_assert_fail@1 ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
file => <<?FILEPATH/utf8>>,
module => <<"pig/obs/events"/utf8>>,
function => <<"decode"/utf8>>,
line => 312,
value => _assert_fail@1,
start => 10256,
'end' => 10322,
pattern_start => 10267,
pattern_end => 10276})
end,
{inference_start, Model@1, Count@1};
[<<"pig"/utf8>>, <<"inference"/utf8>>, <<"stop"/utf8>>] ->
Model@3 = case gleam_stdlib:map_get(
erlang:element(4, Raw),
<<"model"/utf8>>
) of
{ok, Model@2} -> Model@2;
_assert_fail@2 ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
file => <<?FILEPATH/utf8>>,
module => <<"pig/obs/events"/utf8>>,
function => <<"decode"/utf8>>,
line => 316,
value => _assert_fail@2,
start => 10424,
'end' => 10478,
pattern_start => 10435,
pattern_end => 10444})
end,
Count@3 = case gleam_stdlib:map_get(
erlang:element(3, Raw),
<<"message_count"/utf8>>
) of
{ok, Count@2} -> Count@2;
_assert_fail@3 ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
file => <<?FILEPATH/utf8>>,
module => <<"pig/obs/events"/utf8>>,
function => <<"decode"/utf8>>,
line => 317,
value => _assert_fail@3,
start => 10485,
'end' => 10551,
pattern_start => 10496,
pattern_end => 10505})
end,
Dur@1 = case gleam_stdlib:map_get(
erlang:element(3, Raw),
<<"duration"/utf8>>
) of
{ok, Dur} -> Dur;
_assert_fail@4 ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
file => <<?FILEPATH/utf8>>,
module => <<"pig/obs/events"/utf8>>,
function => <<"decode"/utf8>>,
line => 318,
value => _assert_fail@4,
start => 10558,
'end' => 10617,
pattern_start => 10569,
pattern_end => 10576})
end,
Response_id = maybe_get_string(
erlang:element(4, Raw),
<<"response_id"/utf8>>
),
Raw_stop_reason = maybe_get_string(
erlang:element(4, Raw),
<<"stop_reason"/utf8>>
),
Sr = gleam@option:map(
Raw_stop_reason,
fun pig_protocol@stop_reason:from_string/1
),
Input_tokens = maybe_get_int(
erlang:element(3, Raw),
<<"input_tokens"/utf8>>
),
Output_tokens = maybe_get_int(
erlang:element(3, Raw),
<<"output_tokens"/utf8>>
),
{inference_stop,
Model@3,
Count@3,
Dur@1,
Response_id,
Sr,
Input_tokens,
Output_tokens};
[<<"pig"/utf8>>, <<"inference"/utf8>>, <<"exception"/utf8>>] ->
Model@5 = case gleam_stdlib:map_get(
erlang:element(4, Raw),
<<"model"/utf8>>
) of
{ok, Model@4} -> Model@4;
_assert_fail@5 ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
file => <<?FILEPATH/utf8>>,
module => <<"pig/obs/events"/utf8>>,
function => <<"decode"/utf8>>,
line => 335,
value => _assert_fail@5,
start => 11228,
'end' => 11282,
pattern_start => 11239,
pattern_end => 11248})
end,
Count@5 = case gleam_stdlib:map_get(
erlang:element(3, Raw),
<<"message_count"/utf8>>
) of
{ok, Count@4} -> Count@4;
_assert_fail@6 ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
file => <<?FILEPATH/utf8>>,
module => <<"pig/obs/events"/utf8>>,
function => <<"decode"/utf8>>,
line => 336,
value => _assert_fail@6,
start => 11289,
'end' => 11355,
pattern_start => 11300,
pattern_end => 11309})
end,
Error_type@1 = case gleam_stdlib:map_get(
erlang:element(4, Raw),
<<"error_type"/utf8>>
) of
{ok, Error_type} -> Error_type;
_assert_fail@7 ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
file => <<?FILEPATH/utf8>>,
module => <<"pig/obs/events"/utf8>>,
function => <<"decode"/utf8>>,
line => 337,
value => _assert_fail@7,
start => 11362,
'end' => 11426,
pattern_start => 11373,
pattern_end => 11387})
end,
{inference_exception, Model@5, Count@5, Error_type@1};
[<<"pig"/utf8>>, <<"tool"/utf8>>, <<"start"/utf8>>] ->
Name@1 = case gleam_stdlib:map_get(
erlang:element(4, Raw),
<<"tool_name"/utf8>>
) of
{ok, Name} -> Name;
_assert_fail@8 ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
file => <<?FILEPATH/utf8>>,
module => <<"pig/obs/events"/utf8>>,
function => <<"decode"/utf8>>,
line => 341,
value => _assert_fail@8,
start => 11541,
'end' => 11598,
pattern_start => 11552,
pattern_end => 11560})
end,
Id@1 = case gleam_stdlib:map_get(
erlang:element(4, Raw),
<<"tool_call_id"/utf8>>
) of
{ok, Id} -> Id;
_assert_fail@9 ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
file => <<?FILEPATH/utf8>>,
module => <<"pig/obs/events"/utf8>>,
function => <<"decode"/utf8>>,
line => 342,
value => _assert_fail@9,
start => 11605,
'end' => 11663,
pattern_start => 11616,
pattern_end => 11622})
end,
Args@1 = case gleam_stdlib:map_get(
erlang:element(4, Raw),
<<"arguments_json"/utf8>>
) of
{ok, Args} -> Args;
_assert_fail@10 ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
file => <<?FILEPATH/utf8>>,
module => <<"pig/obs/events"/utf8>>,
function => <<"decode"/utf8>>,
line => 343,
value => _assert_fail@10,
start => 11670,
'end' => 11732,
pattern_start => 11681,
pattern_end => 11689})
end,
{tool_start, Name@1, Id@1, Args@1};
[<<"pig"/utf8>>, <<"tool"/utf8>>, <<"stop"/utf8>>] ->
Name@3 = case gleam_stdlib:map_get(
erlang:element(4, Raw),
<<"tool_name"/utf8>>
) of
{ok, Name@2} -> Name@2;
_assert_fail@11 ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
file => <<?FILEPATH/utf8>>,
module => <<"pig/obs/events"/utf8>>,
function => <<"decode"/utf8>>,
line => 347,
value => _assert_fail@11,
start => 11851,
'end' => 11908,
pattern_start => 11862,
pattern_end => 11870})
end,
Id@3 = case gleam_stdlib:map_get(
erlang:element(4, Raw),
<<"tool_call_id"/utf8>>
) of
{ok, Id@2} -> Id@2;
_assert_fail@12 ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
file => <<?FILEPATH/utf8>>,
module => <<"pig/obs/events"/utf8>>,
function => <<"decode"/utf8>>,
line => 348,
value => _assert_fail@12,
start => 11915,
'end' => 11973,
pattern_start => 11926,
pattern_end => 11932})
end,
Dur@3 = case gleam_stdlib:map_get(
erlang:element(3, Raw),
<<"duration"/utf8>>
) of
{ok, Dur@2} -> Dur@2;
_assert_fail@13 ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
file => <<?FILEPATH/utf8>>,
module => <<"pig/obs/events"/utf8>>,
function => <<"decode"/utf8>>,
line => 349,
value => _assert_fail@13,
start => 11980,
'end' => 12039,
pattern_start => 11991,
pattern_end => 11998})
end,
Res@1 = case gleam_stdlib:map_get(
erlang:element(4, Raw),
<<"result"/utf8>>
) of
{ok, Res} -> Res;
_assert_fail@14 ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
file => <<?FILEPATH/utf8>>,
module => <<"pig/obs/events"/utf8>>,
function => <<"decode"/utf8>>,
line => 350,
value => _assert_fail@14,
start => 12046,
'end' => 12099,
pattern_start => 12057,
pattern_end => 12064})
end,
{tool_stop, Name@3, Id@3, Dur@3, Res@1};
[<<"pig"/utf8>>, <<"tool"/utf8>>, <<"exception"/utf8>>] ->
Name@5 = case gleam_stdlib:map_get(
erlang:element(4, Raw),
<<"tool_name"/utf8>>
) of
{ok, Name@4} -> Name@4;
_assert_fail@15 ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
file => <<?FILEPATH/utf8>>,
module => <<"pig/obs/events"/utf8>>,
function => <<"decode"/utf8>>,
line => 354,
value => _assert_fail@15,
start => 12231,
'end' => 12288,
pattern_start => 12242,
pattern_end => 12250})
end,
Id@5 = case gleam_stdlib:map_get(
erlang:element(4, Raw),
<<"tool_call_id"/utf8>>
) of
{ok, Id@4} -> Id@4;
_assert_fail@16 ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
file => <<?FILEPATH/utf8>>,
module => <<"pig/obs/events"/utf8>>,
function => <<"decode"/utf8>>,
line => 355,
value => _assert_fail@16,
start => 12295,
'end' => 12353,
pattern_start => 12306,
pattern_end => 12312})
end,
Args@3 = case gleam_stdlib:map_get(
erlang:element(4, Raw),
<<"arguments_json"/utf8>>
) of
{ok, Args@2} -> Args@2;
_assert_fail@17 ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
file => <<?FILEPATH/utf8>>,
module => <<"pig/obs/events"/utf8>>,
function => <<"decode"/utf8>>,
line => 356,
value => _assert_fail@17,
start => 12360,
'end' => 12422,
pattern_start => 12371,
pattern_end => 12379})
end,
{tool_exception, Name@5, Id@5, Args@3};
_ ->
Msg = <<"unknown telemetry event: "/utf8,
(name_to_string(erlang:element(2, Raw)))/binary>>,
erlang:error(#{gleam_error => panic,
message => Msg,
file => <<?FILEPATH/utf8>>,
module => <<"pig/obs/events"/utf8>>,
function => <<"decode"/utf8>>,
line => 361})
end.