- plans/parts/plugin-upgrade-guide.md gains a "Storage: the DAG
message store (transparent to plugins)" section. Highlights the
two things plugin authors actually need to know: provider_metadata
is part of message identity (so echo it verbatim), and floats in
provider_metadata are rejected at hash time.
- plans/dag-schema.md's "Suggested implementation sequence" is
replaced with an "Implementation status" section reflecting what
actually shipped across the five commits, plus a Deferred section
listing llm logs tree view, full provider-adapter DAG reads, and
the eventual drop of responses writes.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Adds llm/_canonical.py with canonical_message_json() and
message_content_hash(). The serialization is the hash contract for the
incoming DAG-shaped message store; snapshot tests in
tests/test_canonical.py pin the wire format.
The include_provider_metadata parameter is threaded through now so a
future semantic_hash column can be added without refactoring
(see plans/dag-provider-metadata-hashing.md).
Also commits the design docs:
- plans/dag-schema.md — full DAG storage design
- plans/dag-provider-metadata-hashing.md — Option 1 now, Option 2 later
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
New option: from llm.parts import Text then Text.system("..."),
Text.user("..."). Combined with role classmethods this is very
concise. Notes the Attachment/ToolCall name collision issue.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add notes about: requiring response.add_tool_call() alongside StreamEvents
for tool calls, yield from limitation in async generators, filtering empty
text chunks, and astream_events() vs stream_events() for async.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Covers: importing StreamEvent, converting yield str to yield
StreamEvent for text/reasoning/tool calls/server-side tools, part
index tracking, handling opaque reasoning tokens, testing patterns,
and the special case of plugins that inherit from built-in models.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Documents the " " space character that gets persisted as a real
TextPart when the Anthropic plugin works around a text-joining bug
in tool call chains. Lists four options to fix, recommends moving
the spacing concern to the display layer.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Documents findings from all three plugin implementations: OpenAI
(set_usage mutation, opaque reasoning), Anthropic (streamed thinking,
server-side tools), Gemini (opaque thinking, complete parts per chunk).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Documents design decisions, live testing observations against
gpt-5.4-mini, and things to watch for in Phase 3.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>