Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions docs/examples/chat-with-multimodal.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,9 @@ turn's `render()` injects the grown history into the placeholder.

- [`ChatPrompt`](../concepts/prompts.md) with
[`ContentSegment`](../concepts/prompts.md) and
[`PlaceholderSegment`](../concepts/prompts.md) (proposal 0046,
spec v0.38.0). The placeholder is how multi-turn chat history
shapes get injected at render time.
[`PlaceholderSegment`](../concepts/prompts.md). The placeholder
is how multi-turn chat history shapes get injected at render
time.
- The same chat template can carry an
[`ImageURLBlockTemplate`](../concepts/prompts.md) when the
current user turn includes an image. The `content` field on the
Expand Down
7 changes: 3 additions & 4 deletions docs/examples/fan-out-with-retry.md
Original file line number Diff line number Diff line change
Expand Up @@ -59,10 +59,9 @@ normally. The `append` reducer's no-double-merge guarantee holds
across resume because `completed` is a one-shot accumulator state.

Composition with `instance_middleware` (retry): on resume, an
instance's `attempt_index` resets to 0 (a fresh retry budget) per
spec graph-engine §6's resume semantics. So a retry-exhausted
instance whose `in_flight` state was saved gets a fresh budget on
the resumed run.
instance's `attempt_index` resets to 0 (a fresh retry budget). So
a retry-exhausted instance whose `in_flight` state was saved gets
a fresh budget on the resumed run.

See [Resume semantics in fan-out](../concepts/fan-out.md#resume-semantics)
and the [Checkpointing concept page](../concepts/checkpointing.md)
Expand Down
2 changes: 1 addition & 1 deletion docs/examples/langfuse-observability.md
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ Trace id=01234567-89ab-...

- **Trace name = entry node name** by default. The caller-supplied
invocation-label path (a per-`invoke()` argument that overrides the
default) ships with proposal 0034's caller-metadata work.
default) is part of the caller-metadata API.
- **Span observation per node.** `answer_briefing` is the only node
here; a multi-node graph would produce a tree of nested Span
observations under the Trace.
Expand Down
14 changes: 7 additions & 7 deletions docs/examples/production-observability.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,10 @@ answer. The interesting part is the observability wiring:
- Both observers consume the same `NodeEvent` stream
independently; node code never knows there are two backends.
- `LangfuseObserver` carries `trace_input_from_state` and
`trace_output_from_state` caller hooks (proposal 0043 §8.4.1)
that derive domain dicts like `{"question": ...}` /
`{"answer": ..., "model": ...}` from State, instead of letting
the observer dump the raw State object.
`trace_output_from_state` caller hooks that derive domain dicts
like `{"question": ...}` / `{"answer": ..., "model": ...}` from
State, instead of letting the observer dump the raw State
object.
- `TimingMiddleware` (canonical, from
`openarmature.graph.middleware`) wraps the respond node. An
`on_complete` async callback receives a `TimingRecord` and
Expand All @@ -42,14 +42,14 @@ sees the same logical events represented two ways.
## What it teaches

- **Two observers on one graph**
([proposal 0031 + the no-double-export claim](../concepts/observability.md)).
([no double-export between them](../concepts/observability.md)).
Each consumes the `NodeEvent` stream independently; the engine
fans events out to all attached observers. Production deployments
often run both: OTel for infrastructure-side correlation
(logs, distributed tracing across services), Langfuse for
LLM-aware generation rendering.
- **Caller hooks for `trace.input` / `trace.output`**
([proposal 0043, observability §8.4.1](../concepts/observability.md)).
([deriving domain dicts from State](../concepts/observability.md)).
Without the hooks the Langfuse observer either omits the field
(`disable_state_payload=True` default) or dumps the raw State
(when `disable_state_payload=False`). The hooks let you return a
Expand All @@ -63,7 +63,7 @@ sees the same logical events represented two ways.
callback fires inline before the chain's result reaches the
engine; keep it fast (queue work, defer I/O).
- **`invoke(metadata={...})` propagation across observers**
([proposal 0034 + 0041 reserved keys](../concepts/observability.md)).
([caller metadata and reserved keys](../concepts/observability.md)).
One call site, both backends pick it up: OTel attaches each entry
as `openarmature.user.<key>` cross-cutting span attribute,
Langfuse merges as top-level `trace.metadata` keys plus
Expand Down