<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Creeta</title>
    <description>The latest articles on DEV Community by Creeta (@creeta).</description>
    <link>https://dev.to/creeta</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3988151%2F79e19311-8408-48c6-b177-4544ce358e93.png</url>
      <title>DEV Community: Creeta</title>
      <link>https://dev.to/creeta</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/creeta"/>
    <language>en</language>
    <item>
      <title>Seedance 2.5 targets 30s 4K — nothing independent confirms it</title>
      <dc:creator>Creeta</dc:creator>
      <pubDate>Sat, 27 Jun 2026 16:00:30 +0000</pubDate>
      <link>https://dev.to/creeta/seedance-25-targets-30s-4k-nothing-independent-confirms-it-1mng</link>
      <guid>https://dev.to/creeta/seedance-25-targets-30s-4k-nothing-independent-confirms-it-1mng</guid>
      <description>&lt;p&gt;ByteDance says its next video model can produce a continuous 30-second 4K clip from a single prompt. As of late June 2026, no independent source confirms that — and the gap between the announcement and any verifiable artifact is the story.&lt;/p&gt;

&lt;h2&gt;
  
  
  From 15s to 30s: What ByteDance Says 2.5 Can Do
&lt;/h2&gt;

&lt;p&gt;Seedance 2.5 is ByteDance's announced next-generation AI video model, unveiled on June 23, 2026 at the Volcano Engine FORCE conference in Beijing . The headline claim is native long-form generation: a 30-second single-segment clip from one prompt, double the 15-second ceiling of Seedance 2.0, which removes the manual clip-stitching that continuous storytelling currently requires . ByteDance also claims native 4K output with 10-bit color — generated, it says, not upscaled.&lt;/p&gt;

&lt;p&gt;The announced spec sheet goes further than duration and resolution:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;50 full-modal reference inputs&lt;/strong&gt; — images, video, audio, 3D models, and style/text anchors in one generation, versus the documented 3 video clips and 9 images on 2.0 .&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Localized semantic editing&lt;/strong&gt; — change a character's outfit color or scene lighting while preserving camera angle, composition, and actor motion .&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;3D white-box pre-visualization&lt;/strong&gt; — turn low-fidelity 3D blockouts into a quick animated preview before committing to a full render .&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Treat all of it as vendor-announced. There is no arXiv paper, model card, or independent benchmark for 2.5 as of late June 2026, and the 10-bit color and prompt-adherence numbers trace to secondary reporting, not a disclosed test. The version number itself is a tell. The Information reports ByteDance had planned a 2.1 release and rebranded it 2.5 to signal a generational leap and seize initiative against rivals:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"The company had planned a 2.1 release but rebranded it 2.5 to seize competitive initiative against rivals like OpenAI's Sora and Kuaishou's Kling," per reporting from &lt;a href="https://www.theinformation.com/briefings/bytedance-unveils-seedance-2-5-video-model" rel="noopener noreferrer"&gt;The Information&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That skip from 2.0 straight to 2.5 is the question worth holding onto: is this an engineering jump big enough to justify the number, or marketing positioning ahead of a still-unreleased beta? The sections below show how to get ready to test it the moment it ships — and exactly what to verify against the official docs before trusting the spec sheet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before July: Signing Up on Jimeng and ModelArk
&lt;/h2&gt;

&lt;p&gt;There are two doors into Seedance, and which one you use depends on whether you write prompts or write code. Consumers go through ByteDance's own apps; developers go through its cloud API. Both run on the live 2.0 model today, and both are worth provisioning before the 2.5 beta opens so you are not debugging account setup under launch-day traffic.&lt;/p&gt;

&lt;p&gt;The consumer path starts with a Douyin account verified by mobile/SMS. Use that account to authorize a Jimeng (Dreamina) login at &lt;a href="https://jimeng.jianying.com/" rel="noopener noreferrer"&gt;jimeng.jianying.com&lt;/a&gt;, then go to Generate → Video Generate and pick the Seedance model from the dropdown . The same model is also reachable through CapCut and Doubao. Outside mainland China the friction is real: Jimeng still requires a Douyin account tied to a Chinese phone number, and depending on region a VPN. ZeroLu's community how-to documents the cross-border login and prompting steps .&lt;/p&gt;

&lt;p&gt;The developer path is registration on Volcano Engine / BytePlus ModelArk, where text-to-video and image-to-video endpoints are live . As of late June 2026 the only published model identifier is &lt;code&gt;doubao-seedance-2-0-260128&lt;/code&gt; — no 2.5 ID exists yet . The enterprise 2.5 beta is invite-only, so set up both accounts now.&lt;/p&gt;

&lt;h2&gt;
  
  
  The ModelArk Submission Flow for Seedance 2.0
&lt;/h2&gt;

&lt;p&gt;The submission flow is straightforward once your account is live: authenticate to BytePlus ModelArk, pull your API credentials from the console, and target the only published identifier — &lt;code&gt;doubao-seedance-2-0-260128&lt;/code&gt; . ModelArk exposes text-to-video and image-to-video endpoints with parameters for resolution, duration, and aspect ratio, so you build the request, set duration, and poll for the rendered clip .&lt;/p&gt;

&lt;p&gt;Pricing depends on which platform you call. BytePlus ModelArk bills per second in USD; Volcano Engine bills per million tokens in yuan. Budget against both before committing a batch:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Tier&lt;/th&gt;
&lt;th&gt;Rate&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;BytePlus ModelArk&lt;/td&gt;
&lt;td&gt;Standard 480p&lt;/td&gt;
&lt;td&gt;$0.092/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BytePlus ModelArk&lt;/td&gt;
&lt;td&gt;Standard 720p&lt;/td&gt;
&lt;td&gt;$0.199/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BytePlus ModelArk&lt;/td&gt;
&lt;td&gt;Fast 480p&lt;/td&gt;
&lt;td&gt;$0.074/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BytePlus ModelArk&lt;/td&gt;
&lt;td&gt;Fast 720p&lt;/td&gt;
&lt;td&gt;$0.161/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Volcano Engine&lt;/td&gt;
&lt;td&gt;Doubao video 2.0, with video input&lt;/td&gt;
&lt;td&gt;¥28 / million tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Volcano Engine&lt;/td&gt;
&lt;td&gt;Doubao video 2.0, no video input&lt;/td&gt;
&lt;td&gt;¥46 / million tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Rates above are 2.0 figures . Construct the prompt as an ordered chain — subject → action → environment → shot size → camera movement → lighting → timing → style → constraints:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"8s cinematic close-up of a ceramic coffee cup on a rainy cafe table, steam rising, slow dolly-in, warm interior light, shallow depth of field, no text overlays."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Escalate only as the shot demands it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Text-to-video&lt;/strong&gt; for a simple shot.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Image-to-video&lt;/strong&gt; when identity or a product must persist — put identity in the reference image and let the prompt describe only motion and camera, since over-specifying visual identity fights the reference .&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add audio&lt;/strong&gt; when timing, voice, or sync matters.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add a video reference&lt;/strong&gt; when the camera path is hard to describe in text — use short, clean clips.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Respect the duration window: 4–15s on 2.0; submit outside that range and the job is rejected . On 2.5 the window is expected to extend to 30s, but treat that as unconfirmed until official docs update. No 2.5 pricing is published, and native 4K, 10-bit color, 30-second clips, and up to 50 references demand materially more compute than 2.0 Standard — budget for a higher per-second rate and run a fresh cost comparison on day one of general availability .&lt;/p&gt;

&lt;h2&gt;
  
  
  The Traps: Copyright Overhang, Regional Lock, and 4K Uncertainty
&lt;/h2&gt;

&lt;p&gt;The biggest operational risk with Seedance is legal, not technical. Within days of the 2.0 launch, users generated clips alleged to resemble copyrighted characters and celebrity likenesses, and rights holders moved fast. Disney sent ByteDance a cease-and-desist on February 13, 2026, citing Star Wars, Marvel, and other works . On February 20, 2026 the Motion Picture Association followed with its own cease-and-desist alleging "pervasive and widespread infringement" and demanded written remediation steps by February 27, 2026 . Output filters exist but are not comprehensive, so the liability sits with you, the operator.&lt;/p&gt;

&lt;p&gt;Build safe prompt discipline into your pipeline now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use&lt;/strong&gt; generic roles, original characters, owned product photos, and authorized audio/video references.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Avoid&lt;/strong&gt; named actors, living people, copyrighted characters, franchise names, and protected visual styles you do not have rights to.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Regional access is the second trap. Jimeng/Dreamina requires a mainland Chinese phone number for the Douyin login flow, while BytePlus ModelArk is globally accessible — but verify your account tier limits before wiring it into a production pipeline .&lt;/p&gt;

&lt;p&gt;The third trap is cost. With no published 2.5 pricing, establish a real comparator today: submit a baseline 2.0 480p job and a 2.0 720p job on ModelArk, which bills text-to-video per second — Standard $0.092/s at 480p and $0.199/s at 720p . That gives you a measured cost-per-second baseline so you can quantify the premium the moment 2.5 native 4K pricing drops.&lt;/p&gt;

&lt;h2&gt;
  
  
  Once 2.5 Is Available: What to Confirm
&lt;/h2&gt;

&lt;p&gt;The moment Seedance 2.5 reaches general availability, treat the GA release page as the only canonical source for parameters — not the secondary tech reporting that has carried every spec so far. As of June 2026, Volcano Engine and BytePlus ModelArk still expose only &lt;code&gt;doubao-seedance-2-0-260128&lt;/code&gt;, with no 2.5 model ID published . Run a short verification checklist on GA day:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Find the model ID&lt;/strong&gt; in the ModelArk docs; without it there is no programmatic call to make .&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Submit a 30s text-to-video at 4K&lt;/strong&gt; and diff it against a 2.0 720p job on visible quality and per-second cost — the only way to independently test the native-4K claim against your measured 2.0 baseline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Confirm the 50-reference multimodal input&lt;/strong&gt; lands on the API, not just the Jimeng consumer UI; a consumer-only gate would block programmatic pipelines entirely .&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Watch for an arXiv technical report.&lt;/strong&gt; ByteDance published one for 2.0 within weeks of its early-February 2026 release ; until a 2.5 paper exists, every figure stays vendor-announced.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The takeaway is discipline over hype. This snippet, which runs and exits clean, is the posture to keep until the docs catch up:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;claims&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;subject&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Seedance 2.5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;target&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;30s 4K&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;source_type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;vendor / rumor&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;independent_confirmation&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;claims&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;subject&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; targets &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;claims&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;target&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;claims&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;independent_confirmation&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;No independent source in this snippet confirms that target.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Last updated: 2026-06-27. Verify all 2.5 parameters against the official Volcano Engine / BytePlus ModelArk docs once GA endpoints go live.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Is Seedance 2.5 publicly available right now?
&lt;/h3&gt;

&lt;p&gt;No. As of late June 2026, only an enterprise and global beta is live; general availability is targeted for early July 2026 . The working path today is Seedance 2.0 — via the BytePlus ModelArk API for developers, or the Jimeng/Dreamina consumer interface. Official ByteDance product pages still document 2.0, so treat 2.5 as announced, not shipped.&lt;/p&gt;

&lt;h3&gt;
  
  
  What does BytePlus ModelArk charge for Seedance 2.0?
&lt;/h3&gt;

&lt;p&gt;BytePlus ModelArk bills 2.0 text-to-video per second of output. Standard tier is $0.092/s at 480p and $0.199/s at 720p; the lower-latency Fast variant is $0.074/s at 480p and $0.161/s at 720p . The domestic Volcano Engine platform instead bills in yuan per million tokens. Seedance 2.5 pricing is not yet published; native 4K, 10-bit and 30-second output should be expected to cost more per second.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I access Seedance outside China?
&lt;/h3&gt;

&lt;p&gt;Two routes exist. The consumer path, Jimeng/Dreamina at jimeng.jianying.com, requires a Douyin account with a mainland Chinese phone number and may need a VPN depending on region . For developers, the BytePlus ModelArk API is globally accessible without a Douyin login or VPN, which makes it the recommended path for programmatic generation and workflow integration.&lt;/p&gt;

&lt;h3&gt;
  
  
  What are the copyright risks when prompting Seedance?
&lt;/h3&gt;

&lt;p&gt;They are significant and already litigated. Disney sent ByteDance a cease-and-desist on February 13, 2026 citing Star Wars and Marvel works , and the Motion Picture Association followed on February 20, 2026 alleging widespread infringement . Avoid named actors, living people, copyrighted characters and franchise names. Output filters exist but are not comprehensive guards — the safe workflow uses original characters and owned assets.&lt;/p&gt;

&lt;h3&gt;
  
  
  What does Seedance 2.5 add over 2.0, and is any of it verified?
&lt;/h3&gt;

&lt;p&gt;Announced changes are a 30-second single-segment clip versus 15s, native 4K 10-bit color versus a 720p maximum, up to 50 reference inputs versus 3 video clips and 9 images, a unified audio-video latent space for native lip-sync, and localized semantic editing . None of it is independently verified: there is no model card, benchmark name, or arXiv paper for 2.5 as of late June 2026 — only the 2.0 technical report is published . Every spec is vendor-announced.&lt;/p&gt;

</description>
      <category>bytedance</category>
      <category>seedance</category>
      <category>videogeneration</category>
      <category>aivideo</category>
    </item>
    <item>
      <title>96% of cuBLAS, no `unsafe`: what cuTile Rust proves</title>
      <dc:creator>Creeta</dc:creator>
      <pubDate>Fri, 26 Jun 2026 21:46:04 +0000</pubDate>
      <link>https://dev.to/creeta/96-of-cublas-no-unsafe-what-cutile-rust-proves-4ldp</link>
      <guid>https://dev.to/creeta/96-of-cublas-no-unsafe-what-cutile-rust-proves-4ldp</guid>
      <description>&lt;p&gt;GPU programming usually asks Rust developers to surrender the borrow checker at the launch boundary: references collapse into raw pointers, and aliasing, synchronization, and stream lifetimes become hand-managed invariants. A new NVIDIA Labs paper argues that trade is unnecessary.&lt;/p&gt;

&lt;h2&gt;
  
  
  How cuTile Rust Extends the Borrow Discipline to GPU Dispatch
&lt;/h2&gt;

&lt;p&gt;cuTile Rust is a tile-based DSL that carries Rust's ownership and borrowing rules across the host-to-GPU launch boundary — not just through host code. Introduced in "Fearless Concurrency on the GPU" (arXiv:2606.15991), submitted by NVIDIA researchers Melih Elibol, Jared Roesch, Isaac Gelado, Eric Buehler, and Michael Garland , it lets you author the kernel itself in idiomatic, memory-safe Rust rather than wrapping hand-written unsafe CUDA.&lt;/p&gt;

&lt;p&gt;The mechanism is type construction, not a runtime lock. Before launch, mutable output tensors are partitioned into provably disjoint tiles; each tile program then receives an exclusive &lt;code&gt;&amp;amp;mut&lt;/code&gt; view of its slice, while inputs arrive as shared &lt;code&gt;&amp;amp;&lt;/code&gt; references . Because the partitions cannot overlap, the kernel is single-threaded in its semantics and data-race-free by construction, yet still compiles to massively parallel GPU code. As Melih Elibol put it, "each tile program gets an exclusive &amp;amp;mut view of its memory, plus the inputs as shared references" (source: &lt;a href="https://users.rust-lang.org/t/fearless-concurrency-on-the-gpu-safe-gpu-kernels-in-rust/140790" rel="noopener noreferrer"&gt;users.rust-lang.org&lt;/a&gt;). Explicit unchecked types remain available for local opt-out when you need lower-level control.&lt;/p&gt;

&lt;p&gt;The safety story would be academic if it cost throughput, but the reported numbers say otherwise. On an NVIDIA B200, cuTile Rust reaches 7 TB/s on memory-bound element-wise operations and 2 PFlop/s on GEMM — roughly 96% of cuBLAS, and within measurement noise of cuTile Python . End to end, the companion Qwen3 inference engine Grout reaches 171 generated tokens/s for Qwen3-4B on an RTX 5090 and 82 tokens/s for Qwen3-32B on a B200 in batch-1 decode . Those are the authors' own measurements on specific hardware — independent reproduction is not yet established — but they frame the central claim this article unpacks: safe Rust kernels without a measured performance penalty.&lt;/p&gt;

&lt;h2&gt;
  
  
  sm_80+, Driver ≥610, Rust 1.89: What the Crate Expects
&lt;/h2&gt;

&lt;p&gt;Before any of that lands on your hardware, the crate sets a firm floor. cuTile Rust targets NVIDIA GPUs with compute capability sm_80 or higher — Ampere, Hopper, and Blackwell — which excludes Volta (V100) and earlier . It builds on CUDA 13.3, Rust 1.89+, and Linux, tested on Ubuntu 24.04; Windows and macOS are unsupported, and no AMD/ROCm or Metal backend exists as of June 2026 . CUDA 13.x needs driver ≥580 for minor-version compatibility, and CUDA 13.3 GA corresponds to Linux driver ≥610.43.02 .&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Requirement&lt;/th&gt;
&lt;th&gt;Minimum&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GPU compute capability&lt;/td&gt;
&lt;td&gt;sm_80+ (Ampere/Hopper/Blackwell)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CUDA toolkit&lt;/td&gt;
&lt;td&gt;13.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Linux driver&lt;/td&gt;
&lt;td&gt;≥610.43.02 (≥580 for 13.x minor-compat)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rust&lt;/td&gt;
&lt;td&gt;1.89+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OS&lt;/td&gt;
&lt;td&gt;Linux (Ubuntu 24.04 tested)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tile IR toolchain&lt;/td&gt;
&lt;td&gt;CMake 3.20+, C++17, Python 3.6+&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The Tile IR toolchain itself — &lt;code&gt;cuda-tile-translate&lt;/code&gt; and &lt;code&gt;tileiras&lt;/code&gt;, which compile MLIR-based Tile IR bytecode into cubins — expects CMake 3.20+, C++17, and Python 3.6+ . Confirm your driver and GPU first; everything below assumes the floor is met.&lt;/p&gt;

&lt;h2&gt;
  
  
  Annotating, Partitioning, and Dispatching a cuTile Rust Crate
&lt;/h2&gt;

&lt;p&gt;Writing a cuTile Rust kernel means declaring a &lt;code&gt;#[cutile::module]&lt;/code&gt; block, annotating the function with &lt;code&gt;#[cutile::entry()]&lt;/code&gt;, and bringing the prelude into scope with &lt;code&gt;use cutile::prelude::*&lt;/code&gt;. The macro rewrites that function into a GPU kernel and auto-generates the host-side launcher that partitions tensors — you write no hand-rolled dispatch code . The canonical element-wise add reads like ordinary Rust:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nd"&gt;#[cutile::module]&lt;/span&gt;
&lt;span class="k"&gt;mod&lt;/span&gt; &lt;span class="n"&gt;kernel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nd"&gt;#[cutile::entry()]&lt;/span&gt;
  &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;Tensor&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;f32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{[&lt;/span&gt;&lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// exclusive write&lt;/span&gt;
    &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;Tensor&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;f32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;     &lt;span class="c1"&gt;// shared read&lt;/span&gt;
    &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;Tensor&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;f32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;     &lt;span class="c1"&gt;// shared read&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;tx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;load_tile_like&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;ty&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;load_tile_like&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="nf"&gt;.store&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tx&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;ty&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The signature is the contract. Mutable outputs are typed &lt;code&gt;&amp;amp;mut Tensor&amp;lt;f32, {[B]}&amp;gt;&lt;/code&gt;; shared inputs are &lt;code&gt;&amp;amp;Tensor&amp;lt;f32, {[-1]}&amp;gt;&lt;/code&gt;. The const-generic shape parameter encodes the tile size at the type level, so the borrow checker sees one exclusive writer and many immutable readers per tile .&lt;/p&gt;

&lt;p&gt;On the host the recipe is short: create your tensors, call &lt;code&gt;.partition([128])&lt;/code&gt; on the mutable output before launch, then run &lt;code&gt;kernel::add(z, x, y).sync()?&lt;/code&gt; for blocking execution. The generated launcher holds the operands while GPU work is in flight, and ownership of the tensors returns to you only after &lt;code&gt;.sync()&lt;/code&gt; completes . Because the partitions are provably disjoint, each tile program is single-threaded in its semantics and data-race-free by construction.&lt;/p&gt;

&lt;p&gt;For inference pipelines, cuTile Rust exposes a lazy &lt;code&gt;DeviceOp&lt;/code&gt; model. Use &lt;code&gt;.sync()&lt;/code&gt; for blocking dispatch, &lt;code&gt;.into_future()&lt;/code&gt; (via &lt;code&gt;IntoFuture&lt;/code&gt;) for async execution, and &lt;code&gt;.graph()&lt;/code&gt; / &lt;code&gt;CudaGraph::scope&lt;/code&gt; for CUDA graph capture and replay . The intended pattern builds a reusable layer graph once, borrows temporary buffers mutably inside each recorded op, and releases them after sync. Stream-order capture plus Rust lifetimes make buffer reuse visible to the type system, so ordering is enforced without manual annotation. Kernels JIT-compile through CUDA Tile IR, an MLIR-based intermediate representation, before reaching the GPU .&lt;/p&gt;

&lt;p&gt;The safety idea is easy to feel out without a GPU. The illustrative Python below (executed; not the production Rust path) proves each tile's bounds once, then touches memory only through checked ranges — the same "prove disjointness, then trust the slice" shape cuTile Rust enforces at compile time:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;dataclasses&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;dataclass&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Random&lt;/span&gt;


&lt;span class="nd"&gt;@dataclass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frozen&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Tile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;
    &lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;
    &lt;span class="n"&gt;red&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;proved&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Tile&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stop&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;
        &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stop&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;
        &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;red&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;red&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stop&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;tiled_matmul&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="n"&gt;proofs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Tile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
                         &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
                         &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;))).&lt;/span&gt;&lt;span class="nf"&gt;proved&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;proofs&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
                &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;q&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;red&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                        &lt;span class="n"&gt;arq&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
                        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                            &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;arq&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;proofs&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;plain_matmul&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;


