LemonAi. Providers. OpenAIResponsesShared
(lemon_ai v0.1.0)
View Source
Shared utilities for OpenAI Responses API family.
This module provides common message conversion, tool conversion, and stream processing logic used by:
- OpenAI Responses API
- OpenAI Codex Responses API (ChatGPT Plus/Pro)
- Azure OpenAI Responses API
Summary
Functions
Apply service tier pricing to usage.
Calculate cost based on model pricing.
Clamp oversized function_call_output payload items in a prebuilt Responses API request.
Convert context messages to OpenAI Responses API input format.
Convert tools to OpenAI Responses API format.
Parse potentially incomplete JSON for streaming tool arguments. Returns a map with whatever can be parsed.
Process OpenAI Responses API stream events and emit to EventStream.
Sanitize unicode surrogates from a string. Some APIs reject unpaired surrogate characters.
Get cost multiplier for service tier.
Fast deterministic hash to shorten long strings. Used for truncating message IDs to fit OpenAI's 64-char limit.
Transform messages for cross-provider compatibility. Normalizes tool call IDs and handles thinking blocks.
Types
@type message_options() :: %{optional(:include_system_prompt) => boolean()}
@type reasoning_effort() :: :minimal | :low | :medium | :high | :xhigh | :none
@type reasoning_summary() :: :auto | :detailed | :concise | :off | :on | nil
@type stream_options() :: %{ optional(:service_tier) => String.t() | nil, optional(:apply_service_tier_pricing) => (LemonAi.Types.Usage.t(), String.t() | nil -> LemonAi.Types.Usage.t()) }
@type tool_options() :: %{optional(:strict) => boolean() | nil}
Functions
@spec apply_service_tier_pricing(LemonAi.Types.Usage.t(), String.t() | nil) :: LemonAi.Types.Usage.t()
Apply service tier pricing to usage.
@spec calculate_cost(LemonAi.Types.Model.t(), LemonAi.Types.Usage.t()) :: LemonAi.Types.Usage.t()
Calculate cost based on model pricing.
Clamp oversized function_call_output payload items in a prebuilt Responses API request.
This is a final safety net for request payloads and complements truncation during
message conversion. It prevents provider 400 errors when any input[*].output
field exceeds the Responses API maximum string size.
@spec convert_messages( LemonAi.Types.Model.t(), LemonAi.Types.Context.t(), MapSet.t(atom()), message_options() ) :: [map()]
Convert context messages to OpenAI Responses API input format.
Options
:include_system_prompt- Whether to include system prompt (default: true)
@spec convert_tools([LemonAi.Types.Tool.t()], tool_options()) :: [map()]
Convert tools to OpenAI Responses API format.
Options
:strict- Whether to enforce strict mode (default: false, nil means omit)
Parse potentially incomplete JSON for streaming tool arguments. Returns a map with whatever can be parsed.
@spec process_stream( Enumerable.t(), LemonAi.Types.AssistantMessage.t(), LemonAi.EventStream.t(), LemonAi.Types.Model.t(), stream_options() ) :: {:ok, LemonAi.Types.AssistantMessage.t()} | {:error, term()}
Process OpenAI Responses API stream events and emit to EventStream.
Sanitize unicode surrogates from a string. Some APIs reject unpaired surrogate characters.
Get cost multiplier for service tier.
Fast deterministic hash to shorten long strings. Used for truncating message IDs to fit OpenAI's 64-char limit.
@spec transform_messages([map()], LemonAi.Types.Model.t(), MapSet.t(atom())) :: [ map() ]
Transform messages for cross-provider compatibility. Normalizes tool call IDs and handles thinking blocks.