Registro público
Informe de salud del softwareesquema 0.23.0 · métricas 1.13.0 · 2026-07-21 21:13 UTC

brainlid / langchain

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

ElixirLicencia propia★ 1183 estrellas⑂ 209 forksdesde jul 2023Ver en GitHub ↗

brainlid/langchain tiene un índice de salud de 72 sobre 100, lo que lo sitúa en la banda Bueno. Su puntuación más alta es Vitality (96/100) y la más baja, Security (60/100). Se actualizó por última vez hace 7 días. Una sola persona concentra la mayor parte del trabajo reciente.

72
global / 100
Bueno

Índice de salud del software

Las métricas se agrupan en categorías ponderadas sobre una escala de 1 a 100. El resultado global parte de su media; cuando la evidencia pública activa la Política de Jurisdicciones de Alto Riesgo, la calificación se ajusta y recibe el límite 49 (En riesgo). Preparación para IA queda fuera.

72
Excelente85-100Ejemplar; cumple prácticamente todos los criterios evaluados
Bueno70-84Saludable; carencias menores
Moderado50-69Aceptable con carencias notables; se recomienda revisión
En riesgo30-49Debilidades significativas; su adopción exige cautela
Crítico1-29Problemas graves (proyecto abandonado, un solo mantenedor, sin higiene)
VitalidadComunidad yAdopciónSostenibilidady GobernanzaCalidad deIngenieríaSeguridadPreparaciónpara IA

Perfil de puntuación

Cada eje es una categoría. La forma importa más que la media: un proyecto sano llena toda la figura, mientras que un perfil de picos y cráteres indica que la fortaleza en una dimensión enmascara el riesgo en otra.

Titularidad

Mark EricksenCuenta personal
194 seguidores43 repositorios públicosdesde may 2011@superfly

Este repositorio pertenece a una cuenta personal. Un proyecto con un único propietario conlleva más riesgo de continuidad que uno respaldado por una organización.

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicación
Hexlangchain0.9.258.07951hace 13 días

Métricas por categoría

Vitalidad

¿Está vivo el proyecto: se escribe código y se publican versiones?

96Excelente · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 7 días
30.5/36Cadencia de commits — 44/52 semanas con commits
18/18Volumen de commits — 205 commits en el último año
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 6 issue activity found in the last 90 days -- score normalized to 10
Datos de entrada utilizados
commits_last_year205
human_commit_share0,93
days_since_last_push7
active_weeks_last_year44
Cómo se puntúa
27/27Publica versiones — 51 versiones publicadas
36/36Recencia de las versiones — última versión hace 13 días
27/27Cadencia de publicación — una versión cada ~6,3 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count51
latest_release_tagv0.9.2
releases_from_tagsno
days_since_latest_release13
mean_days_between_releases6,3
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Signed-Releases. Los pesos restantes se han renormalizado.

Comunidad y Adopción

¿Tiene el proyecto usuarios, descargas, atención y unas condiciones acogedoras para quienes contribuyen?

66Moderado · 18% del índice global
Cómo se puntúa
49.8/60Estrellas — 1183 estrellas
19.3/25Forks — 209 forks
7.1/15Observadores — 20 observadores
Datos de entrada utilizados
forks209
stars1183
watchers20
growth_stateorganic
growth_factor_pct100
Cómo se puntúa
22.5/22.5README
16.9/22.5Licencia — archivo de licencia presente, no es una licencia reconocida
0/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno
Cómo se puntúa
63.5/80Descargas mensuales — 58.079 descargas/mes en hex
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packageslangchain
dependents
ecosystemshex
total_downloads776.990
monthly_downloads58.079
Excluidos de la puntuación (sin datos o no aplicable): Dependientes en el registro. Los pesos restantes se han renormalizado.

Sostenibilidad y Gobernanza

¿Sobrevivirá el proyecto a sus personas: factor bus, capacidad de respuesta, quién lo respalda y mantenimiento del paquete?

65Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
5.9/22.5Distribución de commits — el principal contribuyente firma el 74% de los commits
13.5/13.5Amplitud de contribuyentes — 88 contribuyentes
10/10OpenSSF Scorecard: Contributors — project has 16 contributing companies or organizations
Datos de entrada utilizados
bus_factor1
contributors_sampled88
top_contributor_share0,739
Cómo se puntúa
37/46.8Resolución de issues — 79% de issues cerradas
32.5/38.3Aceptación de PR — 358/421 PR decididos fusionados
3/15OpenSSF Scorecard: Code-Review — Found 6/25 approved changesets -- score normalized to 2
Datos de entrada utilizados
merged_prs358
open_issues25
closed_issues95
issue_closed_ratio0,792
closed_unmerged_prs63
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
16.5/25Alcance del propietario — 194 seguidores de brainlid
24/25Trayectoria — 43 repos públicos, cuenta de ~15 años
Datos de entrada utilizados
followers194
owner_typeUser
is_verified
owner_loginbrainlid
public_repos43
account_age_days5536
Excluidos de la puntuación (sin datos o no aplicable): Dominio verificado. Los pesos restantes se han renormalizado.
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en hex
35/35Recencia de publicación — última publicación hace 13 días
20/20Historial de versiones — 51 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packageslangchain
ecosystemshex
any_deprecatedno
min_days_since_publish13

Calidad de Ingeniería

¿Existen unas prácticas mínimas de ingeniería y documentación?

67Moderado · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 1 flujo(s) de trabajo
24/24Pruebas presentes
0/16Configuración de linter
0/9.6Hooks de pre-commit
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 30 out of 30 merged PRs checked by a CI test -- score normalized to 10
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_configno
has_precommit_configno

Documentación

65Moderado
Cómo se puntúa
30/30README
0/25Directorio de documentación
15/15Sitio de documentación / página del proyecto — https://hexdocs.pm/langchain/
10/10Descripción del repositorio
10/10Topics — 8 topics
0/10Wiki
Datos de entrada utilizados
topicschatgpt, elixir, langchain, llm, ai, anthropic, bumblebee, claude-ai
has_wikino
homepagehttps://hexdocs.pm/langchain/
has_readme
has_docs_dirno
has_description

Seguridad

¿Son sólidas las prácticas visibles de seguridad y de cadena de suministro, sin exposición jurisdiccional de alto riesgo sin resolver?

60Moderado · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
2.2/7.5Branch-Protection — branch protection is not maximal on development and all release branches
2.5/2.5CI-Tests — 30 out of 30 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
1.5/7.5Code-Review — Found 6/25 approved changesets -- score normalized to 2
2.5/2.5Contributors — project has 16 contributing companies or organizations
10/10Dangerous-Workflow — no dangerous workflow patterns detected
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.2/2.5Licencia — license file detected
7.5/7.5Maintained — 30 commit(s) and 6 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — sin datos
5/5Pinned-Dependencies — all dependencies are pinned
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — sin datos
7.5/7.5Token-Permissions — GitHub workflow tokens follow principle of least privilege
0/7.5Vulnerabilities — 11 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate6,1
Excluidos de la puntuación (sin datos o no aplicable): packaging, signed_releases. Los pesos restantes se han renormalizado.

Preparación para IA

¿Hasta qué punto está el repositorio preparado para desarrollarse y mantenerse con agentes de codificación de IA? Es una insignia independiente y experimental — peso 0,0, de modo que se presenta por separado y no afecta a la puntuación de salud global.

74Bueno · 0% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — .cursor/rules/changelog-rules.mdc, AGENTS.md, CLAUDE.md
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 86 de 93 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,925
agent_instruction_files.cursor/rules/changelog-rules.mdc, AGENTS.md, CLAUDE.md
agent_instruction_max_bytes11.639
Cómo se puntúa
12.6/18Arranque con un solo comando — mix.exs (convención del toolchain, sin ejecutor de tareas)
22/22Pruebas automatizadas
0/11Configuración de lint / formato
0/11Verificación estática de tipos
10/10Entorno reproducible — lockfile
10/10Práctica demostrada con agentes — 22 de los últimos 100 commits con autoría o crédito de agente
8/8Mantenimiento automatizado — 7 de los últimos 100 commits son actualizaciones automáticas de dependencias
10/10OpenSSF Scorecard: Pinned-Dependencies — all dependencies are pinned
Datos de entrada utilizados
has_nixno
has_tests
lockfilesmix.lock
has_dockerfileno
typed_languageno
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0,22
toolchain_manifestsmix.exs
dependency_bot_commit_share0,07
Cómo se puntúa
0/45Código verificable por tipos — Elixir sin configuración de verificación de tipos
52.4/55Tamaños de archivo manejables — 8/172 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageElixir
largest_source_bytes180.612
source_files_sampled172
oversized_source_files8