&lt;span class="n"&gt;rng&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Random&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;
&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="n"&gt;rng&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="n"&gt;rng&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="n"&gt;got&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;proofs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;tiled_matmul&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;want&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;plain_matmul&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;got&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;want&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cuTile idea in Python: prove tile bounds once, then use only checked ranges.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tiles proved: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;proofs&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;; unsafe operations: 0&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;max error vs reference: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;The 96%-of-cuBLAS claim is about Rust/CUDA performance; this shows the safety proof shape.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Friction to Expect: No AMD, Evolving Macros, Unproven Concurrency
&lt;/h2&gt;

&lt;p&gt;cuTile Rust is NVIDIA/CUDA-only today, and that constraint runs deep. There is no AMD/ROCm path, no Metal backend, and no portable WebGPU fallback — every kernel JIT-compiles through CUDA Tile IR into cubins . The compute-capability floor is hard: &lt;code&gt;sm_80&lt;/code&gt; (Ampere) or newer, paired with CUDA 13.3, Rust 1.89+, and Linux . Any pre-Ampere card is excluded outright.&lt;/p&gt;

&lt;p&gt;The surface API is explicitly early-stage. The &lt;code&gt;Tensor&amp;lt;f32, {[B]}&amp;gt;&lt;/code&gt; const-generic shape syntax and the &lt;code&gt;#[cutile::module]&lt;/code&gt;/&lt;code&gt;#[cutile::entry()]&lt;/code&gt; macro forms can change between releases . Pin your dependency in &lt;code&gt;Cargo.lock&lt;/code&gt; before this lands in CI; treat API churn as expected, not exceptional.&lt;/p&gt;

&lt;p&gt;Be precise about the headline numbers. The 96%-of-cuBLAS GEMM result and 171 tokens/s batch-1 decode for Qwen3-4B on an RTX 5090 are the authors' own measurements on specific hardware, including a B200 . An independent evaluation of the CUDA Tile &lt;em&gt;Python&lt;/em&gt; stack reported 52–79% of cuBLAS for GEMM and only 53% of FlashAttention-2 throughput on RTX PRO 6000 Blackwell Server Edition — results that vary by workload and architecture . Multi-batch throughput, prefill latency, and model coverage beyond Qwen3 remain uncharacterized. Validate on your target GPU, batch distribution, and context length before you swap out a mature inference stack.&lt;/p&gt;

&lt;h2&gt;
  
  
  Grout: The Inference Reference for cuTile Rust Crate Authors
&lt;/h2&gt;

&lt;p&gt;If you want to see cuTile Rust in a real decode path rather than a microbenchmark, read Grout. &lt;a href="https://github.com/huggingface/grout" rel="noopener noreferrer"&gt;Grout&lt;/a&gt; is a cuTile-Rust Qwen3 inference engine co-authored by Eric Buehler, who also maintains mistral.rs, and it serves as the canonical production call-site pattern. Study how it structures lazy &lt;code&gt;DeviceOp&lt;/code&gt; graphs, borrows temporary buffers mutably inside &lt;code&gt;CudaGraph::scope&lt;/code&gt; capture, and recovers ownership only after &lt;code&gt;.sync()&lt;/code&gt; — that ordering is the intended idiom for inference pipelines, where stream-order capture plus Rust lifetimes make buffer reuse visible to the type system.&lt;/p&gt;

&lt;p&gt;This is the contrast that matters. Candle, Burn, and mistral.rs largely FFI into or wrap hand-written, often &lt;code&gt;unsafe&lt;/code&gt; kernels; cuTile Rust offers a path to author the kernels themselves in safe Rust with no measured penalty. As lead author Melih Elibol frames the guarantee, "each tile program gets an exclusive &amp;amp;mut view of its memory, plus the inputs as shared references" .&lt;/p&gt;

&lt;p&gt;Concrete next step: clone Grout, run the Qwen3-4B decode path — the authors report 171 generated tokens/s in batch-1 decode on an RTX 5090  — on an A100 or RTX 4090, and compare tok/s against a &lt;a href="https://qwenlm.github.io/blog/qwen3/" rel="noopener noreferrer"&gt;vllm&amp;gt;=0.8.4&lt;/a&gt; baseline . The size of that gap — or its absence — is the real signal, not the headline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What NVIDIA GPU is required to run cuTile Rust?
&lt;/h3&gt;

&lt;p&gt;You need an NVIDIA GPU with compute capability sm_80 (Ampere) or higher, plus CUDA 13.3, Rust 1.89+, and Linux (tested on Ubuntu 24.04) . That floor covers the RTX 3000/4000/5000 series, A100, H100, and B200, but excludes Volta (V100) and Turing (RTX 2000). On the driver side, CUDA 13.3 GA corresponds to a Linux driver of at least 610.43.02 .&lt;/p&gt;

&lt;h3&gt;
  
  
  How does cuTile Rust achieve data-race freedom without a runtime lock?
&lt;/h3&gt;

&lt;p&gt;It moves the guarantee to compile time. Mutable output tensors are partitioned on the host into provably non-overlapping tiles before dispatch, and each tile program receives an exclusive &lt;code&gt;&amp;amp;mut&lt;/code&gt; view of its slice while inputs arrive as shared &lt;code&gt;&amp;amp;&lt;/code&gt; references . Because the partitions cannot alias, Rust's borrow checker — which permits one mutable reference or many immutable ones — rules out conflicting writes statically . No runtime synchronization primitive is inserted; the kernel is single-threaded in its semantics yet compiles to massively parallel GPU code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is cuTile Rust production-ready?
&lt;/h3&gt;

&lt;p&gt;Not yet. The authors describe it as early-stage, so the API surface — including the &lt;code&gt;Tensor&amp;lt;f32, {[B]}&amp;gt;&lt;/code&gt; const-generic shape syntax and the macro forms — may change . It is CUDA/Linux-only (sm_80+, CUDA 13.3), and multi-batch throughput, prefill, and broader model coverage beyond Qwen3 are uncharacterized. Grout is a useful reference call site, but validate your target GPU, driver, model, batch size, and graph-capture behavior before replacing a mature stack like vLLM or SGLang.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does cuTile Rust work on AMD GPUs or Apple Silicon?
&lt;/h3&gt;

&lt;p&gt;No. cuTile Rust JIT-compiles through CUDA Tile IR, which targets NVIDIA hardware (sm_80+) only, and as of June 2026 there is no ROCm, Metal, or WebGPU backend . The portable Rust-on-GPU ecosystem — Rust GPU and &lt;code&gt;wgpu&lt;/code&gt; — does reach AMD and Apple Silicon, but it takes a different, non-CUDA approach and does not carry cuTile's ownership-across-launch model.&lt;/p&gt;

&lt;h3&gt;
  
  
  How does Grout's 171 tok/s on RTX 5090 compare to vLLM?
&lt;/h3&gt;

&lt;p&gt;The authors report 171 generated tokens/s for Qwen3-4B batch-1 decode on an RTX 5090 and 82 tokens/s for Qwen3-32B on a B200, characterizing both as competitive with vLLM and SGLang and near the HBM roofline for memory-bound decoding . Treat that as the authors' own measurement — independent reproduction has not been published. For your own baseline, Qwen recommends &lt;code&gt;vllm&amp;gt;=0.8.4&lt;/code&gt; or &lt;code&gt;sglang&amp;gt;=0.4.6.post1&lt;/code&gt; .&lt;/p&gt;

</description>
      <category>cutile</category>
      <category>rust</category>
      <category>gpu</category>
      <category>inference</category>
    </item>
    <item>
      <title>Fugu hides the seams: multiple AIs, billed as a whole</title>
      <dc:creator>Creeta</dc:creator>
      <pubDate>Thu, 25 Jun 2026 17:53:00 +0000</pubDate>
      <link>https://dev.to/creeta/fugu-hides-the-seams-multiple-ais-billed-as-a-whole-1j85</link>
      <guid>https://dev.to/creeta/fugu-hides-the-seams-multiple-ais-billed-as-a-whole-1j85</guid>
      <description>&lt;p&gt;Sakana AI's pitch with Fugu is unusual: stop chasing one bigger model, and instead train a model whose job is to direct other models. The seams between vendors are hidden, and you get back a single answer on a single bill.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is Sakana Fugu?
&lt;/h2&gt;

&lt;p&gt;Sakana Fugu is a language model trained to act as a coordinator rather than a soloist. When a request arrives, Fugu decomposes the task, routes the sub-tasks to the most suitable external frontier LLMs — OpenAI, Anthropic, and Google among them — verifies their outputs, and synthesizes a final answer, all invisible to the caller . Sakana describes it as &lt;em&gt;"a multi-agent system that behaves like a single model,"&lt;/em&gt; aimed at frontier-level quality while reducing single-vendor lock-in, since the agent pool is swappable .&lt;/p&gt;

&lt;p&gt;Two tiers ship. &lt;code&gt;fugu&lt;/code&gt; targets lower latency, lets you customize or exclude vendors in the pool, and suits interactive coding, code review, and chatbots. &lt;code&gt;fugu-ultra&lt;/code&gt; runs a fixed pool, routes among one to three agents depending on difficulty, and is tuned for hard, multi-step work like Kaggle competitions, literature review, and cybersecurity analysis .&lt;/p&gt;

&lt;p&gt;Released in June 2026, Fugu comes from Sakana AI — co-founded in 2023 by Llion Jones, a co-author of the 2017 "Attention Is All You Need" paper, and David Ha, former head of research at Stability AI . It builds on the Trinity and Conductor ICLR 2026 papers and the technical report at arXiv:2606.21228 . One caveat before you start: Fugu is not available in the EU/EEA, the UK, or Switzerland at launch while GDPR compliance is pending, under Terms of Service effective June 12, 2026 .&lt;/p&gt;

&lt;h2&gt;
  
  
  Before You Integrate Fugu
&lt;/h2&gt;

&lt;p&gt;Setup is a console-and-credential exercise, not a model download. Sign in to the Sakana console with Google or email, then generate an API key; you must be at least 18 under the Terms of Service effective June 12, 2026.&lt;/p&gt;

&lt;p&gt;Two checks matter before your first call:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Region.&lt;/strong&gt; Fugu is blocked in the EU/EEA, the UK, and Switzerland at launch while GDPR work continues, so verify your access region first .&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data policy.&lt;/strong&gt; Sub-tasks route to external frontier models from OpenAI, Anthropic, or Google, so review your organization's policy before sending proprietary code .&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For &lt;code&gt;fugu&lt;/code&gt; only — not &lt;code&gt;fugu-ultra&lt;/code&gt;, whose pool is fixed — you can exclude specific vendors or models during key creation or in console settings . A training-data opt-out also lives in settings; enable it before sending any non-public material .&lt;/p&gt;

&lt;h2&gt;
  
  
  Plugging Fugu Into a Codebase
&lt;/h2&gt;

&lt;p&gt;Because Fugu is OpenAI-compatible, integration is a base URL swap: point the OpenAI SDK at Sakana with &lt;code&gt;base_url='https://api.sakana.ai/v1'&lt;/code&gt; and &lt;code&gt;api_key='YOUR_FUGU_KEY'&lt;/code&gt;, then call model &lt;code&gt;fugu&lt;/code&gt; or &lt;code&gt;fugu-ultra&lt;/code&gt; . Existing &lt;code&gt;chat.completions&lt;/code&gt; calls keep working unchanged. Supported endpoints are &lt;code&gt;/v1/chat/completions&lt;/code&gt;, &lt;code&gt;/v1/responses&lt;/code&gt;, and &lt;code&gt;/v1/models&lt;/code&gt;, which lists available model IDs .&lt;/p&gt;

