What
DataBlock is the content block that exists to carry JSON. The openai-agents engine refuses it
as input:
ConfigError: openai-agents engine cannot send a 'data' block to the model;
it accepts text, image, and audio (chat-completions only) input blocks
Reproduced at ca03ae8 (v3.0.0):
payload = [DataBlock(data={"page": "reference/deck"}), TextBlock(text="what page am I on?")]
await deck.run("AskAgentDeck", payload, context=corpus) # raises
Raised from adapters/engines/openai_agents/engine.py:271 (_part_of). ResourceBlock takes
the same path.
Why it matters
DataBlock is an output block in practice — the engine produces one for structured output and
refuses one on input — but nothing says so. The consequence showed up building the v3 reference
app (#219): the natural, typed way to hand a model structured per-run context does not exist, so
every embedded application invents its own prose preamble. Ask AgentDeck's is
<context>…</context> in examples/ask-agentdeck/ask_agentdeck/server.py. No two applications
will agree on a format, and each one re-solves delimiter injection from scratch.
reference/deck.mdx lists all five block types under What input accepts and qualifies it a
paragraph later. Accurate, but it reads as an afterthought for something that is closer to a
type error.
Two directions, neither chosen here
- The engine renders a
DataBlock as JSON text rather than refusing it — cheap, and arguably
what a caller means.
- The block table states plainly which types are input-capable, and the docs stop implying
symmetry the content model does not have.
Version anchor
dev at ca03ae8, v3.0.0. Recorded in docs/delivery/plan-219-delivery.md §4.
What is not yet known
Whether the LangGraph engine behaves the same way — the reproduction above is openai-agents
only, and a divergence between the two engines on the same block type would be its own finding.
What
DataBlockis the content block that exists to carry JSON. The openai-agents engine refuses itas input:
Reproduced at
ca03ae8(v3.0.0):Raised from
adapters/engines/openai_agents/engine.py:271(_part_of).ResourceBlocktakesthe same path.
Why it matters
DataBlockis an output block in practice — the engine produces one for structured output andrefuses one on input — but nothing says so. The consequence showed up building the v3 reference
app (#219): the natural, typed way to hand a model structured per-run context does not exist, so
every embedded application invents its own prose preamble. Ask AgentDeck's is
<context>…</context>inexamples/ask-agentdeck/ask_agentdeck/server.py. No two applicationswill agree on a format, and each one re-solves delimiter injection from scratch.
reference/deck.mdxlists all five block types under Whatinputaccepts and qualifies it aparagraph later. Accurate, but it reads as an afterthought for something that is closer to a
type error.
Two directions, neither chosen here
DataBlockas JSON text rather than refusing it — cheap, and arguablywhat a caller means.
symmetry the content model does not have.
Version anchor
devatca03ae8, v3.0.0. Recorded indocs/delivery/plan-219-delivery.md§4.What is not yet known
Whether the LangGraph engine behaves the same way — the reproduction above is openai-agents
only, and a divergence between the two engines on the same block type would be its own finding.