Публічний реєстр
Звіт про здоров'я програмного забезпеченнясхема 0.23.0 · метрики 1.13.0 · 2026-07-21 21:13 UTC

brainlid / langchain

Elixir implementation of a LangChain style framework that lets Elixir projects integrate with and leverage LLMs.

ElixirВласна ліцензія★ 1 183 зірки⑂ 209 форківз лип. 2023 р.Переглянути на GitHub ↗

brainlid/langchain має індекс здоров’я 72 зі 100, що відповідає смузі «Добрий». Найвищий показник — Vitality (96/100), найнижчий — Security (60/100). Останнє оновлення було 7 днів тому. Більшість нещодавньої роботи виконує один учасник.

72
загалом / 100
Добрий

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

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

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

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

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

Власність

Mark EricksenОсобистий обліковий запис
194 підписники43 публічні репозиторіїз трав. 2011 р.@superfly

Цей репозиторій належить особистому обліковому запису. Проєкт з єдиним власником несе більший ризик безперервності, ніж підтримуваний організацією.

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

РеєстрПакетВерсіяЗавантажень / місВерсіїОстання публікація
Hexlangchain0.9.258 0795113 днів тому

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

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

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

96Відмінний · 22% загального індексу
Як обчислюється оцінка
36/36Свіжість push — останній push 7 дн. тому
30.5/36Ритм комітів — 44/52 тижнів із комітами
18/18Обсяг комітів — 205 комітів за останній рік
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 6 issue activity found in the last 90 days -- score normalized to 10
Використані вхідні дані
commits_last_year205
human_commit_share0,93
days_since_last_push7
active_weeks_last_year44
Як обчислюється оцінка
27/27Випускає релізи — опубліковано 51 релізів
36/36Свіжість релізів — останній реліз 13 дн. тому
27/27Ритм релізів — реліз кожні ~6,3 дн.
0/10OpenSSF Scorecard: Signed-Releases — немає даних
Використані вхідні дані
releases_count51
latest_release_tagv0.9.2
releases_from_tagsні
days_since_latest_release13
mean_days_between_releases6,3
Виключено з оцінювання (немає даних або не застосовно): OpenSSF Scorecard: Signed-Releases. Залишкові ваги перенормовано.

Спільнота та впровадження

Чи має проєкт користувачів, завантаження, увагу та влаштовані умови для контриб’юторів?

66Помірний · 18% загального індексу
Як обчислюється оцінка
49.8/60Зірки — 1 183 зірок
19.3/25Форки — 209 форків
7.1/15Спостерігачі — 20 спостерігачів
Використані вхідні дані
forks209
stars1 183
watchers20
growth_stateorganic
growth_factor_pct100

Здоров'я спільноти

44У зоні ризику
Як обчислюється оцінка
22.5/22.5README
16.9/22.5Ліцензія — файл ліцензії наявний, не є визнаною ліцензією
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ні
Як обчислюється оцінка
63.5/80Щомісячні завантаження — 58 079 завантажень/місяць у hex
0/20Залежні пакети в реєстрі — ця екосистема цього не повідомляє
Використані вхідні дані
packageslangchain
dependents
ecosystemshex
total_downloads776 990
monthly_downloads58 079
Виключено з оцінювання (немає даних або не застосовно): Залежні пакети в реєстрі. Залишкові ваги перенормовано.

Сталість та врядування

Чи переживе проєкт своїх людей — бас-фактор, реактивність, хто за ним стоїть і як супроводжуються пакети?

65Помірний · 24% загального індексу
Як обчислюється оцінка
9/54Бас-фактор — на 1 контриб’ютор(ів) припадає половина всіх комітів
5.9/22.5Розподіл комітів — головний контриб’ютор — автор 74% комітів
13.5/13.5Широта контриб’юторів — 88 контриб’юторів
10/10OpenSSF Scorecard: Contributors — project has 16 contributing companies or organizations
Використані вхідні дані
bus_factor1
contributors_sampled88
top_contributor_share0,739
Як обчислюється оцінка
37/46.8Вирішення issue — закрито 79% issue
32.5/38.3Прийняття PR — злито 358/421 вирішених PR
3/15OpenSSF Scorecard: Code-Review — Found 6/25 approved changesets -- score normalized to 2
Використані вхідні дані
merged_prs358
open_issues25
closed_issues95
issue_closed_ratio0,792
closed_unmerged_prs63
Як обчислюється оцінка
10/30Підтримка власника — особистий (користувацький) обліковий запис
0/20Верифікований домен — не застосовно до користувацьких облікових записів
16.5/25Охоплення власника — 194 підписників у brainlid
24/25Послужний список — 43 публічних репозиторіїв, вік облікового запису ~15 р.
Використані вхідні дані
followers194
owner_typeUser
is_verified
owner_loginbrainlid
public_repos43
account_age_days5 536
Виключено з оцінювання (немає даних або не застосовно): Верифікований домен. Залишкові ваги перенормовано.

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

100Відмінний
Як обчислюється оцінка
25/25Опубліковано й доступно — 1 пакет(ів) у hex
35/35Свіжість публікацій — остання публікація 13 дн. тому
20/20Історія версій — 51 опублікованих версій
20/20Не застарілий — активний, не deprecated і не yanked
Використані вхідні дані
packageslangchain
ecosystemshex
any_deprecatedні
min_days_since_publish13

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

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

67Помірний · 20% загального індексу
Як обчислюється оцінка
24/24Процеси CI — 1 процес(ів) CI
24/24Наявні тести
0/16Конфігурація лінтера
0/9.6Pre-commit-хуки
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 30 out of 30 merged PRs checked by a CI test -- score normalized to 10
Використані вхідні дані
has_ciтак
has_testsтак
has_editorconfigні
has_linter_configні
has_precommit_configні

Документація

65Помірний
Як обчислюється оцінка
30/30README
0/25Каталог документації
15/15Сайт документації / домашня сторінка — https://hexdocs.pm/langchain/
10/10Опис репозиторію
10/10Теми — 8 тем
0/10Wiki
Використані вхідні дані
topicschatgpt, elixir, langchain, llm, ai, anthropic, bumblebee, claude-ai
has_wikiні
homepagehttps://hexdocs.pm/langchain/
has_readmeтак
has_docs_dirні
has_descriptionтак

Безпека

Чи міцні видимі практики безпеки й ланцюга постачання, без непослабленої пов’язаності з юрисдикціями високого ризику?

60Помірний · 16% загального індексу

Стан безпеки

60Помірний
Як обчислюється оцінка
7.5/7.5Binary-Artifacts — no binaries found in the repo
2.2/7.5Branch-Protection — branch protection is not maximal on development and all release branches
2.5/2.5CI-Tests — 30 out of 30 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
1.5/7.5Code-Review — Found 6/25 approved changesets -- score normalized to 2
2.5/2.5Contributors — project has 16 contributing companies or organizations
10/10Dangerous-Workflow — no dangerous workflow patterns detected
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.2/2.5Ліцензія — license file detected
7.5/7.5Maintained — 30 commit(s) and 6 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — немає даних
5/5Pinned-Dependencies — all dependencies are pinned
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 — немає даних
7.5/7.5Token-Permissions — GitHub workflow tokens follow principle of least privilege
0/7.5Vulnerabilities — 11 existing vulnerabilities detected
Використані вхідні дані
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate6,1
Виключено з оцінювання (немає даних або не застосовно): packaging, signed_releases. Залишкові ваги перенормовано.

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

Наскільки репозиторій оснащений для розробки та супроводу за участі ШІ-агентів? Незалежний, експериментальний бейдж — вага 0.0, тож він подається окремо і не впливає на загальний індекс здоров'я.

74Добрий · 0% загального індексу
Як обчислюється оцінка
45/45Інструкції для агентів — .cursor/rules/changelog-rules.mdc, AGENTS.md, CLAUDE.md
0/15Машиночитана документація (llms.txt)
40/40Читабельна історія комітів — намір зазначено у 86 з 93 людських комітів (структурований заголовок або пояснювальний текст)
Використані вхідні дані
has_llms_txtні
legible_history_share0,925
agent_instruction_files.cursor/rules/changelog-rules.mdc, AGENTS.md, CLAUDE.md
agent_instruction_max_bytes11 639
Як обчислюється оцінка
12.6/18Розгортання однією командою — mix.exs (домовленість інструментарію, без раннера задач)
22/22Автоматизовані тести
0/11Конфігурація лінтера / форматера
0/11Статична перевірка типів
10/10Відтворюване середовище — lockfile
10/10Підтверджена практика роботи з агентами — 22 з останніх 100 комітів створено агентом або з його зазначенням
8/8Автоматизоване супроводження — 7 з останніх 100 комітів — автоматичні оновлення залежностей
10/10OpenSSF Scorecard: Pinned-Dependencies — all dependencies are pinned
Використані вхідні дані
has_nixні
has_testsтак
lockfilesmix.lock
has_dockerfileні
typed_languageні
bootstrap_files
has_devcontainerні
has_linter_configні
typecheck_configs
agent_commit_share0,22
toolchain_manifestsmix.exs
dependency_bot_commit_share0,07
Як обчислюється оцінка
0/45Типізований код — Elixir без конфігурації перевірки типів
52.4/55Керовані розміри файлів — 8/172 файлів вихідного коду понад 60 КБ
Використані вхідні дані
primary_languageElixir
largest_source_bytes180 612
source_files_sampled172
oversized_source_files8

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

1 183зірок GitHub
88контриб'юторів
205комітів за останні 12 місяців
7днів від останнього пушу
51релізів
1бас-фактор
25відкритих issue
Hexпакетних екосистем

Докладніше

Історія зірок і форків 1 183 ★ / 209 ⇿
1 183Зірки
209Форки
51Релізи

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

Показано лише найновішу історію — цей репозиторій перевищує вікно збору, тож найраніша історія не захоплена.

02004006008001 0001 2001 183206162023-082025-022026-07
Мажорні 0Мінорні 9Патчі 35

Кожна точка охоплює 3 днів.

OpenSSF Scorecard 6.1 / 10
6.1сукупно

Незалежна, не прив'язана до інструментів оцінка безпеки від відкритого проєкту OpenSSF Scorecard. Кожна перевірка винагороджує практику безпеки, а не інструмент конкретного постачальника. Перевірки, які Scorecard не зміг визначити, позначено н/д і виключено з оцінки безпеки (вони ніколи не зараховуються як нуль).Scorecard v5.5.0 · 2026-07-21 21:12 UTC

10Binary-Artifactsno binaries found in the repo
3Branch-Protectionbranch protection is not maximal on development and all release branches
10CI-Tests30 out of 30 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
2Code-ReviewFound 6/25 approved changesets -- score normalized to 2
10Contributorsproject has 16 contributing companies or organizations
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
9Licenselicense file detected
10Maintained30 commit(s) and 6 issue activity found in the last 90 days -- score normalized to 10
н/дPackagingpackaging workflow not detected
10Pinned-Dependenciesall dependencies are pinned
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
н/дSigned-Releasesno releases found
10Token-PermissionsGitHub workflow tokens follow principle of least privilege
0Vulnerabilities11 existing vulnerabilities detected
Прямі залежності 11
РеєстрПакетОбмеження версіїМаніфест
Hexno_warnpriv/plts/project.pltmix.exs
Hexecto~> 3.10 or ~> 3.11mix.exs
Hexgettext~> 0.26.2 or ~> 1.0.0mix.exs
Hexreq>= 0.5.3mix.exs
Hexmint_web_socket~> 1.0mix.exs
Hexnimble_parsec~> 1.4mix.exs
Hexabacus~> 2.1.0mix.exs
Hexnx>= 0.7.0mix.exs
Hexopentelemetry_api~> 1.4mix.exs
Hexdotenvy~> 1.1mix.exs
Hexreq_llm>= 1.6.0mix.exs
Усі залежності 0

Повний розв'язаний набір залежностей із графа залежностей GitHub: 0 прямих і 0 непрямих (транзитивних) пакетів. Транзитивне замикання є повним, коли в репозиторії закомічено lockfile.

РеєстрПакетВерсіяЗв'язок
Сповіщення про залежності не оцінено

Звірка сповіщень не відбулася для цього звіту: No resolved dependencies to assess

