Skip to content

Releases: BlockRunAI/blockrun-mcp

v0.54.4 — a Solana video settle whose outcome is unknown is waited out, never "no charge"

Choose a tag to compare

@github-actions github-actions released this 12 Oct 01:11
bd077b6

Fixed — a Solana video settle whose outcome is unknown is waited out, never "no charge" (#177)

When a finished video's payment settle times out, sol.blockrun.ai answers 402
Payment settlement outcome unknown with Retry-After and holds the job;
other polls get settlement in progress on a concurrent poll. The client
ignored Retry-After, spent its three re-signs about 15s into a 90s hold, and
reported "no charge was made" while that payment could still land.

  • Held answers honour Retry-After and re-sign with a fresh blockhash without
    spending the re-sign budget; the call deadline still bounds them.
  • Once a payment's outcome is open, every exit (deadline, a 500 poll answer,
    an unreadable challenge, a refused fresh settle) books the quote and says
    the job MAY have been charged, instead of booking nothing.
  • A completion 402 whose challenge cannot be read falls back to
    payment-signed polling instead of aborting the finished job.
  • Music and image (paid at submit), the Base rail and the account rail are
    unchanged.

v0.54.3 — Solana polls prove the wallet; the decide skill teaches Decisions

Choose a tag to compare

@github-actions github-actions released this 11 Oct 22:13
5cc7b5e

