Packages

Gleam SDK for the Anthropic Claude API with agentic tool-use loop and BEAM concurrency

Current section

Files

Jump to
claude_gleam src claude@types@message.erl
Raw

src/claude@types@message.erl

-module(claude@types@message).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/claude/types/message.gleam").
-export([new_user/1, new_user_blocks/1, new_assistant_blocks/1, content_to_params/1]).
-export_type([role/0, stop_reason/0, message_param/0, message_content/0, message/0, usage/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 role() :: user | assistant.
-type stop_reason() :: end_turn |
tool_use_stop |
max_tokens |
stop_sequence |
pause_turn |
refusal.
-type message_param() :: {message_param, role(), message_content()}.
-type message_content() :: {string_content, binary()} |
{block_content, list(claude@types@content:content_block_param())}.
-type message() :: {message,
binary(),
role(),
list(claude@types@content:content_block()),
binary(),
gleam@option:option(stop_reason()),
gleam@option:option(binary()),
usage()}.
-type usage() :: {usage,
integer(),
integer(),
gleam@option:option(integer()),
gleam@option:option(integer())}.
-file("src/claude/types/message.gleam", 60).
?DOC(" Create a user message with plain text content.\n").
-spec new_user(binary()) -> message_param().
new_user(Text) ->
{message_param, user, {string_content, Text}}.
-file("src/claude/types/message.gleam", 65).
?DOC(" Create a user message with structured content blocks.\n").
-spec new_user_blocks(list(claude@types@content:content_block_param())) -> message_param().
new_user_blocks(Blocks) ->
{message_param, user, {block_content, Blocks}}.
-file("src/claude/types/message.gleam", 70).
?DOC(" Create an assistant message with structured content blocks.\n").
-spec new_assistant_blocks(list(claude@types@content:content_block_param())) -> message_param().
new_assistant_blocks(Blocks) ->
{message_param, assistant, {block_content, Blocks}}.
-file("src/claude/types/message.gleam", 82).
-spec block_to_param(claude@types@content:content_block()) -> {ok,
claude@types@content:content_block_param()} |
{error, nil}.
block_to_param(Block) ->
case Block of
{text, T, _} ->
{ok, {text_param, T}};
{tool_use, Id, Name, Input} ->
{ok, {tool_use_param, Id, Name, Input}};
{thinking, T@1, S} ->
{ok, {thinking_param, T@1, S}};
{redacted_thinking, D} ->
{ok, {redacted_thinking_param, D}};
{server_tool_use, Id@1, Name@1, Input@1} ->
{ok, {server_tool_use_param, Id@1, Name@1, Input@1}};
{web_search_result, _, _, _, _} ->
{error, nil}
end.
-file("src/claude/types/message.gleam", 78).
?DOC(
" Convert API response content blocks to content block params.\n"
" Maps Text -> TextParam, ToolUse -> ToolUseParam, Thinking -> ThinkingParam,\n"
" RedactedThinking -> RedactedThinkingParam, ServerToolUse -> ServerToolUseParam.\n"
" WebSearchResult blocks are filtered out as they have no corresponding param type.\n"
).
-spec content_to_params(list(claude@types@content:content_block())) -> list(claude@types@content:content_block_param()).
content_to_params(Content) ->
gleam@list:filter_map(Content, fun block_to_param/1).