公开记录
软件健康报告模式 0.27.0 · 指标 1.13.0 · 2026-07-22 21:04 UTC

BlockRunAI / blockrun-litellm

LiteLLM adapter for BlockRun — call x402-paid AI models through LiteLLM (custom provider or local OpenAI-compatible proxy)

PythonMIT★ 0 星标⑂ 1 复刻始于 2026年5月在 GitHub 上查看 ↗

BlockRunAI/blockrun-litellm 的健康指数为 100 分中的 42 分,处于「存在风险」区间。 其得分最高的类别是Sustainability & Governance(64/100),最低的是Community & Adoption(24/100)。 最近一次更新在今天。 近期的大部分工作由 1 位贡献者完成。

42
总分 / 100
存在风险

软件健康指数

指标归入加权类别,统一采用 1–100 量表。总体分先取类别加权平均;当公开证据触发高风险司法辖区政策时,评级会按政策调整,并设置 49(有风险)的上限。AI 就绪度不计入总体分。

42
优秀85-100堪称典范;基本满足所有检验标准
良好70-84健康;仅有轻微不足
中等50-69可接受,但存在明显不足;建议进行审查
存在风险30-49存在重大薄弱环节;采用时应保持审慎
危急1-29问题严重(项目被弃置、仅有单一维护者、缺乏基本工程规范)
活力社区与采用可持续性与治理工程质量安全AI 就绪度

评分画像

每条轴代表一个类别。形状比平均值更重要——健康的对象会填满整个图形,而“一峰一谷”式画像意味着某一维度的优势正掩盖另一维度的风险。

所有权

252 关注者37 个公开仓库始于 2025年12月

该仓库由组织支持——共同承担、可问责的托管责任,可延续于任何单一维护者之后。

软件包生态系统

注册表软件包版本月下载量版本数最近发布标签
PyPIblockrun-litellm0.8.0-320 天前ai-gatewayblockrunlitellmllm-proxyopenaiopenrouterx402

按类别列示的指标

活力

项目是否仍有生命——是否仍在编写代码,是否仍在发布版本?

36存在风险 · 占总体的 22%
评分方式
36/36推送新近度 — 最近一次推送于 0 天前
6.9/36提交节奏 — 52 周中有 10 周有提交
16.5/18提交量 — 最近一年 67 次提交
0/10OpenSSF Scorecard:Maintained — project was created within the last 90 days. Please review its contents carefully
所用输入
commits_last_year67
human_commit_share1
days_since_last_push0
active_weeks_last_year10
评分方式
0/27有发布版本 — 未发布任何发布版本
0/36发布时效 — 没有发布版本
0/27发布节奏 — 没有发布版本
0/10OpenSSF Scorecard:Signed-Releases — 无数据
所用输入
releases_count0
已排除计分(无数据或不适用):OpenSSF Scorecard:Signed-Releases。 其余权重已重新归一化。

社区与采用

项目是否拥有用户、下载量与关注度,并具备欢迎贡献者参与的配置?

24危急 · 占总体的 18%
评分方式
0/60星标 — 0 个星标
0/25复刻 — 1 个复刻
0/15关注者 — 0 位关注者
所用输入
forks1
stars0
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history

社区健康

50中等
评分方式
22.5/22.5README
22.5/22.5许可证 — 可识别的许可证(MIT)
0/18CONTRIBUTING 指南
0/13.5行为准则
0/7.2议题模板
0/6.3PR 模板
所用输入
has_readme
has_license
has_contributing
has_issue_template
has_code_of_conduct
has_pull_request_template

可持续性与治理

项目能否在其成员之外延续——巴士系数、响应能力、由谁支持,以及软件包的维护状况?

64中等 · 占总体的 24%
评分方式
9/54巴士系数 — 1 位贡献者贡献了半数提交
10.7/22.5提交分布 — 头号贡献者编写了 52% 的提交
2.7/13.5贡献者广度 — 2 位贡献者
3/10OpenSSF Scorecard:Contributors — project has 1 contributing companies or organizations -- score normalized to 3
所用输入
bus_factor1
contributors_sampled2
top_contributor_share0.524
评分方式
46.8/46.8议题解决 — 100% 的议题已关闭
33.5/38.3PR 接受 — 已裁定的 PR 中 21/24 已合并
4.5/15OpenSSF Scorecard:Code-Review — Found 9/29 approved changesets -- score normalized to 3
所用输入
merged_prs21
open_issues0
closed_issues2
issue_closed_ratio1
closed_unmerged_prs3
评分方式
30/30所有权背书 — 组织持有
0/20已验证域名
17.3/25所有者影响力 — BlockRunAI 有 252 位关注者
12.7/25既往记录 — 37 个公开仓库,账户约 0 年
所用输入
followers252
owner_typeOrganization
is_verified
owner_loginBlockRunAI
public_repos37
account_age_days212
评分方式
25/25已发布且可解析 — pypi 上有 1 个软件包
35/35发布时效 — 最近一次发布于 0 天前
20/20版本历史 — 32 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packagesblockrun-litellm
ecosystemspypi
any_deprecated
min_days_since_publish0

工程质量

基础的工程与文档实践是否到位?

48存在风险 · 占总体的 20%

