Informe JSON sin procesar legible por máquina
{
"data": {
"repo": {
"topics": [
"ai-gateway",
"base-chain",
"blockrun",
"litellm",
"llm-proxy",
"micropayments",
"openai-compatible",
"python",
"usdc",
"x402"
],
"is_fork": false,
"size_kb": 594,
"has_wiki": true,
"homepage": null,
"languages": {
"Python": 347700
},
"pushed_at": "2026-07-22T20:49:08Z",
"created_at": "2026-05-11T19:15:59Z",
"owner_type": "Organization",
"updated_at": "2026-07-22T20:49:13Z",
"description": "LiteLLM adapter for BlockRun — call x402-paid AI models through LiteLLM (custom provider or local OpenAI-compatible proxy)",
"is_archived": false,
"is_disabled": false,
"license_spdx": "MIT",
"default_branch": "main",
"license_spdx_raw": "MIT",
"primary_language": "Python",
"significant_languages": [
"Python"
]
},
"owner": {
"blog": "https://blockrun.ai",
"name": "BlockRun.ai",
"type": "Organization",
"login": "BlockRunAI",
"company": null,
"location": "San Francisco, CA",
"followers": 252,
"avatar_url": "https://avatars.githubusercontent.com/u/250889376?v=4",
"created_at": "2025-12-21T21:41:29Z",
"is_verified": null,
"public_repos": 37,
"account_age_days": 212
},
"license": {
"state": "standard",
"spdx_id": "MIT",
"raw_spdx": "MIT",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [],
"recent_commits": [
{
"oid": "d7c0c8e0bcee76dd997e97299a031ba87f98f03c",
"body": "* feat: add native Gemini proxy passthrough\n\n* fix(gemini): harden native passthrough after review\n\n- sanitize the model id (strip models//google/ prefixes, reject slashes) and\n rebuild the forwarded path from clean parts, so no crafted model name can move\n the signed upstream target outside /v1be\n[…]\nary\n- tests: isolate BLOCKRUN_API_URL, add slash-rejection, blank-model, dot-segment,\n and proxy-token denial coverage; assert the reject logs\n\n---------\n\nCo-authored-by: 1bcMax <viewitter@gmail.com>",
"is_bot": false,
"headline": "feat: add native Gemini passthrough to LiteLLM sidecar (0.8.0) (#29)",
"author_name": "Killer Queen",
"author_login": "KillerQueen-Z",
"committed_at": "2026-07-22T20:49:08Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e6d58921c7c7232e194c617193257432b4504fb4",
"body": "…ry exit logs (0.7.6) (#28)\n\ncost_usd=None reads as $0, but it's also what the sidecar writes when it doesn't know. On Solana those are different facts worth real money: several routes settle OPTIMISTICALLY (settle fires in parallel with the upstream work), so a call that verifies and then fails IS \n[…]\nto reconciliation. The gateway ledger stays the authority; this says go look.\n\n294 tests; all six regressions mutation-verified to fail. Supersedes #27 (auto-closed when its stacked base was deleted).",
"is_bot": false,
"headline": "fix(logging): flag failures that may have been charged; guarantee eve…",
"author_name": "VickyXAI",
"author_login": "VickyXAI",
"committed_at": "2026-07-16T06:47:43Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "3a7870eb123fd81397c42b9ab575c91247f12358",
"body": "…nly) (#26)\n\n0.7.4's correction was itself wrong: it claimed the gateways settle on success universally. True for Base, false for Solana, which settles optimistically — settle fires in parallel with the upstream call, so a request that verifies and then fails upstream IS charged, logged as a paid er\n[…]\nr Base); 0.7.4 claimed it never happened (right for Base, wrong for Solana). Each pass corrected a half-truth into the opposite half-truth.\n\nRuntime code byte-identical to 0.7.3/0.7.4. 277 tests pass.",
"is_bot": false,
"headline": "release: 0.7.5 — the settle story is per-chain, not universal (docs o…",
"author_name": "VickyXAI",
"author_login": "VickyXAI",
"committed_at": "2026-07-16T06:44:08Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "a00a0007bc079492632e13f8c41576022327697a",
"body": "Documentation only; runtime code byte-identical to 0.7.3. Ships the corrected record with the package.\n\n0.7.2 claimed an out-of-range n 'lost the prepaid USDC'. False — the gateways settle on success, so a request that dies at the provider settles nothing. Verified on every path including the async \n[…]\nr failed jobs, and settlePaymentWithRetry only runs in the completed branch.\n\nThe n bound stays; it was never about money. Root cause was the SDK's 'API error after payment' wording (blockrun-llm#25).",
"is_bot": false,
"headline": "release: 0.7.4 — correct the 0.7.2 n-bound claim (docs only) (#25)",
"author_name": "VickyXAI",
"author_login": "VickyXAI",
"committed_at": "2026-07-16T05:33:02Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5686ab3b3da883dffdfe609e4e37a231f31a4b06",
"body": "0.7.2 shipped saying an out-of-range n 'took payment, then 400'd at the provider and lost the prepaid USDC'. That is wrong.\n\nBlockRun's gateways settle on success — settlePaymentWithRetry runs after the upstream call — so a request that dies at the provider settles nothing and costs the caller nothi\n[…]\ns a pointless signed round-trip, a facilitator verify, and an upstream call, and answers 400 locally. It just was never about losing money.\n\nDocs and comments only; no behavior change. 277 tests pass.",
"is_bot": false,
"headline": "docs: correct the n-bound rationale — no USDC was ever at risk (#24)",
"author_name": "VickyXAI",
"author_login": "VickyXAI",
"committed_at": "2026-07-16T05:31:08Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "15e6fa191210432ba555da60f07bae0fe3db1a90",
"body": "…3) (#23)\n\nA blank `model` was falsy, so the SDK's `model or DEFAULT_MODEL` silently substituted the default and charged for it (~$0.40 for the 8s Grok video default). The gateway can't catch it: a zod `.default()` only fires when the key is absent, and \"\" is a present, valid string.\n\nAll seven JSON\n[…]\n \"unset\" as \"\".\n\nAlso namespaces bare `grok-imagine-video`, the family #20 left behind. `sora-2` is deliberately not mapped — it ships under two vendors, so there is no namespace to infer.\n\nCloses #21",
"is_bot": false,
"headline": "fix(media): refuse a blank model instead of billing the default (0.7.…",
"author_name": "VickyXAI",
"author_login": "VickyXAI",
"committed_at": "2026-07-16T05:19:20Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f452fd65131fc126d1def119b00890521710110b",
"body": "…) (#22)\n\nPost-merge audit of 0.7.0 across three independent reviews (money/failure-modes, upgrade regressions, contract fidelity).\n\n- Regression: quality on Base 400'd. 0.6.1 never read it, so callers got a 200; 0.7.0 read it and refused a standard OpenAI param on a DALL-E-compatible route. Dropped\n[…]\nle pyproject said 0.7.1. Ports blockrun-llm's version-consistency guard, which the sidecar lacked.\n\n242 passed, 1 skipped. Five pre-payment guards verified against a real sidecar with zero settlement.",
"is_bot": false,
"headline": "fix(media): audit fixes from three post-merge reviews of 0.7.0 (0.7.2…",
"author_name": "VickyXAI",
"author_login": "VickyXAI",
"committed_at": "2026-07-16T04:59:51Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "2bc677b4e1f8e11d927ff3e6de3da765a16d573a",
"body": "Token360 documents short ids like `seedance-2.0-fast`, but the gateway's video catalog is an exact-match allowlist of provider-qualified ids, so a bare id 400'd as \"Unknown video model\". The gateway only rewrites bare ids on the `content[]` route `/v1/videos`, never on the flat `/v1/videos/generatio\n[…]\n`_adapter.video_generation_async` now bridges it for both proxy video routes, lowercasing on the way through since the catalog match is case-sensitive.\n\nCo-authored-by: Fsocietyhhh <1211904451@qq.com>",
"is_bot": false,
"headline": "fix(video): normalize short Seedance model ids (0.7.1) (#20)",
"author_name": "Killer Queen",
"author_login": "KillerQueen-Z",
"committed_at": "2026-07-16T04:36:52Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "0874cac58dc47c81cc502d3d80e320c64093000a",
"body": "…m 1.7.0 (0.7.0) (#18)\n\nAdds OpenAI-compatible image editing plus the two media params that are real as of blockrun-llm 1.7.0 (BlockRunAI/blockrun-llm#24).\n\n- Image editing: POST /v1/images/edits (alias /v1/images/image2image) — JSON data URIs or multipart image/image[], multi-image fusion, mask. Ad\n[…]\nython repr, added JSON image/mask type guards, and capped multipart uploads (12MB → 413, 16 parts → 400).\n\n228 passed, 1 skipped. Verified end-to-end against the real SDK 1.7.0 with only HTTP stubbed.",
"is_bot": false,
"headline": "feat(media): image edits + input_type + Solana quality on blockrun-ll…",
"author_name": "Killer Queen",
"author_login": "KillerQueen-Z",
"committed_at": "2026-07-16T01:32:00Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "b0ad117e348167e8af25f731ef733f83f7b762f5",
"body": "…#19)\n\nPicks up BlockRunAI/blockrun-llm#23, which stops the SDK retrying payments\na wallet can never make. Below this floor an unfunded payer burns all 5\npayment attempts, each costing the gateway 4 verify retries — 20\nfacilitator calls per doomed request, which is how one wallet with no USDC\ntoken \n[…]\ns retry behaviour rather than\nmisbehaving.\n\nUnblocked: blockrun-llm 1.6.1 published to PyPI, so blockrun-llm[solana]>=1.6.1\nnow resolves (verified: blockrun-llm-1.6.1 with solana-0.39.0, x402-2.15.0).",
"is_bot": false,
"headline": "chore(deps): bump solana extra floor to blockrun-llm>=1.6.1 (0.6.1) (…",
"author_name": "VickyXAI",
"author_login": "VickyXAI",
"committed_at": "2026-07-15T19:14:29Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "84f6aaa725c807008633fd30f0ae0cf4e67c6e78",
"body": "…ting & billing (0.6.0) (#17)\n\n* chore(release): 0.5.0 — media endpoints (#14, #15) + solana floor >=1.5.0\n\n* feat(proxy): OpenAI Videos API + real-cost header for LiteLLM media routing/billing\n\nFixes the two LiteLLM-integration gaps hit with xai/grok-imagine-* models:\nimage calls recorded at $0 spe\n[…]\n\nand downloaded via /content (562KB mp4, settlement tx surfaced); paid\ndeepseek chat now returns x-blockrun-cost-usd + x-litellm-response-cost.\n\n---------\n\nCo-authored-by: 1bcMax <viewitter@gmail.com>",
"is_bot": false,
"headline": "feat(proxy): OpenAI Videos API + real-cost header — LiteLLM media rou…",
"author_name": "VickyXAI",
"author_login": "VickyXAI",
"committed_at": "2026-07-09T04:59:57Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "a27e1eb73403168ed39d33d519e761e2cf780784",
"body": "Review follow-up fixing everything flagged on the media-endpoints PR:\n\n- ValueError -> 400 on ALL media routes via a shared _media_endpoint\n helper (was video-only; music with lyrics + default instrumental=True\n 500'd instead of returning the SDK's clear message)\n- Solana media on a pre-#16 blockr\n[…]\npoint catalog\n- tests: full negative-path suite for all 5 media routes (incl. the\n pre-existing image route) + adapter dispatch/clamp/guard/ceiling tests\n\nCo-authored-by: 1bcMax <viewitter@gmail.com>",
"is_bot": false,
"headline": "fix(media): harden the media endpoints shipped in #14 (#15)",
"author_name": "VickyXAI",
"author_login": "VickyXAI",
"committed_at": "2026-07-04T05:58:11Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "52181d782539131dbbac216e3241d8ab38be2002",
"body": "The sidecar only exposed /v1/images/generations, so OpenAI-compatible clients\n(LiteLLM) could not reach the gateway's video/audio models — e.g. a call to\nxai/grok-imagine-video 404'd at the proxy even though the gateway supports it.\n\n- Add POST /v1/videos/generations, /v1/audio/speech, /v1/audio/gen\n[…]\nspatch; sync SDK clients run in the shared thread pool.\n\nRequires blockrun-llm with Solana media support (SolanaLLMClient.video etc.).\nValidated live end-to-end on Solana mainnet via the adapter path.",
"is_bot": false,
"headline": "feat(proxy): add video/speech/music/sound-effects media endpoints (#14)",
"author_name": "Killer Queen",
"author_login": "KillerQueen-Z",
"committed_at": "2026-07-04T02:09:00Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "48306d077f8ecf36f5b293fe38cc987742cbf4fe",
"body": "… (closes #12)\n\nThe raw /v1/chat/completions + /v1/messages passthrough relayed bytes and\nsurfaced no cost. It now decodes the gateway's X-PAYMENT-RESPONSE header (the\nreal on-chain charge) on the upstream response and:\n- adds x-blockrun-cost-usd + x-blockrun-settlement response headers (stream +\n \n[…]\noxy_passthrough) mirroring the provider schema.\n\nRace-free (per-response header, not a shared signing transport). Free calls\nsurface no cost. Body forwarded byte-for-byte. Completes #12 (both halves).",
"is_bot": false,
"headline": "feat(cost): surface real x402 cost on the FastAPI sidecar passthrough…",
"author_name": "1bcMax",
"author_login": null,
"committed_at": "2026-06-26T04:49:27Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "719e7ae227ec61747c3e3209481bd8e738121652",
"body": "…(#12)\n\nThreads the SDK's per-call charge (ChatCompletionChunk.cost_usd,\nblockrun-llm>=1.4.7) onto the assembled streamed response's _hidden_params:\n- additional_headers['llm_provider-x-litellm-response-cost'] -> LiteLLM\n response_cost / max_budget reflect the real wallet deduction (the only\n chan\n[…]\nree (rides the per-call chunk, not the shared _last_call_cost). Free\nstreams report 0.0; older SDK without cost_usd falls back to the estimate.\nProxy-server passthrough still pending (#12 proxy half).",
"is_bot": false,
"headline": "feat(cost): report real x402 cost on streaming custom-provider calls …",
"author_name": "1bcMax",
"author_login": null,
"committed_at": "2026-06-26T03:56:30Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "2e1ae5cb48138d98f3b8fd58eda08c98e85e9050",
"body": "… timeout (#13)",
"is_bot": false,
"headline": "chore(release): 0.4.5 — forward thinking/reasoning_effort + 600s chat…",
"author_name": "1bcMax",
"author_login": null,
"committed_at": "2026-06-26T03:28:48Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "031f054ffdc89e7c982c8f3a5fcae8cb6b96a154",
"body": "…rough\n\n- _adapter: parse BLOCKRUN_CHAT_TIMEOUT via a guarded helper so a non-numeric\n value falls back to 600s instead of crashing module import (which would take\n down both the provider and the proxy). Mirrors _solana_image_timeout.\n- proxy: wire the /v1/chat/completions + /v1/messages passthrou\n[…]\nhardcoded 300s). This is the heavy agentic/\n Claude Code path, where reasoning models (opus-4.8 extended thinking, 200-300s+)\n would otherwise time out mid-generation while the gateway kept billing.",
"is_bot": false,
"headline": "fix: guard BLOCKRUN_CHAT_TIMEOUT parse + apply it to the proxy passth…",
"author_name": "1bcMax",
"author_login": null,
"committed_at": "2026-06-26T03:23:32Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "203ee8de1b37862445bf4fbc212ae1a72f455848",
"body": "…meout\n\n_FORWARDED_KWARGS silently dropped 'thinking' and 'reasoning_effort', so callers\ncould never trigger Anthropic extended thinking through litellm (the params never\nreached the gateway). Add both to the whitelist. Also pass an explicit,\nenv-configurable (BLOCKRUN_CHAT_TIMEOUT, default 600s) timeout to the SDK clients\nso reasoning calls don't hit the SDK's old 120s default and time out mid-generation.",
"is_bot": false,
"headline": "fix(adapter): forward thinking/reasoning_effort + raise SDK client ti…",
"author_name": "Fsocietyhhh",
"author_login": "KillerQueen-Z",
"committed_at": "2026-06-25T09:19:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8cf99ccbc0989b744979a35a9a630a4190104c69",
"body": "…402 cost)",
"is_bot": false,
"headline": "chore(release): 0.4.4 — require blockrun-llm>=1.4.6 (race-free real x…",
"author_name": "1bcMax",
"author_login": null,
"committed_at": "2026-06-24T06:29:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "feb8740ec23e4cde3f0de327650d61d5b2eb9357",
"body": null,
"is_bot": false,
"headline": "chore(release): 0.4.3 — report the real x402 wallet charge (#11)",
"author_name": "1bcMax",
"author_login": null,
"committed_at": "2026-06-24T06:20:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ebd0e58b105370c96a03cb9f03298fa7237698fb",
"body": "…e (#11)\n\nLiteLLM computes per-call cost as token_count × list-price (from its model\nprice map). That does NOT match BlockRun's real wallet deduction — the gateway\nprice carries a per-call minimum floor + margin — so on small/short calls it is\noff by ~10x (customer: LiteLLM showed $0.00x, wallet was\n[…]\ncost_usd == logged cost_usd\n== the get_balance() delta, to the cent.\n\nScope: non-streaming custom-provider (sync + async). Streaming and the proxy\nraw-passthrough path are not covered yet — follow-up.",
"is_bot": false,
"headline": "feat(cost): report the real x402 wallet charge, not LiteLLM's estimat…",
"author_name": "Killer Queen",
"author_login": "KillerQueen-Z",
"committed_at": "2026-06-24T06:19:47Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "758015dd071a7a854057613a2ce661294108a06a",
"body": "… pricing example",
"is_bot": false,
"headline": "chore(release): 0.4.2 — require blockrun-llm>=1.4.1 + per-model proxy…",
"author_name": "1bcMax",
"author_login": null,
"committed_at": "2026-06-24T05:19:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a7f3368d38c1ca6f9e4237bd4866f565afab48c2",
"body": "…te (#10)\n\n* fix(proxy): set per-model pricing so LiteLLM budgets/spend are accurate\n\nThe blockrun model ids (anthropic/claude-opus-4.8, openai/gpt-5.5, ...) are not in LiteLLM's built-in model_cost map, so the proxy priced these calls at $0 — a team/key max_budget (e.g. $200) never tripped and the \n[…]\nas the exact cost source of truth. input/output per-token pricing (the part that makes the $200 cap trip on non-streaming) is verified honored.\n\n---------\n\nCo-authored-by: 1bcMax <viewitter@gmail.com>",
"is_bot": false,
"headline": "fix(proxy): set per-model pricing so LiteLLM budgets/spend are accura…",
"author_name": "VickyXAI",
"author_login": "VickyXAI",
"committed_at": "2026-06-24T04:16:51Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "4cde21119d507f11062182085267879044106518",
"body": "Co-authored-by: 1bcMax <viewitter@gmail.com>",
"is_bot": false,
"headline": "docs(readme): link back to blockrun.ai/docs (#9)",
"author_name": "VickyXAI",
"author_login": "VickyXAI",
"committed_at": "2026-06-17T14:39:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e43f17a636f93c6006e0e4deed774fb8e98cce49",
"body": "…e SDK fix (#8)\n\nThe dependency floor was >=0.37.0, so `pip install -U blockrun-litellm` left an\nalready-installed blockrun-llm 1.3.0 in place (pip doesn't upgrade a\nstill-satisfied transitive dep) — and 1.3.0 still crashes streamed tool calls\n('dict' object has no attribute 'delta'). Bump the floor\n[…]\nmp version\nto 0.4.2.\n\nNOTE: once blockrun-llm 1.4.2 ships (Solana ~/.blockrun/.solana-session\nauto-load), bump this floor to >=1.4.2 so the sidecar starts without\nSOLANA_WALLET_KEY out of the box too.",
"is_bot": false,
"headline": "chore(deps): require blockrun-llm>=1.4.1 so `pip install -U` pulls th…",
"author_name": "Killer Queen",
"author_login": "KillerQueen-Z",
"committed_at": "2026-06-14T22:57:06Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "4bd9fe7fd09ac56c215ad6a4760480193cb2cab8",
"body": "…I tool calls (0.4.1) (#7)\n\nRoutes /v1/chat/completions through the same verbatim x402 passthrough as /v1/messages, fixing the streamed-tool-call crash ('dict' object has no attribute 'delta'). Adds a SolanaRpcException->503 mapping, green-by-default tests, and bumps to 0.4.1 (version sync).",
"is_bot": false,
"headline": "feat(proxy): raw-passthrough /v1/chat/completions — fixes Codex/OpenA…",
"author_name": "Killer Queen",
"author_login": "KillerQueen-Z",
"committed_at": "2026-06-14T08:35:37Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b32dddbe6b37b22812bdddbe6b7e4744603ac6a0",
"body": "…) — fixes Claude Code tool use (#6)\n\n* fix(stream): forward tool calls through the in-process custom provider\n\nThe custom-provider streaming path dropped delta.tool_calls when converting\nBlockRun chunks to LiteLLM GenericStreamingChunk — plain chat streamed fine,\nbut any tool call (Claude Code / ag\n[…]\n_stream_tool_calls.py\nupdated so the fake ToolCall mirrors production (no `index`) and adds\ncross-chunk / cross-stream parallel-index coverage.\n\n---------\n\nCo-authored-by: 1bcMax <viewitter@gmail.com>",
"is_bot": false,
"headline": "feat(proxy): native Anthropic /v1/messages passthrough (Base + Solana…",
"author_name": "Killer Queen",
"author_login": "KillerQueen-Z",
"committed_at": "2026-06-12T05:55:45Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "b1bd269b59a21622fb04fa34afe9556ab887c6b6",
"body": "BlockRun's gateway now serves anthropic/claude-fable-5 (Mythos-class tier above\nOpus, 1M context, always-on thinking — fully wired in blockrun-sol: catalog,\nANTHROPIC_MODEL_MAP + BEDROCK_MODEL_MAP us.anthropic.claude-fable-5). Align the\nadapter's examples and docs to it, replacing the now two-genera\n[…]\nts/test_provider.py (pass-through placeholders)\n\nDocs/examples only — the adapter is model-agnostic (passes blockrun/<provider>/<model>\nthrough verbatim), so no behavior change. Full suite 72 passing.",
"is_bot": false,
"headline": "docs: feature Claude Fable 5 as the flagship Claude model (#5)",
"author_name": "Vicky",
"author_login": null,
"committed_at": "2026-06-11T16:53:12Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ab4600c578b917ce536ede6239e648671132a2f4",
"body": "openai/gpt-image-2 can exceed the SDK's 200s image_timeout default on the\nsynchronous Solana path; the sidecar threw httpx.ReadTimeout mid-generation and\nclients saw 500 + LiteLLM-Proxy retries even though the gateway produced the\nimage. get_image_client now constructs SolanaLLMClient with an explic\n[…]\nnt applies image_timeout), so it\nnever governed image calls. `image_timeout=` is the effective knob.\n\nTests assert image_timeout is passed (>= slow tail) + env override applies. Full\nsuite 72 passing.",
"is_bot": false,
"headline": "fix(image): raise Solana image_timeout for slow models (0.3.14) (#4)",
"author_name": "Vicky",
"author_login": null,
"committed_at": "2026-06-11T16:41:28Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "7b9a54e7c96dada5b8bcad7a49419a277cb05b24",
"body": "… (#3)\n\nThinking-enabled Claude (Bedrock / direct Anthropic) and native reasoning models\n(DeepSeek R1, GLM thinking) emit chain-of-thought on choices[0].delta.reasoning_content.\nLiteLLM's GenericStreamingChunk has no reasoning field and the custom-provider\nstream handler never promotes it onto delta\n[…]\n reasoning_content deltas.\n\nAlso syncs __version__ (was stale at 0.3.11) to 0.3.13.\n\nNew tests/test_reasoning.py: unit mapping + end-to-end through the real\nCustomStreamWrapper. Full suite 70 passing.",
"is_bot": false,
"headline": "fix(stream): forward reasoning_content on the streamed delta (0.3.13)…",
"author_name": "Vicky",
"author_login": null,
"committed_at": "2026-06-11T06:05:09Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "2d1fd3448bb31b6e985a0f6501ae2c22a132b131",
"body": "…eLLM (real token counts, no more tiktoken drift)",
"is_bot": false,
"headline": "chore(release): 0.3.12 — forward the end-of-stream usage frame to Lit…",
"author_name": "1bcMax",
"author_login": null,
"committed_at": "2026-06-10T09:43:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "68baeda4542ff1eb29a8b41937ce8b5c91dedc54",
"body": "A choice-less chunk (choices:[] + usage) is the gateway's include_usage final frame; forward its real token counts so LiteLLM bills off them instead of re-estimating with tiktoken (~37% drift). Works past LiteLLM's post-finish-reason guard because _to_generic_chunk always emits the provider_specific_fields key — locked in by tests/test_stream_usage.py (unit + end-to-end CustomStreamWrapper + guard canary).\n\nCloses #2. Pairs with the gateway change (blockrun-sol #20 / blockrun #137).",
"is_bot": false,
"headline": "fix(stream): forward the end-of-stream usage frame to LiteLLM",
"author_name": "Killer Queen",
"author_login": "KillerQueen-Z",
"committed_at": "2026-06-10T09:38:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a0d840a963f4d1845a6205302567eaba1c15a754",
"body": "…t Completions\n\nLiteLLM clients calling /v1/responses got a 404 (only /v1/chat/completions was\nimplemented), surfacing as litellm.NotFoundError. Add a /v1/responses endpoint\nthat translates a Responses request (input string or item list, instructions,\ntemperature/top_p/max_output_tokens/tools) into \n[…]\nam=True.\nText-in/text-out is fully bridged; Responses-only state isn't round-tripped.\n\nNew tests/test_responses.py (5 tests); full suite 61 passed. README endpoint\ntable updated. Bump 0.3.10 → 0.3.11.",
"is_bot": false,
"headline": "feat(proxy): bridge the OpenAI Responses API (/v1/responses) onto Cha…",
"author_name": "1bcMax",
"author_login": null,
"committed_at": "2026-06-02T03:17:05Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "328dd20be149094055db9e4eae5a45cae22fd7a6",
"body": "…fe Solana payments) + native fingerprint passthrough + flagship model-id alignment",
"is_bot": false,
"headline": "chore(release): 0.3.10 — require blockrun-llm>=0.37.0 (concurrency-sa…",
"author_name": "1bcMax",
"author_login": null,
"committed_at": "2026-06-02T02:59:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0eb5db545993e646fefb4086a577f2ee38f0455c",
"body": "The proxy shares one cached SDK client across concurrent requests; 0.37.0's\nper-client signing lock + whole-request payment retry make that shared client\nreliable under load (~100% concurrent single-wallet success). No proxy code change.",
"is_bot": false,
"headline": "deps: require blockrun-llm>=0.37.0 for concurrency-safe Solana payments",
"author_name": "1bcMax",
"author_login": null,
"committed_at": "2026-06-02T01:44:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b60349338b107888e72a2b05dcda4273f61636f9",
"body": "…ip model ids\n\nGuarantee that the upstream relay-detection signals (system_fingerprint,\nservice_tier, usage cache/token details, reasoning_content) survive both\nintegration modes, and lock the contract with regression tests so a future\nLiteLLM / blockrun-llm bump can't silently strip them.\n\n- provid\n[…]\nross config/docs/examples/tests:\n anthropic/claude-opus-4-5 -> -4-7, google/gemini-3-pro -> gemini-3.1-pro\n (gpt-5.5 unchanged). New README \"Native fingerprint passthrough\" section.\n\n56 tests green.",
"is_bot": false,
"headline": "feat(fingerprint): preserve native passthrough signals + align flagsh…",
"author_name": "1bcMax",
"author_login": null,
"committed_at": "2026-06-01T18:35:10Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "7204b435b8a41b0394c06d7a77dda2e03efa566e",
"body": "…v0.3.9\n\nWhen blockrun-llm (>=0.32.0) raises a PaymentError carrying the\ngateway's original failure JSON (e.g.\n{\"error\": \"Payment settlement failed\",\n \"details\": \"transaction_simulation_failed\"}),\nthe sidecar used to return a flat\n{\"detail\": \"Payment rejected. Check your Solana USDC balance.\"}\non bo\n[…]\ndded 0.3.9 for these changes.\n\nTests: +6 (payload preservation, SSE message folding, backwards-compat\nfor pre-0.32 PaymentError without kwargs, defensive non-string filter).\nAll 47 sidecar tests pass.",
"is_bot": false,
"headline": "fix(proxy): surface gateway 402 details + retroactively log v0.3.8 — …",
"author_name": "1bcMax",
"author_login": null,
"committed_at": "2026-05-29T04:33:23Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "99cb64d1b4b36b4636a0cd070486103e5388b02b",
"body": "get_image_client() was returning the EVM-only ImageClient regardless of\napi_url. Solana image requests therefore signed EIP-712 payments and\ncrashed at x402 settlement with transaction_simulation_failed.\n\n- get_image_client() now branches on _is_solana_url(api_url), mirroring\n get_sync_client() / g\n[…]\np blockrun-llm dependency to >=0.31.1 (sync extras + solana extras).\n- Tests: 4 new cases cover Solana routing, Base-still-ImageClient,\n missing-[solana]-extra ImportError, and the .image() dispatch.",
"is_bot": false,
"headline": "fix(image): route Solana image generation to SolanaLLMClient — v0.3.8",
"author_name": "1bcMax",
"author_login": null,
"committed_at": "2026-05-28T03:25:56Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "78cac70830b20beb8ac8898085cbc6ba32ae57e6",
"body": "Solana JSON-RPC errors during x402 payment signing (e.g. getAccountInfo\ntransient failures) were producing full tracebacks via log.exception.\nCatch SolanaRpcException explicitly, log at WARNING level with the RPC\nerror message only, and return 503 to the client instead of 500.\n\nThe import is optional so the proxy works without solana-py installed.",
"is_bot": false,
"headline": "fix: suppress noisy SolanaRpcException tracebacks in proxy log",
"author_name": "1bcMax",
"author_login": null,
"committed_at": "2026-05-22T16:57:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "21e9a198c95fd9f8c521deb1f20ba135b5bbaa1c",
"body": "Three changes to dramatically improve concurrent throughput:\n\n1. Default BLOCKRUN_MAX_CONCURRENT raised from 20 → 100, aligned with\n the httpx pool capacity (200 connections ÷ 2 per paid request).\n\n2. Streaming semaphore released after first chunk: the semaphore now\n covers only the x402 probe +\n[…]\n ThreadPoolExecutor(max_workers=20)\n instead of the default unbounded pool, preventing memory exhaustion\n under high image load.\n\nDocs: added high-concurrency tuning table with --workers guidance.",
"is_bot": false,
"headline": "feat: high-concurrency improvements — v0.3.7",
"author_name": "1bcMax",
"author_login": null,
"committed_at": "2026-05-20T04:22:09Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "b5b428b207d110b46c08734884f4fb8a0b833510",
"body": "…r all image models",
"is_bot": false,
"headline": "docs: remove base64 handling notes — server now returns HTTPS URLs fo…",
"author_name": "1bcMax",
"author_login": null,
"committed_at": "2026-05-19T17:19:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "685fde4ac507e70138758b850fd6aae5ee1d360d",
"body": null,
"is_bot": false,
"headline": "docs: document nano-banana returns base64, not URL — add decode example",
"author_name": "1bcMax",
"author_login": null,
"committed_at": "2026-05-19T14:27:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "465d2003df164beddc931c6a4137ba9a8bdf73eb",
"body": "…contact CTA",
"is_bot": false,
"headline": "docs(sla): replace specific enterprise feature lists with open-ended …",
"author_name": "1bcMax",
"author_login": null,
"committed_at": "2026-05-18T23:39:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1e8cfdcb9a299a6a36f686ce567767489aef9fbc",
"body": "…ased support inbox)",
"is_bot": false,
"headline": "docs(enterprise-sla): contact email vicky@ → care@blockrun.ai (role-b…",
"author_name": "1bcMax",
"author_login": null,
"committed_at": "2026-05-18T23:38:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "178d4e28c3c29ff254d407b67e66e99bff7c1334",
"body": "…ate-limits link\n\n按用户要求把 'shared key pool / 共享 key pool / 不和共享池竞争' 这类\nimplementation 措辞改成中性的 '上游 provider 限流上限 / 专属容量'。\n同时移除指向 blockrun.ai/docs/api-reference/rate-limits 的外链\n(该公开文档暴露 implementation 细节,enterprise 客户不应被指过去)。",
"is_bot": false,
"headline": "docs(enterprise-sla): scrub 'shared key pool' wording + drop public r…",
"author_name": "1bcMax",
"author_login": null,
"committed_at": "2026-05-18T23:36:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a6fda76fe98983b524ba2584ce553dd7ad2e2757",
"body": "… remove nonexistent metrics/observatory links",
"is_bot": false,
"headline": "docs(sla): remove early-stage disclaimer, clean best-effort language,…",
"author_name": "1bcMax",
"author_login": null,
"committed_at": "2026-05-18T23:34:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5253df98a9e26dcf5eaa490525b5f4b34a426329",
"body": null,
"is_bot": false,
"headline": "docs(sla): remove 共享 key pool from rate limits table",
"author_name": "1bcMax",
"author_login": null,
"committed_at": "2026-05-18T23:33:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ba08296a274e7617f18eda3d871235536fe97d13",
"body": "ENTERPRISE-SLA.zh.md:\n- Add image model rate limits (nano-banana, dall-e-3, grok-imagine, cogview-4)\n- Add two-gateway table (blockrun.ai us-central1 / sol.blockrun.ai dual-region)\n- Split latency table: Base single-region vs Solana dual-region (asia-northeast1)\n\nCUSTOMER-ONBOARDING + README:\n- Document BLOCKRUN_MAX_CONCURRENT env var with tuning guidance",
"is_bot": false,
"headline": "docs: update ENTERPRISE-SLA + add BLOCKRUN_MAX_CONCURRENT to guides",
"author_name": "1bcMax",
"author_login": null,
"committed_at": "2026-05-18T22:32:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9ea5bc5cf40c430b84bedb4cdc439c163c6089c2",
"body": "回答 enterprise 客户三个高频问题:\n1. 限流标准 (QPS/RPM/TPM/TPH) - 平台无配额,按上游 provider 区分\n2. 部署/扩容时长 - Cloud Run 零中断,代码升级 5-10min,水平扩容 <10s\n3. SLA - 当前 best-effort,99.9% 实测;enterprise 路径可签合约级条款\n\n联系: vicky@blockrun.ai / Telegram @bc1max",
"is_bot": false,
"headline": "docs: 加 ENTERPRISE-SLA.zh.md — 限流/部署/SLA 中文问答",
"author_name": "1bcMax",
"author_login": null,
"committed_at": "2026-05-18T22:08:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fbd173c6a3673747ae00e2a86a4f7fe8c512af7b",
"body": "Exposes OpenAI-compatible image generation via the sidecar proxy.\nAccepts prompt/model/size/n, returns OpenAI ImageResponse format.\nSupports google/nano-banana, nano-banana-pro, dall-e-3, gpt-image-1/2,\ngrok-imagine, cogview-4. Runs ImageClient in a thread executor for\nasync compatibility. Caches clients per wallet/url like chat clients.\n\nDocs updated across README + all four bilingual guide files.",
"is_bot": false,
"headline": "feat(proxy): add POST /v1/images/generations endpoint (v0.3.6)",
"author_name": "1bcMax",
"author_login": null,
"committed_at": "2026-05-18T12:54:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d926e8cc73c1961122e688faf00ccfa9118492ec",
"body": "Both models verified working at 10 concurrent requests on Solana (2026-05-15).\nBump verified versions to blockrun-litellm 0.3.5 / blockrun-llm 0.24.1.",
"is_bot": false,
"headline": "docs: update model examples to claude-opus-4-7 and gemini-3.1-pro",
"author_name": "1bcMax",
"author_login": null,
"committed_at": "2026-05-15T15:25:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "facb7b7dad910ec921bdb4dc9c23411f8f783ca5",
"body": null,
"is_bot": false,
"headline": "deps: require blockrun-llm>=0.24.1 (connection pool fix)",
"author_name": "1bcMax",
"author_login": null,
"committed_at": "2026-05-15T13:41:37Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "856f527449a006aa93487976a0b6165937c7a803",
"body": "Under high concurrent load (≥100) against paid models (claude-opus-4.7 etc.),\ntwo bugs combined to produce confusing MidStreamFallbackError:\n\n1. No concurrency cap: all 100 requests simultaneously signed x402 payments\n and hit the Anthropic upstream, exhausting its TPM/RPM rate limits and\n causi\n[…]\nsed\n \"data did not match any variant of untagged enum Resp\", which LiteLLM\n wrapped as MidStreamFallbackError. Fix: new _openai_error_event() helper\n always emits the correct four-field schema.",
"is_bot": false,
"headline": "fix(proxy): cap concurrency + fix SSE error format for paid-model 500s",
"author_name": "1bcMax",
"author_login": null,
"committed_at": "2026-05-15T13:35:39Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "42e780063b13887709be16f851a09f6a2048db30",
"body": "blockrun-llm 0.24.0 switches the default Solana RPC endpoint to\nBlockRun's own Tatum-backed proxy at https://sol.blockrun.ai/api/v1/solana/rpc.\nBumping our floor so anyone upgrading the adapter gets the new\nbehavior — partners no longer have to register their own\nHelius/Tatum/QuickNode RPC account.\n\n[…]\n network=solana-mainnet client=SolanaLLMClient.\n\nBlockhash for the signing step was fetched through the new BlockRun\nproxy (sol.blockrun.ai/api/v1/solana/rpc) with no partner-side RPC\nconfig required.",
"is_bot": false,
"headline": "chore: bump SDK floor to 0.24.0; default RPC = BlockRun proxy — v0.3.4",
"author_name": "1bcMax",
"author_login": null,
"committed_at": "2026-05-14T21:02:17Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "48345e93e8b57295eaf3e1dcc54dcb4c48c06ab4",
"body": "…0.3.3\n\nSymptom: any paid Solana call through Mode B (the FastAPI sidecar)\ncrashed with\n\n EncodingTypeError: Value 'EPjFWdd5AufqSSqeM2qN1xzybapC8C4wEBmGbV4Vu5JLs'\n of type <class 'str'> cannot be encoded by AddressEncoder\n\nThat's the Solana USDC mint address (base58) reaching the EVM\nEIP-712 payme\n[…]\nne change in _adapter.py.\n\nVerified live: paid Solana via deepseek/deepseek-chat through the\nsidecar returns 200 with \"你好!😊\" instead of 500 +\nAddressEncoder traceback.\n\n37/37 adapter tests still pass.",
"is_bot": false,
"headline": "fix(critical): sidecar Solana paid requests routed to Base client — v…",
"author_name": "1bcMax",
"author_login": null,
"committed_at": "2026-05-13T13:52:52Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e845d4cc0bac100e5fce89578b8ec140735853e4",
"body": "Replaces the vague \"Solana has cheaper gas\" comparison with measured\nnumbers from 4,424 production settlement records (2026-05-10 → 05-12,\npulled from the GCS settlement audit bucket):\n\n Median settlement: Solana 106 ms vs Base 935 ms (8.8× faster)\n p90: Solana 133 ms vs Base 1,658 m\n[…]\nN docs:\n * Chain table at top: Solana row bolded with measurement\n * Decision tree: Solana annotated as ⭐ recommended\n * FAQ \"Should I pick Base or Solana?\": full data table with\n interpretation",
"is_bot": false,
"headline": "docs: ground \"pick Solana\" recommendation in real production data",
"author_name": "1bcMax",
"author_login": null,
"committed_at": "2026-05-13T00:14:52Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "306c086ccdbc71f5db3fe00b414c29c06d882770",
"body": "Adds two paired guides under docs/, in both English and Chinese:\n\n- CUSTOMER-ONBOARDING(.zh).md — 5-minute walkthrough for Mode A\n (Python lib) and Mode B (LiteLLM Proxy). Now recommends Solana\n as the default chain since 0.3.2 brought it to feature parity\n with Base (sync/async/streaming/tools) \n[…]\nrified end-to-end on 2026-05-12 (macOS, Python 3.13,\nDocker Desktop 28.4) — every command shown was actually run.\n\nREADME.md links the docs/ directory and the four entry points\nprominently at the top.",
"is_bot": false,
"headline": "docs: bilingual (EN + 中文) onboarding + full-setup guides",
"author_name": "1bcMax",
"author_login": null,
"committed_at": "2026-05-12T16:34:04Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6c35432b6d93d3c3c6b20b34bbe47804b7afbe19",
"body": "Combined with blockrun-llm 0.22.1 (which adds tools/tool_choice to\nthe Solana SDK methods), function calling now works uniformly on\nBase AND Solana.\n\nThe adapter's kwarg filter previously dropped tools/tool_choice on\nthe Solana path because the SDK didn't accept them. Removed the\nspecial case — ever\n[…]\nconnection (live, free model, no cost).\n\nTests: replaced the Solana-drops-tools assertion with one that\nverifies tools survive the filter on both chains. 37/37 pass.\n\nDependency: blockrun-llm>=0.22.1.",
"is_bot": false,
"headline": "fix: tools/tool_choice on Solana — v0.3.2",
"author_name": "1bcMax",
"author_login": null,
"committed_at": "2026-05-12T14:34:09Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "2efd158a685bfc37bee725440481279ab33f08dd",
"body": "litellm.acompletion(api_base=\"https://sol.blockrun.ai/api\") no longer\nraises NotImplementedError. The adapter routes async Solana calls to\nthe new AsyncSolanaLLMClient (blockrun-llm 0.22.0), completing the\nBase/Solana × sync/async × stream/non-stream parity matrix.\n\nAlso picks up the paid-streaming \n[…]\nthrough LiteLLM.\n\nTest: replaced the v0.3.0 NotImplementedError assertion with one\nthat verifies get_async_client returns an AsyncSolanaLLMClient\ninstance for Solana api_url. 38/38 adapter tests pass.",
"is_bot": false,
"headline": "feat: async Solana via AsyncSolanaLLMClient — v0.3.1",
"author_name": "1bcMax",
"author_login": null,
"committed_at": "2026-05-12T06:45:33Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "75d36b45fc4cd268838a9014b7f83c421f8dab09",
"body": "Adds three new sections to the top-level README:\n\n- \"Chains supported\" table — Base vs Solana, gateway URLs, env vars,\n feature parity status (sync/async/streaming).\n- \"Local request log\" — the JSONL logger from v0.2.2, with the\n default path (~/.blockrun/litellm_calls.jsonl), override mechanisms,\n[…]\n cost log,\n paid-call archive, proxy token. Makes it possible for partners to\n scan one table and know exactly what disk paths they own.\n\nAlso adds examples/custom_callbacks.py to the examples list.",
"is_bot": false,
"headline": "docs: README — Solana support, local request log section, path inventory",
"author_name": "1bcMax",
"author_login": null,
"committed_at": "2026-05-12T06:31:43Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "707d8637d2125c16800df6aa41702e045b541a4f",
"body": "The adapter dispatches between LLMClient (Base) and SolanaLLMClient\n(Solana) based on api_url. Both modes (Python library + LiteLLM\nProxy sidecar) understand both chains:\n\n Base (default):\n litellm.completion(\n model=\"blockrun/openai/gpt-5.5\",\n api_key=\"0xBASE_PRIVATE_KEY\",\n )\n\n\n[…]\n2 chunks, \"Hello! How can I\" (after one NIM\n timeout — same upstream flakiness affecting both chains)\n\nDependency: blockrun-llm>=0.21.0. New [solana] extra:\n pip install 'blockrun-litellm[solana]'",
"is_bot": false,
"headline": "feat: Solana chain support — v0.3.0",
"author_name": "1bcMax",
"author_login": null,
"committed_at": "2026-05-12T06:29:08Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "8735497f10ef617b67aaf775333823b4f2a14de7",
"body": "Adds opt-in observability for partners who want a per-request audit\ntrail without standing up Langfuse / Helicone / S3. One line in Mode A,\ntwo-file bridge in Mode B (LiteLLM Proxy loads callbacks by filename,\nnot by installed package).\n\nWhat's captured per call (one JSONL row each):\n ts, iso, mode\n[…]\n-chunk dedupe, dict-vs-pydantic response shapes, async\nhook delegation, env-var path resolution, idempotent registration,\nand the module-level proxy_logger singleton. 30/30 adapter tests\npass overall.",
"is_bot": false,
"headline": "feat: local JSONL request logger (input/output tokens, latency) — v0.2.2",
"author_name": "1bcMax",
"author_login": null,
"committed_at": "2026-05-12T06:12:40Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5be54ac9011c38af73c0aba65c10608d600792ea",
"body": "Before this change, BlockRun's APIError(503) would bubble up to\nLiteLLM's caller as a plain provider exception — the router's own\nfallback/retry machinery doesn't know it's retriable. Now we map\nthe transient cases to the LiteLLM exception hierarchy that the\nrouter treats as \"try the next provider\":\n[…]\n>=0.20.1.\n\nTests: seven new translation tests in tests/test_provider.py, plus\nreplaced the stale v0.1.0 StreamingNotSupported test with a\nkwarg-leak check for the non-streaming entrypoint. 17/17 pass.",
"is_bot": false,
"headline": "feat: translate transient errors to LiteLLM retriable types — v0.2.1",
"author_name": "1bcMax",
"author_login": null,
"committed_at": "2026-05-12T05:21:43Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "7b04c304e348f40ff0edc066e5fb7134a1c89572",
"body": "Both integration modes now speak SSE — closes the gap that was called\nout in v0.1.0's CHANGELOG.\n\nProvider mode: BlockRunLLM implements CustomLLM.streaming() and\nastreaming(), translating each blockrun-llm ChatCompletionChunk into\na LiteLLM GenericStreamingChunk. litellm.completion(model=\"blockrun/.\n[…]\nnt.**\"\n\nREADME + CHANGELOG updated; the parameter table flips from\nstream:❌ to stream:✅ in both EN and CN sections, and the FAQ entry\nnow describes the working flow instead of the previous limitation.",
"is_bot": false,
"headline": "feat: end-to-end streaming (provider + proxy) — v0.2.0",
"author_name": "1bcMax",
"author_login": null,
"committed_at": "2026-05-12T04:58:14Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "a4001ba4ae7cf1ed9a83df1f69ff6959965af457",
"body": "…side\n\nEarlier copy in README + CHANGELOG claimed streaming was unsupported\nbecause \"x402 settles per-request, so SSE is not wired.\" That was\nwrong on both counts:\n\n- BlockRun's /v1/chat/completions backend has full SSE support today\n (text/event-stream, both free and paid tiers — see route.ts:893+\n[…]\n blockrun-llm Python SDK client side: it does\nnot yet parse text/event-stream chunks. README + CHANGELOG now say\nso. Implementation in the SDK and propagation through this adapter\nwill land in v0.2.0.",
"is_bot": false,
"headline": "docs: correct the streaming \"why\" — gateway supports SSE, gap is SDK-…",
"author_name": "1bcMax",
"author_login": null,
"committed_at": "2026-05-11T23:50:28Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "92f6362cdb89e63fe0315d967f1d8bfbb1577b79",
"body": "Now that v0.1.0 is live on PyPI and both modes have been validated\nagainst the production BlockRun gateway, surface that in README +\nCHANGELOG:\n\n- README header: PyPI / Python / License badges\n- README: new \"Verified end-to-end\" section with the actual pong and\n proxy-ok transcripts from the live gateway (free model)\n- CHANGELOG: add Verified section and the PyPI URL; note the pydantic\n serializer warning we observed during e2e (functionally harmless)",
"is_bot": false,
"headline": "docs: add PyPI badge + verified e2e evidence",
"author_name": "1bcMax",
"author_login": null,
"committed_at": "2026-05-11T19:33:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b9ac3b6b212ffa83aa021edc30610c94b88f97fd",
"body": "Strip every \"testnet\"/\"Base Sepolia\" mention from the README, the proxy\nCLI help, and the test fixture URLs. Recommend the free\nnvidia/deepseek-v4-flash model instead for cheap validation on mainnet.\n\nThe underlying blockrun-llm SDK still exposes testnet_client() — left\nalone, but not surfaced through this adapter or its docs.",
"is_bot": false,
"headline": "docs: remove testnet references — BlockRun is mainnet-only",
"author_name": "1bcMax",
"author_login": null,
"committed_at": "2026-05-11T19:21:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4e733c5ea9d0986e98de9cc19d073fbc360e7d55",
"body": "LiteLLM adapter for BlockRun (x402-paid AI gateway). Two integration modes\nship in this release:\n\n1. Custom provider — register the `blockrun` provider in\n `litellm.custom_provider_map` and call `litellm.completion(model=\n \"blockrun/openai/gpt-5.5\", ...)` from any LiteLLM Python app.\n\n2. Local O\n[…]\n needs a wallet.\n\nKnown limitations called out in CHANGELOG.md: stream=True returns 400,\nSolana wallet path not yet wired, only /v1/chat/completions exposed by\nthe proxy (image/video/music to follow).",
"is_bot": false,
"headline": "Initial release: blockrun-litellm v0.1.0",
"author_name": "1bcMax",
"author_login": null,
"committed_at": "2026-05-11T19:15:47Z",
"body_truncated": true,
"is_coding_agent": false
}
],
"releases_count": 0,
"commits_last_year": 67,
"latest_release_at": null,
"latest_release_tag": null,
"releases_from_tags": false,
"days_since_last_push": 0,
"active_weeks_last_year": 10,
"days_since_latest_release": null,
"mean_days_between_releases": null
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": false,
"health_percentage": 50,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": [
{
"name": "blockrun-litellm",
"exists": true,
"license": "MIT",
"keywords": [
"ai-gateway",
"blockrun",
"litellm",
"llm-proxy",
"openai",
"openrouter",
"x402",
"Development Status :: 3 - Alpha",
"Intended Audience :: Developers",
"License :: OSI Approved :: MIT License",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.9",
"Topic :: Software Development :: Libraries :: Python Modules"
],
"ecosystem": "pypi",
"matches_repo": true,
"registry_url": "https://pypi.org/project/blockrun-litellm/",
"is_deprecated": false,
"latest_version": "0.8.0",
"repository_url": "https://github.com/BlockRunAI/blockrun-litellm",
"versions_count": 32,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": null,
"first_published_at": "2026-05-11T19:31:45.613316Z",
"latest_published_at": "2026-07-22T20:57:12.139297Z",
"latest_version_yanked": null,
"days_since_latest_publish": 0
}
]
},
"popularity": {
"forks": 1,
"stars": 0,
"watchers": 0,
"fork_history": {
"days": [
{
"date": "2026-05-29",
"count": 1
}
],
"complete": true,
"collected": 1,
"total_forks": 1
},
"star_history": {
"days": [],
"complete": true,
"collected": 0,
"total_stars": 0,
"collected_at": null
},
"open_issues_and_prs": 0
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [
"examples"
],
"has_llms_txt": false,
"has_dockerfile": false,
"has_mcp_signal": false,
"bootstrap_files": [],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [],
"toolchain_manifests": [],
"largest_source_bytes": 86558,
"source_files_sampled": 31,
"oversized_source_files": 1,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"dependencies": {
"manifests": [
"pyproject.toml"
],
"advisories": {
"error": null,
"scope": null,
"source": null,
"findings": [],
"collected": false,
"malicious": [],
"truncated": false,
"by_severity": {},
"advisory_count": 0,
"affected_count": 0,
"assessed_count": 0,
"malicious_count": 0,
"assessed_package": null,
"unassessed_count": 0,
"direct_affected_count": 0
},
"ecosystems": [
"pypi"
],
"dependencies": [
{
"name": "blockrun-llm",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=1.7.0"
},
{
"name": "litellm",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=1.40.0"
}
],
"all_dependencies": {
"error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
"source": null,
"packages": [],
"collected": false,
"truncated": false,
"total_count": null,
"direct_count": null,
"indirect_count": null
}
},
"maintainership": {
"issues": {
"open_prs": 0,
"merged_prs": 21,
"open_issues": 0,
"closed_ratio": 1,
"closed_issues": 2,
"closed_unmerged_prs": 3
},
"bus_factor": 1,
"bot_contributors": 0,
"top_contributors": [
{
"type": "User",
"login": "VickyXAI",
"commits": 11,
"avatar_url": "https://avatars.githubusercontent.com/u/115643921?v=4"
},
{
"type": "User",
"login": "KillerQueen-Z",
"commits": 10,
"avatar_url": "https://avatars.githubusercontent.com/u/141758865?v=4"
}
],
"contributors_sampled": 2,
"top_contributor_share": 0.524
},
"quality_signals": {
"has_ci": false,
"has_tests": true,
"ci_workflows": [],
"has_docs_dir": true,
"linter_configs": [],
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [],
"scorecard": {
"checks": [
{
"name": "Binary-Artifacts",
"score": 10,
"reason": "no binaries found in the repo",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
},
{
"name": "Branch-Protection",
"score": 0,
"reason": "branch protection not enabled on development/release branches",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
},
{
"name": "CI-Tests",
"score": 0,
"reason": "0 out of 20 merged PRs checked by a CI test -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
},
{
"name": "CII-Best-Practices",
"score": 0,
"reason": "no effort to earn an OpenSSF best practices badge detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
},
{
"name": "Code-Review",
"score": 3,
"reason": "Found 9/29 approved changesets -- score normalized to 3",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 3,
"reason": "project has 1 contributing companies or organizations -- score normalized to 3",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
},
{
"name": "Dangerous-Workflow",
"score": null,
"reason": "no workflows found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
},
{
"name": "Dependency-Update-Tool",
"score": 0,
"reason": "no update tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
},
{
"name": "Fuzzing",
"score": 0,
"reason": "project is not fuzzed",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
},
{
"name": "License",
"score": 10,
"reason": "license file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
},
{
"name": "Maintained",
"score": 0,
"reason": "project was created within the last 90 days. Please review its contents carefully",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
},
{
"name": "Packaging",
"score": null,
"reason": "packaging workflow not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
},
{
"name": "Pinned-Dependencies",
"score": null,
"reason": "no dependencies found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 0,
"reason": "SAST tool is not run on all commits -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
},
{
"name": "Security-Policy",
"score": 0,
"reason": "security policy file not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
},
{
"name": "Signed-Releases",
"score": null,
"reason": "no releases found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
},
{
"name": "Token-Permissions",
"score": null,
"reason": "No tokens found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
},
{
"name": "Vulnerabilities",
"score": 10,
"reason": "0 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "d7c0c8e0bcee76dd997e97299a031ba87f98f03c",
"ran_at": "2026-07-22T21:04:05Z",
"aggregate_score": 2.9,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": false,
"has_dependabot_config": false
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": "2026-07-22T20:49:10Z",
"oldest_open_prs": [],
"last_merged_pr_at": "2026-07-22T20:49:08Z",
"ci_last_conclusion": null,
"oldest_open_issues": []
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/BlockRunAI/blockrun-litellm",
"host": "github.com",
"name": "blockrun-litellm",
"owner": "BlockRunAI"
},
"metrics": {
"overall": {
"key": "overall",
"band": "at_risk",
"name": "Overall health",
"note": null,
"notes": [],
"value": 42,
"inputs": {
"security": 29,
"vitality": 36,
"community": 24,
"governance": 64,
"engineering": 48
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "at_risk",
"name": "Vitality",
"value": 36,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "moderate",
"name": "Development activity",
"note": null,
"notes": [],
"value": 59,
"inputs": {
"commits_last_year": 67,
"human_commit_share": 1,
"days_since_last_push": 0,
"active_weeks_last_year": 10
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 0 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "push_recency",
"params": {
"days": 0
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "10/52 weeks with commits",
"points": 6.9,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 10
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "67 commits in the last year",
"points": 16.5,
"status": "partial",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 67
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "project was created within the last 90 days. Please review its contents carefully",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "critical",
"name": "Release discipline",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 1,
"inputs": {
"releases_count": 0
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "no releases published",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_releases_published",
"params": {}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "no releases",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_releases",
"params": {}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "no releases",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_releases",
"params": {}
}
],
"max_points": 27
},
{
"key": "openssf_scorecard_signed_releases",
"name": "OpenSSF Scorecard: Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
}
]
},
{
"key": "abandonment",
"band": "excellent",
"name": "Abandonment",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"cap": null,
"state": "unverified",
"guards": [],
"signals": [],
"red_flag": false,
"multiplier_pct": 100,
"declared_reason": null,
"unverified_reason": "repository_too_young",
"unanswered_open_prs": null,
"unanswered_open_issues": null,
"days_since_last_merged_pr": null,
"days_since_last_human_commit": null,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "maintenance record not established from the collected data",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_unverified",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "critical",
"name": "Community & Adoption",
"value": 24,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "critical",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 1,
"inputs": {
"forks": 1,
"stars": 0,
"watchers": 0,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "0 stars",
"points": 0,
"status": "missed",
"details": [
{
"code": "stars",
"params": {
"count": 0
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "1 forks",
"points": 0,
"status": "missed",
"details": [
{
"code": "forks",
"params": {
"count": 1
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "0 watchers",
"points": 0,
"status": "missed",
"details": [
{
"code": "watchers",
"params": {
"count": 0
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "moderate",
"name": "Community health",
"note": null,
"notes": [],
"value": 50,
"inputs": {
"has_readme": true,
"has_license": true,
"has_contributing": false,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 22.5,
"status": "met",
"details": [],
"max_points": 22.5
},
{
"key": "license",
"name": "License",
"detail": "recognized license (MIT)",
"points": 22.5,
"status": "met",
"details": [
{
"code": "license_standard",
"params": {}
},
{
"code": "license_spdx",
"params": {
"spdx": "MIT"
}
}
],
"max_points": 22.5
},
{
"key": "contributing_guide",
"name": "CONTRIBUTING guide",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 18
},
{
"key": "code_of_conduct",
"name": "Code of conduct",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 13.5
},
{
"key": "issue_template",
"name": "Issue template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.2
},
{
"key": "pr_template",
"name": "PR template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.3
}
]
}
],
"description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
},
{
"key": "governance",
"band": "moderate",
"name": "Sustainability & Governance",
"value": 64,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 25,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 2,
"top_contributor_share": 0.524
},
"components": [
{
"key": "bus_factor",
"name": "Bus factor",
"detail": "1 contributor(s) cover half of all commits",
"points": 9,
"status": "partial",
"details": [
{
"code": "bus_factor",
"params": {
"count": 1
}
}
],
"max_points": 54
},
{
"key": "commit_distribution",
"name": "Commit distribution",
"detail": "top contributor authored 52% of commits",
"points": 10.7,
"status": "partial",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 52
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "2 contributors",
"points": 2.7,
"status": "partial",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 2
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 1 contributing companies or organizations -- score normalized to 3",
"points": 3,
"status": "partial",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "excellent",
"name": "Issue & PR responsiveness",
"note": null,
"notes": [],
"value": 85,
"inputs": {
"merged_prs": 21,
"open_issues": 0,
"closed_issues": 2,
"issue_closed_ratio": 1,
"closed_unmerged_prs": 3
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "100% of issues closed",
"points": 46.8,
"status": "met",
"details": [
{
"code": "issues_closed_share",
"params": {
"share": 100
}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "21/24 decided PRs merged",
"points": 33.5,
"status": "partial",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 21,
"decided": 24
}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 9/29 approved changesets -- score normalized to 3",
"points": 4.5,
"status": "partial",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "moderate",
"name": "Ownership & stewardship",
"note": null,
"notes": [],
"value": 60,
"inputs": {
"followers": 252,
"owner_type": "Organization",
"is_verified": null,
"owner_login": "BlockRunAI",
"public_repos": 37,
"account_age_days": 212
},
"components": [
{
"key": "ownership_backing",
"name": "Ownership backing",
"detail": "organization-owned",
"points": 30,
"status": "met",
"details": [
{
"code": "owner_organization",
"params": {}
}
],
"max_points": 30
},
{
"key": "verified_domain",
"name": "Verified domain",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 20
},
{
"key": "owner_reach",
"name": "Owner reach",
"detail": "252 followers of BlockRunAI",
"points": 17.3,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 252,
"login": "BlockRunAI"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "37 public repos, account ~0 yr old",
"points": 12.7,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 37
}
},
{
"code": "account_age_years",
"params": {
"years": 0
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"packages": [
"blockrun-litellm"
],
"ecosystems": "pypi",
"any_deprecated": false,
"min_days_since_publish": 0
},
"components": [
{
"key": "published_resolvable",
"name": "Published & resolvable",
"detail": "1 package(s) on pypi",
"points": 25,
"status": "met",
"details": [
{
"code": "packages_published",
"params": {
"count": 1,
"ecosystems": "pypi"
}
}
],
"max_points": 25
},
{
"key": "publish_recency",
"name": "Publish recency",
"detail": "latest publish 0 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 0
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "32 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 32
}
}
],
"max_points": 20
},
{
"key": "not_deprecated",
"name": "Not deprecated",
"detail": "active, not deprecated or yanked",
"points": 20,
"status": "met",
"details": [
{
"code": "package_not_deprecated",
"params": {}
}
],
"max_points": 20
}
]
}
],
"description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
},
{
"key": "engineering",
"band": "at_risk",
"name": "Engineering Quality",
"value": 48,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "critical",
"name": "Engineering practices",
"note": null,
"notes": [],
"value": 24,
"inputs": {
"has_ci": false,
"has_tests": true,
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"components": [
{
"key": "ci_workflows",
"name": "CI workflows",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 24
},
{
"key": "tests_present",
"name": "Tests present",
"detail": null,
"points": 24,
"status": "met",
"details": [],
"max_points": 24
},
{
"key": "linter_config",
"name": "Linter config",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 16
},
{
"key": "pre_commit_hooks",
"name": "Pre-commit hooks",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 9.6
},
{
"key": "editorconfig",
"name": ".editorconfig",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.4
},
{
"key": "openssf_scorecard_ci_tests",
"name": "OpenSSF Scorecard: CI-Tests",
"detail": "0 out of 20 merged PRs checked by a CI test -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "excellent",
"name": "Documentation",
"note": null,
"notes": [],
"value": 85,
"inputs": {
"topics": [
"ai-gateway",
"base-chain",
"blockrun",
"litellm",
"llm-proxy",
"micropayments",
"openai-compatible",
"python",
"usdc",
"x402"
],
"has_wiki": true,
"homepage": null,
"has_readme": true,
"has_docs_dir": true,
"has_description": true
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 30,
"status": "met",
"details": [],
"max_points": 30
},
{
"key": "documentation_directory",
"name": "Documentation directory",
"detail": null,
"points": 25,
"status": "met",
"details": [],
"max_points": 25
},
{
"key": "documentation_homepage_site",
"name": "Documentation / homepage site",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "repository_description",
"name": "Repository description",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "topics",
"name": "Topics",
"detail": "10 topics",
"points": 10,
"status": "met",
"details": [
{
"code": "topics_count",
"params": {
"count": 10
}
}
],
"max_points": 10
},
{
"key": "wiki",
"name": "Wiki",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
}
],
"description": "Are baseline engineering and documentation practices in place?"
},
{
"key": "security",
"band": "critical",
"name": "Security",
"value": 29,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "critical",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): Dangerous-Workflow, Packaging, Pinned-Dependencies, Signed-Releases, Token-Permissions. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"dangerous_workflow",
"packaging",
"pinned_dependencies",
"signed_releases",
"token_permissions"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 29,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 13,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 5,
"scorecard_aggregate": 2.9
},
"components": [
{
"key": "binary_artifacts",
"name": "Binary-Artifacts",
"detail": "no binaries found in the repo",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "branch_protection",
"name": "Branch-Protection",
"detail": "branch protection not enabled on development/release branches",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "0 out of 20 merged PRs checked by a CI test -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "cii_best_practices",
"name": "CII-Best-Practices",
"detail": "no effort to earn an OpenSSF best practices badge detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "code_review",
"name": "Code-Review",
"detail": "Found 9/29 approved changesets -- score normalized to 3",
"points": 2.2,
"status": "partial",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 1 contributing companies or organizations -- score normalized to 3",
"points": 0.8,
"status": "partial",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no workflows found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
},
{
"key": "dependency_update_tool",
"name": "Dependency-Update-Tool",
"detail": "no update tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "fuzzing",
"name": "Fuzzing",
"detail": "project is not fuzzed",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "license",
"name": "License",
"detail": "license file detected",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "maintained",
"name": "Maintained",
"detail": "project was created within the last 90 days. Please review its contents carefully",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "packaging",
"name": "Packaging",
"detail": "packaging workflow not detected",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 5
},
{
"key": "pinned_dependencies",
"name": "Pinned-Dependencies",
"detail": "no dependencies found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "SAST tool is not run on all commits -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "security_policy",
"name": "Security-Policy",
"detail": "security policy file not detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "signed_releases",
"name": "Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "token_permissions",
"name": "Token-Permissions",
"detail": "No tokens found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "vulnerabilities",
"name": "Vulnerabilities",
"detail": "0 existing vulnerabilities detected",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
}
]
},
{
"key": "high_risk_jurisdiction_exposure",
"band": "excellent",
"name": "High-Risk Jurisdiction Exposure",
"note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
"notes": [
{
"code": "jurisdiction_evidence_limits",
"params": {}
}
],
"value": 100,
"inputs": {
"meaning": "self-published location evidence; not nationality or citizenship",
"red_flag": false,
"exposures": [],
"policy_countries": [
"Russia",
"Iran",
"North Korea"
],
"review_only_matches": 0,
"assessed_self_published_locations": 1
},
"components": [
{
"key": "policy_exposure_multiplier",
"name": "Policy exposure multiplier",
"detail": "no confirmed policy-scope location match",
"points": 100,
"status": "met",
"details": [
{
"code": "jurisdiction_no_match",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
},
{
"key": "ai_readiness",
"band": "at_risk",
"name": "AI Readiness",
"value": 36,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "at_risk",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 1,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "no CLAUDE.md / AGENTS.md / editor rules",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_agent_instructions",
"params": {}
}
],
"max_points": 45
},
{
"key": "machine_readable_docs_llms_txt",
"name": "Machine-readable docs (llms.txt)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "legible_commit_history",
"name": "Legible commit history",
"detail": "68 of 68 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 68,
"sampled": 68
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "critical",
"name": "Verify loop (build / test / typecheck)",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Pinned-Dependencies. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_pinned_dependencies"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 24,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [],
"has_dockerfile": false,
"typed_language": false,
"bootstrap_files": [],
"has_devcontainer": false,
"has_linter_config": false,
"typecheck_configs": [],
"agent_commit_share": 0,
"toolchain_manifests": [],
"dependency_bot_commit_share": 0
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 18
},
{
"key": "automated_tests",
"name": "Automated tests",
"detail": null,
"points": 22,
"status": "met",
"details": [],
"max_points": 22
},
{
"key": "lint_format_config",
"name": "Lint / format config",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 11
},
{
"key": "static_type_checking",
"name": "Static type checking",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "no agent-authored commits among the last 68",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_agent_authored_commits",
"params": {
"sampled": 68
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "no automated dependency updates observed",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_dependency_automation",
"params": {}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "no dependencies found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "moderate",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 53,
"inputs": {
"primary_language": "Python",
"largest_source_bytes": 86558,
"source_files_sampled": 31,
"oversized_source_files": 1
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "Python without a type-check config",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_typecheck_config_language",
"params": {
"language": "Python"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "1/31 source files over 60KB",
"points": 53.2,
"status": "partial",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 31,
"oversized": 1
}
}
],
"max_points": 55
}
]
},
{
"key": "ai_interfaces",
"band": "at_risk",
"name": "Machine-readable interfaces",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"example_dirs": [
"examples"
],
"has_mcp_signal": false,
"api_schema_files": []
},
"components": [
{
"key": "api_schema_openapi_graphql_proto",
"name": "API schema (OpenAPI/GraphQL/proto)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 40
},
{
"key": "mcp_server",
"name": "MCP server",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 20
},
{
"key": "runnable_examples",
"name": "Runnable examples",
"detail": "examples",
"points": 40,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "examples"
}
}
],
"max_points": 40
}
]
}
],
"description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
}
],
"metrics_version": "1.13.0"
},
"warnings": [
"GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
"deps.dev does not index pypi:blockrun-litellm@0.8.0; advisories assessed against the repository dependency graph instead"
],
"report_type": "repository",
"generated_at": "2026-07-22T21:04:18.758135Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/b/BlockRunAI/blockrun-litellm.svg",
"full_name": "BlockRunAI/blockrun-litellm",
"license_state": "standard",
"license_spdx": "MIT"
}