原始 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
}