Public record
Software health reportschema 0.23.0 · metrics 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.

ElixirCustom license★ 1,183 stars⑂ 209 forkssince Jul 2023View on GitHub ↗

brainlid/langchain holds a health index of 72 out of 100, placing it in the Good band. It scores highest on Vitality (96/100) and lowest on Security (60/100). It was last updated 7 days ago. A single contributor accounts for most of its recent work.

72
overall / 100
Good

Software health index

Metrics are grouped into weighted categories on one standardized 1–100 scale. Overall starts as their weighted mean; when public evidence triggers the High-Risk Jurisdiction Policy, the rating is adjusted and receives an At risk ceiling of 49. AI Readiness sits outside the overall score.

72
Excellent85-100Exemplary; meets essentially all checked criteria
Good70-84Healthy; minor gaps
Moderate50-69Acceptable with notable gaps; review recommended
At risk30-49Significant weaknesses; adoption warrants caution
Critical1-29Severe problems (abandoned, single-maintainer, no hygiene)
VitalityCommunity &AdoptionSustainability &GovernanceEngineeringQualitySecurityAI Readiness

Score profile

Each axis is a category. The shape matters more than the average — a healthy subject fills the whole shape, while a spike-and-crater profile means strength in one dimension is masking risk in another.

Ownership

Mark EricksenPersonal account
194 followers43 public repossince May 2011@superfly

This repository is owned by a personal account. A single-owner project carries more continuity risk than an organization-backed one.

Package ecosystems

RegistryPackageVersionDownloads / moVersionsLast publish
Hexlangchain0.9.258,0795113 days ago

Metrics by category

Vitality

Is the project alive — is code being written and are releases shipping?

96Excellent · 22% of overall
How it's scored
36/36Push recency — last push 7 days ago
30.5/36Commit cadence — 44/52 weeks with commits
18/18Commit volume — 205 commits in the last year
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 6 issue activity found in the last 90 days -- score normalized to 10
Inputs used
commits_last_year205
human_commit_share0.93
days_since_last_push7
active_weeks_last_year44

Release discipline

100Excellent
How it's scored
27/27Ships releases — 51 releases published
36/36Release recency — latest release 13 days ago
27/27Release cadence — a release every ~6.3 days
0/10OpenSSF Scorecard: Signed-Releases — no data
Inputs used
releases_count51
latest_release_tagv0.9.2
releases_from_tagsno
days_since_latest_release13
mean_days_between_releases6.3
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.

Community & Adoption

Does the project have users, downloads, attention, and a welcoming setup for contributors?

66Moderate · 18% of overall
How it's scored
49.8/60Stars — 1,183 stars
19.3/25Forks — 209 forks
7.1/15Watchers — 20 watchers
Inputs used
forks209
stars1,183
watchers20
growth_stateorganic
growth_factor_pct100
How it's scored
22.5/22.5README
16.9/22.5License — license file present, not a recognized license
0/18CONTRIBUTING guide
0/13.5Code of conduct
0/7.2Issue template
0/6.3PR template
Inputs used
has_readmeyes
has_licenseyes
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno
How it's scored
63.5/80Monthly downloads — 58,079 downloads/month across hex
0/20Registry dependents — not reported by this ecosystem
Inputs used
packageslangchain
dependents
ecosystemshex
total_downloads776,990
monthly_downloads58,079
Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.

Sustainability & Governance

Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?

65Moderate · 24% of overall
How it's scored
9/54Bus factor — 1 contributor(s) cover half of all commits
5.9/22.5Commit distribution — top contributor authored 74% of commits
13.5/13.5Contributor breadth — 88 contributors
10/10OpenSSF Scorecard: Contributors — project has 16 contributing companies or organizations
Inputs used
bus_factor1
contributors_sampled88
top_contributor_share0.739
How it's scored
37/46.8Issue resolution — 79% of issues closed
32.5/38.3PR acceptance — 358/421 decided PRs merged
3/15OpenSSF Scorecard: Code-Review — Found 6/25 approved changesets -- score normalized to 2
Inputs used
merged_prs358
open_issues25
closed_issues95
issue_closed_ratio0.792
closed_unmerged_prs63
How it's scored
10/30Ownership backing — personal (user) account
0/20Verified domain — not applicable to user accounts
16.5/25Owner reach — 194 followers of brainlid
24/25Track record — 43 public repos, account ~15 yr old
Inputs used
followers194
owner_typeUser
is_verified
owner_loginbrainlid
public_repos43
account_age_days5,536
Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.
How it's scored
25/25Published & resolvable — 1 package(s) on hex
35/35Publish recency — latest publish 13 days ago
20/20Version history — 51 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
packageslangchain
ecosystemshex
any_deprecatedno
min_days_since_publish13

