these 3 derivations will be built: /nix/store/066jigk7f292h4k7gy1cj4v2psdfcwam-treefmt.toml.drv /nix/store/v1nm3ryg4bxjfn7zfm0wps499sqkawcn-treefmt.drv /nix/store/xawsg12g2nlff5pfmh7dsq4z2gq4dkm2-treefmt-check.drv building '/nix/store/066jigk7f292h4k7gy1cj4v2psdfcwam-treefmt.toml.drv' treefmt.toml> structuredAttrs is enabled building '/nix/store/v1nm3ryg4bxjfn7zfm0wps499sqkawcn-treefmt.drv' building '/nix/store/xawsg12g2nlff5pfmh7dsq4z2gq4dkm2-treefmt-check.drv' treefmt-check> treefmt v2.5.0traversed 183 files treefmt-check> emitted 106 files for processing treefmt-check> formatted 106 files (6 changed) in 13.79s treefmt-check> M examples/bramble-coding-agent/src/bramble_coding_agent/tools.clj treefmt-check> M examples/minimal-coding-agent/src/minimal_coding_agent/tools.clj treefmt-check> M src/ol/llx/ai/impl/models_generated.cljc treefmt-check> M test/ol/llx/ai/adapters/anthropic_messages_test.cljc treefmt-check> M test/ol/llx/ai/adapters/google_generative_ai_test.cljc treefmt-check> M test/ol/llx/ai/adapters/openai_responses_test.cljc treefmt-check> diff --git a/examples/bramble-coding-agent/src/bramble_coding_agent/tools.clj b/examples/bramble-coding-agent/src/bramble_coding_agent/tools.clj treefmt-check> index c4ff710..8e85de8 100644 treefmt-check> --- a/examples/bramble-coding-agent/src/bramble_coding_agent/tools.clj treefmt-check> +++ b/examples/bramble-coding-agent/src/bramble_coding_agent/tools.clj treefmt-check> @@ -189,12 +189,12 @@ treefmt-check> (let [f (io/file path)] treefmt-check> (when-not (.exists f) treefmt-check> (throw (ex-info (str "File not found: " path) {:type :not-found}))) treefmt-check> - (let [raw (slurp f) treefmt-check> - {:keys [bom text]} (strip-bom raw) treefmt-check> - line-ending (detect-line-ending text) treefmt-check> - norm-content (normalize-to-lf text) treefmt-check> - norm-old (normalize-to-lf oldText) treefmt-check> - norm-new (normalize-to-lf newText) treefmt-check> + (let [raw (slurp f) treefmt-check> + {:keys [bom text]} (strip-bom raw) treefmt-check> + line-ending (detect-line-ending text) treefmt-check> + norm-content (normalize-to-lf text) treefmt-check> + norm-old (normalize-to-lf oldText) treefmt-check> + norm-new (normalize-to-lf newText) treefmt-check> {:keys [found index match-length content-for-replacement]} treefmt-check> (fuzzy-find-text norm-content norm-old)] treefmt-check> (when-not found treefmt-check> diff --git a/examples/minimal-coding-agent/src/minimal_coding_agent/tools.clj b/examples/minimal-coding-agent/src/minimal_coding_agent/tools.clj treefmt-check> index 28979e4..77e62a3 100644 treefmt-check> --- a/examples/minimal-coding-agent/src/minimal_coding_agent/tools.clj treefmt-check> +++ b/examples/minimal-coding-agent/src/minimal_coding_agent/tools.clj treefmt-check> @@ -199,12 +199,12 @@ treefmt-check> (let [f (io/file path)] treefmt-check> (when (not (.exists f)) treefmt-check> (throw (ex-info (str "File not found: " path) {:type :not-found}))) treefmt-check> - (let [raw (slurp f) treefmt-check> - {:keys [bom text]} (strip-bom raw) treefmt-check> - line-ending (detect-line-ending text) treefmt-check> - norm-content (normalize-to-lf text) treefmt-check> - norm-old (normalize-to-lf oldText) treefmt-check> - norm-new (normalize-to-lf newText) treefmt-check> + (let [raw (slurp f) treefmt-check> + {:keys [bom text]} (strip-bom raw) treefmt-check> + line-ending (detect-line-ending text) treefmt-check> + norm-content (normalize-to-lf text) treefmt-check> + norm-old (normalize-to-lf oldText) treefmt-check> + norm-new (normalize-to-lf newText) treefmt-check> {:keys [found index match-length content-for-replacement]} treefmt-check> (fuzzy-find-text norm-content norm-old)] treefmt-check> (when (not found) treefmt-check> diff --git a/src/ol/llx/ai/impl/models_generated.cljc b/src/ol/llx/ai/impl/models_generated.cljc treefmt-check> index b06ce38..edaf583 100644 treefmt-check> --- a/src/ol/llx/ai/impl/models_generated.cljc treefmt-check> +++ b/src/ol/llx/ai/impl/models_generated.cljc treefmt-check> @@ -25,71 +25,71 @@ treefmt-check> :provider :anthropic, treefmt-check> :context-window 200000}, treefmt-check> "claude-3-5-sonnet-20240620" treefmt-check> - {:capabilities {:reasoning? false, :input #{:image :text}}, treefmt-check> - :api :anthropic-messages, treefmt-check> - :name "Claude Sonnet 3.5", treefmt-check> - :base-url "https://api.anthropic.com", treefmt-check> - :id "claude-3-5-sonnet-20240620", treefmt-check> + {:capabilities {:reasoning? false, :input #{:image :text}}, treefmt-check> + :api :anthropic-messages, treefmt-check> + :name "Claude Sonnet 3.5", treefmt-check> + :base-url "https://api.anthropic.com", treefmt-check> + :id "claude-3-5-sonnet-20240620", treefmt-check> :cost treefmt-check> {:input 3.0, :output 15.0, :cache-read 0.3, :cache-write 3.75}, treefmt-check> - :max-tokens 8192, treefmt-check> - :provider :anthropic, treefmt-check> - :context-window 200000}, treefmt-check> + :max-tokens 8192, treefmt-check> + :provider :anthropic, treefmt-check> + :context-window 200000}, treefmt-check> "claude-3-5-sonnet-20241022" treefmt-check> - {:capabilities {:reasoning? false, :input #{:image :text}}, treefmt-check> - :api :anthropic-messages, treefmt-check> - :name "Claude Sonnet 3.5 v2", treefmt-check> - :base-url "https://api.anthropic.com", treefmt-check> - :id "claude-3-5-sonnet-20241022", treefmt-check> + {:capabilities {:reasoning? false, :input #{:image :text}}, treefmt-check> + :api :anthropic-messages, treefmt-check> + :name "Claude Sonnet 3.5 v2", treefmt-check> + :base-url "https://api.anthropic.com", treefmt-check> + :id "claude-3-5-sonnet-20241022", treefmt-check> :cost treefmt-check> {:input 3.0, :output 15.0, :cache-read 0.3, :cache-write 3.75}, treefmt-check> - :max-tokens 8192, treefmt-check> - :provider :anthropic, treefmt-check> - :context-window 200000}, treefmt-check> + :max-tokens 8192, treefmt-check> + :provider :anthropic, treefmt-check> + :context-window 200000}, treefmt-check> "claude-3-7-sonnet-20250219" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :anthropic-messages, treefmt-check> - :name "Claude Sonnet 3.7", treefmt-check> - :base-url "https://api.anthropic.com", treefmt-check> - :id "claude-3-7-sonnet-20250219", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :anthropic-messages, treefmt-check> + :name "Claude Sonnet 3.7", treefmt-check> + :base-url "https://api.anthropic.com", treefmt-check> + :id "claude-3-7-sonnet-20250219", treefmt-check> :cost treefmt-check> {:input 3.0, :output 15.0, :cache-read 0.3, :cache-write 3.75}, treefmt-check> - :max-tokens 64000, treefmt-check> - :provider :anthropic, treefmt-check> - :context-window 200000}, treefmt-check> + :max-tokens 64000, treefmt-check> + :provider :anthropic, treefmt-check> + :context-window 200000}, treefmt-check> "claude-3-7-sonnet-latest" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :anthropic-messages, treefmt-check> - :name "Claude Sonnet 3.7 (latest)", treefmt-check> - :base-url "https://api.anthropic.com", treefmt-check> - :id "claude-3-7-sonnet-latest", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :anthropic-messages, treefmt-check> + :name "Claude Sonnet 3.7 (latest)", treefmt-check> + :base-url "https://api.anthropic.com", treefmt-check> + :id "claude-3-7-sonnet-latest", treefmt-check> :cost treefmt-check> {:input 3.0, :output 15.0, :cache-read 0.3, :cache-write 3.75}, treefmt-check> - :max-tokens 64000, treefmt-check> - :provider :anthropic, treefmt-check> - :context-window 200000}, treefmt-check> + :max-tokens 64000, treefmt-check> + :provider :anthropic, treefmt-check> + :context-window 200000}, treefmt-check> "claude-3-haiku-20240307" treefmt-check> - {:capabilities {:reasoning? false, :input #{:image :text}}, treefmt-check> - :api :anthropic-messages, treefmt-check> - :name "Claude Haiku 3", treefmt-check> - :base-url "https://api.anthropic.com", treefmt-check> - :id "claude-3-haiku-20240307", treefmt-check> + {:capabilities {:reasoning? false, :input #{:image :text}}, treefmt-check> + :api :anthropic-messages, treefmt-check> + :name "Claude Haiku 3", treefmt-check> + :base-url "https://api.anthropic.com", treefmt-check> + :id "claude-3-haiku-20240307", treefmt-check> :cost treefmt-check> {:input 0.25, :output 1.25, :cache-read 0.03, :cache-write 0.3}, treefmt-check> - :max-tokens 4096, treefmt-check> - :provider :anthropic, treefmt-check> - :context-window 200000}, treefmt-check> + :max-tokens 4096, treefmt-check> + :provider :anthropic, treefmt-check> + :context-window 200000}, treefmt-check> "claude-3-opus-20240229" treefmt-check> - {:capabilities {:reasoning? false, :input #{:image :text}}, treefmt-check> - :api :anthropic-messages, treefmt-check> - :name "Claude Opus 3", treefmt-check> - :base-url "https://api.anthropic.com", treefmt-check> - :id "claude-3-opus-20240229", treefmt-check> + {:capabilities {:reasoning? false, :input #{:image :text}}, treefmt-check> + :api :anthropic-messages, treefmt-check> + :name "Claude Opus 3", treefmt-check> + :base-url "https://api.anthropic.com", treefmt-check> + :id "claude-3-opus-20240229", treefmt-check> :cost treefmt-check> {:input 15.0, :output 75.0, :cache-read 1.5, :cache-write 18.75}, treefmt-check> - :max-tokens 4096, treefmt-check> - :provider :anthropic, treefmt-check> - :context-window 200000}, treefmt-check> + :max-tokens 4096, treefmt-check> + :provider :anthropic, treefmt-check> + :context-window 200000}, treefmt-check> "claude-3-sonnet-20240229" treefmt-check> {:capabilities {:reasoning? false, :input #{:image :text}}, treefmt-check> :api :anthropic-messages, treefmt-check> @@ -121,303 +121,303 @@ treefmt-check> :provider :anthropic, treefmt-check> :context-window 200000}, treefmt-check> "claude-opus-4-0" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :anthropic-messages, treefmt-check> - :name "Claude Opus 4 (latest)", treefmt-check> - :base-url "https://api.anthropic.com", treefmt-check> - :id "claude-opus-4-0", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :anthropic-messages, treefmt-check> + :name "Claude Opus 4 (latest)", treefmt-check> + :base-url "https://api.anthropic.com", treefmt-check> + :id "claude-opus-4-0", treefmt-check> :cost treefmt-check> {:input 15.0, :output 75.0, :cache-read 1.5, :cache-write 18.75}, treefmt-check> - :max-tokens 32000, treefmt-check> - :provider :anthropic, treefmt-check> - :context-window 200000}, treefmt-check> + :max-tokens 32000, treefmt-check> + :provider :anthropic, treefmt-check> + :context-window 200000}, treefmt-check> "claude-opus-4-1" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :anthropic-messages, treefmt-check> - :name "Claude Opus 4.1 (latest)", treefmt-check> - :base-url "https://api.anthropic.com", treefmt-check> - :id "claude-opus-4-1", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :anthropic-messages, treefmt-check> + :name "Claude Opus 4.1 (latest)", treefmt-check> + :base-url "https://api.anthropic.com", treefmt-check> + :id "claude-opus-4-1", treefmt-check> :cost treefmt-check> {:input 15.0, :output 75.0, :cache-read 1.5, :cache-write 18.75}, treefmt-check> - :max-tokens 32000, treefmt-check> - :provider :anthropic, treefmt-check> - :context-window 200000}, treefmt-check> + :max-tokens 32000, treefmt-check> + :provider :anthropic, treefmt-check> + :context-window 200000}, treefmt-check> "claude-opus-4-1-20250805" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :anthropic-messages, treefmt-check> - :name "Claude Opus 4.1", treefmt-check> - :base-url "https://api.anthropic.com", treefmt-check> - :id "claude-opus-4-1-20250805", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :anthropic-messages, treefmt-check> + :name "Claude Opus 4.1", treefmt-check> + :base-url "https://api.anthropic.com", treefmt-check> + :id "claude-opus-4-1-20250805", treefmt-check> :cost treefmt-check> {:input 15.0, :output 75.0, :cache-read 1.5, :cache-write 18.75}, treefmt-check> - :max-tokens 32000, treefmt-check> - :provider :anthropic, treefmt-check> - :context-window 200000}, treefmt-check> + :max-tokens 32000, treefmt-check> + :provider :anthropic, treefmt-check> + :context-window 200000}, treefmt-check> "claude-opus-4-20250514" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :anthropic-messages, treefmt-check> - :name "Claude Opus 4", treefmt-check> - :base-url "https://api.anthropic.com", treefmt-check> - :id "claude-opus-4-20250514", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :anthropic-messages, treefmt-check> + :name "Claude Opus 4", treefmt-check> + :base-url "https://api.anthropic.com", treefmt-check> + :id "claude-opus-4-20250514", treefmt-check> :cost treefmt-check> {:input 15.0, :output 75.0, :cache-read 1.5, :cache-write 18.75}, treefmt-check> - :max-tokens 32000, treefmt-check> - :provider :anthropic, treefmt-check> - :context-window 200000}, treefmt-check> + :max-tokens 32000, treefmt-check> + :provider :anthropic, treefmt-check> + :context-window 200000}, treefmt-check> "claude-opus-4-5" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :anthropic-messages, treefmt-check> - :name "Claude Opus 4.5 (latest)", treefmt-check> - :base-url "https://api.anthropic.com", treefmt-check> - :id "claude-opus-4-5", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :anthropic-messages, treefmt-check> + :name "Claude Opus 4.5 (latest)", treefmt-check> + :base-url "https://api.anthropic.com", treefmt-check> + :id "claude-opus-4-5", treefmt-check> :cost treefmt-check> {:input 5.0, :output 25.0, :cache-read 0.5, :cache-write 6.25}, treefmt-check> - :max-tokens 64000, treefmt-check> - :provider :anthropic, treefmt-check> - :context-window 200000}, treefmt-check> + :max-tokens 64000, treefmt-check> + :provider :anthropic, treefmt-check> + :context-window 200000}, treefmt-check> "claude-opus-4-5-20251101" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :anthropic-messages, treefmt-check> - :name "Claude Opus 4.5", treefmt-check> - :base-url "https://api.anthropic.com", treefmt-check> - :id "claude-opus-4-5-20251101", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :anthropic-messages, treefmt-check> + :name "Claude Opus 4.5", treefmt-check> + :base-url "https://api.anthropic.com", treefmt-check> + :id "claude-opus-4-5-20251101", treefmt-check> :cost treefmt-check> {:input 5.0, :output 25.0, :cache-read 0.5, :cache-write 6.25}, treefmt-check> - :max-tokens 64000, treefmt-check> - :provider :anthropic, treefmt-check> - :context-window 200000}, treefmt-check> + :max-tokens 64000, treefmt-check> + :provider :anthropic, treefmt-check> + :context-window 200000}, treefmt-check> "claude-opus-4-6" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :anthropic-messages, treefmt-check> - :name "Claude Opus 4.6", treefmt-check> - :base-url "https://api.anthropic.com", treefmt-check> - :id "claude-opus-4-6", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :anthropic-messages, treefmt-check> + :name "Claude Opus 4.6", treefmt-check> + :base-url "https://api.anthropic.com", treefmt-check> + :id "claude-opus-4-6", treefmt-check> :cost treefmt-check> {:input 5.0, :output 25.0, :cache-read 0.5, :cache-write 6.25}, treefmt-check> - :max-tokens 128000, treefmt-check> - :provider :anthropic, treefmt-check> - :context-window 1000000}, treefmt-check> + :max-tokens 128000, treefmt-check> + :provider :anthropic, treefmt-check> + :context-window 1000000}, treefmt-check> "claude-sonnet-4-0" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :anthropic-messages, treefmt-check> - :name "Claude Sonnet 4 (latest)", treefmt-check> - :base-url "https://api.anthropic.com", treefmt-check> - :id "claude-sonnet-4-0", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :anthropic-messages, treefmt-check> + :name "Claude Sonnet 4 (latest)", treefmt-check> + :base-url "https://api.anthropic.com", treefmt-check> + :id "claude-sonnet-4-0", treefmt-check> :cost treefmt-check> {:input 3.0, :output 15.0, :cache-read 0.3, :cache-write 3.75}, treefmt-check> - :max-tokens 64000, treefmt-check> - :provider :anthropic, treefmt-check> - :context-window 200000}, treefmt-check> + :max-tokens 64000, treefmt-check> + :provider :anthropic, treefmt-check> + :context-window 200000}, treefmt-check> "claude-sonnet-4-20250514" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :anthropic-messages, treefmt-check> - :name "Claude Sonnet 4", treefmt-check> - :base-url "https://api.anthropic.com", treefmt-check> - :id "claude-sonnet-4-20250514", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :anthropic-messages, treefmt-check> + :name "Claude Sonnet 4", treefmt-check> + :base-url "https://api.anthropic.com", treefmt-check> + :id "claude-sonnet-4-20250514", treefmt-check> :cost treefmt-check> {:input 3.0, :output 15.0, :cache-read 0.3, :cache-write 3.75}, treefmt-check> - :max-tokens 64000, treefmt-check> - :provider :anthropic, treefmt-check> - :context-window 200000}, treefmt-check> + :max-tokens 64000, treefmt-check> + :provider :anthropic, treefmt-check> + :context-window 200000}, treefmt-check> "claude-sonnet-4-5" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :anthropic-messages, treefmt-check> - :name "Claude Sonnet 4.5 (latest)", treefmt-check> - :base-url "https://api.anthropic.com", treefmt-check> - :id "claude-sonnet-4-5", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :anthropic-messages, treefmt-check> + :name "Claude Sonnet 4.5 (latest)", treefmt-check> + :base-url "https://api.anthropic.com", treefmt-check> + :id "claude-sonnet-4-5", treefmt-check> :cost treefmt-check> {:input 3.0, :output 15.0, :cache-read 0.3, :cache-write 3.75}, treefmt-check> - :max-tokens 64000, treefmt-check> - :provider :anthropic, treefmt-check> - :context-window 200000}, treefmt-check> + :max-tokens 64000, treefmt-check> + :provider :anthropic, treefmt-check> + :context-window 200000}, treefmt-check> "claude-sonnet-4-5-20250929" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :anthropic-messages, treefmt-check> - :name "Claude Sonnet 4.5", treefmt-check> - :base-url "https://api.anthropic.com", treefmt-check> - :id "claude-sonnet-4-5-20250929", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :anthropic-messages, treefmt-check> + :name "Claude Sonnet 4.5", treefmt-check> + :base-url "https://api.anthropic.com", treefmt-check> + :id "claude-sonnet-4-5-20250929", treefmt-check> :cost treefmt-check> {:input 3.0, :output 15.0, :cache-read 0.3, :cache-write 3.75}, treefmt-check> - :max-tokens 64000, treefmt-check> - :provider :anthropic, treefmt-check> - :context-window 200000}, treefmt-check> + :max-tokens 64000, treefmt-check> + :provider :anthropic, treefmt-check> + :context-window 200000}, treefmt-check> "claude-sonnet-4-6" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :anthropic-messages, treefmt-check> - :name "Claude Sonnet 4.6", treefmt-check> - :base-url "https://api.anthropic.com", treefmt-check> - :id "claude-sonnet-4-6", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :anthropic-messages, treefmt-check> + :name "Claude Sonnet 4.6", treefmt-check> + :base-url "https://api.anthropic.com", treefmt-check> + :id "claude-sonnet-4-6", treefmt-check> :cost treefmt-check> {:input 3.0, :output 15.0, :cache-read 0.3, :cache-write 3.75}, treefmt-check> - :max-tokens 64000, treefmt-check> - :provider :anthropic, treefmt-check> - :context-window 1000000}}, treefmt-check> + :max-tokens 64000, treefmt-check> + :provider :anthropic, treefmt-check> + :context-window 1000000}}, treefmt-check> :google treefmt-check> {"gemini-1.5-flash" treefmt-check> - {:capabilities {:reasoning? false, :input #{:image :text}}, treefmt-check> - :api :google-generative-ai, treefmt-check> - :name "Gemini 1.5 Flash", treefmt-check> - :base-url "https://generativelanguage.googleapis.com/v1beta", treefmt-check> - :id "gemini-1.5-flash", treefmt-check> + {:capabilities {:reasoning? false, :input #{:image :text}}, treefmt-check> + :api :google-generative-ai, treefmt-check> + :name "Gemini 1.5 Flash", treefmt-check> + :base-url "https://generativelanguage.googleapis.com/v1beta", treefmt-check> + :id "gemini-1.5-flash", treefmt-check> :cost treefmt-check> {:input 0.075, :output 0.3, :cache-read 0.01875, :cache-write 0.0}, treefmt-check> - :max-tokens 8192, treefmt-check> - :provider :google, treefmt-check> - :context-window 1000000}, treefmt-check> + :max-tokens 8192, treefmt-check> + :provider :google, treefmt-check> + :context-window 1000000}, treefmt-check> "gemini-1.5-flash-8b" treefmt-check> - {:capabilities {:reasoning? false, :input #{:image :text}}, treefmt-check> - :api :google-generative-ai, treefmt-check> - :name "Gemini 1.5 Flash-8B", treefmt-check> - :base-url "https://generativelanguage.googleapis.com/v1beta", treefmt-check> - :id "gemini-1.5-flash-8b", treefmt-check> + {:capabilities {:reasoning? false, :input #{:image :text}}, treefmt-check> + :api :google-generative-ai, treefmt-check> + :name "Gemini 1.5 Flash-8B", treefmt-check> + :base-url "https://generativelanguage.googleapis.com/v1beta", treefmt-check> + :id "gemini-1.5-flash-8b", treefmt-check> :cost treefmt-check> {:input 0.0375, :output 0.15, :cache-read 0.01, :cache-write 0.0}, treefmt-check> - :max-tokens 8192, treefmt-check> - :provider :google, treefmt-check> - :context-window 1000000}, treefmt-check> + :max-tokens 8192, treefmt-check> + :provider :google, treefmt-check> + :context-window 1000000}, treefmt-check> "gemini-1.5-pro" treefmt-check> - {:capabilities {:reasoning? false, :input #{:image :text}}, treefmt-check> - :api :google-generative-ai, treefmt-check> - :name "Gemini 1.5 Pro", treefmt-check> - :base-url "https://generativelanguage.googleapis.com/v1beta", treefmt-check> - :id "gemini-1.5-pro", treefmt-check> + {:capabilities {:reasoning? false, :input #{:image :text}}, treefmt-check> + :api :google-generative-ai, treefmt-check> + :name "Gemini 1.5 Pro", treefmt-check> + :base-url "https://generativelanguage.googleapis.com/v1beta", treefmt-check> + :id "gemini-1.5-pro", treefmt-check> :cost treefmt-check> {:input 1.25, :output 5.0, :cache-read 0.3125, :cache-write 0.0}, treefmt-check> - :max-tokens 8192, treefmt-check> - :provider :google, treefmt-check> - :context-window 1000000}, treefmt-check> + :max-tokens 8192, treefmt-check> + :provider :google, treefmt-check> + :context-window 1000000}, treefmt-check> "gemini-2.0-flash" treefmt-check> - {:capabilities {:reasoning? false, :input #{:image :text}}, treefmt-check> - :api :google-generative-ai, treefmt-check> - :name "Gemini 2.0 Flash", treefmt-check> - :base-url "https://generativelanguage.googleapis.com/v1beta", treefmt-check> - :id "gemini-2.0-flash", treefmt-check> + {:capabilities {:reasoning? false, :input #{:image :text}}, treefmt-check> + :api :google-generative-ai, treefmt-check> + :name "Gemini 2.0 Flash", treefmt-check> + :base-url "https://generativelanguage.googleapis.com/v1beta", treefmt-check> + :id "gemini-2.0-flash", treefmt-check> :cost treefmt-check> {:input 0.1, :output 0.4, :cache-read 0.025, :cache-write 0.0}, treefmt-check> - :max-tokens 8192, treefmt-check> - :provider :google, treefmt-check> - :context-window 1048576}, treefmt-check> + :max-tokens 8192, treefmt-check> + :provider :google, treefmt-check> + :context-window 1048576}, treefmt-check> "gemini-2.0-flash-lite" treefmt-check> - {:capabilities {:reasoning? false, :input #{:image :text}}, treefmt-check> - :api :google-generative-ai, treefmt-check> - :name "Gemini 2.0 Flash Lite", treefmt-check> - :base-url "https://generativelanguage.googleapis.com/v1beta", treefmt-check> - :id "gemini-2.0-flash-lite", treefmt-check> + {:capabilities {:reasoning? false, :input #{:image :text}}, treefmt-check> + :api :google-generative-ai, treefmt-check> + :name "Gemini 2.0 Flash Lite", treefmt-check> + :base-url "https://generativelanguage.googleapis.com/v1beta", treefmt-check> + :id "gemini-2.0-flash-lite", treefmt-check> :cost treefmt-check> {:input 0.075, :output 0.3, :cache-read 0.0, :cache-write 0.0}, treefmt-check> - :max-tokens 8192, treefmt-check> - :provider :google, treefmt-check> - :context-window 1048576}, treefmt-check> + :max-tokens 8192, treefmt-check> + :provider :google, treefmt-check> + :context-window 1048576}, treefmt-check> "gemini-2.5-flash" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :google-generative-ai, treefmt-check> - :name "Gemini 2.5 Flash", treefmt-check> - :base-url "https://generativelanguage.googleapis.com/v1beta", treefmt-check> - :id "gemini-2.5-flash", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :google-generative-ai, treefmt-check> + :name "Gemini 2.5 Flash", treefmt-check> + :base-url "https://generativelanguage.googleapis.com/v1beta", treefmt-check> + :id "gemini-2.5-flash", treefmt-check> :cost treefmt-check> {:input 0.3, :output 2.5, :cache-read 0.075, :cache-write 0.0}, treefmt-check> - :max-tokens 65536, treefmt-check> - :provider :google, treefmt-check> - :context-window 1048576}, treefmt-check> + :max-tokens 65536, treefmt-check> + :provider :google, treefmt-check> + :context-window 1048576}, treefmt-check> "gemini-2.5-flash-lite" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :google-generative-ai, treefmt-check> - :name "Gemini 2.5 Flash Lite", treefmt-check> - :base-url "https://generativelanguage.googleapis.com/v1beta", treefmt-check> - :id "gemini-2.5-flash-lite", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :google-generative-ai, treefmt-check> + :name "Gemini 2.5 Flash Lite", treefmt-check> + :base-url "https://generativelanguage.googleapis.com/v1beta", treefmt-check> + :id "gemini-2.5-flash-lite", treefmt-check> :cost treefmt-check> {:input 0.1, :output 0.4, :cache-read 0.025, :cache-write 0.0}, treefmt-check> - :max-tokens 65536, treefmt-check> - :provider :google, treefmt-check> - :context-window 1048576}, treefmt-check> + :max-tokens 65536, treefmt-check> + :provider :google, treefmt-check> + :context-window 1048576}, treefmt-check> "gemini-2.5-flash-lite-preview-06-17" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :google-generative-ai, treefmt-check> - :name "Gemini 2.5 Flash Lite Preview 06-17", treefmt-check> - :base-url "https://generativelanguage.googleapis.com/v1beta", treefmt-check> - :id "gemini-2.5-flash-lite-preview-06-17", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :google-generative-ai, treefmt-check> + :name "Gemini 2.5 Flash Lite Preview 06-17", treefmt-check> + :base-url "https://generativelanguage.googleapis.com/v1beta", treefmt-check> + :id "gemini-2.5-flash-lite-preview-06-17", treefmt-check> :cost treefmt-check> {:input 0.1, :output 0.4, :cache-read 0.025, :cache-write 0.0}, treefmt-check> - :max-tokens 65536, treefmt-check> - :provider :google, treefmt-check> - :context-window 1048576}, treefmt-check> + :max-tokens 65536, treefmt-check> + :provider :google, treefmt-check> + :context-window 1048576}, treefmt-check> "gemini-2.5-flash-lite-preview-09-2025" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :google-generative-ai, treefmt-check> - :name "Gemini 2.5 Flash Lite Preview 09-25", treefmt-check> - :base-url "https://generativelanguage.googleapis.com/v1beta", treefmt-check> - :id "gemini-2.5-flash-lite-preview-09-2025", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :google-generative-ai, treefmt-check> + :name "Gemini 2.5 Flash Lite Preview 09-25", treefmt-check> + :base-url "https://generativelanguage.googleapis.com/v1beta", treefmt-check> + :id "gemini-2.5-flash-lite-preview-09-2025", treefmt-check> :cost treefmt-check> {:input 0.1, :output 0.4, :cache-read 0.025, :cache-write 0.0}, treefmt-check> - :max-tokens 65536, treefmt-check> - :provider :google, treefmt-check> - :context-window 1048576}, treefmt-check> + :max-tokens 65536, treefmt-check> + :provider :google, treefmt-check> + :context-window 1048576}, treefmt-check> "gemini-2.5-flash-preview-04-17" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :google-generative-ai, treefmt-check> - :name "Gemini 2.5 Flash Preview 04-17", treefmt-check> - :base-url "https://generativelanguage.googleapis.com/v1beta", treefmt-check> - :id "gemini-2.5-flash-preview-04-17", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :google-generative-ai, treefmt-check> + :name "Gemini 2.5 Flash Preview 04-17", treefmt-check> + :base-url "https://generativelanguage.googleapis.com/v1beta", treefmt-check> + :id "gemini-2.5-flash-preview-04-17", treefmt-check> :cost treefmt-check> {:input 0.15, :output 0.6, :cache-read 0.0375, :cache-write 0.0}, treefmt-check> - :max-tokens 65536, treefmt-check> - :provider :google, treefmt-check> - :context-window 1048576}, treefmt-check> + :max-tokens 65536, treefmt-check> + :provider :google, treefmt-check> + :context-window 1048576}, treefmt-check> "gemini-2.5-flash-preview-05-20" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :google-generative-ai, treefmt-check> - :name "Gemini 2.5 Flash Preview 05-20", treefmt-check> - :base-url "https://generativelanguage.googleapis.com/v1beta", treefmt-check> - :id "gemini-2.5-flash-preview-05-20", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :google-generative-ai, treefmt-check> + :name "Gemini 2.5 Flash Preview 05-20", treefmt-check> + :base-url "https://generativelanguage.googleapis.com/v1beta", treefmt-check> + :id "gemini-2.5-flash-preview-05-20", treefmt-check> :cost treefmt-check> {:input 0.15, :output 0.6, :cache-read 0.0375, :cache-write 0.0}, treefmt-check> - :max-tokens 65536, treefmt-check> - :provider :google, treefmt-check> - :context-window 1048576}, treefmt-check> + :max-tokens 65536, treefmt-check> + :provider :google, treefmt-check> + :context-window 1048576}, treefmt-check> "gemini-2.5-flash-preview-09-2025" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :google-generative-ai, treefmt-check> - :name "Gemini 2.5 Flash Preview 09-25", treefmt-check> - :base-url "https://generativelanguage.googleapis.com/v1beta", treefmt-check> - :id "gemini-2.5-flash-preview-09-2025", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :google-generative-ai, treefmt-check> + :name "Gemini 2.5 Flash Preview 09-25", treefmt-check> + :base-url "https://generativelanguage.googleapis.com/v1beta", treefmt-check> + :id "gemini-2.5-flash-preview-09-2025", treefmt-check> :cost treefmt-check> {:input 0.3, :output 2.5, :cache-read 0.075, :cache-write 0.0}, treefmt-check> - :max-tokens 65536, treefmt-check> - :provider :google, treefmt-check> - :context-window 1048576}, treefmt-check> + :max-tokens 65536, treefmt-check> + :provider :google, treefmt-check> + :context-window 1048576}, treefmt-check> "gemini-2.5-pro" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :google-generative-ai, treefmt-check> - :name "Gemini 2.5 Pro", treefmt-check> - :base-url "https://generativelanguage.googleapis.com/v1beta", treefmt-check> - :id "gemini-2.5-pro", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :google-generative-ai, treefmt-check> + :name "Gemini 2.5 Pro", treefmt-check> + :base-url "https://generativelanguage.googleapis.com/v1beta", treefmt-check> + :id "gemini-2.5-pro", treefmt-check> :cost treefmt-check> {:input 1.25, :output 10.0, :cache-read 0.31, :cache-write 0.0}, treefmt-check> - :max-tokens 65536, treefmt-check> - :provider :google, treefmt-check> - :context-window 1048576}, treefmt-check> + :max-tokens 65536, treefmt-check> + :provider :google, treefmt-check> + :context-window 1048576}, treefmt-check> "gemini-2.5-pro-preview-05-06" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :google-generative-ai, treefmt-check> - :name "Gemini 2.5 Pro Preview 05-06", treefmt-check> - :base-url "https://generativelanguage.googleapis.com/v1beta", treefmt-check> - :id "gemini-2.5-pro-preview-05-06", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :google-generative-ai, treefmt-check> + :name "Gemini 2.5 Pro Preview 05-06", treefmt-check> + :base-url "https://generativelanguage.googleapis.com/v1beta", treefmt-check> + :id "gemini-2.5-pro-preview-05-06", treefmt-check> :cost treefmt-check> {:input 1.25, :output 10.0, :cache-read 0.31, :cache-write 0.0}, treefmt-check> - :max-tokens 65536, treefmt-check> - :provider :google, treefmt-check> - :context-window 1048576}, treefmt-check> + :max-tokens 65536, treefmt-check> + :provider :google, treefmt-check> + :context-window 1048576}, treefmt-check> "gemini-2.5-pro-preview-06-05" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :google-generative-ai, treefmt-check> - :name "Gemini 2.5 Pro Preview 06-05", treefmt-check> - :base-url "https://generativelanguage.googleapis.com/v1beta", treefmt-check> - :id "gemini-2.5-pro-preview-06-05", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :google-generative-ai, treefmt-check> + :name "Gemini 2.5 Pro Preview 06-05", treefmt-check> + :base-url "https://generativelanguage.googleapis.com/v1beta", treefmt-check> + :id "gemini-2.5-pro-preview-06-05", treefmt-check> :cost treefmt-check> {:input 1.25, :output 10.0, :cache-read 0.31, :cache-write 0.0}, treefmt-check> - :max-tokens 65536, treefmt-check> - :provider :google, treefmt-check> - :context-window 1048576}, treefmt-check> + :max-tokens 65536, treefmt-check> + :provider :google, treefmt-check> + :context-window 1048576}, treefmt-check> "gemini-3-flash-preview" treefmt-check> {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> :api :google-generative-ai, treefmt-check> @@ -469,27 +469,27 @@ treefmt-check> :provider :google, treefmt-check> :context-window 1048576}, treefmt-check> "gemini-flash-latest" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :google-generative-ai, treefmt-check> - :name "Gemini Flash Latest", treefmt-check> - :base-url "https://generativelanguage.googleapis.com/v1beta", treefmt-check> - :id "gemini-flash-latest", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :google-generative-ai, treefmt-check> + :name "Gemini Flash Latest", treefmt-check> + :base-url "https://generativelanguage.googleapis.com/v1beta", treefmt-check> + :id "gemini-flash-latest", treefmt-check> :cost treefmt-check> {:input 0.3, :output 2.5, :cache-read 0.075, :cache-write 0.0}, treefmt-check> - :max-tokens 65536, treefmt-check> - :provider :google, treefmt-check> - :context-window 1048576}, treefmt-check> + :max-tokens 65536, treefmt-check> + :provider :google, treefmt-check> + :context-window 1048576}, treefmt-check> "gemini-flash-lite-latest" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :google-generative-ai, treefmt-check> - :name "Gemini Flash-Lite Latest", treefmt-check> - :base-url "https://generativelanguage.googleapis.com/v1beta", treefmt-check> - :id "gemini-flash-lite-latest", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :google-generative-ai, treefmt-check> + :name "Gemini Flash-Lite Latest", treefmt-check> + :base-url "https://generativelanguage.googleapis.com/v1beta", treefmt-check> + :id "gemini-flash-lite-latest", treefmt-check> :cost treefmt-check> {:input 0.1, :output 0.4, :cache-read 0.025, :cache-write 0.0}, treefmt-check> - :max-tokens 65536, treefmt-check> - :provider :google, treefmt-check> - :context-window 1048576}, treefmt-check> + :max-tokens 65536, treefmt-check> + :provider :google, treefmt-check> + :context-window 1048576}, treefmt-check> "gemini-live-2.5-flash" treefmt-check> {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> :api :google-generative-ai, treefmt-check> @@ -602,16 +602,16 @@ treefmt-check> :provider :mistral, treefmt-check> :context-window 128000}, treefmt-check> "ministral-3b-latest" treefmt-check> - {:capabilities {:reasoning? false, :input #{:text}}, treefmt-check> - :api :openai-completions, treefmt-check> - :name "Ministral 3B (latest)", treefmt-check> - :base-url "https://api.mistral.ai/v1", treefmt-check> - :id "ministral-3b-latest", treefmt-check> + {:capabilities {:reasoning? false, :input #{:text}}, treefmt-check> + :api :openai-completions, treefmt-check> + :name "Ministral 3B (latest)", treefmt-check> + :base-url "https://api.mistral.ai/v1", treefmt-check> + :id "ministral-3b-latest", treefmt-check> :cost treefmt-check> {:input 0.04, :output 0.04, :cache-read 0.0, :cache-write 0.0}, treefmt-check> - :max-tokens 128000, treefmt-check> - :provider :mistral, treefmt-check> - :context-window 128000}, treefmt-check> + :max-tokens 128000, treefmt-check> + :provider :mistral, treefmt-check> + :context-window 128000}, treefmt-check> "ministral-8b-latest" treefmt-check> {:capabilities {:reasoning? false, :input #{:text}}, treefmt-check> :api :openai-completions, treefmt-check> @@ -683,16 +683,16 @@ treefmt-check> :provider :mistral, treefmt-check> :context-window 128000}, treefmt-check> "mistral-nemo" treefmt-check> - {:capabilities {:reasoning? false, :input #{:text}}, treefmt-check> - :api :openai-completions, treefmt-check> - :name "Mistral Nemo", treefmt-check> - :base-url "https://api.mistral.ai/v1", treefmt-check> - :id "mistral-nemo", treefmt-check> + {:capabilities {:reasoning? false, :input #{:text}}, treefmt-check> + :api :openai-completions, treefmt-check> + :name "Mistral Nemo", treefmt-check> + :base-url "https://api.mistral.ai/v1", treefmt-check> + :id "mistral-nemo", treefmt-check> :cost treefmt-check> {:input 0.15, :output 0.15, :cache-read 0.0, :cache-write 0.0}, treefmt-check> - :max-tokens 128000, treefmt-check> - :provider :mistral, treefmt-check> - :context-window 128000}, treefmt-check> + :max-tokens 128000, treefmt-check> + :provider :mistral, treefmt-check> + :context-window 128000}, treefmt-check> "mistral-small-2506" treefmt-check> {:capabilities {:reasoning? false, :input #{:image :text}}, treefmt-check> :api :openai-completions, treefmt-check> @@ -714,16 +714,16 @@ treefmt-check> :provider :mistral, treefmt-check> :context-window 128000}, treefmt-check> "open-mistral-7b" treefmt-check> - {:capabilities {:reasoning? false, :input #{:text}}, treefmt-check> - :api :openai-completions, treefmt-check> - :name "Mistral 7B", treefmt-check> - :base-url "https://api.mistral.ai/v1", treefmt-check> - :id "open-mistral-7b", treefmt-check> + {:capabilities {:reasoning? false, :input #{:text}}, treefmt-check> + :api :openai-completions, treefmt-check> + :name "Mistral 7B", treefmt-check> + :base-url "https://api.mistral.ai/v1", treefmt-check> + :id "open-mistral-7b", treefmt-check> :cost treefmt-check> {:input 0.25, :output 0.25, :cache-read 0.0, :cache-write 0.0}, treefmt-check> - :max-tokens 8000, treefmt-check> - :provider :mistral, treefmt-check> - :context-window 8000}, treefmt-check> + :max-tokens 8000, treefmt-check> + :provider :mistral, treefmt-check> + :context-window 8000}, treefmt-check> "open-mixtral-8x22b" treefmt-check> {:capabilities {:reasoning? false, :input #{:text}}, treefmt-check> :api :openai-completions, treefmt-check> @@ -745,16 +745,16 @@ treefmt-check> :provider :mistral, treefmt-check> :context-window 32000}, treefmt-check> "pixtral-12b" treefmt-check> - {:capabilities {:reasoning? false, :input #{:image :text}}, treefmt-check> - :api :openai-completions, treefmt-check> - :name "Pixtral 12B", treefmt-check> - :base-url "https://api.mistral.ai/v1", treefmt-check> - :id "pixtral-12b", treefmt-check> + {:capabilities {:reasoning? false, :input #{:image :text}}, treefmt-check> + :api :openai-completions, treefmt-check> + :name "Pixtral 12B", treefmt-check> + :base-url "https://api.mistral.ai/v1", treefmt-check> + :id "pixtral-12b", treefmt-check> :cost treefmt-check> {:input 0.15, :output 0.15, :cache-read 0.0, :cache-write 0.0}, treefmt-check> - :max-tokens 128000, treefmt-check> - :provider :mistral, treefmt-check> - :context-window 128000}, treefmt-check> + :max-tokens 128000, treefmt-check> + :provider :mistral, treefmt-check> + :context-window 128000}, treefmt-check> "pixtral-large-latest" treefmt-check> {:capabilities {:reasoning? false, :input #{:image :text}}, treefmt-check> :api :openai-completions, treefmt-check> @@ -767,38 +767,38 @@ treefmt-check> :context-window 128000}}, treefmt-check> :openai treefmt-check> {"codex-mini-latest" treefmt-check> - {:capabilities {:reasoning? true, :input #{:text}}, treefmt-check> - :api :openai-responses, treefmt-check> - :name "Codex Mini", treefmt-check> - :base-url "https://api.openai.com/v1", treefmt-check> - :id "codex-mini-latest", treefmt-check> + {:capabilities {:reasoning? true, :input #{:text}}, treefmt-check> + :api :openai-responses, treefmt-check> + :name "Codex Mini", treefmt-check> + :base-url "https://api.openai.com/v1", treefmt-check> + :id "codex-mini-latest", treefmt-check> :cost treefmt-check> {:input 1.5, :output 6.0, :cache-read 0.375, :cache-write 0.0}, treefmt-check> - :max-tokens 100000, treefmt-check> - :provider :openai, treefmt-check> - :context-window 200000}, treefmt-check> + :max-tokens 100000, treefmt-check> + :provider :openai, treefmt-check> + :context-window 200000}, treefmt-check> "gpt-4" treefmt-check> - {:capabilities {:reasoning? false, :input #{:text}}, treefmt-check> - :api :openai-responses, treefmt-check> - :name "GPT-4", treefmt-check> - :base-url "https://api.openai.com/v1", treefmt-check> - :id "gpt-4", treefmt-check> + {:capabilities {:reasoning? false, :input #{:text}}, treefmt-check> + :api :openai-responses, treefmt-check> + :name "GPT-4", treefmt-check> + :base-url "https://api.openai.com/v1", treefmt-check> + :id "gpt-4", treefmt-check> :cost treefmt-check> {:input 30.0, :output 60.0, :cache-read 0.0, :cache-write 0.0}, treefmt-check> - :max-tokens 8192, treefmt-check> - :provider :openai, treefmt-check> - :context-window 8192}, treefmt-check> + :max-tokens 8192, treefmt-check> + :provider :openai, treefmt-check> + :context-window 8192}, treefmt-check> "gpt-4-turbo" treefmt-check> - {:capabilities {:reasoning? false, :input #{:image :text}}, treefmt-check> - :api :openai-responses, treefmt-check> - :name "GPT-4 Turbo", treefmt-check> - :base-url "https://api.openai.com/v1", treefmt-check> - :id "gpt-4-turbo", treefmt-check> + {:capabilities {:reasoning? false, :input #{:image :text}}, treefmt-check> + :api :openai-responses, treefmt-check> + :name "GPT-4 Turbo", treefmt-check> + :base-url "https://api.openai.com/v1", treefmt-check> + :id "gpt-4-turbo", treefmt-check> :cost treefmt-check> {:input 10.0, :output 30.0, :cache-read 0.0, :cache-write 0.0}, treefmt-check> - :max-tokens 4096, treefmt-check> - :provider :openai, treefmt-check> - :context-window 128000}, treefmt-check> + :max-tokens 4096, treefmt-check> + :provider :openai, treefmt-check> + :context-window 128000}, treefmt-check> "gpt-4.1" treefmt-check> {:capabilities {:reasoning? false, :input #{:image :text}}, treefmt-check> :api :openai-responses, treefmt-check> @@ -830,16 +830,16 @@ treefmt-check> :provider :openai, treefmt-check> :context-window 1047576}, treefmt-check> "gpt-4o" treefmt-check> - {:capabilities {:reasoning? false, :input #{:image :text}}, treefmt-check> - :api :openai-responses, treefmt-check> - :name "GPT-4o", treefmt-check> - :base-url "https://api.openai.com/v1", treefmt-check> - :id "gpt-4o", treefmt-check> + {:capabilities {:reasoning? false, :input #{:image :text}}, treefmt-check> + :api :openai-responses, treefmt-check> + :name "GPT-4o", treefmt-check> + :base-url "https://api.openai.com/v1", treefmt-check> + :id "gpt-4o", treefmt-check> :cost treefmt-check> {:input 2.5, :output 10.0, :cache-read 1.25, :cache-write 0.0}, treefmt-check> - :max-tokens 16384, treefmt-check> - :provider :openai, treefmt-check> - :context-window 128000}, treefmt-check> + :max-tokens 16384, treefmt-check> + :provider :openai, treefmt-check> + :context-window 128000}, treefmt-check> "gpt-4o-2024-05-13" treefmt-check> {:capabilities {:reasoning? false, :input #{:image :text}}, treefmt-check> :api :openai-responses, treefmt-check> @@ -851,269 +851,269 @@ treefmt-check> :provider :openai, treefmt-check> :context-window 128000}, treefmt-check> "gpt-4o-2024-08-06" treefmt-check> - {:capabilities {:reasoning? false, :input #{:image :text}}, treefmt-check> - :api :openai-responses, treefmt-check> - :name "GPT-4o (2024-08-06)", treefmt-check> - :base-url "https://api.openai.com/v1", treefmt-check> - :id "gpt-4o-2024-08-06", treefmt-check> + {:capabilities {:reasoning? false, :input #{:image :text}}, treefmt-check> + :api :openai-responses, treefmt-check> + :name "GPT-4o (2024-08-06)", treefmt-check> + :base-url "https://api.openai.com/v1", treefmt-check> + :id "gpt-4o-2024-08-06", treefmt-check> :cost treefmt-check> {:input 2.5, :output 10.0, :cache-read 1.25, :cache-write 0.0}, treefmt-check> - :max-tokens 16384, treefmt-check> - :provider :openai, treefmt-check> - :context-window 128000}, treefmt-check> + :max-tokens 16384, treefmt-check> + :provider :openai, treefmt-check> + :context-window 128000}, treefmt-check> "gpt-4o-2024-11-20" treefmt-check> - {:capabilities {:reasoning? false, :input #{:image :text}}, treefmt-check> - :api :openai-responses, treefmt-check> - :name "GPT-4o (2024-11-20)", treefmt-check> - :base-url "https://api.openai.com/v1", treefmt-check> - :id "gpt-4o-2024-11-20", treefmt-check> + {:capabilities {:reasoning? false, :input #{:image :text}}, treefmt-check> + :api :openai-responses, treefmt-check> + :name "GPT-4o (2024-11-20)", treefmt-check> + :base-url "https://api.openai.com/v1", treefmt-check> + :id "gpt-4o-2024-11-20", treefmt-check> :cost treefmt-check> {:input 2.5, :output 10.0, :cache-read 1.25, :cache-write 0.0}, treefmt-check> - :max-tokens 16384, treefmt-check> - :provider :openai, treefmt-check> - :context-window 128000}, treefmt-check> + :max-tokens 16384, treefmt-check> + :provider :openai, treefmt-check> + :context-window 128000}, treefmt-check> "gpt-4o-mini" treefmt-check> - {:capabilities {:reasoning? false, :input #{:image :text}}, treefmt-check> - :api :openai-responses, treefmt-check> - :name "GPT-4o mini", treefmt-check> - :base-url "https://api.openai.com/v1", treefmt-check> - :id "gpt-4o-mini", treefmt-check> + {:capabilities {:reasoning? false, :input #{:image :text}}, treefmt-check> + :api :openai-responses, treefmt-check> + :name "GPT-4o mini", treefmt-check> + :base-url "https://api.openai.com/v1", treefmt-check> + :id "gpt-4o-mini", treefmt-check> :cost treefmt-check> {:input 0.15, :output 0.6, :cache-read 0.08, :cache-write 0.0}, treefmt-check> - :max-tokens 16384, treefmt-check> - :provider :openai, treefmt-check> - :context-window 128000}, treefmt-check> + :max-tokens 16384, treefmt-check> + :provider :openai, treefmt-check> + :context-window 128000}, treefmt-check> "gpt-5" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :openai-responses, treefmt-check> - :name "GPT-5", treefmt-check> - :base-url "https://api.openai.com/v1", treefmt-check> - :id "gpt-5", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :openai-responses, treefmt-check> + :name "GPT-5", treefmt-check> + :base-url "https://api.openai.com/v1", treefmt-check> + :id "gpt-5", treefmt-check> :cost treefmt-check> {:input 1.25, :output 10.0, :cache-read 0.125, :cache-write 0.0}, treefmt-check> - :max-tokens 128000, treefmt-check> - :provider :openai, treefmt-check> - :context-window 400000}, treefmt-check> + :max-tokens 128000, treefmt-check> + :provider :openai, treefmt-check> + :context-window 400000}, treefmt-check> "gpt-5-chat-latest" treefmt-check> - {:capabilities {:reasoning? false, :input #{:image :text}}, treefmt-check> - :api :openai-responses, treefmt-check> - :name "GPT-5 Chat Latest", treefmt-check> - :base-url "https://api.openai.com/v1", treefmt-check> - :id "gpt-5-chat-latest", treefmt-check> + {:capabilities {:reasoning? false, :input #{:image :text}}, treefmt-check> + :api :openai-responses, treefmt-check> + :name "GPT-5 Chat Latest", treefmt-check> + :base-url "https://api.openai.com/v1", treefmt-check> + :id "gpt-5-chat-latest", treefmt-check> :cost treefmt-check> {:input 1.25, :output 10.0, :cache-read 0.125, :cache-write 0.0}, treefmt-check> - :max-tokens 16384, treefmt-check> - :provider :openai, treefmt-check> - :context-window 128000}, treefmt-check> + :max-tokens 16384, treefmt-check> + :provider :openai, treefmt-check> + :context-window 128000}, treefmt-check> "gpt-5-codex" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :openai-responses, treefmt-check> - :name "GPT-5-Codex", treefmt-check> - :base-url "https://api.openai.com/v1", treefmt-check> - :id "gpt-5-codex", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :openai-responses, treefmt-check> + :name "GPT-5-Codex", treefmt-check> + :base-url "https://api.openai.com/v1", treefmt-check> + :id "gpt-5-codex", treefmt-check> :cost treefmt-check> {:input 1.25, :output 10.0, :cache-read 0.125, :cache-write 0.0}, treefmt-check> - :max-tokens 128000, treefmt-check> - :provider :openai, treefmt-check> - :context-window 400000}, treefmt-check> + :max-tokens 128000, treefmt-check> + :provider :openai, treefmt-check> + :context-window 400000}, treefmt-check> "gpt-5-mini" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :openai-responses, treefmt-check> - :name "GPT-5 Mini", treefmt-check> - :base-url "https://api.openai.com/v1", treefmt-check> - :id "gpt-5-mini", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :openai-responses, treefmt-check> + :name "GPT-5 Mini", treefmt-check> + :base-url "https://api.openai.com/v1", treefmt-check> + :id "gpt-5-mini", treefmt-check> :cost treefmt-check> {:input 0.25, :output 2.0, :cache-read 0.025, :cache-write 0.0}, treefmt-check> - :max-tokens 128000, treefmt-check> - :provider :openai, treefmt-check> - :context-window 400000}, treefmt-check> + :max-tokens 128000, treefmt-check> + :provider :openai, treefmt-check> + :context-window 400000}, treefmt-check> "gpt-5-nano" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :openai-responses, treefmt-check> - :name "GPT-5 Nano", treefmt-check> - :base-url "https://api.openai.com/v1", treefmt-check> - :id "gpt-5-nano", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :openai-responses, treefmt-check> + :name "GPT-5 Nano", treefmt-check> + :base-url "https://api.openai.com/v1", treefmt-check> + :id "gpt-5-nano", treefmt-check> :cost treefmt-check> {:input 0.05, :output 0.4, :cache-read 0.005, :cache-write 0.0}, treefmt-check> - :max-tokens 128000, treefmt-check> - :provider :openai, treefmt-check> - :context-window 400000}, treefmt-check> + :max-tokens 128000, treefmt-check> + :provider :openai, treefmt-check> + :context-window 400000}, treefmt-check> "gpt-5-pro" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :openai-responses, treefmt-check> - :name "GPT-5 Pro", treefmt-check> - :base-url "https://api.openai.com/v1", treefmt-check> - :id "gpt-5-pro", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :openai-responses, treefmt-check> + :name "GPT-5 Pro", treefmt-check> + :base-url "https://api.openai.com/v1", treefmt-check> + :id "gpt-5-pro", treefmt-check> :cost treefmt-check> {:input 15.0, :output 120.0, :cache-read 0.0, :cache-write 0.0}, treefmt-check> - :max-tokens 272000, treefmt-check> - :provider :openai, treefmt-check> - :context-window 400000}, treefmt-check> + :max-tokens 272000, treefmt-check> + :provider :openai, treefmt-check> + :context-window 400000}, treefmt-check> "gpt-5.1" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :openai-responses, treefmt-check> - :name "GPT-5.1", treefmt-check> - :base-url "https://api.openai.com/v1", treefmt-check> - :id "gpt-5.1", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :openai-responses, treefmt-check> + :name "GPT-5.1", treefmt-check> + :base-url "https://api.openai.com/v1", treefmt-check> + :id "gpt-5.1", treefmt-check> :cost treefmt-check> {:input 1.25, :output 10.0, :cache-read 0.13, :cache-write 0.0}, treefmt-check> - :max-tokens 128000, treefmt-check> - :provider :openai, treefmt-check> - :context-window 400000}, treefmt-check> + :max-tokens 128000, treefmt-check> + :provider :openai, treefmt-check> + :context-window 400000}, treefmt-check> "gpt-5.1-chat-latest" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :openai-responses, treefmt-check> - :name "GPT-5.1 Chat", treefmt-check> - :base-url "https://api.openai.com/v1", treefmt-check> - :id "gpt-5.1-chat-latest", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :openai-responses, treefmt-check> + :name "GPT-5.1 Chat", treefmt-check> + :base-url "https://api.openai.com/v1", treefmt-check> + :id "gpt-5.1-chat-latest", treefmt-check> :cost treefmt-check> {:input 1.25, :output 10.0, :cache-read 0.125, :cache-write 0.0}, treefmt-check> - :max-tokens 16384, treefmt-check> - :provider :openai, treefmt-check> - :context-window 128000}, treefmt-check> + :max-tokens 16384, treefmt-check> + :provider :openai, treefmt-check> + :context-window 128000}, treefmt-check> "gpt-5.1-codex" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :openai-responses, treefmt-check> - :name "GPT-5.1 Codex", treefmt-check> - :base-url "https://api.openai.com/v1", treefmt-check> - :id "gpt-5.1-codex", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :openai-responses, treefmt-check> + :name "GPT-5.1 Codex", treefmt-check> + :base-url "https://api.openai.com/v1", treefmt-check> + :id "gpt-5.1-codex", treefmt-check> :cost treefmt-check> {:input 1.25, :output 5.0, :cache-read 0.125, :cache-write 1.25}, treefmt-check> - :max-tokens 128000, treefmt-check> - :provider :openai, treefmt-check> - :context-window 400000}, treefmt-check> + :max-tokens 128000, treefmt-check> + :provider :openai, treefmt-check> + :context-window 400000}, treefmt-check> "gpt-5.1-codex-max" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :openai-responses, treefmt-check> - :name "GPT-5.1 Codex Max", treefmt-check> - :base-url "https://api.openai.com/v1", treefmt-check> - :id "gpt-5.1-codex-max", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :openai-responses, treefmt-check> + :name "GPT-5.1 Codex Max", treefmt-check> + :base-url "https://api.openai.com/v1", treefmt-check> + :id "gpt-5.1-codex-max", treefmt-check> :cost treefmt-check> {:input 1.25, :output 10.0, :cache-read 0.125, :cache-write 0.0}, treefmt-check> - :max-tokens 128000, treefmt-check> - :provider :openai, treefmt-check> - :context-window 400000}, treefmt-check> + :max-tokens 128000, treefmt-check> + :provider :openai, treefmt-check> + :context-window 400000}, treefmt-check> "gpt-5.1-codex-mini" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :openai-responses, treefmt-check> - :name "GPT-5.1 Codex mini", treefmt-check> - :base-url "https://api.openai.com/v1", treefmt-check> - :id "gpt-5.1-codex-mini", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :openai-responses, treefmt-check> + :name "GPT-5.1 Codex mini", treefmt-check> + :base-url "https://api.openai.com/v1", treefmt-check> + :id "gpt-5.1-codex-mini", treefmt-check> :cost treefmt-check> {:input 0.25, :output 2.0, :cache-read 0.025, :cache-write 0.0}, treefmt-check> - :max-tokens 128000, treefmt-check> - :provider :openai, treefmt-check> - :context-window 400000}, treefmt-check> + :max-tokens 128000, treefmt-check> + :provider :openai, treefmt-check> + :context-window 400000}, treefmt-check> "gpt-5.2" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :openai-responses, treefmt-check> - :name "GPT-5.2", treefmt-check> - :base-url "https://api.openai.com/v1", treefmt-check> - :id "gpt-5.2", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :openai-responses, treefmt-check> + :name "GPT-5.2", treefmt-check> + :base-url "https://api.openai.com/v1", treefmt-check> + :id "gpt-5.2", treefmt-check> :cost treefmt-check> {:input 1.75, :output 14.0, :cache-read 0.175, :cache-write 0.0}, treefmt-check> - :max-tokens 128000, treefmt-check> - :provider :openai, treefmt-check> - :context-window 400000}, treefmt-check> + :max-tokens 128000, treefmt-check> + :provider :openai, treefmt-check> + :context-window 400000}, treefmt-check> "gpt-5.2-chat-latest" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :openai-responses, treefmt-check> - :name "GPT-5.2 Chat", treefmt-check> - :base-url "https://api.openai.com/v1", treefmt-check> - :id "gpt-5.2-chat-latest", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :openai-responses, treefmt-check> + :name "GPT-5.2 Chat", treefmt-check> + :base-url "https://api.openai.com/v1", treefmt-check> + :id "gpt-5.2-chat-latest", treefmt-check> :cost treefmt-check> {:input 1.75, :output 14.0, :cache-read 0.175, :cache-write 0.0}, treefmt-check> - :max-tokens 16384, treefmt-check> - :provider :openai, treefmt-check> - :context-window 128000}, treefmt-check> + :max-tokens 16384, treefmt-check> + :provider :openai, treefmt-check> + :context-window 128000}, treefmt-check> "gpt-5.2-codex" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :openai-responses, treefmt-check> - :name "GPT-5.2 Codex", treefmt-check> - :base-url "https://api.openai.com/v1", treefmt-check> - :id "gpt-5.2-codex", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :openai-responses, treefmt-check> + :name "GPT-5.2 Codex", treefmt-check> + :base-url "https://api.openai.com/v1", treefmt-check> + :id "gpt-5.2-codex", treefmt-check> :cost treefmt-check> {:input 1.75, :output 14.0, :cache-read 0.175, :cache-write 0.0}, treefmt-check> - :max-tokens 128000, treefmt-check> - :provider :openai, treefmt-check> - :context-window 400000}, treefmt-check> + :max-tokens 128000, treefmt-check> + :provider :openai, treefmt-check> + :context-window 400000}, treefmt-check> "gpt-5.2-pro" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :openai-responses, treefmt-check> - :name "GPT-5.2 Pro", treefmt-check> - :base-url "https://api.openai.com/v1", treefmt-check> - :id "gpt-5.2-pro", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :openai-responses, treefmt-check> + :name "GPT-5.2 Pro", treefmt-check> + :base-url "https://api.openai.com/v1", treefmt-check> + :id "gpt-5.2-pro", treefmt-check> :cost treefmt-check> {:input 21.0, :output 168.0, :cache-read 0.0, :cache-write 0.0}, treefmt-check> - :max-tokens 128000, treefmt-check> - :provider :openai, treefmt-check> - :context-window 400000}, treefmt-check> + :max-tokens 128000, treefmt-check> + :provider :openai, treefmt-check> + :context-window 400000}, treefmt-check> "gpt-5.3-codex" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :openai-responses, treefmt-check> - :name "GPT-5.3 Codex", treefmt-check> - :base-url "https://api.openai.com/v1", treefmt-check> - :id "gpt-5.3-codex", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :openai-responses, treefmt-check> + :name "GPT-5.3 Codex", treefmt-check> + :base-url "https://api.openai.com/v1", treefmt-check> + :id "gpt-5.3-codex", treefmt-check> :cost treefmt-check> {:input 1.75, :output 14.0, :cache-read 0.175, :cache-write 0.0}, treefmt-check> - :max-tokens 128000, treefmt-check> - :provider :openai, treefmt-check> - :context-window 400000}, treefmt-check> + :max-tokens 128000, treefmt-check> + :provider :openai, treefmt-check> + :context-window 400000}, treefmt-check> "gpt-5.3-codex-spark" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :openai-responses, treefmt-check> - :name "GPT-5.3 Codex Spark", treefmt-check> - :base-url "https://api.openai.com/v1", treefmt-check> - :id "gpt-5.3-codex-spark", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :openai-responses, treefmt-check> + :name "GPT-5.3 Codex Spark", treefmt-check> + :base-url "https://api.openai.com/v1", treefmt-check> + :id "gpt-5.3-codex-spark", treefmt-check> :cost treefmt-check> {:input 1.75, :output 14.0, :cache-read 0.175, :cache-write 0.0}, treefmt-check> - :max-tokens 32000, treefmt-check> - :provider :openai, treefmt-check> - :context-window 128000}, treefmt-check> + :max-tokens 32000, treefmt-check> + :provider :openai, treefmt-check> + :context-window 128000}, treefmt-check> "gpt-5.4" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :openai-responses, treefmt-check> - :name "GPT-5.4", treefmt-check> - :base-url "https://api.openai.com/v1", treefmt-check> - :id "gpt-5.4", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :openai-responses, treefmt-check> + :name "GPT-5.4", treefmt-check> + :base-url "https://api.openai.com/v1", treefmt-check> + :id "gpt-5.4", treefmt-check> :cost treefmt-check> {:input 2.5, :output 15.0, :cache-read 0.25, :cache-write 0.0}, treefmt-check> - :max-tokens 128000, treefmt-check> - :provider :openai, treefmt-check> - :context-window 1050000}, treefmt-check> + :max-tokens 128000, treefmt-check> + :provider :openai, treefmt-check> + :context-window 1050000}, treefmt-check> "gpt-5.4-pro" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :openai-responses, treefmt-check> - :name "GPT-5.4 Pro", treefmt-check> - :base-url "https://api.openai.com/v1", treefmt-check> - :id "gpt-5.4-pro", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :openai-responses, treefmt-check> + :name "GPT-5.4 Pro", treefmt-check> + :base-url "https://api.openai.com/v1", treefmt-check> + :id "gpt-5.4-pro", treefmt-check> :cost treefmt-check> {:input 30.0, :output 180.0, :cache-read 0.0, :cache-write 0.0}, treefmt-check> - :max-tokens 128000, treefmt-check> - :provider :openai, treefmt-check> - :context-window 1050000}, treefmt-check> + :max-tokens 128000, treefmt-check> + :provider :openai, treefmt-check> + :context-window 1050000}, treefmt-check> "o1" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :openai-responses, treefmt-check> - :name "o1", treefmt-check> - :base-url "https://api.openai.com/v1", treefmt-check> - :id "o1", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :openai-responses, treefmt-check> + :name "o1", treefmt-check> + :base-url "https://api.openai.com/v1", treefmt-check> + :id "o1", treefmt-check> :cost treefmt-check> {:input 15.0, :output 60.0, :cache-read 7.5, :cache-write 0.0}, treefmt-check> - :max-tokens 100000, treefmt-check> - :provider :openai, treefmt-check> - :context-window 200000}, treefmt-check> + :max-tokens 100000, treefmt-check> + :provider :openai, treefmt-check> + :context-window 200000}, treefmt-check> "o1-pro" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :openai-responses, treefmt-check> - :name "o1-pro", treefmt-check> - :base-url "https://api.openai.com/v1", treefmt-check> - :id "o1-pro", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :openai-responses, treefmt-check> + :name "o1-pro", treefmt-check> + :base-url "https://api.openai.com/v1", treefmt-check> + :id "o1-pro", treefmt-check> :cost treefmt-check> {:input 150.0, :output 600.0, :cache-read 0.0, :cache-write 0.0}, treefmt-check> - :max-tokens 100000, treefmt-check> - :provider :openai, treefmt-check> - :context-window 200000}, treefmt-check> + :max-tokens 100000, treefmt-check> + :provider :openai, treefmt-check> + :context-window 200000}, treefmt-check> "o3" treefmt-check> {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> :api :openai-responses, treefmt-check> @@ -1125,16 +1125,16 @@ treefmt-check> :provider :openai, treefmt-check> :context-window 200000}, treefmt-check> "o3-deep-research" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :openai-responses, treefmt-check> - :name "o3-deep-research", treefmt-check> - :base-url "https://api.openai.com/v1", treefmt-check> - :id "o3-deep-research", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :openai-responses, treefmt-check> + :name "o3-deep-research", treefmt-check> + :base-url "https://api.openai.com/v1", treefmt-check> + :id "o3-deep-research", treefmt-check> :cost treefmt-check> {:input 10.0, :output 40.0, :cache-read 2.5, :cache-write 0.0}, treefmt-check> - :max-tokens 100000, treefmt-check> - :provider :openai, treefmt-check> - :context-window 200000}, treefmt-check> + :max-tokens 100000, treefmt-check> + :provider :openai, treefmt-check> + :context-window 200000}, treefmt-check> "o3-mini" treefmt-check> {:capabilities {:reasoning? true, :input #{:text}}, treefmt-check> :api :openai-responses, treefmt-check> @@ -1146,16 +1146,16 @@ treefmt-check> :provider :openai, treefmt-check> :context-window 200000}, treefmt-check> "o3-pro" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :openai-responses, treefmt-check> - :name "o3-pro", treefmt-check> - :base-url "https://api.openai.com/v1", treefmt-check> - :id "o3-pro", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :openai-responses, treefmt-check> + :name "o3-pro", treefmt-check> + :base-url "https://api.openai.com/v1", treefmt-check> + :id "o3-pro", treefmt-check> :cost treefmt-check> {:input 20.0, :output 80.0, :cache-read 0.0, :cache-write 0.0}, treefmt-check> - :max-tokens 100000, treefmt-check> - :provider :openai, treefmt-check> - :context-window 200000}, treefmt-check> + :max-tokens 100000, treefmt-check> + :provider :openai, treefmt-check> + :context-window 200000}, treefmt-check> "o4-mini" treefmt-check> {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> :api :openai-responses, treefmt-check> @@ -1178,71 +1178,71 @@ treefmt-check> :context-window 200000}}, treefmt-check> :openai-codex treefmt-check> {"gpt-5.1" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :openai-codex-responses, treefmt-check> - :name "GPT-5.1", treefmt-check> - :base-url "https://chatgpt.com/backend-api", treefmt-check> - :id "gpt-5.1", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :openai-codex-responses, treefmt-check> + :name "GPT-5.1", treefmt-check> + :base-url "https://chatgpt.com/backend-api", treefmt-check> + :id "gpt-5.1", treefmt-check> :cost treefmt-check> {:input 1.25, :output 10.0, :cache-read 0.125, :cache-write 0.0}, treefmt-check> - :max-tokens 128000, treefmt-check> - :provider :openai-codex, treefmt-check> - :context-window 272000}, treefmt-check> + :max-tokens 128000, treefmt-check> + :provider :openai-codex, treefmt-check> + :context-window 272000}, treefmt-check> "gpt-5.1-codex-max" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :openai-codex-responses, treefmt-check> - :name "GPT-5.1 Codex Max", treefmt-check> - :base-url "https://chatgpt.com/backend-api", treefmt-check> - :id "gpt-5.1-codex-max", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :openai-codex-responses, treefmt-check> + :name "GPT-5.1 Codex Max", treefmt-check> + :base-url "https://chatgpt.com/backend-api", treefmt-check> + :id "gpt-5.1-codex-max", treefmt-check> :cost treefmt-check> {:input 1.25, :output 10.0, :cache-read 0.125, :cache-write 0.0}, treefmt-check> - :max-tokens 128000, treefmt-check> - :provider :openai-codex, treefmt-check> - :context-window 272000}, treefmt-check> + :max-tokens 128000, treefmt-check> + :provider :openai-codex, treefmt-check> + :context-window 272000}, treefmt-check> "gpt-5.1-codex-mini" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :openai-codex-responses, treefmt-check> - :name "GPT-5.1 Codex Mini", treefmt-check> - :base-url "https://chatgpt.com/backend-api", treefmt-check> - :id "gpt-5.1-codex-mini", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :openai-codex-responses, treefmt-check> + :name "GPT-5.1 Codex Mini", treefmt-check> + :base-url "https://chatgpt.com/backend-api", treefmt-check> + :id "gpt-5.1-codex-mini", treefmt-check> :cost treefmt-check> {:input 0.25, :output 2.0, :cache-read 0.025, :cache-write 0.0}, treefmt-check> - :max-tokens 128000, treefmt-check> - :provider :openai-codex, treefmt-check> - :context-window 272000}, treefmt-check> + :max-tokens 128000, treefmt-check> + :provider :openai-codex, treefmt-check> + :context-window 272000}, treefmt-check> "gpt-5.2" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :openai-codex-responses, treefmt-check> - :name "GPT-5.2", treefmt-check> - :base-url "https://chatgpt.com/backend-api", treefmt-check> - :id "gpt-5.2", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :openai-codex-responses, treefmt-check> + :name "GPT-5.2", treefmt-check> + :base-url "https://chatgpt.com/backend-api", treefmt-check> + :id "gpt-5.2", treefmt-check> :cost treefmt-check> {:input 1.75, :output 14.0, :cache-read 0.175, :cache-write 0.0}, treefmt-check> - :max-tokens 128000, treefmt-check> - :provider :openai-codex, treefmt-check> - :context-window 272000}, treefmt-check> + :max-tokens 128000, treefmt-check> + :provider :openai-codex, treefmt-check> + :context-window 272000}, treefmt-check> "gpt-5.2-codex" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :openai-codex-responses, treefmt-check> - :name "GPT-5.2 Codex", treefmt-check> - :base-url "https://chatgpt.com/backend-api", treefmt-check> - :id "gpt-5.2-codex", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :openai-codex-responses, treefmt-check> + :name "GPT-5.2 Codex", treefmt-check> + :base-url "https://chatgpt.com/backend-api", treefmt-check> + :id "gpt-5.2-codex", treefmt-check> :cost treefmt-check> {:input 1.75, :output 14.0, :cache-read 0.175, :cache-write 0.0}, treefmt-check> - :max-tokens 128000, treefmt-check> - :provider :openai-codex, treefmt-check> - :context-window 272000}, treefmt-check> + :max-tokens 128000, treefmt-check> + :provider :openai-codex, treefmt-check> + :context-window 272000}, treefmt-check> "gpt-5.3-codex" treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> - :api :openai-codex-responses, treefmt-check> - :name "GPT-5.3 Codex", treefmt-check> - :base-url "https://chatgpt.com/backend-api", treefmt-check> - :id "gpt-5.3-codex", treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}}, treefmt-check> + :api :openai-codex-responses, treefmt-check> + :name "GPT-5.3 Codex", treefmt-check> + :base-url "https://chatgpt.com/backend-api", treefmt-check> + :id "gpt-5.3-codex", treefmt-check> :cost treefmt-check> {:input 1.75, :output 14.0, :cache-read 0.175, :cache-write 0.0}, treefmt-check> - :max-tokens 128000, treefmt-check> - :provider :openai-codex, treefmt-check> - :context-window 272000}, treefmt-check> + :max-tokens 128000, treefmt-check> + :provider :openai-codex, treefmt-check> + :context-window 272000}, treefmt-check> "gpt-5.3-codex-spark" treefmt-check> {:capabilities {:reasoning? true, :input #{:text}}, treefmt-check> :api :openai-codex-responses, treefmt-check> diff --git a/test/ol/llx/ai/adapters/anthropic_messages_test.cljc b/test/ol/llx/ai/adapters/anthropic_messages_test.cljc treefmt-check> index c4bd222..94fd989 100644 treefmt-check> --- a/test/ol/llx/ai/adapters/anthropic_messages_test.cljc treefmt-check> +++ b/test/ol/llx/ai/adapters/anthropic_messages_test.cljc treefmt-check> @@ -264,9 +264,9 @@ treefmt-check> (select-keys payload [:thinking :output_config :max_tokens :model :stream]))))) treefmt-check> treefmt-check> (deftest decode-event-stream-contract treefmt-check> - (let [env (stub-env) treefmt-check> - chunks (fixture "stream_events") treefmt-check> - init-state {:model anthropic-model} treefmt-check> + (let [env (stub-env) treefmt-check> + chunks (fixture "stream_events") treefmt-check> + init-state {:model anthropic-model} treefmt-check> {:keys [state events]} treefmt-check> (reduce (fn [{:keys [state events]} chunk] treefmt-check> (let [{next-state :state next-events :events} treefmt-check> @@ -275,7 +275,7 @@ treefmt-check> :events (into events next-events)})) treefmt-check> {:state init-state :events []} treefmt-check> chunks) treefmt-check> - finalize-result (sut/finalize env state)] treefmt-check> + finalize-result (sut/finalize env state)] treefmt-check> (is (= [:text-start treefmt-check> :text-delta treefmt-check> :text-delta treefmt-check> diff --git a/test/ol/llx/ai/adapters/google_generative_ai_test.cljc b/test/ol/llx/ai/adapters/google_generative_ai_test.cljc treefmt-check> index 3555000..523e785 100644 treefmt-check> --- a/test/ol/llx/ai/adapters/google_generative_ai_test.cljc treefmt-check> +++ b/test/ol/llx/ai/adapters/google_generative_ai_test.cljc treefmt-check> @@ -209,14 +209,14 @@ treefmt-check> {:name "vision" treefmt-check> :response {:output "(see attached image)"} treefmt-check> :parts [{:inlineData {:mimeType "image/png" :data "aGVsbG8="}}]}}]}] treefmt-check> - :generationConfig {:thinkingConfig {:thinkingLevel "MINIMAL"}}} treefmt-check> + :generationConfig {:thinkingConfig {:thinkingLevel "MINIMAL"}}} treefmt-check> multimodal-payload))) treefmt-check> (testing "text-only model drops images from functionResponse" treefmt-check> (is (= {:contents treefmt-check> [{:role "user" :parts [{:text "use the tool"}]} treefmt-check> {:role "user" treefmt-check> :parts [{:functionResponse {:name "vision" :response {:output ""}}}]}] treefmt-check> - :generationConfig {:thinkingConfig {:thinkingBudget 0}}} treefmt-check> + :generationConfig {:thinkingConfig {:thinkingBudget 0}}} treefmt-check> text-only-payload))))) treefmt-check> treefmt-check> (deftest decode-event-stream-contract treefmt-check> diff --git a/test/ol/llx/ai/adapters/openai_responses_test.cljc b/test/ol/llx/ai/adapters/openai_responses_test.cljc treefmt-check> index d64070a..a172728 100644 treefmt-check> --- a/test/ol/llx/ai/adapters/openai_responses_test.cljc treefmt-check> +++ b/test/ol/llx/ai/adapters/openai_responses_test.cljc treefmt-check> @@ -334,9 +334,9 @@ treefmt-check> (:total cost))))) treefmt-check> treefmt-check> (deftest decode-event-stream-contract treefmt-check> - (let [env (stub-env) treefmt-check> - chunks (fixture "stream_events") treefmt-check> - init-state {:model openai-responses-model} treefmt-check> + (let [env (stub-env) treefmt-check> + chunks (fixture "stream_events") treefmt-check> + init-state {:model openai-responses-model} treefmt-check> {:keys [state events]} treefmt-check> (reduce (fn [{:keys [state events]} chunk] treefmt-check> (let [{next-state :state next-events :events} treefmt-check> @@ -345,7 +345,7 @@ treefmt-check> :events (into events next-events)})) treefmt-check> {:state init-state :events []} treefmt-check> chunks) treefmt-check> - finalize-result (sut/finalize env state)] treefmt-check> + finalize-result (sut/finalize env state)] treefmt-check> (is (= [:thinking-start treefmt-check> :thinking-delta treefmt-check> :thinking-delta ❌ /nix/store/xawsg12g2nlff5pfmh7dsq4z2gq4dkm2-treefmt-check.drv^* error: Cannot build '/nix/store/xawsg12g2nlff5pfmh7dsq4z2gq4dkm2-treefmt-check.drv'. Reason: builder failed with exit code 1. Output paths: /nix/store/xj5s52vbav3kn1aw7nddbbkb0mwcn287-treefmt-check Last 25 log lines: > index d64070a..a172728 100644 > --- a/test/ol/llx/ai/adapters/openai_responses_test.cljc > +++ b/test/ol/llx/ai/adapters/openai_responses_test.cljc > @@ -334,9 +334,9 @@ > (:total cost))))) > > (deftest decode-event-stream-contract > - (let [env (stub-env) > - chunks (fixture "stream_events") > - init-state {:model openai-responses-model} > + (let [env (stub-env) > + chunks (fixture "stream_events") > + init-state {:model openai-responses-model} > {:keys [state events]} > (reduce (fn [{:keys [state events]} chunk] > (let [{next-state :state next-events :events} > @@ -345,7 +345,7 @@ > :events (into events next-events)})) > {:state init-state :events []} > chunks) > - finalize-result (sut/finalize env state)] > + finalize-result (sut/finalize env state)] > (is (= [:thinking-start > :thinking-delta > :thinking-delta For full logs, run: nix log /nix/store/xawsg12g2nlff5pfmh7dsq4z2gq4dkm2-treefmt-check.drv