Repository navigation
v1.14.0
Changes
Adds Gemini 4 Argon on both the Gemini API and Vertex AI, and fixes two failures that hit long-running agent work: Claude requests that generate for more than a minute were dropped by the network, and a ParallelGroup nested inside an async group could not run at all. It also stops a second companion process from starting next to a running one.
Highlights
google/gemini-4-argonandgoogle_vertexai/gemini-4-argonwork in sync, async, streaming, tool and live conversations, withlow,mediumandhigheffort and Argon's pricing, including its scheduled price changes.- Long Claude generations (a full page, a long stylesheet, a big extraction) no longer fail with
APIConnectionErrorafter a minute: requests above 4096max_tokensnow travel over the streaming API and return the same result as before. - A
ParallelGroupinside anAsyncSequentialGrouporAsyncLoopGroupnow runs its agents instead of failing with "asyncio.run() cannot be called from a running event loop". - Only one companion runs per user: a second
prompture companionstart finds the lock and leaves the running one alone.
Technical changes
- Gemini: a shared
drivers/_google_genai.pynow holds the request, response and part handling the four Google drivers (sync and async, Gemini API and Vertex AI) used to duplicate. Signed response parts (_google_parts) are preserved across turns inConversation/AsyncConversationand live events, so thought signatures survive tool loops. - Gemini usage counts thinking and cached tokens.
_effort.google_thinking_levelis now model-aware: Argon gets a realmedium, older models keep the low/high mapping, and an explicitthinking_budgetis never overridden. infra/pricing.py: local rate entries can carry acost_schedule, evaluated at lookup time so a long-running process crosses a price change;rates/google.jsonandrates/google_vertexai.jsonadd Argon. Google SDK requirements and the README's Argon section are updated.companion/server.py:instance_lock()takes an OS-level lock (msvcrton Windows,fcntlelsewhere) on~/.prompture/companion.lockfor the life of the process, so a crash never leaves it stale and a slow companion is never mistaken for a missing one.groups/async_groups.py:ParallelGroup.run()returns therun_async()coroutine when an event loop is already running (which is how every parent async group calls it) and still runs to completion withasyncio.run()from plain sync code.drivers/claude_driver.py/async_claude_driver.py: new_create_message/_acreate_messagehelpers used bygenerate_messages(plain and JSON mode) andgenerate_messages_with_tools. AboveSTREAM_TRANSPORT_ABOVE_MAX_TOKENS(4096) they callmessages.stream()andget_final_message(); below it they keepmessages.create(). Thestream_transportoption forces either path. This also lifts the SDK's refusal of non-streaming requests whosemax_tokenscould run past ten minutes.devis brought level withmain(the release merges since 1.13.1 and the image-block preparation fix from #118) so this merge carries no conflicts.