Integration matrix
Real end-to-end pass / xfail state for
11 first-class agents + 3 frameworks × 4 Tier-1 model families
= 56 cells. Transcribed from
tests/integrations/README.md
as of 0.10.3 (post-#1047 Aider + post-#1048 OpenHands + post-#1051
harmony stop-scope fix).
rapid-mlx serve, made a
real tool call (or real file rewrite for CLI drivers), and
asserted a semantic outcome — not just that the wire responded.
PydanticAI and smolagents cells additionally assert the tool
implementation itself was invoked (closure counter check).
Totals across all 4 families
56 cells run → 46 PASS · 10 XFAIL · 0 FAIL. All 10 XFAILs are documented root-caused failures (9 architectural, 1 server-side), not test-harness flakes.
Cheap-alias policy
The matrix boots the smallest viable alias per family so the per-process resident footprint stays under the M3 Ultra OOM budget (operator services baseline + matrix + Metal overhead ≤ 150 GB). Boot aliases used for the 2026-07-07 pilot:
| Family | Boot alias | Rationale |
|---|---|---|
| Qwen 3.6 | qwen3.6-35b-8bit (MoE, 3 B active) |
The full 3.6 flagship — pilot proved boot in ~15 s, native MTP head. |
| Gemma 4 | gemma-4-31b-4bit (dense) |
~10 s boot; matrix cheap-alias for text-only Gemma 4. |
| DeepSeek | deepseek-r1-32b-4bit (R1-distilled Qwen 32B) |
R1-Distill sits at ~16 GB and exercises the same deepseek tool-call + deepseek_r1 reasoning parsers V4-Flash would have. Every V4-Flash quant is > 96 GB — full V4 coverage tracked in #1041. |
| gpt-oss | gpt-oss-120b-mxfp4-q8 (MoE) |
~15 s boot; harmony-native parser pair. |
Agent × Family matrix
11 agents × 4 families = 44 cells.
| Agent | Qwen 3.6 | Gemma 4 | DeepSeek | gpt-oss |
|---|---|---|---|---|
codex-cli /v1/responses |
✅ | ✅ | ✅ | ✅ |
claude-code /v1/messages |
✅ | ✅ | ✅ | ✅ |
| opencode | ✅ | ✅ | XFAIL (arch) | ✅ |
| qwen-code | ✅ | ✅ | XFAIL (arch) | ✅ |
| openhands Docker E2E | ✅ | ✅ | ✅ | XFAIL (server) |
| hermes-agent | ✅ | ✅ | XFAIL (arch) | ✅ |
| aider real bash-CLI harness | ✅ | ✅ | ✅ | ✅ |
| kilo-code | ✅ | ✅ | XFAIL (arch) | ✅ |
| copilot wire smoke | ✅ | ✅ | XFAIL (arch) | ✅ |
| droid wire smoke | ✅ | ✅ | XFAIL (arch) | ✅ |
| kimi-code wire smoke | ✅ | ✅ | XFAIL (arch) | ✅ |
Framework × Family matrix
3 frameworks × 4 families = 12 cells.
| Framework | Qwen 3.6 | Gemma 4 | DeepSeek | gpt-oss |
|---|---|---|---|---|
| LangChain + LangGraph | ✅ | ✅ | XFAIL (arch) | ✅ |
| PydanticAI | ✅ | ✅ | XFAIL (arch) | ✅ |
| smolagents | ✅ | ✅ | ✅ | ✅ |
XFAIL reasons (root-caused)
XFAIL (arch) — DeepSeek R1-Distill tool-emission gap
9 DeepSeek tool-call cells (7 agents + LangChain + PydanticAI)
strict-XFAIL on the deepseek-r1-32b-4bit boot alias.
R1's post-training was reasoning-only per DeepSeek's own paper
(arXiv 2501.12948 §2.3.3), and distillation into Qwen 32B lost the
base model's tool-emission behavior. The refusal
"I cannot provide the current weather in Tokyo as I cannot
access the get_weather tool." reproduces deterministically
at both 4bit (16 GB) and 8bit (34.8 GB) quant levels — not a
rapid-mlx parser bug, not a quant artifact.
Text-only cells (CodexCLI + ClaudeCode) and smolagents' code-execution
routing PASS on the same booted server, proving the wire is healthy.
Aider and OpenHands PASS too because they parse text-action tags out
of plain-text LLM output (SEARCH/REPLACE + <execute_ipython>),
not via OpenAI tool_calls. Full tool-trained coverage needs
V4-Chat / V4-Coder / V4-Flash weights, all > 96 GB — tracked in
follow-up #1041.
XFAIL (server) — gpt-oss + OpenHands, resolved in-flight
One cell — gpt-oss on OpenHands — XFAILs on the historical scoping
bug in the harmony parser: user-supplied stop=['', ...]
applied against the raw token stream across both channels, so the
model's analysis-channel CoT (which mentions
</execute_ipython> while reasoning about the action)
triggered a premature stop before the final channel emitted visible
content.
Root-caused empirically inside the OpenHands container
(conftest.py::_GPTOSS_OPENHANDS_XFAIL_REASON block).
Server-side fix landed in
PR #1051
(harmony parser now restricts user-supplied stops to final-channel
content). The matrix's XFAIL cell will flip PASS once the harness
re-runs against a rapid-mlx build that includes #1051 — the source
README hasn't been re-transcribed yet.
Reproduce locally
Boot the server for a family shard first, then run one matrix:
$ rapid-mlx serve qwen3.6-35b-8bit \ --tool-call-parser hermes --enable-auto-tool-choice # All 44 agent cells; only the family matching the running server passes, # the other three skip (non-strict) or fail (strict). $ pytest tests/integrations/test_agents_matrix.py -v # Strict CI — per-family shard (this is the intended workflow). $ RAPID_MLX_MATRIX_STRICT=1 RAPID_MLX_AGENT_MATRIX_FAMILY=qwen36 \ pytest tests/integrations/test_agents_matrix.py
Environment overrides
| Variable | Default | Purpose |
|---|---|---|
RAPID_MLX_BASE_URL | http://localhost:8000/v1 | Where matrix clients point. |
RAPID_MLX_AGENT_MATRIX_FAMILY | (all) | Restrict to qwen36 / gemma4 / deepseek / gptoss. |
RAPID_MLX_MATRIX_STRICT | 0 | If 1, missing-server → fail (default: skip). |