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

brainlid / langchain

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

Elixir自定义许可证★ 1,183 星标⑂ 209 复刻始于 2023年7月在 GitHub 上查看 ↗

brainlid/langchain 的健康指数为 100 分中的 72 分,处于「良好」区间。 其得分最高的类别是Vitality(96/100),最低的是Security(60/100)。 最近一次更新在 7 天前。 近期的大部分工作由 1 位贡献者完成。

72
总分 / 100
良好

软件健康指数

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

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

评分画像

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

所有权

Mark Ericksen个人账户
194 关注者43 个公开仓库始于 2011年5月@superfly

该仓库由个人账户拥有。相较于组织支持的项目,单一所有者项目的延续性风险更高。

软件包生态系统

注册表软件包版本月下载量版本数最近发布
Hexlangchain0.9.258,0795113 天前

按类别列示的指标

活力

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

96优秀 · 占总体的 22%
评分方式
36/36推送新近度 — 最近一次推送于 7 天前
30.5/36提交节奏 — 52 周中有 44 周有提交
18/18提交量 — 最近一年 205 次提交
10/10OpenSSF Scorecard:Maintained — 30 commit(s) and 6 issue activity found in the last 90 days -- score normalized to 10
所用输入
commits_last_year205
human_commit_share0.93
days_since_last_push7
active_weeks_last_year44

发布纪律

100优秀
评分方式
27/27有发布版本 — 已发布 51 个发布版本
36/36发布时效 — 最近一次发布版本于 13 天前
27/27发布节奏 — 约每 6.3 天发布一次
0/10OpenSSF Scorecard:Signed-Releases — 无数据
所用输入
releases_count51
latest_release_tagv0.9.2
releases_from_tags
days_since_latest_release13
mean_days_between_releases6.3
已排除计分(无数据或不适用):OpenSSF Scorecard:Signed-Releases。 其余权重已重新归一化。

社区与采用

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

66中等 · 占总体的 18%
评分方式
49.8/60星标 — 1,183 个星标
19.3/25复刻 — 209 个复刻
7.1/15关注者 — 20 位关注者
所用输入
forks209
stars1,183
watchers20
growth_stateorganic
growth_factor_pct100

社区健康

44存在风险
评分方式
22.5/22.5README
16.9/22.5许可证 — 存在许可证文件,但不是可识别的许可证
0/18CONTRIBUTING 指南
0/13.5行为准则
0/7.2议题模板
0/6.3PR 模板
所用输入
has_readme
has_license
has_contributing
has_issue_template
has_code_of_conduct
has_pull_request_template
评分方式
63.5/80月度下载量 — hex 合计每月 58,079 次下载
0/20注册表被依赖数 — 该生态系统不报告此项
所用输入
packageslangchain
dependents
ecosystemshex
total_downloads776,990
monthly_downloads58,079
已排除计分(无数据或不适用):注册表被依赖数。 其余权重已重新归一化。

可持续性与治理

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

65中等 · 占总体的 24%
评分方式
9/54巴士系数 — 1 位贡献者贡献了半数提交
5.9/22.5提交分布 — 头号贡献者编写了 74% 的提交
13.5/13.5贡献者广度 — 88 位贡献者
10/10OpenSSF Scorecard:Contributors — project has 16 contributing companies or organizations
所用输入
bus_factor1
contributors_sampled88
top_contributor_share0.739
评分方式
37/46.8议题解决 — 79% 的议题已关闭
32.5/38.3PR 接受 — 已裁定的 PR 中 358/421 已合并
3/15OpenSSF Scorecard:Code-Review — Found 6/25 approved changesets -- score normalized to 2
所用输入
merged_prs358
open_issues25
closed_issues95
issue_closed_ratio0.792
closed_unmerged_prs63
评分方式
10/30所有权背书 — 个人(用户)账户
0/20已验证域名 — 不适用于个人账户
16.5/25所有者影响力 — brainlid 有 194 位关注者
24/25既往记录 — 43 个公开仓库,账户约 15 年
所用输入
followers194
owner_typeUser
is_verified
owner_loginbrainlid
public_repos43
account_age_days5,536
已排除计分(无数据或不适用):已验证域名。 其余权重已重新归一化。
评分方式
25/25已发布且可解析 — hex 上有 1 个软件包
35/35发布时效 — 最近一次发布于 13 天前
20/20版本历史 — 51 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packageslangchain
ecosystemshex
any_deprecated
min_days_since_publish13

工程质量

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

67中等 · 占总体的 20%

工程实践

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

文档

65中等
评分方式
30/30README
0/25文档目录
15/15文档 / 主页站点 — https://hexdocs.pm/langchain/
10/10仓库描述
10/10主题标签 — 8 个主题标签
0/10Wiki
所用输入
topicschatgpt, elixir, langchain, llm, ai, anthropic, bumblebee, claude-ai
has_wiki
homepagehttps://hexdocs.pm/langchain/
has_readme
has_docs_dir
has_description

安全

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

60中等 · 占总体的 16%