Звіт у форматі JSON машиночитний
{
  "data": {
    "repo": {
      "topics": [
        "chatgpt",
        "elixir",
        "langchain",
        "llm",
        "ai",
        "anthropic",
        "bumblebee",
        "claude-ai"
      ],
      "is_fork": false,
      "size_kb": 2413,
      "has_wiki": false,
      "homepage": "https://hexdocs.pm/langchain/",
      "languages": {
        "Elixir": 2750591
      },
      "pushed_at": "2026-07-14T16:46:50Z",
      "created_at": "2023-07-12T17:27:16Z",
      "owner_type": "User",
      "updated_at": "2026-07-21T08:40:12Z",
      "description": "Elixir implementation of a LangChain style framework that lets Elixir projects integrate with and leverage LLMs.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": null,
      "default_branch": "main",
      "license_spdx_raw": "NOASSERTION",
      "primary_language": "Elixir",
      "significant_languages": [
        "Elixir"
      ]
    },
    "owner": {
      "blog": null,
      "name": "Mark Ericksen",
      "type": "User",
      "login": "brainlid",
      "company": "@superfly",
      "location": "Utah",
      "followers": 194,
      "avatar_url": "https://avatars.githubusercontent.com/u/808984?v=4",
      "created_at": "2011-05-25T02:53:07Z",
      "is_verified": null,
      "public_repos": 43,
      "account_age_days": 5536
    },
    "license": {
      "state": "custom",
      "spdx_id": null,
      "raw_spdx": "NOASSERTION",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.9.2",
          "kind": "patch",
          "published_at": "2026-07-08T17:48:39Z"
        },
        {
          "tag": "v0.9.1",
          "kind": "patch",
          "published_at": "2026-07-08T13:07:30Z"
        },
        {
          "tag": "v0.9.0",
          "kind": "minor",
          "published_at": "2026-07-07T23:36:31Z"
        },
        {
          "tag": "v0.8.14",
          "kind": "patch",
          "published_at": "2026-06-26T14:39:27Z"
        },
        {
          "tag": "v0.8.13",
          "kind": "patch",
          "published_at": "2026-06-09T18:37:05Z"
        },
        {
          "tag": "v0.8.12",
          "kind": "patch",
          "published_at": "2026-06-09T05:25:08Z"
        },
        {
          "tag": "v0.8.11",
          "kind": "patch",
          "published_at": "2026-05-16T05:37:22Z"
        },
        {
          "tag": "v0.8.10",
          "kind": "patch",
          "published_at": "2026-05-15T03:10:42Z"
        },
        {
          "tag": "v0.8.9",
          "kind": "patch",
          "published_at": "2026-05-13T13:57:14Z"
        },
        {
          "tag": "v0.8.8",
          "kind": "patch",
          "published_at": "2026-05-12T23:36:11Z"
        },
        {
          "tag": "v0.8.7",
          "kind": "patch",
          "published_at": "2026-05-12T23:09:17Z"
        },
        {
          "tag": "v0.8.6",
          "kind": "patch",
          "published_at": "2026-05-05T03:48:14Z"
        },
        {
          "tag": "v0.8.5",
          "kind": "patch",
          "published_at": "2026-04-30T20:49:44Z"
        },
        {
          "tag": "v0.8.4",
          "kind": "patch",
          "published_at": "2026-04-24T22:10:44Z"
        },
        {
          "tag": "v0.8.3",
          "kind": "patch",
          "published_at": "2026-04-22T17:45:58Z"
        },
        {
          "tag": "v0.8.2",
          "kind": "patch",
          "published_at": "2026-04-21T16:51:41Z"
        },
        {
          "tag": "v0.8.1",
          "kind": "patch",
          "published_at": "2026-04-16T13:59:17Z"
        },
        {
          "tag": "v0.8.0",
          "kind": "minor",
          "published_at": "2026-04-04T19:42:32Z"
        },
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2026-04-02T20:37:22Z"
        },
        {
          "tag": "v0.6.3",
          "kind": "patch",
          "published_at": "2026-03-28T01:11:36Z"
        },
        {
          "tag": "v0.6.2",
          "kind": "patch",
          "published_at": "2026-03-13T01:53:05Z"
        },
        {
          "tag": "v0.6.1",
          "kind": "patch",
          "published_at": "2026-03-05T05:05:48Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2026-02-22T15:21:33Z"
        },
        {
          "tag": "v0.5.2",
          "kind": "patch",
          "published_at": "2026-02-11T01:44:19Z"
        },
        {
          "tag": "v0.5.1",
          "kind": "patch",
          "published_at": "2026-01-31T15:15:27Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2026-01-28T00:28:13Z"
        },
        {
          "tag": "v0.4.1",
          "kind": "patch",
          "published_at": "2025-12-02T05:06:24Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2025-10-02T02:13:45Z"
        },
        {
          "tag": "v0.4.0-rc.3",
          "kind": "prerelease",
          "published_at": "2025-09-19T04:22:34Z"
        },
        {
          "tag": "v0.4.0-rc.2",
          "kind": "prerelease",
          "published_at": "2025-08-27T14:15:02Z"
        },
        {
          "tag": "v0.4.0-rc.1",
          "kind": "prerelease",
          "published_at": "2025-07-03T20:29:22Z"
        },
        {
          "tag": "v0.4.0-rc.0",
          "kind": "prerelease",
          "published_at": "2025-04-23T03:51:27Z"
        },
        {
          "tag": "v0.3.3",
          "kind": "patch",
          "published_at": "2025-04-23T01:28:48Z"
        },
        {
          "tag": "v0.3.2",
          "kind": "patch",
          "published_at": "2025-03-18T00:15:26Z"
        },
        {
          "tag": "v0.3.1",
          "kind": "patch",
          "published_at": "2025-02-05T15:09:01Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2025-01-22T20:21:43Z"
        },
        {
          "tag": "v0.3.0-rc.2",
          "kind": "prerelease",
          "published_at": "2025-01-09T03:37:44Z"
        },
        {
          "tag": "v0.3.0-rc.1",
          "kind": "prerelease",
          "published_at": "2024-12-16T00:23:38Z"
        },
        {
          "tag": "v0.3.0-rc.0",
          "kind": "prerelease",
          "published_at": "2024-06-18T03:29:53Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2024-05-01T02:49:12Z"
        },
        {
          "tag": "v0.1.10",
          "kind": "patch",
          "published_at": "2024-03-08T05:08:29Z"
        },
        {
          "tag": "v0.1.9",
          "kind": "patch",
          "published_at": "2024-02-29T22:12:30Z"
        },
        {
          "tag": "v0.1.8",
          "kind": "patch",
          "published_at": "2024-02-16T21:06:18Z"
        },
        {
          "tag": "v0.1.7",
          "kind": "patch",
          "published_at": "2024-01-18T21:58:26Z"
        },
        {
          "tag": "v0.1.6",
          "kind": "patch",
          "published_at": "2023-12-12T20:23:07Z"
        },
        {
          "tag": "v0.1.5",
          "kind": "patch",
          "published_at": "2023-12-12T04:45:02Z"
        },
        {
          "tag": "v0.1.4",
          "kind": "patch",
          "published_at": "2023-12-11T21:12:19Z"
        },
        {
          "tag": "v0.1.3",
          "kind": "patch",
          "published_at": "2023-12-01T15:54:20Z"
        },
        {
          "tag": "v0.1.2",
          "kind": "patch",
          "published_at": "2023-10-26T21:09:13Z"
        },
        {
          "tag": "v0.1.1",
          "kind": "patch",
          "published_at": "2023-10-11T02:55:45Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2023-09-19T03:14:56Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "b6d80cd57f6726b665fdd1356e7c78f15d0abe31",
          "body": "* Add `api_key: false` to omit x-api-key header on ChatAnthropic\n\nSome deployments front the Anthropic Messages API with their own\nauthentication — a corporate proxy, or an AWS SigV4-signed gateway\nsuch as Bedrock \"Mantle\" — where the `x-api-key` header is rejected\nor ignored. There was previously n\n[…]\napi_key strictly a\nstring, so no type warnings as Elixir leans into typing.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add `api_key: false` to omit x-api-key header on ChatAnthropic (#585)",
          "author_name": "Jeremy Searls",
          "author_login": "jersearls",
          "committed_at": "2026-07-14T16:46:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b7375f20e01ea73b88c49c9df2f2b9d02b0e5117",
          "body": "Bumps [erlef/setup-beam](https://github.com/erlef/setup-beam) from 1.24.0 to 1.24.1.\n- [Release notes](https://github.com/erlef/setup-beam/releases)\n- [Commits](https://github.com/erlef/setup-beam/compare/fc68ffb90438ef2936bbb3251622353b3dcb2f93...54075bcc5e249e4758d363f27d099f55d843f124)\n\n---\nupdat\n[…]\nirect:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "build(deps): bump erlef/setup-beam from 1.24.0 to 1.24.1 (#586)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-09T13:03:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0248223915c3ef3a6e0f37132b861547a7775781",
          "body": null,
          "is_bot": false,
          "headline": "prep for v0.9.2 release (#584)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-07-08T17:47:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c24ef4d0482a11cb705dd4d3ab47f8fc52597f27",
          "body": "- also implements support for mapping FunctionParam syntax",
          "is_bot": false,
          "headline": "support mapping Function.strict -> ReqLLM.Tool.strict (#583)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-07-08T17:43:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "39825346e5fbb6db8fb9338dfe2b4ff9bac61fc9",
          "body": null,
          "is_bot": false,
          "headline": "prep for v0.9.1 (#582)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-07-08T13:06:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b0e927aa6c7aaae4d99ead4cb6215696b3d44e2d",
          "body": "…s (#581)\n\n`ToolCall.arguments` is only parsed from a JSON string into a map by\n`complete/1`, which runs when a tool call reaches `status: :complete`. A\ntool call serialized without going through that path (a persisted/replayed\n`:incomplete` call, or one accumulated from a truncated stream) can stil\n[…]\nviously sent `args: nil` for zero-argument calls; they now send an\nempty object, which is the correct representation.\n\nCloses #580\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: normalize ToolCall arguments to a map when serializing tool call…",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-07-08T13:01:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f6aacaf7f4f7eb48e53672c88f09efe6d6c23883",
          "body": "- readme\n- changelog\n- version bump - big feature addition and minor behavior changes",
          "is_bot": false,
          "headline": "prep for v0.9.0 (#579)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-07-07T23:34:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6a70f75f7ec1439c3dafad28ecf64f7e126255f1",
          "body": "* spike telemetry additions\n\n* review fixes\n\n* telemetry fixes\n\n* enrich with metadata\n\n* format\n\n* review fixes\n\n* open telemetry spike\n\n* otel implementation\n\n* updates to otel\n\n* rename back to tools_count\n\n* improved security on messages\n\n* Polish OpenTelemetry integration\n\n- Add MetricsHandler \n[…]\n the helper is uncalled while the events do fire.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: Support for OpenTelemetry GenAI semantic conventions (#472)",
          "author_name": "Vasilis Spilka",
          "author_login": "vasspilka",
          "committed_at": "2026-07-07T23:22:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "80291115a5d681a7d316daafd11e246d03931dae",
          "body": "Bumps [actions/cache/restore](https://github.com/actions/cache) from 5.0.5 to 6.1.0.\n- [Release notes](https://github.com/actions/cache/releases)\n- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)\n- [Commits](https://github.com/actions/cache/compare/27d5ce7f107fe9357f9df03efb73ab9\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "build(deps): bump actions/cache/restore from 5.0.5 to 6.1.0 (#572)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-04T22:38:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3a51f3886a30c95bc9354c53dcf40d163d1214ab",
          "body": "Bumps [actions/cache](https://github.com/actions/cache) from 5.0.5 to 6.1.0.\n- [Release notes](https://github.com/actions/cache/releases)\n- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)\n- [Commits](https://github.com/actions/cache/compare/27d5ce7f107fe9357f9df03efb73ab90386fcca\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "build(deps): bump actions/cache from 5.0.5 to 6.1.0 (#573)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-04T22:37:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "66c0f40ad756bf7bcf8cab8ad9a78aaf4fb12e12",
          "body": "Bumps [actions/cache/save](https://github.com/actions/cache) from 5.0.5 to 6.1.0.\n- [Release notes](https://github.com/actions/cache/releases)\n- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)\n- [Commits](https://github.com/actions/cache/compare/27d5ce7f107fe9357f9df03efb73ab9038\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "build(deps): bump actions/cache/save from 5.0.5 to 6.1.0 (#574)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-04T22:37:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7d1d2b7a0a868af7ad63608c33dfab01992836ec",
          "body": null,
          "is_bot": false,
          "headline": "prep for v0.8.14 (#571)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-06-26T14:38:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fbc45ea08585e378c7f40f3513d738369be6b672",
          "body": "Bumps [actions/checkout](https://github.com/actions/checkout) from 6.0.2 to 7.0.0.\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/actions/checkout/compare/de0fac2e4500dabe0009e67\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "build(deps): bump actions/checkout from 6.0.2 to 7.0.0 (#570)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-26T14:29:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d813b4c4187c584f8022174f12becb95aff226f4",
          "body": "OpenAI-compatible streaming APIs may send SSE comment lines (starting with\na colon), which are ignorable per the SSE spec. OpenRouter in particular\nsends \": OPENROUTER PROCESSING\" keep-alive comments. decode_stream/2 split\nonly on \"data: \", so a comment line failed JSON decoding, was buffered as\n\"in\n[…]\nnning with \":\" in the decode reduce. Adds regression tests\nfor a lone comment and a comment followed by a data chunk.\n\nFixes #259.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: ignore SSE comment lines in ChatOpenAI.decode_stream (#569)",
          "author_name": "Andrew Smagin",
          "author_login": "a-designer",
          "committed_at": "2026-06-26T14:28:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "05286abcc80188b42453dec2a468f2f0db4654d6",
          "body": null,
          "is_bot": false,
          "headline": "prep for v0.8.13 (#566)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-06-09T18:36:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ca3f99eb56cceef934c69bf9bd222661d21dd563",
          "body": "…tions (#565)\n\nAdds a predicate for asserting relative tool-call ordering — \"tool A was\ncalled before tool B\" — independent of how many other calls happen in\nbetween. This fills the gap between :superset (containment, order-independent)\nand :strict (whole sequence, exact count), a pattern that shows\n[…]\ned rather than silently collapsing to false.\n\nAlso adds the companion assert_called_before/4 and refute_called_before/4\nmacros to LangChain.Trajectory.Assertions.\n\nCloses #564\n\n<noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add Trajectory.called_before?/4 for relative tool-call ordering asser…",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-06-09T18:18:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ee65cd843531a13adca519acaef38ab19630be3a",
          "body": "* Fix googleai malformed function call\n\n* Use correct shape for MessageDelta.content\n\nCo-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>\n\n* fix: surface empty Gemini streaming body as LangChainError\n\nWhen a streaming request to Gemini returns 200 OK with zero \n[…]\nr when handling request to google apis\n\n* Interpolate model name in empty stream response message\n\n---------\n\nCo-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "Fix google ai empty stream body (#563)",
          "author_name": "Nelson Kopliku",
          "author_login": "nelsonkopliku",
          "committed_at": "2026-06-09T12:44:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c64bb475adbc53134e671a83052c983626c16b7a",
          "body": null,
          "is_bot": false,
          "headline": "prep for new release (#562)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-06-09T05:24:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b1a2b1fc769cc09107d075dfefa02309ff2d2556",
          "body": "* Fix googleai malformed function call\n\n* Use correct shape for MessageDelta.content\n\nCo-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>\n\n---------\n\nCo-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "Fix googleai malformed function call crash (#548)",
          "author_name": "Nelson Kopliku",
          "author_login": "nelsonkopliku",
          "committed_at": "2026-06-09T04:59:59Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ff4221d8a78c384808ee4b5a20831b9f23e3fa14",
          "body": null,
          "is_bot": false,
          "headline": "add :origin option to FileGoogle.request_upload_url (#556)",
          "author_name": "Jinkyou Son",
          "author_login": "nallwhy",
          "committed_at": "2026-06-09T04:57:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "054b01837e5b7171292bf87b3a92b88cbd737eab",
          "body": "- fixes for dead code\n- fixed true latent bugs",
          "is_bot": false,
          "headline": "fixes for Elixir 1.20-rc.6 new compiler warnings (#561)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-06-09T04:55:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fcbbf3aeb3898c89be148ad677d8bf857d27bc3e",
          "body": "…ve chain (#560)\n\n`from_chain/1` is the only constructor that reads live data, and it requires\nan `%LLMChain{}`. Callers that only have a bare list of messages (for example\na persisted agent state, a workflow, or a sliced \"last turn\") had no entry\npoint, even though the real work — tool-call extract\n[…]\ntruction with and without an llm, token\naggregation over a hand-built list, `matches?/3` on a no-llm trajectory, and\nparity (`from_chain(chain) == from_messages(chain.exchanged_messages, chain.llm)`).",
          "is_bot": false,
          "headline": "Add Trajectory.from_messages/2 for building trajectories without a li…",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-05-30T12:33:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ddc9ff7af6aa399b71f256149141b3c3e959c06a",
          "body": null,
          "is_bot": false,
          "headline": "Cloudflare Workers AI with Kimi K2.6 verified (#558)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-05-25T20:12:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "77173e6ab03601c66fe1e5288772e3572871b878",
          "body": null,
          "is_bot": false,
          "headline": "prep for v0.8.11 (#555)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-05-16T05:36:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4937f85bd04ca3ba8b3ff09f0d98ccd76059b51c",
          "body": "- add mix_audit\n- add \"deps.audit\" to precommit alias",
          "is_bot": false,
          "headline": "update deps jsv and decimal (#554)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-05-16T05:31:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9c07a370181116b351b9c7421ead0217d8c82156",
          "body": "- an issue with a max_run of 1",
          "is_bot": false,
          "headline": "fix max_runs check when used with until_tool_used (#553)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-05-16T05:25:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "822dc9150a926e6513df4ba30712a6179ff1171e",
          "body": null,
          "is_bot": false,
          "headline": "prep for v0.8.10 (#552)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-05-15T03:09:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1a70ab90ed5f6cb28101f4fbd489585e37cfbf44",
          "body": "- tool call bug issue",
          "is_bot": false,
          "headline": "handle an OpenAI streamed chunk format (#551)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-05-15T03:04:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9beba24e2cb8132237a2299aead809faed8eaa08",
          "body": null,
          "is_bot": false,
          "headline": "update to v0.8.9 (#550)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-05-13T13:56:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4d8e3c35d7212e97c29716831228e0d7accfa241",
          "body": "* message_delta tool call status helpers\n\n* formatting",
          "is_bot": false,
          "headline": "Add MessageDelta streaming tool-call status helpers (#549)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-05-13T13:52:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8a5c2e62652d3ce7a4af221955e9949e031c276c",
          "body": null,
          "is_bot": false,
          "headline": "remove zoi as a dependency (#547)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-05-12T23:35:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1fa9dab91f55ec93386725ff7943a813f73ec93b",
          "body": null,
          "is_bot": false,
          "headline": "prep for v0.8.7 (#546)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-05-12T23:07:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ad1015b517f0d26aa00ab2a26bd58667e423fc49",
          "body": "…r cases (#539)",
          "is_bot": false,
          "headline": "Make sure the tool name is always provided to ToolResult also on erro…",
          "author_name": "Nelson Kopliku",
          "author_login": "nelsonkopliku",
          "committed_at": "2026-05-12T22:58:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e4dfd4de614de427cd067174b3f76913724f12b4",
          "body": "…tting (#540)\n\n* ChatOpenAIResponses: Fix streaming parser for SSE event boundary splitting\n\nStreaming responses from OpenAI's Responses API were mostly failing —\ntypically only the first delta arrived before all subsequent events\nstopped parsing, no further callbacks fired, and chains hung\nindefini\n[…]\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Mark Ericksen <brainlid@gmail.com>\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ChatOpenAIResponses: Fix streaming parser for SSE event boundary spli…",
          "author_name": "Monte Brown",
          "author_login": "montebrown",
          "committed_at": "2026-05-12T22:47:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "31c56a7aada1a43e450b90dcb0b4c64e2547796b",
          "body": "…d map (#543)\n\nDuring streaming, merge/2 calls append_arguments before update_status.\nWhen a delta arrives with status: :complete and a decoded map for\narguments, append_arguments replaces the primary's binary arguments\nwith the map. update_status then marks the primary as :complete. If\nthe provider\n[…]\n a partial JSON string into the map. The fragment is safely\ndiscarded.\n\nAdded a guard clause that detects map arguments with an incoming\nbinary and returns the primary unchanged, preventing the crash.",
          "is_bot": false,
          "headline": "ToolCall: Fix crash when merging binary arguments into already-decode…",
          "author_name": "Monte Brown",
          "author_login": "montebrown",
          "committed_at": "2026-05-12T21:59:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f4c2eb591c77e0c28cfcbe8d074c710d17028fac",
          "body": "…541)\n\nAnthropic's API accepts output_config as a top-level request parameter\nthat controls output behavior such as adaptive thinking effort.\n\n- Added output_config :map field to the embedded schema\n- Added :output_config to @create_fields so it passes through cast\n- Added set_output_config/1 clause to include it in the API request body",
          "is_bot": false,
          "headline": "ChatAnthropic: Add output_config field for thinking effort control (#…",
          "author_name": "Monte Brown",
          "author_login": "montebrown",
          "committed_at": "2026-05-12T21:49:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "69f01b273c6f5b2da4196d6a30881d4adcd24923",
          "body": "…o_run/1 (#542)\n\nAdded catch-all clauses in do_run/1 to handle edge cases that\npreviously caused crashes or confusing errors:\n\n- {:ok, [[error: %LangChainError{}] | _]} — API errors wrapped in\n  an :ok tuple (e.g., Anthropic overloaded_error during streaming)\n- {:error, reason} — non-string, non-LangChainError error reasons\n\nEach case now returns a structured {:error, chain, reason} tuple\nwith an appropriate error type and message.",
          "is_bot": false,
          "headline": "LLMChain: Improve error handling for unexpected response formats in d…",
          "author_name": "Monte Brown",
          "author_login": "montebrown",
          "committed_at": "2026-05-12T21:47:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "627de84f1cf902c1d33186102630ca806b5cdf86",
          "body": "* feat: add :parse_args callback to LangChain.Function\n\nAdds an opt-in 1-arity `:parse_args` callback that runs after the built-in\nrequired-key check and before the user-supplied tool body. The parser\nreceives the raw, string-keyed arguments from the LLM and returns one of:\n\n  :ok                   \n[…]\nesetting mix.lock to match main; the only meaningful change for this\nPR is the new `{:zoi, \"~> 0.17.0\", optional: true}` line in mix.exs,\nwhich is satisfied by zoi 0.17.1 already present transitively.",
          "is_bot": false,
          "headline": "feat: add :parse_args callback to LangChain.Function (#544)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-05-12T21:45:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1b27526903194e79be994140253fcb8efbef7b97",
          "body": "Bumps [actions/checkout](https://github.com/actions/checkout) from 5.0.1 to 6.0.2.\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/actions/checkout/compare/93cb6efe18208431cddfb83\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "build(deps): bump actions/checkout from 5.0.1 to 6.0.2 (#516)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-05-12T03:00:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7b2b9fd7eeb4c6faad34b1b2d623fec2a086a49d",
          "body": "Bumps [actions/cache](https://github.com/actions/cache) from 4.3.0 to 5.0.5.\n- [Release notes](https://github.com/actions/cache/releases)\n- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)\n- [Commits](https://github.com/actions/cache/compare/0057852bfaa89a56745cba8c7296529d2fc3983\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "build(deps): bump actions/cache from 4.3.0 to 5.0.5 (#525)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-05-12T03:00:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "662039ca0e2a9f1473e023df176471f7c5bab839",
          "body": "- updated changelog\n- improve CI caching",
          "is_bot": false,
          "headline": "prep for 0.8.6 (#537)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-05-05T03:47:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "06c4ced744d0629933f9599fbc448f59a4a1bf99",
          "body": null,
          "is_bot": false,
          "headline": "add a missing typespec return (#536)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-05-05T03:35:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ba0e42083973d370e92cb30a136787bca5f31b6e",
          "body": "* add dialyzer\n- clean up issues\n\n* updated dialyzer config\n- updated CI for running and caching",
          "is_bot": false,
          "headline": "Add dialyzer to project, CI, and clean up type-spec issues (#535)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-05-05T02:07:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "017b46638ce9462c228393ec4d5489d4ee56203a",
          "body": "* handle nil interrupt data in steps\n\n* formatting",
          "is_bot": false,
          "headline": "Handle nil interrupt_data in Steps.extract_interrupt_data/1 (#534)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-05-04T16:51:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f7902e83c94bee1e0a6be61ddce7cef107fe97d5",
          "body": null,
          "is_bot": false,
          "headline": "adding support for thinking to ollama models (#532)",
          "author_name": "Nolan Evans",
          "author_login": "nolman",
          "committed_at": "2026-05-02T18:48:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "caad59e8c2ffba82193c809434b0622c974dc9ca",
          "body": "…to a list (#533)\n\n* Handle single-map responses in `DataExtractionChain`\n\n* Handle single-map responses in `DataExtractionChain`\n\n* Updated changelog ?\n\n* fixed changelog\n\n* update version\n\n* Update mix.exs\n\nDon't change the version here\n\n* Update CHANGELOG.md\n\nChangelog update\n\n---------\n\nCo-authored-by: Mark Ericksen <brainlid@gmail.com>",
          "is_bot": false,
          "headline": "DataExtractionChain: normalize single-object extraction tool results …",
          "author_name": "Chukwudi Ajoku",
          "author_login": "Chuukwudi",
          "committed_at": "2026-05-02T18:46:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "586c46aa938156436b96eedd4d4da635e9a6de9c",
          "body": null,
          "is_bot": false,
          "headline": "update for v0.8.5 (#531)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-04-30T20:48:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ffcff215c6ce8fd928da7469b9c8dd0173d921eb",
          "body": null,
          "is_bot": false,
          "headline": "add new tool callback (#530)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-04-30T20:10:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0574327f32d31841c4a946e6183ca1c041654d2d",
          "body": null,
          "is_bot": false,
          "headline": "recover from invalid streamed json (#528)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-04-25T04:16:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4e7f013aa13f18dca8b80bfda6ef364bf70b08f9",
          "body": null,
          "is_bot": false,
          "headline": "updated version and changelog (#527)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-04-24T22:09:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "268420e2ad7837ea9d60a0210f6e463c5c3bde01",
          "body": null,
          "is_bot": false,
          "headline": "exclude directory for local docs",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-04-24T22:04:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "507bb8700146eb119991f9e540c9edcc8a2a428a",
          "body": "* prompt template security warning in docs\n\n* security concerns being addressed\n\n* security review\n- added sobelow and included in `mix precommit`\n- added \"skip\" config after evaluating each\n- added expanded prompt_template security tests",
          "is_bot": false,
          "headline": "Security hardening: API key leak fix, EEx docs, sobelow gate (#526)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-04-24T21:47:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ee606b30f4c3cf59d4302de6250a79f782d00d09",
          "body": null,
          "is_bot": false,
          "headline": "updated changelog, minor bump (#524)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-04-22T17:45:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "68085a3118841f9198bec99c49d6d2f03e68453a",
          "body": null,
          "is_bot": false,
          "headline": "adding support for structured outputs from ollama",
          "author_name": "Nolan Evans",
          "author_login": "nolman",
          "committed_at": "2026-04-22T17:35:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f6d0400455e0e3359a33c2cce706784df2bd3550",
          "body": "…ntent parts (#523)\n\n* minor cross-model refinements\n- going from ChatAwsMantle and ChatAnthropic and vice versa\n- can create message structures the other wasn't expecting or able to handle\n- easy fixes for filtering\n\n* formatting",
          "is_bot": false,
          "headline": "Fix cross-model message serialization for thinking and unsupported co…",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-04-22T17:25:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "747412a07d20e090a13352d78a4be658f6f07930",
          "body": "* adding documentation for mantle\n\n* prep for v0.8.2 release",
          "is_bot": false,
          "headline": "Prep for v0.8.2 release (#522)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-04-21T16:50:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e97b92ffaed5e45094f53fc67c3e05f825bdd84a",
          "body": "…) (#521)\n\n* initial experimental support for AWS Mantle\n- access to all AWS Mantle (aka Bedrock) models\n- testing with Kimi K2-thinking, Kimi K2.5, and openai.gpt-oss-120b\n- updates to merging tool calls with slightly different compatibility expectations\n- make ContentPart tolerant of nil content parts when combining to a string\n\n* formatting",
          "is_bot": false,
          "headline": "feat: Add ChatAwsMantle provider for AWS Bedrock Mantle (experimental…",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-04-21T15:25:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "12fde1900eb4680ee1b7e973270af96fe1aaf406",
          "body": "- return the number of runs configured\n- more test coverage",
          "is_bot": false,
          "headline": "minor update to returned error message when max_runs hit (#519)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-04-18T01:26:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "55515d07d9e106f83c5b3be67590f6e129ad9506",
          "body": null,
          "is_bot": false,
          "headline": "prep for v0.8.1 release (#518)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-04-16T13:37:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6f21d6d1dc3fe58f1134b00349768a95c6f9a793",
          "body": null,
          "is_bot": false,
          "headline": "github ci config hardening based on zizmor recommendations (#515)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-04-16T05:19:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "842b2957755b1f299d21ad0b60edffa333831e0d",
          "body": "- a sub-agent is launched via a tool_call\n- include the current tool_call_id when executing a tool call\n- allows for a sub-agent to be cancelled and update the cancelled tool call's status",
          "is_bot": false,
          "headline": "supporting a better UX when cancelling sub-agents (#514)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-04-16T05:08:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7706f083c18691cdfa74484d891fb7fd0167f13d",
          "body": "* relaxed ReqLLM dependency version\n\n* updated",
          "is_bot": false,
          "headline": "Relaxed ReqLLM dependency versions (#513)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-04-07T00:10:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0a17f772e3ebbcb589297d32fdf346360914ef83",
          "body": null,
          "is_bot": false,
          "headline": "prep for v0.8.0 release (#512)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-04-04T19:41:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c81eb45f71833253601f14ffb4d3f92a1a4a7b22",
          "body": "…e (#511)\n\n* add on_llm_chain and on_error callbacks\n- document when they fire\n- test coverage\n\n* improved error handling\n- do_run\n- apply_deltas\n- merge_deltas\n- delta_to_message_when_complete\n\n* it is valid to receive an empty delta\n\n* formatting\n\n* error handling improvements\n- apply_deltas can return an error now. Function returns an :ok/:error tuple\n- added tests around cancel_delta handling\n\n* cleanup case matches\n\n* updated tests for delta related functions returning :ok/:error tuples",
          "is_bot": false,
          "headline": "Expand error detection and handling across LLMChain streaming pipelin…",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-04-04T15:09:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5c6e7c770d587af6611240707a7b1198cae27aa3",
          "body": "…luded (#510)",
          "is_bot": false,
          "headline": "fix compiler warnings when optional mint websocket library is not inc…",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-04-04T14:14:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "607584aef5135b86dd6c4c9583a386d98803a402",
          "body": "* feat: add top-level cache_control support to ChatAnthropic\n\nAdd support for Anthropic's automatic caching feature, which applies\ncache breakpoints automatically to the last cacheable block in each\nrequest. This is the simplest way to enable prompt caching for\nmulti-turn conversations -- no manual \n[…]\ncontrol on ContentPart, ToolResult, and Function.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add top-level cache_control support to ChatAnthropic (#509)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-04-04T03:39:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8b9d55e9325543d65e2138cc9878978fc8120d87",
          "body": null,
          "is_bot": false,
          "headline": "update readme for install version",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-04-02T20:38:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3794bb032f7ef4856df2706a71f6eb367ca4ce3b",
          "body": null,
          "is_bot": false,
          "headline": "prep for v0.7.0 release (#506)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-04-02T20:35:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e1a0c4ca55338ff1d10e6d42bb97adcbbc630b60",
          "body": "* feat: make retry_count configurable on chat model structs\n\nAdds a `retry_count` field (default: 3) to all chat model, image\ngenerator, and ChatReqLLM structs that have the :closed connection retry\nlogic. This lets users control how many times LangChain retries on stale\nFinch connections, which is \n[…]\ns to be precise about\nwhat is and is not retried.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: make retry_count configurable on chat model structs (#505)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-04-02T20:25:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6efeab5da820f4dd8b21b99f4f81a6c2cd84b7cf",
          "body": "…tries (#503) (#504)\n\nReq's `retry: :transient` retries 503, 429, timeout, and :closed errors\nup to 3 times. LangChain also has its own recursive retry on :closed\n(stale pooled connections). These two retry layers compound: each\nLangChain retry creates a fresh Req instance with 3 retries, producing\n\n[…]\nle connections.\nServer errors (503/429) now bubble up to the caller, who has the proper\ncontext for backoff strategy.\n\nCloses #503\n\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: disable Req-level retry to prevent compounding with LangChain re…",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-04-02T12:43:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bb4ac31c6fefd798180b53e2d5d6f00d2eee5086",
          "body": "…h_llm (#502)\n\n* Handle {:interrupt, chain, data} and {:pause, chain} in try_chain_with_llm\n\ntry_chain_with_llm/4 only matched {:ok, _} and {:error, _, _}, but the\nMode behaviour declares {:interrupt, chain, data} and {:pause, chain} as\nvalid run_result() types. When a custom mode returned these, th\n[…]\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>\nCo-authored-by: Mark Ericksen <brainlid@gmail.com>",
          "is_bot": false,
          "headline": "Handle {:interrupt, chain, data} and {:pause, chain} in try_chain_wit…",
          "author_name": "Srikanth Kyatham",
          "author_login": "srikanthkyatham",
          "committed_at": "2026-04-02T12:08:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7bea1b57ade488a38f59759d445b6ea85bbbf7de",
          "body": "When an overloaded_error arrives as an SSE event during streaming on a\n200 connection, do_process_response correctly returns {:error, error}\nbut the streaming accumulator in Utils.handle_stream_fn treats it like\nany other response — accumulating it into the body list. This causes\ncall/3 to return {:\n[…]\nses \"overloaded\" while the streaming\nSSE path passes through the API's raw \"overloaded_error\" type).\n\nCloses sagents-ai/sagents#31\n\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: handle streaming overloaded_error from Anthropic API (#500)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-04-01T01:06:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f1de29a436424281f5cc35765aa62b8531151d53",
          "body": "…hoices (#499)\n\nDeepSeek sends token usage in the final streaming chunk alongside a\nchoice with empty content and finish_reason \"stop\", unlike OpenAI which\nsends usage in a separate chunk with empty choices. The code already\nhandles this correctly after refactoring, but there were no tests\ncovering this specific scenario.\n\nAdds tests to both ChatDeepSeek and ChatOpenAI to prevent regressions.\n\nRelates to #288\n\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: add regression tests for streaming token usage with non-empty c…",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-03-29T19:45:36Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "082f5e133e2b64218a993ca31b654472b97e0463",
          "body": "* chore: add mint_web_socket dependency\n\n* feat: create LangChain.WebSocket\n\n* feat: add WebSocket transport support for ChatOpenAIResponses\n\n* chore: add LangChain.WebSocket to ExDoc module groups\n\n# Conflicts:\n#\tmix.exs\n\n* feat: add connect_websocket!/disconnect_websocket convenience API\n\n* fix: a\n[…]\nk\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Jinkyou Son <nallwhy@gmail.com>\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add WebSocket transport for ChatOpenAIResponses (#497)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-03-29T15:10:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0afcfd0039b35f96e5f942f709efc756e8e9ad91",
          "body": "* feat: support streaming tool calls for ChatOllamaAI\n\nThe streaming response handler previously dropped tool calls because the\nplain streaming clause matched before the tool_calls clause. This adds\nstreaming-specific clauses that extract and process tool calls from\nstreamed responses, both complete\n[…]\nadd a configuration example for custom endpoints.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: support streaming tool calls for ChatOllamaAI (#498)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-03-29T14:58:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cab47f46de02b56348023df7acafa7766f5f020b",
          "body": null,
          "is_bot": false,
          "headline": "prep for v0.6.3 (#496)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-03-28T01:10:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6a0034c737a0ea0b5bf13b9f286d0a328106a0e0",
          "body": "When Mistral (or Azure-hosted Mistral) returns a complete message\nwithout a \"tool_calls\" key, the response fell through to the catch-all\nerror handler, causing an \"unexpected_response\" error. This adds a\ndo_process_response clause for complete messages without tool_calls,\nmatching the pattern already used in ChatOpenAI.\n\nCloses #439",
          "is_bot": false,
          "headline": "fix: handle Mistral responses without tool_calls key (#439) (#495)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-03-28T00:56:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "722b8f0b56afe0d918ad87395362f07707dd5f56",
          "body": "* feat: add logprobs and top_logprobs support to ChatOpenAI\n\nAdd `logprobs` (boolean) and `top_logprobs` (integer 0-20) parameters\nto ChatOpenAI, allowing users to request log probability information\nfrom the OpenAI API. When logprobs data is present in the API response,\nit is surfaced in the messag\n[…]\n tests for logprobs (streaming and non-streaming)\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add logprobs and top_logprobs support to ChatOpenAI (#494)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-03-26T20:22:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e0dfd4ccc41996c971a638aa5fb97def4947aba1",
          "body": "…443) (#493)\n\nAdds tests verifying that when an LLM returns truncated/malformed JSON\nin tool_call.arguments during streaming, the delta is properly cleared\nso subsequent API calls don't accumulate garbage and loop infinitely.\n\nThis was fixed in #449 but had no targeted regression test for the\nspecific scenario reported in #443.\n\nCloses #443\n\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: add regression tests for malformed tool call JSON loop (issue #…",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-03-26T19:13:17Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "767517e300c0574f485907e548fd09cea526e02d",
          "body": "* fix: reduce excessive Logger.error usage across the library\n\nReplace Logger.error calls with a more nuanced approach:\n\n- Remove Logger.error where the error information is already captured\n  in the return value ({:error, reason} or {:error, chain, reason}).\n  Callers can log at whatever level they\n[…]\nvalue while still removing the Logger.error call.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: reduce excessive Logger.error usage across the library (#492)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-03-26T19:00:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8fed79ed090a0fab71423a3ab91f081998c3c7b5",
          "body": "* support multimodal tool results\n\n* support displaynames\n\n* support json tools responses\n\n* support :file content parts in multimodal tool results\n\nThe :file ContentPart type (base64-encoded non-image files like PDFs)\nwas silently dropped when serializing tool results for Vertex AI.\nTreat :file the\n[…]\n4.6 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Joe Chiarella <43379515+joechiarella@users.noreply.github.com>\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Support multimodal tool results in ChatVertexAI (#491)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-03-26T13:19:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cdb868b872cd95808ff5b4c5d892dda3a350b248",
          "body": "* fix: add additionalProperties: false to tool schemas for Anthropic API compatibility\n\nAnthropic's API strictly requires `additionalProperties: false` on all object-type\ntool parameter schemas. Without it, tool calls fail with an invalid_request_error.\n\nFixes #440\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n\n* style: format chat_anthropic_test.exs to comply with line length limit\n\n---------\n\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: add additionalProperties: false to tool schemas (#490)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-03-26T12:19:02Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "af39c86265250a04a25e85dea3ea708342a815c0",
          "body": "* spike trajectory module\n\n* interface additions\n\n* add readme metadata and tests\n\n* small fixes and tests\n\n* update to docs and module name\n\n* add guide and small fixes",
          "is_bot": false,
          "headline": "feat: Langchain.Trajectory for easier evaluation of agents (#481)",
          "author_name": "Vasilis Spilka",
          "author_login": "vasspilka",
          "committed_at": "2026-03-13T02:31:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7b1400cbfd686dff9fbac1a9f0e4cf94aaba2bc5",
          "body": "Azure OpenAI sends keepalive SSE events during long-running streaming\nresponses. These events were not matched by any do_process_response/2\nclause, causing them to fall through to the catch-all error handler\nand crash the stream.\n\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: skip Azure keepalive events in streaming responses (#485)",
          "author_name": "Vasilis Spilka",
          "author_login": "vasspilka",
          "committed_at": "2026-03-13T02:19:17Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "234e35ee84ddf62455e7721a894d4deb05e457e7",
          "body": "When streaming with thinking/reasoning models (e.g., Qwen3, DeepSeek-R1),\nthe model emits <think> tokens that LangChain's streaming parser doesn't\nproduce MessageDelta structs for. After filtering empty results, the\nresponse body becomes `{:ok, []}`, which matches no clause in the\n`case message_resp\n[…]\nty_response\"\n- `{:ok, unexpected}` — returns a typed error for any other unrecognized format\n\nCo-authored-by: Lurielle <lurielle@getspectrum.ai>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Handle empty and unexpected LLM response formats in do_run/1 (#484)",
          "author_name": "lurielle-studio",
          "author_login": "lurielle-studio",
          "committed_at": "2026-03-13T02:18:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "dd9761cd4e7b960db404d6f818123c2bc66042fc",
          "body": "* updated doc\n\n* update library version to v0.6.2\n- added ChatReqLLM to chat models doc list",
          "is_bot": false,
          "headline": "Prep for v0.6.2 release (#487)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-03-13T01:50:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3a0e38488e67d4fc1f4601d8df1feede1d748a38",
          "body": "* phase 1 complete\n- initial support for non-streaming ReqLLM calls\n\n* ignore .env file as well\n\n* fixed how content_part indexes get mapped\n\n* formatting\n\n* updated live_call chat_anthropic_test file\n\n* updates for dotenvy config change\n- update AGENTS.md instructions\n\n* make the modules actually optional",
          "is_bot": false,
          "headline": "Add ChatReqLLM adapter - Experimental (#486)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-03-13T00:54:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1b51cfd9db99a1e4c21e765085720de59c2adae8",
          "body": "* Bump req >= 0.5.3\n\n* feature: create FileUploader modules",
          "is_bot": false,
          "headline": "feat: FileUploader (#477)",
          "author_name": "Jinkyou Son",
          "author_login": "nallwhy",
          "committed_at": "2026-03-08T00:08:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "493282c2c08a8c5b41d51e3f1539abd92e6da777",
          "body": null,
          "is_bot": false,
          "headline": "prep for v0.6.1 release (#482)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-03-05T05:04:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d89a22b52d25011c0434c9665ffceed95611df9e",
          "body": "* feat: Add ModelsLabImage provider for text-to-image generation\n\nAdds LangChain.Images.ModelsLabImage — an Elixir module for text-to-image\ngeneration via the ModelsLab REST API, following the pattern of\nLangChain.Images.OpenAIImage.\n\nChanges:\n- lib/images/modelslab_image.ex: Full Ecto.Schema-based \n[…]\nain, :modelslab_key, \"your-api-key\"\nAPI docs: https://docs.modelslab.com/image-generation/overview\n\n* formatting and unused alias warning\n\n---------\n\nCo-authored-by: Mark Ericksen <brainlid@gmail.com>",
          "is_bot": false,
          "headline": "feat: Add ModelsLabImage provider for text-to-image generation (#468)",
          "author_name": "Adhik Joshi",
          "author_login": "adhikjoshi",
          "committed_at": "2026-03-04T12:49:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2b0c5d0908dcaed8633ec31b7c78c0da53d2b73a",
          "body": "- adds test coverage\n- support examples liked content filtering error rejection by server",
          "is_bot": false,
          "headline": "support streamed error from server that halts delta stream (#480)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-03-04T12:44:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "904bc797c96518b95d534b75d9fcc5ab55f15787",
          "body": "* add support for tool interruption and resuming at the library level\n- this solves issues with SubAgents being able to properly interrupt and resume\n\n* test coverage for chain handling of on_tool_interrupted\n\n* formatting",
          "is_bot": false,
          "headline": "feat: add tool result interrupt/resume support (#479)",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-03-04T12:23:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c79553f8371244a8d0ece63737c1bade3f1f71da",
          "body": "* feat: add file_id support in ChatAnthropic\n\n* fix: address review feedback",
          "is_bot": false,
          "headline": "feat: add file_id support to ChatAnthropic (#475)",
          "author_name": "Jinkyou Son",
          "author_login": "nallwhy",
          "committed_at": "2026-02-28T15:38:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "65d293717a69388f153c8a96ee1cbdd7fcbabc0a",
          "body": "Some OpenAI-compatible providers (e.g. Groq) omit the content field\nin assistant messages with tool calls, resulting in nil content.\nThis caused a FunctionClauseError in parts_to_string/2 which requires\na list argument.\n\nReplaced parts_to_string with content_to_string which handles nil,\nstring, and list content types. Defaults to empty string to ensure\ndownstream processors can safely operate on processed_content.",
          "is_bot": false,
          "headline": "fix: handle nil content in run_message_processors (#473)",
          "author_name": "Peter Guskov",
          "author_login": "redmandarin",
          "committed_at": "2026-02-28T13:32:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aba572ca28bbf7e08608000260c3a0878899c4fa",
          "body": null,
          "is_bot": false,
          "headline": "feat: add structured output support to ChatAnthropic (#474)",
          "author_name": "Jinkyou Son",
          "author_login": "nallwhy",
          "committed_at": "2026-02-28T13:27:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0181c765c67d3f20ccda20eab8c48020b58e7f77",
          "body": "* fix verbosity\n\n* add error handling and azure test",
          "is_bot": false,
          "headline": "fix: Fix verbosity parameter and better error handling (#476)",
          "author_name": "Vasilis Spilka",
          "author_login": "vasspilka",
          "committed_at": "2026-02-28T13:23:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "62c88ed5b1016d67e5b0f5ab8af19026eb99cf23",
          "body": null,
          "is_bot": false,
          "headline": "formatting",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-02-28T13:20:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0d6896a6e1773a99707b6726156cb23396bdaef7",
          "body": "* feat(google): add handling of inline pdf content for Gemini\n\n* Add tests for inline data (pdf, csv) on Gemini\n\n* feat(ChatGoogleAI): Add CSV media type support for inline content\n\n* (gemini) Update file type documentation\n\n---------\n\nCo-authored-by: Christoffer Lundin Lind <christoffer@leaf.dk>",
          "is_bot": false,
          "headline": "feat(gemini): adding inline_data support for pdf and csv (#478)",
          "author_name": "Patrick Conrad",
          "author_login": "conpat",
          "committed_at": "2026-02-28T13:19:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cca047cb70b07c588d7a9764582773bae5703e8d",
          "body": "* feat: add verbosity parameter\n\n* update verbosity\n\n* update docs",
          "is_bot": false,
          "headline": "feat: add verbosity parameter to ChatOpenAIResponses (#470)",
          "author_name": "Vasilis Spilka",
          "author_login": "vasspilka",
          "committed_at": "2026-02-23T00:04:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bd8b5cb59b1b602156e248afd43d5808de67eef1",
          "body": null,
          "is_bot": false,
          "headline": "updated Mode moduledoc with examples for creating a custom mode",
          "author_name": "Mark Ericksen",
          "author_login": "brainlid",
          "committed_at": "2026-02-22T15:28:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 51,
      "commits_last_year": 205,
      "latest_release_at": "2026-07-08T17:48:39Z",
      "latest_release_tag": "v0.9.2",
      "releases_from_tags": false,
      "days_since_last_push": 7,
      "active_weeks_last_year": 44,
      "days_since_latest_release": 13,
      "mean_days_between_releases": 6.3
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 42,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "langchain",
          "exists": true,
          "license": "Apache-2.0",
          "keywords": [],
          "ecosystem": "hex",
          "matches_repo": true,
          "registry_url": "https://hex.pm/packages/langchain",
          "is_deprecated": false,
          "latest_version": "0.9.2",
          "repository_url": "https://github.com/brainlid/langchain",
          "versions_count": 51,
          "total_downloads": 776990,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 58079,
          "first_published_at": "2023-09-19T03:12:30.090158Z",
          "latest_published_at": "2026-07-08T17:49:14.481746Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 13
        }
      ]
    },
    "popularity": {
      "forks": 209,
      "stars": 1183,
      "watchers": 20,
      "fork_history": {
        "days": [
          {
            "date": "2023-08-20",
            "count": 1
          },
          {
            "date": "2023-09-17",
            "count": 1
          },
          {
            "date": "2023-09-26",
            "count": 1
          },
          {
            "date": "2023-09-28",
            "count": 1
          },
          {
            "date": "2023-09-29",
            "count": 1
          },
          {
            "date": "2023-10-06",
            "count": 1
          },
          {
            "date": "2023-10-08",
            "count": 1
          },
          {
            "date": "2023-10-09",
            "count": 1
          },
          {
            "date": "2023-10-18",
            "count": 1
          },
          {
            "date": "2023-10-19",
            "count": 1
          },
          {
            "date": "2023-10-25",
            "count": 2
          },
          {
            "date": "2023-10-30",
            "count": 1
          },
          {
            "date": "2023-11-01",
            "count": 2
          },
          {
            "date": "2023-11-07",
            "count": 1
          },
          {
            "date": "2023-11-08",
            "count": 1
          },
          {
            "date": "2023-11-25",
            "count": 1
          },
          {
            "date": "2023-11-27",
            "count": 1
          },
          {
            "date": "2023-12-03",
            "count": 1
          },
          {
            "date": "2023-12-08",
            "count": 1
          },
          {
            "date": "2023-12-12",
            "count": 2
          },
          {
            "date": "2023-12-14",
            "count": 1
          },
          {
            "date": "2023-12-20",
            "count": 1
          },
          {
            "date": "2023-12-21",
            "count": 1
          },
          {
            "date": "2023-12-22",
            "count": 1
          },
          {
            "date": "2024-02-05",
            "count": 1
          },
          {
            "date": "2024-02-06",
            "count": 1
          },
          {
            "date": "2024-02-07",
            "count": 1
          },
          {
            "date": "2024-02-09",
            "count": 1
          },
          {
            "date": "2024-02-15",
            "count": 1
          },
          {
            "date": "2024-03-04",
            "count": 1
          },
          {
            "date": "2024-03-05",
            "count": 1
          },
          {
            "date": "2024-03-14",
            "count": 2
          },
          {
            "date": "2024-03-17",
            "count": 1
          },
          {
            "date": "2024-03-23",
            "count": 1
          },
          {
            "date": "2024-04-06",
            "count": 1
          },
          {
            "date": "2024-04-24",
            "count": 1
          },
          {
            "date": "2024-04-28",
            "count": 1
          },
          {
            "date": "2024-05-14",
            "count": 1
          },
          {
            "date": "2024-05-15",
            "count": 2
          },
          {
            "date": "2024-05-20",
            "count": 1
          },
          {
            "date": "2024-05-21",
            "count": 1
          },
          {
            "date": "2024-05-30",
            "count": 1
          },
          {
            "date": "2024-05-31",
            "count": 1
          },
          {
            "date": "2024-06-04",
            "count": 1
          },
          {
            "date": "2024-06-11",
            "count": 1
          },
          {
            "date": "2024-06-17",
            "count": 2
          },
          {
            "date": "2024-06-20",
            "count": 1
          },
          {
            "date": "2024-07-02",
            "count": 1
          },
          {
            "date": "2024-07-04",
            "count": 1
          },
          {
            "date": "2024-07-23",
            "count": 1
          },
          {
            "date": "2024-07-26",
            "count": 1
          },
          {
            "date": "2024-08-14",
            "count": 1
          },
          {
            "date": "2024-08-17",
            "count": 1
          },
          {
            "date": "2024-09-05",
            "count": 1
          },
          {
            "date": "2024-09-21",
            "count": 2
          },
          {
            "date": "2024-09-27",
            "count": 1
          },
          {
            "date": "2024-10-20",
            "count": 1
          },
          {
            "date": "2024-11-06",
            "count": 1
          },
          {
            "date": "2024-11-14",
            "count": 1
          },
          {
            "date": "2024-11-19",
            "count": 1
          },
          {
            "date": "2024-12-11",
            "count": 1
          },
          {
            "date": "2024-12-19",
            "count": 1
          },
          {
            "date": "2024-12-20",
            "count": 1
          },
          {
            "date": "2025-01-03",
            "count": 1
          },
          {
            "date": "2025-01-04",
            "count": 2
          },
          {
            "date": "2025-01-09",
            "count": 1
          },
          {
            "date": "2025-01-13",
            "count": 1
          },
          {
            "date": "2025-01-16",
            "count": 1
          },
          {
            "date": "2025-01-29",
            "count": 1
          },
          {
            "date": "2025-02-02",
            "count": 2
          },
          {
            "date": "2025-02-05",
            "count": 1
          },
          {
            "date": "2025-02-06",
            "count": 1
          },
          {
            "date": "2025-02-08",
            "count": 1
          },
          {
            "date": "2025-02-12",
            "count": 1
          },
          {
            "date": "2025-02-13",
            "count": 1
          },
          {
            "date": "2025-02-17",
            "count": 1
          },
          {
            "date": "2025-02-18",
            "count": 3
          },
          {
            "date": "2025-02-28",
            "count": 1
          },
          {
            "date": "2025-03-11",
            "count": 1
          },
          {
            "date": "2025-03-15",
            "count": 1
          },
          {
            "date": "2025-03-17",
            "count": 1
          },
          {
            "date": "2025-03-18",
            "count": 1
          },
          {
            "date": "2025-03-19",
            "count": 1
          },
          {
            "date": "2025-03-24",
            "count": 1
          },
          {
            "date": "2025-03-25",
            "count": 1
          },
          {
            "date": "2025-03-26",
            "count": 1
          },
          {
            "date": "2025-03-31",
            "count": 1
          },
          {
            "date": "2025-04-02",
            "count": 1
          },
          {
            "date": "2025-04-15",
            "count": 1
          },
          {
            "date": "2025-04-17",
            "count": 1
          },
          {
            "date": "2025-04-22",
            "count": 2
          },
          {
            "date": "2025-04-25",
            "count": 1
          },
          {
            "date": "2025-05-10",
            "count": 1
          },
          {
            "date": "2025-05-13",
            "count": 1
          },
          {
            "date": "2025-05-21",
            "count": 1
          },
          {
            "date": "2025-05-24",
            "count": 1
          },
          {
            "date": "2025-05-27",
            "count": 1
          },
          {
            "date": "2025-06-01",
            "count": 1
          },
          {
            "date": "2025-06-04",
            "count": 1
          },
          {
            "date": "2025-06-06",
            "count": 1
          },
          {
            "date": "2025-06-08",
            "count": 1
          },
          {
            "date": "2025-06-09",
            "count": 1
          },
          {
            "date": "2025-06-10",
            "count": 1
          },
          {
            "date": "2025-06-12",
            "count": 1
          },
          {
            "date": "2025-06-20",
            "count": 2
          },
          {
            "date": "2025-06-22",
            "count": 1
          },
          {
            "date": "2025-06-28",
            "count": 1
          },
          {
            "date": "2025-07-06",
            "count": 2
          },
          {
            "date": "2025-07-09",
            "count": 1
          },
          {
            "date": "2025-07-12",
            "count": 2
          },
          {
            "date": "2025-07-15",
            "count": 2
          },
          {
            "date": "2025-07-17",
            "count": 1
          },
          {
            "date": "2025-07-20",
            "count": 1
          },
          {
            "date": "2025-07-24",
            "count": 1
          },
          {
            "date": "2025-07-27",
            "count": 1
          },
          {
            "date": "2025-08-01",
            "count": 1
          },
          {
            "date": "2025-08-06",
            "count": 1
          },
          {
            "date": "2025-08-09",
            "count": 1
          },
          {
            "date": "2025-08-17",
            "count": 1
          },
          {
            "date": "2025-08-20",
            "count": 1
          },
          {
            "date": "2025-08-21",
            "count": 1
          },
          {
            "date": "2025-08-23",
            "count": 1
          },
          {
            "date": "2025-08-27",
            "count": 1
          },
          {
            "date": "2025-08-28",
            "count": 1
          },
          {
            "date": "2025-09-03",
            "count": 1
          },
          {
            "date": "2025-09-05",
            "count": 1
          },
          {
            "date": "2025-09-07",
            "count": 2
          },
          {
            "date": "2025-09-09",
            "count": 1
          },
          {
            "date": "2025-09-11",
            "count": 1
          },
          {
            "date": "2025-09-15",
            "count": 1
          },
          {
            "date": "2025-09-25",
            "count": 1
          },
          {
            "date": "2025-10-02",
            "count": 1
          },
          {
            "date": "2025-10-16",
            "count": 1
          },
          {
            "date": "2025-10-20",
            "count": 1
          },
          {
            "date": "2025-10-22",
            "count": 1
          },
          {
            "date": "2025-10-23",
            "count": 1
          },
          {
            "date": "2025-10-26",
            "count": 1
          },
          {
            "date": "2025-10-29",
            "count": 1
          },
          {
            "date": "2025-11-17",
            "count": 2
          },
          {
            "date": "2025-11-24",
            "count": 1
          },
          {
            "date": "2025-12-05",
            "count": 1
          },
          {
            "date": "2025-12-11",
            "count": 1
          },
          {
            "date": "2025-12-14",
            "count": 1
          },
          {
            "date": "2025-12-15",
            "count": 1
          },
          {
            "date": "2025-12-17",
            "count": 1
          },
          {
            "date": "2025-12-19",
            "count": 1
          },
          {
            "date": "2025-12-23",
            "count": 1
          },
          {
            "date": "2025-12-24",
            "count": 1
          },
          {
            "date": "2025-12-27",
            "count": 1
          },
          {
            "date": "2026-01-05",
            "count": 3
          },
          {
            "date": "2026-01-06",
            "count": 1
          },
          {
            "date": "2026-01-18",
            "count": 1
          },
          {
            "date": "2026-01-21",
            "count": 2
          },
          {
            "date": "2026-02-09",
            "count": 1
          },
          {
            "date": "2026-02-11",
            "count": 1
          },
          {
            "date": "2026-02-19",
            "count": 1
          },
          {
            "date": "2026-02-20",
            "count": 1
          },
          {
            "date": "2026-02-21",
            "count": 1
          },
          {
            "date": "2026-02-23",
            "count": 1
          },
          {
            "date": "2026-03-04",
            "count": 2
          },
          {
            "date": "2026-03-10",
            "count": 1
          },
          {
            "date": "2026-03-17",
            "count": 1
          },
          {
            "date": "2026-03-23",
            "count": 1
          },
          {
            "date": "2026-03-28",
            "count": 1
          },
          {
            "date": "2026-04-01",
            "count": 2
          },
          {
            "date": "2026-04-04",
            "count": 1
          },
          {
            "date": "2026-04-18",
            "count": 1
          },
          {
            "date": "2026-05-02",
            "count": 1
          },
          {
            "date": "2026-05-07",
            "count": 1
          },
          {
            "date": "2026-05-08",
            "count": 1
          },
          {
            "date": "2026-05-12",
            "count": 1
          },
          {
            "date": "2026-05-14",
            "count": 1
          },
          {
            "date": "2026-05-23",
            "count": 1
          },
          {
            "date": "2026-06-06",
            "count": 1
          },
          {
            "date": "2026-06-16",
            "count": 1
          },
          {
            "date": "2026-06-19",
            "count": 1
          },
          {
            "date": "2026-06-27",
            "count": 1
          },
          {
            "date": "2026-06-29",
            "count": 2
          },
          {
            "date": "2026-07-08",
            "count": 1
          },
          {
            "date": "2026-07-09",
            "count": 1
          },
          {
            "date": "2026-07-15",
            "count": 1
          },
          {
            "date": "2026-07-21",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 206,
        "total_forks": 209
      },
      "star_history": {
        "days": [
          {
            "date": "2023-10-21",
            "count": 4
          },
          {
            "date": "2023-10-22",
            "count": 2
          },
          {
            "date": "2023-10-23",
            "count": 6
          },
          {
            "date": "2023-10-24",
            "count": 2
          },
          {
            "date": "2023-10-25",
            "count": 2
          },
          {
            "date": "2023-10-26",
            "count": 1
          },
          {
            "date": "2023-10-27",
            "count": 2
          },
          {
            "date": "2023-10-28",
            "count": 2
          },
          {
            "date": "2023-10-30",
            "count": 5
          },
          {
            "date": "2023-10-31",
            "count": 4
          },
          {
            "date": "2023-11-02",
            "count": 2
          },
          {
            "date": "2023-11-03",
            "count": 1
          },
          {
            "date": "2023-11-05",
            "count": 3
          },
          {
            "date": "2023-11-06",
            "count": 2
          },
          {
            "date": "2023-11-09",
            "count": 1
          },
          {
            "date": "2023-11-10",
            "count": 1
          },
          {
            "date": "2023-11-11",
            "count": 1
          },
          {
            "date": "2023-11-12",
            "count": 1
          },
          {
            "date": "2023-11-13",
            "count": 1
          },
          {
            "date": "2023-11-14",
            "count": 2
          },
          {
            "date": "2023-11-15",
            "count": 2
          },
          {
            "date": "2023-11-16",
            "count": 4
          },
          {
            "date": "2023-11-17",
            "count": 2
          },
          {
            "date": "2023-11-21",
            "count": 1
          },
          {
            "date": "2023-11-22",
            "count": 3
          },
          {
            "date": "2023-11-23",
            "count": 1
          },
          {
            "date": "2023-11-24",
            "count": 3
          },
          {
            "date": "2023-11-26",
            "count": 2
          },
          {
            "date": "2023-11-27",
            "count": 1
          },
          {
            "date": "2023-11-28",
            "count": 2
          },
          {
            "date": "2023-11-30",
            "count": 1
          },
          {
            "date": "2023-12-02",
            "count": 1
          },
          {
            "date": "2023-12-04",
            "count": 1
          },
          {
            "date": "2023-12-06",
            "count": 2
          },
          {
            "date": "2023-12-07",
            "count": 1
          },
          {
            "date": "2023-12-08",
            "count": 2
          },
          {
            "date": "2023-12-09",
            "count": 1
          },
          {
            "date": "2023-12-10",
            "count": 1
          },
          {
            "date": "2023-12-12",
            "count": 1
          },
          {
            "date": "2023-12-14",
            "count": 1
          },
          {
            "date": "2023-12-17",
            "count": 1
          },
          {
            "date": "2023-12-18",
            "count": 2
          },
          {
            "date": "2023-12-19",
            "count": 2
          },
          {
            "date": "2023-12-20",
            "count": 2
          },
          {
            "date": "2023-12-21",
            "count": 2
          },
          {
            "date": "2023-12-23",
            "count": 1
          },
          {
            "date": "2023-12-27",
            "count": 1
          },
          {
            "date": "2023-12-28",
            "count": 2
          },
          {
            "date": "2023-12-30",
            "count": 1
          },
          {
            "date": "2024-01-01",
            "count": 1
          },
          {
            "date": "2024-01-02",
            "count": 1
          },
          {
            "date": "2024-01-05",
            "count": 1
          },
          {
            "date": "2024-01-07",
            "count": 2
          },
          {
            "date": "2024-01-09",
            "count": 4
          },
          {
            "date": "2024-01-10",
            "count": 2
          },
          {
            "date": "2024-01-12",
            "count": 1
          },
          {
            "date": "2024-01-13",
            "count": 1
          },
          {
            "date": "2024-01-14",
            "count": 4
          },
          {
            "date": "2024-01-19",
            "count": 1
          },
          {
            "date": "2024-01-22",
            "count": 2
          },
          {
            "date": "2024-01-23",
            "count": 1
          },
          {
            "date": "2024-01-24",
            "count": 2
          },
          {
            "date": "2024-01-26",
            "count": 1
          },
          {
            "date": "2024-01-28",
            "count": 2
          },
          {
            "date": "2024-02-01",
            "count": 1
          },
          {
            "date": "2024-02-02",
            "count": 2
          },
          {
            "date": "2024-02-04",
            "count": 1
          },
          {
            "date": "2024-02-05",
            "count": 1
          },
          {
            "date": "2024-02-06",
            "count": 3
          },
          {
            "date": "2024-02-09",
            "count": 2
          },
          {
            "date": "2024-02-11",
            "count": 1
          },
          {
            "date": "2024-02-13",
            "count": 1
          },
          {
            "date": "2024-02-15",
            "count": 2
          },
          {
            "date": "2024-02-17",
            "count": 2
          },
          {
            "date": "2024-02-19",
            "count": 1
          },
          {
            "date": "2024-02-23",
            "count": 1
          },
          {
            "date": "2024-02-24",
            "count": 1
          },
          {
            "date": "2024-02-25",
            "count": 1
          },
          {
            "date": "2024-02-29",
            "count": 3
          },
          {
            "date": "2024-03-01",
            "count": 5
          },
          {
            "date": "2024-03-02",
            "count": 1
          },
          {
            "date": "2024-03-03",
            "count": 2
          },
          {
            "date": "2024-03-04",
            "count": 2
          },
          {
            "date": "2024-03-05",
            "count": 3
          },
          {
            "date": "2024-03-06",
            "count": 1
          },
          {
            "date": "2024-03-07",
            "count": 1
          },
          {
            "date": "2024-03-11",
            "count": 2
          },
          {
            "date": "2024-03-12",
            "count": 3
          },
          {
            "date": "2024-03-13",
            "count": 2
          },
          {
            "date": "2024-03-14",
            "count": 3
          },
          {
            "date": "2024-03-15",
            "count": 2
          },
          {
            "date": "2024-03-16",
            "count": 1
          },
          {
            "date": "2024-03-17",
            "count": 1
          },
          {
            "date": "2024-03-18",
            "count": 1
          },
          {
            "date": "2024-03-19",
            "count": 3
          },
          {
            "date": "2024-03-21",
            "count": 1
          },
          {
            "date": "2024-03-22",
            "count": 1
          },
          {
            "date": "2024-03-23",
            "count": 1
          },
          {
            "date": "2024-03-26",
            "count": 2
          },
          {
            "date": "2024-03-27",
            "count": 3
          },
          {
            "date": "2024-03-28",
            "count": 7
          },
          {
            "date": "2024-03-29",
            "count": 3
          },
          {
            "date": "2024-03-30",
            "count": 4
          },
          {
            "date": "2024-03-31",
            "count": 1
          },
          {
            "date": "2024-04-01",
            "count": 1
          },
          {
            "date": "2024-04-03",
            "count": 1
          },
          {
            "date": "2024-04-04",
            "count": 2
          },
          {
            "date": "2024-04-07",
            "count": 1
          },
          {
            "date": "2024-04-08",
            "count": 1
          },
          {
            "date": "2024-04-09",
            "count": 3
          },
          {
            "date": "2024-04-11",
            "count": 2
          },
          {
            "date": "2024-04-12",
            "count": 2
          },
          {
            "date": "2024-04-13",
            "count": 4
          },
          {
            "date": "2024-04-14",
            "count": 3
          },
          {
            "date": "2024-04-15",
            "count": 2
          },
          {
            "date": "2024-04-16",
            "count": 4
          },
          {
            "date": "2024-04-19",
            "count": 1
          },
          {
            "date": "2024-04-20",
            "count": 2
          },
          {
            "date": "2024-04-22",
            "count": 1
          },
          {
            "date": "2024-04-23",
            "count": 1
          },
          {
            "date": "2024-04-24",
            "count": 4
          },
          {
            "date": "2024-04-25",
            "count": 2
          },
          {
            "date": "2024-04-26",
            "count": 1
          },
          {
            "date": "2024-04-27",
            "count": 1
          },
          {
            "date": "2024-04-28",
            "count": 1
          },
          {
            "date": "2024-04-30",
            "count": 2
          },
          {
            "date": "2024-05-02",
            "count": 1
          },
          {
            "date": "2024-05-05",
            "count": 1
          },
          {
            "date": "2024-05-06",
            "count": 1
          },
          {
            "date": "2024-05-09",
            "count": 2
          },
          {
            "date": "2024-05-10",
            "count": 1
          },
          {
            "date": "2024-05-13",
            "count": 2
          },
          {
            "date": "2024-05-14",
            "count": 6
          },
          {
            "date": "2024-05-15",
            "count": 3
          },
          {
            "date": "2024-05-17",
            "count": 1
          },
          {
            "date": "2024-05-19",
            "count": 1
          },
          {
            "date": "2024-05-21",
            "count": 1
          },
          {
            "date": "2024-05-23",
            "count": 1
          },
          {
            "date": "2024-05-24",
            "count": 1
          },
          {
            "date": "2024-05-25",
            "count": 1
          },
          {
            "date": "2024-05-28",
            "count": 2
          },
          {
            "date": "2024-05-29",
            "count": 3
          },
          {
            "date": "2024-05-30",
            "count": 1
          },
          {
            "date": "2024-05-31",
            "count": 1
          },
          {
            "date": "2024-06-01",
            "count": 1
          },
          {
            "date": "2024-06-03",
            "count": 3
          },
          {
            "date": "2024-06-05",
            "count": 2
          },
          {
            "date": "2024-06-06",
            "count": 1
          },
          {
            "date": "2024-06-07",
            "count": 1
          },
          {
            "date": "2024-06-11",
            "count": 1
          },
          {
            "date": "2024-06-12",
            "count": 1
          },
          {
            "date": "2024-06-13",
            "count": 7
          },
          {
            "date": "2024-06-14",
            "count": 1
          },
          {
            "date": "2024-06-15",
            "count": 1
          },
          {
            "date": "2024-06-17",
            "count": 3
          },
          {
            "date": "2024-06-18",
            "count": 2
          },
          {
            "date": "2024-06-19",
            "count": 2
          },
          {
            "date": "2024-06-20",
            "count": 1
          },
          {
            "date": "2024-06-21",
            "count": 1
          },
          {
            "date": "2024-06-22",
            "count": 1
          },
          {
            "date": "2024-06-23",
            "count": 1
          },
          {
            "date": "2024-06-24",
            "count": 2
          },
          {
            "date": "2024-06-25",
            "count": 1
          },
          {
            "date": "2024-06-26",
            "count": 1
          },
          {
            "date": "2024-06-30",
            "count": 1
          },
          {
            "date": "2024-07-01",
            "count": 3
          },
          {
            "date": "2024-07-02",
            "count": 1
          },
          {
            "date": "2024-07-04",
            "count": 1
          },
          {
            "date": "2024-07-05",
            "count": 1
          },
          {
            "date": "2024-07-06",
            "count": 1
          },
          {
            "date": "2024-07-08",
            "count": 3
          },
          {
            "date": "2024-07-09",
            "count": 2
          },
          {
            "date": "2024-07-10",
            "count": 1
          },
          {
            "date": "2024-07-11",
            "count": 1
          },
          {
            "date": "2024-07-12",
            "count": 3
          },
          {
            "date": "2024-07-13",
            "count": 1
          },
          {
            "date": "2024-07-15",
            "count": 2
          },
          {
            "date": "2024-07-20",
            "count": 1
          },
          {
            "date": "2024-07-24",
            "count": 1
          },
          {
            "date": "2024-07-25",
            "count": 1
          },
          {
            "date": "2024-07-28",
            "count": 1
          },
          {
            "date": "2024-07-29",
            "count": 2
          },
          {
            "date": "2024-07-30",
            "count": 1
          },
          {
            "date": "2024-08-01",
            "count": 1
          },
          {
            "date": "2024-08-02",
            "count": 1
          },
          {
            "date": "2024-08-03",
            "count": 1
          },
          {
            "date": "2024-08-07",
            "count": 2
          },
          {
            "date": "2024-08-08",
            "count": 2
          },
          {
            "date": "2024-08-10",
            "count": 1
          },
          {
            "date": "2024-08-13",
            "count": 1
          },
          {
            "date": "2024-08-14",
            "count": 1
          },
          {
            "date": "2024-08-15",
            "count": 1
          },
          {
            "date": "2024-08-16",
            "count": 2
          },
          {
            "date": "2024-08-20",
            "count": 1
          },
          {
            "date": "2024-08-22",
            "count": 3
          },
          {
            "date": "2024-08-24",
            "count": 2
          },
          {
            "date": "2024-08-25",
            "count": 1
          },
          {
            "date": "2024-08-27",
            "count": 2
          },
          {
            "date": "2024-08-29",
            "count": 1
          },
          {
            "date": "2024-09-01",
            "count": 2
          },
          {
            "date": "2024-09-02",
            "count": 1
          },
          {
            "date": "2024-09-03",
            "count": 2
          },
          {
            "date": "2024-09-05",
            "count": 1
          },
          {
            "date": "2024-09-06",
            "count": 1
          },
          {
            "date": "2024-09-10",
            "count": 1
          },
          {
            "date": "2024-09-11",
            "count": 2
          },
          {
            "date": "2024-09-12",
            "count": 2
          },
          {
            "date": "2024-09-13",
            "count": 1
          },
          {
            "date": "2024-09-14",
            "count": 2
          },
          {
            "date": "2024-09-17",
            "count": 1
          },
          {
            "date": "2024-09-22",
            "count": 1
          },
          {
            "date": "2024-09-23",
            "count": 1
          },
          {
            "date": "2024-10-02",
            "count": 1
          },
          {
            "date": "2024-10-04",
            "count": 1
          },
          {
            "date": "2024-10-05",
            "count": 1
          },
          {
            "date": "2024-10-06",
            "count": 1
          },
          {
            "date": "2024-10-07",
            "count": 2
          },
          {
            "date": "2024-10-08",
            "count": 1
          },
          {
            "date": "2024-10-10",
            "count": 2
          },
          {
            "date": "2024-10-11",
            "count": 1
          },
          {
            "date": "2024-10-12",
            "count": 1
          },
          {
            "date": "2024-10-13",
            "count": 1
          },
          {
            "date": "2024-10-14",
            "count": 1
          },
          {
            "date": "2024-10-15",
            "count": 1
          },
          {
            "date": "2024-10-18",
            "count": 2
          },
          {
            "date": "2024-10-19",
            "count": 2
          },
          {
            "date": "2024-10-21",
            "count": 3
          },
          {
            "date": "2024-10-22",
            "count": 1
          },
          {
            "date": "2024-10-25",
            "count": 1
          },
          {
            "date": "2024-10-27",
            "count": 2
          },
          {
            "date": "2024-10-29",
            "count": 1
          },
          {
            "date": "2024-10-30",
            "count": 2
          },
          {
            "date": "2024-10-31",
            "count": 7
          },
          {
            "date": "2024-11-01",
            "count": 7
          },
          {
            "date": "2024-11-02",
            "count": 2
          },
          {
            "date": "2024-11-03",
            "count": 5
          },
          {
            "date": "2024-11-04",
            "count": 3
          },
          {
            "date": "2024-11-05",
            "count": 5
          },
          {
            "date": "2024-11-06",
            "count": 4
          },
          {
            "date": "2024-11-07",
            "count": 2
          },
          {
            "date": "2024-11-08",
            "count": 1
          },
          {
            "date": "2024-11-09",
            "count": 1
          },
          {
            "date": "2024-11-10",
            "count": 1
          },
          {
            "date": "2024-11-11",
            "count": 3
          },
          {
            "date": "2024-11-12",
            "count": 2
          },
          {
            "date": "2024-11-13",
            "count": 4
          },
          {
            "date": "2024-11-14",
            "count": 4
          },
          {
            "date": "2024-11-15",
            "count": 2
          },
          {
            "date": "2024-11-16",
            "count": 2
          },
          {
            "date": "2024-11-19",
            "count": 2
          },
          {
            "date": "2024-11-20",
            "count": 1
          },
          {
            "date": "2024-11-22",
            "count": 1
          },
          {
            "date": "2024-11-23",
            "count": 1
          },
          {
            "date": "2024-11-24",
            "count": 2
          },
          {
            "date": "2024-11-25",
            "count": 1
          },
          {
            "date": "2024-11-26",
            "count": 1
          },
          {
            "date": "2024-11-27",
            "count": 1
          },
          {
            "date": "2024-11-28",
            "count": 1
          },
          {
            "date": "2024-11-30",
            "count": 1
          },
          {
            "date": "2024-12-01",
            "count": 1
          },
          {
            "date": "2024-12-02",
            "count": 1
          },
          {
            "date": "2024-12-04",
            "count": 2
          },
          {
            "date": "2024-12-06",
            "count": 4
          },
          {
            "date": "2024-12-07",
            "count": 1
          },
          {
            "date": "2024-12-08",
            "count": 1
          },
          {
            "date": "2024-12-09",
            "count": 3
          },
          {
            "date": "2024-12-10",
            "count": 1
          },
          {
            "date": "2024-12-12",
            "count": 2
          },
          {
            "date": "2024-12-17",
            "count": 1
          },
          {
            "date": "2024-12-18",
            "count": 2
          },
          {
            "date": "2024-12-19",
            "count": 1
          },
          {
            "date": "2024-12-20",
            "count": 1
          },
          {
            "date": "2024-12-21",
            "count": 2
          },
          {
            "date": "2024-12-25",
            "count": 1
          },
          {
            "date": "2024-12-26",
            "count": 2
          },
          {
            "date": "2024-12-27",
            "count": 2
          },
          {
            "date": "2024-12-29",
            "count": 1
          },
          {
            "date": "2024-12-30",
            "count": 1
          },
          {
            "date": "2025-01-02",
            "count": 2
          },
          {
            "date": "2025-01-03",
            "count": 2
          },
          {
            "date": "2025-01-04",
            "count": 1
          },
          {
            "date": "2025-01-05",
            "count": 1
          },
          {
            "date": "2025-01-07",
            "count": 2
          },
          {
            "date": "2025-01-09",
            "count": 2
          },
          {
            "date": "2025-01-10",
            "count": 2
          },
          {
            "date": "2025-01-11",
            "count": 1
          },
          {
            "date": "2025-01-13",
            "count": 2
          },
          {
            "date": "2025-01-17",
            "count": 1
          },
          {
            "date": "2025-01-18",
            "count": 2
          },
          {
            "date": "2025-01-19",
            "count": 1
          },
          {
            "date": "2025-01-20",
            "count": 1
          },
          {
            "date": "2025-01-21",
            "count": 2
          },
          {
            "date": "2025-01-22",
            "count": 1
          },
          {
            "date": "2025-01-23",
            "count": 5
          },
          {
            "date": "2025-01-24",
            "count": 3
          },
          {
            "date": "2025-01-25",
            "count": 4
          },
          {
            "date": "2025-01-27",
            "count": 4
          },
          {
            "date": "2025-01-28",
            "count": 1
          },
          {
            "date": "2025-01-29",
            "count": 1
          },
          {
            "date": "2025-01-30",
            "count": 2
          },
          {
            "date": "2025-01-31",
            "count": 2
          },
          {
            "date": "2025-02-01",
            "count": 1
          },
          {
            "date": "2025-02-02",
            "count": 1
          },
          {
            "date": "2025-02-03",
            "count": 1
          },
          {
            "date": "2025-02-04",
            "count": 4
          },
          {
            "date": "2025-02-05",
            "count": 3
          },
          {
            "date": "2025-02-06",
            "count": 3
          },
          {
            "date": "2025-02-08",
            "count": 2
          },
          {
            "date": "2025-02-10",
            "count": 2
          },
          {
            "date": "2025-02-11",
            "count": 3
          },
          {
            "date": "2025-02-12",
            "count": 3
          },
          {
            "date": "2025-02-13",
            "count": 1
          },
          {
            "date": "2025-02-14",
            "count": 1
          },
          {
            "date": "2025-02-17",
            "count": 2
          },
          {
            "date": "2025-02-18",
            "count": 2
          },
          {
            "date": "2025-02-19",
            "count": 2
          },
          {
            "date": "2025-02-20",
            "count": 3
          },
          {
            "date": "2025-02-21",
            "count": 1
          },
          {
            "date": "2025-02-22",
            "count": 1
          },
          {
            "date": "2025-02-24",
            "count": 2
          },
          {
            "date": "2025-02-25",
            "count": 1
          },
          {
            "date": "2025-02-27",
            "count": 2
          },
          {
            "date": "2025-03-02",
            "count": 2
          },
          {
            "date": "2025-03-04",
            "count": 2
          },
          {
            "date": "2025-03-05",
            "count": 1
          },
          {
            "date": "2025-03-06",
            "count": 1
          },
          {
            "date": "2025-03-07",
            "count": 1
          },
          {
            "date": "2025-03-08",
            "count": 1
          },
          {
            "date": "2025-03-11",
            "count": 1
          },
          {
            "date": "2025-03-12",
            "count": 1
          },
          {
            "date": "2025-03-13",
            "count": 1
          },
          {
            "date": "2025-03-15",
            "count": 1
          },
          {
            "date": "2025-03-16",
            "count": 4
          },
          {
            "date": "2025-03-17",
            "count": 2
          },
          {
            "date": "2025-03-18",
            "count": 2
          },
          {
            "date": "2025-03-19",
            "count": 3
          },
          {
            "date": "2025-03-21",
            "count": 1
          },
          {
            "date": "2025-03-23",
            "count": 1
          },
          {
            "date": "2025-03-24",
            "count": 1
          },
          {
            "date": "2025-03-25",
            "count": 1
          },
          {
            "date": "2025-03-26",
            "count": 1
          },
          {
            "date": "2025-03-27",
            "count": 3
          },
          {
            "date": "2025-03-28",
            "count": 2
          },
          {
            "date": "2025-03-30",
            "count": 2
          },
          {
            "date": "2025-04-01",
            "count": 2
          },
          {
            "date": "2025-04-02",
            "count": 3
          },
          {
            "date": "2025-04-04",
            "count": 2
          },
          {
            "date": "2025-04-05",
            "count": 1
          },
          {
            "date": "2025-04-06",
            "count": 3
          },
          {
            "date": "2025-04-07",
            "count": 1
          },
          {
            "date": "2025-04-08",
            "count": 1
          },
          {
            "date": "2025-04-09",
            "count": 1
          },
          {
            "date": "2025-04-10",
            "count": 2
          },
          {
            "date": "2025-04-11",
            "count": 1
          },
          {
            "date": "2025-04-12",
            "count": 2
          },
          {
            "date": "2025-04-14",
            "count": 2
          },
          {
            "date": "2025-04-18",
            "count": 1
          },
          {
            "date": "2025-04-19",
            "count": 3
          },
          {
            "date": "2025-04-20",
            "count": 1
          },
          {
            "date": "2025-04-21",
            "count": 1
          },
          {
            "date": "2025-04-23",
            "count": 2
          },
          {
            "date": "2025-04-24",
            "count": 1
          },
          {
            "date": "2025-04-25",
            "count": 1
          },
          {
            "date": "2025-04-26",
            "count": 1
          },
          {
            "date": "2025-04-27",
            "count": 2
          },
          {
            "date": "2025-04-29",
            "count": 1
          },
          {
            "date": "2025-04-30",
            "count": 1
          },
          {
            "date": "2025-05-01",
            "count": 1
          },
          {
            "date": "2025-05-02",
            "count": 1
          },
          {
            "date": "2025-05-04",
            "count": 2
          },
          {
            "date": "2025-05-05",
            "count": 1
          },
          {
            "date": "2025-05-07",
            "count": 1
          },
          {
            "date": "2025-05-09",
            "count": 1
          },
          {
            "date": "2025-05-10",
            "count": 1
          },
          {
            "date": "2025-05-13",
            "count": 1
          },
          {
            "date": "2025-05-15",
            "count": 2
          },
          {
            "date": "2025-05-16",
            "count": 3
          },
          {
            "date": "2025-05-18",
            "count": 1
          },
          {
            "date": "2025-05-19",
            "count": 1
          },
          {
            "date": "2025-05-20",
            "count": 1
          },
          {
            "date": "2025-05-22",
            "count": 1
          },
          {
            "date": "2025-05-23",
            "count": 2
          },
          {
            "date": "2025-05-24",
            "count": 2
          },
          {
            "date": "2025-05-26",
            "count": 1
          },
          {
            "date": "2025-05-28",
            "count": 1
          },
          {
            "date": "2025-05-29",
            "count": 2
          },
          {
            "date": "2025-05-30",
            "count": 1
          },
          {
            "date": "2025-05-31",
            "count": 1
          },
          {
            "date": "2025-06-03",
            "count": 3
          },
          {
            "date": "2025-06-04",
            "count": 3
          },
          {
            "date": "2025-06-05",
            "count": 2
          },
          {
            "date": "2025-06-06",
            "count": 1
          },
          {
            "date": "2025-06-07",
            "count": 1
          },
          {
            "date": "2025-06-08",
            "count": 1
          },
          {
            "date": "2025-06-09",
            "count": 3
          },
          {
            "date": "2025-06-10",
            "count": 2
          },
          {
            "date": "2025-06-11",
            "count": 2
          },
          {
            "date": "2025-06-12",
            "count": 2
          },
          {
            "date": "2025-06-14",
            "count": 4
          },
          {
            "date": "2025-06-15",
            "count": 1
          },
          {
            "date": "2025-06-16",
            "count": 1
          },
          {
            "date": "2025-06-18",
            "count": 2
          },
          {
            "date": "2025-06-19",
            "count": 1
          },
          {
            "date": "2025-06-21",
            "count": 1
          },
          {
            "date": "2025-06-23",
            "count": 2
          },
          {
            "date": "2025-06-24",
            "count": 2
          },
          {
            "date": "2025-06-25",
            "count": 1
          },
          {
            "date": "2025-06-26",
            "count": 1
          },
          {
            "date": "2025-06-29",
            "count": 1
          },
          {
            "date": "2025-06-30",
            "count": 1
          },
          {
            "date": "2025-07-01",
            "count": 1
          },
          {
            "date": "2025-07-02",
            "count": 1
          },
          {
            "date": "2025-07-03",
            "count": 1
          },
          {
            "date": "2025-07-06",
            "count": 1
          },
          {
            "date": "2025-07-07",
            "count": 1
          },
          {
            "date": "2025-07-08",
            "count": 1
          },
          {
            "date": "2025-07-09",
            "count": 1
          },
          {
            "date": "2025-07-12",
            "count": 1
          },
          {
            "date": "2025-07-15",
            "count": 3
          },
          {
            "date": "2025-07-16",
            "count": 1
          },
          {
            "date": "2025-07-17",
            "count": 1
          },
          {
            "date": "2025-07-21",
            "count": 2
          },
          {
            "date": "2025-07-22",
            "count": 1
          },
          {
            "date": "2025-07-23",
            "count": 2
          },
          {
            "date": "2025-07-25",
            "count": 1
          },
          {
            "date": "2025-07-27",
            "count": 1
          },
          {
            "date": "2025-07-28",
            "count": 2
          },
          {
            "date": "2025-07-29",
            "count": 1
          },
          {
            "date": "2025-08-01",
            "count": 1
          },
          {
            "date": "2025-08-02",
            "count": 1
          },
          {
            "date": "2025-08-05",
            "count": 2
          },
          {
            "date": "2025-08-06",
            "count": 3
          },
          {
            "date": "2025-08-07",
            "count": 2
          },
          {
            "date": "2025-08-08",
            "count": 1
          },
          {
            "date": "2025-08-09",
            "count": 1
          },
          {
            "date": "2025-08-10",
            "count": 2
          },
          {
            "date": "2025-08-12",
            "count": 2
          },
          {
            "date": "2025-08-14",
            "count": 1
          },
          {
            "date": "2025-08-17",
            "count": 2
          },
          {
            "date": "2025-08-18",
            "count": 2
          },
          {
            "date": "2025-08-19",
            "count": 1
          },
          {
            "date": "2025-08-20",
            "count": 1
          },
          {
            "date": "2025-08-21",
            "count": 2
          },
          {
            "date": "2025-08-23",
            "count": 1
          },
          {
            "date": "2025-08-25",
            "count": 1
          },
          {
            "date": "2025-08-26",
            "count": 1
          },
          {
            "date": "2025-08-28",
            "count": 1
          },
          {
            "date": "2025-08-29",
            "count": 1
          },
          {
            "date": "2025-08-30",
            "count": 1
          },
          {
            "date": "2025-09-01",
            "count": 1
          },
          {
            "date": "2025-09-02",
            "count": 2
          },
          {
            "date": "2025-09-03",
            "count": 1
          },
          {
            "date": "2025-09-05",
            "count": 1
          },
          {
            "date": "2025-09-06",
            "count": 2
          },
          {
            "date": "2025-09-07",
            "count": 1
          },
          {
            "date": "2025-09-10",
            "count": 2
          },
          {
            "date": "2025-09-12",
            "count": 1
          },
          {
            "date": "2025-09-13",
            "count": 2
          },
          {
            "date": "2025-09-16",
            "count": 1
          },
          {
            "date": "2025-09-17",
            "count": 1
          },
          {
            "date": "2025-09-19",
            "count": 1
          },
          {
            "date": "2025-09-23",
            "count": 1
          },
          {
            "date": "2025-09-24",
            "count": 1
          },
          {
            "date": "2025-09-25",
            "count": 1
          },
          {
            "date": "2025-09-26",
            "count": 1
          },
          {
            "date": "2025-09-29",
            "count": 1
          },
          {
            "date": "2025-09-30",
            "count": 1
          },
          {
            "date": "2025-10-01",
            "count": 1
          },
          {
            "date": "2025-10-02",
            "count": 1
          },
          {
            "date": "2025-10-03",
            "count": 2
          },
          {
            "date": "2025-10-05",
            "count": 1
          },
          {
            "date": "2025-10-07",
            "count": 1
          },
          {
            "date": "2025-10-11",
            "count": 1
          },
          {
            "date": "2025-10-14",
            "count": 1
          },
          {
            "date": "2025-10-15",
            "count": 2
          },
          {
            "date": "2025-10-16",
            "count": 1
          },
          {
            "date": "2025-10-17",
            "count": 1
          },
          {
            "date": "2025-10-20",
            "count": 1
          },
          {
            "date": "2025-10-21",
            "count": 1
          },
          {
            "date": "2025-10-22",
            "count": 1
          },
          {
            "date": "2025-10-26",
            "count": 1
          },
          {
            "date": "2025-10-27",
            "count": 1
          },
          {
            "date": "2025-11-02",
            "count": 1
          },
          {
            "date": "2025-11-03",
            "count": 2
          },
          {
            "date": "2025-11-10",
            "count": 1
          },
          {
            "date": "2025-11-11",
            "count": 1
          },
          {
            "date": "2025-11-12",
            "count": 1
          },
          {
            "date": "2025-11-13",
            "count": 1
          },
          {
            "date": "2025-11-15",
            "count": 1
          },
          {
            "date": "2025-11-17",
            "count": 1
          },
          {
            "date": "2025-11-19",
            "count": 2
          },
          {
            "date": "2025-11-22",
            "count": 1
          },
          {
            "date": "2025-11-23",
            "count": 1
          },
          {
            "date": "2025-11-25",
            "count": 1
          },
          {
            "date": "2025-11-26",
            "count": 1
          },
          {
            "date": "2025-11-29",
            "count": 2
          },
          {
            "date": "2025-12-05",
            "count": 2
          },
          {
            "date": "2025-12-07",
            "count": 1
          },
          {
            "date": "2025-12-08",
            "count": 1
          },
          {
            "date": "2025-12-12",
            "count": 1
          },
          {
            "date": "2025-12-16",
            "count": 1
          },
          {
            "date": "2025-12-19",
            "count": 1
          },
          {
            "date": "2025-12-21",
            "count": 1
          },
          {
            "date": "2025-12-23",
            "count": 1
          },
          {
            "date": "2025-12-29",
            "count": 1
          },
          {
            "date": "2025-12-30",
            "count": 2
          },
          {
            "date": "2026-01-13",
            "count": 1
          },
          {
            "date": "2026-01-14",
            "count": 1
          },
          {
            "date": "2026-01-15",
            "count": 2
          },
          {
            "date": "2026-01-17",
            "count": 2
          },
          {
            "date": "2026-01-18",
            "count": 2
          },
          {
            "date": "2026-01-19",
            "count": 2
          },
          {
            "date": "2026-01-20",
            "count": 2
          },
          {
            "date": "2026-01-24",
            "count": 2
          },
          {
            "date": "2026-01-26",
            "count": 1
          },
          {
            "date": "2026-01-27",
            "count": 1
          },
          {
            "date": "2026-01-28",
            "count": 1
          },
          {
            "date": "2026-01-29",
            "count": 1
          },
          {
            "date": "2026-01-30",
            "count": 1
          },
          {
            "date": "2026-01-31",
            "count": 2
          },
          {
            "date": "2026-02-01",
            "count": 1
          },
          {
            "date": "2026-02-02",
            "count": 2
          },
          {
            "date": "2026-02-04",
            "count": 1
          },
          {
            "date": "2026-02-05",
            "count": 1
          },
          {
            "date": "2026-02-07",
            "count": 1
          },
          {
            "date": "2026-02-10",
            "count": 1
          },
          {
            "date": "2026-02-12",
            "count": 1
          },
          {
            "date": "2026-02-13",
            "count": 3
          },
          {
            "date": "2026-02-15",
            "count": 2
          },
          {
            "date": "2026-02-17",
            "count": 2
          },
          {
            "date": "2026-02-18",
            "count": 7
          },
          {
            "date": "2026-02-19",
            "count": 6
          },
          {
            "date": "2026-02-20",
            "count": 5
          },
          {
            "date": "2026-02-21",
            "count": 2
          },
          {
            "date": "2026-02-22",
            "count": 2
          },
          {
            "date": "2026-02-23",
            "count": 3
          },
          {
            "date": "2026-02-24",
            "count": 2
          },
          {
            "date": "2026-02-26",
            "count": 1
          },
          {
            "date": "2026-02-28",
            "count": 1
          },
          {
            "date": "2026-03-04",
            "count": 1
          },
          {
            "date": "2026-03-05",
            "count": 1
          },
          {
            "date": "2026-03-06",
            "count": 2
          },
          {
            "date": "2026-03-07",
            "count": 4
          },
          {
            "date": "2026-03-09",
            "count": 1
          },
          {
            "date": "2026-03-10",
            "count": 2
          },
          {
            "date": "2026-03-11",
            "count": 1
          },
          {
            "date": "2026-03-12",
            "count": 1
          },
          {
            "date": "2026-03-13",
            "count": 1
          },
          {
            "date": "2026-03-14",
            "count": 1
          },
          {
            "date": "2026-03-17",
            "count": 1
          },
          {
            "date": "2026-03-18",
            "count": 3
          },
          {
            "date": "2026-03-20",
            "count": 2
          },
          {
            "date": "2026-03-21",
            "count": 1
          },
          {
            "date": "2026-03-22",
            "count": 1
          },
          {
            "date": "2026-03-23",
            "count": 1
          },
          {
            "date": "2026-03-28",
            "count": 4
          },
          {
            "date": "2026-03-30",
            "count": 1
          },
          {
            "date": "2026-03-31",
            "count": 1
          },
          {
            "date": "2026-04-01",
            "count": 1
          },
          {
            "date": "2026-04-02",
            "count": 3
          },
          {
            "date": "2026-04-03",
            "count": 1
          },
          {
            "date": "2026-04-07",
            "count": 4
          },
          {
            "date": "2026-04-08",
            "count": 2
          },
          {
            "date": "2026-04-09",
            "count": 2
          },
          {
            "date": "2026-04-10",
            "count": 1
          },
          {
            "date": "2026-04-11",
            "count": 2
          },
          {
            "date": "2026-04-13",
            "count": 1
          },
          {
            "date": "2026-04-18",
            "count": 1
          },
          {
            "date": "2026-04-22",
            "count": 1
          },
          {
            "date": "2026-04-23",
            "count": 1
          },
          {
            "date": "2026-04-24",
            "count": 1
          },
          {
            "date": "2026-04-25",
            "count": 1
          },
          {
            "date": "2026-04-29",
            "count": 3
          },
          {
            "date": "2026-04-30",
            "count": 1
          },
          {
            "date": "2026-05-01",
            "count": 4
          },
          {
            "date": "2026-05-02",
            "count": 1
          },
          {
            "date": "2026-05-03",
            "count": 2
          },
          {
            "date": "2026-05-04",
            "count": 1
          },
          {
            "date": "2026-05-05",
            "count": 2
          },
          {
            "date": "2026-05-06",
            "count": 1
          },
          {
            "date": "2026-05-07",
            "count": 1
          },
          {
            "date": "2026-05-10",
            "count": 4
          },
          {
            "date": "2026-05-11",
            "count": 2
          },
          {
            "date": "2026-05-12",
            "count": 2
          },
          {
            "date": "2026-05-13",
            "count": 2
          },
          {
            "date": "2026-05-23",
            "count": 1
          },
          {
            "date": "2026-05-26",
            "count": 1
          },
          {
            "date": "2026-06-01",
            "count": 1
          },
          {
            "date": "2026-06-15",
            "count": 1
          },
          {
            "date": "2026-06-26",
            "count": 1
          },
          {
            "date": "2026-06-27",
            "count": 1
          },
          {
            "date": "2026-06-29",
            "count": 1
          },
          {
            "date": "2026-07-02",
            "count": 1
          },
          {
            "date": "2026-07-04",
            "count": 1
          },
          {
            "date": "2026-07-07",
            "count": 3
          },
          {
            "date": "2026-07-13",
            "count": 1
          },
          {
            "date": "2026-07-15",
            "count": 1
          },
          {
            "date": "2026-07-17",
            "count": 1
          },
          {
            "date": "2026-07-21",
            "count": 1
          }
        ],
        "complete": false,
        "collected": 1000,
        "total_stars": 1183
      },
      "open_issues_and_prs": 30
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "mix.exs"
      ],
      "largest_source_bytes": 180612,
      "source_files_sampled": 172,
      "oversized_source_files": 8,
      "agent_instruction_files": [
        ".cursor/rules/changelog-rules.mdc",
        "AGENTS.md",
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 11639
    },
    "dependencies": {
      "manifests": [
        "mix.exs"
      ],
      "advisories": {
        "error": "No resolved dependencies to assess",
        "scope": "repository_graph",
        "source": null,
        "findings": [],
        "collected": false,
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "hex"
      ],
      "dependencies": [
        {
          "name": "no_warn",
          "manifest": "mix.exs",
          "ecosystem": "hex",
          "version_constraint": "priv/plts/project.plt"
        },
        {
          "name": "ecto",
          "manifest": "mix.exs",
          "ecosystem": "hex",
          "version_constraint": "~> 3.10 or ~> 3.11"
        },
        {
          "name": "gettext",
          "manifest": "mix.exs",
          "ecosystem": "hex",
          "version_constraint": "~> 0.26.2 or ~> 1.0.0"
        },
        {
          "name": "req",
          "manifest": "mix.exs",
          "ecosystem": "hex",
          "version_constraint": ">= 0.5.3"
        },
        {
          "name": "mint_web_socket",
          "manifest": "mix.exs",
          "ecosystem": "hex",
          "version_constraint": "~> 1.0"
        },
        {
          "name": "nimble_parsec",
          "manifest": "mix.exs",
          "ecosystem": "hex",
          "version_constraint": "~> 1.4"
        },
        {
          "name": "abacus",
          "manifest": "mix.exs",
          "ecosystem": "hex",
          "version_constraint": "~> 2.1.0"
        },
        {
          "name": "nx",
          "manifest": "mix.exs",
          "ecosystem": "hex",
          "version_constraint": ">= 0.7.0"
        },
        {
          "name": "opentelemetry_api",
          "manifest": "mix.exs",
          "ecosystem": "hex",
          "version_constraint": "~> 1.4"
        },
        {
          "name": "dotenvy",
          "manifest": "mix.exs",
          "ecosystem": "hex",
          "version_constraint": "~> 1.1"
        },
        {
          "name": "req_llm",
          "manifest": "mix.exs",
          "ecosystem": "hex",
          "version_constraint": ">= 1.6.0"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [],
        "collected": true,
        "truncated": false,
        "total_count": 0,
        "direct_count": 0,
        "indirect_count": 0
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 5,
        "merged_prs": 358,
        "open_issues": 25,
        "closed_ratio": 0.792,
        "closed_issues": 95,
        "closed_unmerged_prs": 63
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "brainlid",
          "commits": 593,
          "avatar_url": "https://avatars.githubusercontent.com/u/808984?v=4"
        },
        {
          "type": "User",
          "login": "nallwhy",
          "commits": 15,
          "avatar_url": "https://avatars.githubusercontent.com/u/4961183?v=4"
        },
        {
          "type": "User",
          "login": "montebrown",
          "commits": 10,
          "avatar_url": "https://avatars.githubusercontent.com/u/57874?v=4"
        },
        {
          "type": "User",
          "login": "stevehodgkiss",
          "commits": 9,
          "avatar_url": "https://avatars.githubusercontent.com/u/62331?v=4"
        },
        {
          "type": "User",
          "login": "vasspilka",
          "commits": 9,
          "avatar_url": "https://avatars.githubusercontent.com/u/3274419?v=4"
        },
        {
          "type": "User",
          "login": "raulchedrese",
          "commits": 8,
          "avatar_url": "https://avatars.githubusercontent.com/u/248759?v=4"
        },
        {
          "type": "User",
          "login": "elliotb",
          "commits": 7,
          "avatar_url": "https://avatars.githubusercontent.com/u/11383?v=4"
        },
        {
          "type": "User",
          "login": "jadengis",
          "commits": 6,
          "avatar_url": "https://avatars.githubusercontent.com/u/13421336?v=4"
        },
        {
          "type": "User",
          "login": "fbettag",
          "commits": 6,
          "avatar_url": "https://avatars.githubusercontent.com/u/79918?v=4"
        },
        {
          "type": "User",
          "login": "arjan",
          "commits": 5,
          "avatar_url": "https://avatars.githubusercontent.com/u/24722?v=4"
        }
      ],
      "contributors_sampled": 88,
      "top_contributor_share": 0.739
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "elixir.yml"
      ],
      "has_docs_dir": false,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "mix.lock"
      ],
      "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": 3,
            "reason": "branch protection is not maximal on development and all release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "30 out of 30 merged PRs checked by a CI test -- score normalized to 10",
            "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": 2,
            "reason": "Found 6/25 approved changesets -- score normalized to 2",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 16 contributing companies or organizations",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 10,
            "reason": "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": 9,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 6 issue activity found in the last 90 days -- score normalized to 10",
            "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": 10,
            "reason": "all dependencies are pinned",
            "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": 10,
            "reason": "GitHub workflow tokens follow principle of least privilege",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "11 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "b6d80cd57f6726b665fdd1356e7c78f15d0abe31",
        "ran_at": "2026-07-21T21:12:37Z",
        "aggregate_score": 6.1,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": true
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/brainlid/langchain",
    "host": "github.com",
    "name": "langchain",
    "owner": "brainlid"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "good",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 72,
      "inputs": {
        "security": 60,
        "vitality": 96,
        "community": 66,
        "governance": 65,
        "engineering": 67
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 96,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "excellent",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 94,
            "inputs": {
              "commits_last_year": 205,
              "human_commit_share": 0.93,
              "days_since_last_push": 7,
              "active_weeks_last_year": 44
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 7 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 7
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "44/52 weeks with commits",
                "points": 30.5,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 44
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "205 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 205
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 6 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "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": 100,
            "inputs": {
              "releases_count": 51,
              "latest_release_tag": "v0.9.2",
              "releases_from_tags": false,
              "days_since_latest_release": 13,
              "mean_days_between_releases": 6.3
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "51 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 51
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 13 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 13
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~6.3 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 6.3
                    }
                  }
                ],
                "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": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 7,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 7 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 7
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "moderate",
        "name": "Community & Adoption",
        "value": 66,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "good",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 76,
            "inputs": {
              "forks": 209,
              "stars": 1183,
              "watchers": 20,
              "growth_state": "organic",
              "growth_factor_pct": 100
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "1,183 stars",
                "points": 49.8,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 1183
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "209 forks",
                "points": 19.3,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 209
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "20 watchers",
                "points": 7.1,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 20
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "at_risk",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 44,
            "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": "license file present, not a recognized license",
                "points": 16.9,
                "status": "partial",
                "details": [
                  {
                    "code": "license_custom",
                    "params": {}
                  }
                ],
                "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
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "good",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 79,
            "inputs": {
              "packages": [
                "langchain"
              ],
              "dependents": null,
              "ecosystems": "hex",
              "total_downloads": 776990,
              "monthly_downloads": 58079
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "58,079 downloads/month across hex",
                "points": 63.5,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 58079,
                      "ecosystems": "hex"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 65,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "at_risk",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 38,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 88,
              "top_contributor_share": 0.739
            },
            "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 74% of commits",
                "points": 5.9,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 74
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "88 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 88
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 16 contributing companies or organizations",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 72,
            "inputs": {
              "merged_prs": 358,
              "open_issues": 25,
              "closed_issues": 95,
              "issue_closed_ratio": 0.792,
              "closed_unmerged_prs": 63
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "79% of issues closed",
                "points": 37,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 79
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "358/421 decided PRs merged",
                "points": 32.5,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 358,
                      "decided": 421
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 6/25 approved changesets -- score normalized to 2",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 63,
            "inputs": {
              "followers": 194,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "brainlid",
              "public_repos": 43,
              "account_age_days": 5536
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "194 followers of brainlid",
                "points": 16.5,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 194,
                      "login": "brainlid"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "43 public repos, account ~15 yr old",
                "points": 24,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 43
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 15
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "langchain"
              ],
              "ecosystems": "hex",
              "any_deprecated": false,
              "min_days_since_publish": 13
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on hex",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "hex"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 13 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 13
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "51 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 51
                    }
                  }
                ],
                "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": "moderate",
        "name": "Engineering Quality",
        "value": 67,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 68,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "1 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "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": "30 out of 30 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 65,
            "inputs": {
              "topics": [
                "chatgpt",
                "elixir",
                "langchain",
                "llm",
                "ai",
                "anthropic",
                "bumblebee",
                "claude-ai"
              ],
              "has_wiki": false,
              "homepage": "https://hexdocs.pm/langchain/",
              "has_readme": true,
              "has_docs_dir": false,
              "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": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://hexdocs.pm/langchain/",
                "points": 15,
                "status": "met",
                "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": "8 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 8
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "moderate",
        "name": "Security",
        "value": 60,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "moderate",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Packaging, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "packaging",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 60,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 6.1
            },
            "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 is not maximal on development and all release branches",
                "points": 2.2,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "30 out of 30 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "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 6/25 approved changesets -- score normalized to 2",
                "points": 1.5,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 16 contributing companies or organizations",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "update tool detected",
                "points": 7.5,
                "status": "met",
                "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.2,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 6 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "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": "all dependencies are pinned",
                "points": 5,
                "status": "met",
                "details": [],
                "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": "GitHub workflow tokens follow principle of least privilege",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "11 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "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": 14
            },
            "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": "good",
        "name": "AI Readiness",
        "value": 74,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.925,
              "agent_instruction_files": [
                ".cursor/rules/changelog-rules.mdc",
                "AGENTS.md",
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 11639
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": ".cursor/rules/changelog-rules.mdc, AGENTS.md, CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".cursor/rules/changelog-rules.mdc, AGENTS.md, CLAUDE.md"
                    }
                  }
                ],
                "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": "86 of 93 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 86,
                      "sampled": 93
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 73,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "mix.lock"
              ],
              "has_dockerfile": false,
              "typed_language": false,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0.22,
              "toolchain_manifests": [
                "mix.exs"
              ],
              "dependency_bot_commit_share": 0.07
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "mix.exs (toolchain convention, no task runner)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "toolchain_convention",
                    "params": {
                      "files": "mix.exs"
                    }
                  }
                ],
                "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": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "22 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 22,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "7 of the last 100 commits are automated dependency updates",
                "points": 8,
                "status": "met",
                "details": [
                  {
                    "code": "dependency_bot_commits",
                    "params": {
                      "count": 7,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "all dependencies are pinned",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "moderate",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 52,
            "inputs": {
              "primary_language": "Elixir",
              "largest_source_bytes": 180612,
              "source_files_sampled": 172,
              "oversized_source_files": 8
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Elixir without a type-check config",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_typecheck_config_language",
                    "params": {
                      "language": "Elixir"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "8/172 source files over 60KB",
                "points": 52.4,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 172,
                      "oversized": 8
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "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": [],
  "report_type": "repository",
  "generated_at": "2026-07-21T21:13:04.299950Z",
  "schema_version": "0.23.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/b/brainlid/langchain.svg",
  "full_name": "brainlid/langchain",
  "license_state": "custom",
  "license_spdx": null
}

Оцінки — це сигнали, а не гарантії. Вони відображають публічно видимі практики на GitHub — це не аудит коду й не гарантія безпеки.

Відсутні дані виключаються, а ваги перенормовуються — нуль за відсутність ніколи не ставиться. Методологія версіонована й відкрита: метрики v1.13.0, схема v0.23.0 — повна методологія · вікі метрик.

Як окремий результат виглядає на тлі всього реєстру: сукупна статистикаHex.