工程实践

24危急
评分方式
0/24CI 工作流
24/24存在测试
0/16Linter 配置
0/9.6Pre-commit 钩子
0/6.4.editorconfig
0/20OpenSSF Scorecard:CI-Tests — 0 out of 20 merged PRs checked by a CI test -- score normalized to 0
所用输入
has_ci
has_tests
has_editorconfig
has_linter_config
has_precommit_config

文档

85优秀
评分方式
30/30README
25/25文档目录
0/15文档 / 主页站点
10/10仓库描述
10/10主题标签 — 10 个主题标签
10/10Wiki
所用输入
topicsai-gateway, base-chain, blockrun, litellm, llm-proxy, micropayments, openai-compatible, python, usdc, x402
has_wiki
homepage
has_readme
has_docs_dir
has_description

安全

可见的安全与供应链实践是否稳固,且不存在未解决的高风险司法辖区暴露?

29危急 · 占总体的 16%

安全态势

29危急
评分方式
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0/2.5CI-Tests — 0 out of 20 merged PRs checked by a CI test -- score normalized to 0
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
2.2/7.5Code-Review — Found 9/29 approved changesets -- score normalized to 3
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
0/10Dangerous-Workflow — 无数据
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5许可证 — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
0/5Packaging — 无数据
0/5Pinned-Dependencies — 无数据
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — 无数据
0/7.5Token-Permissions — 无数据
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
所用输入
sourceopenssf_scorecard
checks_evaluated13
scorecard_versionv5.5.0
checks_inconclusive5
scorecard_aggregate2.9
已排除计分(无数据或不适用):dangerous_workflow, packaging, pinned_dependencies, signed_releases, token_permissions。 其余权重已重新归一化。

AI 就绪度

该仓库在多大程度上具备与 AI 编码代理协同开发与维护的条件?这是一枚独立的实验性徽章——权重为 0.0,因此单独呈现,不影响总体健康评分。

36存在风险 · 占总体的 0%
评分方式
0/45代理指令 — 没有 CLAUDE.md / AGENTS.md / 编辑器规则
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 68 次人类提交中有 68 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share1
agent_instruction_files
agent_instruction_max_bytes
评分方式
0/18一条命令的引导启动
22/22自动化测试
0/11Lint / 格式化配置
0/11静态类型检查
0/10可复现环境
0/10已体现的代理实践 — 最近 68 次提交中没有代理编写的提交
0/8自动化维护 — 未观察到自动依赖更新
0/10OpenSSF Scorecard:Pinned-Dependencies — 无数据
所用输入
has_nix
has_tests
lockfiles
has_dockerfile
typed_language
bootstrap_files
has_devcontainer
has_linter_config
typecheck_configs
agent_commit_share0
toolchain_manifests
dependency_bot_commit_share0
已排除计分(无数据或不适用):OpenSSF Scorecard:Pinned-Dependencies。 其余权重已重新归一化。
评分方式
0/45可类型检查的代码 — Python,未配置类型检查
53.2/55可控的文件大小 — 采样的 31 个源文件中有 1 个超过 60KB
所用输入
primary_languagePython
largest_source_bytes86,558
source_files_sampled31
oversized_source_files1

机器可读接口

40存在风险
评分方式
0/40API 模式(OpenAPI/GraphQL/proto)
0/20MCP 服务器
40/40可运行示例 — examples
所用输入
example_dirsexamples
has_mcp_signal
api_schema_files

关键数据

0GitHub 星标
2贡献者
67最近 12 个月提交数
0距最近推送天数
0发布版本数
1巴士系数(bus factor)
0开放议题
PyPI软件包生态系统数

数据采集警告

  • 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

更多细节

OpenSSF Scorecard 2.9 / 10
2.9综合

来自开源项目 OpenSSF Scorecard 的独立、工具无关的安全评估。每项检查奖励的是安全实践本身,而非特定供应商的工具。Scorecard 无法判定的检查项标记为 不适用,并从安全评分中剔除(绝不按零分计)。Scorecard v5.5.0 · 2026-07-22 21:04 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
0CI-Tests0 out of 20 merged PRs checked by a CI test -- score normalized to 0
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
3Code-ReviewFound 9/29 approved changesets -- score normalized to 3
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
不适用Dangerous-Workflowno workflows found
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
不适用Packagingpackaging workflow not detected
不适用Pinned-Dependenciesno dependencies found
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
不适用Signed-Releasesno releases found
不适用Token-PermissionsNo tokens found
10Vulnerabilities0 existing vulnerabilities detected
直接依赖 2
注册表软件包版本约束清单文件
PyPIblockrun-llm>=1.7.0pyproject.toml
PyPIlitellm>=1.40.0pyproject.toml
全部依赖 未采集

本报告未能采集到解析后的依赖集合:GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

原始 JSON 报告 机器可读
{
  "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"
}

评分是信号,而非担保。 评分反映的是 GitHub 上公开可见的实践——不是代码审计,也不是安全保证。

缺失数据将被剔除并重新归一化权重,绝不按零分计。方法论已版本化并公开:指标 v1.13.0、模式 v0.27.0—— 完整方法论 · 指标知识库.

单项结果在整体记录中的位置: 汇总统计PyPI.