安全态势

60中等
评分方式
7.5/7.5Binary-Artifacts — no binaries found in the repo
2.2/7.5Branch-Protection — branch protection is not maximal on development and all release branches
2.5/2.5CI-Tests — 30 out of 30 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
1.5/7.5Code-Review — Found 6/25 approved changesets -- score normalized to 2
2.5/2.5Contributors — project has 16 contributing companies or organizations
10/10Dangerous-Workflow — no dangerous workflow patterns detected
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.2/2.5许可证 — license file detected
7.5/7.5Maintained — 30 commit(s) and 6 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — 无数据
5/5Pinned-Dependencies — all dependencies are pinned
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — 无数据
7.5/7.5Token-Permissions — GitHub workflow tokens follow principle of least privilege
0/7.5Vulnerabilities — 11 existing vulnerabilities detected
所用输入
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate6.1
已排除计分(无数据或不适用):packaging, signed_releases。 其余权重已重新归一化。

AI 就绪度

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

74良好 · 占总体的 0%
评分方式
45/45代理指令 — .cursor/rules/changelog-rules.mdc, AGENTS.md, CLAUDE.md
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 93 次人类提交中有 86 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share0.925
agent_instruction_files.cursor/rules/changelog-rules.mdc, AGENTS.md, CLAUDE.md
agent_instruction_max_bytes11,639
评分方式
12.6/18一条命令的引导启动 — mix.exs(工具链约定,无任务运行器)
22/22自动化测试
0/11Lint / 格式化配置
0/11静态类型检查
10/10可复现环境 — lockfile
10/10已体现的代理实践 — 最近 100 次提交中有 22 次由代理编写或署名代理
8/8自动化维护 — 最近 100 次提交中有 7 次为自动依赖更新
10/10OpenSSF Scorecard:Pinned-Dependencies — all dependencies are pinned
所用输入
has_nix
has_tests
lockfilesmix.lock
has_dockerfile
typed_language
bootstrap_files
has_devcontainer
has_linter_config
typecheck_configs
agent_commit_share0.22
toolchain_manifestsmix.exs
dependency_bot_commit_share0.07
评分方式
0/45可类型检查的代码 — Elixir,未配置类型检查
52.4/55可控的文件大小 — 采样的 172 个源文件中有 8 个超过 60KB
所用输入
primary_languageElixir
largest_source_bytes180,612
source_files_sampled172
oversized_source_files8

关键数据

1,183GitHub 星标
88贡献者
205最近 12 个月提交数
7距最近推送天数
51发布版本数
1巴士系数(bus factor)
25开放议题
Hex软件包生态系统数

更多细节

Star 与 Fork 历史 1,183 ★ / 209 ⇿
1,183Star
209Fork
51发布

每颗 star 和每个 fork 的添加时间,来自 GitHub 并按天汇总。累计增长位于其构成来源——每日新增——的正上方,二者可相互对照:稳定的自然增长与短暂的突增形态截然不同。当这一差别可被衡量时,它会作为增长真实性予以报告。

仅显示最近的历史——该仓库超出采集窗口,因此未采集最早的历史记录。

02004006008001,0001,2001,183206162023-082025-022026-07
主版本 0次版本 9修订 35

每个点涵盖 3 天。

OpenSSF Scorecard 6.1 / 10
6.1综合

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

10Binary-Artifactsno binaries found in the repo
3Branch-Protectionbranch protection is not maximal on development and all release branches
10CI-Tests30 out of 30 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
2Code-ReviewFound 6/25 approved changesets -- score normalized to 2
10Contributorsproject has 16 contributing companies or organizations
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
9Licenselicense file detected
10Maintained30 commit(s) and 6 issue activity found in the last 90 days -- score normalized to 10
不适用Packagingpackaging workflow not detected
10Pinned-Dependenciesall dependencies are pinned
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
不适用Signed-Releasesno releases found
10Token-PermissionsGitHub workflow tokens follow principle of least privilege
0Vulnerabilities11 existing vulnerabilities detected
直接依赖 11
注册表软件包版本约束清单文件
Hexno_warnpriv/plts/project.pltmix.exs
Hexecto~> 3.10 or ~> 3.11mix.exs
Hexgettext~> 0.26.2 or ~> 1.0.0mix.exs
Hexreq>= 0.5.3mix.exs
Hexmint_web_socket~> 1.0mix.exs
Hexnimble_parsec~> 1.4mix.exs
Hexabacus~> 2.1.0mix.exs
Hexnx>= 0.7.0mix.exs
Hexopentelemetry_api~> 1.4mix.exs
Hexdotenvy~> 1.1mix.exs
Hexreq_llm>= 1.6.0mix.exs
全部依赖 0

来自 GitHub 依赖图的完整解析依赖集合:0 个直接依赖与 0 个间接(传递)软件包。仓库提交锁文件时,传递闭包才是完整的。

注册表软件包版本关系
依赖安全公告 未评估

本报告未能完成公告比对:No resolved dependencies to assess

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

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

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

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