diff --git a/.env.example b/.env.example index 278f5bf..097a384 100644 --- a/.env.example +++ b/.env.example @@ -5,7 +5,8 @@ # CLI / local LLM provider keys (openai-http backend, quality:live harness) # Lookup order: PATINA_API_KEY first, then the provider-specific key # (src/auth.js HTTP_KEY_ENV_VARS). `--provider ` presets live in -# src/providers.js: openai, gemini, groq, kimi, moonshot, together. +# src/providers.js: openai, gemini, groq, kimi, moonshot, together, +# minimax, minimax-cn. # --------------------------------------------------------------------------- # PATINA_API_KEY= # generic key, wins over provider-specific vars # OPENAI_API_KEY= # default openai-http backend (gpt-5.5) @@ -14,6 +15,7 @@ # TOGETHER_API_KEY= # --provider together # KIMI_API_KEY= # --provider kimi (kimi-k2.5, api.moonshot.ai) # MOONSHOT_API_KEY= # --provider moonshot (same endpoint as kimi) +# MINIMAX_API_KEY= # --provider minimax or minimax-cn (MiniMax-M3) # PATINA_API_KEY_FILE= # or read any key from a file (recommended for CI) # Local subscription CLIs (claude / codex / gemini / kimi) need no key here — diff --git a/CHANGELOG.md b/CHANGELOG.md index c4d19cc..8d2944d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,12 @@ All notable changes to patina. Dates are release dates (YYYY-MM-DD). Semver rationale: patch | minor | major — explain whether this changes patterns, schemas, CLI behavior, or docs only. ``` +## Unreleased + +### Added + +- MiniMax provider presets for the CLI: `--provider minimax` (global, `api.minimax.io`) and `--provider minimax-cn` (China, `api.minimaxi.com`), both defaulting to `MiniMax-M3` on the shared `MINIMAX_API_KEY`. Reimplements community PR #667 by @octo-patch on the current codebase. + ## 7.0.0 — 2026-08-04 **Removes the retired iterative rewrite product contract, gives scoring and verification settings neutral ownership, and preserves the comparator only as unsupported research.** diff --git a/docs/operations/v6.4-preflight-hold.json b/docs/operations/v6.4-preflight-hold.json index 79f6e5d..d1191ca 100644 --- a/docs/operations/v6.4-preflight-hold.json +++ b/docs/operations/v6.4-preflight-hold.json @@ -131,12 +131,28 @@ "defaultModel": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", "freeTier": true, "note": "Free models available (suffix \"-Free\"). Get a key at https://api.together.xyz/settings/api-keys" + }, + "minimax": { + "name": "minimax", + "baseURL": "https://api.minimax.io/v1", + "apiKeyEnv": "MINIMAX_API_KEY", + "defaultModel": "MiniMax-M3", + "freeTier": false, + "note": "MiniMax global OpenAI-compatible API. Set MINIMAX_API_KEY or PATINA_API_KEY." + }, + "minimax-cn": { + "name": "minimax-cn", + "baseURL": "https://api.minimaxi.com/v1", + "apiKeyEnv": "MINIMAX_API_KEY", + "defaultModel": "MiniMax-M3", + "freeTier": false, + "note": "MiniMax China OpenAI-compatible API. Set MINIMAX_API_KEY or PATINA_API_KEY." } }, "sourceHashes": { - ".env.example": "29b1cdc48b5c14ed0c84716ad9ca42ba23001b9f40f99efb78c2c368180e7e5a", + ".env.example": "9bd63e3d6caeb2fb9e94639145ab876ac3b79c63c6e8e7509cdb7fb07ef30132", "src/model-defaults.js": "c568977fcac8ea44d5387a8a8745b062675ec94d73d39ce528c492ad35f87176", - "src/providers.js": "92415eacaf87da2d0f2aed7db97feeb98b8b087adfe584a02c4478353b807d90", + "src/providers.js": "04c3c38f9a3a867eb632670cd5cf28f1d7b45d910eb6993a807dfdc6a4866d36", "src/web-rewrite-contract.js": "be433e8260e452028eb53b5c1aed0935a4150cd669ec2d5e826302219df22b9a", "playground/launch-config.js": "4d19fc8ce36651f73f94d80bbcd108a2ccbb50fa3fc25b54d75f193b42ac6bf4", "vercel.json": "37a54c0850db54e80eec963c570d4b8a047fcfb4bf56d1a133e5a3934b28260e", @@ -151,7 +167,7 @@ "docs/operations/pay-b-binding-20260723.json": "96eb8e0aba9fcb4ce67dd356bd35aaf678d8abea96a7ec134218eab7cd20f132", "docs/operations/pay-b-binding-polar-20260729.json": "471c9035a04ce5c2c76d7e5b4d595054191d513fa007455a02c9b123d0811ac5", "docs/operations/pay-live-runtime-polar-20260729.json": "384912dca4576f1c3f8d653f39c3d9a8cb19f8f8acc1a91ac2bc36fdf10e7a9c", - "tests/e2e/providers.test.js": "47958be678e9bbfd06bcdd849ec0df37ed765f886e245b7b528e7d596b6d9dfe", + "tests/e2e/providers.test.js": "837177c5c73b46f29ce93c8dbdf6ca51045d9958ff5ea9ffcff8fcdaa869ad27", "tests/unit/backend-model-defaults.test.js": "908dd9b06a9d5305ad28b50007d6428435b0b6b7019d6a2210aff813bfb9cf3d", "tests/unit/web-deploy-invariants.test.js": "2aecb9068c04999eaf964766cdc1e0c3a551f58ecfa54a0ade8802f1b8f4f296", "tests/unit/web-rewrite-contract.test.js": "2980f555bb53e7c8d93a74d60dc096adadfd1c7d07fd70f55de1670959219c13", diff --git a/playground/chatgpt.css b/playground/chatgpt.css index 3352618..1b0711a 100644 --- a/playground/chatgpt.css +++ b/playground/chatgpt.css @@ -75,7 +75,7 @@ a { color: inherit; } .nav__links { display: flex; align-items: center; gap: 20px; margin-left: 14px; } .nav__links a { font-size: 15px; color: var(--text-dim); text-decoration: none; } .nav__links a:hover { color: var(--text); } -.nav__end { margin-left: auto; display: flex; align-items: center; gap: 8px; flex-wrap: wrap; justify-content: flex-end; } +.nav__end { margin-left: auto; display: flex; align-items: center; gap: 14px; flex-wrap: wrap; justify-content: flex-end; row-gap: 8px; } .nav__byok { flex-basis: 100%; display: flex; align-items: center; justify-content: flex-end; gap: 10px; flex-wrap: wrap; margin-top: 2px; } .nav__byok[hidden] { display: none; } .nav__pro { flex-basis: 100%; display: flex; align-items: center; justify-content: flex-end; gap: 10px; flex-wrap: wrap; margin-top: 2px; } @@ -83,7 +83,7 @@ a { color: inherit; } .ctl { display: flex; align-items: center; gap: 6px; } .ctl[hidden] { display: none; } -.ctl__label { font-size: 11px; color: var(--text-faint); text-transform: uppercase; letter-spacing: .04em; } +.ctl__label { font-size: 11px; color: var(--text-faint); text-transform: uppercase; letter-spacing: .04em; white-space: nowrap; } .ctl__select, .ctl__input { background: var(--bg-elev); color: var(--text); border: 1px solid var(--border); border-radius: 8px; @@ -104,8 +104,6 @@ a { color: inherit; } padding: 8px 16px; border-radius: 9999px; font-size: 14px; font-family: inherit; text-decoration: none; cursor: pointer; border: 1px solid transparent; } -.btn--gh { background: #ffffff; color: #0d1117; border-color: #ffffff; box-shadow: var(--inset); } -.btn--gh:hover { opacity: .88; } .btn--ghost { background: transparent; color: var(--text); border-color: var(--border-strong); } /* ───────── landing ───────── */ @@ -458,6 +456,12 @@ details.foldout > summary:focus-visible, } /* ───────── responsive ───────── */ + +/* Mid widths: drop the whole control cluster onto its own row instead of + letting a single trailing select orphan-wrap next to the nav links. */ +@media (max-width: 1180px) { + .nav__end { flex-basis: 100%; justify-content: flex-start; } +} @media (max-width: 900px) { /* Keep Docs/Examples/Benchmark/Ethics reachable on small screens: instead of hiding the links, wrap them onto their own full-width scrollable row. */ diff --git a/playground/index.html b/playground/index.html index ef09d80..f12470a 100644 --- a/playground/index.html +++ b/playground/index.html @@ -60,10 +60,6 @@ - - - GitHub -