Expand description
Bijection codec between RunItem and raw OpenAI chat messages
What this module provides (spec)
- Deterministic, lossless conversions used by recording/replay and persistence layers
- Pure utility functions decoupled from services
Exports
- Models (reuse from
items.rsif desired)RunItem::{Message, ToolCall, ToolOutput, Handoff}
- Utils (pure)
messages_to_items(messages: &[RawChatMessage]) -> Vec<RunItem>items_to_messages(items: &[RunItem]) -> Vec<RawChatMessage>CodecErrorfor invalid sequences (e.g., tool output without prior tool_call)
Implementation strategy
- One-pass state machine for
messages_to_items:- Accumulate assistant
tool_callsto attach to the preceding assistant message - Immediately emit
ToolOutputfortoolrole messages with resolvedtool_call_id
- Accumulate assistant
- The inverse reconstructs messages, ensuring assistant tool_calls coalesce correctly
- Avoid allocations by pre-sizing vectors and reusing buffers
Composition
- Recorder and session layers call these functions at the edge
- Does not depend on Tower; purely functional
Testing strategy
- Property tests (e.g., with
proptest) asserting round-trip identity - Golden-case unit tests for:
- Multiple tool_calls in a single assistant message
- Interleaved ToolCall/ToolOutput
- Empty content and error outputs
- Fuzz invalid sequences to ensure
CodecErrorsurfaces clearly
Enums§
Functions§
- items_
to_ messages - Convert RunItems back to raw OpenAI request messages, preserving tool_calls semantics.
- messages_
to_ items - Convert raw OpenAI request messages to a sequence of RunItems.