Публічний реєстр
Звіт про здоров'я програмного забезпеченнясхема 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 р.Переглянути на GitHub ↗

BlockRunAI/blockrun-litellm має індекс здоров’я 42 зі 100, що відповідає смузі «У зоні ризику». Найвищий показник — Sustainability & Governance (64/100), найнижчий — Community & Adoption (24/100). Останнє оновлення — сьогодні. Більшість нещодавньої роботи виконує один учасник.

42
загалом / 100
У зоні ризику

Індекс здоров'я програмного забезпечення

Метрики згруповано у зважені категорії на шкалі 1–100. Загальна оцінка починається як їхнє середнє; коли публічні дані активують Політику юрисдикцій високого ризику, рейтинг коригується й отримує верхню межу 49 («Під ризиком»). Готовність до ШІ не входить до індексу.

42
Відмінний85-100Зразковий; відповідає практично всім перевіреним критеріям
Добрий70-84Здоровий; незначні прогалини
Помірний50-69Прийнятний, але з помітними прогалинами; рекомендовано перевірку
У зоні ризику30-49Суттєві слабкі місця; впровадження потребує обережності
Критичний1-29Серйозні проблеми (покинутий, єдиний мейнтейнер, без базової гігієни)
ЖиттєздатністьСпільнота тавпровадженняСталість таврядуванняІнженернаякістьБезпекаГотовність доШІ

Профіль оцінок

Кожна вісь — окрема категорія. Форма важить більше, ніж середнє: здоровий об'єкт заповнює всю фігуру, тоді як профіль із піками та провалами означає, що сила в одному вимірі маскує ризик в іншому.

Власність

BlockRun.aiОрганізація
252 підписники37 публічних репозиторіївз груд. 2025 р.

За цим репозиторієм стоїть організація — спільна, підзвітна опіка, здатна пережити будь-якого окремого мейнтейнера.

Пакетні екосистеми

РеєстрПакетВерсіяЗавантажень / місВерсіїОстання публікаціяТеги
PyPIblockrun-litellm0.8.0-320 днів томуai-gatewayblockrunlitellmllm-proxyopenaiopenrouterx402

Метрики за категоріями

Життєздатність

Чи живий проєкт — чи пишеться код і чи виходять релізи?

36У зоні ризику · 22% загального індексу
Як обчислюється оцінка
36/36Свіжість push — останній push 0 дн. тому
6.9/36Ритм комітів — 10/52 тижнів із комітами
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
Як обчислюється оцінка
22.5/22.5README
22.5/22.5Ліцензія — визнана ліцензія (MIT)
0/18Настанови CONTRIBUTING
0/13.5Кодекс поведінки
0/7.2Шаблон issue
0/6.3Шаблон PR
Використані вхідні дані
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Вирішення issue — закрито 100% issue
33.5/38.3Прийняття PR — злито 21/24 вирішених PR
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Охоплення власника — 252 підписників у BlockRunAI
12.7/25Послужний список — 37 публічних репозиторіїв, вік облікового запису ~0 р.
Використані вхідні дані
followers252
owner_typeOrganization
is_verified
owner_loginBlockRunAI
public_repos37
account_age_days212

Супровід пакетів

100Відмінний
Як обчислюється оцінка
25/25Опубліковано й доступно — 1 пакет(ів) у pypi
35/35Свіжість публікацій — остання публікація 0 дн. тому
20/20Історія версій — 32 опублікованих версій
20/20Не застарілий — активний, не deprecated і не yanked
Використані вхідні дані
packagesblockrun-litellm
ecosystemspypi
any_deprecatedні
min_days_since_publish0

Інженерна якість

Чи наявні базові інженерні практики та документація?

48У зоні ризику · 20% загального індексу
Як обчислюється оцінка
0/24Процеси CI
24/24Наявні тести
0/16Конфігурація лінтера
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. Залишкові ваги перенормовано.

Готовність до ШІ

Наскільки репозиторій оснащений для розробки та супроводу за участі ШІ-агентів? Незалежний, експериментальний бейдж — вага 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/11Конфігурація лінтера / форматера
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Керовані розміри файлів — 1/31 файлів вихідного коду понад 60 КБ
Використані вхідні дані
primary_languagePython
largest_source_bytes86 558
source_files_sampled31
oversized_source_files1
Як обчислюється оцінка
0/40Схема API (OpenAPI/GraphQL/proto)
0/20Сервер MCP
40/40Придатні до запуску приклади — examples
Використані вхідні дані
example_dirsexamples
has_mcp_signalні
api_schema_files

Ключові факти

0зірок GitHub
2контриб'юторів
67комітів за останні 12 місяців
0днів від останнього пушу
0релізів
1бас-фактор
0відкритих issue
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.