Changed — Solana media polls prove the wallet instead of paying (#176)

On the Solana wallet rail, a pending video job used to need a fresh SPL
payment signature on every poll (~20s apart): a payment is a transaction
pinned to a ~60-90s blockhash, and it was the only proof of who was asking.
sol.blockrun.ai now also accepts an ownership proof: an ed25519 signature by
the submitting wallet over blockrun-poll:v1:<kind>:<job id>:<unix seconds>,
sent as x-poll-wallet / x-poll-timestamp / x-poll-signature. It signs a
text message, not a transaction, so nothing it carries can move money.

  • video: pending polls send only the proof. The finished job answers 402
    with status: "completed"; the client signs one payment from that
    challenge, pinned to the submit's amount, recipient and fee payer, and the
    existing payment-signed path settles it.
  • music / image: paid at submit, so their polls never sign a payment.
  • fallback: a refused proof (video 400 Invalid job id, audio/image 404
    Job not found) or any 402 that is not the completion challenge switches
    the job once to payment-signed polling, and says so on stderr.
  • An unpaid completion challenge is not a result: the poll classifier decides
    on each answer's own status, so a later bodiless 2xx keeps polling
    instead of booking the quote with no video.
  • The Base rail and the account (API key) rail are unchanged. bs58 is now
    a declared dependency.

Changed — the decide skill now teaches Decisions; OpenJev is retired

BlockRun replaced OpenJev (its self-hosted NLI judgment model) with an OpenAI
Decisions-compatible endpoint served by gpt-6-luna on 2026-10-07. The skill
taught api.blockrun.ai/v1/decide with the state / noul / criteria
shape and explained OpenJev's normalised scores, none of which describe what
answers now.

skills/decide now covers POST https://api.blockrun.ai/v1/decisions:
input + questions as an array, predicate / choice (choices) /
score (levels), and image input. It is served only there, free for any
registered key. There is no x402 rail: the x402 floor is above what a
Decisions call costs, so the paid route was never deployed (gateway #804).
The example response is a live call. The old /v1/decide shape is still
accepted there and is named as legacy. Still a skill, not a tool, for the
reason 0.52.0 gave. skills/blockrun and the marketplace entry point at the
new path.

v0.54.2 — fix(polymarket): a withdrawal that may have moved money is never signed twice

Choose a tag to compare

@github-actions github-actions released this 08 Oct 02:56
e9b2bd5

Fixed — a withdrawal that may have moved money is never signed twice

A retry that resolved the earlier withdrawal went on to sign another. The
pendingWithdraw guard cleared itself when the earlier transfer turned out
settled (relayer STATE_MINED/STATE_CONFIRMED, or an EOA receipt) and the
same confirm:true call then signed a fresh transfer on top of it. Resolving
the earlier withdrawal now ENDS the call: the outcome is reported, nothing new
is signed, and another withdrawal takes a separate call made after the
balances have been checked. The same holds for a failed batch and for an
expired relayer deadline, which is now reported as "may or may not have
executed" rather than treated as safe.

The EOA (sigType 0) rail expired a plain transaction after five minutes.
A Polygon transaction has no deadline; one that sits in the mempool can be
mined at any later time. The guard used to block for 300s and then clear,
after which a retry signed a second transfer with the next nonce, so both
could land. The transfer is now signed locally first, and its hash, nonce and
signed bytes are written to the state file before the broadcast. Only a
receipt resolves it. Until a receipt exists, a retry re-broadcasts those same
bytes, so the transfer can execute at most once, and no new transaction is
signed. An advanced account nonce plus an RPC that does not know the hash is
not read as "dropped". The guard is released before a receipt only when the
node rejects the bytes outright (insufficient funds, underpriced, intrinsic
gas, invalid sender) and the RPC does not know the hash. "nonce too low" and
"already known" keep the guard.

The relayer withdrawal is recorded before the submit, not only in its
error handler.
A process killed mid-POST runs no catch block, and the batch
it posted stays executable until its deadline. A definite 4xx still releases
the guard.

HTTP 408 no longer counts as a definite rejection. isDefiniteRejection
treated every 4xx as proof that nothing was accepted. A 408 means a proxy gave
up waiting, and the order or batch behind it may have landed. It is now an
unknown outcome on the CLOB submit, the relayer batch and fund alike, so the
session reservation is kept.

test/polymarket-withdraw-eoa.test.ts and
test/polymarket-definite-rejection.test.ts are new. The withdraw and relayer
tests pin the new lifecycle. Each fix was checked by reverting it and
watching its tests fail.

v0.54.1 — fix(search): flat $0.08 per call — reserve, description and skills

Choose a tag to compare

@github-actions github-actions released this 07 Oct 09:06
abaafb2

Fixed — blockrun_search is one flat price, and the tool said otherwise

The gateway repriced /v1/search to a flat $0.08 per call on 2026-09-29
(blockrun SEARCH_PRICE_PER_CALL_USD: xAI never sees max_results, so the
count never drove cost). This server kept reserving and advertising
$0.025 × max_results: the default call reserved $0.2645 against a $0.081
charge (3×), a 50-source call $1.3145 (16×), and the description told every
agent search was "expensive by default" and to ask for fewer sources.

Live 402 quotes, 2026-10-06: Base amount 81000 and Solana 80000 at
max_results 1, 10 and 50 alike. The reserve is now withTxFee($0.08) =
$0.082 at any size, never below the charge; test/search-cost.test.ts pins
it flat. Tool description, skills/search, skills/blockrun, skills/surf
and the README price row now say $0.08 flat; the full/research schema-token
rows moved with the shorter description (14,018 / 2,727).

v0.54.0

Choose a tag to compare

@github-actions github-actions released this 02 Oct 15:12

Fixed — seedance-2.5 takes reference clips; the clip ceiling is per model

The gateway turned on reference video/audio for seedance-2.5 on 2026-09-26
(enterprise#297): its registry entry now carries supportsReferenceMedia: true
and "reference video/audio clips up to 30s each (billed per reference
second)". blockrun_video still refused reference_videos /
reference_audios on 2.5 by name. It now forwards them, with the same limits
as the 2.0 family: 1-3 clips of each type, audio only beside a reference image
or video, never with frame seeds, up to 30 reference images.

The reserve priced every clip at a flat 15.2s. The provider's ceiling is per
model, and the gateway quotes each clip at its model's ceiling
(REFERENCE_CEILING_SECONDS): 15.2s on seedance-2.0 / 2.0-fast / 2.0-mini,
30.2s on 2.5. A 2.5 clip would have reserved half its price on the one rail
where the reserve is the only budget control. One reference video now puts a
5s 720p 2.5 render at ~$11.07 (~7x its ~$1.58 plain price). 1.5-pro still
takes no clips, and the estimator now throws instead of borrowing another
model's ceiling for it.

Rail rules are unchanged: both wallet gateways (blockrun.ai,
sol.blockrun.ai) still refuse every reference field with a 400 before
quoting, so reference media stays account-rail only, 2.5 included.

Added — price rows for the new chat models

blockrun_chat now prices gpt-6-sol, gpt-6-luna, gpt-5.1, claude-opus-5.5,
claude-sonnet-5.5, grok-4.6 and grok-4.7 from the live /v1/models (#163). On
the native Anthropic path the row is the ledger, so opus/sonnet-5.5 previously
booked nothing. gpt-5.6-sol is repriced from $5/$30 to $4/$20 per million
tokens (cut 2026-08-21).

Fixed — huge prompts reserve at the long-context price

Past a model's pricing.long_context threshold the gateway reprices the whole
request, but the chat estimate reserved at base rates, so a huge prompt
under-reserved (gpt-6-astra over 272K tokens reserved $10/$50 against a $20/$75
quote). The estimate and the account ledger now use the highest long-context
step the prompt reaches, copied from the live /v1/models (#165).
verify:prices fails when a live step would settle above the reserve.

Fixed — retired tencent/hy3 dropped from the cheap tier

Hy3 retired on 2026-09-24 and the gateway redirects it to qwen3.7-flash, which
is already in the cheap chain (#164).

v0.53.1

Choose a tag to compare

@github-actions github-actions released this 29 Sep 14:19
8035b1a

Fixed — seedance-2.5 first-and-last-frame is refused by name on Solana

0.53.0 advertised last_frame_url on seedance-2.5 on every rail.
sol.blockrun.ai is a separate deploy that has not added 2.5 to its
first-and-last-frame list: it answers 400 "does not support first-and-last-frame video" before quoting, while blockrun.ai quotes the same body (unsigned
probes, 2026-09-29; 2.0, 2.0-fast, 2.0-mini and 1.5-pro quote on both). No
payment was ever at risk, but the caller got "the endpoint did not return a
quote". The tool now refuses that one combination on the Solana wallet rail,
names Base and the account rail as the places that serve it, and lists the
models that work on Solana. The parameter description and
docs/seedance-capabilities.md say the same.

The output controls (output_format, bitrate_mode, watermark,
return_last_frame) were probed on both gateways as well. Both validate them
in their request schemas, so they are not silently dropped on Solana.

v0.53.0

Choose a tag to compare

@github-actions github-actions released this 29 Sep 13:25
bbd653b

Added — Seedance reference media, 2.5 first/last frame, output controls

blockrun_video gains the Seedance capabilities the gateway already serves.
Full matrix, per rail and per model, in
docs/seedance-capabilities.md.

  • Reference media — account rail only (BLOCKRUN_API_KEY).
    reference_image_urls (up to 9 on seedance-2.0 / 2.0-fast / 2.0-mini, up
    to 30 on 2.5), reference_videos and reference_audios (1-3 each, 2.0
    family only; audio needs an image or video beside it). The Base and Solana
    gateways refuse reference media with a 400 before quoting, so the tool
    refuses it on those rails first, naming the rail that serves it. No
    payment is taken. References and frame seeds (image_url,
    last_frame_url, real_face_asset_id) are mutually exclusive.
  • Reference clips are expensive, and the reserve says so. The gateway
    bills per reference second, and the caller sends a URL, never a duration,
    so every clip is reserved at the model's 15.2s ceiling. One clip makes a 5s
    720p render cost about 4x (seedance-2.0-mini ~$0.40 to ~$1.61). A 4K job
    on seedance-2.0 with three videos and three audios reserves ~$130.88. The
    spend confirmation now lists the reference clips, so the price makes sense.
    Reference images carry no surcharge.
  • First-and-last-frame on seedance-2.5 (last_frame_url with
    image_url), joining 1.5-pro and the 2.0 family.
  • Output controls: bitrate_mode (2.x), output_format mp4/mov (2.5),
    return_last_frame, watermark and safety_identifier (Seedance), and
    seed / camera_fixed (1.5-pro). A control declared for the wrong model is
    refused by name before payment.
  • Every in-memory guard now runs before the SSRF DNS resolution, so a
    request the tool will refuse anyway costs no lookups.

Fixed

  • Guard order. With references present, the conflict with frame seeds is
    answered before the last_frame_url / RealFace guards. Before, a reference
    request carrying last_frame_url was told to add image_url, and only on
    the resubmit that seeds and references never mix.
  • A Solana image give-up named the wrong place to check. Since 0.52.2 the
    Solana image path can end in a settled-at-submit give-up, and the message
    was written for the account rail: "the account is charged", "check
    user.blockrun.ai/dashboard/activity". That dashboard has no record of an
    on-chain transfer. The message now names the Solana wallet and
    blockrun_wallet action:"report".

v0.52.3

Choose a tag to compare

@github-actions github-actions released this 29 Sep 13:05
e872360

Fixed — 0.52.2's Solana image fix cut the paid submit off at 30s

0.52.2 moved blockrun_image on the Solana wallet rail onto the async helper
so a long render is polled instead of lost. It kept the helper's 30s submit
timeout, which is sized for video's 3-20s enqueue. The image route holds the
paid POST for up to ~30s and only then answers 202 { id, poll_url } — so the
client aborted at the moment the job id was due, after the transfer had
settled. The fix did not reach the case it was written for, and a render that
finished inline just past 30s (which 0.52.1 delivered) was now lost as well.
The image submit now waits 95s, the account rail's timeout for the same 30s
window.

Fixed — an edge 5xx on a Solana video submit no longer books a phantom charge

0.52.2 kept the payment tracker armed on any 502/503/504 at a Solana async
submit, because on image and music the submit settles the transfer. Video
settles on the poll that observes completed, so its submit cannot have moved
money — yet the full estimate was booked against the budget and the tool said
the charge might stand. Each caller now declares whether its submit can settle
(submitMaySettle, default true); video declares false.

v0.52.2

Choose a tag to compare

@github-actions github-actions released this 29 Sep 12:39
f96b0bd

Fixed — a paid image could be lost on the Solana wallet rail

blockrun_image on Solana sent one POST and never polled. Past the gateway's
~30s inline window the route answers 202 { id, poll_url } instead of the
image, so the tool returned "No image URL in response" — and the charge
stood
, because Solana settles at submit and cannot settle after a long render
(a signed transaction expires with its blockhash). The user paid and got
nothing.

Observed live on 2026-09-29: google/nano-banana-pro at 4096x4096 booked
$0.1575 and returned no image. The same defect was fixed on the account rail in
#140; the Solana wallet rail was never moved across. It now uses
solanaPaidAsyncPost — the helper video and music already use, which handles
the inline 200 and the 202 alike and re-signs each poll with a fresh blockhash.

Fixed — an edge 5xx on a Solana submit is no longer reported as free

solanaPaidAsyncPost marked the payment tracker answered as soon as the submit
response arrived, including a 502/503/504 from the edge. On this rail the submit
is the paid request, so an origin that never answered may still have settled
it — and the tool told the user "temporary API issue, try again" on a charge
that already stood. An edge status is no longer treated as the origin's verdict;
the tracker stays armed and the tool books it as a precaution. Applies to video
and music as well.

All notable changes to BlockRun MCP will be documented in this file.

v0.52.1 — JSON mode kept half its promise on Claude

Choose a tag to compare

@github-actions github-actions released this 20 Sep 19:27
3ca8812

JSON mode kept half its promise on Claude. response_format: "json_object"
says "no markdown fences" and "works across all providers". On the native
claude-* path it injected the instruction and never stripped the fence Claude
adds anyway, so JSON.parse(response) threw on the leading backtick — on
exactly the models most likely to be asked for JSON.

Fixes

  • fix(chat) — json_object unwraps a fenced reply on the native path.
    Only a reply that IS one fenced block is unwrapped; prose round a fence is
    the model ignoring the instruction and is returned as-is rather than trimmed
    into JSON that was never the whole answer. structuredContent.native keeps
    the fence as upstream evidence, and thinking blocks are untouched — the
    compat path would have done the strip for free at the cost of the native
    thinking channel. Pinned by six cases in
    test/chat-anthropic-json-fence.test.ts, including the verbatim
    haiku-4.5 reproduction. Reported by a sibling session reading the gateway's
    stripJsonFence call sites, neither of which is on /v1/messages.