Datos clave

1183estrellas de GitHub
88contribuidores
205commits en los últimos 12 meses
7días desde el último push
51versiones publicadas
1factor bus
25issues abiertas
Hexecosistemas de paquetes

Más detalle

Historial de estrellas y forks 1183 ★ / 209 ⇿
1183Estrellas
209Forks
51Versiones

Cuándo se añadió cada estrella y fork, recopilado de GitHub y agrupado por día. El crecimiento acumulado se sitúa justo encima de las adiciones diarias que lo componen, de modo que ambos se leen en conjunto: la acumulación orgánica sostenida no se parece en nada a un pico abrupto y efímero. Cuando esa diferencia es medible, se informa como autenticidad del crecimiento.

Solo se muestra el historial más reciente: este repositorio supera la ventana de recopilación, por lo que no se captura el historial más antiguo.

0200400600800100012001183206162023-082025-022026-07
Mayor 0Menor 9Parche 35

Cada punto abarca 3 días.

OpenSSF Scorecard 6.1 / 10
6.1agregado

Evaluación de seguridad independiente y agnóstica en cuanto a herramientas, procedente del proyecto de código abierto OpenSSF Scorecard. Cada comprobación premia una práctica de seguridad, no la herramienta de un proveedor concreto. Las comprobaciones que Scorecard no pudo determinar se marcan como n/d y se excluyen de la puntuación de seguridad (nunca se cuentan como cero).Scorecard v5.5.0 · 2026-07-21 21:12 UTC

10Binary-Artifactsno binaries found in the repo
3Branch-Protectionbranch protection is not maximal on development and all release branches
10CI-Tests30 out of 30 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
2Code-ReviewFound 6/25 approved changesets -- score normalized to 2
10Contributorsproject has 16 contributing companies or organizations
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
9Licenselicense file detected
10Maintained30 commit(s) and 6 issue activity found in the last 90 days -- score normalized to 10
n/dPackagingpackaging workflow not detected
10Pinned-Dependenciesall dependencies are pinned
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
n/dSigned-Releasesno releases found
10Token-PermissionsGitHub workflow tokens follow principle of least privilege
0Vulnerabilities11 existing vulnerabilities detected
Dependencias directas 11
RegistroPaqueteRestricción de versiónManifiesto
Hexno_warnpriv/plts/project.pltmix.exs
Hexecto~> 3.10 or ~> 3.11mix.exs
Hexgettext~> 0.26.2 or ~> 1.0.0mix.exs
Hexreq>= 0.5.3mix.exs
Hexmint_web_socket~> 1.0mix.exs
Hexnimble_parsec~> 1.4mix.exs
Hexabacus~> 2.1.0mix.exs
Hexnx>= 0.7.0mix.exs
Hexopentelemetry_api~> 1.4mix.exs
Hexdotenvy~> 1.1mix.exs
Hexreq_llm>= 1.6.0mix.exs
Todas las dependencias 0

Conjunto completo de dependencias resueltas según el grafo de dependencias de GitHub: 0 paquetes directos y 0 indirectos (transitivos). El cierre transitivo es completo cuando el repositorio incluye un lockfile.

RegistroPaqueteVersiónRelación
Avisos de dependencias sin evaluar

El cotejo de avisos no pudo ejecutarse para este informe: No resolved dependencies to assess

Informe JSON sin procesar legible por máquina
{
  "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
}

Las puntuaciones son señales, no garantías. Reflejan prácticas públicamente visibles en GitHub; no son una auditoría de código ni una garantía de seguridad.

Los datos ausentes se excluyen y los pesos se renormalizan; nunca se puntúan como cero. La metodología es versionada y abierta: métricas v1.13.0, esquema v0.23.0 — metodología completa · wiki de métricas.

Cómo se sitúa un resultado dentro del registro general: estadísticas agregadasHex.