diff options
| author | Adam Malczewski <[email protected]> | 2026-04-30 20:24:33 +0900 |
|---|---|---|
| committer | Adam Malczewski <[email protected]> | 2026-04-30 20:24:33 +0900 |
| commit | 262aa7395c50b449ce0a897f28b1e33c319f5dc7 (patch) | |
| tree | 2ccc7c7f6402e76aea6b8788046215e82650fdfc /.rules/plan/17-20-readme-changelog-examples.md | |
| parent | 1e7a273bda744f93f230d21df895b54d2a81ce15 (diff) | |
| download | dispatch-adapter-minimax-main.tar.gz dispatch-adapter-minimax-main.zip | |
Diffstat (limited to '.rules/plan/17-20-readme-changelog-examples.md')
| -rw-r--r-- | .rules/plan/17-20-readme-changelog-examples.md | 225 |
1 files changed, 225 insertions, 0 deletions
diff --git a/.rules/plan/17-20-readme-changelog-examples.md b/.rules/plan/17-20-readme-changelog-examples.md new file mode 100644 index 0000000..55653d5 --- /dev/null +++ b/.rules/plan/17-20-readme-changelog-examples.md @@ -0,0 +1,225 @@ +# Phase 17 — README, CHANGELOG, and examples + +**Estimated time:** ~20 minutes +**Touches:** +`README.md`, `CHANGELOG.md`, `AGENTS.md`, +`examples/ask_standing_sitting.rb`, +`examples/usage_per_token.rb`, +`bin/setup`, `bin/console`, `bin/install`, `bin/check`. + +## Goal + +Replace all remaining user-facing documentation and examples so the gem +ships as a clean MiniMax adapter. By this phase the code and tests are +already clean; this is documentation polish. + +## Steps + +### 1. Rewrite `README.md` + +Top to bottom rewrite. Required sections: + +- **Title:** `# dispatch-adapter-minimax` +- **One-paragraph intro:** What it is. "Implements + `Dispatch::Adapter::Base` for MiniMax via the Anthropic-compatible + /v1/messages endpoint. Works with the MiniMax Token Plan." +- **Installation:** + ```ruby + gem "dispatch-adapter-minimax" + ``` +- **Configuration:** + - The three API key resolution methods (constructor arg, env var, + file). + - Default base URL. + - Default model. +- **Quick start:** A minimal working snippet showing how to chat. +- **Supported models:** The 7-model table. +- **Supported parameters:** A table mirroring MiniMax's compat docs + (model, messages, max_tokens, stream, system, temperature, + tool_choice, tools, top_p, metadata, thinking — all supported; + top_k, stop_sequences, service_tier, mcp_servers, + context_management, container — silently stripped). +- **Unsupported content blocks:** Image and document blocks raise + `ArgumentError` at request-build time. +- **Cache control:** Documented as best-effort; MiniMax docs do not + list cache_control as a recognized field, so any caching benefit is + upstream-dependent. +- **Cost / quotas:** `Usage#cost.total_cost` is always `0.0` because + Token Plan is request-quota; no per-token rate applies. +- **Running tests:** `bundle exec rubocop --autocorrect-all && bundle exec rspec`. +- **Live smoke testing:** Brief note that smoke testing requires a + real Token Plan API key; not part of CI. + +DO NOT carry over any Claude / Anthropic / OAuth / PKCE / Stainless / +Claude Code language. The README must read as if MiniMax was always +the target. + +### 2. Rewrite `CHANGELOG.md` + +```markdown +# Changelog + +## 0.1.0 (unreleased) + +- Initial release. +- MiniMax adapter implementing `Dispatch::Adapter::Base` via the + Anthropic-compatible `/v1/messages` endpoint at + `https://api.minimax.io/anthropic`. +- Supports MiniMax-M2.7 (default), MiniMax-M2.7-highspeed, + MiniMax-M2.5, MiniMax-M2.5-highspeed, MiniMax-M2.1, + MiniMax-M2.1-highspeed, MiniMax-M2. +- Token Plan static API key auth (constructor arg, ENV, or file). +- Streaming and non-streaming `/v1/messages` calls. +- `count_tokens` and `list_models` (best-effort; degrade gracefully if + the upstream endpoint is unavailable). +- Strict-tool-schema fallback retry on `400 grammar/schema too large`. +- Image and document content blocks raise `ArgumentError` + (unsupported by MiniMax). +- `Usage#cost` is always `0.0` (Token Plan is request-quota). +``` + +### 3. Rewrite `AGENTS.md` + +Top to bottom. Mirror the Claude AGENTS.md structure but for MiniMax. +Required sections: + +- **Purpose:** "Implements `Dispatch::Adapter::Base` for MiniMax via + their Anthropic-compatible /v1/messages endpoint. Targets the Token + Plan static API key flow." +- **File map:** updated tree: + ```text + lib/dispatch/adapter/minimax.rb + lib/dispatch/adapter/minimax/ + version.rb + errors.rb + key_store.rb + headers.rb + pricing_table.rb + model_catalog.rb + request_builder.rb + request_builder/messages.rb + request_builder/tools.rb + request_builder/cache_control.rb + request_builder/thinking.rb + response_builder.rb + sse_parser.rb + stream_collector.rb + http_client.rb + data/minimax_pricing.json + ``` +- **Key design decisions:** + - No OAuth (Token Plan is static-key). + - `temperature` validated to `(0.0, 1.0]` per MiniMax docs. + - Image / document content rejected at request-build. + - Strict-tool-schema fallback uses a broadened regex. + - `Usage#cost` always 0.0. +- **Constants to track:** None beyond DEFAULT_BASE_URL / DEFAULT_MODEL. + MiniMax has no equivalent of the Claude Code version + Stainless + version drift. +- **Running tests:** Same as README. + +### 4. Rewrite the examples + +`examples/ask_standing_sitting.rb` and +`examples/usage_per_token.rb` (rename the latter — there is no +per-token usage to demonstrate). + +DELETE `examples/usage_per_token.rb`. Replace with +`examples/list_models.rb` (or similar) which shows how to call +`adapter.list_models` and prints the resulting catalog. + +For `examples/ask_standing_sitting.rb`: rewrite as a minimal MiniMax +hello-world. Example: + +```ruby +#!/usr/bin/env ruby +# frozen_string_literal: true +# +# Minimal MiniMax adapter usage example. +# Requires MINIMAX_API_KEY in env, or ~/.config/dispatch/minimax_api_key. + +$LOAD_PATH.unshift(File.expand_path("../lib", __dir__)) +require "dispatch/adapter/minimax" + +adapter = Dispatch::Adapter::MiniMax.new(model: "MiniMax-M2.7", thinking: "high") + +response = adapter.chat( + [Dispatch::Adapter::Message.new( + role: "user", + content: [Dispatch::Adapter::TextBlock.new(text: "Say hi in one word.")] + )], + system: "You are concise." +) + +response.content.each do |block| + case block + when Dispatch::Adapter::TextBlock then puts "[text] #{block.text}" + when Dispatch::Adapter::ThinkingBlock then puts "[thinking] #{block.thinking}" + end +end + +puts "stop_reason: #{response.stop_reason}" +puts "tokens: #{response.usage.input_tokens} in / #{response.usage.output_tokens} out" +``` + +DELETE `usage_per_token_error.log` if it still exists in the gem root. + +### 5. Update `bin/setup`, `bin/install`, `bin/check`, `bin/console` + +These bin scripts probably reference Claude. Rename references and +update any `require` statement to point at `dispatch/adapter/minimax`. + +If a bin script does something Claude-specific that has no MiniMax +analogue (e.g. an OAuth login helper), DELETE the script. + +### 6. Final cleanup + +- Delete `usage_per_token_error.log` from the gem root if present. +- Verify `Gemfile.lock` regenerates cleanly via `bundle install`. If + the lock is stale, delete it and let `run_tests` rebuild it via + `bundle install` (the test gate runs bundler). + +## Acceptance criteria + +- `README.md`, `CHANGELOG.md`, `AGENTS.md` are all rewritten and + contain ZERO Claude / Anthropic / OAuth / Claude Code references. +- `grep -rn 'Claude\|claude\|anthropic\|Anthropic' README.md CHANGELOG.md AGENTS.md examples/ bin/` + returns ZERO matches (case-sensitive — except that the words + "Anthropic-compatible" describing MiniMax's choice of wire format + ARE allowed in the README and AGENTS.md only as a factual + description; if you keep them, document why with a comment like + "MiniMax exposes an Anthropic-compatible /v1/messages endpoint" and + refine the grep accordingly). +- `examples/` contains no broken Ruby — every script `bundle exec ruby + examples/<name>.rb` should at least load (it's OK if it then fails + because no API key is available — that proves the require chain + works). +- `bin/check` (or equivalent) runs cleanly. +- `bundle exec rubocop --autocorrect-all` exits 0. +- `bundle exec rspec` exits 0 with no skipped or pending examples. + +## Verification + +Run `run_tests` with `project_path=reference/dispatch-adapter-minimax`. + +This is the FINAL phase. The gate is strict: + +- Both rubocop and rspec must exit 0. +- No examples may be skipped or pending. +- Documentation greps above must be clean. + +After `ask_for_next_plan` is called, the runner should report no +remaining plans and the agent should end its turn. + +## Post-plan manual steps (NOT for the agent) + +The user will smoke-test against a live MiniMax Token Plan key: + +1. `export MINIMAX_API_KEY=<real key>` +2. `cd reference/dispatch-adapter-minimax && bundle install` +3. `ruby examples/<hello>.rb` — expect a real response. +4. Verify `count_tokens` and `list_models` either work or degrade + gracefully. +5. Verify `cache_control` blocks do not produce 400 errors. +6. If any of those fail, file an issue describing the wire shape and + we'll add a follow-up plan. |