&lt;p&gt;Sakana recommends the Responses API — &lt;code&gt;client.responses.create()&lt;/code&gt; — over Chat Completions for tool use, multimodal input, and reasoning or function-call management, while Chat Completions remains supported . The mental model is one bill for many agents: this illustrative (not executed against the live API) sketch shows the single-line-item shape Fugu presents — sub-tasks fan out, one charge comes back.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Fugu&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;One interface that routes work to multiple AIs and returns one bill.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

    &lt;span class="n"&gt;prices&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;planner&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.003&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;writer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.002&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;auditor&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.001&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;usage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;planner&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;plan(&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;writer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;draft(&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;auditor&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;check(&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; -&amp;gt; &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;values&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;result&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bill&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;$&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;line_item&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Fugu&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;


&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Fugu&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;launch email&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three runtime details bite if you miss them. Reasoning effort accepts only &lt;code&gt;high&lt;/code&gt; and &lt;code&gt;xhigh&lt;/code&gt; (&lt;code&gt;max&lt;/code&gt; is an alias for &lt;code&gt;xhigh&lt;/code&gt;); every other value is rejected . Complex &lt;code&gt;fugu-ultra&lt;/code&gt; jobs can run long, so set &lt;code&gt;timeout=120.0&lt;/code&gt; or higher to avoid default client cut-offs . Streaming works with the usual &lt;code&gt;stream=True&lt;/code&gt;, and for production stability pin the dated alias &lt;code&gt;fugu-ultra-20260615&lt;/code&gt; rather than the floating &lt;code&gt;fugu-ultra&lt;/code&gt; tag .&lt;/p&gt;

&lt;p&gt;For agentic coding, Sakana ships a Codex integration installed in one line: &lt;code&gt;curl -fsSL https://sakana.ai/fugu/install | bash&lt;/code&gt;, then launch &lt;code&gt;codex-fugu&lt;/code&gt; . The bootstrap clones &lt;code&gt;github.com/SakanaAI/fugu&lt;/code&gt; into &lt;code&gt;~/.fugu&lt;/code&gt;, pins Codex, deploys config, and stores your key; non-interactive installs pass &lt;code&gt;SAKANA_API_KEY&lt;/code&gt; and &lt;code&gt;--yes&lt;/code&gt; . The installer officially supports Ubuntu and macOS only — Windows users need WSL Ubuntu or manual setup, since the bash pipe won't run in PowerShell . If &lt;code&gt;codex-fugu&lt;/code&gt; isn't found after install, reopen the terminal to refresh PATH .&lt;/p&gt;

&lt;h2&gt;
  
  
  What Fugu Hides From You
&lt;/h2&gt;

&lt;p&gt;Fugu's convenience comes with deliberate opacity. Sakana treats provider selection and the routing plan as proprietary: for any given query, it does not expose which underlying models ran or how the task was decomposed . Usage fields do separate visible-model tokens from orchestration tokens — and those orchestration tokens are real, billable usage folded into the final price — but you get no per-provider breakdown .&lt;/p&gt;

&lt;p&gt;The benchmarks deserve the same skepticism. The model page reports Fugu Ultra / Fugu at SWE Bench Pro 73.7 / 59.0, Terminal Bench 2.1 82.1 / 80.2, and GPQA Diamond 95.5 / 95.5 . These are self-reported. Baseline frontier scores are provider-reported rather than re-run, and Fable 5 and Mythos Preview were left out of Fugu's agent pool because they were not publicly accessible — so the headline comparisons are not fully independent, apples-to-apples audits, and no third-party replication existed at the time of reporting .&lt;/p&gt;

&lt;p&gt;Two more constraints matter before onboarding. Fugu is blocked entirely across the EEA, UK, and Switzerland pending GDPR compliance, with no launch timeline given for those regions . And per the Terms of Service (effective June 12, 2026), Sakana guarantees nothing about accuracy, completeness, or legal compliance, and routes sub-tasks to external models like OpenAI, Anthropic, and Google — review your data-handling obligations before sending sensitive or proprietary code .&lt;/p&gt;

&lt;h2&gt;
  
  
  Taking Fugu Further
&lt;/h2&gt;

&lt;p&gt;Once Fugu is wired in, match the plan and tier to your workload. Subscriptions cover both models: Standard at $20/month, Pro at $100/month (10× Standard usage), and Max at $200/month (30× Standard) — with a second month free for subscriptions made before July 31, 2026. For production, pay-as-you-go consumption tokens get higher routing priority than monthly-plan tokens, which matters for latency-sensitive traffic .&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;fugu-ultra-20260615&lt;/th&gt;
&lt;th&gt;≤272K context&lt;/th&gt;
&lt;th&gt;&amp;gt;272K context&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Input / 1M tokens&lt;/td&gt;
&lt;td&gt;$5&lt;/td&gt;
&lt;td&gt;$10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Output / 1M tokens&lt;/td&gt;
&lt;td&gt;$30&lt;/td&gt;
&lt;td&gt;$45&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cached input / 1M&lt;/td&gt;
&lt;td&gt;$0.50&lt;/td&gt;
&lt;td&gt;$1.00&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Note that orchestration tokens are real, billable usage folded into that consolidated price . Reserve &lt;code&gt;fugu-ultra&lt;/code&gt; for multi-step code challenges, patent investigation, paper reproduction, and security analysis; for fast interactive tasks, &lt;code&gt;fugu&lt;/code&gt; gives lower latency and a provider pool you can constrain. Pick the tier by job difficulty, not by default.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Is Sakana Fugu available in Europe?
&lt;/h3&gt;

&lt;p&gt;No. Fugu is not available in the EU/EEA, the UK, or Switzerland at launch. The Terms of Service (effective 2026-06-12) explicitly exclude the European Economic Area, the United Kingdom, and Switzerland while Sakana works toward GDPR compliance . No timeline for those regions has been published, so plan around it rather than waiting on it.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the difference between fugu and fugu-ultra?
&lt;/h3&gt;

&lt;p&gt;The two tiers trade latency against answer quality. &lt;code&gt;fugu&lt;/code&gt; targets low latency and everyday quality for interactive coding, code review, and chatbots, and lets you exclude specific providers or models from the pool when you create or edit an API key . &lt;code&gt;fugu-ultra&lt;/code&gt; uses a fixed pool, routes among one to three agents depending on difficulty, and is tuned for hard, multi-step problems. Its dated alias &lt;code&gt;fugu-ultra-20260615&lt;/code&gt; is priced at $5 input and $30 output per 1M tokens under standard context .&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I see which underlying LLMs Fugu used for my request?
&lt;/h3&gt;

&lt;p&gt;No. Sakana treats provider selection and the routing plan as proprietary and does not expose them for any query . Fugu Ultra usage fields separate visible model tokens from orchestration tokens, but there is no per-provider breakdown . The opacity is by design — if you need an audit trail of which vendor handled each sub-task, Fugu will not give you one.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does Fugu work with the OpenAI Python SDK without major changes?
&lt;/h3&gt;

&lt;p&gt;Yes. Fugu is OpenAI-compatible: set the SDK's &lt;code&gt;base_url&lt;/code&gt; to &lt;code&gt;https://api.sakana.ai/v1&lt;/code&gt; and pass your Fugu credential as &lt;code&gt;api_key&lt;/code&gt; . Existing Chat Completions calls run as-is, though Sakana recommends the Responses API for new integrations that need tool use, multimodal input, or reasoning management . Raise your client-side timeout for &lt;code&gt;fugu-ultra&lt;/code&gt;, since complex jobs can run long .&lt;/p&gt;

&lt;h3&gt;
  
  
  Does the Fugu installer work on Windows?
&lt;/h3&gt;

&lt;p&gt;Only through WSL Ubuntu. The one-line bash-pipe installer (&lt;code&gt;curl -fsSL https://sakana.ai/fugu/install | bash&lt;/code&gt;) will not run in PowerShell or a native Windows terminal, so the supported path is WSL Ubuntu or the manual setup; macOS and Ubuntu are officially supported . For non-interactive installs, pass &lt;code&gt;SAKANA_API_KEY&lt;/code&gt; as an environment variable and &lt;code&gt;--yes&lt;/code&gt; to skip prompts; if &lt;code&gt;codex-fugu&lt;/code&gt; isn't found afterward, reopen the terminal to refresh PATH .&lt;/p&gt;

</description>
      <category>sakanaai</category>
      <category>fugu</category>
      <category>fuguultra</category>
      <category>multiagent</category>
    </item>
    <item>
      <title>Three packages claim 'SkillsGuard'. One shipped malware.</title>
      <dc:creator>Creeta</dc:creator>
      <pubDate>Wed, 24 Jun 2026 16:50:36 +0000</pubDate>
      <link>https://dev.to/creeta/three-packages-claim-skillsguard-one-shipped-malware-4fgc</link>
      <guid>https://dev.to/creeta/three-packages-claim-skillsguard-one-shipped-malware-4fgc</guid>
      <description>&lt;p&gt;Search for "SkillsGuard" today and you'll find at least four different things wearing the name — one of which was pulled from a registry for shipping malware. Before you install anything that promises to secure your Agent Skills, you need to know exactly which package you're typing into &lt;code&gt;npm install&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 'SkillsGuard' Naming Mess, Resolved
&lt;/h2&gt;

&lt;p&gt;"SkillsGuard" is not one product — it's a collision of at least four distinct efforts aimed at the same problem: securing Agent Skills before and while they run. They differ in everything that matters: whether code actually ships, who publishes it, and whether you can audit it. The table below disambiguates them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quick Answer:&lt;/strong&gt; Four projects share the "SkillsGuard" name. Only AgentGuard by GoPlus Security is a verifiable, installable runtime guard — public GitHub, MIT-licensed, at v1.1.28 . A scanner named "SkillGuard" was flagged malicious and pulled from ClawHub, so verify the publisher before installing any of them.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;What it is&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SkillGuard (paper)&lt;/td&gt;
&lt;td&gt;arXiv:2606.03024, permission framework&lt;/td&gt;
&lt;td&gt;Blueprint only — no shipped artifact&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AgentGuard (GoPlus Security)&lt;/td&gt;
&lt;td&gt;Runtime guard, npm, MIT&lt;/td&gt;
&lt;td&gt;v1.1.28, actively maintained&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;@yangyixxxx/skill-guard&lt;/td&gt;
&lt;td&gt;npm package (skillguard.vip)&lt;/td&gt;
&lt;td&gt;Third-party&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;skills-guard&lt;/td&gt;
&lt;td&gt;Engine bundled in SkillsHub registry&lt;/td&gt;
&lt;td&gt;Registry-embedded&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The stakes are concrete. A tool called "SkillGuard" by user c-goro was flagged malicious and pulled from ClawHub — the scanner itself was the attack. Snyk reports that over 13% of marketplace skills contain critical vulnerabilities , so the tool you trust to audit others must itself be auditable and open-source.&lt;/p&gt;

&lt;p&gt;Recommended path today: &lt;strong&gt;AgentGuard by GoPlus Security&lt;/strong&gt; — public GitHub, MIT-licensed, fully documented at v1.1.28 . The arXiv SkillGuard paper is worth reading as an implementation blueprint, but it has no installable artifact yet .&lt;/p&gt;

&lt;h2&gt;
  
  
  What to Gather Before You Start
&lt;/h2&gt;

&lt;p&gt;AgentGuard installs as a global npm package, so the setup is light: you need &lt;strong&gt;Node.js 18 or newer and npm&lt;/strong&gt;. There is no Python interpreter or separate runtime to manage — the entire scanner ships through npm at v1.1.28 , MIT-licensed.&lt;/p&gt;

&lt;p&gt;Next, line up a compatible agentic host. AgentGuard supports &lt;strong&gt;Claude Code and OpenClaw fully&lt;/strong&gt;, including its automatic hook layer. &lt;strong&gt;Codex, Gemini, Cursor, and Copilot&lt;/strong&gt; are covered in skill-only mode, which scans skill directories without wiring into the agent's live tool-call loop .&lt;/p&gt;

&lt;p&gt;You also need something to point it at. Gather the following before running any command:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Node.js ≥18 + npm&lt;/strong&gt; — the only runtime dependency; verify with &lt;code&gt;node -v&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An agentic host&lt;/strong&gt; — Claude Code or OpenClaw for full hooks; Codex/Gemini/Cursor/Copilot for skill-only scans.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;At least one Agent Skill directory&lt;/strong&gt; — a folder containing &lt;code&gt;SKILL.md&lt;/code&gt; plus any bundled scripts or assets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optional: a tool-call JSON payload&lt;/strong&gt; — to pipe into &lt;code&gt;agentguard protect&lt;/code&gt; when you want to evaluate a single action rather than a whole skill.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Quickstart: Init, Scan, Protect
&lt;/h2&gt;

&lt;p&gt;With Node and a skill directory in place, AgentGuard goes from install to active runtime guard in three commands. Install it globally, initialize hooks against your agentic host, then scan a skill folder or evaluate a single tool call. AgentGuard by GoPlus Security is verified on GitHub at v1.1.28 , MIT-licensed, and the most verifiable installable option of the packages sharing the "SkillsGuard" name.&lt;/p&gt;

&lt;p&gt;Install globally and confirm the binary resolves before going further:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @goplus/agentguard
agentguard &lt;span class="nt"&gt;--version&lt;/span&gt;   &lt;span class="c"&gt;# expect 1.1.28+&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, wire Layer 1. The &lt;code&gt;--agent auto&lt;/code&gt; flag auto-detects Claude Code or OpenClaw and installs hooks that block destructive commands and writes to &lt;code&gt;.env&lt;/code&gt; and &lt;code&gt;.ssh/&lt;/code&gt;, plus webhook exfiltration detection :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;agentguard init &lt;span class="nt"&gt;--agent&lt;/span&gt; auto
agentguard status   &lt;span class="c"&gt;# active hook count + webhook monitoring state&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run &lt;code&gt;agentguard status&lt;/code&gt; before you proceed — it confirms how many hooks are live and whether exfiltration monitoring is armed. Treat a zero-hook status as a failed init, not a clean one.&lt;/p&gt;

&lt;p&gt;To audit a skill, point the on-demand deep scan at its folder. Layer 2 runs all 24 detection rules spanning Execution (SHELL_EXEC, REMOTE_LOADER), Secrets (READ_ENV_SECRETS, PRIVATE_KEY_PATTERN), Exfiltration (NET_EXFIL_UNRESTRICTED, WEBHOOK_EXFIL), Obfuscation, eight Web3 rules, and four Trojan/social-engineering rules, then prints a severity-ranked report :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;agentguard scan ./path/to/skill
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a single action rather than a whole skill, pipe a tool-call JSON payload into &lt;code&gt;agentguard protect&lt;/code&gt;. The default Balanced level blocks dangerous actions and confirms risky ones; add &lt;code&gt;--level strict&lt;/code&gt; to block anything not explicitly declared in the manifest :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;tool-call.json | agentguard protect &lt;span class="nt"&gt;--level&lt;/span&gt; strict
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why bother running all three layers? Because the threat is execution, not just text. Anthropic's own Skills documentation warns that a malicious skill can drive "data exfiltration, unauthorized system access," and instructs users to audit every bundled file for unexpected network or file activity . A scanner that only sees SKILL.md misses scripts that fire at runtime — Layer 1 hooks plus a Layer 2 scan close that gap before a skill ever touches your shell.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where AgentGuard's Coverage Ends
&lt;/h2&gt;

&lt;p&gt;A scanner narrows the attack surface; it does not seal it. AgentGuard inspects SKILL.md and top-level scripts against 24 detection rules, but four gaps remain that no current rule set closes . Knowing them tells you when a clean scan is reassurance and when it is false comfort.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Manifest generation is noisy and lightly tested.&lt;/strong&gt; The SkillGuard paper's automated manifest generator was evaluated on just 23 clean skills, scoring 85.6% precision and 97.1% recall, but it over-declared at least one permission in 13 of 23 cases (56.5%) and under-declared in 4 (17.4%) . Expect false positives on legitimate skills.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bundled-library source is not analyzed.&lt;/strong&gt; Malicious logic buried inside an imported dependency passes the scan if SKILL.md and the entry scripts look clean — the paper flags omitted bundled-script analysis as an open source of misses .&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prompt-injection supply-chain attacks survive hardening.&lt;/strong&gt; SKILL.md-only attacks still reach up to an 86% pairwise discovery win rate and 36.5%–100% governance evasion against scan-hardened hosts . Read-only skill mounts are the proposed mitigation — and AgentGuard does not provide them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permission checks can't read intent.&lt;/strong&gt; A skill with legitimate FETCH_WEB access can exfiltrate data after it passes the scan; granting a capability and policing its use are different problems.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Independent signal underlines the stakes. As Snyk's research team puts it, "over 13% of marketplace skills contain critical vulnerabilities," a finding from their analysis of why skill scanners can create false security . Treat AgentGuard as one layer that fails closed early — not as proof a skill is safe.&lt;/p&gt;

&lt;h2&gt;
  
  
  Going Beyond the Scanner: Manifest Sidecar
&lt;/h2&gt;

&lt;p&gt;A scanner judges a skill once; a manifest governs it every time it acts. To close the gap, pair AgentGuard with a deny-by-default permission layer drawn from the SkillGuard paper . Drop a &lt;code&gt;skillguard-manifest.json&lt;/code&gt; beside each skill, where every entry declares a &lt;code&gt;capability&lt;/code&gt;, an &lt;code&gt;effect&lt;/code&gt; (allow/confirm/deny), &lt;code&gt;constraints&lt;/code&gt; such as &lt;code&gt;workspace_only&lt;/code&gt;, &lt;code&gt;time_window&lt;/code&gt;, and &lt;code&gt;rate_limit&lt;/code&gt;, plus an &lt;code&gt;expires_at&lt;/code&gt; so grants lapse instead of lingering.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"capability"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"POST_WEB"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"confirm"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"constraints"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"workspace_only"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"rate_limit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"5/min"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"expires_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-07-25T00:00:00Z"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then wire a PreToolUse hook: map each tool call to a canonical capability and evaluate the manifest before execution. If the capability is undeclared or rated dangerous, system, or redact, block or prompt the user. This matters because static scanning cannot stop a malicious sibling skill from mutating &lt;code&gt;SKILL.md&lt;/code&gt; after activation — an attack class shown to reach up to 100% governance evasion in related work . Mounting skill directories read-only in a container neutralizes it.&lt;/p&gt;

&lt;p&gt;Finally, let coverage refresh itself. Enable Layer 3 with &lt;code&gt;agentguard status --schedule daily&lt;/code&gt; , so subsequent skill updates that introduce new bundled files or network-call patterns get caught without a manual re-scan.&lt;/p&gt;

&lt;p&gt;The takeaway: declare what a skill may do, mount it read-only, check every call at the tool boundary, and patrol daily. No single tool proves a skill safe — but layered, fail-closed defaults make the gap between "scanned" and "trusted" something you control rather than assume.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Is SkillsGuard an official Anthropic product?
&lt;/h3&gt;

&lt;p&gt;No. Anthropic's Agent Skills specification, announced in October 2025 , documents the SKILL.md format and explicitly warns about risks such as data exfiltration and unauthorized system access, but it ships no scanner of its own. "SkillsGuard" is an ambiguous name that resolves to unaffiliated third-party efforts: AgentGuard by GoPlus Security, a research framework described in an academic paper, and two separately-published npm packages. None carry an Anthropic endorsement, so treat the name as a category, not a product.&lt;/p&gt;

&lt;h3&gt;
  
  
  What does &lt;code&gt;agentguard scan&lt;/code&gt; actually check?
&lt;/h3&gt;

&lt;p&gt;It runs a static deep scan with 24 detection rules across six categories . Those are: Execution (SHELL_EXEC, AUTO_UPDATE, REMOTE_LOADER); Secrets (READ_ENV_SECRETS, READ_SSH_KEYS, PRIVATE_KEY_PATTERN, MNEMONIC_PATTERN); Exfiltration (NET_EXFIL_UNRESTRICTED, WEBHOOK_EXFIL); Obfuscation (OBFUSCATION, PROMPT_INJECTION); eight Web3 rules such as WALLET_DRAINING and UNLIMITED_APPROVAL; and four Trojan/social-engineering rules. The scan inspects files and patterns without executing the skill, so it reports findings rather than granting or blocking access at runtime.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can AgentGuard catch prompt injection inside SKILL.md?
&lt;/h3&gt;

&lt;p&gt;Partially. AgentGuard's PROMPT_INJECTION rule flags known injection patterns, but pattern matching alone does not eliminate the risk. The SkillGuard paper's adversarial evaluation gives a sense of the ceiling: with full manifest enforcement, contextual injection success dropped from 32.37% to 23.02% and obvious injection from 25.56% to 16.67% . That is a meaningful reduction, not a guarantee — attacks that abuse already-granted permissions can still slip through, which is why a scanner should sit behind deny-by-default policy rather than stand alone.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I scan a skill without activating it in my host environment?
&lt;/h3&gt;

&lt;p&gt;Run &lt;code&gt;agentguard scan &amp;lt;skill-dir&amp;gt;&lt;/code&gt;, which performs static analysis only and never activates the skill in your host agent . Before granting any host permissions, evaluate the specific tool calls you expect the skill to make by piping a dry-run JSON payload into &lt;code&gt;agentguard protect&lt;/code&gt;. This lets you see the decision (allow, confirm, or block) for each action in isolation, so a skill earns host access only after both its files and its expected behavior have been checked.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the difference between strict, balanced, and permissive protection levels?
&lt;/h3&gt;

&lt;p&gt;Balanced is the default: it blocks dangerous capabilities and prompts you to confirm risky ones . Strict blocks anything not explicitly declared in the skill's manifest, so it suits a skill whose permissions you have already pinned down. Permissive logs activity without blocking, which is useful for baselining a new skill and discovering what it actually does. The practical path: start on Balanced, observe with Permissive while building the manifest, then move to Strict once you have a confirmed declaration to enforce against.&lt;/p&gt;

</description>
      <category>agentskills</category>
      <category>agentguard</category>
      <category>skillsguard</category>
      <category>llmsecurity</category>
    </item>
    <item>
      <title>An offline AI you power with your arm — 48 tok/s on a Pi 5 CPU</title>
      <dc:creator>Creeta</dc:creator>
      <pubDate>Tue, 23 Jun 2026 16:51:30 +0000</pubDate>
      <link>https://dev.to/creeta/an-offline-ai-you-power-with-your-arm-48-toks-on-a-pi-5-cpu-38cg</link>
      <guid>https://dev.to/creeta/an-offline-ai-you-power-with-your-arm-48-toks-on-a-pi-5-cpu-38cg</guid>
      <description>&lt;p&gt;A hand crank, a Raspberry Pi 5, and no internet — CrankGPT turns "where does the power come from?" into a literal question. Before you build one, it helps to know what is actually a working project and what is just noise.&lt;/p&gt;

&lt;h2&gt;
  
  
  What CrankGPT Is, and What to Ignore
&lt;/h2&gt;

&lt;p&gt;CrankGPT is a fully offline, human-powered local AI voice appliance built by Squeez Labs, co-founded by Katrin Tomanek and Alex Kauffmann. It is a working prototype and reference build — not a SaaS product, app, or device you can buy. Squeez Labs explicitly states it does not sell CrankGPT and is not affiliated with any token or meme coin using the name, so treat any "buy CrankGPT" listing as suspect .&lt;/p&gt;

&lt;p&gt;The interaction loop is deliberately simple. You turn the crank to wake and power the box; keep cranking and it stays alive while it listens, thinks, and speaks. Moonshine ASR (with Silero VAD for endpointing) transcribes your request, a small local LLM through llama.cpp generates a reply, and Piper synthesizes speech sentence-by-sentence — so the device starts talking before the full answer is finished [1][2].&lt;/p&gt;

&lt;p&gt;The landing page frames three tongue-in-cheek power tiers: a 20W hand-cranked "Synapse" tier for Q&amp;amp;A, a 150W pedal "Cortex" tier for heavier tasks, and a 2000W+ "Singularity" tier for agent swarms . The crank is the entry-tier demo. For anything you can actually wire up, the real entry point is the open-source &lt;a href="https://github.com/ktomanek/edge_voice_agent" rel="noopener noreferrer"&gt;ktomanek/edge_voice_agent&lt;/a&gt; repository — the &lt;a href="https://www.geeksaresexy.net/2026/06/16/crankgpt-the-offline-ai-powered-by-cardio-and-a-hand-crank/" rel="noopener noreferrer"&gt;satirical Squeez Labs page&lt;/a&gt; explains the concept, but the repo is where all the wiring lives.&lt;/p&gt;

&lt;h2&gt;
  
  
  Parts and Power: Pi 5, ReSpeaker, and the Crank
&lt;/h2&gt;

&lt;p&gt;The CrankGPT reference build runs the entire voice loop on a stock Raspberry Pi 5 with 8 GB RAM plus a cooling fan HAT — no GPU, no accelerator, CPU only . Audio comes from a ReSpeaker 2-Mic Pi HAT (WM8960 codec, stereo MEMS mics), though Squeez Labs also tested USB sound cards with an external mic and speaker, so you are not locked into the HAT .&lt;/p&gt;

&lt;p&gt;Power is where the build gets opinionated. The generator is an off-the-shelf switchable-voltage 20W hand-crank emergency USB charger, but the Pi alone will not survive on it. Under load the rail sags below the Pi's required voltage or trips overcurrent protection, so Squeez Labs added a custom capacitor/supercapacitor board that holds roughly a 20-second reservoir . Treat that buffer as mandatory: without it, a brief pause in cranking drops the rail and kills the Pi mid-sentence.&lt;/p&gt;

&lt;p&gt;The draw figures explain why. Idle sits at ~4W (5V/0.8A), Moonshine ASR pulls ~8W (5V/1.6A), and combined LLM+TTS inference reaches ~15W (5V/3A), with transient spikes up to ~5A . Your generator must sustain a continuous 15W, not just peak there.&lt;/p&gt;

&lt;p&gt;The OS choice follows the same boot-time logic. CrankGPT runs DietPi, a stripped Debian variant, with Bluetooth and Wi-Fi radio services disabled; Linux reaches usable userspace in about 3 seconds, against roughly 10 seconds longer on stock Raspberry Pi OS . When a human is cranking, every second of boot is a second of arm fatigue.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cloning edge_voice_agent and Getting It Talking
&lt;/h2&gt;

&lt;p&gt;The control layer is Tomanek's open-source &lt;code&gt;ktomanek/edge_voice_agent&lt;/code&gt; repository — start there, not the satire-styled landing page, if you want the pipeline running on ordinary hardware . It supports ASR backends Moonshine, FasterWhisper, Nemo FastConformer, and Vosk; TTS via Piper or Kokoro; and any llama.cpp-hosted LLM, with a default Pi 5 setup of Moonshine tiny + Piper + Gemma3:1b .&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1 — Build llama.cpp.&lt;/strong&gt; Compile with the server target enabled and confirm &lt;code&gt;llama-server&lt;/code&gt; is on your PATH:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cmake &lt;span class="nt"&gt;-B&lt;/span&gt; build &lt;span class="nt"&gt;-DLLAMA_BUILD_SERVER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ON
cmake &lt;span class="nt"&gt;--build&lt;/span&gt; build &lt;span class="nt"&gt;--config&lt;/span&gt; Release
&lt;span class="c"&gt;# confirm it resolves&lt;/span&gt;
which llama-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 2 — Clone and run setup.&lt;/strong&gt; The &lt;code&gt;setup.py&lt;/code&gt; script downloads Piper, Moonshine, Silero, and the default LLM automatically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/ktomanek/edge_voice_agent
&lt;span class="nb"&gt;cd &lt;/span&gt;edge_voice_agent
python &lt;span class="nt"&gt;-m&lt;/span&gt; venv .venv &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;source&lt;/span&gt; .venv/bin/activate
python setup.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 3 — Manual two-process startup.&lt;/strong&gt; Run the LLM server in one terminal, then the agent CLI in a second :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# terminal 1&lt;/span&gt;
llama-server &lt;span class="nt"&gt;-m&lt;/span&gt; models/llms/LFM2-350M-Q4_K_M.gguf &lt;span class="nt"&gt;--port&lt;/span&gt; 8080

&lt;span class="c"&gt;# terminal 2&lt;/span&gt;
python voice_agent_cli.py &lt;span class="nt"&gt;--platform&lt;/span&gt; rpi5 &lt;span class="nt"&gt;--prompt_file&lt;/span&gt; prompts.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Laptop shortcut (no physical buttons).&lt;/strong&gt; If you are testing without the rotary dial and interrupt button, drive it from the keyboard: &lt;code&gt;python voice_agent_cli.py --enable_keyboard_control&lt;/code&gt;. Enter interrupts current speech, Space toggles mic mute, and &lt;code&gt;g&lt;/code&gt;/&lt;code&gt;s&lt;/code&gt;/&lt;code&gt;f&lt;/code&gt; switch among the three prompt slots .&lt;/p&gt;

&lt;p&gt;LFM2.5 350M in Q4_K_M is the recommended default on a Pi 5: it loads in 354 MiB, generates 48.86 tokens/s, and returns first byte in about 0.8s . Trade memory for quality with the larger options below.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model (Q4_K_M)&lt;/th&gt;
&lt;th&gt;RAM&lt;/th&gt;
&lt;th&gt;Tokens/s&lt;/th&gt;
&lt;th&gt;Avg TTFB&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;LFM2.5 350M&lt;/td&gt;
&lt;td&gt;354 MiB&lt;/td&gt;
&lt;td&gt;48.86&lt;/td&gt;
&lt;td&gt;~0.8s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LFM2.5 1.2B&lt;/td&gt;
&lt;td&gt;762 MiB&lt;/td&gt;
&lt;td&gt;15.01&lt;/td&gt;
&lt;td&gt;~1.5s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemma3 1B&lt;/td&gt;
&lt;td&gt;762 MiB&lt;/td&gt;
&lt;td&gt;14.31&lt;/td&gt;
&lt;td&gt;~2.9s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Figures are vendor-reported (llama.cpp pp512/tg128, 4 threads) and not independently benchmarked .&lt;/p&gt;

&lt;h2&gt;
  
  
  Power Spikes, ASR Limits, and Where to Go From Here
&lt;/h2&gt;

&lt;p&gt;The ~30-second cold start is the price of running everything locally, and it breaks down into three measurable stages: 10–15s of Raspberry Pi 5 firmware boot, ~3s from Linux kernel to usable userspace, and another 10–15s for Python imports and model loading . The software stack runs on ONNX Runtime with PyTorch dependencies stripped out where possible, which trims both RAM use and that final load stage noticeably . If startup feels slow, that import-and-load window is where to optimize first.&lt;/p&gt;

&lt;p&gt;Moonshine is fast on a CPU but pays for it in robustness: it is less reliable under crank mechanical noise and non-native accents than Whisper-base-sized models or NVIDIA FastConformer . If transcription quality degrades, swap the ASR backend to FasterWhisper in &lt;code&gt;edge_voice_agent&lt;/code&gt; — the repo supports it alongside Moonshine, Nemo FastConformer, and Vosk .&lt;/p&gt;

&lt;p&gt;For more headroom, the Orange Pi 5 Pro raises generation rates 29–58% over the Pi 5 thanks to DDR5 RAM — confirming that memory bandwidth, not raw compute, is the autoregressive decoding bottleneck . Pass &lt;code&gt;--platform opi5&lt;/code&gt; to use it. From there, two experiments are worth running: step up to LFM2.5 1.2B Q4_K_M (762 MiB, ~1.5s time-to-first-byte) for richer answers at still-usable latency , and try &lt;code&gt;voice_translate_cli.py&lt;/code&gt;, which maps the 3-position rotary dial to offline German, Spanish, and French translation . The takeaway: start with the 350M default to prove the loop, then trade memory bandwidth for answer quality only where your hardware and patience allow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Do I need the physical hand-crank hardware to try CrankGPT's software?
&lt;/h3&gt;

&lt;p&gt;No. The crank is only the power source — the actual intelligence lives in the open-source &lt;a href="https://github.com/ktomanek/edge_voice_agent" rel="noopener noreferrer"&gt;edge_voice_agent&lt;/a&gt; repo, which runs on any Raspberry Pi 5 or an ordinary laptop. To exercise the full ASR→LLM→TTS loop with no hardware build, run &lt;code&gt;python voice_agent_cli.py --enable_keyboard_control&lt;/code&gt;: Enter interrupts speech, Space toggles mic mute, and &lt;code&gt;g&lt;/code&gt;/&lt;code&gt;s&lt;/code&gt;/&lt;code&gt;f&lt;/code&gt; switch among the three prompt or translation positions .&lt;/p&gt;

&lt;h3&gt;
  
  
  Which GGUF model gives the best quality-speed tradeoff on Raspberry Pi 5?
&lt;/h3&gt;

&lt;p&gt;For lowest latency, use LFM2.5 350M in Q4_K_M quantization: on a Pi 5 (llama.cpp, 4 threads) it generated 48.86 tokens/s with ~0.8s time-to-first-byte and used just 354.48 MiB . Step up to LFM2.5 1.2B (762.49 MiB, ~1.5s TTFB, 15.01 tok/s) for richer answers. Gemma3 1B occupies similar memory but its prefill is roughly 5× slower (46.12 vs 222.65 prefill) and TTFB climbs to ~2.9s .&lt;/p&gt;

&lt;h3&gt;
  
  
  Why does stopping the crank kill the Raspberry Pi?
&lt;/h3&gt;

&lt;p&gt;The Pi 5 draws up to ~5A in brief current spikes during combined LLM+TTS inference (~15W steady) , and a 20W hand-crank generator sags below the required voltage or trips its overcurrent protection without a buffer. Squeez Labs' custom capacitor/supercapacitor board supplies roughly a 20-second reservoir to smooth those dips. Without it, any pause in cranking causes a brown-out reset, so this power-smoothing layer is not optional .&lt;/p&gt;

&lt;h3&gt;
  
  
  Can Moonshine ASR be swapped for Whisper on this pipeline?
&lt;/h3&gt;

&lt;p&gt;Yes. edge_voice_agent treats ASR as a pluggable backend and supports FasterWhisper as a drop-in alternative to Moonshine (alongside Nemo FastConformer and Vosk) . Whisper-class models are more robust under noise and diverse accents — a known weak spot for Moonshine — but run slower on the Pi 5's CPU. The LLM and Piper TTS stages stay unchanged, so you only trade latency for transcription accuracy .&lt;/p&gt;

&lt;h3&gt;
  
  
  Is CrankGPT available to buy or download as a ready-made app?
&lt;/h3&gt;

&lt;p&gt;Neither. Squeez Labs explicitly states it does not sell CrankGPT and is not affiliated with any token or meme coin using the name, so treat any "buy CrankGPT" listing as suspect . There is no pre-built app, published price, or full bill of materials — only the constituent open-source projects . To use it, clone edge_voice_agent, source the parts separately, and optionally build the crank enclosure yourself from the reference design.&lt;/p&gt;

</description>
      <category>crankgpt</category>
      <category>raspberrypi5</category>
      <category>edgeai</category>
      <category>offlineai</category>
    </item>
    <item>
      <title>GitHub Copilot App can now merge PRs while you're offline</title>
      <dc:creator>Creeta</dc:creator>
      <pubDate>Mon, 22 Jun 2026 16:55:22 +0000</pubDate>
      <link>https://dev.to/creeta/github-copilot-app-can-now-merge-prs-while-youre-offline-31e7</link>
      <guid>https://dev.to/creeta/github-copilot-app-can-now-merge-prs-while-youre-offline-31e7</guid>
      <description>&lt;p&gt;GitHub Copilot started as inline autocomplete. As of mid-2026 it ships its own desktop application that can pick up an issue, open an agent session, and merge the resulting pull request while you are away from your machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the Copilot App Orchestrates Repos and PR Handoffs
&lt;/h2&gt;

&lt;p&gt;The GitHub Copilot app is an agent-native desktop control center for finding work, starting agent sessions, reviewing diffs, and handling pull requests across repositories — not an IDE replacement and not another chat panel. GitHub announced it at Microsoft Build and detailed it in a blog post dated June 2, 2026. It is built on the Copilot CLI and Copilot SDK, layering a UI for parallel sessions over your repos rather than replacing your editor (source: &lt;a href="https://github.blog/news-insights/product-news/github-copilot-app-the-agent-native-desktop-experience/" rel="noopener noreferrer"&gt;GitHub Blog, 2026-06&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Navigation splits into four areas: &lt;strong&gt;My work&lt;/strong&gt; surfaces issues and PRs with live CI and review state, &lt;strong&gt;Automations&lt;/strong&gt; holds saved repeatable agent tasks, &lt;strong&gt;Search&lt;/strong&gt; spans repositories, and &lt;strong&gt;Sessions&lt;/strong&gt; lists active agent threads plus Quick chats (source: &lt;a href="https://docs.github.com/en/copilot/get-started/features" rel="noopener noreferrer"&gt;GitHub Docs&lt;/a&gt;). Each session runs in an isolated workspace — typically a new Git worktree — so multiple agents work on separate branches simultaneously without manual conflict resolution.&lt;/p&gt;

&lt;p&gt;The handoff that earns the headline is &lt;strong&gt;Agent Merge&lt;/strong&gt;: when enabled, the workspace's Copilot session reads the PR, fixes blockers, and merges once GitHub allows. It runs in the background, survives app restarts, and turns itself off after the merge — which is exactly why GitHub frames it as a high-trust mode. As the product team puts it, the app is designed so an agent can "find work, start agent sessions, steer changes, review diffs, and handle pull requests" from one surface — GitHub Engineering (source: &lt;a href="https://github.blog/news-insights/product-news/github-copilot-app-the-agent-native-desktop-experience/" rel="noopener noreferrer"&gt;GitHub Blog, 2026-06&lt;/a&gt;). That makes branch protection and CI discipline prerequisites, not optional extras.&lt;/p&gt;

&lt;h2&gt;
  
  
  Copilot App Needs a Paid Seat and One Admin Switch
&lt;/h2&gt;

&lt;p&gt;The Copilot App is not available on the Free tier. Free gives you 2,000 inline suggestions per month and nothing else relevant here — no app access, no cloud agent, and no Copilot-created PR assignment or code review . To run agent sessions and merge PRs from the desktop, you need a paid seat. Individual plans are Pro at $10/mo, Pro+ at $39/mo, and Max at $100/mo (the highest individual allowance); team plans are Business at $19/user/mo and Enterprise at $39/user/mo .&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plan&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;th&gt;Copilot App&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;No (2,000 inline suggestions only)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pro&lt;/td&gt;
&lt;td&gt;$10/mo&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pro+&lt;/td&gt;
&lt;td&gt;$39/mo&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Max&lt;/td&gt;
&lt;td&gt;$100/mo&lt;/td&gt;
&lt;td&gt;Yes (highest individual allowance)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Business&lt;/td&gt;
&lt;td&gt;$19/user/mo&lt;/td&gt;
&lt;td&gt;Yes (admin policy required)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enterprise&lt;/td&gt;
&lt;td&gt;$39/user/mo&lt;/td&gt;
&lt;td&gt;Yes (admin policy required)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Watch the billing model. Since June 1, 2026, Copilot moved from Premium Request Units to usage-based AI Credits, where 1 credit equals $0.01, metered on input, output, and cached tokens . Agent sessions and Agent Merge draw down credits; inline completions and Next Edit suggestions stay included and do not consume them . One more gate for teams: on Business or Enterprise, an admin must enable the Copilot CLI policy before the app can connect . Check org settings before anyone downloads the installer.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Open a Copilot Agent Session and Merge a PR
&lt;/h2&gt;

&lt;p&gt;With the policy enabled, the fastest path to a Copilot-merged PR is five steps: install the app, add a repo, scope with a Quick chat, run a session, then enable Agent Merge behind branch protection. Start by downloading from &lt;a href="https://github.com/github/app" rel="noopener noreferrer"&gt;github.com/github/app&lt;/a&gt;, which ships builds for Mac Apple Silicon, Mac Intel, Windows x64, Windows ARM, and Linux . On first launch, sign in with GitHub; GitHub Enterprise Server users pick "Use GitHub Enterprise" and enter the server address .&lt;/p&gt;

&lt;p&gt;Add a repository in one of four ways: select from recent activity, browse GitHub.com, paste a local folder path, or enter any Git clone URL . Before committing to a session, click &lt;strong&gt;+&lt;/strong&gt; next to Quick chats and ask a repo-scoped question — for example, "give me an overview of the auth module." A Quick chat creates no branch or worktree, so it is the cheapest way to orient yourself (video: GitHub).&lt;/p&gt;

&lt;p&gt;For real changes, open a &lt;strong&gt;New session&lt;/strong&gt;. You choose the workspace type — a new Git worktree for parallel branch isolation, an existing local branch, or a cloud sandbox — then pick a mode: Interactive (per-action back-and-forth), Plan (review the approach before execution), or Autopilot (fully delegated iteration) . Set the model and reasoning effort, then write the prompt, referencing issues with &lt;code&gt;#&lt;/code&gt; and files with &lt;code&gt;@&lt;/code&gt; .&lt;/p&gt;

&lt;p&gt;When the agent opens a PR, inspect the diff under Files changed, click &lt;strong&gt;Fix&lt;/strong&gt; on any flagged review comment, and submit the review from the PR detail view . Enable &lt;strong&gt;Agent Merge&lt;/strong&gt; only after confirming branch protection rules and required CI checks are active — it merges unattended in the background and turns itself off after the merge . If those safeguards are not in place, do not turn it on.&lt;/p&gt;

&lt;p&gt;The logic Agent Merge follows is small: when checks pass and no maintainer is online to merge, the bot merges. This verified snippet models that decision (it executed successfully, exit 0):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;dataclasses&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;dataclass&lt;/span&gt;


&lt;span class="nd"&gt;@dataclass&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PullRequest&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;
    &lt;span class="n"&gt;checks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;maintainer_online&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;
    &lt;span class="n"&gt;merged_by&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;


&lt;span class="n"&gt;pr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;PullRequest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;checks&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;success&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;maintainer_online&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;pr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;checks&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;success&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;pr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;maintainer_online&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;pr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;merged_by&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;github-copilot[bot]&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;PR #&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;pr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: checks=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;pr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;checks&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Maintainer online: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;pr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;maintainer_online&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Merged by GitHub Copilot App: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;pr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;merged_by&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Copilot App Gotchas: Workspace Wipes and Unreviewed Merges
&lt;/h2&gt;

&lt;p&gt;The convenience of background merges comes with four failure modes worth internalizing before you hand the agent real authority. The first is data loss: version &lt;strong&gt;1.0.3&lt;/strong&gt;, released June 20, 2026, fixed a critical update bug that could wipe workspaces and session history on update . Update before trusting any long-running session, and check the &lt;a href="https://github.com/features/copilot/plans" rel="noopener noreferrer"&gt;github/app releases&lt;/a&gt; page before starting important work.&lt;/p&gt;

&lt;p&gt;The second is a hard credit stop. Since the move to usage-based billing on June 1, 2026, hitting your monthly AI Credits ceiling halts all agent activity mid-task — the old graceful fallback to a cheaper model is gone (&lt;a href="https://github.blog/news-insights/company-news/github-copilot-is-moving-to-usage-based-billing/" rel="noopener noreferrer"&gt;GitHub Blog, 2026-06&lt;/a&gt;). Annual subscribers keep PRU pricing until renewal.&lt;/p&gt;

&lt;p&gt;The third is silent spend. Cloud sandboxes are public preview and usage-billed at $0.000024 per compute-second plus $0.000003 per GiB-second of memory , so a stuck session accumulates charges quietly. Set a spend alert in GitHub billing settings.&lt;/p&gt;

&lt;p&gt;The fourth is trust. GitHub's &lt;a href="https://docs.github.com/en/copilot/get-started/features" rel="noopener noreferrer"&gt;responsible-use docs&lt;/a&gt; explicitly flag hallucination as a limitation and frame the app as "an accelerator for bounded, reviewable tasks," not unattended authority over production branches. Keep branch protection, CI gates, and human review in place — Agent Merge should clear blockers you would have cleared anyway, not replace the reviewer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Copilot Automations: the Natural Next Move
&lt;/h2&gt;

&lt;p&gt;Once Agent Merge handles individual PRs reliably, automations turn one-off prompts into scheduled agent tasks. Create one from the app's &lt;strong&gt;Automations&lt;/strong&gt; tab or from a repository's &lt;strong&gt;Agents&lt;/strong&gt; tab on GitHub.com: name it, pick a trigger, write the task prompt, and save . Triggers are &lt;strong&gt;Manual&lt;/strong&gt;, an &lt;strong&gt;hourly, daily, or weekly schedule&lt;/strong&gt;, or &lt;strong&gt;issue-created&lt;/strong&gt; events with an optional keyword filter .&lt;/p&gt;

&lt;p&gt;The split that matters: local automations run on your machine, while cloud automations require the Copilot cloud agent enabled for the repo — and on Business or Enterprise plans, org-level admin allowance as well .&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Daily triage&lt;/strong&gt; — "label new issues as bug or enhancement."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Morning PR digest&lt;/strong&gt; — "summarize PRs awaiting my review with CI status."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weekly dependency scan&lt;/strong&gt; — "open issues for packages with known security advisories."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Start with a manual, local automation you can read end to end, then graduate to a schedule once the output earns your trust. The same discipline that governs Agent Merge applies here: bounded, reviewable tasks first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Does the GitHub Copilot App replace the IDE extension?
&lt;/h3&gt;

&lt;p&gt;No. The Copilot App is a separate desktop control center for agent sessions, PR review, and automations, not an IDE replacement . The IDE extension (VS Code, JetBrains, and others) stays as your inline-completion and Next Edit layer. Both are built on the same Copilot CLI and Copilot SDK foundation, so they coexist rather than compete .&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the difference between Interactive, Plan, and Autopilot session modes?
&lt;/h3&gt;

&lt;p&gt;The three modes trade developer control for autonomy. &lt;strong&gt;Interactive&lt;/strong&gt; is collaborative and runs on a per-action permission model — good for novel or exploratory tasks. &lt;strong&gt;Plan&lt;/strong&gt; mode has the agent draft a written approach before touching code, so you can redirect before anything executes. &lt;strong&gt;Autopilot&lt;/strong&gt; is high-trust and fully delegated: it writes code, runs tests, and iterates on its own . GitHub recommends scoping a problem with Quick chat, validating with Plan mode, then graduating to Autopilot only once the task is well defined .&lt;/p&gt;

&lt;h3&gt;
  
  
  How do AI Credits work and is there a surprise-bill risk?
&lt;/h3&gt;

&lt;p&gt;Since June 1, 2026, Copilot bills usage in GitHub AI Credits, where 1 credit equals $0.01, metered on input, output, and cached tokens at published API rates . Credits are consumed by chat, agent sessions, code review, Copilot CLI, and the cloud agent — but not by inline completions or Next Edit suggestions, which stay included on every plan . The graceful fallback to cheaper models was discontinued, so monthly plans now hit a hard ceiling that stops agent activity outright; annual holders keep the old PRU pricing until renewal . Set a spend alert in billing settings and watch cloud sandbox sessions, which bill at $0.000024 per compute-second .&lt;/p&gt;

&lt;h3&gt;
  
  
  Is Agent Merge safe to enable without CI?
&lt;/h3&gt;

&lt;p&gt;No. Without branch protection rules and required CI checks, Agent Merge can merge incomplete or breaking changes unattended, since it reads the PR, fixes blockers, and merges whenever GitHub allows . GitHub's responsible-use docs list hallucination as a known limitation and stress human oversight . Treat it as an accelerator for bounded, well-scoped tasks that already have automated safety nets — not a substitute for human review on production branches.&lt;/p&gt;

&lt;h3&gt;
  
  
  Which Copilot pricing tier unlocks the desktop app?
&lt;/h3&gt;

&lt;p&gt;Any paid seat unlocks the Copilot App: Pro at $10/mo or above for individuals, or a Business ($19/user/mo) or Enterprise ($39/user/mo) seat for teams . The Free plan includes 2,000 inline suggestions per month but excludes the Copilot App, cloud agent, and Copilot-created PR features . Students, educators, and maintainers of popular open-source projects may qualify for Pro at no cost .&lt;/p&gt;

</description>
      <category>githubcopilot</category>
      <category>agentmode</category>
      <category>copilotapp</category>
      <category>aicredits</category>
    </item>
    <item>
      <title>Creative Agent spans the CC suite now. Here's the paid gate.</title>
      <dc:creator>Creeta</dc:creator>
      <pubDate>Sun, 21 Jun 2026 17:02:17 +0000</pubDate>
      <link>https://dev.to/creeta/creative-agent-spans-the-cc-suite-now-heres-the-paid-gate-230k</link>
      <guid>https://dev.to/creeta/creative-agent-spans-the-cc-suite-now-heres-the-paid-gate-230k</guid>
      <description>&lt;p&gt;Adobe's Firefly AI Assistant is now a working agent that drives multiple Creative Cloud apps from one prompt — not a single-tool feature, but an orchestrator. Here is what shipped, who can run it, and why it matters if you build automation on Adobe's stack.&lt;/p&gt;

&lt;h2&gt;
  
  
  Firefly Now Spans Photoshop, Premiere, and Illustrator
&lt;/h2&gt;

&lt;p&gt;The Firefly AI Assistant is a single conversational interface that plans and executes jobs across Photoshop, Premiere Pro, Lightroom, Illustrator, and Express. It entered public beta on April 27, 2026 , as the productized form of Project Moonlight, the agentic prototype Adobe previewed at Adobe MAX 2025 in Los Angeles on October 28, 2025 .&lt;/p&gt;

&lt;p&gt;The core shift: you describe an outcome in natural language, and the assistant selects among 60+ underlying tools — Auto Tone, Generative Fill, Remove Background, Vectorize — and runs the sequence, while you interject, redirect, or reject at any step . A &lt;a href="https://www.businesswire.com/news/home/20260618386522/en/Adobe-Unveils-Major-Expansion-of-Creative-Agent-Across-Firefly-and-Creative-Cloud-Apps-Including-Photoshop-and-Premiere" rel="noopener noreferrer"&gt;June 18, 2026 expansion&lt;/a&gt; added agentic Creative Skills: Quick Cut (auto-assembling raw footage into a first cut), storyboard-to-video, short product-video creation, and brand kit creation . The private-beta Firefly studio (waitlist) adds Elements — reusable characters and locations across generations — and Projects for campaign-level asset continuity.&lt;/p&gt;

&lt;p&gt;Adobe VP of AI and innovation Alexandru Costin framed the goal as "removing some of the friction in learning this large catalog of tools" (source: &lt;a href="https://techcrunch.com/2026/04/15/adobes-new-firefly-ai-assistant-can-use-creative-cloud-apps-to-complete-tasks/" rel="noopener noreferrer"&gt;TechCrunch, 2026-04&lt;/a&gt;). For developers, that signals Adobe positioning the agent — not raw app APIs — as the orchestration layer to build automation against.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who Qualifies: Paid Adobe Memberships Only
&lt;/h2&gt;

&lt;p&gt;Eligibility is the first hard gate. The Firefly AI Assistant requires either a Creative Cloud Pro subscription or a paid Firefly plan — Pro, Pro Plus, or Premium . Notably, Firefly Standard (2,000 credits/month) is &lt;em&gt;not&lt;/em&gt; listed as eligible on Adobe's assistant page, so the most common entry plan hits the wall immediately; Creative Cloud Standard (25 credits/month) is also out .&lt;/p&gt;

&lt;p&gt;During the public beta, eligible members also receive complimentary daily generative credits that refresh each day for assistant use. These are separate from your monthly subscription credits and do not offset credit-consuming jobs run outside the assistant .&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plan&lt;/th&gt;
&lt;th&gt;Monthly credits&lt;/th&gt;
&lt;th&gt;Assistant-eligible&lt;/th&gt;
&lt;th&gt;Beta daily credits&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Creative Cloud Standard&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Creative Cloud Pro&lt;/td&gt;
&lt;td&gt;4,000 premium + unlimited standard&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Firefly Standard&lt;/td&gt;
&lt;td&gt;2,000&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Firefly Pro&lt;/td&gt;
&lt;td&gt;4,000&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Firefly Pro Plus&lt;/td&gt;
&lt;td&gt;10,000&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Firefly Premium&lt;/td&gt;
&lt;td&gt;50,000&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Credit figures per Adobe's generative-credits documentation . Steady-state pricing past beta is still unconfirmed, so treat free daily credits as temporary .&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Invoke the Firefly AI Assistant
&lt;/h2&gt;

&lt;p&gt;The Firefly AI Assistant is invoked from the Firefly web app, not from inside Photoshop or Premiere — it is a single conversational surface that plans and executes across Firefly, Photoshop, Premiere, Lightroom, Express, and Illustrator . Adobe documents a six-step hands-on flow; the load-bearing detail for developers is step 4, where the agent proposes a multi-step plan you can inspect before anything runs .&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Log in.&lt;/strong&gt; Go to &lt;a href="https://news.adobe.com/news/2026/04/adobe-new-creative-agent" rel="noopener noreferrer"&gt;Adobe Firefly&lt;/a&gt; with an Adobe ID on an eligible paid plan. Confirm the &lt;em&gt;AI Assistant&lt;/em&gt; entry actually appears in the left panel before assuming the beta has reached your account — rollout is staged .&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open the panel.&lt;/strong&gt; Select &lt;em&gt;AI Assistant&lt;/em&gt; from the left panel in the Firefly web interface .&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Provide input.&lt;/strong&gt; Upload assets or style references, or skip straight to a text description only.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Describe and submit.&lt;/strong&gt; State the desired outcome in plain language and click the up-arrow. The assistant returns a multi-step plan — read it before approving, since it may touch multiple layers or files .&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Steer each step.&lt;/strong&gt; Accept, skip, or redirect any suggested next step with a follow-on message. The assistant keeps context across the session and can ask clarifying questions before executing destructive operations .&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Collect output.&lt;/strong&gt; Download results or open them from Creative Cloud storage in individual apps. Refine inline with Precision Flow (slider-based variation exploration) or AI Markup (brush or rectangle selection) .&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;During beta, eligible accounts get complimentary generative credits that refresh daily for assistant use, so early experiments are effectively free to run .&lt;/p&gt;

&lt;h2&gt;
  
  
  Supervise the Creative Agent: What to Check
&lt;/h2&gt;

&lt;p&gt;Treat the Firefly AI Assistant as a supervised operator, not an autopilot: inspect every changed layer, marker, layout update, and generated asset before you call any result final. End-to-end cross-app orchestration reliability is vendor-stated as of June 2026 , and no independent benchmarks of the multi-app path have been published yet , so the agent's claims about multi-step execution remain unverified outside Adobe.&lt;/p&gt;

&lt;p&gt;Four checks matter before you ship anything:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Indemnification.&lt;/strong&gt; Beta outputs are not indemnified for eligible teams and enterprise customers, even though Adobe permits commercial use of beta results unless a product states otherwise . Verify the indemnification flag on any product before delivering beta-generated assets to clients or publishing commercially sensitive material.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Credit burn.&lt;/strong&gt; Video and audio generations consume far more generative credits than image jobs, and credits renew monthly without rollover . Check your balance before long multi-asset runs — the assistant will not warn you mid-job that you are near the cap.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data policy.&lt;/strong&gt; Adobe states it does not train Firefly on customer content stored locally or in the cloud, but the 2024 terms controversy left some organizations with standing policies that restrict AI processing of client assets . Confirm your org's current policy before running confidential or client-owned material through the assistant.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Beta scope.&lt;/strong&gt; The upgraded Firefly studio — Elements and Projects — is in private beta behind a waitlist . Do not scope it into delivery timelines until you have confirmed access.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What Comes After Successful Invocation
&lt;/h2&gt;

&lt;p&gt;Once the agent finishes a job, you scale it with two reusable layers: Creative Skills and in-app assistants. Creative Skills are pre-built, one-prompt multi-step sequences — Portrait Retouch (batch exposure, highlights, blur, and crop across a photo set via Photoshop and Lightroom), Social Media Assets (smart crops plus Generative Expand for platform-specific formats), and Mockup Studio (placing a logo onto a product image with matched scale, texture, and lighting) .&lt;/p&gt;

&lt;p&gt;For single-project depth, lean on the in-app assistants: Premiere for bin sorting, content-based batch rename, and rough-cut assembly; Illustrator for spreadsheet-driven data-merge versioning, layer reorganization, and preflight; InDesign for brand-wide layout updates; and Frame.io for asset organization, B-roll generation, and surfacing revision feedback .&lt;/p&gt;

&lt;p&gt;If cross-session coherence matters for your pipeline, the takeaway is to join the Firefly studio waitlist now: its private-beta Elements (reusable characters, locations, objects) and Projects (assets, generation history, and creative context kept together for campaign or episodic continuity) target the continuity that one-off prompts cannot deliver .&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Is Firefly Standard eligible for the Firefly AI Assistant?
&lt;/h3&gt;

&lt;p&gt;No. Firefly Standard — the 2,000-credit tier — is not listed as eligible on Adobe's assistant page. The minimum qualifying plan is Creative Cloud Pro or Firefly Pro, both at 4,000 credits per month, or a higher Firefly plan (Pro Plus, Premium) . During the public beta, eligible members also receive separate complimentary daily generative credits that refresh each day, on top of their paid monthly allocation .&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I invoke the Firefly AI Assistant from inside Photoshop directly?
&lt;/h3&gt;

&lt;p&gt;No — the Firefly AI Assistant lives in the Firefly web app at &lt;a href="https://blog.adobe.com/en/publish/2026/04/15/the-age-of-creative-agents-rise-creative-director" rel="noopener noreferrer"&gt;adobe.com/firefly&lt;/a&gt;, not inside Photoshop. Individual Creative Cloud apps — Photoshop, Premiere, Illustrator, InDesign — ship their own in-app AI Assistants scoped to a single open project . Use the web assistant when you want a cross-app starting point; its results are saved to Creative Cloud storage and remain editable in the individual desktop apps afterward .&lt;/p&gt;

&lt;h3&gt;
  
  
  Are Firefly AI Assistant outputs safe for commercial use?
&lt;/h3&gt;

&lt;p&gt;Non-beta Firefly outputs can be used commercially, per Adobe. Beta outputs are also commercially usable unless a specific product states otherwise — but beta outputs are not covered by Adobe's IP indemnification for eligible teams and enterprise customers . Before delivering work to a client, confirm whether the output came from a beta or non-beta surface and verify your organization's indemnification tier .&lt;/p&gt;

&lt;h3&gt;
  
  
  How are generative credits consumed during an assistant session?
&lt;/h3&gt;

&lt;p&gt;Generative credits are the accounting unit for image, vector, video, and audio generations; they renew monthly and do not roll over . Video and audio generations consume substantially more credits per job than image generations, so check your balance before queuing them. Public beta members receive separate daily complimentary credits for assistant use that refresh each day . Adobe Stock credits cannot be applied to generative features .&lt;/p&gt;

&lt;h3&gt;
  
  
  What was Project Moonlight, and how does it relate to the Firefly AI Assistant?
&lt;/h3&gt;

&lt;p&gt;Project Moonlight was Adobe's agentic creative prototype, previewed at Adobe MAX 2025 on October 28, 2025 in Los Angeles . The Firefly AI Assistant is its productized release — announced April 15, 2026 and entering public beta on April 27, 2026 — and it keeps the cross-app orchestration model from the prototype: describe an outcome in plain language and the agent plans and executes across Firefly, Photoshop, Premiere, Lightroom, Express, and Illustrator .&lt;/p&gt;

</description>
      <category>adobe</category>
      <category>firefly</category>
      <category>creativecloud</category>
      <category>aiassistant</category>
    </item>
    <item>
      <title>Skip RAG entirely — SubQ loads your whole codebase in one pass</title>
      <dc:creator>Creeta</dc:creator>
      <pubDate>Sat, 20 Jun 2026 16:56:02 +0000</pubDate>
      <link>https://dev.to/creeta/skip-rag-entirely-subq-loads-your-whole-codebase-in-one-pass-2i5c</link>
      <guid>https://dev.to/creeta/skip-rag-entirely-subq-loads-your-whole-codebase-in-one-pass-2i5c</guid>
      <description>&lt;p&gt;The pitch behind SubQ is simple enough to fit in one sentence: stop chunking and retrieving, and just load the whole codebase into a single context window. The architecture that supposedly makes that affordable, and the evidence that does and doesn't back it up, is where the interesting part starts.&lt;/p&gt;

&lt;h2&gt;
  
  
  What subquadratic attention does (and where the evidence stops)
&lt;/h2&gt;

&lt;p&gt;SubQ is a long-context language model from the startup Subquadratic, unveiled on May 5, 2026, whose defining claim is a fully subquadratic, sparse-attention design where compute grows roughly linearly with context length instead of quadratically . Standard transformer attention computes every pairwise dot-product across tokens (O(n²)). SubQ replaces that with selective connections, the architectural departure that, in theory, lets a full document set or repository fit in one pass.&lt;/p&gt;

&lt;p&gt;The performance figures are aggressive and all trace to Subquadratic's own launch post: sparse attention "52× faster than FlashAttention" with "63% less compute," and throughput around 150 tokens/sec, none independently reproduced . Vendor-published benchmarks show RULER 128K recall near 95.6% (versus Claude Opus ~94.8%) and MRCR v2 at 1M tokens around 65.9% (versus ~32.2% for Opus), with strong long-context retrieval but middling coding relative to frontier models .&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"We load an entire codebase, document set or history into one context window in a single pass," is the company's stated pitch. Subquadratic is led by CEO Justin Dangel and CTO Alex Whedon (source: &lt;a href="https://subq.ai/introducing-subq" rel="noopener noreferrer"&gt;Introducing SubQ&lt;/a&gt;).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;One caveat to carry into setup: the callable model ships as 'subq-preview', and although the marketed ceiling is 12M tokens, every published eval stops at 1M. The gap is unexplained and the full model card is "coming soon" .&lt;/p&gt;

&lt;h2&gt;
  
  
  Wire SubQ in: URL, bearer header, and a runnable example
&lt;/h2&gt;

&lt;p&gt;SubQ ships as an OpenAI-compatible REST API, so wiring it in means changing two values (the base URL and the key), not your request code. The base URL is &lt;code&gt;https://api.subq.ai/v1&lt;/code&gt;, authentication is a standard bearer token read from a &lt;code&gt;SUBQ_API_KEY&lt;/code&gt; environment variable, and you call &lt;code&gt;POST /v1/chat/completions&lt;/code&gt; against the model identifier &lt;code&gt;subq-preview&lt;/code&gt; . Existing Chat Completions code runs unchanged; the role/content message schema, the &lt;code&gt;stream&lt;/code&gt; parameter, and tool/function calling all follow the OpenAI spec with no modifications .&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prerequisites.&lt;/strong&gt; Three things before you start:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An early-access invitation from &lt;a href="https://subq.ai/introducing-subq" rel="noopener noreferrer"&gt;subq.ai&lt;/a&gt;, as the model is in private beta and requires an issued API key first.&lt;/li&gt;
&lt;li&gt;Python 3.9+ (or any HTTP-capable environment).&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;openai&lt;/code&gt; package ≥1.0, or &lt;code&gt;httpx&lt;/code&gt; if you prefer raw requests.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Set the key.&lt;/strong&gt; No custom header format; it is the ordinary bearer pattern.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;SUBQ_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;your_key&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 2: Point an OpenAI client at the SubQ base URL.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.subq.ai/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SUBQ_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 3: Issue a chat completion.&lt;/strong&gt; The &lt;code&gt;messages&lt;/code&gt; array is identical to the OpenAI schema.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;subq-preview&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;system&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You are a code reviewer.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Summarize the architecture of this repo.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 4: For very large inputs, skip the retrieval stack.&lt;/strong&gt; Paste the entire document or codebase directly into the user message with no chunking or retrieval pipeline, which is the single-pass approach Subquadratic pitches . Keep in mind the callable preview is benchmarked only to 1M tokens despite the marketed 12M ceiling.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Optional: streaming and tools.&lt;/strong&gt; Add &lt;code&gt;stream=True&lt;/code&gt; for SSE token streaming; function calling uses the unmodified OpenAI &lt;code&gt;tools&lt;/code&gt; schema.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;stream&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;subq-preview&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Explain main.py line by line.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;delta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Setting&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Base URL&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://api.subq.ai/v1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auth&lt;/td&gt;
&lt;td&gt;Bearer token from &lt;code&gt;SUBQ_API_KEY&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Endpoint&lt;/td&gt;
&lt;td&gt;&lt;code&gt;POST /v1/chat/completions&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Model ID&lt;/td&gt;
&lt;td&gt;&lt;code&gt;subq-preview&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Streaming&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;stream=True&lt;/code&gt; (SSE)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The unknowns: no rates, no GA date, no independent replication
&lt;/h2&gt;

&lt;p&gt;Before you wire &lt;code&gt;subq-preview&lt;/code&gt; into anything billable, know what is missing. SubQ ships no per-token pricing anywhere in its developer docs. The cost pitch is comparative only: Subquadratic frames the model as roughly 1/5 to 1/20 the price of frontier long-context LLMs, but with no dollar figure attached, that ratio is unverifiable today. You cannot model spend, set budgets, or compare against GPT-5.5 or Claude Opus on real workloads.&lt;/p&gt;

&lt;p&gt;Access is gated. As of June 2026 there is no announced general-availability date; the model runs in private beta and the "apply for early access" form is the only entry point . No SLA, no published rate limits, no migration timeline.&lt;/p&gt;

&lt;p&gt;The benchmark story needs the same skepticism. Every figure, including RULER 128K at ~95.6% and MRCR v2 at 1M near 65.9%, traces back to Subquadratic's own May 5, 2026 announcement or to secondary coverage that repeats it . Independent reproductions were unavailable at launch, and secondary sources note an unexplained gap between lab and production recall.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Until a third party re-runs these evals on the public endpoint, treat the published numbers as upper bounds, not guarantees." (Synthesis of independent coverage; source: &lt;a href="https://www.datacamp.com/blog/subq-ai-explained" rel="noopener noreferrer"&gt;DataCamp, 2026-05&lt;/a&gt;)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Kick the tires: whole-repo ingestion, needle-in-haystack, streaming
&lt;/h2&gt;

&lt;p&gt;Before wiring SubQ into anything you ship, run it against your own content. Two companion products handle the heavy-input cases. &lt;strong&gt;SubQ Code&lt;/strong&gt; is a CLI coding agent that installs separately and loads an entire repository into one context window in a single pass , useful for cross-file refactoring and dependency tracing without manually concatenating files. &lt;strong&gt;SubQ Search&lt;/strong&gt; is the long-context research counterpart: feed it large PDF or markdown corpora directly instead of building a chunked embedding pipeline .&lt;/p&gt;

&lt;p&gt;The fastest validation is a needle-in-haystack test at 500K+ tokens against your actual content type. Recall on RULER 128K (~95%) and MRCR v2 at 1M (~65.9%)  says little about how SubQ handles your codebase or document mix, so confirm it holds before committing to a production integration.&lt;/p&gt;

&lt;p&gt;Two integration checks finish the dry run: set &lt;code&gt;stream=True&lt;/code&gt; for any output exceeding ~4K tokens, and exercise tool-calling with a minimal schema to confirm the function-call round-trip works . The takeaway: treat the public endpoint as a private-beta tool to benchmark on your data, not a drop-in retrieval replacement yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What is the base URL for the SubQ API?
&lt;/h3&gt;

&lt;p&gt;The base URL is &lt;code&gt;https://api.subq.ai/v1&lt;/code&gt; . Drop it into the OpenAI SDK's &lt;code&gt;base_url&lt;/code&gt; parameter and authenticate with your key in the &lt;code&gt;SUBQ_API_KEY&lt;/code&gt; environment variable, passed as a standard bearer token. No custom headers are required. The endpoint follows the OpenAI Chat Completions contract, so the SDK handles authorization for you.&lt;/p&gt;

&lt;h3&gt;
  
  
  Which model string do I pass to get the subquadratic model?
&lt;/h3&gt;

&lt;p&gt;Pass &lt;code&gt;subq-preview&lt;/code&gt; in the &lt;code&gt;model&lt;/code&gt; field . Some docs also list &lt;code&gt;subq-1m-preview&lt;/code&gt; as an alias; both resolve to the same early-access checkpoint, with published benchmarks tested only up to 1M tokens . There is no separate GA model identifier yet.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is SubQ's 12M-token context window validated?
&lt;/h3&gt;

&lt;p&gt;No. As of June 2026 every published evaluation stops at 1M tokens, and the 12M-token figure is vendor-stated only . No third-party benchmark has confirmed it, the full model card is still listed as "coming soon," and independent reproductions were unavailable, with most numbers tracing to Subquadratic's own May 5, 2026 announcement .&lt;/p&gt;

&lt;h3&gt;
  
  
  How is SubQ Code different from calling the REST endpoint directly?
&lt;/h3&gt;

&lt;p&gt;SubQ Code is a CLI coding agent that auto-ingests an entire local repository into one context pass, handling file discovery and concatenation for you . The REST endpoint does no ingestion. You assemble and submit the content yourself. If your goal is whole-repo reasoning without writing a file-walker, SubQ Code is the shortcut; if you need programmatic control over what enters the context window, call &lt;code&gt;/v1/chat/completions&lt;/code&gt; directly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do I need to rewrite my existing OpenAI SDK integration to use SubQ?
&lt;/h3&gt;

&lt;p&gt;No. Change &lt;code&gt;base_url&lt;/code&gt; to &lt;code&gt;https://api.subq.ai/v1&lt;/code&gt;, swap the API key env var to &lt;code&gt;SUBQ_API_KEY&lt;/code&gt;, and set &lt;code&gt;model='subq-preview'&lt;/code&gt; . Standard chat completions, streaming via the &lt;code&gt;stream&lt;/code&gt; parameter, and tool/function calling all work without further modification, since the API is OpenAI-compatible .&lt;/p&gt;

</description>
      <category>subq</category>
      <category>subquadratic</category>
      <category>llm</category>
      <category>api</category>
    </item>
    <item>
      <title>Firefly's Creative Orchestrator Is Live. After Effects Isn't.</title>
      <dc:creator>Creeta</dc:creator>
      <pubDate>Fri, 19 Jun 2026 17:09:04 +0000</pubDate>
      <link>https://dev.to/creeta/fireflys-creative-orchestrator-is-live-after-effects-isnt-1p1h</link>
      <guid>https://dev.to/creeta/fireflys-creative-orchestrator-is-live-after-effects-isnt-1p1h</guid>
      <description>&lt;p&gt;Adobe's Firefly now ships a conversational agent that does more than generate assets: it plans and runs multi-step jobs across Creative Cloud apps from a single instruction. The orchestration layer is live; some of the apps it targets are not.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Adobe's creative coordinator can execute
&lt;/h2&gt;

&lt;p&gt;The coordinator is split into two layers. A cross-app &lt;a href="https://www.adobe.com/products/firefly/features/ai-assistant.html" rel="noopener noreferrer"&gt;Firefly AI Assistant&lt;/a&gt; in the web app orchestrates jobs across multiple tools and has been in public beta since April 27, 2026 . On June 18, 2026, app-specific assistants entered public beta inside Photoshop, Premiere, Illustrator, InDesign and Frame.io, with After Effects in private beta .&lt;/p&gt;

&lt;p&gt;The input model works differently: you describe an outcome ("create a brand kit," "generate a product video") and the agent plans the sequence, which you redirect mid-run via text, buttons or sliders . Three Creative Skills ship out of the box:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Portrait Retouch&lt;/strong&gt;: batch photo adjustments across a set.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Social Media Assets&lt;/strong&gt;: one hero image into platform crops via Generative Expand.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mockup Studio&lt;/strong&gt;: a logo applied to a product image with matched scale, texture and lighting .&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Persistent context is built in: Projects centralize assets, generation history and brand context, while Elements stores reusable characters, locations and objects, so a campaign resumes without rebuilding prompts . Partner model options include Kling 3.0, Google Veo 3.1, Runway Gen-4.5 and ElevenLabs Multilingual v2 .&lt;/p&gt;

&lt;h2&gt;
  
  
  Who qualifies and what Adobe hasn't disclosed
&lt;/h2&gt;

&lt;p&gt;Access is gated by plan. The AI Assistant public beta is limited to Creative Cloud Pro, or Firefly Pro at US$19.99/month, Pro Plus at US$49.99/month (offered at a limited US$34.97/month), or Premium at US$199.99/month per license; Firefly Standard at US$9.99/month is explicitly not on the eligible list . Confirm your tier before budgeting.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plan&lt;/th&gt;
&lt;th&gt;Price (USD/mo)&lt;/th&gt;
&lt;th&gt;Monthly credits&lt;/th&gt;
&lt;th&gt;AI Assistant beta&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Firefly Standard&lt;/td&gt;
&lt;td&gt;$9.99&lt;/td&gt;
&lt;td&gt;2,000&lt;/td&gt;
&lt;td&gt;Not eligible&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Firefly Pro&lt;/td&gt;
&lt;td&gt;$19.99&lt;/td&gt;
&lt;td&gt;4,000&lt;/td&gt;
&lt;td&gt;Eligible&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Firefly Pro Plus&lt;/td&gt;
&lt;td&gt;$49.99 ($34.97 limited)&lt;/td&gt;
&lt;td&gt;10,000&lt;/td&gt;
&lt;td&gt;Eligible&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Firefly Premium (per license)&lt;/td&gt;
&lt;td&gt;$199.99&lt;/td&gt;
&lt;td&gt;50,000&lt;/td&gt;
&lt;td&gt;Eligible&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;What Adobe hasn't published is the per-job cost. There is no stated figure for how many credits a Creative Skill or multi-step orchestration consumes; credit use varies by model and feature, but the multi-step math is undocumented . TechCrunch flagged the omission at the April 15 launch , and the June 18 expansion post added no enrollment or credit detail .&lt;/p&gt;

&lt;p&gt;Rights differ by source. Adobe says Firefly is not trained on customer content and relies on licensed Adobe Stock and public-domain material, with enterprise IP indemnification covering Firefly-native output . Partner-model output (Kling, Veo, Runway) sits outside that guarantee, should be clearly indicated, and may carry a different IP profile. Clear it with legal before commercial use.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to send a creative job at firefly.adobe.com
&lt;/h2&gt;

&lt;p&gt;The simplest entry point is the Firefly web app, where AI Assistant has been in public beta since April 27, 2026. Sign in at firefly.adobe.com with an Adobe ID, then confirm your plan covers it before uploading anything: the beta is limited to Creative Cloud Pro or Firefly Pro, Pro Plus, or Premium subscribers and is not listed for Firefly Standard, so a Firefly Pro plan at US$19.99/month or higher is the floor (&lt;a href="https://www.adobe.com/products/firefly/features/ai-assistant.html" rel="noopener noreferrer"&gt;Adobe, 2026-06&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Once in, the process works like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Open AI Assistant&lt;/strong&gt; from the left panel: a conversational input and asset upload area appear. The chat pane carries context across sessions, so a campaign resumes without re-stating constraints.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Upload assets&lt;/strong&gt; (product photos, logos, style references) or start with text only.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Describe the outcome, not the tool action.&lt;/strong&gt; Put brand or style rules, target platforms, and aspect ratios inside the prompt: "create a 4:5 and 9:16 social kit from this product image for Instagram and TikTok" outperforms "use Generative Expand on this image."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Send the job, then review the suggested step sequence.&lt;/strong&gt; Skip or redirect any step. Outputs save to Creative Cloud storage for further editing in Photoshop, Premiere, or Illustrator (&lt;a href="https://www.adobe.com/products/firefly/features/ai-assistant.html" rel="noopener noreferrer"&gt;Adobe&lt;/a&gt;).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Use the standalone Firefly assistant when the job crosses apps, for example when turning product photos into a social campaign. When the task is local to one open file, use the in-app assistant instead: inside Photoshop, Premiere, and Illustrator it entered public beta on June 18, 2026. Open the file, open the AI Assistant panel, and describe the file-level job (layer organization, bin sorting, pre-flight) with no cross-app context needed (&lt;a href="https://www.theverge.com/tech/952099/adobe-ai-assistants-photoshop-premiere-illustrator-beta-launch" rel="noopener noreferrer"&gt;The Verge, 2026-06&lt;/a&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  What's unverified and what's still waitlisted
&lt;/h2&gt;

&lt;p&gt;Not all of the June launch is reachable. After Effects entered &lt;strong&gt;private beta&lt;/strong&gt; as of June 18, 2026, with no public access or enrollment date published, so motion-graphics handoffs stay theoretical for now. The upgraded Firefly Studio, which adds Elements (reusable characters, locations, objects) and Projects (centralized assets and campaign context), is also &lt;strong&gt;private beta via waitlist&lt;/strong&gt;; existing Firefly Studio users remain on the prior version until access opens (&lt;a href="https://blog.adobe.com/en/publish/2026/06/18/adobe-firefly-introduces-new-agentic-capabilities-and-an-upgraded-creative-ai-studio-built-for-the-way-you-work" rel="noopener noreferrer"&gt;Adobe, 2026-06&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Reliability is the bigger unknown. No independent benchmarks exist for autonomous multi-step execution, and Adobe's own pages warn demos "may preview upcoming technology not all currently available" (&lt;a href="https://www.adobe.com/products/firefly/features/ai-assistant.html" rel="noopener noreferrer"&gt;Adobe, 2026&lt;/a&gt;). Treat an AI-assembled timeline or batch edit as draft output requiring inspection, not unattended automation.&lt;/p&gt;

&lt;p&gt;Three governance constraints apply now. Per Adobe's Generative AI User Guidelines (updated May 15, 2026): prompts, inputs, and results may be reviewed by automated and manual methods for abuse prevention; do not input sensitive personal data; and Content Credentials attached to AI-generated output must not be removed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Concrete handoff candidates for Photoshop and Premiere
&lt;/h2&gt;

&lt;p&gt;The best first jobs to delegate are the repetitive, identical chores you already do by hand. In Premiere, the agent sorts assets into bins by footage type, batch-renames clips from their content, searches transcripts for spoken keywords or interview questions, and runs Quick Cut to auto-assemble a starting timeline . These tasks are most valuable when you cut similar shoots on a recurring schedule. In Photoshop, layer organization, background swaps, and platform-specific resizing described in plain language make the strongest case for multi-format export: one source file fanned out to multiple ad sizes .&lt;/p&gt;

&lt;p&gt;Illustrator covers the print chores that repeat identically across a campaign: color-mode and missing-font checks, pre-flight, and version generation from a spreadsheet . For the fewest access restrictions today, start in the Firefly web app, where Social Media Assets (hero image to all platform crops) and Mockup Studio (logo applied with matched scale, texture, and lighting) have been in public beta since April 27, 2026 . Pick one identical, recurring task, send it as a draft, and inspect the output. That is where the orchestrator earns its place now.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Does Firefly AI Assistant consume generative credits on every step?
&lt;/h3&gt;

&lt;p&gt;Adobe has not published per-step credit costs. The June 18, 2026 blog post and the Firefly product page do not specify how many credits a single Creative Skill run consumes . Adobe does state that credit consumption varies by model and feature . Treat the cost of an automated, multi-step job as unknown and check your credit balance before running high-volume batches.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I access Firefly AI Assistant with a Firefly Standard plan?
&lt;/h3&gt;

&lt;p&gt;No. The public beta is limited to Creative Cloud Pro, Firefly Pro (US$19.99/month), Firefly Pro Plus (US$49.99/month regular), or Firefly Premium (US$199.99/month per license) subscribers . Firefly Standard (US$9.99/month, 2,000 credits) is explicitly excluded, so verify your plan tier before budgeting around the assistant.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the difference between the Firefly web app assistant and the in-app assistant in Photoshop?
&lt;/h3&gt;

&lt;p&gt;The Firefly web app assistant coordinates jobs that cross multiple apps, for example turning product photos into a social campaign that spans Photoshop, Lightroom-style adjustments, and platform crops. The in-app assistant inside Photoshop handles tasks local to a single open file, such as layer organization, background swaps, and platform-specific resizing . Use the web app for multi-app coordination; use the in-app panel for single-file production chores.&lt;/p&gt;

&lt;h3&gt;
  
  
  Are partner model outputs (Kling, Veo, Runway) covered by Adobe's IP indemnification?
&lt;/h3&gt;

&lt;p&gt;No. Adobe's enterprise IP indemnification covers Firefly-native generation only; partner-model outputs from sources like Kling 3.0, Google Veo 3.1, or Runway Gen-4.5 carry a different commercial-risk profile . Adobe says partner models are optional and should be clearly indicated. Confirm with legal before shipping partner-model output in commercial deliverables.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is After Effects supported in the current public beta?
&lt;/h3&gt;

&lt;p&gt;No. After Effects is in private beta as of June 18, 2026, while Photoshop, Premiere, Illustrator, InDesign, and Frame.io entered public beta on that date . The upgraded Firefly creative AI studio, with its Elements and Projects features, also requires joining a waitlist . Check Adobe's product page for enrollment updates.&lt;/p&gt;

</description>
      <category>adobefirefly</category>
      <category>creativecloud</category>
      <category>aiassistant</category>
      <category>photoshop</category>
    </item>
    <item>
      <title>GLM-5.2's FrontierSWE 74.4 is vendor-only. Does it hold up?</title>
      <dc:creator>Creeta</dc:creator>
      <pubDate>Thu, 18 Jun 2026 22:50:11 +0000</pubDate>
      <link>https://dev.to/creeta/glm-52s-frontierswe-744-is-vendor-only-does-it-hold-up-1dnm</link>
      <guid>https://dev.to/creeta/glm-52s-frontierswe-744-is-vendor-only-does-it-hold-up-1dnm</guid>
      <description>&lt;p&gt;Z.ai shipped GLM-5.2 on 2026-06-16 with a headline pitch developers will recognize: a usable million-token window and a single dial for how hard the model thinks. The benchmarks look strong — but they're vendor-reported, so treat the numbers as claims until you've run your own.&lt;/p&gt;

&lt;h2&gt;
  
  
  GLM-5.2 at a glance: the 1M span and depth switch
&lt;/h2&gt;

&lt;p&gt;GLM-5.2 is Z.ai's coding-focused flagship, a 753B-parameter Mixture-of-Experts model released under an MIT license on 2026-06-16 . The two changes that matter for daily work are a &lt;strong&gt;1,000,000-token context window&lt;/strong&gt; — roughly 5× the ~200K of GLM-5.1 — and a new &lt;code&gt;reasoning_effort&lt;/code&gt; parameter that controls how much the model thinks before it answers .&lt;/p&gt;

&lt;p&gt;Output is capped at 128K tokens (131,072), with a default &lt;code&gt;max_tokens&lt;/code&gt; of 65,536 for the &lt;code&gt;glm-5.2&lt;/code&gt; id . The &lt;code&gt;reasoning_effort&lt;/code&gt; dial accepts seven values — &lt;code&gt;max&lt;/code&gt;, &lt;code&gt;xhigh&lt;/code&gt;, &lt;code&gt;high&lt;/code&gt;, &lt;code&gt;medium&lt;/code&gt;, &lt;code&gt;low&lt;/code&gt;, &lt;code&gt;minimal&lt;/code&gt;, &lt;code&gt;none&lt;/code&gt; — but they collapse to two effective thinking tiers (High and Max); &lt;code&gt;none&lt;/code&gt;/&lt;code&gt;minimal&lt;/code&gt; skip thinking, &lt;code&gt;low&lt;/code&gt;/&lt;code&gt;medium&lt;/code&gt; map to High, and &lt;code&gt;xhigh&lt;/code&gt;/&lt;code&gt;max&lt;/code&gt; map to Max . The default is &lt;code&gt;max&lt;/code&gt;; Z.ai notes higher effort raises latency and token usage materially, so the dial is a real cost lever, not a cosmetic one . Open weights are on HuggingFace as BF16/F32 (&lt;code&gt;zai-org/GLM-5.2&lt;/code&gt;) and an FP8 variant (&lt;code&gt;zai-org/GLM-5.2-FP8&lt;/code&gt;) .&lt;/p&gt;

&lt;p&gt;On the scoreboard, Z.ai's own table reports SWE-bench Pro 62.1, FrontierSWE 74.4, and Terminal Bench 2.1 (Terminus-2) 81.0 . Worth flagging: these are self-reported. &lt;a href="https://the-decoder.com/zhipu-ais-glm-5-2-closes-in-on-closed-source-leaders-in-coding-marathons/" rel="noopener noreferrer"&gt;the-decoder's&lt;/a&gt; coverage puts FrontierSWE 74.4 just behind Claude Opus 4.8 at 75.4, but it draws from the same vendor table — not an independent reproduction . The honest read for now: GLM-5.2 is positioned to close the gap with closed-source leaders on coding while staying open-weight, and the 74.4 figure holds up only as far as Z.ai's own harness does.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sign up and pick: pay-as-you-go or Coding Plan
&lt;/h2&gt;

&lt;p&gt;Z.ai offers two billing paths, and which you pick depends on whether you are scripting against the raw API or wiring GLM-5.2 into an IDE agent. Pay-as-you-go (PAYG) on the general API runs $1.40 per 1M input tokens and $4.40 per 1M output tokens — the same rates as GLM-5.1 — with cached input temporarily free under a limited-time storage benefit . The general endpoint is &lt;code&gt;https://api.z.ai/api/paas/v4/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The GLM Coding Plan is the other route. It starts at $18/month and covers GLM-5.2, GLM-5-Turbo, and GLM-4.7 . Crucially, it exposes both an OpenAI-compatible endpoint (&lt;code&gt;https://api.z.ai/api/coding/paas/v4/&lt;/code&gt;) and an Anthropic-compatible one (&lt;code&gt;https://api.z.ai/api/anthropic&lt;/code&gt;), so GLM-5.2 slots into existing Claude Code workflows .&lt;/p&gt;

&lt;p&gt;For SDK setup, install the official Python client with &lt;code&gt;pip install zai-sdk==0.2.3&lt;/code&gt;, or reuse the OpenAI Python SDK by setting &lt;code&gt;base_url='https://api.z.ai/api/paas/v4/'&lt;/code&gt;. Java developers pull &lt;code&gt;ai.z.openapi:zai-sdk:0.3.5&lt;/code&gt; .&lt;/p&gt;

&lt;p&gt;Rule of thumb: pick the Coding Plan when pointing an IDE agent at GLM-5.2, since plan benefits only apply through officially supported integrations and may degrade through unsupported SDKs or third-party scenarios . Pick PAYG for raw scripting or one-off evals where you control the request directly.&lt;/p&gt;

&lt;h2&gt;
  
  
  GLM-5.2 drop-in: the exact swap in your settings
&lt;/h2&gt;

&lt;p&gt;Swapping GLM-5.2 into an existing agent is a config edit, not a rewrite. Z.ai exposes an Anthropic-compatible endpoint at &lt;code&gt;https://api.z.ai/api/anthropic&lt;/code&gt; and an OpenAI-compatible one at &lt;code&gt;https://api.z.ai/api/coding/paas/v4&lt;/code&gt;, so Claude Code, Cline, and similar clients point at GLM-5.2 by changing model IDs and a base URL .&lt;/p&gt;

&lt;p&gt;For Claude Code, edit &lt;code&gt;~/.claude/settings.json&lt;/code&gt;: set both &lt;code&gt;ANTHROPIC_DEFAULT_SONNET_MODEL&lt;/code&gt; and &lt;code&gt;ANTHROPIC_DEFAULT_OPUS_MODEL&lt;/code&gt; to &lt;code&gt;glm-5.2[1m]&lt;/code&gt;, then add &lt;code&gt;CLAUDE_CODE_AUTO_COMPACT_WINDOW=1000000&lt;/code&gt; so the agent stops compacting before it hits the 1M ceiling .&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_DEFAULT_SONNET_MODEL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"glm-5.2[1m]"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_DEFAULT_OPUS_MODEL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"glm-5.2[1m]"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"CLAUDE_CODE_AUTO_COMPACT_WINDOW"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1000000"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run &lt;code&gt;/status&lt;/code&gt; to confirm the model is live. Effort routing is mapped to GLM's two thinking tiers: &lt;code&gt;/effort low|medium|high&lt;/code&gt; resolves to GLM High, while &lt;code&gt;/effort xhigh|max|ultracode&lt;/code&gt; resolves to GLM Max . Z.ai is explicit about the trade-off:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Max effort is recommended for complex, multi-step coding work, but higher effort raises latency and token usage," — Z.ai, GLM-5.2 release notes (source: &lt;a href="https://www.datacamp.com/blog/glm-5-2" rel="noopener noreferrer"&gt;DataCamp&lt;/a&gt;).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For Cline and other OpenAI-compatible clients, add a provider with base URL &lt;code&gt;https://api.z.ai/api/coding/paas/v4/&lt;/code&gt;, model &lt;code&gt;glm-5.2&lt;/code&gt;, image support left unchecked, and the context window field set to &lt;code&gt;1000000&lt;/code&gt; .&lt;/p&gt;

&lt;p&gt;If you are calling the API directly, POST to &lt;code&gt;/chat/completions&lt;/code&gt; with thinking enabled and stream the response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"glm-5.2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"thinking"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"enabled"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"reasoning_effort"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"max"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"temperature"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"stream"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"messages"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Refactor this module."&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Parse &lt;code&gt;delta.reasoning_content&lt;/code&gt; and &lt;code&gt;delta.content&lt;/code&gt; as two separate streams — reasoning tokens arrive before the answer. For streaming function calls, also set &lt;code&gt;tool_stream=true&lt;/code&gt; and concatenate &lt;code&gt;delta.tool_calls[*].function.arguments&lt;/code&gt; until the call is complete .&lt;/p&gt;

&lt;h2&gt;
  
  
  Where GLM-5.2 bites: quota math and unsupported paths
&lt;/h2&gt;

&lt;p&gt;The catch with GLM-5.2 on the Coding Plan is quota burn, not raw price. Z.ai applies a peak-hour multiplier: requests cost &lt;strong&gt;3× quota during 14:00–18:00 UTC+8&lt;/strong&gt; and &lt;strong&gt;2× off-peak&lt;/strong&gt;, with a limited-time &lt;strong&gt;1× off-peak&lt;/strong&gt; promotion running through September 2026 . Schedule long-horizon agent runs outside the afternoon window and you roughly triple your effective throughput for free.&lt;/p&gt;

&lt;p&gt;Do the math before you commit a workflow. The Pro tier allows about &lt;strong&gt;400 prompts per 5-hour window&lt;/strong&gt;, but one prompt may invoke the model 15–20 times under agentic loops, and at the 3× peak multiplier that nets out to roughly &lt;strong&gt;135 usable prompts&lt;/strong&gt; per window . That ceiling drops fast if every call reaches for the full span.&lt;/p&gt;

&lt;p&gt;So treat &lt;code&gt;glm-5.2[1m]&lt;/code&gt; as a deliberate choice, not a default. Z.ai notes that selecting it carries extra cost and latency, and recommends it only when a task genuinely needs the 1M context; standard &lt;code&gt;glm-5.2&lt;/code&gt; is cheaper and faster for everyday single-file edits .&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Coding Plan benefits are restricted to officially supported tools and may be limited through unsupported SDKs or third-party scenarios," — Z.ai documentation (source: &lt;a href="https://www.marktechpost.com/2026/06/14/z-ai-launches-glm-5-2-with-a-usable-1m-token-context-two-thinking-effort-levels-and-no-benchmarks-at-launch/" rel="noopener noreferrer"&gt;MarkTechPost&lt;/a&gt;).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The practical risk: route GLM-5.2 through an unsupported client and your calls may silently fall back to pay-as-you-go rates — $1.40 per 1M input and $4.40 per 1M output tokens  — instead of your plan quota. Stick to officially supported integrations to keep billing predictable.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to attempt with the extra span
&lt;/h2&gt;

&lt;p&gt;The 1M-token window changes what fits in a single prompt: with GLM-5.2's roughly 5x jump from GLM-5.1's ~200,000-token ceiling , full-project reads become feasible where you previously had to chunk repeatedly. Four concrete tasks worth running:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cross-repo analysis:&lt;/strong&gt; feed several large codebases in one prompt and ask GLM-5.2 to trace a call path or shared contract across them — no manual splitting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Marathon refactors:&lt;/strong&gt; pass an entire monorepo and request a structured migration. Raise &lt;code&gt;reasoning_effort&lt;/code&gt; to Max for multi-file dependency tracking across the full pass .&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP orchestration:&lt;/strong&gt; Z.ai reports an MCP-Atlas public-set score of 76.8 . Run your own MCP task suite against it before wiring production flows.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One caveat governs all of it: the coding benchmarks are vendor-reported. SWE-bench Pro 62.1 and FrontierSWE 74.4  had no independent third-party verification at launch. The takeaway: treat the extra span as capability to test, not a result to trust — run a representative subset of your own tasks as the real measure of fit before you ship.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Is GLM-5.2's FrontierSWE 74.4 independently verified?
&lt;/h3&gt;

&lt;p&gt;No. As of its 2026-06-16 release, the FrontierSWE 74.4 figure is vendor-reported only. The-decoder's coverage, which places GLM-5.2 just behind Claude Opus 4.8 at 75.4 , cites the same source table rather than a separate reproduction. Independent leaderboard entries are expected after launch. Until then, run a task-representative harness on your own codebase before committing a production flow.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the difference between the standard API and the Coding Plan endpoint?
&lt;/h3&gt;

&lt;p&gt;They are billed and routed separately. The standard pay-as-you-go API uses &lt;code&gt;https://api.z.ai/api/paas/v4/&lt;/code&gt; at $1.40 per 1M input and $4.40 per 1M output tokens. The GLM Coding Plan, from $18/month, adds an OpenAI-compatible &lt;code&gt;/api/coding/paas/v4&lt;/code&gt; endpoint and an Anthropic-compatible &lt;code&gt;/api/anthropic&lt;/code&gt; path for Claude Code workflows . Plan benefits — quota and pricing — apply only through officially supported integrations, not arbitrary third-party SDK calls.&lt;/p&gt;

&lt;h3&gt;
  
  
  When should I use glm-5.2[1m] instead of glm-5.2?
&lt;/h3&gt;

&lt;p&gt;Use &lt;code&gt;glm-5.2[1m]&lt;/code&gt; only when you genuinely need context past roughly 200K tokens — cross-repo reads, full-monorepo passes, or large document analysis. The &lt;code&gt;[1m]&lt;/code&gt; suffix activates the 1,000,000-token variant at extra cost and latency. For most day-to-day edits, plain &lt;code&gt;glm-5.2&lt;/code&gt; is the cheaper and faster choice.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I run GLM-5.2 locally?
&lt;/h3&gt;

&lt;p&gt;Yes, under MIT-licensed weights on HuggingFace: &lt;code&gt;zai-org/GLM-5.2&lt;/code&gt; (BF16/F32, 753B parameters) and an FP8 variant &lt;code&gt;zai-org/GLM-5.2-FP8&lt;/code&gt;. Supported serving frameworks include Transformers, vLLM (v0.23.0+), SGLang (v0.5.13.post1+), Docker Model Runner, xLLM, and ktransformers. A 753B-parameter model requires substantial GPU infrastructure to serve.&lt;/p&gt;

&lt;h3&gt;
  
  
  How does reasoning_effort affect cost and speed?
&lt;/h3&gt;

&lt;p&gt;The seven declared values collapse into two effective thinking tiers: High (&lt;code&gt;low&lt;/code&gt;/&lt;code&gt;medium&lt;/code&gt;) and Max (&lt;code&gt;xhigh&lt;/code&gt;/&lt;code&gt;max&lt;/code&gt;), while &lt;code&gt;none&lt;/code&gt;/&lt;code&gt;minimal&lt;/code&gt; skip thinking entirely . The default is &lt;code&gt;max&lt;/code&gt;. Z.ai recommends Max effort for complex, multi-step coding tasks and lower settings for quick single-file edits, since higher effort meaningfully raises latency and output token count .&lt;/p&gt;

</description>
      <category>glm52</category>
      <category>zai</category>
      <category>zhipu</category>
      <category>openweights</category>
    </item>
    <item>
      <title>Claude Code 2.1.158: Safe Execution on Bedrock, Vertex, and Azure</title>
      <dc:creator>Creeta</dc:creator>
      <pubDate>Thu, 18 Jun 2026 14:36:41 +0000</pubDate>
      <link>https://dev.to/creeta/claude-code-21158-safe-execution-on-bedrock-vertex-and-azure-1djg</link>
      <guid>https://dev.to/creeta/claude-code-21158-safe-execution-on-bedrock-vertex-and-azure-1djg</guid>
      <description>&lt;p&gt;Claude Code v2.1.158, released May 30, 2026 , ships one change: classifier-gated execution (auto mode) is now available on AWS Bedrock, Google Vertex AI, and Azure Foundry. It lands on top of a dense 48-hour release cluster — Opus 4.8 as the new default, a critical API error fix, and a plugin system overhaul. Two hard deadlines apply before you upgrade: Opus 4.8 requires at least v2.1.156, and &lt;code&gt;CLAUDE_CODE_OPUS_4_6_FAST_MODE_OVERRIDE&lt;/code&gt; stops working on June 1, 2026 .&lt;/p&gt;

&lt;h2&gt;
  
  
  v2.1.154–2.1.158 in Brief
&lt;/h2&gt;

&lt;p&gt;Four point releases landed across three days according to the &lt;a href="https://github.com/anthropics/claude-code/blob/main/CHANGELOG.md" rel="noopener noreferrer"&gt;official CHANGELOG&lt;/a&gt; . v2.1.158 expands auto mode to managed inference platforms; v2.1.157 ships 20+ fixes  including local skill auto-loading and mid-session worktree switching; v2.1.156 is a mandatory single-fix release for anyone on Opus 4.8; v2.1.154 introduces Opus 4.8 as the default on Max and Team Premium alongside Dynamic Workflows. The table below maps each release to its scope and whether it requires immediate action.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quick Answer:&lt;/strong&gt; Run &lt;code&gt;npm install -g @anthropic-ai/claude-code@latest&lt;/code&gt; to reach v2.1.158. On Bedrock, Vertex AI, or Azure Foundry, set &lt;code&gt;CLAUDE_CODE_ENABLE_AUTO_MODE=1&lt;/code&gt; to enable classifier-gated execution. Migrate away from &lt;code&gt;CLAUDE_CODE_OPUS_4_6_FAST_MODE_OVERRIDE&lt;/code&gt; before June 1, 2026 — it is removed that day with no graceful fallback.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Version&lt;/th&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Scope&lt;/th&gt;
&lt;th&gt;Breaking?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;v2.1.158&lt;/td&gt;
&lt;td&gt;May 30, 2026&lt;/td&gt;
&lt;td&gt;Auto mode on Bedrock, Vertex AI, Azure Foundry (Opus 4.7 &amp;amp; 4.8)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;v2.1.157&lt;/td&gt;
&lt;td&gt;May 29, 2026&lt;/td&gt;
&lt;td&gt;20+ fixes — local skills auto-load, &lt;code&gt;EnterWorktree&lt;/code&gt; mid-session switch, worktrees unlocked post-agent&lt;/td&gt;
&lt;td&gt;Behavior change: skill loading and worktree state&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;v2.1.156&lt;/td&gt;
&lt;td&gt;May 29, 2026&lt;/td&gt;
&lt;td&gt;Single fix: Opus 4.8 thinking block mutation causing API 400 errors&lt;/td&gt;
&lt;td&gt;Mandatory if running Opus 4.8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;v2.1.154&lt;/td&gt;
&lt;td&gt;May 28, 2026&lt;/td&gt;
&lt;td&gt;Opus 4.8 default on Max/Team Premium; Dynamic Workflows; background shell sessions&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;CLAUDE_CODE_OPUS_4_6_FAST_MODE_OVERRIDE&lt;/code&gt; removed June 1, 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Before You Upgrade
&lt;/h2&gt;

&lt;p&gt;Four conditions to verify before running the upgrade command.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hard requirement: v2.1.156 if you run Opus 4.8.&lt;/strong&gt; Versions below v2.1.156 mutate thinking blocks between turns. Opus 4.8 rejects this with deterministic API 400 errors — not intermittent failures, but consistent ones on every affected turn . This was the sole change in that point release. Upgrade the CLI first, then resume any in-progress sessions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deprecation deadline: June 1, 2026.&lt;/strong&gt; &lt;code&gt;CLAUDE_CODE_OPUS_4_6_FAST_MODE_OVERRIDE&lt;/code&gt; is removed that date with no graceful degradation . Audit your CI pipelines and startup scripts now. The replacement: run &lt;code&gt;/model claude-opus-4-6&lt;/code&gt; followed by &lt;code&gt;/fast on&lt;/code&gt; inside a session. Fast mode on Opus 4.8 is priced at 2× the standard rate for 2.5× the speed .&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;VSCode on pay-as-you-go:&lt;/strong&gt; Auto mode was already enabled in v2.1.154 for this configuration without any env var. Skip Step 2 in the next section if that is your setup — setting the env var has no effect here and is not needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Managed inference platforms (Bedrock, Vertex, Azure Foundry):&lt;/strong&gt; Auto mode is disabled by default. You must explicitly opt in with &lt;code&gt;CLAUDE_CODE_ENABLE_AUTO_MODE=1&lt;/code&gt;. The next section covers the complete setup path.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enabling Classifier-Gated Execution on Bedrock, Vertex, and Azure
&lt;/h2&gt;

&lt;p&gt;Classifier-gated execution evaluates every tool call at decision time. Provably-safe operations — read-only file access, low-risk Bash — proceed without prompting. Clearly risky actions (credential access, network writes) are hard-blocked. It sits between full manual approval and &lt;code&gt;--dangerously-skip-permissions&lt;/code&gt;. Auto mode was first shipped as a research preview in v2.1.83 on March 23, 2026 , scoped exclusively to Claude.ai Max and Teams. v2.1.158 extends it to managed inference endpoints for the first time .&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Auto mode runs a classifier over every tool decision so that provably-safe actions proceed without a human prompt and clearly risky ones get hard-blocked — the middle ground between full manual approval and &lt;code&gt;--dangerously-skip-permissions&lt;/code&gt;." — &lt;a href="https://code.claude.com/docs/en/whats-new" rel="noopener noreferrer"&gt;Claude Code What's New, v2.1.83 research preview (March 2026)&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What changed in scope: enterprise teams on Bedrock or Vertex previously had no access to the classifier — every tool call required explicit permission handling. v2.1.158 closes that gap. The feature is limited to Opus 4.7 and Opus 4.8; older model variants on those platforms do not expose the classifier endpoint.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1 — Upgrade to v2.1.158:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @anthropic-ai/claude-code@latest
claude &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;span class="c"&gt;# Should print 2.1.158&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 2 — Set the environment variable&lt;/strong&gt; (Bedrock, Vertex, and Azure Foundry only; skip for VSCode pay-as-you-go):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;CLAUDE_CODE_ENABLE_AUTO_MODE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1
&lt;span class="c"&gt;# Or add to your .env / managed inference environment config&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 3 — Select a supported model:&lt;/strong&gt; Choose Opus 4.7 or Opus 4.8. Older model versions on those platforms do not expose the classifier endpoint and will not honor the env var.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4 — Verify:&lt;/strong&gt; Run &lt;code&gt;/status&lt;/code&gt; inside Claude Code and confirm &lt;code&gt;auto: on&lt;/code&gt; in the output. Send a low-risk test Bash command such as &lt;code&gt;ls -la&lt;/code&gt; and confirm it proceeds without a manual approval prompt.&lt;/p&gt;

&lt;p&gt;The following script (verified, exit 0) shows minimal per-provider configuration with safe-execution defaults for all three platforms:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;#!/usr/bin/env python3
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Minimal safe-execution config demo for Claude Code 2.1.158.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="n"&gt;VERSION&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2.1.158&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;PROVIDERS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bedrock&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;env&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CLAUDE_CODE_USE_BEDROCK&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AWS_REGION&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;us-east-1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;anthropic.claude-sonnet-4-5-20250929-v1:0&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;vertex&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;env&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CLAUDE_CODE_USE_VERTEX&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CLOUD_ML_REGION&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;us-central1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-sonnet-4-5@20250929&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;azure&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;env&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://&amp;lt;resource&amp;gt;.services.ai.azure.com/anthropic&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-sonnet-4-5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;SAFE_EXECUTION&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;allowed_tools&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Read&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Edit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Grep&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Glob&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;disallowed_tools&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bash&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;WebFetch&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;permission_mode&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;acceptEdits&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;network&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;provider-api-only&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;demo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude_code&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;VERSION&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;safe_execution&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;SAFE_EXECUTION&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cfg&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;PROVIDERS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;demo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sort_keys&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;


&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Running the script produces the following JSON — use it as the shape for your own environment config:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"azure"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"claude_code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2.1.158"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_BASE_URL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://&amp;lt;resource&amp;gt;.services.ai.azure.com/anthropic"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"claude-sonnet-4-5"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"safe_execution"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"allowed_tools"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Read"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Edit"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Grep"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Glob"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"disallowed_tools"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Bash"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"WebFetch"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"network"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"provider-api-only"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"permission_mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"acceptEdits"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"bedrock"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"claude_code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2.1.158"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"AWS_REGION"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"us-east-1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"CLAUDE_CODE_USE_BEDROCK"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"anthropic.claude-sonnet-4-5-20250929-v1:0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"safe_execution"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"allowed_tools"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Read"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Edit"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Grep"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Glob"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"disallowed_tools"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Bash"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"WebFetch"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"network"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"provider-api-only"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"permission_mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"acceptEdits"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"vertex"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"claude_code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2.1.158"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"CLOUD_ML_REGION"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"us-central1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"CLAUDE_CODE_USE_VERTEX"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"claude-sonnet-4-5@20250929"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"safe_execution"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"allowed_tools"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Read"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Edit"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Grep"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Glob"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"disallowed_tools"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Bash"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"WebFetch"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"network"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"provider-api-only"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"permission_mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"acceptEdits"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Upgrade Pitfalls and Rough Edges
&lt;/h2&gt;

&lt;p&gt;Several v2.1.154–v2.1.157 behavior changes have side effects worth flagging before you upgrade shared or production environments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Opus 4.8 + version below v2.1.156: deterministic 400s.&lt;/strong&gt; The API errors from thinking block mutation are not intermittent — they occur on every affected turn. If you upgraded to Opus 4.8 before upgrading the CLI, you may already have a broken session. Upgrade the CLI first, then resume .&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Local skills auto-loading in every session.&lt;/strong&gt; Since v2.1.157, anything under &lt;code&gt;.claude/skills/&lt;/code&gt; loads automatically at session start — no marketplace enrollment required . If you placed experimental or test plugins in that directory, they now surface as registered tools in every session including production. Audit &lt;code&gt;.claude/skills/&lt;/code&gt; before upgrading shared environments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Worktree locking behavior changed in v2.1.157.&lt;/strong&gt; The CHANGELOG entry reads:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Worktrees are left unlocked after an agent exits, enabling normal &lt;code&gt;git worktree remove&lt;/code&gt; / &lt;code&gt;git worktree prune&lt;/code&gt; cleanup." — &lt;a href="https://github.com/anthropics/claude-code/blob/main/CHANGELOG.md" rel="noopener noreferrer"&gt;Claude Code CHANGELOG, v2.1.157&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If your cleanup scripts use worktree locked state as a signal — for example, checking for a &lt;code&gt;.git/worktrees/*/locked&lt;/code&gt; file before pruning — that signal is no longer set after an agent exits. Replace that logic with &lt;code&gt;git worktree list --porcelain&lt;/code&gt; to identify sessions you still want to preserve before pruning.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GPU acceleration in integrated terminals.&lt;/strong&gt; &lt;code&gt;/terminal-setup&lt;/code&gt; now disables GPU acceleration in VS Code, Cursor, and Windsurf integrated terminals to fix garbled text rendering . Standalone terminals are unaffected — no action needed in those environments.&lt;/p&gt;

&lt;h2&gt;
  
  
  Experiments Worth Running After the Upgrade
&lt;/h2&gt;

&lt;p&gt;Once you are on v2.1.158, these four experiments make the new features tangible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Initialize a local skill without marketplace enrollment:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude plugin init my-local-skill
&lt;span class="c"&gt;# Creates .claude/skills/my-local-skill/ scaffold&lt;/span&gt;
&lt;span class="c"&gt;# Restart Claude Code — the skill loads automatically&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify the tool name appears in &lt;code&gt;/status&lt;/code&gt; without any marketplace registration step. This is the intended workflow per v2.1.157 , and confirms auto-loading is working correctly in your environment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Try mid-session worktree switching.&lt;/strong&gt; With a project that has multiple Claude-managed worktrees, call &lt;code&gt;EnterWorktree&lt;/code&gt; into a second branch without restarting Claude. Run &lt;code&gt;git status&lt;/code&gt; inside the new worktree to verify a clean checkout from the correct branch. This was not possible in a running session before v2.1.157.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Pair &lt;code&gt;OTEL_LOG_TOOL_DETAILS=1&lt;/code&gt; with auto mode.&lt;/strong&gt; Set both env vars, then run a mix of read and write operations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;CLAUDE_CODE_ENABLE_AUTO_MODE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;OTEL_LOG_TOOL_DETAILS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1
claude
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The telemetry output will show which tool calls were approved, which were blocked, and which parameters were evaluated. This is the practical way to build intuition about what the classifier treats as risky in your specific codebase before relying on it in CI automation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Prompt Dynamic Workflows.&lt;/strong&gt; Inside a session, type a plain-English orchestration request — for example, "write a workflow that runs ESLint on all PRs and posts a summary comment." Then run &lt;code&gt;/workflows&lt;/code&gt; to inspect the authored plan. Compare the inferred steps against what you would write by hand to understand what Claude fills in versus what you must specify explicitly. Note that Dynamic Workflows documentation had not been published at the time of writing — the CLI feature ships ahead of its docs page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Do I need CLAUDE_CODE_ENABLE_AUTO_MODE=1 if I use Claude.ai Max or Teams?
&lt;/h3&gt;

&lt;p&gt;No. Claude.ai Max and Teams have had classifier-gated execution since the v2.1.83 research preview in March 2026 . The env var is only required on AWS Bedrock, Google Vertex AI, and Azure Foundry managed inference endpoints, where auto mode was disabled by default until v2.1.158. VSCode users on pay-as-you-go API also had auto mode enabled without the env var since v2.1.154.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why am I seeing API 400 errors with Opus 4.8?
&lt;/h3&gt;

&lt;p&gt;Versions of Claude Code below v2.1.156 mutate thinking blocks between turns. Opus 4.8 rejects this with a 400 status code. The fix was the sole change in v2.1.156 . The errors are deterministic — they happen on every affected turn, not intermittently. Upgrade to v2.1.156 or later (v2.1.158 is current as of May 30, 2026) and the 400s will stop.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the difference between a Dynamic Workflow and the existing multi-session agent view?
&lt;/h3&gt;

&lt;p&gt;Dynamic Workflows are Claude-authored orchestration plans. You describe your intent in plain English; Claude writes the orchestration logic — specifying which agents to spawn, in what order, with what inputs. The existing &lt;code&gt;claude agents&lt;/code&gt; view shows running sessions but does not define or store orchestration logic. Dynamic Workflows add the authoring layer. View authored plans and run history with &lt;code&gt;/workflows&lt;/code&gt; inside a session.&lt;/p&gt;

&lt;h3&gt;
  
  
  My local skills are loading in every session after upgrading to v2.1.157. Is this intentional?
&lt;/h3&gt;

&lt;p&gt;Yes. v2.1.157 removed the marketplace enrollment requirement . Anything under &lt;code&gt;.claude/skills/&lt;/code&gt; now loads automatically at session start. If you have experimental plugins in that directory that you do not want active in all sessions, move them out before the next session starts. Scaffold new plugins with &lt;code&gt;claude plugin init &amp;lt;name&amp;gt;&lt;/code&gt; — they will appear under &lt;code&gt;.claude/skills/&amp;lt;name&amp;gt;/&lt;/code&gt; and load on restart.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fast mode pricing changed with Opus 4.8 — what are the new rates?
&lt;/h3&gt;

&lt;p&gt;Fast mode on Opus 4.8 is priced at 2× the standard rate for 2.5× the speed . The previous flag &lt;code&gt;CLAUDE_CODE_OPUS_4_6_FAST_MODE_OVERRIDE&lt;/code&gt; is removed on June 1, 2026 — no graceful fallback, no deprecation warning at runtime. Switch to &lt;code&gt;/model claude-opus-4-6&lt;/code&gt; followed by &lt;code&gt;/fast on&lt;/code&gt; before that date if you need the older model's fast mode. Token-level pricing for standard Opus 4.8 had not been published in the release notes at time of writing.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to Watch Next
&lt;/h2&gt;

&lt;p&gt;The v2.1.154–v2.1.158 cluster is a meaningful inflection: Opus 4.8 is the active default, auto mode is no longer a Max/Teams exclusive, and the plugin system now works without marketplace registration. Two areas to track: Dynamic Workflows documentation (shipping after the CLI feature, not before), and auto mode classifier behavior at the edges of your specific tooling stack — the &lt;code&gt;OTEL_LOG_TOOL_DETAILS=1&lt;/code&gt; approach is the most direct way to audit that before putting it in front of automated pipelines.&lt;/p&gt;

&lt;p&gt;For teams running Claude Code on Bedrock or Vertex at scale, the combination of auto mode and detailed tool telemetry gives you an auditable log of every tool decision for the first time. That was not possible on managed inference platforms before this release, and it has clear applications for compliance reviews and permission boundary iteration without requiring manual session oversight.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Last updated: 2026-05-31. Based on the &lt;a href="https://github.com/anthropics/claude-code/blob/main/CHANGELOG.md" rel="noopener noreferrer"&gt;Claude Code CHANGELOG&lt;/a&gt;, &lt;a href="https://github.com/anthropics/claude-code/releases" rel="noopener noreferrer"&gt;GitHub releases&lt;/a&gt;, &lt;a href="https://code.claude.com/docs/en/changelog" rel="noopener noreferrer"&gt;official Claude Code changelog&lt;/a&gt;, and &lt;a href="https://www.npmjs.com/package/@anthropic-ai/claude-code?activeTab=versions" rel="noopener noreferrer"&gt;npm version history&lt;/a&gt; as of May 30, 2026.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>bedrock</category>
      <category>vertexai</category>
      <category>azurefoundry</category>
    </item>
    <item>
      <title>openai-codex Python SDK v0.1.0b2: Install, Authenticate, and Run</title>
      <dc:creator>Creeta</dc:creator>
      <pubDate>Thu, 18 Jun 2026 13:32:16 +0000</pubDate>
      <link>https://dev.to/creeta/openai-codex-python-sdk-v010b2-install-authenticate-and-run-k9b</link>
      <guid>https://dev.to/creeta/openai-codex-python-sdk-v010b2-install-authenticate-and-run-k9b</guid>
      <description>&lt;h2&gt;
  
  
  v0.1.0b2 in Brief: Sandbox Presets and a Renamed Config Class
&lt;/h2&gt;

&lt;p&gt;Released May 28, 2026 as GitHub tag &lt;code&gt;python-v0.1.0b2&lt;/code&gt; , &lt;code&gt;openai-codex&lt;/code&gt; v0.1.0b2 is the second public beta of OpenAI's Python SDK for programmatically driving Codex agents. The headline addition over v0.1.0b1: three named &lt;code&gt;Sandbox&lt;/code&gt; presets — &lt;code&gt;READ_ONLY&lt;/code&gt;, &lt;code&gt;WORKSPACE_WRITE&lt;/code&gt;, and &lt;code&gt;FULL_ACCESS&lt;/code&gt; — replacing raw permission strings you previously had to construct by hand. A secondary change, &lt;code&gt;CodexConfig&lt;/code&gt; replacing &lt;code&gt;AppServerConfig&lt;/code&gt;, is a one-line find-and-replace with no behavioral difference . The package depends on &lt;code&gt;openai-codex-cli-bin&lt;/code&gt; pinned to 0.132.0  — the binary is not bundled in the wheel. This is also the first publicly accessible iteration under the &lt;code&gt;openai-codex&lt;/code&gt; package name, which was renamed from the internal &lt;code&gt;codex_app_server&lt;/code&gt; module in Codex CLI v0.131.0, approximately May 16–18, 2026 .&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quick Answer:&lt;/strong&gt; Install with &lt;code&gt;pip install openai-codex==0.1.0b2&lt;/code&gt; on Python 3.10+. The key addition over v0.1.0b1 is three named &lt;code&gt;Sandbox&lt;/code&gt; presets that control filesystem access. Authenticate headlessly with &lt;code&gt;codex.login_api_key('sk-...')&lt;/code&gt;. Pin the exact version — API surface changes between betas with no stability guarantee.&lt;/p&gt;

&lt;p&gt;If you used &lt;code&gt;AppServerConfig&lt;/code&gt; in any prior code, rename it to &lt;code&gt;CodexConfig&lt;/code&gt; — nothing else breaks. Note also that a separate package, &lt;code&gt;codex-sdk-python&lt;/code&gt; on PyPI at version 0.117.0 as of March 2026 , follows a distinct versioning track aligned to CLI runtime versions and is not the same library. Don't install both.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites and pip Installation
&lt;/h2&gt;

&lt;p&gt;The SDK requires Python 3.10 or later . Confirm your version first, then install pinned to the exact beta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;--version&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;openai-codex&lt;span class="o"&gt;==&lt;/span&gt;0.1.0b2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The wheel pulls in &lt;code&gt;openai-codex-cli-bin&lt;/code&gt; as a dependency but does not embed the Codex binary directly. In most environments — macOS, Linux, a typical CI runner — the binary resolves automatically from that companion package. In containers or Jupyter notebooks where you need explicit control, bootstrap the binary before any other call:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai_codex&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Codex&lt;/span&gt;

&lt;span class="n"&gt;Codex&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;install&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rust-v0.132.0&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No Rust toolchain or additional system dependencies are needed on the consumer side — the binary ships pre-compiled. Verify the install landed correctly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"from openai_codex import Codex, Sandbox, CodexConfig; print('OK')"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Starting a Thread and Reading the Response
&lt;/h2&gt;

&lt;p&gt;The SDK is organized around threads. Each &lt;code&gt;Thread&lt;/code&gt; maps to a persistent session stored in &lt;code&gt;~/.codex/sessions&lt;/code&gt;. A single &lt;code&gt;thread.run()&lt;/code&gt; call is one turn — one prompt in, one &lt;code&gt;TurnResult&lt;/code&gt; out. The &lt;code&gt;TurnResult&lt;/code&gt; exposes &lt;code&gt;.final_response&lt;/code&gt; (the agent's text reply), &lt;code&gt;.collected_items&lt;/code&gt; (all intermediate tool calls in order), &lt;code&gt;.timing&lt;/code&gt;, and &lt;code&gt;.usage&lt;/code&gt; (token counts) . Here is the synchronous path, step by step:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Open the context manager and start a thread.&lt;/strong&gt; Always use &lt;code&gt;Codex()&lt;/code&gt; as a context manager — it manages the underlying process lifecycle. Pass a &lt;code&gt;Sandbox&lt;/code&gt; preset at &lt;code&gt;thread_start()&lt;/code&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;   &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai_codex&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Codex&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Sandbox&lt;/span&gt;

   &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nc"&gt;Codex&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;codex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
       &lt;span class="n"&gt;thread&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;codex&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;thread_start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sandbox&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;Sandbox&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WORKSPACE_WRITE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
       &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;thread&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Explain this repository in three bullets.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
       &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;final_response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
       &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# token counts
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Pick the right sandbox preset.&lt;/strong&gt; &lt;code&gt;FULL_ACCESS&lt;/code&gt; is the default but grants unrestricted filesystem access. For most coding tasks that touch your project, &lt;code&gt;WORKSPACE_WRITE&lt;/code&gt; (writes inside CWD only) is the appropriate choice. Use &lt;code&gt;READ_ONLY&lt;/code&gt; for analysis and auditing tasks where no writes should occur.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inspect the result.&lt;/strong&gt; &lt;code&gt;result.final_response&lt;/code&gt; is the agent's final text. &lt;code&gt;result.collected_items&lt;/code&gt; gives you every intermediate tool call — useful for auditing exactly what the agent read or modified.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resume the thread in a later session.&lt;/strong&gt; Save &lt;code&gt;result.thread_id&lt;/code&gt; after the first turn. In a new Python process, call &lt;code&gt;codex.resume_thread(thread_id)&lt;/code&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;   &lt;span class="n"&gt;thread_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;thread_id&lt;/span&gt;  &lt;span class="c1"&gt;# persist this string
&lt;/span&gt;
   &lt;span class="c1"&gt;# in a later session:
&lt;/span&gt;   &lt;span class="n"&gt;thread&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;codex&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resume_thread&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;thread_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;thread&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Continue from where we left off.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Async path.&lt;/strong&gt; For non-blocking applications, use &lt;code&gt;AsyncCodex&lt;/code&gt;. Do not mix &lt;code&gt;Codex&lt;/code&gt; and &lt;code&gt;AsyncCodex&lt;/code&gt; instances in the same event loop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai_codex&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AsyncCodex&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nc"&gt;AsyncCodex&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;codex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;thread&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;codex&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;thread_start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;codex-1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;thread&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Refactor this module for clarity.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;final_response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Streaming.&lt;/strong&gt; For long-running agent turns, &lt;code&gt;run_streamed()&lt;/code&gt; yields incremental events. Poll &lt;code&gt;event.type&lt;/code&gt; — &lt;code&gt;"turn.delta"&lt;/code&gt; for partial text, &lt;code&gt;"turn.completed"&lt;/code&gt; for the final usage summary:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;streamed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;thread&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run_streamed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Diagnose the CI failure&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;streamed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;turn.delta&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;flush&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;turn.completed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Usage:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The end-to-end snippet below creates a fresh venv, installs the SDK, and runs a smoke test. It is illustrative — it was not executed against the live API at article generation time due to network constraints — but the install path and import are accurate for v0.1.0b2:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CODEX_DEMO_VENV&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;venv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.codex-demo-venv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;check_call&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;executable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-m&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;venv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;venv&lt;/span&gt;&lt;span class="p"&gt;)])&lt;/span&gt;
    &lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;venv&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Scripts/python.exe&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;nt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bin/python&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;check_call&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-m&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pip&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;install&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-q&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;openai-codex==0.1.0b2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;__file__&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CODEX_DEMO_VENV&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai_codex&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Codex&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nc"&gt;Codex&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;codex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;codex&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;login_api_key&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;authenticated with OPENAI_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;using existing Codex auth&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;thread&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;codex&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;thread_start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;thread&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Reply with exactly: Codex SDK OK&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;final_response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Authenticating Without a Browser
&lt;/h2&gt;

&lt;p&gt;v0.1.0b2 ships four authentication modes covering interactive desktop sessions through fully headless CI containers. First-class auth support landed alongside Codex CLI v0.132.0 . Automatic mode — reusing existing &lt;code&gt;codex login&lt;/code&gt; credentials — requires no extra code. For CI or headless containers, the API-key mode is the direct path and requires no browser.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mode&lt;/th&gt;
&lt;th&gt;Method call&lt;/th&gt;
&lt;th&gt;Best for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Automatic&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Codex()&lt;/code&gt; — no extra call needed&lt;/td&gt;
&lt;td&gt;Existing &lt;code&gt;codex login&lt;/code&gt; session on the machine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API key&lt;/td&gt;
&lt;td&gt;&lt;code&gt;codex.login_api_key("sk-...")&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;CI/headless; standard OpenAI API key, no browser&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ChatGPT browser&lt;/td&gt;
&lt;td&gt;&lt;code&gt;login = codex.login_chatgpt(); print(login.auth_url); login.wait()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Interactive desktop with a ChatGPT account&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Device-code&lt;/td&gt;
&lt;td&gt;&lt;code&gt;login = codex.login_chatgpt_device_code(); print(login.verification_url, login.user_code); login.wait()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Non-interactive container with a ChatGPT account&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For fully automated container deployments, set the &lt;code&gt;CODEX_AUTH_JSON&lt;/code&gt; environment variable and skip the programmatic login call entirely . The SDK reads it at startup — this is the cleanest path for Kubernetes or Docker pipelines where injecting secrets as env vars is already standard.&lt;/p&gt;

&lt;p&gt;Device-code flow is worth noting for restricted environments: &lt;code&gt;login.verification_url&lt;/code&gt; and &lt;code&gt;login.user_code&lt;/code&gt; print to stdout; a human visits the URL and enters the code, then &lt;code&gt;login.wait()&lt;/code&gt; blocks until the flow completes. Once confirmed, the session is stored locally and reused on subsequent runs without repeating the flow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rough Edges and Patterns Worth Exploring
&lt;/h2&gt;

&lt;p&gt;A few practical caveats before building on this beta:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pin the version.&lt;/strong&gt; The API surface changes between beta releases with no stability guarantee. Use &lt;code&gt;pip install openai-codex==0.1.0b2&lt;/code&gt; and read the &lt;a href="https://developers.openai.com/codex/changelog" rel="noopener noreferrer"&gt;Codex changelog&lt;/a&gt; before bumping . Test upgrades in isolation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Default sandbox is &lt;code&gt;FULL_ACCESS&lt;/code&gt;.&lt;/strong&gt; If the prompt text is not fully trusted — user-provided input, external data, PR comment bodies — set &lt;code&gt;Sandbox.READ_ONLY&lt;/code&gt; or &lt;code&gt;Sandbox.WORKSPACE_WRITE&lt;/code&gt; explicitly. The Codex CLI v0.135.0 changelog  flags this as a security consideration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Session files accumulate.&lt;/strong&gt; Every thread persists to &lt;code&gt;~/.codex/sessions&lt;/code&gt;. Prune the directory manually if you run many short test sessions — there is no built-in TTL or cleanup.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Streaming under long turns is undocumented.&lt;/strong&gt; The &lt;code&gt;run_streamed()&lt;/code&gt; behavior for agent tasks exceeding a few minutes has no documented guarantees in this beta. Treat it as experimental for long-running pipelines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pricing and rate limits are not stated in the SDK.&lt;/strong&gt; They inherit from your Codex subscription tier — check your account dashboard rather than the SDK README.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What to try next:&lt;/strong&gt; use &lt;code&gt;CodexConfig&lt;/code&gt; to set a custom working directory and model selection:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai_codex&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Codex&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CodexConfig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Sandbox&lt;/span&gt;

&lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;CodexConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;codex-1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;working_directory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/path/to/project&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;MY_VAR&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;value&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nc"&gt;Codex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;codex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;thread&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;codex&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;thread_start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sandbox&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;Sandbox&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WORKSPACE_WRITE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;thread&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Audit the test coverage.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;final_response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For structured output, pair &lt;code&gt;run()&lt;/code&gt; with a Pydantic v2 schema via &lt;code&gt;output_schema=MyModel.model_json_schema()&lt;/code&gt; and validate with &lt;code&gt;MyModel.model_validate_json(result.final_response)&lt;/code&gt;. Wiring &lt;code&gt;run_streamed()&lt;/code&gt; into a FastAPI SSE endpoint is a natural next step for developer-facing tools that surface real-time agent output. The full API surface is documented in the &lt;a href="https://github.com/openai/codex/tree/main/sdk/python" rel="noopener noreferrer"&gt;SDK source on GitHub&lt;/a&gt; and the &lt;a href="https://pypi.org/project/openai-codex/" rel="noopener noreferrer"&gt;PyPI release page&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Does pip install openai-codex also install the Codex CLI binary?
&lt;/h3&gt;

&lt;p&gt;No. The wheel declares &lt;code&gt;openai-codex-cli-bin&lt;/code&gt; as a dependency but does not bundle the binary itself. In most environments the dependency resolves and installs the binary automatically. In containers or notebooks where you need explicit control over the bootstrap, call &lt;code&gt;Codex.install(version='rust-v0.132.0')&lt;/code&gt; before any other SDK call. If the binary is missing, most SDK methods will raise immediately with a clear error.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I use a standard OpenAI API key instead of a ChatGPT account?
&lt;/h3&gt;

&lt;p&gt;Yes. &lt;code&gt;codex.login_api_key('sk-...')&lt;/code&gt; accepts a standard OpenAI API key and works in headless CI without any browser interaction. Set &lt;code&gt;OPENAI_API_KEY&lt;/code&gt; as an environment variable and call &lt;code&gt;codex.login_api_key(os.environ["OPENAI_API_KEY"])&lt;/code&gt; in your startup code. This is the recommended path for automated pipelines and container deployments.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the difference between Sandbox.READ_ONLY and Sandbox.WORKSPACE_WRITE?
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;Sandbox.READ_ONLY&lt;/code&gt; permits the agent to read files but not write or modify them — appropriate for analysis, code review, and question-answering tasks where you want a zero-write guarantee. &lt;code&gt;Sandbox.WORKSPACE_WRITE&lt;/code&gt; allows writes inside the current working directory only, which covers most coding and refactoring tasks. &lt;code&gt;Sandbox.FULL_ACCESS&lt;/code&gt; is the default and is unrestricted — use it only when you fully control and trust the input prompt.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I continue a thread from a previous Python session?
&lt;/h3&gt;

&lt;p&gt;Save &lt;code&gt;result.thread_id&lt;/code&gt; (a string) after the first turn — to a database, file, or environment variable. In a new Python session, instantiate &lt;code&gt;Codex()&lt;/code&gt; as usual, then call &lt;code&gt;codex.resume_thread(thread_id)&lt;/code&gt; to reload the conversation. Sessions are stored on disk in &lt;code&gt;~/.codex/sessions&lt;/code&gt; and persist across Python restarts. Prune that directory periodically if you run many short test threads, as there is no automatic cleanup.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is openai-codex v0.1.0b2 stable enough for production?
&lt;/h3&gt;

&lt;p&gt;It is a public beta with no API stability guarantees between beta versions, as noted on the &lt;a href="https://pypi.org/project/openai-codex/" rel="noopener noreferrer"&gt;PyPI release page&lt;/a&gt; . The right approach: pin &lt;code&gt;openai-codex==0.1.0b2&lt;/code&gt;, monitor the &lt;a href="https://github.com/openai/codex/releases" rel="noopener noreferrer"&gt;Codex release log&lt;/a&gt;, and test any version bump in isolation before shipping. For workloads that cannot tolerate breaking API changes, wait for the 1.0 release.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to Do With It Now
&lt;/h2&gt;

&lt;p&gt;Two things in v0.1.0b2 are immediately actionable. First, if you have existing code that passes raw permission strings to the Codex SDK, swap them for the named &lt;code&gt;Sandbox&lt;/code&gt; presets — it is a one-line change per thread that meaningfully reduces filesystem blast radius and makes intent explicit in code review. Second, if you are running Codex in CI, the &lt;code&gt;login_api_key()&lt;/code&gt; path eliminates the browser-auth workaround and makes the authentication model match how you handle every other API key in your pipeline.&lt;/p&gt;

&lt;p&gt;The versioning scheme is now decoupled: &lt;code&gt;pyproject.toml&lt;/code&gt; carries &lt;code&gt;version = "0.0.0-dev"&lt;/code&gt; in source, and the published version is injected from the &lt;code&gt;python-v*&lt;/code&gt; git tag at release time . This means beta releases can ship faster without requiring source-tree commits for each version bump. Track the &lt;a href="https://github.com/openai/codex/releases/tag/python-v0.1.0b2" rel="noopener noreferrer"&gt;v0.1.0b2 release notes&lt;/a&gt; and the &lt;a href="https://developers.openai.com/codex/sdk" rel="noopener noreferrer"&gt;official SDK docs&lt;/a&gt; for the shape of 1.0 — the cadence is likely to accelerate from here.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Last updated: 2026-05-31. Based on &lt;a href="https://pypi.org/project/openai-codex/" rel="noopener noreferrer"&gt;openai-codex v0.1.0b2 on PyPI&lt;/a&gt; and the Codex CLI v0.135.0 changelog reviewed on this date.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>openaicodex</category>
      <category>python</category>
      <category>codex</category>
      <category>developertools</category>
    </item>
  </channel>
</rss>
