Four open-source assemblers implement the specification, in Python, TypeScript, Go and Rust. Each is released at its repository's draft-release tag, which moves with the draft. The table shows how many of the published conformance cases each one passes.
Three very different requests, each built from only the slots it needs. Pull a slot out or squeeze the budget, and see what degrades first.
An illustration, not a model run: sizes are typical for each slot, not counts of the line shown. Remove the instructions or the query and the assembler refuses, as R-4 requires, with no payload but a trace of what it decided (R-17).
{{ ucSymptom }}
{{ ucNote }}
Your framework, or your own loop, still calls the tools, keeps the state and retries. The assembler decides what each model call holds. Here is that step in the example app. It has no framework, so answer() is the whole loop.
def answer(conversation: Conversation, provider: str, model: str | None, *, out: TextIO = sys.stdout, runs: Path = RUNS, record: str | Path | None = None) -> str | None: document, result = build_request(conversation) save(document, result, runs) if record: write(Path(record), document, result) # --record: this assembly, beside the conversation and the reply report(document, result, out) if result.payload is None: return None # refused: there is no payload, so nothing can reach a model (R-17) payload = json.loads(result.payload) # cwa-messages/v1: {"system": [...], "tools": [...], "messages": [one user message]} system = [entry["text"] for entry in payload["system"]] messages = payload["messages"] if provider == "none": cli.show_request(system, messages, out) return None return providers.ask(provider, model, system, messages, context.reserved_output())
Assemble, stop if it refused, then pass the payload to the SDK as it is. In a framework, the same steps go where it builds each model call's input.
The SDK call, with the official Anthropic and OpenAI SDKs: providers.py →
The assembler is being built against real routes. If yours has a constraint the spec does not cover, open an issue before the API freezes.
{{ leavingLead }}
{{ leavingNote }}
{{ leavingCountdown }}