Packages

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

Current section

Files

Jump to
pig src pig@ai@stop_reason.erl
Raw

src/pig@ai@stop_reason.erl

-module(pig@ai@stop_reason).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/pig/ai/stop_reason.gleam").
-export([from_openai/1, to_string/1, from_string/1, to_json/1, decoder/0]).
-export_type([stop_reason/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(
" A normalized stop reason across all LLM providers.\n"
"\n"
" Each provider maps its native finish/stop reason string to one of\n"
" these variants. This gives the rest of the codebase a stable,\n"
" provider-agnostic type to pattern-match on.\n"
"\n"
" Inspired by pi's `StopReason` type.\n"
).
-type stop_reason() :: stop | length | tool_use | error | {unknown, binary()}.
-file("src/pig/ai/stop_reason.gleam", 37).
?DOC(
" Map an OpenAI native finish_reason string to a StopReason.\n"
"\n"
" | OpenAI value | StopReason |\n"
" |------------------|------------|\n"
" | `\"stop\"` | `Stop` |\n"
" | `\"tool_calls\"` | `ToolUse` |\n"
" | `\"length\"` | `Length` |\n"
" | `\"content_filter\"`| `Error` |\n"
" | anything else | `Unknown` |\n"
).
-spec from_openai(binary()) -> stop_reason().
from_openai(Raw) ->
case Raw of
<<"stop"/utf8>> ->
stop;
<<"tool_calls"/utf8>> ->
tool_use;
<<"length"/utf8>> ->
length;
<<"content_filter"/utf8>> ->
error;
Other ->
{unknown, Other}
end.
-file("src/pig/ai/stop_reason.gleam", 53).
?DOC(
" Convert a StopReason to its canonical string representation.\n"
"\n"
" Used for JSONL serialization, telemetry, and display.\n"
" `Unknown` values pass through the original provider string.\n"
).
-spec to_string(stop_reason()) -> binary().
to_string(Reason) ->
case Reason of
stop ->
<<"stop"/utf8>>;
length ->
<<"length"/utf8>>;
tool_use ->
<<"tool_use"/utf8>>;
error ->
<<"error"/utf8>>;
{unknown, V} ->
V
end.
-file("src/pig/ai/stop_reason.gleam", 67).
?DOC(
" Parse a canonical string back into a StopReason.\n"
"\n"
" Inverse of `to_string` for known variants.\n"
" Unrecognized strings become `Unknown`.\n"
).
-spec from_string(binary()) -> stop_reason().
from_string(S) ->
case S of
<<"stop"/utf8>> ->
stop;
<<"length"/utf8>> ->
length;
<<"tool_use"/utf8>> ->
tool_use;
<<"error"/utf8>> ->
error;
Other ->
{unknown, Other}
end.
-file("src/pig/ai/stop_reason.gleam", 80).
?DOC(" Serialize a StopReason as a JSON string value.\n").
-spec to_json(stop_reason()) -> gleam@json:json().
to_json(Reason) ->
gleam@json:string(to_string(Reason)).
-file("src/pig/ai/stop_reason.gleam", 85).
?DOC(" Decode a StopReason from a JSON string value.\n").
-spec decoder() -> gleam@dynamic@decode:decoder(stop_reason()).
decoder() ->
gleam@dynamic@decode:map(
{decoder, fun gleam@dynamic@decode:decode_string/1},
fun(Raw) -> from_string(Raw) end
).