1these 3 derivations will be built:2 /nix/store/066jigk7f292h4k7gy1cj4v2psdfcwam-treefmt.toml.drv3 /nix/store/v1nm3ryg4bxjfn7zfm0wps499sqkawcn-treefmt.drv4 /nix/store/xawsg12g2nlff5pfmh7dsq4z2gq4dkm2-treefmt-check.drv5building '/nix/store/066jigk7f292h4k7gy1cj4v2psdfcwam-treefmt.toml.drv'6treefmt.toml> structuredAttrs is enabled7building '/nix/store/v1nm3ryg4bxjfn7zfm0wps499sqkawcn-treefmt.drv'8building '/nix/store/xawsg12g2nlff5pfmh7dsq4z2gq4dkm2-treefmt-check.drv'9treefmt-check> treefmt v2.5.0traversed 183 files10treefmt-check> emitted 106 files for processing11treefmt-check> formatted 106 files (6 changed) in 13.79s12treefmt-check> M examples/bramble-coding-agent/src/bramble_coding_agent/tools.clj13treefmt-check> M examples/minimal-coding-agent/src/minimal_coding_agent/tools.clj14treefmt-check> M src/ol/llx/ai/impl/models_generated.cljc15treefmt-check> M test/ol/llx/ai/adapters/anthropic_messages_test.cljc16treefmt-check> M test/ol/llx/ai/adapters/google_generative_ai_test.cljc17treefmt-check> M test/ol/llx/ai/adapters/openai_responses_test.cljc18treefmt-check> diff --git a/examples/bramble-coding-agent/src/bramble_coding_agent/tools.clj b/examples/bramble-coding-agent/src/bramble_coding_agent/tools.clj19treefmt-check> index c4ff710..8e85de8 10064420treefmt-check> --- a/examples/bramble-coding-agent/src/bramble_coding_agent/tools.clj21treefmt-check> +++ b/examples/bramble-coding-agent/src/bramble_coding_agent/tools.clj22treefmt-check> @@ -189,12 +189,12 @@23treefmt-check> (let [f (io/file path)]24treefmt-check> (when-not (.exists f)25treefmt-check> (throw (ex-info (str "File not found: " path) {:type :not-found})))26treefmt-check> - (let [raw (slurp f)27treefmt-check> - {:keys [bom text]} (strip-bom raw)28treefmt-check> - line-ending (detect-line-ending text)29treefmt-check> - norm-content (normalize-to-lf text)30treefmt-check> - norm-old (normalize-to-lf oldText)31treefmt-check> - norm-new (normalize-to-lf newText)32treefmt-check> + (let [raw (slurp f)33treefmt-check> + {:keys [bom text]} (strip-bom raw)34treefmt-check> + line-ending (detect-line-ending text)35treefmt-check> + norm-content (normalize-to-lf text)36treefmt-check> + norm-old (normalize-to-lf oldText)37treefmt-check> + norm-new (normalize-to-lf newText)38treefmt-check> {:keys [found index match-length content-for-replacement]}39treefmt-check> (fuzzy-find-text norm-content norm-old)]40treefmt-check> (when-not found41treefmt-check> diff --git a/examples/minimal-coding-agent/src/minimal_coding_agent/tools.clj b/examples/minimal-coding-agent/src/minimal_coding_agent/tools.clj42treefmt-check> index 28979e4..77e62a3 10064443treefmt-check> --- a/examples/minimal-coding-agent/src/minimal_coding_agent/tools.clj44treefmt-check> +++ b/examples/minimal-coding-agent/src/minimal_coding_agent/tools.clj45treefmt-check> @@ -199,12 +199,12 @@46treefmt-check> (let [f (io/file path)]47treefmt-check> (when (not (.exists f))48treefmt-check> (throw (ex-info (str "File not found: " path) {:type :not-found})))49treefmt-check> - (let [raw (slurp f)50treefmt-check> - {:keys [bom text]} (strip-bom raw)51treefmt-check> - line-ending (detect-line-ending text)52treefmt-check> - norm-content (normalize-to-lf text)53treefmt-check> - norm-old (normalize-to-lf oldText)54treefmt-check> - norm-new (normalize-to-lf newText)55treefmt-check> + (let [raw (slurp f)56treefmt-check> + {:keys [bom text]} (strip-bom raw)57treefmt-check> + line-ending (detect-line-ending text)58treefmt-check> + norm-content (normalize-to-lf text)59treefmt-check> + norm-old (normalize-to-lf oldText)60treefmt-check> + norm-new (normalize-to-lf newText)61treefmt-check> {:keys [found index match-length content-for-replacement]}62treefmt-check> (fuzzy-find-text norm-content norm-old)]63treefmt-check> (when (not found)64treefmt-check> diff --git a/src/ol/llx/ai/impl/models_generated.cljc b/src/ol/llx/ai/impl/models_generated.cljc65treefmt-check> index b06ce38..edaf583 10064466treefmt-check> --- a/src/ol/llx/ai/impl/models_generated.cljc67treefmt-check> +++ b/src/ol/llx/ai/impl/models_generated.cljc68treefmt-check> @@ -25,71 +25,71 @@69treefmt-check> :provider :anthropic,70treefmt-check> :context-window 200000},71treefmt-check> "claude-3-5-sonnet-20240620"72treefmt-check> - {:capabilities {:reasoning? false, :input #{:image :text}},73treefmt-check> - :api :anthropic-messages,74treefmt-check> - :name "Claude Sonnet 3.5",75treefmt-check> - :base-url "https://api.anthropic.com",76treefmt-check> - :id "claude-3-5-sonnet-20240620",77treefmt-check> + {:capabilities {:reasoning? false, :input #{:image :text}},78treefmt-check> + :api :anthropic-messages,79treefmt-check> + :name "Claude Sonnet 3.5",80treefmt-check> + :base-url "https://api.anthropic.com",81treefmt-check> + :id "claude-3-5-sonnet-20240620",82treefmt-check> :cost83treefmt-check> {:input 3.0, :output 15.0, :cache-read 0.3, :cache-write 3.75},84treefmt-check> - :max-tokens 8192,85treefmt-check> - :provider :anthropic,86treefmt-check> - :context-window 200000},87treefmt-check> + :max-tokens 8192,88treefmt-check> + :provider :anthropic,89treefmt-check> + :context-window 200000},90treefmt-check> "claude-3-5-sonnet-20241022"91treefmt-check> - {:capabilities {:reasoning? false, :input #{:image :text}},92treefmt-check> - :api :anthropic-messages,93treefmt-check> - :name "Claude Sonnet 3.5 v2",94treefmt-check> - :base-url "https://api.anthropic.com",95treefmt-check> - :id "claude-3-5-sonnet-20241022",96treefmt-check> + {:capabilities {:reasoning? false, :input #{:image :text}},97treefmt-check> + :api :anthropic-messages,98treefmt-check> + :name "Claude Sonnet 3.5 v2",99treefmt-check> + :base-url "https://api.anthropic.com",100treefmt-check> + :id "claude-3-5-sonnet-20241022",101treefmt-check> :cost102treefmt-check> {:input 3.0, :output 15.0, :cache-read 0.3, :cache-write 3.75},103treefmt-check> - :max-tokens 8192,104treefmt-check> - :provider :anthropic,105treefmt-check> - :context-window 200000},106treefmt-check> + :max-tokens 8192,107treefmt-check> + :provider :anthropic,108treefmt-check> + :context-window 200000},109treefmt-check> "claude-3-7-sonnet-20250219"110treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},111treefmt-check> - :api :anthropic-messages,112treefmt-check> - :name "Claude Sonnet 3.7",113treefmt-check> - :base-url "https://api.anthropic.com",114treefmt-check> - :id "claude-3-7-sonnet-20250219",115treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},116treefmt-check> + :api :anthropic-messages,117treefmt-check> + :name "Claude Sonnet 3.7",118treefmt-check> + :base-url "https://api.anthropic.com",119treefmt-check> + :id "claude-3-7-sonnet-20250219",120treefmt-check> :cost121treefmt-check> {:input 3.0, :output 15.0, :cache-read 0.3, :cache-write 3.75},122treefmt-check> - :max-tokens 64000,123treefmt-check> - :provider :anthropic,124treefmt-check> - :context-window 200000},125treefmt-check> + :max-tokens 64000,126treefmt-check> + :provider :anthropic,127treefmt-check> + :context-window 200000},128treefmt-check> "claude-3-7-sonnet-latest"129treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},130treefmt-check> - :api :anthropic-messages,131treefmt-check> - :name "Claude Sonnet 3.7 (latest)",132treefmt-check> - :base-url "https://api.anthropic.com",133treefmt-check> - :id "claude-3-7-sonnet-latest",134treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},135treefmt-check> + :api :anthropic-messages,136treefmt-check> + :name "Claude Sonnet 3.7 (latest)",137treefmt-check> + :base-url "https://api.anthropic.com",138treefmt-check> + :id "claude-3-7-sonnet-latest",139treefmt-check> :cost140treefmt-check> {:input 3.0, :output 15.0, :cache-read 0.3, :cache-write 3.75},141treefmt-check> - :max-tokens 64000,142treefmt-check> - :provider :anthropic,143treefmt-check> - :context-window 200000},144treefmt-check> + :max-tokens 64000,145treefmt-check> + :provider :anthropic,146treefmt-check> + :context-window 200000},147treefmt-check> "claude-3-haiku-20240307"148treefmt-check> - {:capabilities {:reasoning? false, :input #{:image :text}},149treefmt-check> - :api :anthropic-messages,150treefmt-check> - :name "Claude Haiku 3",151treefmt-check> - :base-url "https://api.anthropic.com",152treefmt-check> - :id "claude-3-haiku-20240307",153treefmt-check> + {:capabilities {:reasoning? false, :input #{:image :text}},154treefmt-check> + :api :anthropic-messages,155treefmt-check> + :name "Claude Haiku 3",156treefmt-check> + :base-url "https://api.anthropic.com",157treefmt-check> + :id "claude-3-haiku-20240307",158treefmt-check> :cost159treefmt-check> {:input 0.25, :output 1.25, :cache-read 0.03, :cache-write 0.3},160treefmt-check> - :max-tokens 4096,161treefmt-check> - :provider :anthropic,162treefmt-check> - :context-window 200000},163treefmt-check> + :max-tokens 4096,164treefmt-check> + :provider :anthropic,165treefmt-check> + :context-window 200000},166treefmt-check> "claude-3-opus-20240229"167treefmt-check> - {:capabilities {:reasoning? false, :input #{:image :text}},168treefmt-check> - :api :anthropic-messages,169treefmt-check> - :name "Claude Opus 3",170treefmt-check> - :base-url "https://api.anthropic.com",171treefmt-check> - :id "claude-3-opus-20240229",172treefmt-check> + {:capabilities {:reasoning? false, :input #{:image :text}},173treefmt-check> + :api :anthropic-messages,174treefmt-check> + :name "Claude Opus 3",175treefmt-check> + :base-url "https://api.anthropic.com",176treefmt-check> + :id "claude-3-opus-20240229",177treefmt-check> :cost178treefmt-check> {:input 15.0, :output 75.0, :cache-read 1.5, :cache-write 18.75},179treefmt-check> - :max-tokens 4096,180treefmt-check> - :provider :anthropic,181treefmt-check> - :context-window 200000},182treefmt-check> + :max-tokens 4096,183treefmt-check> + :provider :anthropic,184treefmt-check> + :context-window 200000},185treefmt-check> "claude-3-sonnet-20240229"186treefmt-check> {:capabilities {:reasoning? false, :input #{:image :text}},187treefmt-check> :api :anthropic-messages,188treefmt-check> @@ -121,303 +121,303 @@189treefmt-check> :provider :anthropic,190treefmt-check> :context-window 200000},191treefmt-check> "claude-opus-4-0"192treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},193treefmt-check> - :api :anthropic-messages,194treefmt-check> - :name "Claude Opus 4 (latest)",195treefmt-check> - :base-url "https://api.anthropic.com",196treefmt-check> - :id "claude-opus-4-0",197treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},198treefmt-check> + :api :anthropic-messages,199treefmt-check> + :name "Claude Opus 4 (latest)",200treefmt-check> + :base-url "https://api.anthropic.com",201treefmt-check> + :id "claude-opus-4-0",202treefmt-check> :cost203treefmt-check> {:input 15.0, :output 75.0, :cache-read 1.5, :cache-write 18.75},204treefmt-check> - :max-tokens 32000,205treefmt-check> - :provider :anthropic,206treefmt-check> - :context-window 200000},207treefmt-check> + :max-tokens 32000,208treefmt-check> + :provider :anthropic,209treefmt-check> + :context-window 200000},210treefmt-check> "claude-opus-4-1"211treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},212treefmt-check> - :api :anthropic-messages,213treefmt-check> - :name "Claude Opus 4.1 (latest)",214treefmt-check> - :base-url "https://api.anthropic.com",215treefmt-check> - :id "claude-opus-4-1",216treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},217treefmt-check> + :api :anthropic-messages,218treefmt-check> + :name "Claude Opus 4.1 (latest)",219treefmt-check> + :base-url "https://api.anthropic.com",220treefmt-check> + :id "claude-opus-4-1",221treefmt-check> :cost222treefmt-check> {:input 15.0, :output 75.0, :cache-read 1.5, :cache-write 18.75},223treefmt-check> - :max-tokens 32000,224treefmt-check> - :provider :anthropic,225treefmt-check> - :context-window 200000},226treefmt-check> + :max-tokens 32000,227treefmt-check> + :provider :anthropic,228treefmt-check> + :context-window 200000},229treefmt-check> "claude-opus-4-1-20250805"230treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},231treefmt-check> - :api :anthropic-messages,232treefmt-check> - :name "Claude Opus 4.1",233treefmt-check> - :base-url "https://api.anthropic.com",234treefmt-check> - :id "claude-opus-4-1-20250805",235treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},236treefmt-check> + :api :anthropic-messages,237treefmt-check> + :name "Claude Opus 4.1",238treefmt-check> + :base-url "https://api.anthropic.com",239treefmt-check> + :id "claude-opus-4-1-20250805",240treefmt-check> :cost241treefmt-check> {:input 15.0, :output 75.0, :cache-read 1.5, :cache-write 18.75},242treefmt-check> - :max-tokens 32000,243treefmt-check> - :provider :anthropic,244treefmt-check> - :context-window 200000},245treefmt-check> + :max-tokens 32000,246treefmt-check> + :provider :anthropic,247treefmt-check> + :context-window 200000},248treefmt-check> "claude-opus-4-20250514"249treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},250treefmt-check> - :api :anthropic-messages,251treefmt-check> - :name "Claude Opus 4",252treefmt-check> - :base-url "https://api.anthropic.com",253treefmt-check> - :id "claude-opus-4-20250514",254treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},255treefmt-check> + :api :anthropic-messages,256treefmt-check> + :name "Claude Opus 4",257treefmt-check> + :base-url "https://api.anthropic.com",258treefmt-check> + :id "claude-opus-4-20250514",259treefmt-check> :cost260treefmt-check> {:input 15.0, :output 75.0, :cache-read 1.5, :cache-write 18.75},261treefmt-check> - :max-tokens 32000,262treefmt-check> - :provider :anthropic,263treefmt-check> - :context-window 200000},264treefmt-check> + :max-tokens 32000,265treefmt-check> + :provider :anthropic,266treefmt-check> + :context-window 200000},267treefmt-check> "claude-opus-4-5"268treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},269treefmt-check> - :api :anthropic-messages,270treefmt-check> - :name "Claude Opus 4.5 (latest)",271treefmt-check> - :base-url "https://api.anthropic.com",272treefmt-check> - :id "claude-opus-4-5",273treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},274treefmt-check> + :api :anthropic-messages,275treefmt-check> + :name "Claude Opus 4.5 (latest)",276treefmt-check> + :base-url "https://api.anthropic.com",277treefmt-check> + :id "claude-opus-4-5",278treefmt-check> :cost279treefmt-check> {:input 5.0, :output 25.0, :cache-read 0.5, :cache-write 6.25},280treefmt-check> - :max-tokens 64000,281treefmt-check> - :provider :anthropic,282treefmt-check> - :context-window 200000},283treefmt-check> + :max-tokens 64000,284treefmt-check> + :provider :anthropic,285treefmt-check> + :context-window 200000},286treefmt-check> "claude-opus-4-5-20251101"287treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},288treefmt-check> - :api :anthropic-messages,289treefmt-check> - :name "Claude Opus 4.5",290treefmt-check> - :base-url "https://api.anthropic.com",291treefmt-check> - :id "claude-opus-4-5-20251101",292treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},293treefmt-check> + :api :anthropic-messages,294treefmt-check> + :name "Claude Opus 4.5",295treefmt-check> + :base-url "https://api.anthropic.com",296treefmt-check> + :id "claude-opus-4-5-20251101",297treefmt-check> :cost298treefmt-check> {:input 5.0, :output 25.0, :cache-read 0.5, :cache-write 6.25},299treefmt-check> - :max-tokens 64000,300treefmt-check> - :provider :anthropic,301treefmt-check> - :context-window 200000},302treefmt-check> + :max-tokens 64000,303treefmt-check> + :provider :anthropic,304treefmt-check> + :context-window 200000},305treefmt-check> "claude-opus-4-6"306treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},307treefmt-check> - :api :anthropic-messages,308treefmt-check> - :name "Claude Opus 4.6",309treefmt-check> - :base-url "https://api.anthropic.com",310treefmt-check> - :id "claude-opus-4-6",311treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},312treefmt-check> + :api :anthropic-messages,313treefmt-check> + :name "Claude Opus 4.6",314treefmt-check> + :base-url "https://api.anthropic.com",315treefmt-check> + :id "claude-opus-4-6",316treefmt-check> :cost317treefmt-check> {:input 5.0, :output 25.0, :cache-read 0.5, :cache-write 6.25},318treefmt-check> - :max-tokens 128000,319treefmt-check> - :provider :anthropic,320treefmt-check> - :context-window 1000000},321treefmt-check> + :max-tokens 128000,322treefmt-check> + :provider :anthropic,323treefmt-check> + :context-window 1000000},324treefmt-check> "claude-sonnet-4-0"325treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},326treefmt-check> - :api :anthropic-messages,327treefmt-check> - :name "Claude Sonnet 4 (latest)",328treefmt-check> - :base-url "https://api.anthropic.com",329treefmt-check> - :id "claude-sonnet-4-0",330treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},331treefmt-check> + :api :anthropic-messages,332treefmt-check> + :name "Claude Sonnet 4 (latest)",333treefmt-check> + :base-url "https://api.anthropic.com",334treefmt-check> + :id "claude-sonnet-4-0",335treefmt-check> :cost336treefmt-check> {:input 3.0, :output 15.0, :cache-read 0.3, :cache-write 3.75},337treefmt-check> - :max-tokens 64000,338treefmt-check> - :provider :anthropic,339treefmt-check> - :context-window 200000},340treefmt-check> + :max-tokens 64000,341treefmt-check> + :provider :anthropic,342treefmt-check> + :context-window 200000},343treefmt-check> "claude-sonnet-4-20250514"344treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},345treefmt-check> - :api :anthropic-messages,346treefmt-check> - :name "Claude Sonnet 4",347treefmt-check> - :base-url "https://api.anthropic.com",348treefmt-check> - :id "claude-sonnet-4-20250514",349treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},350treefmt-check> + :api :anthropic-messages,351treefmt-check> + :name "Claude Sonnet 4",352treefmt-check> + :base-url "https://api.anthropic.com",353treefmt-check> + :id "claude-sonnet-4-20250514",354treefmt-check> :cost355treefmt-check> {:input 3.0, :output 15.0, :cache-read 0.3, :cache-write 3.75},356treefmt-check> - :max-tokens 64000,357treefmt-check> - :provider :anthropic,358treefmt-check> - :context-window 200000},359treefmt-check> + :max-tokens 64000,360treefmt-check> + :provider :anthropic,361treefmt-check> + :context-window 200000},362treefmt-check> "claude-sonnet-4-5"363treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},364treefmt-check> - :api :anthropic-messages,365treefmt-check> - :name "Claude Sonnet 4.5 (latest)",366treefmt-check> - :base-url "https://api.anthropic.com",367treefmt-check> - :id "claude-sonnet-4-5",368treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},369treefmt-check> + :api :anthropic-messages,370treefmt-check> + :name "Claude Sonnet 4.5 (latest)",371treefmt-check> + :base-url "https://api.anthropic.com",372treefmt-check> + :id "claude-sonnet-4-5",373treefmt-check> :cost374treefmt-check> {:input 3.0, :output 15.0, :cache-read 0.3, :cache-write 3.75},375treefmt-check> - :max-tokens 64000,376treefmt-check> - :provider :anthropic,377treefmt-check> - :context-window 200000},378treefmt-check> + :max-tokens 64000,379treefmt-check> + :provider :anthropic,380treefmt-check> + :context-window 200000},381treefmt-check> "claude-sonnet-4-5-20250929"382treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},383treefmt-check> - :api :anthropic-messages,384treefmt-check> - :name "Claude Sonnet 4.5",385treefmt-check> - :base-url "https://api.anthropic.com",386treefmt-check> - :id "claude-sonnet-4-5-20250929",387treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},388treefmt-check> + :api :anthropic-messages,389treefmt-check> + :name "Claude Sonnet 4.5",390treefmt-check> + :base-url "https://api.anthropic.com",391treefmt-check> + :id "claude-sonnet-4-5-20250929",392treefmt-check> :cost393treefmt-check> {:input 3.0, :output 15.0, :cache-read 0.3, :cache-write 3.75},394treefmt-check> - :max-tokens 64000,395treefmt-check> - :provider :anthropic,396treefmt-check> - :context-window 200000},397treefmt-check> + :max-tokens 64000,398treefmt-check> + :provider :anthropic,399treefmt-check> + :context-window 200000},400treefmt-check> "claude-sonnet-4-6"401treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},402treefmt-check> - :api :anthropic-messages,403treefmt-check> - :name "Claude Sonnet 4.6",404treefmt-check> - :base-url "https://api.anthropic.com",405treefmt-check> - :id "claude-sonnet-4-6",406treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},407treefmt-check> + :api :anthropic-messages,408treefmt-check> + :name "Claude Sonnet 4.6",409treefmt-check> + :base-url "https://api.anthropic.com",410treefmt-check> + :id "claude-sonnet-4-6",411treefmt-check> :cost412treefmt-check> {:input 3.0, :output 15.0, :cache-read 0.3, :cache-write 3.75},413treefmt-check> - :max-tokens 64000,414treefmt-check> - :provider :anthropic,415treefmt-check> - :context-window 1000000}},416treefmt-check> + :max-tokens 64000,417treefmt-check> + :provider :anthropic,418treefmt-check> + :context-window 1000000}},419treefmt-check> :google420treefmt-check> {"gemini-1.5-flash"421treefmt-check> - {:capabilities {:reasoning? false, :input #{:image :text}},422treefmt-check> - :api :google-generative-ai,423treefmt-check> - :name "Gemini 1.5 Flash",424treefmt-check> - :base-url "https://generativelanguage.googleapis.com/v1beta",425treefmt-check> - :id "gemini-1.5-flash",426treefmt-check> + {:capabilities {:reasoning? false, :input #{:image :text}},427treefmt-check> + :api :google-generative-ai,428treefmt-check> + :name "Gemini 1.5 Flash",429treefmt-check> + :base-url "https://generativelanguage.googleapis.com/v1beta",430treefmt-check> + :id "gemini-1.5-flash",431treefmt-check> :cost432treefmt-check> {:input 0.075, :output 0.3, :cache-read 0.01875, :cache-write 0.0},433treefmt-check> - :max-tokens 8192,434treefmt-check> - :provider :google,435treefmt-check> - :context-window 1000000},436treefmt-check> + :max-tokens 8192,437treefmt-check> + :provider :google,438treefmt-check> + :context-window 1000000},439treefmt-check> "gemini-1.5-flash-8b"440treefmt-check> - {:capabilities {:reasoning? false, :input #{:image :text}},441treefmt-check> - :api :google-generative-ai,442treefmt-check> - :name "Gemini 1.5 Flash-8B",443treefmt-check> - :base-url "https://generativelanguage.googleapis.com/v1beta",444treefmt-check> - :id "gemini-1.5-flash-8b",445treefmt-check> + {:capabilities {:reasoning? false, :input #{:image :text}},446treefmt-check> + :api :google-generative-ai,447treefmt-check> + :name "Gemini 1.5 Flash-8B",448treefmt-check> + :base-url "https://generativelanguage.googleapis.com/v1beta",449treefmt-check> + :id "gemini-1.5-flash-8b",450treefmt-check> :cost451treefmt-check> {:input 0.0375, :output 0.15, :cache-read 0.01, :cache-write 0.0},452treefmt-check> - :max-tokens 8192,453treefmt-check> - :provider :google,454treefmt-check> - :context-window 1000000},455treefmt-check> + :max-tokens 8192,456treefmt-check> + :provider :google,457treefmt-check> + :context-window 1000000},458treefmt-check> "gemini-1.5-pro"459treefmt-check> - {:capabilities {:reasoning? false, :input #{:image :text}},460treefmt-check> - :api :google-generative-ai,461treefmt-check> - :name "Gemini 1.5 Pro",462treefmt-check> - :base-url "https://generativelanguage.googleapis.com/v1beta",463treefmt-check> - :id "gemini-1.5-pro",464treefmt-check> + {:capabilities {:reasoning? false, :input #{:image :text}},465treefmt-check> + :api :google-generative-ai,466treefmt-check> + :name "Gemini 1.5 Pro",467treefmt-check> + :base-url "https://generativelanguage.googleapis.com/v1beta",468treefmt-check> + :id "gemini-1.5-pro",469treefmt-check> :cost470treefmt-check> {:input 1.25, :output 5.0, :cache-read 0.3125, :cache-write 0.0},471treefmt-check> - :max-tokens 8192,472treefmt-check> - :provider :google,473treefmt-check> - :context-window 1000000},474treefmt-check> + :max-tokens 8192,475treefmt-check> + :provider :google,476treefmt-check> + :context-window 1000000},477treefmt-check> "gemini-2.0-flash"478treefmt-check> - {:capabilities {:reasoning? false, :input #{:image :text}},479treefmt-check> - :api :google-generative-ai,480treefmt-check> - :name "Gemini 2.0 Flash",481treefmt-check> - :base-url "https://generativelanguage.googleapis.com/v1beta",482treefmt-check> - :id "gemini-2.0-flash",483treefmt-check> + {:capabilities {:reasoning? false, :input #{:image :text}},484treefmt-check> + :api :google-generative-ai,485treefmt-check> + :name "Gemini 2.0 Flash",486treefmt-check> + :base-url "https://generativelanguage.googleapis.com/v1beta",487treefmt-check> + :id "gemini-2.0-flash",488treefmt-check> :cost489treefmt-check> {:input 0.1, :output 0.4, :cache-read 0.025, :cache-write 0.0},490treefmt-check> - :max-tokens 8192,491treefmt-check> - :provider :google,492treefmt-check> - :context-window 1048576},493treefmt-check> + :max-tokens 8192,494treefmt-check> + :provider :google,495treefmt-check> + :context-window 1048576},496treefmt-check> "gemini-2.0-flash-lite"497treefmt-check> - {:capabilities {:reasoning? false, :input #{:image :text}},498treefmt-check> - :api :google-generative-ai,499treefmt-check> - :name "Gemini 2.0 Flash Lite",500treefmt-check> - :base-url "https://generativelanguage.googleapis.com/v1beta",501treefmt-check> - :id "gemini-2.0-flash-lite",502treefmt-check> + {:capabilities {:reasoning? false, :input #{:image :text}},503treefmt-check> + :api :google-generative-ai,504treefmt-check> + :name "Gemini 2.0 Flash Lite",505treefmt-check> + :base-url "https://generativelanguage.googleapis.com/v1beta",506treefmt-check> + :id "gemini-2.0-flash-lite",507treefmt-check> :cost508treefmt-check> {:input 0.075, :output 0.3, :cache-read 0.0, :cache-write 0.0},509treefmt-check> - :max-tokens 8192,510treefmt-check> - :provider :google,511treefmt-check> - :context-window 1048576},512treefmt-check> + :max-tokens 8192,513treefmt-check> + :provider :google,514treefmt-check> + :context-window 1048576},515treefmt-check> "gemini-2.5-flash"516treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},517treefmt-check> - :api :google-generative-ai,518treefmt-check> - :name "Gemini 2.5 Flash",519treefmt-check> - :base-url "https://generativelanguage.googleapis.com/v1beta",520treefmt-check> - :id "gemini-2.5-flash",521treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},522treefmt-check> + :api :google-generative-ai,523treefmt-check> + :name "Gemini 2.5 Flash",524treefmt-check> + :base-url "https://generativelanguage.googleapis.com/v1beta",525treefmt-check> + :id "gemini-2.5-flash",526treefmt-check> :cost527treefmt-check> {:input 0.3, :output 2.5, :cache-read 0.075, :cache-write 0.0},528treefmt-check> - :max-tokens 65536,529treefmt-check> - :provider :google,530treefmt-check> - :context-window 1048576},531treefmt-check> + :max-tokens 65536,532treefmt-check> + :provider :google,533treefmt-check> + :context-window 1048576},534treefmt-check> "gemini-2.5-flash-lite"535treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},536treefmt-check> - :api :google-generative-ai,537treefmt-check> - :name "Gemini 2.5 Flash Lite",538treefmt-check> - :base-url "https://generativelanguage.googleapis.com/v1beta",539treefmt-check> - :id "gemini-2.5-flash-lite",540treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},541treefmt-check> + :api :google-generative-ai,542treefmt-check> + :name "Gemini 2.5 Flash Lite",543treefmt-check> + :base-url "https://generativelanguage.googleapis.com/v1beta",544treefmt-check> + :id "gemini-2.5-flash-lite",545treefmt-check> :cost546treefmt-check> {:input 0.1, :output 0.4, :cache-read 0.025, :cache-write 0.0},547treefmt-check> - :max-tokens 65536,548treefmt-check> - :provider :google,549treefmt-check> - :context-window 1048576},550treefmt-check> + :max-tokens 65536,551treefmt-check> + :provider :google,552treefmt-check> + :context-window 1048576},553treefmt-check> "gemini-2.5-flash-lite-preview-06-17"554treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},555treefmt-check> - :api :google-generative-ai,556treefmt-check> - :name "Gemini 2.5 Flash Lite Preview 06-17",557treefmt-check> - :base-url "https://generativelanguage.googleapis.com/v1beta",558treefmt-check> - :id "gemini-2.5-flash-lite-preview-06-17",559treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},560treefmt-check> + :api :google-generative-ai,561treefmt-check> + :name "Gemini 2.5 Flash Lite Preview 06-17",562treefmt-check> + :base-url "https://generativelanguage.googleapis.com/v1beta",563treefmt-check> + :id "gemini-2.5-flash-lite-preview-06-17",564treefmt-check> :cost565treefmt-check> {:input 0.1, :output 0.4, :cache-read 0.025, :cache-write 0.0},566treefmt-check> - :max-tokens 65536,567treefmt-check> - :provider :google,568treefmt-check> - :context-window 1048576},569treefmt-check> + :max-tokens 65536,570treefmt-check> + :provider :google,571treefmt-check> + :context-window 1048576},572treefmt-check> "gemini-2.5-flash-lite-preview-09-2025"573treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},574treefmt-check> - :api :google-generative-ai,575treefmt-check> - :name "Gemini 2.5 Flash Lite Preview 09-25",576treefmt-check> - :base-url "https://generativelanguage.googleapis.com/v1beta",577treefmt-check> - :id "gemini-2.5-flash-lite-preview-09-2025",578treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},579treefmt-check> + :api :google-generative-ai,580treefmt-check> + :name "Gemini 2.5 Flash Lite Preview 09-25",581treefmt-check> + :base-url "https://generativelanguage.googleapis.com/v1beta",582treefmt-check> + :id "gemini-2.5-flash-lite-preview-09-2025",583treefmt-check> :cost584treefmt-check> {:input 0.1, :output 0.4, :cache-read 0.025, :cache-write 0.0},585treefmt-check> - :max-tokens 65536,586treefmt-check> - :provider :google,587treefmt-check> - :context-window 1048576},588treefmt-check> + :max-tokens 65536,589treefmt-check> + :provider :google,590treefmt-check> + :context-window 1048576},591treefmt-check> "gemini-2.5-flash-preview-04-17"592treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},593treefmt-check> - :api :google-generative-ai,594treefmt-check> - :name "Gemini 2.5 Flash Preview 04-17",595treefmt-check> - :base-url "https://generativelanguage.googleapis.com/v1beta",596treefmt-check> - :id "gemini-2.5-flash-preview-04-17",597treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},598treefmt-check> + :api :google-generative-ai,599treefmt-check> + :name "Gemini 2.5 Flash Preview 04-17",600treefmt-check> + :base-url "https://generativelanguage.googleapis.com/v1beta",601treefmt-check> + :id "gemini-2.5-flash-preview-04-17",602treefmt-check> :cost603treefmt-check> {:input 0.15, :output 0.6, :cache-read 0.0375, :cache-write 0.0},604treefmt-check> - :max-tokens 65536,605treefmt-check> - :provider :google,606treefmt-check> - :context-window 1048576},607treefmt-check> + :max-tokens 65536,608treefmt-check> + :provider :google,609treefmt-check> + :context-window 1048576},610treefmt-check> "gemini-2.5-flash-preview-05-20"611treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},612treefmt-check> - :api :google-generative-ai,613treefmt-check> - :name "Gemini 2.5 Flash Preview 05-20",614treefmt-check> - :base-url "https://generativelanguage.googleapis.com/v1beta",615treefmt-check> - :id "gemini-2.5-flash-preview-05-20",616treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},617treefmt-check> + :api :google-generative-ai,618treefmt-check> + :name "Gemini 2.5 Flash Preview 05-20",619treefmt-check> + :base-url "https://generativelanguage.googleapis.com/v1beta",620treefmt-check> + :id "gemini-2.5-flash-preview-05-20",621treefmt-check> :cost622treefmt-check> {:input 0.15, :output 0.6, :cache-read 0.0375, :cache-write 0.0},623treefmt-check> - :max-tokens 65536,624treefmt-check> - :provider :google,625treefmt-check> - :context-window 1048576},626treefmt-check> + :max-tokens 65536,627treefmt-check> + :provider :google,628treefmt-check> + :context-window 1048576},629treefmt-check> "gemini-2.5-flash-preview-09-2025"630treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},631treefmt-check> - :api :google-generative-ai,632treefmt-check> - :name "Gemini 2.5 Flash Preview 09-25",633treefmt-check> - :base-url "https://generativelanguage.googleapis.com/v1beta",634treefmt-check> - :id "gemini-2.5-flash-preview-09-2025",635treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},636treefmt-check> + :api :google-generative-ai,637treefmt-check> + :name "Gemini 2.5 Flash Preview 09-25",638treefmt-check> + :base-url "https://generativelanguage.googleapis.com/v1beta",639treefmt-check> + :id "gemini-2.5-flash-preview-09-2025",640treefmt-check> :cost641treefmt-check> {:input 0.3, :output 2.5, :cache-read 0.075, :cache-write 0.0},642treefmt-check> - :max-tokens 65536,643treefmt-check> - :provider :google,644treefmt-check> - :context-window 1048576},645treefmt-check> + :max-tokens 65536,646treefmt-check> + :provider :google,647treefmt-check> + :context-window 1048576},648treefmt-check> "gemini-2.5-pro"649treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},650treefmt-check> - :api :google-generative-ai,651treefmt-check> - :name "Gemini 2.5 Pro",652treefmt-check> - :base-url "https://generativelanguage.googleapis.com/v1beta",653treefmt-check> - :id "gemini-2.5-pro",654treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},655treefmt-check> + :api :google-generative-ai,656treefmt-check> + :name "Gemini 2.5 Pro",657treefmt-check> + :base-url "https://generativelanguage.googleapis.com/v1beta",658treefmt-check> + :id "gemini-2.5-pro",659treefmt-check> :cost660treefmt-check> {:input 1.25, :output 10.0, :cache-read 0.31, :cache-write 0.0},661treefmt-check> - :max-tokens 65536,662treefmt-check> - :provider :google,663treefmt-check> - :context-window 1048576},664treefmt-check> + :max-tokens 65536,665treefmt-check> + :provider :google,666treefmt-check> + :context-window 1048576},667treefmt-check> "gemini-2.5-pro-preview-05-06"668treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},669treefmt-check> - :api :google-generative-ai,670treefmt-check> - :name "Gemini 2.5 Pro Preview 05-06",671treefmt-check> - :base-url "https://generativelanguage.googleapis.com/v1beta",672treefmt-check> - :id "gemini-2.5-pro-preview-05-06",673treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},674treefmt-check> + :api :google-generative-ai,675treefmt-check> + :name "Gemini 2.5 Pro Preview 05-06",676treefmt-check> + :base-url "https://generativelanguage.googleapis.com/v1beta",677treefmt-check> + :id "gemini-2.5-pro-preview-05-06",678treefmt-check> :cost679treefmt-check> {:input 1.25, :output 10.0, :cache-read 0.31, :cache-write 0.0},680treefmt-check> - :max-tokens 65536,681treefmt-check> - :provider :google,682treefmt-check> - :context-window 1048576},683treefmt-check> + :max-tokens 65536,684treefmt-check> + :provider :google,685treefmt-check> + :context-window 1048576},686treefmt-check> "gemini-2.5-pro-preview-06-05"687treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},688treefmt-check> - :api :google-generative-ai,689treefmt-check> - :name "Gemini 2.5 Pro Preview 06-05",690treefmt-check> - :base-url "https://generativelanguage.googleapis.com/v1beta",691treefmt-check> - :id "gemini-2.5-pro-preview-06-05",692treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},693treefmt-check> + :api :google-generative-ai,694treefmt-check> + :name "Gemini 2.5 Pro Preview 06-05",695treefmt-check> + :base-url "https://generativelanguage.googleapis.com/v1beta",696treefmt-check> + :id "gemini-2.5-pro-preview-06-05",697treefmt-check> :cost698treefmt-check> {:input 1.25, :output 10.0, :cache-read 0.31, :cache-write 0.0},699treefmt-check> - :max-tokens 65536,700treefmt-check> - :provider :google,701treefmt-check> - :context-window 1048576},702treefmt-check> + :max-tokens 65536,703treefmt-check> + :provider :google,704treefmt-check> + :context-window 1048576},705treefmt-check> "gemini-3-flash-preview"706treefmt-check> {:capabilities {:reasoning? true, :input #{:image :text}},707treefmt-check> :api :google-generative-ai,708treefmt-check> @@ -469,27 +469,27 @@709treefmt-check> :provider :google,710treefmt-check> :context-window 1048576},711treefmt-check> "gemini-flash-latest"712treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},713treefmt-check> - :api :google-generative-ai,714treefmt-check> - :name "Gemini Flash Latest",715treefmt-check> - :base-url "https://generativelanguage.googleapis.com/v1beta",716treefmt-check> - :id "gemini-flash-latest",717treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},718treefmt-check> + :api :google-generative-ai,719treefmt-check> + :name "Gemini Flash Latest",720treefmt-check> + :base-url "https://generativelanguage.googleapis.com/v1beta",721treefmt-check> + :id "gemini-flash-latest",722treefmt-check> :cost723treefmt-check> {:input 0.3, :output 2.5, :cache-read 0.075, :cache-write 0.0},724treefmt-check> - :max-tokens 65536,725treefmt-check> - :provider :google,726treefmt-check> - :context-window 1048576},727treefmt-check> + :max-tokens 65536,728treefmt-check> + :provider :google,729treefmt-check> + :context-window 1048576},730treefmt-check> "gemini-flash-lite-latest"731treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},732treefmt-check> - :api :google-generative-ai,733treefmt-check> - :name "Gemini Flash-Lite Latest",734treefmt-check> - :base-url "https://generativelanguage.googleapis.com/v1beta",735treefmt-check> - :id "gemini-flash-lite-latest",736treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},737treefmt-check> + :api :google-generative-ai,738treefmt-check> + :name "Gemini Flash-Lite Latest",739treefmt-check> + :base-url "https://generativelanguage.googleapis.com/v1beta",740treefmt-check> + :id "gemini-flash-lite-latest",741treefmt-check> :cost742treefmt-check> {:input 0.1, :output 0.4, :cache-read 0.025, :cache-write 0.0},743treefmt-check> - :max-tokens 65536,744treefmt-check> - :provider :google,745treefmt-check> - :context-window 1048576},746treefmt-check> + :max-tokens 65536,747treefmt-check> + :provider :google,748treefmt-check> + :context-window 1048576},749treefmt-check> "gemini-live-2.5-flash"750treefmt-check> {:capabilities {:reasoning? true, :input #{:image :text}},751treefmt-check> :api :google-generative-ai,752treefmt-check> @@ -602,16 +602,16 @@753treefmt-check> :provider :mistral,754treefmt-check> :context-window 128000},755treefmt-check> "ministral-3b-latest"756treefmt-check> - {:capabilities {:reasoning? false, :input #{:text}},757treefmt-check> - :api :openai-completions,758treefmt-check> - :name "Ministral 3B (latest)",759treefmt-check> - :base-url "https://api.mistral.ai/v1",760treefmt-check> - :id "ministral-3b-latest",761treefmt-check> + {:capabilities {:reasoning? false, :input #{:text}},762treefmt-check> + :api :openai-completions,763treefmt-check> + :name "Ministral 3B (latest)",764treefmt-check> + :base-url "https://api.mistral.ai/v1",765treefmt-check> + :id "ministral-3b-latest",766treefmt-check> :cost767treefmt-check> {:input 0.04, :output 0.04, :cache-read 0.0, :cache-write 0.0},768treefmt-check> - :max-tokens 128000,769treefmt-check> - :provider :mistral,770treefmt-check> - :context-window 128000},771treefmt-check> + :max-tokens 128000,772treefmt-check> + :provider :mistral,773treefmt-check> + :context-window 128000},774treefmt-check> "ministral-8b-latest"775treefmt-check> {:capabilities {:reasoning? false, :input #{:text}},776treefmt-check> :api :openai-completions,777treefmt-check> @@ -683,16 +683,16 @@778treefmt-check> :provider :mistral,779treefmt-check> :context-window 128000},780treefmt-check> "mistral-nemo"781treefmt-check> - {:capabilities {:reasoning? false, :input #{:text}},782treefmt-check> - :api :openai-completions,783treefmt-check> - :name "Mistral Nemo",784treefmt-check> - :base-url "https://api.mistral.ai/v1",785treefmt-check> - :id "mistral-nemo",786treefmt-check> + {:capabilities {:reasoning? false, :input #{:text}},787treefmt-check> + :api :openai-completions,788treefmt-check> + :name "Mistral Nemo",789treefmt-check> + :base-url "https://api.mistral.ai/v1",790treefmt-check> + :id "mistral-nemo",791treefmt-check> :cost792treefmt-check> {:input 0.15, :output 0.15, :cache-read 0.0, :cache-write 0.0},793treefmt-check> - :max-tokens 128000,794treefmt-check> - :provider :mistral,795treefmt-check> - :context-window 128000},796treefmt-check> + :max-tokens 128000,797treefmt-check> + :provider :mistral,798treefmt-check> + :context-window 128000},799treefmt-check> "mistral-small-2506"800treefmt-check> {:capabilities {:reasoning? false, :input #{:image :text}},801treefmt-check> :api :openai-completions,802treefmt-check> @@ -714,16 +714,16 @@803treefmt-check> :provider :mistral,804treefmt-check> :context-window 128000},805treefmt-check> "open-mistral-7b"806treefmt-check> - {:capabilities {:reasoning? false, :input #{:text}},807treefmt-check> - :api :openai-completions,808treefmt-check> - :name "Mistral 7B",809treefmt-check> - :base-url "https://api.mistral.ai/v1",810treefmt-check> - :id "open-mistral-7b",811treefmt-check> + {:capabilities {:reasoning? false, :input #{:text}},812treefmt-check> + :api :openai-completions,813treefmt-check> + :name "Mistral 7B",814treefmt-check> + :base-url "https://api.mistral.ai/v1",815treefmt-check> + :id "open-mistral-7b",816treefmt-check> :cost817treefmt-check> {:input 0.25, :output 0.25, :cache-read 0.0, :cache-write 0.0},818treefmt-check> - :max-tokens 8000,819treefmt-check> - :provider :mistral,820treefmt-check> - :context-window 8000},821treefmt-check> + :max-tokens 8000,822treefmt-check> + :provider :mistral,823treefmt-check> + :context-window 8000},824treefmt-check> "open-mixtral-8x22b"825treefmt-check> {:capabilities {:reasoning? false, :input #{:text}},826treefmt-check> :api :openai-completions,827treefmt-check> @@ -745,16 +745,16 @@828treefmt-check> :provider :mistral,829treefmt-check> :context-window 32000},830treefmt-check> "pixtral-12b"831treefmt-check> - {:capabilities {:reasoning? false, :input #{:image :text}},832treefmt-check> - :api :openai-completions,833treefmt-check> - :name "Pixtral 12B",834treefmt-check> - :base-url "https://api.mistral.ai/v1",835treefmt-check> - :id "pixtral-12b",836treefmt-check> + {:capabilities {:reasoning? false, :input #{:image :text}},837treefmt-check> + :api :openai-completions,838treefmt-check> + :name "Pixtral 12B",839treefmt-check> + :base-url "https://api.mistral.ai/v1",840treefmt-check> + :id "pixtral-12b",841treefmt-check> :cost842treefmt-check> {:input 0.15, :output 0.15, :cache-read 0.0, :cache-write 0.0},843treefmt-check> - :max-tokens 128000,844treefmt-check> - :provider :mistral,845treefmt-check> - :context-window 128000},846treefmt-check> + :max-tokens 128000,847treefmt-check> + :provider :mistral,848treefmt-check> + :context-window 128000},849treefmt-check> "pixtral-large-latest"850treefmt-check> {:capabilities {:reasoning? false, :input #{:image :text}},851treefmt-check> :api :openai-completions,852treefmt-check> @@ -767,38 +767,38 @@853treefmt-check> :context-window 128000}},854treefmt-check> :openai855treefmt-check> {"codex-mini-latest"856treefmt-check> - {:capabilities {:reasoning? true, :input #{:text}},857treefmt-check> - :api :openai-responses,858treefmt-check> - :name "Codex Mini",859treefmt-check> - :base-url "https://api.openai.com/v1",860treefmt-check> - :id "codex-mini-latest",861treefmt-check> + {:capabilities {:reasoning? true, :input #{:text}},862treefmt-check> + :api :openai-responses,863treefmt-check> + :name "Codex Mini",864treefmt-check> + :base-url "https://api.openai.com/v1",865treefmt-check> + :id "codex-mini-latest",866treefmt-check> :cost867treefmt-check> {:input 1.5, :output 6.0, :cache-read 0.375, :cache-write 0.0},868treefmt-check> - :max-tokens 100000,869treefmt-check> - :provider :openai,870treefmt-check> - :context-window 200000},871treefmt-check> + :max-tokens 100000,872treefmt-check> + :provider :openai,873treefmt-check> + :context-window 200000},874treefmt-check> "gpt-4"875treefmt-check> - {:capabilities {:reasoning? false, :input #{:text}},876treefmt-check> - :api :openai-responses,877treefmt-check> - :name "GPT-4",878treefmt-check> - :base-url "https://api.openai.com/v1",879treefmt-check> - :id "gpt-4",880treefmt-check> + {:capabilities {:reasoning? false, :input #{:text}},881treefmt-check> + :api :openai-responses,882treefmt-check> + :name "GPT-4",883treefmt-check> + :base-url "https://api.openai.com/v1",884treefmt-check> + :id "gpt-4",885treefmt-check> :cost886treefmt-check> {:input 30.0, :output 60.0, :cache-read 0.0, :cache-write 0.0},887treefmt-check> - :max-tokens 8192,888treefmt-check> - :provider :openai,889treefmt-check> - :context-window 8192},890treefmt-check> + :max-tokens 8192,891treefmt-check> + :provider :openai,892treefmt-check> + :context-window 8192},893treefmt-check> "gpt-4-turbo"894treefmt-check> - {:capabilities {:reasoning? false, :input #{:image :text}},895treefmt-check> - :api :openai-responses,896treefmt-check> - :name "GPT-4 Turbo",897treefmt-check> - :base-url "https://api.openai.com/v1",898treefmt-check> - :id "gpt-4-turbo",899treefmt-check> + {:capabilities {:reasoning? false, :input #{:image :text}},900treefmt-check> + :api :openai-responses,901treefmt-check> + :name "GPT-4 Turbo",902treefmt-check> + :base-url "https://api.openai.com/v1",903treefmt-check> + :id "gpt-4-turbo",904treefmt-check> :cost905treefmt-check> {:input 10.0, :output 30.0, :cache-read 0.0, :cache-write 0.0},906treefmt-check> - :max-tokens 4096,907treefmt-check> - :provider :openai,908treefmt-check> - :context-window 128000},909treefmt-check> + :max-tokens 4096,910treefmt-check> + :provider :openai,911treefmt-check> + :context-window 128000},912treefmt-check> "gpt-4.1"913treefmt-check> {:capabilities {:reasoning? false, :input #{:image :text}},914treefmt-check> :api :openai-responses,915treefmt-check> @@ -830,16 +830,16 @@916treefmt-check> :provider :openai,917treefmt-check> :context-window 1047576},918treefmt-check> "gpt-4o"919treefmt-check> - {:capabilities {:reasoning? false, :input #{:image :text}},920treefmt-check> - :api :openai-responses,921treefmt-check> - :name "GPT-4o",922treefmt-check> - :base-url "https://api.openai.com/v1",923treefmt-check> - :id "gpt-4o",924treefmt-check> + {:capabilities {:reasoning? false, :input #{:image :text}},925treefmt-check> + :api :openai-responses,926treefmt-check> + :name "GPT-4o",927treefmt-check> + :base-url "https://api.openai.com/v1",928treefmt-check> + :id "gpt-4o",929treefmt-check> :cost930treefmt-check> {:input 2.5, :output 10.0, :cache-read 1.25, :cache-write 0.0},931treefmt-check> - :max-tokens 16384,932treefmt-check> - :provider :openai,933treefmt-check> - :context-window 128000},934treefmt-check> + :max-tokens 16384,935treefmt-check> + :provider :openai,936treefmt-check> + :context-window 128000},937treefmt-check> "gpt-4o-2024-05-13"938treefmt-check> {:capabilities {:reasoning? false, :input #{:image :text}},939treefmt-check> :api :openai-responses,940treefmt-check> @@ -851,269 +851,269 @@941treefmt-check> :provider :openai,942treefmt-check> :context-window 128000},943treefmt-check> "gpt-4o-2024-08-06"944treefmt-check> - {:capabilities {:reasoning? false, :input #{:image :text}},945treefmt-check> - :api :openai-responses,946treefmt-check> - :name "GPT-4o (2024-08-06)",947treefmt-check> - :base-url "https://api.openai.com/v1",948treefmt-check> - :id "gpt-4o-2024-08-06",949treefmt-check> + {:capabilities {:reasoning? false, :input #{:image :text}},950treefmt-check> + :api :openai-responses,951treefmt-check> + :name "GPT-4o (2024-08-06)",952treefmt-check> + :base-url "https://api.openai.com/v1",953treefmt-check> + :id "gpt-4o-2024-08-06",954treefmt-check> :cost955treefmt-check> {:input 2.5, :output 10.0, :cache-read 1.25, :cache-write 0.0},956treefmt-check> - :max-tokens 16384,957treefmt-check> - :provider :openai,958treefmt-check> - :context-window 128000},959treefmt-check> + :max-tokens 16384,960treefmt-check> + :provider :openai,961treefmt-check> + :context-window 128000},962treefmt-check> "gpt-4o-2024-11-20"963treefmt-check> - {:capabilities {:reasoning? false, :input #{:image :text}},964treefmt-check> - :api :openai-responses,965treefmt-check> - :name "GPT-4o (2024-11-20)",966treefmt-check> - :base-url "https://api.openai.com/v1",967treefmt-check> - :id "gpt-4o-2024-11-20",968treefmt-check> + {:capabilities {:reasoning? false, :input #{:image :text}},969treefmt-check> + :api :openai-responses,970treefmt-check> + :name "GPT-4o (2024-11-20)",971treefmt-check> + :base-url "https://api.openai.com/v1",972treefmt-check> + :id "gpt-4o-2024-11-20",973treefmt-check> :cost974treefmt-check> {:input 2.5, :output 10.0, :cache-read 1.25, :cache-write 0.0},975treefmt-check> - :max-tokens 16384,976treefmt-check> - :provider :openai,977treefmt-check> - :context-window 128000},978treefmt-check> + :max-tokens 16384,979treefmt-check> + :provider :openai,980treefmt-check> + :context-window 128000},981treefmt-check> "gpt-4o-mini"982treefmt-check> - {:capabilities {:reasoning? false, :input #{:image :text}},983treefmt-check> - :api :openai-responses,984treefmt-check> - :name "GPT-4o mini",985treefmt-check> - :base-url "https://api.openai.com/v1",986treefmt-check> - :id "gpt-4o-mini",987treefmt-check> + {:capabilities {:reasoning? false, :input #{:image :text}},988treefmt-check> + :api :openai-responses,989treefmt-check> + :name "GPT-4o mini",990treefmt-check> + :base-url "https://api.openai.com/v1",991treefmt-check> + :id "gpt-4o-mini",992treefmt-check> :cost993treefmt-check> {:input 0.15, :output 0.6, :cache-read 0.08, :cache-write 0.0},994treefmt-check> - :max-tokens 16384,995treefmt-check> - :provider :openai,996treefmt-check> - :context-window 128000},997treefmt-check> + :max-tokens 16384,998treefmt-check> + :provider :openai,999treefmt-check> + :context-window 128000},1000treefmt-check> "gpt-5"1001treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},1002treefmt-check> - :api :openai-responses,1003treefmt-check> - :name "GPT-5",1004treefmt-check> - :base-url "https://api.openai.com/v1",1005treefmt-check> - :id "gpt-5",1006treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},1007treefmt-check> + :api :openai-responses,1008treefmt-check> + :name "GPT-5",1009treefmt-check> + :base-url "https://api.openai.com/v1",1010treefmt-check> + :id "gpt-5",1011treefmt-check> :cost1012treefmt-check> {:input 1.25, :output 10.0, :cache-read 0.125, :cache-write 0.0},1013treefmt-check> - :max-tokens 128000,1014treefmt-check> - :provider :openai,1015treefmt-check> - :context-window 400000},1016treefmt-check> + :max-tokens 128000,1017treefmt-check> + :provider :openai,1018treefmt-check> + :context-window 400000},1019treefmt-check> "gpt-5-chat-latest"1020treefmt-check> - {:capabilities {:reasoning? false, :input #{:image :text}},1021treefmt-check> - :api :openai-responses,1022treefmt-check> - :name "GPT-5 Chat Latest",1023treefmt-check> - :base-url "https://api.openai.com/v1",1024treefmt-check> - :id "gpt-5-chat-latest",1025treefmt-check> + {:capabilities {:reasoning? false, :input #{:image :text}},1026treefmt-check> + :api :openai-responses,1027treefmt-check> + :name "GPT-5 Chat Latest",1028treefmt-check> + :base-url "https://api.openai.com/v1",1029treefmt-check> + :id "gpt-5-chat-latest",1030treefmt-check> :cost1031treefmt-check> {:input 1.25, :output 10.0, :cache-read 0.125, :cache-write 0.0},1032treefmt-check> - :max-tokens 16384,1033treefmt-check> - :provider :openai,1034treefmt-check> - :context-window 128000},1035treefmt-check> + :max-tokens 16384,1036treefmt-check> + :provider :openai,1037treefmt-check> + :context-window 128000},1038treefmt-check> "gpt-5-codex"1039treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},1040treefmt-check> - :api :openai-responses,1041treefmt-check> - :name "GPT-5-Codex",1042treefmt-check> - :base-url "https://api.openai.com/v1",1043treefmt-check> - :id "gpt-5-codex",1044treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},1045treefmt-check> + :api :openai-responses,1046treefmt-check> + :name "GPT-5-Codex",1047treefmt-check> + :base-url "https://api.openai.com/v1",1048treefmt-check> + :id "gpt-5-codex",1049treefmt-check> :cost1050treefmt-check> {:input 1.25, :output 10.0, :cache-read 0.125, :cache-write 0.0},1051treefmt-check> - :max-tokens 128000,1052treefmt-check> - :provider :openai,1053treefmt-check> - :context-window 400000},1054treefmt-check> + :max-tokens 128000,1055treefmt-check> + :provider :openai,1056treefmt-check> + :context-window 400000},1057treefmt-check> "gpt-5-mini"1058treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},1059treefmt-check> - :api :openai-responses,1060treefmt-check> - :name "GPT-5 Mini",1061treefmt-check> - :base-url "https://api.openai.com/v1",1062treefmt-check> - :id "gpt-5-mini",1063treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},1064treefmt-check> + :api :openai-responses,1065treefmt-check> + :name "GPT-5 Mini",1066treefmt-check> + :base-url "https://api.openai.com/v1",1067treefmt-check> + :id "gpt-5-mini",1068treefmt-check> :cost1069treefmt-check> {:input 0.25, :output 2.0, :cache-read 0.025, :cache-write 0.0},1070treefmt-check> - :max-tokens 128000,1071treefmt-check> - :provider :openai,1072treefmt-check> - :context-window 400000},1073treefmt-check> + :max-tokens 128000,1074treefmt-check> + :provider :openai,1075treefmt-check> + :context-window 400000},1076treefmt-check> "gpt-5-nano"1077treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},1078treefmt-check> - :api :openai-responses,1079treefmt-check> - :name "GPT-5 Nano",1080treefmt-check> - :base-url "https://api.openai.com/v1",1081treefmt-check> - :id "gpt-5-nano",1082treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},1083treefmt-check> + :api :openai-responses,1084treefmt-check> + :name "GPT-5 Nano",1085treefmt-check> + :base-url "https://api.openai.com/v1",1086treefmt-check> + :id "gpt-5-nano",1087treefmt-check> :cost1088treefmt-check> {:input 0.05, :output 0.4, :cache-read 0.005, :cache-write 0.0},1089treefmt-check> - :max-tokens 128000,1090treefmt-check> - :provider :openai,1091treefmt-check> - :context-window 400000},1092treefmt-check> + :max-tokens 128000,1093treefmt-check> + :provider :openai,1094treefmt-check> + :context-window 400000},1095treefmt-check> "gpt-5-pro"1096treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},1097treefmt-check> - :api :openai-responses,1098treefmt-check> - :name "GPT-5 Pro",1099treefmt-check> - :base-url "https://api.openai.com/v1",1100treefmt-check> - :id "gpt-5-pro",1101treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},1102treefmt-check> + :api :openai-responses,1103treefmt-check> + :name "GPT-5 Pro",1104treefmt-check> + :base-url "https://api.openai.com/v1",1105treefmt-check> + :id "gpt-5-pro",1106treefmt-check> :cost1107treefmt-check> {:input 15.0, :output 120.0, :cache-read 0.0, :cache-write 0.0},1108treefmt-check> - :max-tokens 272000,1109treefmt-check> - :provider :openai,1110treefmt-check> - :context-window 400000},1111treefmt-check> + :max-tokens 272000,1112treefmt-check> + :provider :openai,1113treefmt-check> + :context-window 400000},1114treefmt-check> "gpt-5.1"1115treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},1116treefmt-check> - :api :openai-responses,1117treefmt-check> - :name "GPT-5.1",1118treefmt-check> - :base-url "https://api.openai.com/v1",1119treefmt-check> - :id "gpt-5.1",1120treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},1121treefmt-check> + :api :openai-responses,1122treefmt-check> + :name "GPT-5.1",1123treefmt-check> + :base-url "https://api.openai.com/v1",1124treefmt-check> + :id "gpt-5.1",1125treefmt-check> :cost1126treefmt-check> {:input 1.25, :output 10.0, :cache-read 0.13, :cache-write 0.0},1127treefmt-check> - :max-tokens 128000,1128treefmt-check> - :provider :openai,1129treefmt-check> - :context-window 400000},1130treefmt-check> + :max-tokens 128000,1131treefmt-check> + :provider :openai,1132treefmt-check> + :context-window 400000},1133treefmt-check> "gpt-5.1-chat-latest"1134treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},1135treefmt-check> - :api :openai-responses,1136treefmt-check> - :name "GPT-5.1 Chat",1137treefmt-check> - :base-url "https://api.openai.com/v1",1138treefmt-check> - :id "gpt-5.1-chat-latest",1139treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},1140treefmt-check> + :api :openai-responses,1141treefmt-check> + :name "GPT-5.1 Chat",1142treefmt-check> + :base-url "https://api.openai.com/v1",1143treefmt-check> + :id "gpt-5.1-chat-latest",1144treefmt-check> :cost1145treefmt-check> {:input 1.25, :output 10.0, :cache-read 0.125, :cache-write 0.0},1146treefmt-check> - :max-tokens 16384,1147treefmt-check> - :provider :openai,1148treefmt-check> - :context-window 128000},1149treefmt-check> + :max-tokens 16384,1150treefmt-check> + :provider :openai,1151treefmt-check> + :context-window 128000},1152treefmt-check> "gpt-5.1-codex"1153treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},1154treefmt-check> - :api :openai-responses,1155treefmt-check> - :name "GPT-5.1 Codex",1156treefmt-check> - :base-url "https://api.openai.com/v1",1157treefmt-check> - :id "gpt-5.1-codex",1158treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},1159treefmt-check> + :api :openai-responses,1160treefmt-check> + :name "GPT-5.1 Codex",1161treefmt-check> + :base-url "https://api.openai.com/v1",1162treefmt-check> + :id "gpt-5.1-codex",1163treefmt-check> :cost1164treefmt-check> {:input 1.25, :output 5.0, :cache-read 0.125, :cache-write 1.25},1165treefmt-check> - :max-tokens 128000,1166treefmt-check> - :provider :openai,1167treefmt-check> - :context-window 400000},1168treefmt-check> + :max-tokens 128000,1169treefmt-check> + :provider :openai,1170treefmt-check> + :context-window 400000},1171treefmt-check> "gpt-5.1-codex-max"1172treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},1173treefmt-check> - :api :openai-responses,1174treefmt-check> - :name "GPT-5.1 Codex Max",1175treefmt-check> - :base-url "https://api.openai.com/v1",1176treefmt-check> - :id "gpt-5.1-codex-max",1177treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},1178treefmt-check> + :api :openai-responses,1179treefmt-check> + :name "GPT-5.1 Codex Max",1180treefmt-check> + :base-url "https://api.openai.com/v1",1181treefmt-check> + :id "gpt-5.1-codex-max",1182treefmt-check> :cost1183treefmt-check> {:input 1.25, :output 10.0, :cache-read 0.125, :cache-write 0.0},1184treefmt-check> - :max-tokens 128000,1185treefmt-check> - :provider :openai,1186treefmt-check> - :context-window 400000},1187treefmt-check> + :max-tokens 128000,1188treefmt-check> + :provider :openai,1189treefmt-check> + :context-window 400000},1190treefmt-check> "gpt-5.1-codex-mini"1191treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},1192treefmt-check> - :api :openai-responses,1193treefmt-check> - :name "GPT-5.1 Codex mini",1194treefmt-check> - :base-url "https://api.openai.com/v1",1195treefmt-check> - :id "gpt-5.1-codex-mini",1196treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},1197treefmt-check> + :api :openai-responses,1198treefmt-check> + :name "GPT-5.1 Codex mini",1199treefmt-check> + :base-url "https://api.openai.com/v1",1200treefmt-check> + :id "gpt-5.1-codex-mini",1201treefmt-check> :cost1202treefmt-check> {:input 0.25, :output 2.0, :cache-read 0.025, :cache-write 0.0},1203treefmt-check> - :max-tokens 128000,1204treefmt-check> - :provider :openai,1205treefmt-check> - :context-window 400000},1206treefmt-check> + :max-tokens 128000,1207treefmt-check> + :provider :openai,1208treefmt-check> + :context-window 400000},1209treefmt-check> "gpt-5.2"1210treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},1211treefmt-check> - :api :openai-responses,1212treefmt-check> - :name "GPT-5.2",1213treefmt-check> - :base-url "https://api.openai.com/v1",1214treefmt-check> - :id "gpt-5.2",1215treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},1216treefmt-check> + :api :openai-responses,1217treefmt-check> + :name "GPT-5.2",1218treefmt-check> + :base-url "https://api.openai.com/v1",1219treefmt-check> + :id "gpt-5.2",1220treefmt-check> :cost1221treefmt-check> {:input 1.75, :output 14.0, :cache-read 0.175, :cache-write 0.0},1222treefmt-check> - :max-tokens 128000,1223treefmt-check> - :provider :openai,1224treefmt-check> - :context-window 400000},1225treefmt-check> + :max-tokens 128000,1226treefmt-check> + :provider :openai,1227treefmt-check> + :context-window 400000},1228treefmt-check> "gpt-5.2-chat-latest"1229treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},1230treefmt-check> - :api :openai-responses,1231treefmt-check> - :name "GPT-5.2 Chat",1232treefmt-check> - :base-url "https://api.openai.com/v1",1233treefmt-check> - :id "gpt-5.2-chat-latest",1234treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},1235treefmt-check> + :api :openai-responses,1236treefmt-check> + :name "GPT-5.2 Chat",1237treefmt-check> + :base-url "https://api.openai.com/v1",1238treefmt-check> + :id "gpt-5.2-chat-latest",1239treefmt-check> :cost1240treefmt-check> {:input 1.75, :output 14.0, :cache-read 0.175, :cache-write 0.0},1241treefmt-check> - :max-tokens 16384,1242treefmt-check> - :provider :openai,1243treefmt-check> - :context-window 128000},1244treefmt-check> + :max-tokens 16384,1245treefmt-check> + :provider :openai,1246treefmt-check> + :context-window 128000},1247treefmt-check> "gpt-5.2-codex"1248treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},1249treefmt-check> - :api :openai-responses,1250treefmt-check> - :name "GPT-5.2 Codex",1251treefmt-check> - :base-url "https://api.openai.com/v1",1252treefmt-check> - :id "gpt-5.2-codex",1253treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},1254treefmt-check> + :api :openai-responses,1255treefmt-check> + :name "GPT-5.2 Codex",1256treefmt-check> + :base-url "https://api.openai.com/v1",1257treefmt-check> + :id "gpt-5.2-codex",1258treefmt-check> :cost1259treefmt-check> {:input 1.75, :output 14.0, :cache-read 0.175, :cache-write 0.0},1260treefmt-check> - :max-tokens 128000,1261treefmt-check> - :provider :openai,1262treefmt-check> - :context-window 400000},1263treefmt-check> + :max-tokens 128000,1264treefmt-check> + :provider :openai,1265treefmt-check> + :context-window 400000},1266treefmt-check> "gpt-5.2-pro"1267treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},1268treefmt-check> - :api :openai-responses,1269treefmt-check> - :name "GPT-5.2 Pro",1270treefmt-check> - :base-url "https://api.openai.com/v1",1271treefmt-check> - :id "gpt-5.2-pro",1272treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},1273treefmt-check> + :api :openai-responses,1274treefmt-check> + :name "GPT-5.2 Pro",1275treefmt-check> + :base-url "https://api.openai.com/v1",1276treefmt-check> + :id "gpt-5.2-pro",1277treefmt-check> :cost1278treefmt-check> {:input 21.0, :output 168.0, :cache-read 0.0, :cache-write 0.0},1279treefmt-check> - :max-tokens 128000,1280treefmt-check> - :provider :openai,1281treefmt-check> - :context-window 400000},1282treefmt-check> + :max-tokens 128000,1283treefmt-check> + :provider :openai,1284treefmt-check> + :context-window 400000},1285treefmt-check> "gpt-5.3-codex"1286treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},1287treefmt-check> - :api :openai-responses,1288treefmt-check> - :name "GPT-5.3 Codex",1289treefmt-check> - :base-url "https://api.openai.com/v1",1290treefmt-check> - :id "gpt-5.3-codex",1291treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},1292treefmt-check> + :api :openai-responses,1293treefmt-check> + :name "GPT-5.3 Codex",1294treefmt-check> + :base-url "https://api.openai.com/v1",1295treefmt-check> + :id "gpt-5.3-codex",1296treefmt-check> :cost1297treefmt-check> {:input 1.75, :output 14.0, :cache-read 0.175, :cache-write 0.0},1298treefmt-check> - :max-tokens 128000,1299treefmt-check> - :provider :openai,1300treefmt-check> - :context-window 400000},1301treefmt-check> + :max-tokens 128000,1302treefmt-check> + :provider :openai,1303treefmt-check> + :context-window 400000},1304treefmt-check> "gpt-5.3-codex-spark"1305treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},1306treefmt-check> - :api :openai-responses,1307treefmt-check> - :name "GPT-5.3 Codex Spark",1308treefmt-check> - :base-url "https://api.openai.com/v1",1309treefmt-check> - :id "gpt-5.3-codex-spark",1310treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},1311treefmt-check> + :api :openai-responses,1312treefmt-check> + :name "GPT-5.3 Codex Spark",1313treefmt-check> + :base-url "https://api.openai.com/v1",1314treefmt-check> + :id "gpt-5.3-codex-spark",1315treefmt-check> :cost1316treefmt-check> {:input 1.75, :output 14.0, :cache-read 0.175, :cache-write 0.0},1317treefmt-check> - :max-tokens 32000,1318treefmt-check> - :provider :openai,1319treefmt-check> - :context-window 128000},1320treefmt-check> + :max-tokens 32000,1321treefmt-check> + :provider :openai,1322treefmt-check> + :context-window 128000},1323treefmt-check> "gpt-5.4"1324treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},1325treefmt-check> - :api :openai-responses,1326treefmt-check> - :name "GPT-5.4",1327treefmt-check> - :base-url "https://api.openai.com/v1",1328treefmt-check> - :id "gpt-5.4",1329treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},1330treefmt-check> + :api :openai-responses,1331treefmt-check> + :name "GPT-5.4",1332treefmt-check> + :base-url "https://api.openai.com/v1",1333treefmt-check> + :id "gpt-5.4",1334treefmt-check> :cost1335treefmt-check> {:input 2.5, :output 15.0, :cache-read 0.25, :cache-write 0.0},1336treefmt-check> - :max-tokens 128000,1337treefmt-check> - :provider :openai,1338treefmt-check> - :context-window 1050000},1339treefmt-check> + :max-tokens 128000,1340treefmt-check> + :provider :openai,1341treefmt-check> + :context-window 1050000},1342treefmt-check> "gpt-5.4-pro"1343treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},1344treefmt-check> - :api :openai-responses,1345treefmt-check> - :name "GPT-5.4 Pro",1346treefmt-check> - :base-url "https://api.openai.com/v1",1347treefmt-check> - :id "gpt-5.4-pro",1348treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},1349treefmt-check> + :api :openai-responses,1350treefmt-check> + :name "GPT-5.4 Pro",1351treefmt-check> + :base-url "https://api.openai.com/v1",1352treefmt-check> + :id "gpt-5.4-pro",1353treefmt-check> :cost1354treefmt-check> {:input 30.0, :output 180.0, :cache-read 0.0, :cache-write 0.0},1355treefmt-check> - :max-tokens 128000,1356treefmt-check> - :provider :openai,1357treefmt-check> - :context-window 1050000},1358treefmt-check> + :max-tokens 128000,1359treefmt-check> + :provider :openai,1360treefmt-check> + :context-window 1050000},1361treefmt-check> "o1"1362treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},1363treefmt-check> - :api :openai-responses,1364treefmt-check> - :name "o1",1365treefmt-check> - :base-url "https://api.openai.com/v1",1366treefmt-check> - :id "o1",1367treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},1368treefmt-check> + :api :openai-responses,1369treefmt-check> + :name "o1",1370treefmt-check> + :base-url "https://api.openai.com/v1",1371treefmt-check> + :id "o1",1372treefmt-check> :cost1373treefmt-check> {:input 15.0, :output 60.0, :cache-read 7.5, :cache-write 0.0},1374treefmt-check> - :max-tokens 100000,1375treefmt-check> - :provider :openai,1376treefmt-check> - :context-window 200000},1377treefmt-check> + :max-tokens 100000,1378treefmt-check> + :provider :openai,1379treefmt-check> + :context-window 200000},1380treefmt-check> "o1-pro"1381treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},1382treefmt-check> - :api :openai-responses,1383treefmt-check> - :name "o1-pro",1384treefmt-check> - :base-url "https://api.openai.com/v1",1385treefmt-check> - :id "o1-pro",1386treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},1387treefmt-check> + :api :openai-responses,1388treefmt-check> + :name "o1-pro",1389treefmt-check> + :base-url "https://api.openai.com/v1",1390treefmt-check> + :id "o1-pro",1391treefmt-check> :cost1392treefmt-check> {:input 150.0, :output 600.0, :cache-read 0.0, :cache-write 0.0},1393treefmt-check> - :max-tokens 100000,1394treefmt-check> - :provider :openai,1395treefmt-check> - :context-window 200000},1396treefmt-check> + :max-tokens 100000,1397treefmt-check> + :provider :openai,1398treefmt-check> + :context-window 200000},1399treefmt-check> "o3"1400treefmt-check> {:capabilities {:reasoning? true, :input #{:image :text}},1401treefmt-check> :api :openai-responses,1402treefmt-check> @@ -1125,16 +1125,16 @@1403treefmt-check> :provider :openai,1404treefmt-check> :context-window 200000},1405treefmt-check> "o3-deep-research"1406treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},1407treefmt-check> - :api :openai-responses,1408treefmt-check> - :name "o3-deep-research",1409treefmt-check> - :base-url "https://api.openai.com/v1",1410treefmt-check> - :id "o3-deep-research",1411treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},1412treefmt-check> + :api :openai-responses,1413treefmt-check> + :name "o3-deep-research",1414treefmt-check> + :base-url "https://api.openai.com/v1",1415treefmt-check> + :id "o3-deep-research",1416treefmt-check> :cost1417treefmt-check> {:input 10.0, :output 40.0, :cache-read 2.5, :cache-write 0.0},1418treefmt-check> - :max-tokens 100000,1419treefmt-check> - :provider :openai,1420treefmt-check> - :context-window 200000},1421treefmt-check> + :max-tokens 100000,1422treefmt-check> + :provider :openai,1423treefmt-check> + :context-window 200000},1424treefmt-check> "o3-mini"1425treefmt-check> {:capabilities {:reasoning? true, :input #{:text}},1426treefmt-check> :api :openai-responses,1427treefmt-check> @@ -1146,16 +1146,16 @@1428treefmt-check> :provider :openai,1429treefmt-check> :context-window 200000},1430treefmt-check> "o3-pro"1431treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},1432treefmt-check> - :api :openai-responses,1433treefmt-check> - :name "o3-pro",1434treefmt-check> - :base-url "https://api.openai.com/v1",1435treefmt-check> - :id "o3-pro",1436treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},1437treefmt-check> + :api :openai-responses,1438treefmt-check> + :name "o3-pro",1439treefmt-check> + :base-url "https://api.openai.com/v1",1440treefmt-check> + :id "o3-pro",1441treefmt-check> :cost1442treefmt-check> {:input 20.0, :output 80.0, :cache-read 0.0, :cache-write 0.0},1443treefmt-check> - :max-tokens 100000,1444treefmt-check> - :provider :openai,1445treefmt-check> - :context-window 200000},1446treefmt-check> + :max-tokens 100000,1447treefmt-check> + :provider :openai,1448treefmt-check> + :context-window 200000},1449treefmt-check> "o4-mini"1450treefmt-check> {:capabilities {:reasoning? true, :input #{:image :text}},1451treefmt-check> :api :openai-responses,1452treefmt-check> @@ -1178,71 +1178,71 @@1453treefmt-check> :context-window 200000}},1454treefmt-check> :openai-codex1455treefmt-check> {"gpt-5.1"1456treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},1457treefmt-check> - :api :openai-codex-responses,1458treefmt-check> - :name "GPT-5.1",1459treefmt-check> - :base-url "https://chatgpt.com/backend-api",1460treefmt-check> - :id "gpt-5.1",1461treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},1462treefmt-check> + :api :openai-codex-responses,1463treefmt-check> + :name "GPT-5.1",1464treefmt-check> + :base-url "https://chatgpt.com/backend-api",1465treefmt-check> + :id "gpt-5.1",1466treefmt-check> :cost1467treefmt-check> {:input 1.25, :output 10.0, :cache-read 0.125, :cache-write 0.0},1468treefmt-check> - :max-tokens 128000,1469treefmt-check> - :provider :openai-codex,1470treefmt-check> - :context-window 272000},1471treefmt-check> + :max-tokens 128000,1472treefmt-check> + :provider :openai-codex,1473treefmt-check> + :context-window 272000},1474treefmt-check> "gpt-5.1-codex-max"1475treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},1476treefmt-check> - :api :openai-codex-responses,1477treefmt-check> - :name "GPT-5.1 Codex Max",1478treefmt-check> - :base-url "https://chatgpt.com/backend-api",1479treefmt-check> - :id "gpt-5.1-codex-max",1480treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},1481treefmt-check> + :api :openai-codex-responses,1482treefmt-check> + :name "GPT-5.1 Codex Max",1483treefmt-check> + :base-url "https://chatgpt.com/backend-api",1484treefmt-check> + :id "gpt-5.1-codex-max",1485treefmt-check> :cost1486treefmt-check> {:input 1.25, :output 10.0, :cache-read 0.125, :cache-write 0.0},1487treefmt-check> - :max-tokens 128000,1488treefmt-check> - :provider :openai-codex,1489treefmt-check> - :context-window 272000},1490treefmt-check> + :max-tokens 128000,1491treefmt-check> + :provider :openai-codex,1492treefmt-check> + :context-window 272000},1493treefmt-check> "gpt-5.1-codex-mini"1494treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},1495treefmt-check> - :api :openai-codex-responses,1496treefmt-check> - :name "GPT-5.1 Codex Mini",1497treefmt-check> - :base-url "https://chatgpt.com/backend-api",1498treefmt-check> - :id "gpt-5.1-codex-mini",1499treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},1500treefmt-check> + :api :openai-codex-responses,1501treefmt-check> + :name "GPT-5.1 Codex Mini",1502treefmt-check> + :base-url "https://chatgpt.com/backend-api",1503treefmt-check> + :id "gpt-5.1-codex-mini",1504treefmt-check> :cost1505treefmt-check> {:input 0.25, :output 2.0, :cache-read 0.025, :cache-write 0.0},1506treefmt-check> - :max-tokens 128000,1507treefmt-check> - :provider :openai-codex,1508treefmt-check> - :context-window 272000},1509treefmt-check> + :max-tokens 128000,1510treefmt-check> + :provider :openai-codex,1511treefmt-check> + :context-window 272000},1512treefmt-check> "gpt-5.2"1513treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},1514treefmt-check> - :api :openai-codex-responses,1515treefmt-check> - :name "GPT-5.2",1516treefmt-check> - :base-url "https://chatgpt.com/backend-api",1517treefmt-check> - :id "gpt-5.2",1518treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},1519treefmt-check> + :api :openai-codex-responses,1520treefmt-check> + :name "GPT-5.2",1521treefmt-check> + :base-url "https://chatgpt.com/backend-api",1522treefmt-check> + :id "gpt-5.2",1523treefmt-check> :cost1524treefmt-check> {:input 1.75, :output 14.0, :cache-read 0.175, :cache-write 0.0},1525treefmt-check> - :max-tokens 128000,1526treefmt-check> - :provider :openai-codex,1527treefmt-check> - :context-window 272000},1528treefmt-check> + :max-tokens 128000,1529treefmt-check> + :provider :openai-codex,1530treefmt-check> + :context-window 272000},1531treefmt-check> "gpt-5.2-codex"1532treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},1533treefmt-check> - :api :openai-codex-responses,1534treefmt-check> - :name "GPT-5.2 Codex",1535treefmt-check> - :base-url "https://chatgpt.com/backend-api",1536treefmt-check> - :id "gpt-5.2-codex",1537treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},1538treefmt-check> + :api :openai-codex-responses,1539treefmt-check> + :name "GPT-5.2 Codex",1540treefmt-check> + :base-url "https://chatgpt.com/backend-api",1541treefmt-check> + :id "gpt-5.2-codex",1542treefmt-check> :cost1543treefmt-check> {:input 1.75, :output 14.0, :cache-read 0.175, :cache-write 0.0},1544treefmt-check> - :max-tokens 128000,1545treefmt-check> - :provider :openai-codex,1546treefmt-check> - :context-window 272000},1547treefmt-check> + :max-tokens 128000,1548treefmt-check> + :provider :openai-codex,1549treefmt-check> + :context-window 272000},1550treefmt-check> "gpt-5.3-codex"1551treefmt-check> - {:capabilities {:reasoning? true, :input #{:image :text}},1552treefmt-check> - :api :openai-codex-responses,1553treefmt-check> - :name "GPT-5.3 Codex",1554treefmt-check> - :base-url "https://chatgpt.com/backend-api",1555treefmt-check> - :id "gpt-5.3-codex",1556treefmt-check> + {:capabilities {:reasoning? true, :input #{:image :text}},1557treefmt-check> + :api :openai-codex-responses,1558treefmt-check> + :name "GPT-5.3 Codex",1559treefmt-check> + :base-url "https://chatgpt.com/backend-api",1560treefmt-check> + :id "gpt-5.3-codex",1561treefmt-check> :cost1562treefmt-check> {:input 1.75, :output 14.0, :cache-read 0.175, :cache-write 0.0},1563treefmt-check> - :max-tokens 128000,1564treefmt-check> - :provider :openai-codex,1565treefmt-check> - :context-window 272000},1566treefmt-check> + :max-tokens 128000,1567treefmt-check> + :provider :openai-codex,1568treefmt-check> + :context-window 272000},1569treefmt-check> "gpt-5.3-codex-spark"1570treefmt-check> {:capabilities {:reasoning? true, :input #{:text}},1571treefmt-check> :api :openai-codex-responses,1572treefmt-check> diff --git a/test/ol/llx/ai/adapters/anthropic_messages_test.cljc b/test/ol/llx/ai/adapters/anthropic_messages_test.cljc1573treefmt-check> index c4bd222..94fd989 1006441574treefmt-check> --- a/test/ol/llx/ai/adapters/anthropic_messages_test.cljc1575treefmt-check> +++ b/test/ol/llx/ai/adapters/anthropic_messages_test.cljc1576treefmt-check> @@ -264,9 +264,9 @@1577treefmt-check> (select-keys payload [:thinking :output_config :max_tokens :model :stream])))))1578treefmt-check> 1579treefmt-check> (deftest decode-event-stream-contract1580treefmt-check> - (let [env (stub-env)1581treefmt-check> - chunks (fixture "stream_events")1582treefmt-check> - init-state {:model anthropic-model}1583treefmt-check> + (let [env (stub-env)1584treefmt-check> + chunks (fixture "stream_events")1585treefmt-check> + init-state {:model anthropic-model}1586treefmt-check> {:keys [state events]}1587treefmt-check> (reduce (fn [{:keys [state events]} chunk]1588treefmt-check> (let [{next-state :state next-events :events}1589treefmt-check> @@ -275,7 +275,7 @@1590treefmt-check> :events (into events next-events)}))1591treefmt-check> {:state init-state :events []}1592treefmt-check> chunks)1593treefmt-check> - finalize-result (sut/finalize env state)]1594treefmt-check> + finalize-result (sut/finalize env state)]1595treefmt-check> (is (= [:text-start1596treefmt-check> :text-delta1597treefmt-check> :text-delta1598treefmt-check> diff --git a/test/ol/llx/ai/adapters/google_generative_ai_test.cljc b/test/ol/llx/ai/adapters/google_generative_ai_test.cljc1599treefmt-check> index 3555000..523e785 1006441600treefmt-check> --- a/test/ol/llx/ai/adapters/google_generative_ai_test.cljc1601treefmt-check> +++ b/test/ol/llx/ai/adapters/google_generative_ai_test.cljc1602treefmt-check> @@ -209,14 +209,14 @@1603treefmt-check> {:name "vision"1604treefmt-check> :response {:output "(see attached image)"}1605treefmt-check> :parts [{:inlineData {:mimeType "image/png" :data "aGVsbG8="}}]}}]}]1606treefmt-check> - :generationConfig {:thinkingConfig {:thinkingLevel "MINIMAL"}}}1607treefmt-check> + :generationConfig {:thinkingConfig {:thinkingLevel "MINIMAL"}}}1608treefmt-check> multimodal-payload)))1609treefmt-check> (testing "text-only model drops images from functionResponse"1610treefmt-check> (is (= {:contents1611treefmt-check> [{:role "user" :parts [{:text "use the tool"}]}1612treefmt-check> {:role "user"1613treefmt-check> :parts [{:functionResponse {:name "vision" :response {:output ""}}}]}]1614treefmt-check> - :generationConfig {:thinkingConfig {:thinkingBudget 0}}}1615treefmt-check> + :generationConfig {:thinkingConfig {:thinkingBudget 0}}}1616treefmt-check> text-only-payload)))))1617treefmt-check> 1618treefmt-check> (deftest decode-event-stream-contract1619treefmt-check> diff --git a/test/ol/llx/ai/adapters/openai_responses_test.cljc b/test/ol/llx/ai/adapters/openai_responses_test.cljc1620treefmt-check> index d64070a..a172728 1006441621treefmt-check> --- a/test/ol/llx/ai/adapters/openai_responses_test.cljc1622treefmt-check> +++ b/test/ol/llx/ai/adapters/openai_responses_test.cljc1623treefmt-check> @@ -334,9 +334,9 @@1624treefmt-check> (:total cost)))))1625treefmt-check> 1626treefmt-check> (deftest decode-event-stream-contract1627treefmt-check> - (let [env (stub-env)1628treefmt-check> - chunks (fixture "stream_events")1629treefmt-check> - init-state {:model openai-responses-model}1630treefmt-check> + (let [env (stub-env)1631treefmt-check> + chunks (fixture "stream_events")1632treefmt-check> + init-state {:model openai-responses-model}1633treefmt-check> {:keys [state events]}1634treefmt-check> (reduce (fn [{:keys [state events]} chunk]1635treefmt-check> (let [{next-state :state next-events :events}1636treefmt-check> @@ -345,7 +345,7 @@1637treefmt-check> :events (into events next-events)}))1638treefmt-check> {:state init-state :events []}1639treefmt-check> chunks)1640treefmt-check> - finalize-result (sut/finalize env state)]1641treefmt-check> + finalize-result (sut/finalize env state)]1642treefmt-check> (is (= [:thinking-start1643treefmt-check> :thinking-delta1644treefmt-check> :thinking-delta1645❌ /nix/store/xawsg12g2nlff5pfmh7dsq4z2gq4dkm2-treefmt-check.drv^*1646error: Cannot build '/nix/store/xawsg12g2nlff5pfmh7dsq4z2gq4dkm2-treefmt-check.drv'.1647 Reason: builder failed with exit code 1.1648 Output paths:1649 /nix/store/xj5s52vbav3kn1aw7nddbbkb0mwcn287-treefmt-check1650 Last 25 log lines:1651 > index d64070a..a172728 1006441652 > --- a/test/ol/llx/ai/adapters/openai_responses_test.cljc1653 > +++ b/test/ol/llx/ai/adapters/openai_responses_test.cljc1654 > @@ -334,9 +334,9 @@1655 > (:total cost)))))1656 > 1657 > (deftest decode-event-stream-contract1658 > - (let [env (stub-env)1659 > - chunks (fixture "stream_events")1660 > - init-state {:model openai-responses-model}1661 > + (let [env (stub-env)1662 > + chunks (fixture "stream_events")1663 > + init-state {:model openai-responses-model}1664 > {:keys [state events]}1665 > (reduce (fn [{:keys [state events]} chunk]1666 > (let [{next-state :state next-events :events}1667 > @@ -345,7 +345,7 @@1668 > :events (into events next-events)}))1669 > {:state init-state :events []}1670 > chunks)1671 > - finalize-result (sut/finalize env state)]1672 > + finalize-result (sut/finalize env state)]1673 > (is (= [:thinking-start1674 > :thinking-delta1675 > :thinking-delta1676 For full logs, run:1677 nix log /nix/store/xawsg12g2nlff5pfmh7dsq4z2gq4dkm2-treefmt-check.drv