Engineering Quality

Are baseline engineering and documentation practices in place?

67Moderate · 20% of overall
How it's scored
24/24CI workflows — 1 workflow(s)
24/24Tests present
0/16Linter config
0/9.6Pre-commit hooks
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 30 out of 30 merged PRs checked by a CI test -- score normalized to 10
Inputs used
has_ciyes
has_testsyes
has_editorconfigno
has_linter_configno
has_precommit_configno

Documentation

65Moderate
How it's scored
30/30README
0/25Documentation directory
15/15Documentation / homepage site — https://hexdocs.pm/langchain/
10/10Repository description
10/10Topics — 8 topics
0/10Wiki
Inputs used
topicschatgpt, elixir, langchain, llm, ai, anthropic, bumblebee, claude-ai
has_wikino
homepagehttps://hexdocs.pm/langchain/
has_readmeyes
has_docs_dirno
has_descriptionyes

Security

Are visible security and supply-chain practices strong, without unresolved high-risk jurisdiction exposure?

60Moderate · 16% of overall
How it's scored
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.5License — 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 — no data
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 — no data
7.5/7.5Token-Permissions — GitHub workflow tokens follow principle of least privilege
0/7.5Vulnerabilities — 11 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate6.1
Excluded from scoring (no data or not applicable): packaging, signed_releases. Remaining weights renormalized.

AI Readiness

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.

74Good · 0% of overall
How it's scored
45/45Agent instructions — .cursor/rules/changelog-rules.mdc, AGENTS.md, CLAUDE.md
0/15Machine-readable docs (llms.txt)
40/40Legible commit history — 86 of 93 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share0.925
agent_instruction_files.cursor/rules/changelog-rules.mdc, AGENTS.md, CLAUDE.md
agent_instruction_max_bytes11,639
How it's scored
12.6/18One-command bootstrap — mix.exs (toolchain convention, no task runner)
22/22Automated tests
0/11Lint / format config
0/11Static type checking
10/10Reproducible environment — lockfile
10/10Demonstrated agent practice — 22 of the last 100 commits agent-authored or agent-credited
8/8Automated maintenance — 7 of the last 100 commits are automated dependency updates
10/10OpenSSF Scorecard: Pinned-Dependencies — all dependencies are pinned
Inputs used
has_nixno
has_testsyes
lockfilesmix.lock
has_dockerfileno
typed_languageno
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0.22
toolchain_manifestsmix.exs
dependency_bot_commit_share0.07
How it's scored
0/45Type-checkable code — Elixir without a type-check config
52.4/55Manageable file sizes — 8/172 source files over 60KB
Inputs used
primary_languageElixir
largest_source_bytes180,612
source_files_sampled172
oversized_source_files8

Key facts

1,183GitHub stars
88contributors
205commits, last 12 months
7days since last push
51releases
1bus factor
25open issues
Hexpackage ecosystems

More detail

Star and fork history 1,183 ★ / 209 ⇿
1,183Stars
209Forks
51Releases

When each star and fork was added, collected from GitHub and bucketed by day. Cumulative growth sits directly above the daily additions it is made of, so the two read against each other: steady organic accretion looks nothing like an abrupt, short-lived burst. Where that difference is measurable, it is reported as growth authenticity.

Only the most recent history is shown — this repository exceeds the collection window, so the earliest history is not captured.

02004006008001,0001,2001,183206162023-082025-022026-07
Major 0Minor 9Patch 35

Each point covers 3 days.

OpenSSF Scorecard 6.1 / 10
6.1aggregate

Independent, tool-agnostic security assessment from the open-source OpenSSF Scorecard. Each check rewards a security practice, not a specific vendor's tool. Checks Scorecard could not determine are marked n/a and excluded from the security score (never counted as zero).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
n/aPackagingpackaging 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
n/aSigned-Releasesno releases found
10Token-PermissionsGitHub workflow tokens follow principle of least privilege
0Vulnerabilities11 existing vulnerabilities detected
Direct dependencies 11
RegistryPackageVersion constraintManifest
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
All dependencies 0

Full resolved dependency set from the GitHub dependency graph: 0 direct and 0 indirect (transitive) packages. The transitive closure is complete when the repository commits a lockfile.

RegistryPackageVersionRelation
Dependency advisories not assessed

Advisory matching could not run for this report: No resolved dependencies to assess

Raw JSON report machine-readable
{
  "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
}

Scores are signals, not warranties. They reflect publicly visible practices on GitHub — not a code audit, and not a security guarantee.

Missing data is excluded and weights renormalized, never scored as zero. Methodology is versioned and open: metrics v1.13.0, schema v0.23.0 — full methodology · metrics wiki.

How one result sits in the wider record: aggregate statisticsHex.