公开记录
软件健康报告模式 0.27.0 · 指标 2.5.0 · 2026-07-27 00:43 UTC

ludwig-ai / ludwig

Low-code framework for building custom LLMs, neural networks, and other AI models

PythonApache-2.0★ 11,746 星标⑂ 1,218 复刻始于 2018年12月在 GitHub 上查看 ↗
类型如何判定

ludwig-ai/ludwig 的健康指数为 100 分中的 94 分,处于「卓越」区间。 其得分最高的类别是Engineering Quality(96/100),最低的是AI Readiness(52/100)。 最近一次更新在今天。 近期的大部分工作由 3 位贡献者完成。

94
总分 / 100
卓越

软件健康指数

指标归入加权类别,统一采用 1–100 量表。总体分先取类别加权平均,再依据公开记录的分布进行校准,使各等级具有百分位含义;当公开证据触发高风险司法辖区政策时,评级会按政策调整,并设置 34(存在风险)的上限。

94
卓越93-100公开记录中的最高层级(约前 5%);基本满足所有检验标准
优秀80-92各方面均表现强劲;仅有少量不足
良好65-79健康;不足之处有限且可控
中等50-64可接受,但存在明显不足;建议进行审查
薄弱35-49多个领域存在实质性薄弱环节
存在风险20-34存在重大薄弱环节;采用时应保持审慎
危急1-19问题严重(项目被弃置、仅有单一维护者、缺乏基本工程规范)
活力社区与采用可持续性与治理工程质量安全AI 就绪度

评分画像

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

加权总体分 81 经校准后在公布的指数量表上为 94(记录校准 2026-08-02)。

所有权

Ludwig组织
176 关注者6 个公开仓库始于 2020年5月

该仓库由组织支持——共同承担、可问责的托管责任,可延续于任何单一维护者之后。

软件包生态系统

注册表软件包版本月下载量版本数最近发布标签
PyPIludwig0.17.83,413770 天前computer-visiondeep-learningludwigmachine-learningnatural-language-processing

按类别列示的指标

活力

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

83优秀 · 占总体的 21%
评分方式
36/36推送新近度 — 最近一次推送于 0 天前
8.3/36提交节奏 — 52 周中有 12 周有提交
18/18提交量 — 最近一年 267 次提交
10/10OpenSSF Scorecard:Maintained — 30 commit(s) and 9 issue activity found in the last 90 days -- score normalized to 10
所用输入
commits_last_year267
human_commit_share0.98
days_since_last_push0
active_weeks_last_year12

发布纪律

100卓越
评分方式
27/27有发布版本 — 已发布 73 个发布版本
36/36发布时效 — 最近一次发布版本于 0 天前
27/27发布节奏 — 约每 9 天发布一次
0/10OpenSSF Scorecard:Signed-Releases — 无数据
所用输入
releases_count73
latest_release_tagv0.17.8
releases_from_tags
days_since_latest_release0
mean_days_between_releases9
已排除计分(无数据或不适用):OpenSSF Scorecard:Signed-Releases。 其余权重已重新归一化。

社区与采用

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

86优秀 · 占总体的 17%
评分方式
60/60星标 — 11,746 个星标
25/25复刻 — 1,218 个复刻
12.6/15关注者 — 183 位关注者
所用输入
forks1,218
stars11,746
watchers183
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history

社区健康

92优秀
评分方式
22.5/22.5README
22.5/22.5许可证 — 可识别的许可证(Apache-2.0)
18/18CONTRIBUTING 指南
13.5/13.5行为准则
0/7.2议题模板
6.3/6.3PR 模板
所用输入
has_readme
has_license
readme_badges
has_contributing
has_issue_template
has_code_of_conduct
readme_badge_services
has_pull_request_template
评分方式
47.1/80月度下载量 — pypi 合计每月 3,413 次下载
0/20注册表被依赖数 — 该生态系统不报告此项
所用输入
packagesludwig
dependents
ecosystemspypi
total_downloads
monthly_downloads3,413
已排除计分(无数据或不适用):注册表被依赖数。 其余权重已重新归一化。

可持续性与治理

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

79良好 · 占总体的 23%
评分方式
36/54巴士系数 — 3 位贡献者贡献了半数提交
17.6/22.5提交分布 — 头号贡献者编写了 22% 的提交
13.5/13.5贡献者广度 — 98 位贡献者
10/10OpenSSF Scorecard:Contributors — project has 17 contributing companies or organizations
所用输入
bus_factor3
contributors_sampled98
top_contributor_share0.219
评分方式
42/42议题解决 — 100% 的议题已关闭
25.9/30PR 接受 — 已裁定的 PR 中 2,588/2,999 已合并
0/13Newcomer PR acceptance — 30 天内没有首次贡献者的 PR 得到裁决
0/15OpenSSF Scorecard:Code-Review — Found 0/28 approved changesets -- score normalized to 0
所用输入
merged_prs2,588
open_issues1
closed_issues1,094
prs_merged_7d
prs_decided_7d
prs_merged_30d
prs_decided_30d
issue_closed_ratio0.999
closed_unmerged_prs411
first_time_authors_30d
first_time_prs_merged_30d
first_time_prs_decided_30d
已排除计分(无数据或不适用):newcomer_pr_acceptance。 其余权重已重新归一化。
评分方式
30/30所有权背书 — 组织持有
0/20已验证域名
16.2/25所有者影响力 — ludwig-ai 有 176 位关注者
18.2/25既往记录 — 6 个公开仓库,账户约 6 年
所用输入
followers176
owner_typeOrganization
is_verified
owner_loginludwig-ai
public_repos6
account_age_days2,261
评分方式
25/25已发布且可解析 — pypi 上有 1 个软件包
35/35发布时效 — 最近一次发布于 0 天前
20/20版本历史 — 77 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packagesludwig
ecosystemspypi
any_deprecated
min_days_since_publish0

工程质量

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

96卓越 · 占总体的 19%

工程实践

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

文档

100卓越
评分方式
30/30README
25/25文档目录
15/15文档 / 主页站点 — http://ludwig.ai
10/10仓库描述
10/10主题标签 — 20 个主题标签
10/10Wiki
所用输入
topicsdeep-learning, deeplearning, deep, learning, machine-learning, machinelearning, natural-language-processing, natural-language, computer-vision, data-centric, data-science, pytorch, neural-network, ml, llm, llm-training, fine-tuning, llama, mistral, llama2
has_wiki
homepagehttp://ludwig.ai
has_readme
has_docs_dir
has_description

安全

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

64中等 · 占总体的 16%

安全态势

64中等
评分方式
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — 无数据
2.5/2.5CI-Tests — 2 out of 2 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
0/7.5Code-Review — Found 0/28 approved changesets -- score normalized to 0
2.5/2.5Contributors — project has 17 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.5/2.5许可证 — license file detected
7.5/7.5Maintained — 30 commit(s) and 9 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
5/5Security-Policy — security policy file detected
0/7.5Signed-Releases — 无数据
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
所用输入
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate6.4
已排除计分(无数据或不适用):branch_protection, signed_releases。 其余权重已重新归一化。

AI 就绪度

该仓库在多大程度上具备与 AI 编码代理协同开发与维护的条件?权重刻意设小(4%):代理工具链是一项真实的维护信号,但完全不具备的仓库仍可达到 100/100。

52中等 · 占总体的 4%
评分方式
0/45代理指令 — 没有 CLAUDE.md / AGENTS.md / 编辑器规则
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 98 次人类提交中有 90 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share0.918
agent_instruction_files
agent_instruction_max_bytes
评分方式
0/18一条命令的引导启动
22/22自动化测试
11/11Lint / 格式化配置 — .flake8
11/11静态类型检查 — ludwig/py.typed
10/10可复现环境 — devcontainer, Dockerfile
0/10已体现的代理实践 — 最近 100 次提交中没有代理编写的提交
0/8自动化维护 — 未观察到自动依赖更新
0/10OpenSSF Scorecard:Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
所用输入
has_nix
has_tests
lockfiles
has_dockerfile
typed_language
bootstrap_files
has_devcontainer
has_linter_config
typecheck_configsludwig/py.typed
agent_commit_share0
toolchain_manifests
dependency_bot_commit_share0
评分方式
27/45可类型检查的代码 — Python,已配置类型检查(ludwig/py.typed)
54.5/55可控的文件大小 — 采样的 805 个源文件中有 7 个超过 60KB
所用输入
primary_languagePython
largest_source_bytes107,706
source_files_sampled805
oversized_source_files7
评分方式
0/40API 模式(OpenAPI/GraphQL/proto)
0/20MCP 服务器
40/40可运行示例 — examples, notebooks
所用输入
example_dirsexamples, notebooks
has_mcp_signal
api_schema_files

关键数据

11,746GitHub 星标
98贡献者
267最近 12 个月提交数
0距最近推送天数
73发布版本数
3巴士系数(bus factor)
1开放议题
PyPI软件包生态系统数

数据采集警告

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • deps.dev does not index pypi:ludwig@0.17.8; advisories assessed against the repository dependency graph instead
  • No resolved dependencies carried a version and a supported ecosystem

更多细节

Star 与 Fork 历史 0 ★ / 1,218 ⇿
0Star
1,218Fork
71发布

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

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

2505007501,0001,2501,218582019-022022-112026-07
主版本 0次版本 8修订 49

每个点涵盖 7 天。

OpenSSF Scorecard 6.4 / 10
6.4综合

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

10Binary-Artifactsno binaries found in the repo
不适用Branch-Protectioninternal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
10CI-Tests2 out of 2 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/28 approved changesets -- score normalized to 0
10Contributorsproject has 17 contributing companies or organizations
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 9 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
10Security-Policysecurity policy file detected
不适用Signed-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
直接依赖 40
注册表软件包版本约束清单文件
PyPInumpy>=1.24pyproject.toml
PyPIpandas>=2.0pyproject.toml
PyPIscipy>=1.10pyproject.toml
PyPItabulate>=0.9pyproject.toml
PyPIscikit-learn>=1.3pyproject.toml
PyPItqdm>=4.60pyproject.toml
PyPItorch>=2.11pyproject.toml
PyPItorchaudio>=2.11pyproject.toml
PyPItorchcodec>=0.1pyproject.toml
PyPItorchvision>=0.26pyproject.toml
PyPItransformers>=5.0pyproject.toml
PyPIsentencepiece>=0.2pyproject.toml
PyPIspacy>=2.3pyproject.toml
PyPIPyYAML>=6.0pyproject.toml
PyPIabsl-pypyproject.toml
PyPIkagglepyproject.toml
PyPIrequests>=2.28pyproject.toml
PyPIpy-cpuinfopyproject.toml
PyPIfsspecpyproject.toml
PyPIdataclasses-jsonpyproject.toml
PyPIjsonschema>=4.17pyproject.toml
PyPItensorboardpyproject.toml
PyPItorchmetrics>=1.0pyproject.toml
PyPItorchinfopyproject.toml
PyPIfilelockpyproject.toml
PyPIpsutilpyproject.toml
PyPIprotobuf>=4.0pyproject.toml
PyPIgpustatpyproject.toml
PyPIrich>=12.4.4pyproject.toml
PyPIpackagingpyproject.toml
PyPIretrypyproject.toml
PyPIsacremosespyproject.toml
PyPIbitsandbytes>=0.44.0pyproject.toml
PyPIxlwtpyproject.toml
PyPIxlrdpyproject.toml
PyPIopenpyxlpyproject.toml
PyPIpyarrow>=14.0pyproject.toml
PyPIlxmlpyproject.toml
PyPIdatasetspyproject.toml
PyPIsafetensors>=0.4pyproject.toml
全部依赖 32

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

注册表软件包版本关系
PyPIbitsandbytes直接
PyPIjsonschema直接
PyPInumpy直接
PyPIpandas直接
PyPIprotobuf直接
PyPIpyarrow直接
PyPIpyyaml直接
PyPIrequests直接
PyPIrich直接
PyPIsafetensors直接
PyPIscikit-learn直接
PyPIscipy直接
PyPIsentencepiece直接
PyPIspacy直接
PyPItabulate直接
PyPItorch直接
PyPItorchaudio直接
PyPItorchcodec直接
PyPItorchmetrics直接
PyPItorchvision直接
PyPItqdm直接
PyPItransformers直接
PyPIconfigspace间接
PyPIdask间接
PyPIfuture间接
PyPImatplotlib间接
PyPIpeft间接
PyPIpredibase间接
PyPIray间接
PyPIruff间接
PyPIs3fs间接
PyPItorchao间接
依赖安全公告 未评估

本报告未能完成公告比对:No resolved dependencies carried a version and a supported ecosystem

原始 JSON 报告 机器可读
{
  "data": {
    "repo": {
      "topics": [
        "deep-learning",
        "deeplearning",
        "deep",
        "learning",
        "machine-learning",
        "machinelearning",
        "natural-language-processing",
        "natural-language",
        "computer-vision",
        "data-centric",
        "data-science",
        "pytorch",
        "neural-network",
        "ml",
        "llm",
        "llm-training",
        "fine-tuning",
        "llama",
        "mistral",
        "llama2"
      ],
      "is_fork": false,
      "size_kb": 35703,
      "has_wiki": true,
      "homepage": "http://ludwig.ai",
      "languages": {
        "Shell": 1890,
        "Python": 6094533,
        "Dockerfile": 4793,
        "Jupyter Notebook": 15696
      },
      "pushed_at": "2026-07-27T00:35:29Z",
      "created_at": "2018-12-27T23:58:12Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-27T00:35:33Z",
      "description": "Low-code framework for building custom LLMs, neural networks, and other AI models",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "Apache-2.0",
      "default_branch": "main",
      "license_spdx_raw": "Apache-2.0",
      "primary_language": "Python",
      "significant_languages": [
        "Python"
      ]
    },
    "owner": {
      "blog": "https://ludwig.ai",
      "name": "Ludwig",
      "type": "Organization",
      "login": "ludwig-ai",
      "company": null,
      "location": "San Francisco, CA",
      "followers": 176,
      "avatar_url": "https://avatars.githubusercontent.com/u/65477820?v=4",
      "created_at": "2020-05-17T03:37:52Z",
      "is_verified": null,
      "public_repos": 6,
      "account_age_days": 2261
    },
    "license": {
      "state": "standard",
      "spdx_id": "Apache-2.0",
      "raw_spdx": "Apache-2.0",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.17.8",
          "kind": "patch",
          "published_at": "2026-07-27T00:35:54Z"
        },
        {
          "tag": "v0.17.7",
          "kind": "patch",
          "published_at": "2026-07-04T18:54:43Z"
        },
        {
          "tag": "v0.17.6",
          "kind": "patch",
          "published_at": "2026-06-26T23:15:53Z"
        },
        {
          "tag": "v0.17.5",
          "kind": "patch",
          "published_at": "2026-05-29T22:07:25Z"
        },
        {
          "tag": "v0.17.3",
          "kind": "patch",
          "published_at": "2026-05-24T17:19:23Z"
        },
        {
          "tag": "v0.17.2",
          "kind": "patch",
          "published_at": "2026-05-23T06:32:54Z"
        },
        {
          "tag": "v0.17.1",
          "kind": "patch",
          "published_at": "2026-05-18T21:37:38Z"
        },
        {
          "tag": "v0.17.0",
          "kind": "minor",
          "published_at": "2026-05-16T20:30:46Z"
        },
        {
          "tag": "v0.16.2",
          "kind": "patch",
          "published_at": "2026-05-08T07:50:31Z"
        },
        {
          "tag": "v0.16.1",
          "kind": "patch",
          "published_at": "2026-05-07T05:01:24Z"
        },
        {
          "tag": "v0.16.0",
          "kind": "minor",
          "published_at": "2026-05-06T16:06:54Z"
        },
        {
          "tag": "v0.15.1",
          "kind": "patch",
          "published_at": "2026-05-05T05:29:01Z"
        },
        {
          "tag": "v0.15.0",
          "kind": "minor",
          "published_at": "2026-04-26T19:53:42Z"
        },
        {
          "tag": "v0.14.1",
          "kind": "patch",
          "published_at": "2026-04-15T17:39:52Z"
        },
        {
          "tag": "v0.14.0",
          "kind": "minor",
          "published_at": "2026-04-15T05:05:07Z"
        },
        {
          "tag": "v0.13.0",
          "kind": "minor",
          "published_at": "2026-04-12T06:12:27Z"
        },
        {
          "tag": "v0.12.0",
          "kind": "minor",
          "published_at": "2026-04-04T04:01:25Z"
        },
        {
          "tag": "v0.11.4",
          "kind": "patch",
          "published_at": "2026-04-02T03:18:58Z"
        },
        {
          "tag": "v0.11.3",
          "kind": "patch",
          "published_at": "2026-04-01T03:30:01Z"
        },
        {
          "tag": "v0.11.2",
          "kind": "patch",
          "published_at": "2026-02-28T10:56:33Z"
        },
        {
          "tag": "v0.11.1",
          "kind": "patch",
          "published_at": "2026-02-27T23:25:39Z"
        },
        {
          "tag": "v0.11.0",
          "kind": "minor",
          "published_at": "2026-02-27T04:28:58Z"
        },
        {
          "tag": "v0.10.4",
          "kind": "patch",
          "published_at": "2024-07-30T00:11:51Z"
        },
        {
          "tag": "v0.10.3",
          "kind": "patch",
          "published_at": "2024-04-08T23:13:41Z"
        },
        {
          "tag": "v0.10.2",
          "kind": "patch",
          "published_at": "2024-03-21T20:24:34Z"
        },
        {
          "tag": "v0.10.1",
          "kind": "patch",
          "published_at": "2024-02-28T07:30:10Z"
        },
        {
          "tag": "v0.10.0",
          "kind": "minor",
          "published_at": "2024-02-22T19:20:16Z"
        },
        {
          "tag": "v0.9.3",
          "kind": "patch",
          "published_at": "2024-01-23T04:10:36Z"
        },
        {
          "tag": "v0.9.2",
          "kind": "patch",
          "published_at": "2024-01-16T21:14:25Z"
        },
        {
          "tag": "v0.9.1",
          "kind": "patch",
          "published_at": "2023-12-20T21:47:42Z"
        },
        {
          "tag": "v0.9",
          "kind": "other",
          "published_at": "2023-12-19T22:20:40Z"
        },
        {
          "tag": "v0.8.6",
          "kind": "patch",
          "published_at": "2023-10-13T15:47:19Z"
        },
        {
          "tag": "v0.8.5",
          "kind": "patch",
          "published_at": "2023-10-09T21:39:32Z"
        },
        {
          "tag": "v0.8.4",
          "kind": "patch",
          "published_at": "2023-09-19T16:20:12Z"
        },
        {
          "tag": "v0.8.3",
          "kind": "patch",
          "published_at": "2023-09-12T01:05:37Z"
        },
        {
          "tag": "v0.8.2",
          "kind": "patch",
          "published_at": "2023-09-01T14:06:48Z"
        },
        {
          "tag": "v0.8.1.post1",
          "kind": "other",
          "published_at": "2023-08-15T16:26:33Z"
        },
        {
          "tag": "v0.8.1",
          "kind": "patch",
          "published_at": "2023-08-11T23:46:16Z"
        },
        {
          "tag": "v0.8",
          "kind": "other",
          "published_at": "2023-08-09T04:55:50Z"
        },
        {
          "tag": "v0.7.5",
          "kind": "patch",
          "published_at": "2023-08-07T19:59:59Z"
        },
        {
          "tag": "v0.7.4",
          "kind": "patch",
          "published_at": "2023-03-23T15:29:23Z"
        },
        {
          "tag": "v0.7.3",
          "kind": "patch",
          "published_at": "2023-03-17T20:43:43Z"
        },
        {
          "tag": "v0.7.2",
          "kind": "patch",
          "published_at": "2023-03-04T17:03:24Z"
        },
        {
          "tag": "v0.7.1",
          "kind": "patch",
          "published_at": "2023-03-02T05:21:22Z"
        },
        {
          "tag": "v0.7",
          "kind": "other",
          "published_at": "2023-02-27T16:59:12Z"
        },
        {
          "tag": "v0.7.beta",
          "kind": "other",
          "published_at": "2023-01-31T00:42:49Z"
        },
        {
          "tag": "v0.6.4",
          "kind": "patch",
          "published_at": "2022-10-28T18:35:03Z"
        },
        {
          "tag": "v0.6.3",
          "kind": "patch",
          "published_at": "2022-10-20T21:36:25Z"
        },
        {
          "tag": "v0.6.2",
          "kind": "patch",
          "published_at": "2022-10-13T02:08:29Z"
        },
        {
          "tag": "v0.6.1",
          "kind": "patch",
          "published_at": "2022-10-04T18:53:20Z"
        },
        {
          "tag": "v0.6",
          "kind": "other",
          "published_at": "2022-09-27T23:03:06Z"
        },
        {
          "tag": "v0.6rc1",
          "kind": "other",
          "published_at": "2022-09-20T23:59:43Z"
        },
        {
          "tag": "v0.6.beta",
          "kind": "other",
          "published_at": "2022-09-08T20:56:32Z"
        },
        {
          "tag": "v0.5.5",
          "kind": "patch",
          "published_at": "2022-08-02T19:29:53Z"
        },
        {
          "tag": "v0.5.4",
          "kind": "patch",
          "published_at": "2022-07-12T21:31:43Z"
        },
        {
          "tag": "v0.5.3",
          "kind": "patch",
          "published_at": "2022-06-25T19:50:42Z"
        },
        {
          "tag": "v0.5.2",
          "kind": "patch",
          "published_at": "2022-06-08T21:06:54Z"
        },
        {
          "tag": "v0.5.1",
          "kind": "patch",
          "published_at": "2022-05-23T21:44:05Z"
        },
        {
          "tag": "v0.5",
          "kind": "other",
          "published_at": "2022-05-10T18:20:58Z"
        },
        {
          "tag": "v0.5rc2",
          "kind": "other",
          "published_at": "2022-03-07T20:56:18Z"
        },
        {
          "tag": "v0.5rc1",
          "kind": "other",
          "published_at": "2022-02-10T20:13:38Z"
        },
        {
          "tag": "v0.4.1",
          "kind": "patch",
          "published_at": "2022-02-01T07:28:40Z"
        },
        {
          "tag": "v0.4",
          "kind": "other",
          "published_at": "2021-06-15T04:22:19Z"
        },
        {
          "tag": "v0.3.3",
          "kind": "patch",
          "published_at": "2021-02-01T00:23:30Z"
        },
        {
          "tag": "v0.3.2",
          "kind": "patch",
          "published_at": "2020-12-29T03:18:52Z"
        },
        {
          "tag": "v0.3.1",
          "kind": "patch",
          "published_at": "2020-11-16T23:55:59Z"
        },
        {
          "tag": "v0.3",
          "kind": "other",
          "published_at": "2020-10-06T00:03:54Z"
        },
        {
          "tag": "v0.2.2",
          "kind": "patch",
          "published_at": "2020-03-06T21:09:47Z"
        },
        {
          "tag": "v0.2.1",
          "kind": "patch",
          "published_at": "2019-10-13T00:36:57Z"
        },
        {
          "tag": "v0.2",
          "kind": "other",
          "published_at": "2019-07-24T07:18:26Z"
        },
        {
          "tag": "v0.1.2",
          "kind": "patch",
          "published_at": "2019-04-27T00:08:59Z"
        },
        {
          "tag": "v0.1.1",
          "kind": "patch",
          "published_at": "2019-04-09T05:41:22Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2019-02-11T03:34:29Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "de1d65bbf3530fbd33c99abb21d1a1b9c3a64bad",
          "body": "…ectory",
          "is_bot": false,
          "headline": "Release 0.17.8: reject archive members that escape the extraction dir…",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-07-27T00:35:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7f534f31e725cc5362c8f6f85537488443de279a",
          "body": "…ctory\n\nTar extraction validated member names only. A symlink member pointing\noutside the destination passes that check, because at validation time the\nlink does not exist yet, and both its name and the name of a following\nmember resolve inside the destination. extractall() then created the link\nand\n[…]\n\"<dest>-evil\" as living inside \"<dest>\".\n\nThe extraction helpers move to module scope so they can be tested directly,\nand the bare Exception becomes a typed UnsafeArchiveError.\n\nReported by Udit Jain.",
          "is_bot": false,
          "headline": "fix(datasets): reject archive members that escape the extraction dire…",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-07-27T00:29:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9018f3db5471bc9ab46d4d514e858680e0ee5c9b",
          "body": "Private Vulnerability Reporting is now enabled on the repository, so\ndocument the disclosure process: supported versions, what to include in a\nreport, response targets, and credit.\n\nAlso records the framework's trust model. Checkpoints deserialize with\nweights_only=False and some cached artifacts use pickle, so loading model\nartifacts from untrusted sources is documented as expected behavior rather\nthan something to report.\n\nRefs #4197",
          "is_bot": false,
          "headline": "docs(security): add security policy for private vulnerability reporting",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-07-27T00:21:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4f16c26fbd0ca3a36fdb9be065e3eb8c1600ff90",
          "body": "…owExtensionArray reduction",
          "is_bot": false,
          "headline": "Release 0.17.7: fix Ray 2.56+ Arrow-backed DataFrame sort key and Arr…",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-07-04T18:54:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d0ae16dcc1ba5b54f9a1dc1b1a583e30e91728af",
          "body": "…d DataFrames\n\nRay 2.56.0 returns Arrow-backed DataFrames from batch callbacks.  For list-typed\ncolumns (vector, sequence, text indices, etc.) row values are either pyarrow\nListScalars (when iterating an Arrow-backed DataFrame directly) or Python lists\n(when the Arrow array is converted via to_numpy\n[…]\na Python list, consistent with the numpy path.\n\nBoth paths now produce identical sort-key strings for the same underlying values,\nrestoring correct row-order comparison in check_preprocessed_df_equal.",
          "is_bot": false,
          "headline": "fix: normalize array values in row sort key for Ray 2.56+ Arrow-backe…",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-07-04T18:18:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8b1ab493d9c088e86611fdc2db5b0c076ee3e8c8",
          "body": "Ray 2.56.0 returns Arrow-backed DataFrames from Ray Data batches, so\nrow values in df[cols].apply() are pyarrow scalars instead of Python\nnatives. repr() of an Arrow scalar differs from repr() of its numpy/\nPython equivalent, causing the sort keys to diverge between local and\nRay DataFrames and making row-order-sensitive comparisons (e.g. vector\ncolumns) fail. Call .as_py() on Arrow scalars before hashing.",
          "is_bot": false,
          "headline": "fix: handle Arrow-backed scalars in Ray test row sort key",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-07-04T17:12:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4a7ac2e2c90a15992d801550c5790f93e3a38dee",
          "body": "Ray 2.56.0 changed to return Arrow-backed DataFrames from Ray Data batches,\nso df[col].values returns ArrowExtensionArray instead of numpy ndarray.\nnumpy.all() on bool[pyarrow] triggers a pandas/pyarrow incompatibility\n(axis kwarg not accepted). Use Series.to_numpy() to always get numpy arrays.\n\nAlso revert the incorrect pandas<2.3 pin (wrong root cause diagnosis).",
          "is_bot": false,
          "headline": "fix: normalize Arrow-backed arrays to numpy in Ray test comparison",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-07-04T08:18:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "90e859379de05b195bb7b82258992b59911fe5a0",
          "body": "pandas 2.3.3 passes axis=None and out=None as kwargs to pyarrow.compute.all()\nwhen reducing bool[pyarrow] columns, but pyarrow 24.0.0 does not accept those\nkwargs. This breaks all distributed Ray tests that use boolean Dask columns.\nPin to <2.3 until pandas ships a fix.",
          "is_bot": false,
          "headline": "fix: pin pandas<2.3 to avoid ArrowExtensionArray regression",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-07-04T06:43:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7199f29860503efcb2a7bedae5edcecd02e51c04",
          "body": "Verifies that features not using map_partitions (e.g. category, binary)\nstill fire on_preprocess_progress callbacks via build_data's feature loop.\nOld code: only map_partitions calls triggered increments, so most features\nproduced zero intermediate callbacks. New code: one increment per feature.",
          "is_bot": false,
          "headline": "test: add regression test for feature-level progress increment",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-07-04T05:53:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5ff2f772dd001060b718c58ed4036968f1b6a515",
          "body": "…s call\n\nMost feature types (category, number, binary) use map_objects or fillna/bfill\nduring preprocessing rather than map_partitions. With the map_partitions monkey-\npatch only 3 of 16 features in the user's dataset triggered the counter, giving\njust three callbacks (6%, 19%, 100%) instead of smoo\n[…]\nor 16 features.\n\nFor Dask/Ray: keep the map_partitions monkey-patch (partition-level increments\nfire during actual remote execution) and do not add a feature-level increment,\nto avoid double-counting.",
          "is_bot": false,
          "headline": "fix: increment progress per feature for pandas, not per map_partition…",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-07-04T05:46:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b3bbd881014cca3cc7bd6e1e615b23c34d2c646e",
          "body": "…rsist()\n\nPandas/modin: fire on_preprocess_progress synchronously from increment() on\nevery map_partitions call. Removes the background polling thread for local\nbackends -- no 500ms polling window, no lost ticks. A 16-feature dataset now\nproduces 16 incremental callbacks instead of 2-3.\n\nDask/Ray: t\n[…]\nl ordering are\nunchanged.\n\nTests updated: remove time.sleep() calls (no longer needed), add coverage for\nexact fraction sequence, overcounting cap, large-feature stress, and mocked\nRay drain behavior.",
          "is_bot": false,
          "headline": "fix: synchronous progress for pandas, correct Ray lifetime through pe…",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-07-04T05:39:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1f375020a5c8bc2ee2020d688fe22cacbe61bc3e",
          "body": "… progress reporting\n\nNew Callback hook: on_preprocess_progress(progress: float) fires periodically\nduring build_data preprocessing with a value in [0.0, 1.0]. Backed by a\nthread-safe partition counter on pandas/modin and a Ray named actor for\ndistributed (Ray/Dask) backends. No configuration required -- implement the\nhook and pass the callback to LudwigModel.",
          "is_bot": false,
          "headline": "Release 0.17.6: add on_preprocess_progress callback for preprocessing…",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-06-25T16:20:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b412419516c312715018044b4bea829793eb4eb0",
          "body": "…reporter\n\nMatrix jobs upload artifacts named 'Distributed Test Results (distributed_a)'\nthrough '(distributed_f)'. The exact-string match failed with 'no artifact found';\nuse the same regex pattern already used for Integration Tests.",
          "is_bot": false,
          "headline": "fix: use regex pattern for Distributed Test Results artifact in test …",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-06-24T06:54:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "75c3489c1052b2a6f7a11f2989001371d712ba9c",
          "body": "…esystem tracking\n\nMLflow 3.x put the filesystem tracking backend in maintenance mode and raises\nan exception unless MLFLOW_ALLOW_FILE_STORE=true is set. The affected tests\n(test_mlflow, test_mlflow_ray, test_resume_training_mlflow, test_hyperopt_ray_mlflow)\nall use file:// tracking URIs with local tmpdirs, which is correct for isolated\ntesting -- we just need to opt in to the legacy store while we decide whether\nto migrate to SQLite backends long-term.",
          "is_bot": false,
          "headline": "fix: set MLFLOW_ALLOW_FILE_STORE=true in CI to unblock MLflow 3.x fil…",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-06-24T05:28:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5cfe345df2703f5918895035445f1bb2a5bdc96b",
          "body": "… progress denominator",
          "is_bot": false,
          "headline": "fix: always restore map_partitions and use accurate feature count for…",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-06-24T04:20:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7d5754a7f0a7da60a79950a54583b3086d7a1138",
          "body": "Fires Callback.on_preprocess_progress(progress) periodically during\nbuild_data so callers can show a live percentage.\n\n- pandas/modin: increments once per feature (whole column = 1 partition)\n- Dask/Ray: increments once per Dask partition from inside the remote\n  worker via a Ray named actor; head n\n[…]\nh before any work starts, so the denominator is always known.\nThe engine's map_partitions is temporarily wrapped in build_data without\ntouching any of the per-feature add_feature_data implementations.",
          "is_bot": false,
          "headline": "feat: add on_preprocess_progress callback with partition-level tracking",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-06-24T04:15:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "dca6b17207c604e5f4329f86feb17830d4e1f98f",
          "body": "…p to 0.17.5",
          "is_bot": false,
          "headline": "fix: use cu126 torch wheels and --index-url in GPU Docker images; bum…",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-29T20:51:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "19bf772922875eaf68ad0057aa669ac9c44857e3",
          "body": "…ump to 0.17.5",
          "is_bot": false,
          "headline": "fix: use --index-url for CUDA torch reinstall in GPU Docker images; b…",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-29T20:02:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "433b3f0544dce229c4f01dac31c44ca890f98560",
          "body": "Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "[pre-commit.ci] pre-commit suggestions (#4192)",
          "author_name": "pre-commit-ci[bot]",
          "author_login": "pre-commit-ci[bot]",
          "committed_at": "2026-05-26T04:13:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ea38d2f32beb4fbcaa25fccd5b395deb79dd5990",
          "body": null,
          "is_bot": false,
          "headline": "Release 0.17.4: loosen rich constraint to >=12.4.4",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-25T05:06:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "95700b0d82f8eaa422b9121ec8518067eb0cefd0",
          "body": null,
          "is_bot": false,
          "headline": "Loosen rich constraint from ~=12.4.4 to >=12.4.4",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-25T05:04:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a0e3494070bc9ac206d84434b87a036e3acd2d28",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 0.17.3",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-24T16:29:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1a3f4c62d8009466d740e373c6b367d589d58b79",
          "body": null,
          "is_bot": false,
          "headline": "fix: update pytest_slow.yml torch pins to 2.12.0 and add ffmpeg",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-23T05:52:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b1e2a49569602dc5ebf38c353bfefed79e62a3a1",
          "body": "…_transformer\n\nUsing --extra-index-url on 'uv pip install .[test]' caused uv to resolve\npackages through the PyTorch whl index, which pinned old versions of many\npackages (datasets==1.1.1, ray==2.52.1, packaging==24.1, etc.). The fix is\nto pre-install all torch-family packages (including torchcodec)\n[…]\nst PyPI only so the\nresolver uses the correct latest versions.\n\nAlso update test_create_auto_config[tabular_large] to expect ft_transformer\ncombiner instead of tabnet, matching the new AutoML default.",
          "is_bot": false,
          "headline": "fix: pre-install torchcodec from CPU index; update automl test for ft…",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-23T02:21:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c1a0763a0a766f9976c2fde4f6c9286d7066ab46",
          "body": "torchaudio 2.11 uses torchcodec for all audio I/O, which requires FFmpeg.\nCI was not installing ffmpeg and the torch pin (2.7.1) was below the new\ntorch>=2.11 lower bound, causing pip to upgrade to 2.12.0+cu130 (CUDA build\nfrom default PyPI) instead of the intended CPU build.\n\n- Add ffmpeg to apt-ge\n[…]\norch==2.12.0, torchvision==0.27.0, torchaudio==2.11.0\n- Use --extra-index-url https://download.pytorch.org/whl/cpu on all pip\n  install steps so torchcodec resolves to the +cpu build, not the CUDA one",
          "is_bot": false,
          "headline": "fix: update CI torch pins to 2.12.0 and add ffmpeg for torchcodec",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-23T01:50:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "870d7d2604f2048e3ff37508d434af3fc42ec5e1",
          "body": "- Require torch>=2.11, torchaudio>=2.11, torchvision>=0.26, transformers>=5.0\n  in core deps to match torchao>=0.17.0 (which requires torch>=2.11); fixes\n  LLM fine-tuning crash caused by torchao/torch version mismatch in Docker images\n- Update all four Docker images to pin torch==2.12.0, torchvisio\n[…]\na; torchao>=0.17.0 replaces old >=0.9.0\n- Change AutoML default tabular combiner from tabnet to ft_transformer;\n  add ft_transformer and tabtransformer to combiner_defaults with tuned hyperopt configs",
          "is_bot": false,
          "headline": "chore: bump version to 0.17.2; upgrade torch stack and automl defaults",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-23T00:43:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2da38ae884ce51d7a8c98a69ce283a0b86961754",
          "body": "- Extract _NDJSONChannel helper to eliminate _open/_emit copy-paste\n- Use NumpyEncoder instead of default=str for Ludwig JSON convention\n- _NDJSONChannel.__del__ closes file handle if on_hyperopt_end never fires\n- Remove import-inside-method for time in trainer.py and trainer_utils.py\n- Replace logger.info() in SIGUSR1/2 signal handlers with print() to\n  avoid potential deadlock when logging lock is held by main thread\n- Exclude ephemeral ProgressTracker fields from JSON serialization",
          "is_bot": false,
          "headline": "Refactor StudioCallback and trainer pause/resume for correctness",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-22T01:46:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "39cbef043d9f99c55ee766278f301ee0e178cc1f",
          "body": "… bug\n\nTwo root causes for CI failure in test_experiment[1919-0]:\n\n1. eval_loss() double-update bug: for non-MeanMetric eval_loss_metrics\n   (e.g. MSEMetric), calling self.eval_loss_metric(preds, targets) invokes\n   forward() which updates the metric's running state — but update_metrics()\n   already\n[…]\nx: module-scoped single_threaded_blas fixture sets\n   torch.set_num_threads(1) for the duration of test_reproducibility.py,\n   eliminating BLAS non-determinism without affecting the rest of the suite.",
          "is_bot": false,
          "headline": "fix: deterministic reproducibility tests; fix eval_loss double-update…",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-21T07:39:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b20826c66e8918a4f4b671d3ffc076c602eb2006",
          "body": "Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "[pre-commit.ci] pre-commit suggestions (#4191)",
          "author_name": "pre-commit-ci[bot]",
          "author_login": "pre-commit-ci[bot]",
          "committed_at": "2026-05-19T07:18:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "45a33bf9c6e8512aa943ad30db197832bf1750ed",
          "body": ".claude/worktrees/ paths were committed as gitlink submodule entries,\nbreaking CI checkout with submodules:recursive. Removed from index\nand added to .gitignore.",
          "is_bot": false,
          "headline": "Remove accidental Claude worktree gitlinks from index",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-18T21:35:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5d25563f3ed015423c64155378e456a634fe6c05",
          "body": "0.17.0 was tagged before the version bump commit landed, so the\nPyPI build produced ludwig-0.16.2 and was rejected as a duplicate.\nThis patch release also includes:\n- Preprocessing pipeline hardening for output features without\n  preprocessing config (e.g. anomaly type)\n- StudioCallback for Ludwig Studio metrics/hyperopt integration\n- Per-call callbacks on train() and hyperopt ray-free hardening",
          "is_bot": false,
          "headline": "chore: bump version to 0.17.1",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-18T21:32:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dab3533107de770e3a8243bb075e4dc04471432e",
          "body": "…ssing config\n\nOutput features like `anomaly` do not include a `preprocessing` key in their\nconfig dict (unlike all standard input/output features). This caused KeyErrors\nin four places in the preprocessing pipeline:\n\n- build_preprocessing_parameters: skip features with no PREPROCESSING key\n- build_\n[…]\nin the metric registry) that prevents training; these fixes are\ndefensive guards that prevent the preprocessing stage from crashing on any\nfuture output feature type that omits a preprocessing config.",
          "is_bot": false,
          "headline": "Fix preprocessing pipeline crash for output features without preproce…",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-18T08:19:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "cbd7e574703196b7e843e7da4267f307ccaea8d7",
          "body": "…onments\n\n- Add callbacks parameter to LudwigModel.train() so per-call callbacks can\n  be merged with model-level callbacks without rebuilding the model\n- Make ray imports in execution.py optional so OptunaExecutor works without ray\n- Add on_hyperopt_trial_start/end dispatch in OptunaExecutor so callbacks\n  receive trial lifecycle events during optuna-based hyperopt runs",
          "is_bot": false,
          "headline": "Add per-call callbacks to train(), harden hyperopt for ray-free envir…",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-18T06:30:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "44512d165418a86c0378cf3dd1b1ef7fbf7c2fb7",
          "body": "- Rename ludwig/callbacks.py → ludwig/callbacks/__init__.py so that\n  ludwig.callbacks.studio is importable as a submodule\n- Add on_hyperopt_trial_start / on_hyperopt_trial_end / on_hyperopt_end\n  hooks to StudioCallback: write trial_start, trial_end, hyperopt_end\n  events to <group_output_dir>/trials.jsonl for Ludwig Studio to stream\n- Add optional group_id / group_output_dir constructor params\n- Track best_eval_metric_value per trial via on_epoch_end for reporting",
          "is_bot": false,
          "headline": "Convert callbacks.py to package, add hyperopt hooks to StudioCallback",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-18T01:24:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5663a5d226c58e823ce269d098efb02bfad83888",
          "body": "StudioCallback (ludwig/callbacks/studio.py):\n- Built-in Ludwig callback for Ludwig Studio integration\n- Streams lifecycle events (phase transitions, per-epoch metrics) to\n  <output_dir>/metrics.jsonl (line-buffered NDJSON)\n- Emits progress_pct and eta_seconds on every metric event using the\n  new Pr\n[…]\n\n- Register SIGUSR2 handler: resume from SIGUSR1 pause\n- Initialize _training_paused=False in __init__\n- Restore SIG_DFL at end of training\n- Populate progress_tracker fields after batcher initializes",
          "is_bot": false,
          "headline": "Add StudioCallback, SIGUSR1/2 pause-resume, enhanced ProgressTracker",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-18T01:09:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5003d760d08ec0fb052b44da2e81b4d076b5524c",
          "body": "… (CWE-502) (#4190)",
          "is_bot": false,
          "headline": "fix(security): remove pickle from auto-dispatch and harden torch.load…",
          "author_name": "Piero Molino",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-17T19:05:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6a5a964b1643b4af8b4a7770b934a827ac8d0f28",
          "body": "…#4189)",
          "is_bot": false,
          "headline": "fix(api): remove stale type: ignore and dead tuple check in train() (…",
          "author_name": "Piero Molino",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-17T17:41:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7c526ab6beda3a965c36af1d618f98a366583575",
          "body": "…guide (#4187)",
          "is_bot": false,
          "headline": "docs: fix stale BaseFeatureMixin references in adding_a_feature_type …",
          "author_name": "Piero Molino",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-17T17:11:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0512de059c33a3dce0185ed5f0c81e3752fb81b6",
          "body": null,
          "is_bot": false,
          "headline": "refactor: full codebase improvement plan (Phase 0–7) (#4186)",
          "author_name": "Piero Molino",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-17T07:53:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0cd82690695d1930deafd59563470c4b90ccbb2b",
          "body": "…; fix visualize types\n\n- Add name() and description() classmethods to VeRA, LoHa, LoKr, FourierFT, BOFT adapter configs\n- Annotate **kwargs: Any in api.py public methods and kfold_cross_validate\n- Annotate hyperopt_hiplot_cli/hyperopt_hiplot with full type signatures\n- Add dict annotation to metadata parameter in confidence_thresholding_2thresholds_{2,3}d",
          "is_bot": false,
          "headline": "fix(docs): add name/description to adapter schemas; annotate **kwargs…",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-16T20:48:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ec46fa5fa37c971ce575d227dc7de92ff980c14b",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 0.17.0",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-16T20:30:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b6b6bc917d8af755263ba6f497a421d22e794806",
          "body": "…hed memmap (#4173)",
          "is_bot": false,
          "headline": "feat(data): preprocessing mode enum + prefetch_size config + lazy_cac…",
          "author_name": "Piero Molino",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-16T19:14:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "84d180d796860fc71780a3e930a0f7875d8928ef",
          "body": "Two root-cause fixes that together bring lazy-decode throughput to\nnear-eager performance:\n\n1. Audio FBANK over-subscription fix\n   LazyColumn for audio now uses max(1, cpu_count // torch_threads)\n   workers instead of the previous default of min(16, cpu_count+4).\n   FBANK is CPU-bound and already u\n[…]\n:           already 99.9% util (async reader was correct)\n\nAlso add:\n- 30 unit tests in tests/ludwig/data/test_prefetch_batcher.py\n- scripts/benchmark_training_pipeline.py for per-step timing analysis",
          "is_bot": false,
          "headline": "feat(data): prefetch background decoder for lazy audio/image features",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-16T05:21:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "991efde40be4c8275164a59c8b1f121176a11f39",
          "body": "…ession tests and benchmark\n\n- _with_lazy_decode now emits a WARNING (not silent skip) when lazy=True but\n  lazy_audio_params / lazy_image_params is absent in training_set_metadata,\n  so stale preprocessing caches fail loudly rather than silently passing path\n  strings to workers.\n- Add parametrized\n[…]\nnchmark_lazy_decode.py to measure throughput across\n  eager_local / lazy_local / eager_ray / lazy_ray paths; confirms lazy=False\n  (eager_ray) is unaffected by the decode pipeline change (~3 700 sps).",
          "is_bot": false,
          "headline": "fix(ray): warn on missing lazy_audio/image_params; add lazy-mode regr…",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-16T04:34:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "39a774cd2df5828163a85b7a6ac9d8adddea699c",
          "body": "… training actors\n\nLazy audio/image features store file paths in the dataset. PandasDataset wraps\nthese with LazyColumn objects so local training decodes per-batch. RayDataset had\nno equivalent, so Ray workers received raw path strings instead of tensors. The\nbatcher then tried to np.stack strings, \n[…]\naset — which is the whole point of lazy=True.\n\nAlso remove the workaround lazy=False from audio_feature() test helper; with the\nfix, lazy=True (schema default) works correctly in distributed training.",
          "is_bot": false,
          "headline": "fix(ray): decode lazy media features in Ray data pipeline, not inside…",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-16T04:00:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c6b3b1fd5c10fa1cc0a34ebb9cc670094b5bb264",
          "body": "…ributed tests 6x (#4172)",
          "is_bot": false,
          "headline": "test(ci): rename integration groups to sequential letters, split dist…",
          "author_name": "Piero Molino",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-16T02:56:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4e94923dde41f7ab97b91d73dcc40a8b7cca2f90",
          "body": null,
          "is_bot": false,
          "headline": "feat(data): lazy preprocessing for audio and image features (#4171)",
          "author_name": "Piero Molino",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-16T00:22:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0743a27c15a0b0df9f606529c39fe983cdde5893",
          "body": "…r in load_pretrained_from_config\n\ntorchao>=0.9.0 calls torch.utils._pytree.register_constant() at class-definition\ntime (via @register_as_pytree_constant), which was added in PyTorch 2.7.0. Users\non PyTorch 2.6.x get an AttributeError the moment transformers imports the torchao\nquantizer module — e\n[…]\nient HuggingFace Hub download failures; catching\n  all Exception was causing 8 retries over ~2.5 minutes before surfacing the real\n  error (AttributeError from the broken torchao import).\n\nFixes #4170",
          "is_bot": false,
          "headline": "fix(llm): require torch>=2.7 with llm extra; stop retrying non-OSErro…",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-14T04:11:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "910a45ed6aaa16e332b9dc3da38beab9ffd0c88d",
          "body": "…ed data\n\nPrevents OOM on image datasets (e.g. rendered_sst2) where streaming\n40k images into a large shuffle buffer exhausted all available RAM.\nSequential sampling from skip position is sufficient for diversity.\n\nAlso marks intentionally-deleted dataset configs as skipped in results.",
          "is_bot": false,
          "headline": "fix(datasets/smoke-test): use buffer=1 for diversity-retry skip-sampl…",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-14T03:37:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "426f348ff761cb586c040ccdda419b2ef6a563e4",
          "body": "…t outputs\n\nNatural Questions rows are ~1MB each; a 10k buffer wastes 10GB RAM.\nText/number output datasets have no minimum-diversity requirement, so\na 2k shuffle buffer is sufficient while keeping memory usage bounded.",
          "is_bot": false,
          "headline": "fix(datasets/smoke-test): reduce default shuffle buffer to 2k for tex…",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-14T03:16:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a17f0b756b7adc3e9e1cbb55c194c686baa31103",
          "body": "…ification outputs\n\n100k buffer rows for text/number outputs (NQ, ASR, etc.) wastes RAM and time.\nOnly use the 100k buffer when output features are category/binary (need label\ndiversity in sorted datasets). Media datasets always use 5k.",
          "is_bot": false,
          "headline": "fix(datasets/smoke-test): smart shuffle buffer — large only for class…",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-14T03:14:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "427279981b479dfa138b5fcf3c275117fa7bcac6",
          "body": null,
          "is_bot": false,
          "headline": "fix(datasets): change peoples_speech duration_ms from category to number",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-14T03:09:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "92e1b20cac811b9a5a12173f39e6750417f90748",
          "body": "The GLUE ax diagnostic split only has a test split with all labels=-1\n(benchmark labels are hidden). Unusable for training smoke tests.",
          "is_bot": false,
          "headline": "fix(datasets): remove glue_diagnostic config (hidden test labels)",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-14T03:06:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2c83326c57c879a7d7aeb8ec416e34264193f18c",
          "body": "…on datasets\n\nWhen an output category/binary column has only 1 distinct value after sampling\n(dataset is sorted by label), retry by skipping 40k rows into the stream and\ntaking a second half-sample from a different label region. Handles cases like\nrendered_sst2 (SST-2 as images, sorted: all negatives first then positives).\n\nAlso adds skip parameter to stream_sample() for targeted offset sampling.",
          "is_bot": false,
          "headline": "fix(datasets/smoke-test): add diversity retry for sorted classificati…",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-14T03:05:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e596e904ef2121cb901799c825a6e95df3074d51",
          "body": "Audio and image datasets stream large files — use a 5k buffer to avoid\nstreaming 100k large files. Text datasets use 100k buffer to ensure\nlabel diversity in sorted classification datasets (dbpedia_14, imdb, etc).",
          "is_bot": false,
          "headline": "fix(datasets/smoke-test): use media-aware shuffle buffer size",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-14T03:00:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "de8bb8d16bada7382cf125e3308a086bd8328afd",
          "body": "…iversity\n\nSorted datasets like imdb (25k rows/class), rotten_tomatoes (5k/class),\nand dbpedia_14 (40k/class) require a larger shuffle buffer to ensure\nat least 2 distinct label values appear in the 1000-row sample.",
          "is_bot": false,
          "headline": "fix(datasets/smoke-test): increase shuffle buffer to 100k for label d…",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-14T02:58:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6ae10bbea70483a438570848f5ae7a5300c899f9",
          "body": "- Fix CauldronVQALoader._transform(): add default split_name=\"train\" so\n  apply_custom_loader() can call it without positional arg\n- Fix NewYorkerCaptionContestLoader._transform(): same default arg fix\n- Fix NaturalQuestionsLoader: safe indexing when short_answers is []\n- Fix OpenBookQALoader: remov\n[…]\nor streaming smoke tests:\n  fsd50k (labels always null), legalbench (all subsets <32 rows),\n  mmmu (5 rows per split), gift_eval (streaming schema incompatible),\n  samsum (dataset removed from HF Hub)",
          "is_bot": false,
          "headline": "fix(datasets): fix loaders and configs for smoke test failures",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-14T02:58:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "693c1d86d053fdb5036250074278199c6b8ae3c7",
          "body": "…sets\n\nAdds 8 loader modules and 51 YAML configs covering every complex-column\npattern — nothing skipped.\n\ntranslation_loader: HF translation dict → src/tgt text columns\n  (opus100_en_fr/es, wmt14/16/19_de_en, opus_books_en_fr)\n\nner_loader: token/tag lists → space-joined strings\n  (wikiann_en/de/zh,\n[…]\ns, textvqa, vqav2, docvqa, scienceqa_vqa,\n   mathvista, mmmu)\n\nmisc_loaders: one-off transforms\n  (klue_sts, multirc, sciq, gift_eval)\n\nAlso adds invoice_data and cord_v2 (image→text, plain HFLoader).",
          "is_bot": false,
          "headline": "feat(datasets): add custom loaders and configs for 51 complex HF data…",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-13T19:56:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "954b58a6a81a03149c90b0c507de614ceb839453",
          "body": "Auto-generated via probe script that streams 20 rows from each candidate,\ninfers column types, and writes YAML configs for the HFLoader.\n\nText classification (GLUE/SuperGLUE and beyond):\n  mnli, qqp, qnli, cola, rte, mrpc, stsb, wnli (GLUE)\n  boolq, commitment_band, copa, superglue_rte, wic, winogra\n[…]\ntricity_tabular, diabetes_readmission,\n  compas_recidivism, credit_card_default, student_performance\n\nQA / text generation:\n  gsm8k, math500, vqa_rad, msmarco_passage, natural_questions_hard_negatives",
          "is_bot": false,
          "headline": "feat(datasets): add 94 HuggingFace datasets across all modalities",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-13T17:07:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c6689890714ba1520351056275c93d7635371536",
          "body": "…on Contest datasets\n\n- ESC-50: audio classification (2,000 WAV clips, 50 classes, 5 folds)\n  via direct GitHub archive download; category output feature\n- WikiANN: English NER (IOB2 tags) via HuggingFace; sequence output feature\n- GoEmotions: Reddit multi-label emotion classification (28 classes) v\n[…]\nPIL images saved to disk with caching\n\nHFLoader converts list/numpy array columns to pandas object dtype after\nto_pandas(); all three HF loaders handle numpy.ndarray inputs in their\ntransform methods.",
          "is_bot": false,
          "headline": "feat(datasets): add ESC-50, WikiANN, GoEmotions, and New Yorker Capti…",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-13T05:04:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8791e91f68ccfc5cff93a0bd268828f4c45748e1",
          "body": "…fixes (#4169)",
          "is_bot": false,
          "headline": "fix(automl): dataset-aware sampling, transformer LR cap, SearchSpace …",
          "author_name": "Piero Molino",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-13T04:42:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "67eeefe310be547ef9b64640bea7e3f9ca099669",
          "body": "…o prevent OOM\n\ncross_attention and perceiver combiners scale quadratically with the number of\ninput features. With 90+ features and batch_size=512, these exceed VRAM on\nconsumer GPUs (10–24 GiB). Add CombinerSpec.max_batch_size (mirrors the existing\nmax_learning_rate pattern) and default it to 256 for cross_attention and perceiver.",
          "is_bot": false,
          "headline": "fix(automl): cap batch size for cross_attention/perceiver combiners t…",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-12T07:23:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "650d39142065d1cafd9320b360c008d2ae840ce8",
          "body": "…vent NaN loss\n\nTransformer/attention combiners (transformer, tabtransformer, ft_transformer,\ncross_attention, perceiver, hypernetwork) diverge with lr=1e-2 — NaN loss\nobserved in pilot benchmark on forest_cover.\n\nAdd CombinerSpec.max_learning_rate field. When set, _sample_trainer_params\nfilters the\n[…]\nal LR grid to values <= max_learning_rate before sampling.\nAll transformer-based combiners default to max_learning_rate=3e-3.\n\nAlso update _load_combiners_from_dir to read max_learning_rate from YAML.",
          "is_bot": false,
          "headline": "fix(automl): cap learning rate for transformer-based combiners to pre…",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-12T05:11:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d39ce42f2c1af586c29b6c8c877b928c02a67565",
          "body": "… space",
          "is_bot": false,
          "headline": "fix(automl): use SearchSpace._from_specs() to build size-aware search…",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-12T01:17:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9dadfb66f9fd6a657c4a7771c979c38835c2a599",
          "body": "…rame",
          "is_bot": false,
          "headline": "fix(automl): pass default_epochs to TrainerSpec in configs_from_dataf…",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-12T01:16:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a3df7a468e8facb070ac8e0fceac683fbe41063c",
          "body": "…t_search_space",
          "is_bot": false,
          "headline": "fix(automl): fix import in configs_from_dataframe — use _build_defaul…",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-12T01:15:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d7992dfd6c79947fb940d05ccd676fe5f57c66a1",
          "body": "…_from_dataframe\n\nFor datasets >100k rows, cap max_epochs=10 and batch_sizes=[128,256,512].\nFor datasets >500k rows, cap max_epochs=5 and batch_sizes=[256,512,1024].\nPrevents OOM and timeout on large datasets (forest_cover 581k, otto 206k)\nduring AutoML pilot benchmarking.",
          "is_bot": false,
          "headline": "feat(automl): dataset-size-aware epoch and batch_size caps in configs…",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-12T01:13:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a717705bbdbf69d838c8bfd64fc7d7b128c90885",
          "body": null,
          "is_bot": false,
          "headline": "revert: remove tabpfn optional-dep workaround — tabpfn is now installed",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-11T20:41:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "55297f23868b97dd4581224532c16f82afc30e09",
          "body": null,
          "is_bot": false,
          "headline": "fix: reject tabpfn_v2 configs when tabpfn package is not installed",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-11T17:02:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "52279a2d2716dedaa4d8c7d95a5b8d521504f9c2",
          "body": "…, dataset quality (#4168)",
          "is_bot": false,
          "headline": "feat: Mega-AutoML infrastructure — YAML search space, config pipeline…",
          "author_name": "Piero Molino",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-11T07:19:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cdae010f8731134be2fe6c26af7ee06d5810788f",
          "body": "…ng (#4159)",
          "is_bot": false,
          "headline": "refactor: remove stale duplicate text/encoders.py; flatten deep nesti…",
          "author_name": "Piero Molino",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-11T03:27:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4670d753cf915964466282baf609212b069c91d8",
          "body": "…package (#4154)",
          "is_bot": false,
          "headline": "refactor: split 4144-line visualize.py into domain-scoped visualize/ …",
          "author_name": "Piero Molino",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-11T03:25:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4eb469e613d772be1b955a68ddde5522b9088812",
          "body": null,
          "is_bot": false,
          "headline": "Release v0.16.2",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-08T07:50:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c00375348292c0c2e479d62706b7824fd094cd9f",
          "body": null,
          "is_bot": false,
          "headline": "fix: rewrite torch_utils tests to not fail in no-CUDA CI environments",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-08T06:47:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c74827df89536a6e8e46e41746e70c2ffa17000a",
          "body": "…_safe)",
          "is_bot": false,
          "headline": "fix: update test_serve_v2 to use numpy_to_python (renamed from _numpy…",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-08T05:57:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aadb9ec4f862e7646f290d3907e8c79e64dd9b23",
          "body": "…in__.py for python -m ludwig.visualize",
          "is_bot": false,
          "headline": "fix: remove redundant dtype check in text_feature; add visualize __ma…",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-08T05:19:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "32dc77cec24a967d23013717584dea0ad4d2203c",
          "body": "…tations, docstring fixes",
          "is_bot": false,
          "headline": "refactor: major api.py cleanup — guard clauses, extraction, type anno…",
          "author_name": "Piero Molino",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-08T04:33:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "686aa93225b3442215e4a2ad2b8bd81ac6eb578d",
          "body": "…st strategy\n\nTwo regression tests to prevent re-introduction of the bugs fixed in\nthe recent patch releases:\n\n1. tests/ludwig/utils/test_import_safety.py (#4142)\n   Simulates a broken torchao/PyTorch environment where transformers'\n   lazy loader raises ModuleNotFoundError for PreTrainedModel. Veri\n[…]\nr: Distributed strategy not\n   initialized. The existing category-output test missed this because\n   SoftmaxCrossEntropyMetric inherits MeanMetric and takes a shortcut\n   that bypasses sync_context().",
          "is_bot": false,
          "headline": "test: regression tests for transformers import safety and Ray tune di…",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-08T04:32:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2f2c1113bb97f2664318fe80aa26a009352b9dc5",
          "body": "…learning_rate_fn\n\nBoth Ray remote tuning functions run metric evaluation (train_step →\nupdate_metrics → eval_loss → TorchMetrics sync_context) without ever\ninitializing a distributed strategy. This caused:\n\n  RuntimeError: Distributed strategy not initialized\n\nin get_current_dist_strategy() inside \n[…]\nwhat train_fn and eval_fn already do: call\ninit_dist_strategy(\"local\") immediately after initialize_pytorch() so\nthe metric sync context is available for the duration of the tuning pass.\n\nFixes #4149.",
          "is_bot": false,
          "headline": "fix: call init_dist_strategy(\"local\") in tune_batch_size_fn and tune_…",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-08T04:26:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c7f56019259d8ee4a2e2eff09ebe3be78a5f3553",
          "body": null,
          "is_bot": false,
          "headline": "Release v0.16.1",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-07T05:01:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "322e51f2603dd1600a8d511cf596bbe99fc4d5a1",
          "body": "…CKING in llm_utils and text_feature\n\nOn Python 3.12, function annotations are evaluated eagerly at module load\ntime. When torchao and PyTorch are version-mismatched (torchao calls\ntorch.utils._pytree.register_constant which doesn't exist in older PyTorch\nbuilds), transformers' lazy loader for class\n[…]\ne them to\n  TYPE_CHECKING and add `from __future__ import annotations`.\n- text_feature.py: PreTrainedTokenizer was imported at module level but only\n  used in type annotations. Same fix.\n\nFixes #4142.",
          "is_bot": false,
          "headline": "fix: defer PreTrainedModel/PreTrainedTokenizer/AutoConfig to TYPE_CHE…",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-07T05:00:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f72305164971538528a20cfd2b77ea312352a3e4",
          "body": null,
          "is_bot": false,
          "headline": "refactor: migrate from black+isort+flake8 to unified ruff toolchain",
          "author_name": "Piero Molino",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-07T04:56:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "868e40b17807fb5dfdd89aefc1d4e306bbbc04cb",
          "body": "… (#4152)",
          "is_bot": false,
          "headline": "fix: replace assert with explicit exceptions; fix mutable default arg…",
          "author_name": "Piero Molino",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-07T04:53:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a8bbee8c89159d2c3bc840dd2ed655b322cd6c3e",
          "body": null,
          "is_bot": false,
          "headline": "Release v0.16.0",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-06T16:06:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "76a72dec168ed7b4e55d8b505392c7a72a9ed7b1",
          "body": "…ython 3.12\n\nIn Python 3.12, function return-type annotations are evaluated eagerly at\nmodule load time. hf_utils.py imported PreTrainedModel at the top level,\nbut transformers 5.x uses a lazy import system that requires torch to be\nfully initialized — which in Ray worker processes it isn't yet duri\n[…]\nn our dev environment.\n\nMove PreTrainedModel under TYPE_CHECKING and add from __future__ import\nannotations to defer annotation evaluation, fixing the ModuleNotFoundError\non Python 3.12 + conda + Ray.",
          "is_bot": false,
          "headline": "fix: defer PreTrainedModel import to TYPE_CHECKING to fix import on P…",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-06T15:53:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "37535dc13a61b7e18d9bad711a894b1ec17d66b0",
          "body": "…nd LLM readability\n\nComplete redesign:\n- New capability matrix table in What's New (PatchTST/N-BEATS, advanced PEFT, VLM, HyperNetwork\n  combiner, Nash-MTL/Pareto-MTL, LLM config gen, ModelInspector, Ray Serve, KServe)\n- Collapsed capabilities into details sections (LLM fine-tuning, multimodal/tabu\n[…]\nmerged into concise bullet list\n- Added navigation bar (Docs / Getting Started / Examples / Discord)\n- Improved keyword density for search and LLM retrieval (model names, technique names, config keys)",
          "is_bot": false,
          "headline": "docs: modernize README — add all 0.15 features, restructure for SEO a…",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-06T06:15:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "79b72c45b79466157fe773966c29e7f82ae5c0ea",
          "body": "…ecodeError on image bytes (#4151)",
          "is_bot": false,
          "headline": "fix: set dask convert-string:False at import time to prevent UnicodeD…",
          "author_name": "Piero Molino",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-06T01:09:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "938ccf0121118a2b7caa385b3a4d17fed015f9c7",
          "body": "… (#4150)",
          "is_bot": false,
          "headline": "fix: eliminate partd race condition by using tasks-based Dask shuffle…",
          "author_name": "Piero Molino",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-05T23:56:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f676988900bd9786f2f2f2f11a702f993a06a274",
          "body": "…chTST, N-BEATS, and PEFT adapters (#4148)",
          "is_bot": false,
          "headline": "fix+test: encoder input_shape contract + ultra-slow e2e tests for Pat…",
          "author_name": "Piero Molino",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-05T23:56:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ac326d795296ccc5245289db1f7e6ab233dc35ce",
          "body": "…MAPE (#4147)",
          "is_bot": false,
          "headline": "feat: world-class timeseries forecasting — PatchTST, N-BEATS, MASE, s…",
          "author_name": "Piero Molino",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-05T21:25:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5fe1e870172281a139a5fb8b72588140206d5248",
          "body": "…RA, WaveFT, LN-Tuning, VBLoRA (#4146)",
          "is_bot": false,
          "headline": "feat: advanced PEFT adapters — PiSSA/EVA/CorDA, TinyLoRA, C3A, OFT, H…",
          "author_name": "Piero Molino",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-05T21:24:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c38cd177fb66354620a4fe7d83161474b1c8eb92",
          "body": null,
          "is_bot": false,
          "headline": "fix: missing patches from 0.15.1 + ultra-slow test suite (#4145)",
          "author_name": "Piero Molino",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-05T17:37:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5eb58d373b536ec459e94e15b60bedaad80a249b",
          "body": "…sh (#4144)",
          "is_bot": false,
          "headline": "fix: GPU underutilization in Ray backend + Python 3.14 annotation cra…",
          "author_name": "Piero Molino",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-05T05:24:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "df70aaa0c8911d5153e30692cfeec800c80b597f",
          "body": null,
          "is_bot": false,
          "headline": "fix: sort imports in dataset_synthesizer.py (isort)",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-05-03T18:52:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0a6a021aa250d9413b4a97be4ed33e8bba561313",
          "body": "CacheableDataframe.get_cache_directory() returns tempfile.gettempdir()\n(not the pytest tmpdir), so path assertions for use_df+no_cache_dir must\nuse the system temp dir rather than the test-scoped tmpdir fixture.\n\nAlso updates pre-commit config to python3.14 (python3.12 removed after OS\nupgrade) and drops docformatter whose untokenize dep is broken on 3.14.",
          "is_bot": false,
          "headline": "fix: update cache test expectations for in-memory DataFrame paths",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-04-29T09:41:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8f87a317ea9e7f13c30e4e81ab8082bab55f3e7b",
          "body": null,
          "is_bot": false,
          "headline": "fix: stop writing cache and synthetic dataset files to cwd during tests",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-04-29T08:58:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1ba626d1b00c13ce214b6805f017306fb2b6c229",
          "body": null,
          "is_bot": false,
          "headline": "fix: write in-memory DataFrame cache files to tempdir instead of cwd",
          "author_name": "w4nderlust",
          "author_login": "w4nderlust",
          "committed_at": "2026-04-29T08:54:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3a53eddae415c73394fb57d5e42377c6e513ea90",
          "body": "…ve deployment (#4140)",
          "is_bot": false,
          "headline": "examples: VLM fine-tuning, Mamba-2/Jamba encoders, Ray Serve and KSer…",
          "author_name": "Piero Molino",
          "author_login": "w4nderlust",
          "committed_at": "2026-04-29T07:46:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a6c6bd7bafc743b731b66da3117037c3331051fd",
          "body": "…tor (#4139)",
          "is_bot": false,
          "headline": "fix: phase 6 code review — encoder, loss balancing, config gen, colla…",
          "author_name": "Piero Molino",
          "author_login": "w4nderlust",
          "committed_at": "2026-04-29T07:45:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "09824674db293924c943322cb9ac84099bb15325",
          "body": "…t (#4141)",
          "is_bot": false,
          "headline": "fix: eliminate flaky test_tune_batch_size_lr_cpu single-category spli…",
          "author_name": "Piero Molino",
          "author_login": "w4nderlust",
          "committed_at": "2026-04-29T07:44:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 73,
      "commits_last_year": 267,
      "latest_release_at": "2026-07-27T00:35:54Z",
      "latest_release_tag": "v0.17.8",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 12,
      "days_since_latest_release": 0,
      "mean_days_between_releases": 9
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 87,
      "has_issue_template": false,
      "has_code_of_conduct": true,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": [
        {
          "name": "ludwig",
          "exists": true,
          "license": "Apache-2.0",
          "keywords": [
            "computer vision",
            "deep learning",
            "ludwig",
            "machine learning",
            "natural language processing",
            "Development Status :: 4 - Beta",
            "Intended Audience :: Developers",
            "Intended Audience :: Science/Research",
            "License :: OSI Approved :: Apache Software License",
            "Programming Language :: Python :: 3",
            "Programming Language :: Python :: 3.12",
            "Topic :: Scientific/Engineering :: Artificial Intelligence"
          ],
          "ecosystem": "pypi",
          "matches_repo": true,
          "registry_url": "https://pypi.org/project/ludwig/",
          "is_deprecated": false,
          "latest_version": "0.17.8",
          "repository_url": "https://github.com/ludwig-ai/ludwig",
          "versions_count": 77,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 3413,
          "first_published_at": "2019-02-11T03:39:13.286608Z",
          "latest_published_at": "2026-07-27T00:40:21.211678Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        }
      ]
    },
    "popularity": {
      "forks": 1218,
      "stars": 11746,
      "watchers": 183,
      "fork_history": {
        "days": [
          {
            "date": "2019-02-18",
            "count": 5
          },
          {
            "date": "2019-02-19",
            "count": 9
          },
          {
            "date": "2019-02-20",
            "count": 5
          },
          {
            "date": "2019-02-21",
            "count": 6
          },
          {
            "date": "2019-02-22",
            "count": 4
          },
          {
            "date": "2019-02-23",
            "count": 3
          },
          {
            "date": "2019-02-24",
            "count": 2
          },
          {
            "date": "2019-02-25",
            "count": 2
          },
          {
            "date": "2019-02-26",
            "count": 3
          },
          {
            "date": "2019-02-27",
            "count": 3
          },
          {
            "date": "2019-02-28",
            "count": 1
          },
          {
            "date": "2019-03-01",
            "count": 4
          },
          {
            "date": "2019-03-02",
            "count": 2
          },
          {
            "date": "2019-03-04",
            "count": 3
          },
          {
            "date": "2019-03-05",
            "count": 24
          },
          {
            "date": "2019-03-06",
            "count": 14
          },
          {
            "date": "2019-03-07",
            "count": 3
          },
          {
            "date": "2019-03-08",
            "count": 4
          },
          {
            "date": "2019-03-09",
            "count": 4
          },
          {
            "date": "2019-03-10",
            "count": 6
          },
          {
            "date": "2019-03-11",
            "count": 7
          },
          {
            "date": "2019-03-12",
            "count": 3
          },
          {
            "date": "2019-03-13",
            "count": 6
          },
          {
            "date": "2019-03-14",
            "count": 3
          },
          {
            "date": "2019-03-15",
            "count": 5
          },
          {
            "date": "2019-03-17",
            "count": 1
          },
          {
            "date": "2019-03-19",
            "count": 2
          },
          {
            "date": "2019-03-20",
            "count": 3
          },
          {
            "date": "2019-03-21",
            "count": 1
          },
          {
            "date": "2019-03-22",
            "count": 2
          },
          {
            "date": "2019-03-23",
            "count": 4
          },
          {
            "date": "2019-03-24",
            "count": 2
          },
          {
            "date": "2019-03-25",
            "count": 1
          },
          {
            "date": "2019-03-26",
            "count": 6
          },
          {
            "date": "2019-03-27",
            "count": 2
          },
          {
            "date": "2019-03-28",
            "count": 2
          },
          {
            "date": "2019-03-29",
            "count": 1
          },
          {
            "date": "2019-03-30",
            "count": 2
          },
          {
            "date": "2019-03-31",
            "count": 1
          },
          {
            "date": "2019-04-01",
            "count": 1
          },
          {
            "date": "2019-04-04",
            "count": 2
          },
          {
            "date": "2019-04-05",
            "count": 1
          },
          {
            "date": "2019-04-06",
            "count": 1
          },
          {
            "date": "2019-04-09",
            "count": 3
          },
          {
            "date": "2019-04-10",
            "count": 1
          },
          {
            "date": "2019-04-12",
            "count": 1
          },
          {
            "date": "2019-04-13",
            "count": 1
          },
          {
            "date": "2019-04-15",
            "count": 1
          },
          {
            "date": "2019-04-18",
            "count": 4
          },
          {
            "date": "2019-04-19",
            "count": 1
          },
          {
            "date": "2019-04-21",
            "count": 2
          },
          {
            "date": "2019-04-22",
            "count": 2
          },
          {
            "date": "2019-04-24",
            "count": 1
          },
          {
            "date": "2019-04-26",
            "count": 1
          },
          {
            "date": "2019-04-28",
            "count": 2
          },
          {
            "date": "2019-04-29",
            "count": 1
          },
          {
            "date": "2019-04-30",
            "count": 1
          },
          {
            "date": "2019-05-04",
            "count": 2
          },
          {
            "date": "2019-05-07",
            "count": 1
          },
          {
            "date": "2019-05-13",
            "count": 4
          },
          {
            "date": "2019-05-14",
            "count": 5
          },
          {
            "date": "2019-05-15",
            "count": 1
          },
          {
            "date": "2019-05-16",
            "count": 1
          },
          {
            "date": "2019-05-17",
            "count": 1
          },
          {
            "date": "2019-05-22",
            "count": 1
          },
          {
            "date": "2019-05-23",
            "count": 1
          },
          {
            "date": "2019-05-25",
            "count": 1
          },
          {
            "date": "2019-05-27",
            "count": 1
          },
          {
            "date": "2019-05-28",
            "count": 2
          },
          {
            "date": "2019-05-29",
            "count": 1
          },
          {
            "date": "2019-05-30",
            "count": 1
          },
          {
            "date": "2019-06-03",
            "count": 1
          },
          {
            "date": "2019-06-04",
            "count": 1
          },
          {
            "date": "2019-06-09",
            "count": 2
          },
          {
            "date": "2019-06-10",
            "count": 1
          },
          {
            "date": "2019-06-16",
            "count": 2
          },
          {
            "date": "2019-06-18",
            "count": 2
          },
          {
            "date": "2019-06-19",
            "count": 2
          },
          {
            "date": "2019-06-20",
            "count": 1
          },
          {
            "date": "2019-06-22",
            "count": 3
          },
          {
            "date": "2019-06-23",
            "count": 1
          },
          {
            "date": "2019-06-24",
            "count": 2
          },
          {
            "date": "2019-06-27",
            "count": 2
          },
          {
            "date": "2019-06-30",
            "count": 1
          },
          {
            "date": "2019-07-01",
            "count": 1
          },
          {
            "date": "2019-07-03",
            "count": 1
          },
          {
            "date": "2019-07-05",
            "count": 1
          },
          {
            "date": "2019-07-06",
            "count": 1
          },
          {
            "date": "2019-07-08",
            "count": 3
          },
          {
            "date": "2019-07-09",
            "count": 2
          },
          {
            "date": "2019-07-10",
            "count": 2
          },
          {
            "date": "2019-07-11",
            "count": 1
          },
          {
            "date": "2019-07-12",
            "count": 1
          },
          {
            "date": "2019-07-14",
            "count": 3
          },
          {
            "date": "2019-07-15",
            "count": 3
          },
          {
            "date": "2019-07-16",
            "count": 4
          },
          {
            "date": "2019-07-17",
            "count": 2
          },
          {
            "date": "2019-07-18",
            "count": 1
          },
          {
            "date": "2019-07-19",
            "count": 1
          },
          {
            "date": "2019-07-21",
            "count": 1
          },
          {
            "date": "2019-07-22",
            "count": 2
          },
          {
            "date": "2019-07-23",
            "count": 1
          },
          {
            "date": "2019-07-24",
            "count": 2
          },
          {
            "date": "2019-07-25",
            "count": 6
          },
          {
            "date": "2019-07-26",
            "count": 2
          },
          {
            "date": "2019-07-27",
            "count": 1
          },
          {
            "date": "2019-07-28",
            "count": 1
          },
          {
            "date": "2019-07-29",
            "count": 2
          },
          {
            "date": "2019-07-30",
            "count": 1
          },
          {
            "date": "2019-07-31",
            "count": 2
          },
          {
            "date": "2019-08-01",
            "count": 1
          },
          {
            "date": "2019-08-02",
            "count": 2
          },
          {
            "date": "2019-08-05",
            "count": 3
          },
          {
            "date": "2019-08-06",
            "count": 1
          },
          {
            "date": "2019-08-08",
            "count": 2
          },
          {
            "date": "2019-08-09",
            "count": 1
          },
          {
            "date": "2019-08-13",
            "count": 2
          },
          {
            "date": "2019-08-14",
            "count": 4
          },
          {
            "date": "2019-08-15",
            "count": 2
          },
          {
            "date": "2019-08-16",
            "count": 1
          },
          {
            "date": "2019-08-17",
            "count": 1
          },
          {
            "date": "2019-08-18",
            "count": 1
          },
          {
            "date": "2019-08-20",
            "count": 1
          },
          {
            "date": "2019-08-21",
            "count": 2
          },
          {
            "date": "2019-08-25",
            "count": 2
          },
          {
            "date": "2019-08-26",
            "count": 2
          },
          {
            "date": "2019-08-28",
            "count": 1
          },
          {
            "date": "2019-08-31",
            "count": 1
          },
          {
            "date": "2019-09-01",
            "count": 2
          },
          {
            "date": "2019-09-02",
            "count": 3
          },
          {
            "date": "2019-09-04",
            "count": 1
          },
          {
            "date": "2019-09-05",
            "count": 1
          },
          {
            "date": "2019-09-08",
            "count": 2
          },
          {
            "date": "2019-09-09",
            "count": 1
          },
          {
            "date": "2019-09-10",
            "count": 1
          },
          {
            "date": "2019-09-14",
            "count": 2
          },
          {
            "date": "2019-09-15",
            "count": 1
          },
          {
            "date": "2019-09-16",
            "count": 1
          },
          {
            "date": "2019-09-18",
            "count": 2
          },
          {
            "date": "2019-09-23",
            "count": 2
          },
          {
            "date": "2019-09-25",
            "count": 1
          },
          {
            "date": "2019-09-29",
            "count": 1
          },
          {
            "date": "2019-10-03",
            "count": 1
          },
          {
            "date": "2019-10-06",
            "count": 1
          },
          {
            "date": "2019-10-09",
            "count": 1
          },
          {
            "date": "2019-10-10",
            "count": 3
          },
          {
            "date": "2019-10-11",
            "count": 2
          },
          {
            "date": "2019-10-12",
            "count": 2
          },
          {
            "date": "2019-10-16",
            "count": 1
          },
          {
            "date": "2019-10-18",
            "count": 2
          },
          {
            "date": "2019-10-24",
            "count": 3
          },
          {
            "date": "2019-10-28",
            "count": 2
          },
          {
            "date": "2019-10-30",
            "count": 1
          },
          {
            "date": "2019-10-31",
            "count": 1
          },
          {
            "date": "2019-11-04",
            "count": 1
          },
          {
            "date": "2019-11-05",
            "count": 2
          },
          {
            "date": "2019-11-07",
            "count": 1
          },
          {
            "date": "2019-11-08",
            "count": 1
          },
          {
            "date": "2019-11-10",
            "count": 1
          },
          {
            "date": "2019-11-11",
            "count": 1
          },
          {
            "date": "2019-11-12",
            "count": 2
          },
          {
            "date": "2019-11-15",
            "count": 1
          },
          {
            "date": "2019-11-20",
            "count": 2
          },
          {
            "date": "2019-11-22",
            "count": 1
          },
          {
            "date": "2019-11-26",
            "count": 1
          },
          {
            "date": "2019-11-28",
            "count": 2
          },
          {
            "date": "2019-11-29",
            "count": 1
          },
          {
            "date": "2019-12-04",
            "count": 1
          },
          {
            "date": "2019-12-06",
            "count": 1
          },
          {
            "date": "2019-12-08",
            "count": 1
          },
          {
            "date": "2019-12-09",
            "count": 1
          },
          {
            "date": "2019-12-10",
            "count": 1
          },
          {
            "date": "2019-12-11",
            "count": 2
          },
          {
            "date": "2019-12-15",
            "count": 1
          },
          {
            "date": "2019-12-27",
            "count": 1
          },
          {
            "date": "2019-12-30",
            "count": 2
          },
          {
            "date": "2019-12-31",
            "count": 1
          },
          {
            "date": "2020-01-01",
            "count": 1
          },
          {
            "date": "2020-01-06",
            "count": 1
          },
          {
            "date": "2020-01-07",
            "count": 1
          },
          {
            "date": "2020-01-09",
            "count": 1
          },
          {
            "date": "2020-01-11",
            "count": 1
          },
          {
            "date": "2020-01-15",
            "count": 1
          },
          {
            "date": "2020-01-16",
            "count": 2
          },
          {
            "date": "2020-01-17",
            "count": 2
          },
          {
            "date": "2020-01-18",
            "count": 2
          },
          {
            "date": "2020-01-19",
            "count": 3
          },
          {
            "date": "2020-01-20",
            "count": 2
          },
          {
            "date": "2020-01-22",
            "count": 1
          },
          {
            "date": "2020-01-23",
            "count": 1
          },
          {
            "date": "2020-01-24",
            "count": 3
          },
          {
            "date": "2020-01-26",
            "count": 1
          },
          {
            "date": "2020-01-27",
            "count": 2
          },
          {
            "date": "2020-01-28",
            "count": 1
          },
          {
            "date": "2020-01-29",
            "count": 3
          },
          {
            "date": "2020-01-30",
            "count": 1
          },
          {
            "date": "2020-01-31",
            "count": 1
          },
          {
            "date": "2020-02-03",
            "count": 1
          },
          {
            "date": "2020-02-05",
            "count": 2
          },
          {
            "date": "2020-02-07",
            "count": 1
          },
          {
            "date": "2020-02-10",
            "count": 1
          },
          {
            "date": "2020-02-11",
            "count": 2
          },
          {
            "date": "2020-02-12",
            "count": 1
          },
          {
            "date": "2020-02-14",
            "count": 1
          },
          {
            "date": "2020-02-15",
            "count": 1
          },
          {
            "date": "2020-02-18",
            "count": 3
          },
          {
            "date": "2020-02-20",
            "count": 2
          },
          {
            "date": "2020-02-23",
            "count": 1
          },
          {
            "date": "2020-02-25",
            "count": 1
          },
          {
            "date": "2020-02-27",
            "count": 2
          },
          {
            "date": "2020-03-01",
            "count": 1
          },
          {
            "date": "2020-03-06",
            "count": 2
          },
          {
            "date": "2020-03-09",
            "count": 2
          },
          {
            "date": "2020-03-12",
            "count": 1
          },
          {
            "date": "2020-03-13",
            "count": 1
          },
          {
            "date": "2020-03-14",
            "count": 3
          },
          {
            "date": "2020-03-16",
            "count": 1
          },
          {
            "date": "2020-03-17",
            "count": 1
          },
          {
            "date": "2020-03-18",
            "count": 1
          },
          {
            "date": "2020-03-20",
            "count": 1
          },
          {
            "date": "2020-03-23",
            "count": 2
          },
          {
            "date": "2020-03-26",
            "count": 2
          },
          {
            "date": "2020-03-28",
            "count": 1
          },
          {
            "date": "2020-03-29",
            "count": 1
          },
          {
            "date": "2020-04-06",
            "count": 1
          },
          {
            "date": "2020-04-08",
            "count": 1
          },
          {
            "date": "2020-04-09",
            "count": 1
          },
          {
            "date": "2020-04-11",
            "count": 1
          },
          {
            "date": "2020-04-13",
            "count": 1
          },
          {
            "date": "2020-04-14",
            "count": 1
          },
          {
            "date": "2020-04-16",
            "count": 2
          },
          {
            "date": "2020-04-17",
            "count": 2
          },
          {
            "date": "2020-04-22",
            "count": 1
          },
          {
            "date": "2020-04-23",
            "count": 1
          },
          {
            "date": "2020-04-27",
            "count": 1
          },
          {
            "date": "2020-04-29",
            "count": 2
          },
          {
            "date": "2020-04-30",
            "count": 2
          },
          {
            "date": "2020-05-05",
            "count": 1
          },
          {
            "date": "2020-05-09",
            "count": 1
          },
          {
            "date": "2020-05-11",
            "count": 1
          },
          {
            "date": "2020-05-12",
            "count": 1
          },
          {
            "date": "2020-05-13",
            "count": 2
          },
          {
            "date": "2020-05-14",
            "count": 1
          },
          {
            "date": "2020-05-15",
            "count": 1
          },
          {
            "date": "2020-05-18",
            "count": 1
          },
          {
            "date": "2020-05-26",
            "count": 1
          },
          {
            "date": "2020-06-01",
            "count": 1
          },
          {
            "date": "2020-06-09",
            "count": 3
          },
          {
            "date": "2020-06-13",
            "count": 1
          },
          {
            "date": "2020-06-14",
            "count": 1
          },
          {
            "date": "2020-06-15",
            "count": 1
          },
          {
            "date": "2020-06-16",
            "count": 1
          },
          {
            "date": "2020-06-19",
            "count": 1
          },
          {
            "date": "2020-06-23",
            "count": 1
          },
          {
            "date": "2020-06-28",
            "count": 1
          },
          {
            "date": "2020-07-02",
            "count": 1
          },
          {
            "date": "2020-07-06",
            "count": 1
          },
          {
            "date": "2020-07-08",
            "count": 1
          },
          {
            "date": "2020-07-09",
            "count": 1
          },
          {
            "date": "2020-07-10",
            "count": 1
          },
          {
            "date": "2020-07-14",
            "count": 1
          },
          {
            "date": "2020-07-18",
            "count": 2
          },
          {
            "date": "2020-07-24",
            "count": 1
          },
          {
            "date": "2020-07-25",
            "count": 1
          },
          {
            "date": "2020-08-07",
            "count": 1
          },
          {
            "date": "2020-08-09",
            "count": 1
          },
          {
            "date": "2020-08-10",
            "count": 1
          },
          {
            "date": "2020-08-11",
            "count": 1
          },
          {
            "date": "2020-08-13",
            "count": 1
          },
          {
            "date": "2020-08-14",
            "count": 1
          },
          {
            "date": "2020-08-16",
            "count": 2
          },
          {
            "date": "2020-08-17",
            "count": 2
          },
          {
            "date": "2020-08-18",
            "count": 1
          },
          {
            "date": "2020-08-19",
            "count": 1
          },
          {
            "date": "2020-08-20",
            "count": 1
          },
          {
            "date": "2020-08-22",
            "count": 1
          },
          {
            "date": "2020-08-25",
            "count": 1
          },
          {
            "date": "2020-09-01",
            "count": 1
          },
          {
            "date": "2020-09-08",
            "count": 1
          },
          {
            "date": "2020-09-11",
            "count": 1
          },
          {
            "date": "2020-09-15",
            "count": 1
          },
          {
            "date": "2020-09-21",
            "count": 3
          },
          {
            "date": "2020-09-23",
            "count": 1
          },
          {
            "date": "2020-09-25",
            "count": 1
          },
          {
            "date": "2020-09-29",
            "count": 1
          },
          {
            "date": "2020-10-05",
            "count": 1
          },
          {
            "date": "2020-10-09",
            "count": 1
          },
          {
            "date": "2020-10-10",
            "count": 1
          },
          {
            "date": "2020-10-11",
            "count": 1
          },
          {
            "date": "2020-10-14",
            "count": 1
          },
          {
            "date": "2020-10-16",
            "count": 1
          },
          {
            "date": "2020-10-17",
            "count": 1
          },
          {
            "date": "2020-10-18",
            "count": 1
          },
          {
            "date": "2020-10-19",
            "count": 1
          },
          {
            "date": "2020-10-22",
            "count": 3
          },
          {
            "date": "2020-10-27",
            "count": 2
          },
          {
            "date": "2020-11-01",
            "count": 1
          },
          {
            "date": "2020-11-03",
            "count": 2
          },
          {
            "date": "2020-11-09",
            "count": 1
          },
          {
            "date": "2020-11-10",
            "count": 1
          },
          {
            "date": "2020-11-11",
            "count": 1
          },
          {
            "date": "2020-11-12",
            "count": 1
          },
          {
            "date": "2020-11-16",
            "count": 2
          },
          {
            "date": "2020-11-18",
            "count": 1
          },
          {
            "date": "2020-11-23",
            "count": 1
          },
          {
            "date": "2020-11-24",
            "count": 1
          },
          {
            "date": "2020-11-25",
            "count": 1
          },
          {
            "date": "2020-11-26",
            "count": 2
          },
          {
            "date": "2020-11-28",
            "count": 1
          },
          {
            "date": "2020-12-02",
            "count": 1
          },
          {
            "date": "2020-12-07",
            "count": 2
          },
          {
            "date": "2020-12-08",
            "count": 1
          },
          {
            "date": "2020-12-10",
            "count": 1
          },
          {
            "date": "2020-12-14",
            "count": 1
          },
          {
            "date": "2020-12-18",
            "count": 1
          },
          {
            "date": "2020-12-24",
            "count": 2
          },
          {
            "date": "2020-12-25",
            "count": 1
          },
          {
            "date": "2020-12-30",
            "count": 1
          },
          {
            "date": "2021-01-07",
            "count": 1
          },
          {
            "date": "2021-01-14",
            "count": 1
          },
          {
            "date": "2021-01-20",
            "count": 1
          },
          {
            "date": "2021-01-25",
            "count": 1
          },
          {
            "date": "2021-02-01",
            "count": 1
          },
          {
            "date": "2021-02-03",
            "count": 1
          },
          {
            "date": "2021-02-08",
            "count": 1
          },
          {
            "date": "2021-02-13",
            "count": 1
          },
          {
            "date": "2021-02-14",
            "count": 1
          },
          {
            "date": "2021-02-15",
            "count": 1
          },
          {
            "date": "2021-02-24",
            "count": 1
          },
          {
            "date": "2021-02-25",
            "count": 1
          },
          {
            "date": "2021-03-05",
            "count": 1
          },
          {
            "date": "2021-03-07",
            "count": 1
          },
          {
            "date": "2021-03-08",
            "count": 1
          },
          {
            "date": "2021-03-10",
            "count": 1
          },
          {
            "date": "2021-03-18",
            "count": 1
          },
          {
            "date": "2021-03-25",
            "count": 1
          },
          {
            "date": "2021-03-27",
            "count": 1
          },
          {
            "date": "2021-03-28",
            "count": 1
          },
          {
            "date": "2021-03-29",
            "count": 1
          },
          {
            "date": "2021-03-30",
            "count": 1
          },
          {
            "date": "2021-03-31",
            "count": 1
          },
          {
            "date": "2021-04-03",
            "count": 1
          },
          {
            "date": "2021-04-07",
            "count": 1
          },
          {
            "date": "2021-04-08",
            "count": 1
          },
          {
            "date": "2021-04-10",
            "count": 1
          },
          {
            "date": "2021-04-19",
            "count": 2
          },
          {
            "date": "2021-04-22",
            "count": 1
          },
          {
            "date": "2021-05-01",
            "count": 1
          },
          {
            "date": "2021-05-04",
            "count": 1
          },
          {
            "date": "2021-05-06",
            "count": 1
          },
          {
            "date": "2021-05-27",
            "count": 1
          },
          {
            "date": "2021-06-01",
            "count": 3
          },
          {
            "date": "2021-06-02",
            "count": 1
          },
          {
            "date": "2021-06-03",
            "count": 1
          },
          {
            "date": "2021-06-08",
            "count": 1
          },
          {
            "date": "2021-06-17",
            "count": 1
          },
          {
            "date": "2021-06-22",
            "count": 1
          },
          {
            "date": "2021-06-23",
            "count": 2
          },
          {
            "date": "2021-06-26",
            "count": 1
          },
          {
            "date": "2021-06-30",
            "count": 1
          },
          {
            "date": "2021-07-01",
            "count": 1
          },
          {
            "date": "2021-07-09",
            "count": 1
          },
          {
            "date": "2021-07-14",
            "count": 1
          },
          {
            "date": "2021-07-22",
            "count": 1
          },
          {
            "date": "2021-07-25",
            "count": 1
          },
          {
            "date": "2021-07-26",
            "count": 1
          },
          {
            "date": "2021-07-28",
            "count": 1
          },
          {
            "date": "2021-07-30",
            "count": 1
          },
          {
            "date": "2021-08-02",
            "count": 2
          },
          {
            "date": "2021-08-16",
            "count": 2
          },
          {
            "date": "2021-08-21",
            "count": 1
          },
          {
            "date": "2021-08-23",
            "count": 1
          },
          {
            "date": "2021-08-29",
            "count": 2
          },
          {
            "date": "2021-09-16",
            "count": 1
          },
          {
            "date": "2021-09-17",
            "count": 1
          },
          {
            "date": "2021-09-18",
            "count": 1
          },
          {
            "date": "2021-09-28",
            "count": 1
          },
          {
            "date": "2021-10-01",
            "count": 2
          },
          {
            "date": "2021-10-02",
            "count": 1
          },
          {
            "date": "2021-10-06",
            "count": 2
          },
          {
            "date": "2021-10-07",
            "count": 1
          },
          {
            "date": "2021-10-19",
            "count": 1
          },
          {
            "date": "2021-10-23",
            "count": 1
          },
          {
            "date": "2021-10-29",
            "count": 1
          },
          {
            "date": "2021-11-11",
            "count": 1
          },
          {
            "date": "2021-11-15",
            "count": 1
          },
          {
            "date": "2021-11-20",
            "count": 1
          },
          {
            "date": "2021-11-23",
            "count": 1
          },
          {
            "date": "2021-11-24",
            "count": 1
          },
          {
            "date": "2021-11-29",
            "count": 2
          },
          {
            "date": "2021-12-02",
            "count": 1
          },
          {
            "date": "2021-12-07",
            "count": 1
          },
          {
            "date": "2021-12-12",
            "count": 1
          },
          {
            "date": "2021-12-15",
            "count": 1
          },
          {
            "date": "2022-01-08",
            "count": 1
          },
          {
            "date": "2022-01-16",
            "count": 1
          },
          {
            "date": "2022-01-17",
            "count": 1
          },
          {
            "date": "2022-01-19",
            "count": 1
          },
          {
            "date": "2022-02-01",
            "count": 1
          },
          {
            "date": "2022-02-04",
            "count": 1
          },
          {
            "date": "2022-02-05",
            "count": 1
          },
          {
            "date": "2022-02-13",
            "count": 1
          },
          {
            "date": "2022-02-16",
            "count": 1
          },
          {
            "date": "2022-02-17",
            "count": 1
          },
          {
            "date": "2022-02-18",
            "count": 1
          },
          {
            "date": "2022-02-20",
            "count": 1
          },
          {
            "date": "2022-02-24",
            "count": 1
          },
          {
            "date": "2022-03-06",
            "count": 1
          },
          {
            "date": "2022-03-12",
            "count": 1
          },
          {
            "date": "2022-03-17",
            "count": 2
          },
          {
            "date": "2022-03-22",
            "count": 2
          },
          {
            "date": "2022-03-27",
            "count": 1
          },
          {
            "date": "2022-03-28",
            "count": 1
          },
          {
            "date": "2022-03-29",
            "count": 1
          },
          {
            "date": "2022-04-01",
            "count": 1
          },
          {
            "date": "2022-04-07",
            "count": 1
          },
          {
            "date": "2022-04-11",
            "count": 1
          },
          {
            "date": "2022-04-16",
            "count": 1
          },
          {
            "date": "2022-04-20",
            "count": 1
          },
          {
            "date": "2022-05-09",
            "count": 1
          },
          {
            "date": "2022-05-14",
            "count": 1
          },
          {
            "date": "2022-05-19",
            "count": 1
          },
          {
            "date": "2022-05-24",
            "count": 1
          },
          {
            "date": "2022-05-25",
            "count": 1
          },
          {
            "date": "2022-05-27",
            "count": 2
          },
          {
            "date": "2022-05-28",
            "count": 1
          },
          {
            "date": "2022-06-02",
            "count": 1
          },
          {
            "date": "2022-06-07",
            "count": 1
          },
          {
            "date": "2022-06-10",
            "count": 1
          },
          {
            "date": "2022-06-24",
            "count": 1
          },
          {
            "date": "2022-07-06",
            "count": 1
          },
          {
            "date": "2022-07-07",
            "count": 1
          },
          {
            "date": "2022-07-15",
            "count": 1
          },
          {
            "date": "2022-07-17",
            "count": 1
          },
          {
            "date": "2022-07-19",
            "count": 1
          },
          {
            "date": "2022-07-26",
            "count": 1
          },
          {
            "date": "2022-08-15",
            "count": 1
          },
          {
            "date": "2022-08-16",
            "count": 1
          },
          {
            "date": "2022-08-24",
            "count": 1
          },
          {
            "date": "2022-09-02",
            "count": 2
          },
          {
            "date": "2022-09-20",
            "count": 2
          },
          {
            "date": "2022-09-23",
            "count": 1
          },
          {
            "date": "2022-09-26",
            "count": 1
          },
          {
            "date": "2022-10-05",
            "count": 2
          },
          {
            "date": "2022-10-06",
            "count": 1
          },
          {
            "date": "2022-10-11",
            "count": 1
          },
          {
            "date": "2022-10-13",
            "count": 1
          },
          {
            "date": "2022-11-04",
            "count": 1
          },
          {
            "date": "2022-11-08",
            "count": 1
          },
          {
            "date": "2022-11-11",
            "count": 1
          },
          {
            "date": "2022-11-17",
            "count": 5
          },
          {
            "date": "2022-11-18",
            "count": 1
          },
          {
            "date": "2022-11-20",
            "count": 1
          },
          {
            "date": "2022-11-26",
            "count": 1
          },
          {
            "date": "2022-11-30",
            "count": 1
          },
          {
            "date": "2022-12-13",
            "count": 1
          },
          {
            "date": "2022-12-16",
            "count": 2
          },
          {
            "date": "2022-12-21",
            "count": 1
          },
          {
            "date": "2023-01-05",
            "count": 1
          },
          {
            "date": "2023-01-14",
            "count": 1
          },
          {
            "date": "2023-01-27",
            "count": 1
          },
          {
            "date": "2023-02-04",
            "count": 1
          },
          {
            "date": "2023-02-07",
            "count": 1
          },
          {
            "date": "2023-03-16",
            "count": 1
          },
          {
            "date": "2023-03-19",
            "count": 1
          },
          {
            "date": "2023-03-21",
            "count": 1
          },
          {
            "date": "2023-03-28",
            "count": 2
          },
          {
            "date": "2023-03-29",
            "count": 1
          },
          {
            "date": "2023-03-31",
            "count": 1
          },
          {
            "date": "2023-04-04",
            "count": 1
          },
          {
            "date": "2023-04-06",
            "count": 1
          },
          {
            "date": "2023-04-07",
            "count": 1
          },
          {
            "date": "2023-04-19",
            "count": 1
          },
          {
            "date": "2023-04-27",
            "count": 1
          },
          {
            "date": "2023-05-02",
            "count": 2
          },
          {
            "date": "2023-05-04",
            "count": 1
          },
          {
            "date": "2023-05-09",
            "count": 1
          },
          {
            "date": "2023-05-18",
            "count": 1
          },
          {
            "date": "2023-05-30",
            "count": 1
          },
          {
            "date": "2023-06-02",
            "count": 1
          },
          {
            "date": "2023-06-09",
            "count": 1
          },
          {
            "date": "2023-06-13",
            "count": 1
          },
          {
            "date": "2023-06-15",
            "count": 1
          },
          {
            "date": "2023-07-06",
            "count": 1
          },
          {
            "date": "2023-07-07",
            "count": 1
          },
          {
            "date": "2023-07-12",
            "count": 1
          },
          {
            "date": "2023-07-13",
            "count": 1
          },
          {
            "date": "2023-07-14",
            "count": 1
          },
          {
            "date": "2023-07-18",
            "count": 1
          },
          {
            "date": "2023-07-24",
            "count": 1
          },
          {
            "date": "2023-08-01",
            "count": 1
          },
          {
            "date": "2023-08-05",
            "count": 1
          },
          {
            "date": "2023-08-08",
            "count": 1
          },
          {
            "date": "2023-08-10",
            "count": 2
          },
          {
            "date": "2023-08-12",
            "count": 1
          },
          {
            "date": "2023-08-18",
            "count": 1
          },
          {
            "date": "2023-08-21",
            "count": 2
          },
          {
            "date": "2023-08-22",
            "count": 1
          },
          {
            "date": "2023-08-24",
            "count": 2
          },
          {
            "date": "2023-08-29",
            "count": 5
          },
          {
            "date": "2023-08-30",
            "count": 4
          },
          {
            "date": "2023-09-02",
            "count": 1
          },
          {
            "date": "2023-09-06",
            "count": 1
          },
          {
            "date": "2023-09-09",
            "count": 1
          },
          {
            "date": "2023-09-10",
            "count": 3
          },
          {
            "date": "2023-09-13",
            "count": 1
          },
          {
            "date": "2023-09-17",
            "count": 2
          },
          {
            "date": "2023-09-18",
            "count": 2
          },
          {
            "date": "2023-09-19",
            "count": 1
          },
          {
            "date": "2023-09-24",
            "count": 1
          },
          {
            "date": "2023-09-26",
            "count": 2
          },
          {
            "date": "2023-09-27",
            "count": 1
          },
          {
            "date": "2023-09-30",
            "count": 2
          },
          {
            "date": "2023-10-02",
            "count": 1
          },
          {
            "date": "2023-10-08",
            "count": 2
          },
          {
            "date": "2023-10-12",
            "count": 1
          },
          {
            "date": "2023-10-13",
            "count": 1
          },
          {
            "date": "2023-10-16",
            "count": 3
          },
          {
            "date": "2023-10-17",
            "count": 1
          },
          {
            "date": "2023-10-21",
            "count": 2
          },
          {
            "date": "2023-10-23",
            "count": 2
          },
          {
            "date": "2023-10-25",
            "count": 1
          },
          {
            "date": "2023-10-29",
            "count": 1
          },
          {
            "date": "2023-10-30",
            "count": 1
          },
          {
            "date": "2023-11-03",
            "count": 2
          },
          {
            "date": "2023-11-04",
            "count": 1
          },
          {
            "date": "2023-11-07",
            "count": 4
          },
          {
            "date": "2023-11-09",
            "count": 1
          },
          {
            "date": "2023-11-10",
            "count": 1
          },
          {
            "date": "2023-11-17",
            "count": 1
          },
          {
            "date": "2023-11-20",
            "count": 1
          },
          {
            "date": "2023-11-25",
            "count": 2
          },
          {
            "date": "2023-11-27",
            "count": 1
          },
          {
            "date": "2023-11-28",
            "count": 1
          },
          {
            "date": "2023-11-29",
            "count": 3
          },
          {
            "date": "2023-12-01",
            "count": 1
          },
          {
            "date": "2023-12-02",
            "count": 1
          },
          {
            "date": "2023-12-03",
            "count": 1
          },
          {
            "date": "2023-12-07",
            "count": 1
          },
          {
            "date": "2023-12-12",
            "count": 1
          },
          {
            "date": "2023-12-13",
            "count": 1
          },
          {
            "date": "2023-12-24",
            "count": 3
          },
          {
            "date": "2024-01-02",
            "count": 1
          },
          {
            "date": "2024-01-03",
            "count": 1
          },
          {
            "date": "2024-01-04",
            "count": 1
          },
          {
            "date": "2024-01-08",
            "count": 2
          },
          {
            "date": "2024-01-13",
            "count": 1
          },
          {
            "date": "2024-01-15",
            "count": 1
          },
          {
            "date": "2024-01-16",
            "count": 2
          },
          {
            "date": "2024-01-17",
            "count": 1
          },
          {
            "date": "2024-01-20",
            "count": 1
          },
          {
            "date": "2024-01-24",
            "count": 2
          },
          {
            "date": "2024-01-25",
            "count": 1
          },
          {
            "date": "2024-01-26",
            "count": 1
          },
          {
            "date": "2024-01-29",
            "count": 1
          },
          {
            "date": "2024-01-30",
            "count": 1
          },
          {
            "date": "2024-02-10",
            "count": 1
          },
          {
            "date": "2024-02-12",
            "count": 1
          },
          {
            "date": "2024-02-16",
            "count": 1
          },
          {
            "date": "2024-02-17",
            "count": 1
          },
          {
            "date": "2024-02-18",
            "count": 1
          },
          {
            "date": "2024-02-19",
            "count": 1
          },
          {
            "date": "2024-02-21",
            "count": 1
          },
          {
            "date": "2024-02-23",
            "count": 2
          },
          {
            "date": "2024-02-24",
            "count": 1
          },
          {
            "date": "2024-02-25",
            "count": 1
          },
          {
            "date": "2024-02-27",
            "count": 1
          },
          {
            "date": "2024-03-03",
            "count": 1
          },
          {
            "date": "2024-03-04",
            "count": 1
          },
          {
            "date": "2024-03-07",
            "count": 2
          },
          {
            "date": "2024-03-09",
            "count": 2
          },
          {
            "date": "2024-03-12",
            "count": 1
          },
          {
            "date": "2024-03-23",
            "count": 2
          },
          {
            "date": "2024-03-25",
            "count": 1
          },
          {
            "date": "2024-03-26",
            "count": 1
          },
          {
            "date": "2024-04-01",
            "count": 1
          },
          {
            "date": "2024-04-04",
            "count": 1
          },
          {
            "date": "2024-04-05",
            "count": 1
          },
          {
            "date": "2024-04-15",
            "count": 1
          },
          {
            "date": "2024-04-23",
            "count": 1
          },
          {
            "date": "2024-04-25",
            "count": 1
          },
          {
            "date": "2024-05-06",
            "count": 1
          },
          {
            "date": "2024-05-08",
            "count": 1
          },
          {
            "date": "2024-05-09",
            "count": 1
          },
          {
            "date": "2024-05-11",
            "count": 1
          },
          {
            "date": "2024-05-16",
            "count": 1
          },
          {
            "date": "2024-05-25",
            "count": 1
          },
          {
            "date": "2024-05-26",
            "count": 1
          },
          {
            "date": "2024-05-27",
            "count": 2
          },
          {
            "date": "2024-06-01",
            "count": 1
          },
          {
            "date": "2024-06-02",
            "count": 1
          },
          {
            "date": "2024-06-03",
            "count": 1
          },
          {
            "date": "2024-06-07",
            "count": 1
          },
          {
            "date": "2024-06-12",
            "count": 1
          },
          {
            "date": "2024-06-22",
            "count": 1
          },
          {
            "date": "2024-06-27",
            "count": 1
          },
          {
            "date": "2024-07-01",
            "count": 1
          },
          {
            "date": "2024-07-07",
            "count": 1
          },
          {
            "date": "2024-07-20",
            "count": 1
          },
          {
            "date": "2024-07-22",
            "count": 1
          },
          {
            "date": "2024-07-24",
            "count": 1
          },
          {
            "date": "2024-07-25",
            "count": 1
          },
          {
            "date": "2024-07-27",
            "count": 1
          },
          {
            "date": "2024-08-21",
            "count": 1
          },
          {
            "date": "2024-08-27",
            "count": 2
          },
          {
            "date": "2024-08-29",
            "count": 1
          },
          {
            "date": "2024-09-02",
            "count": 2
          },
          {
            "date": "2024-09-11",
            "count": 1
          },
          {
            "date": "2024-09-15",
            "count": 1
          },
          {
            "date": "2024-09-17",
            "count": 1
          },
          {
            "date": "2024-09-23",
            "count": 1
          },
          {
            "date": "2024-10-07",
            "count": 1
          },
          {
            "date": "2024-10-11",
            "count": 2
          },
          {
            "date": "2024-10-23",
            "count": 1
          },
          {
            "date": "2024-11-09",
            "count": 1
          },
          {
            "date": "2024-11-16",
            "count": 1
          },
          {
            "date": "2024-11-19",
            "count": 1
          },
          {
            "date": "2024-11-22",
            "count": 1
          },
          {
            "date": "2024-12-04",
            "count": 1
          },
          {
            "date": "2024-12-06",
            "count": 1
          },
          {
            "date": "2024-12-07",
            "count": 1
          },
          {
            "date": "2024-12-19",
            "count": 1
          },
          {
            "date": "2024-12-21",
            "count": 1
          },
          {
            "date": "2025-01-04",
            "count": 1
          },
          {
            "date": "2025-01-09",
            "count": 1
          },
          {
            "date": "2025-01-27",
            "count": 1
          },
          {
            "date": "2025-01-28",
            "count": 1
          },
          {
            "date": "2025-02-01",
            "count": 1
          },
          {
            "date": "2025-02-20",
            "count": 1
          },
          {
            "date": "2025-03-16",
            "count": 1
          },
          {
            "date": "2025-03-19",
            "count": 1
          },
          {
            "date": "2025-03-20",
            "count": 1
          },
          {
            "date": "2025-04-11",
            "count": 1
          },
          {
            "date": "2025-05-01",
            "count": 1
          },
          {
            "date": "2025-05-08",
            "count": 1
          },
          {
            "date": "2025-05-17",
            "count": 1
          },
          {
            "date": "2025-05-27",
            "count": 1
          },
          {
            "date": "2025-05-30",
            "count": 1
          },
          {
            "date": "2025-06-01",
            "count": 1
          },
          {
            "date": "2025-06-02",
            "count": 1
          },
          {
            "date": "2025-06-08",
            "count": 1
          },
          {
            "date": "2025-06-11",
            "count": 1
          },
          {
            "date": "2025-06-17",
            "count": 1
          },
          {
            "date": "2025-06-26",
            "count": 1
          },
          {
            "date": "2025-07-08",
            "count": 1
          },
          {
            "date": "2025-07-15",
            "count": 1
          },
          {
            "date": "2025-07-17",
            "count": 2
          },
          {
            "date": "2025-08-04",
            "count": 1
          },
          {
            "date": "2025-08-08",
            "count": 1
          },
          {
            "date": "2025-08-19",
            "count": 1
          },
          {
            "date": "2025-09-07",
            "count": 1
          },
          {
            "date": "2025-09-22",
            "count": 1
          },
          {
            "date": "2025-10-11",
            "count": 1
          },
          {
            "date": "2025-10-14",
            "count": 1
          },
          {
            "date": "2025-10-30",
            "count": 2
          },
          {
            "date": "2025-11-01",
            "count": 1
          },
          {
            "date": "2025-11-28",
            "count": 1
          },
          {
            "date": "2025-12-26",
            "count": 1
          },
          {
            "date": "2026-01-18",
            "count": 1
          },
          {
            "date": "2026-01-23",
            "count": 1
          },
          {
            "date": "2026-02-02",
            "count": 1
          },
          {
            "date": "2026-02-07",
            "count": 1
          },
          {
            "date": "2026-02-08",
            "count": 1
          },
          {
            "date": "2026-02-23",
            "count": 1
          },
          {
            "date": "2026-03-12",
            "count": 1
          },
          {
            "date": "2026-03-22",
            "count": 1
          },
          {
            "date": "2026-04-01",
            "count": 1
          },
          {
            "date": "2026-04-02",
            "count": 2
          },
          {
            "date": "2026-04-07",
            "count": 1
          },
          {
            "date": "2026-04-22",
            "count": 1
          },
          {
            "date": "2026-04-26",
            "count": 1
          },
          {
            "date": "2026-05-03",
            "count": 1
          },
          {
            "date": "2026-05-06",
            "count": 1
          },
          {
            "date": "2026-05-08",
            "count": 1
          },
          {
            "date": "2026-05-11",
            "count": 1
          },
          {
            "date": "2026-05-16",
            "count": 1
          },
          {
            "date": "2026-05-17",
            "count": 1
          },
          {
            "date": "2026-05-25",
            "count": 1
          },
          {
            "date": "2026-05-26",
            "count": 1
          },
          {
            "date": "2026-05-27",
            "count": 1
          },
          {
            "date": "2026-06-14",
            "count": 1
          },
          {
            "date": "2026-06-24",
            "count": 1
          },
          {
            "date": "2026-06-29",
            "count": 1
          },
          {
            "date": "2026-07-09",
            "count": 1
          },
          {
            "date": "2026-07-19",
            "count": 2
          },
          {
            "date": "2026-07-21",
            "count": 1
          }
        ],
        "complete": false,
        "collected": 1000,
        "total_forks": 1218
      },
      "star_history": null,
      "open_issues_and_prs": 2
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples",
        "notebooks"
      ],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": true,
      "typecheck_configs": [
        "ludwig/py.typed"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 107706,
      "source_files_sampled": 805,
      "oversized_source_files": 7,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "pyproject.toml"
      ],
      "advisories": {
        "error": "No resolved dependencies carried a version and a supported ecosystem",
        "scope": "repository_graph",
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 32,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "pypi"
      ],
      "dependencies": [
        {
          "name": "numpy",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.24"
        },
        {
          "name": "pandas",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2.0"
        },
        {
          "name": "scipy",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.10"
        },
        {
          "name": "tabulate",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.9"
        },
        {
          "name": "scikit-learn",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.3"
        },
        {
          "name": "tqdm",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=4.60"
        },
        {
          "name": "torch",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2.11"
        },
        {
          "name": "torchaudio",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2.11"
        },
        {
          "name": "torchcodec",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.1"
        },
        {
          "name": "torchvision",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.26"
        },
        {
          "name": "transformers",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=5.0"
        },
        {
          "name": "sentencepiece",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.2"
        },
        {
          "name": "spacy",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2.3"
        },
        {
          "name": "PyYAML",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=6.0"
        },
        {
          "name": "absl-py",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "kaggle",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "requests",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2.28"
        },
        {
          "name": "py-cpuinfo",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "fsspec",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "dataclasses-json",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "jsonschema",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=4.17"
        },
        {
          "name": "tensorboard",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "torchmetrics",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.0"
        },
        {
          "name": "torchinfo",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "filelock",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "psutil",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "protobuf",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=4.0"
        },
        {
          "name": "gpustat",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "rich",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=12.4.4"
        },
        {
          "name": "packaging",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "retry",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "sacremoses",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "bitsandbytes",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.44.0"
        },
        {
          "name": "xlwt",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "xlrd",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "openpyxl",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "pyarrow",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=14.0"
        },
        {
          "name": "lxml",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "datasets",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "safetensors",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.4"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "bitsandbytes",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "jsonschema",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "numpy",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pandas",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "protobuf",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pyarrow",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pyyaml",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "requests",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "rich",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "safetensors",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "scikit-learn",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "scipy",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "sentencepiece",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "spacy",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "tabulate",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "torch",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "torchaudio",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "torchcodec",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "torchmetrics",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "torchvision",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "tqdm",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "transformers",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "configspace",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "dask",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "future",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "matplotlib",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "peft",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "predibase",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "ray",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "ruff",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "s3fs",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "torchao",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 32,
        "direct_count": 22,
        "indirect_count": 10
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 1,
        "merged_prs": 2588,
        "open_issues": 1,
        "closed_ratio": 0.999,
        "closed_issues": 1094,
        "closed_unmerged_prs": 411
      },
      "bus_factor": 3,
      "bot_contributors": 2,
      "top_contributors": [
        {
          "type": "User",
          "login": "w4nderlust",
          "commits": 744,
          "avatar_url": "https://avatars.githubusercontent.com/u/349256?v=4"
        },
        {
          "type": "User",
          "login": "jimthompson5802",
          "commits": 556,
          "avatar_url": "https://avatars.githubusercontent.com/u/1425269?v=4"
        },
        {
          "type": "User",
          "login": "tgaddair",
          "commits": 468,
          "avatar_url": "https://avatars.githubusercontent.com/u/1742912?v=4"
        },
        {
          "type": "User",
          "login": "arnavgarg1",
          "commits": 240,
          "avatar_url": "https://avatars.githubusercontent.com/u/106701836?v=4"
        },
        {
          "type": "User",
          "login": "justinxzhao",
          "commits": 210,
          "avatar_url": "https://avatars.githubusercontent.com/u/3459541?v=4"
        },
        {
          "type": "User",
          "login": "geoffreyangus",
          "commits": 120,
          "avatar_url": "https://avatars.githubusercontent.com/u/29719151?v=4"
        },
        {
          "type": "User",
          "login": "connor-mccorm",
          "commits": 83,
          "avatar_url": "https://avatars.githubusercontent.com/u/97468934?v=4"
        },
        {
          "type": "User",
          "login": "dantreiman",
          "commits": 83,
          "avatar_url": "https://avatars.githubusercontent.com/u/687280?v=4"
        },
        {
          "type": "User",
          "login": "msaisumanth",
          "commits": 74,
          "avatar_url": "https://avatars.githubusercontent.com/u/17418219?v=4"
        },
        {
          "type": "User",
          "login": "ksbrar",
          "commits": 73,
          "avatar_url": "https://avatars.githubusercontent.com/u/4261338?v=4"
        }
      ],
      "contributors_sampled": 98,
      "top_contributor_share": 0.219
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "docker.yml",
        "pytest.yml",
        "pytest_slow.yml",
        "schema.yml",
        "test-results.yml",
        "upload-pypi.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        ".flake8"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": true
    },
    "security_signals": {
      "lockfiles": [],
      "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": null,
            "reason": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "2 out of 2 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": 0,
            "reason": "Found 0/28 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 17 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": 10,
            "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 9 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": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "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": 10,
            "reason": "security policy file 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": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 10,
            "reason": "0 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "de1d65bbf3530fbd33c99abb21d1a1b9c3a64bad",
        "ran_at": "2026-07-27T00:42:45Z",
        "aggregate_score": 6.4,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": true,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-27T00:40:27Z",
      "oldest_open_prs": [
        {
          "number": 4193,
          "created_at": "2026-06-01T21:50:39Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-05-26T04:13:57Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 4197,
          "created_at": "2026-07-26T19:23:22Z",
          "last_comment_at": "2026-07-27T00:21:56Z",
          "last_comment_author": "w4nderlust"
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/ludwig-ai/ludwig",
    "host": "github.com",
    "name": "ludwig",
    "owner": "ludwig-ai"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "exceptional",
      "name": "Overall health",
      "note": "The weighted overall 81 is calibrated to 94 on the published index scale (record calibration 2026-08-02).",
      "notes": [
        {
          "code": "overall_calibration",
          "params": {
            "raw": 81,
            "calibrated": 94,
            "calibration": "2026-08-02"
          }
        }
      ],
      "value": 94,
      "inputs": {
        "security": 64,
        "vitality": 83,
        "community": 86,
        "governance": 79,
        "calibration": "2026-08-02",
        "engineering": 96,
        "ai_readiness": 52,
        "weighted_overall_raw": 81
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 83,
        "weight": 0.21,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 72,
            "inputs": {
              "commits_last_year": 267,
              "human_commit_share": 0.98,
              "days_since_last_push": 0,
              "active_weeks_last_year": 12
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "12/52 weeks with commits",
                "points": 8.3,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 12
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "267 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 267
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 9 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "exceptional",
            "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": 73,
              "latest_release_tag": "v0.17.8",
              "releases_from_tags": false,
              "days_since_latest_release": 0,
              "mean_days_between_releases": 9
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "73 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 73
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~9 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 9
                    }
                  }
                ],
                "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": "exceptional",
            "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": 8,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 8 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 8
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "excellent",
        "name": "Community & Adoption",
        "value": 86,
        "weight": 0.17,
        "metrics": [
          {
            "key": "popularity",
            "band": "exceptional",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 98,
            "inputs": {
              "forks": 1218,
              "stars": 11746,
              "watchers": 183,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "11,746 stars",
                "points": 60,
                "status": "met",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 11746
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "1,218 forks",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 1218
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "183 watchers",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 183
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "excellent",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 92,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "readme_badges": null,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": true,
              "readme_badge_services": [],
              "has_pull_request_template": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (Apache-2.0)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "Apache-2.0"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 13.5,
                "status": "met",
                "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": 6.3,
                "status": "met",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "moderate",
            "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": 59,
            "inputs": {
              "packages": [
                "ludwig"
              ],
              "dependents": null,
              "ecosystems": "pypi",
              "total_downloads": null,
              "monthly_downloads": 3413
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "3,413 downloads/month across pypi",
                "points": 47.1,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 3413,
                      "ecosystems": "pypi"
                    }
                  }
                ],
                "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": "good",
        "name": "Sustainability & Governance",
        "value": 79,
        "weight": 0.23,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "good",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 77,
            "inputs": {
              "bus_factor": 3,
              "contributors_sampled": 98,
              "top_contributor_share": 0.219
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "3 contributor(s) cover half of all commits",
                "points": 36,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 22% of commits",
                "points": 17.6,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 22
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "98 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 98
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 17 contributing companies or organizations",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Newcomer PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "newcomer_pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 78,
            "inputs": {
              "merged_prs": 2588,
              "open_issues": 1,
              "closed_issues": 1094,
              "prs_merged_7d": null,
              "prs_decided_7d": null,
              "prs_merged_30d": null,
              "prs_decided_30d": null,
              "issue_closed_ratio": 0.999,
              "closed_unmerged_prs": 411,
              "first_time_authors_30d": null,
              "first_time_prs_merged_30d": null,
              "first_time_prs_decided_30d": null
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "100% of issues closed",
                "points": 42,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 42
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "2588/2999 decided PRs merged",
                "points": 25.9,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 2588,
                      "decided": 2999
                    }
                  }
                ],
                "max_points": 30
              },
              {
                "key": "newcomer_pr_acceptance",
                "name": "Newcomer PR acceptance",
                "detail": "no first-time contributor's PR decided in 30d",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_newcomer_prs",
                    "params": {
                      "days": 30
                    }
                  }
                ],
                "max_points": 13
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/28 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 64,
            "inputs": {
              "followers": 176,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "ludwig-ai",
              "public_repos": 6,
              "account_age_days": 2261
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "organization-owned",
                "points": 30,
                "status": "met",
                "details": [
                  {
                    "code": "owner_organization",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "176 followers of ludwig-ai",
                "points": 16.2,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 176,
                      "login": "ludwig-ai"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "6 public repos, account ~6 yr old",
                "points": 18.2,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 6
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 6
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "exceptional",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "ludwig"
              ],
              "ecosystems": "pypi",
              "any_deprecated": false,
              "min_days_since_publish": 0
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on pypi",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "pypi"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 0 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "77 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 77
                    }
                  }
                ],
                "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": "exceptional",
        "name": "Engineering Quality",
        "value": 96,
        "weight": 0.19,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "exceptional",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 94,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": true
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "6 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 6
                    }
                  }
                ],
                "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": ".flake8",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".flake8"
                    }
                  }
                ],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 9.6,
                "status": "met",
                "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": "2 out of 2 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "exceptional",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "topics": [
                "deep-learning",
                "deeplearning",
                "deep",
                "learning",
                "machine-learning",
                "machinelearning",
                "natural-language-processing",
                "natural-language",
                "computer-vision",
                "data-centric",
                "data-science",
                "pytorch",
                "neural-network",
                "ml",
                "llm",
                "llm-training",
                "fine-tuning",
                "llama",
                "mistral",
                "llama2"
              ],
              "has_wiki": true,
              "homepage": "http://ludwig.ai",
              "has_readme": true,
              "has_docs_dir": true,
              "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": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "http://ludwig.ai",
                "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": "20 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 20
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "moderate",
        "name": "Security",
        "value": 64,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "moderate",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Branch-Protection, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "branch_protection",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 64,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 6.4
            },
            "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": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "2 out of 2 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 0/28 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 17 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.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 9 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 detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "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 detected",
                "points": 5,
                "status": "met",
                "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": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "0 existing vulnerabilities detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "exceptional",
            "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"
              ],
              "commit_weight_rule": {
                "min_commits": 50,
                "min_commit_share": 0.1
              },
              "review_only_matches": 0,
              "below_threshold_exposures": [],
              "assessed_self_published_locations": 8
            },
            "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": "moderate",
        "name": "AI Readiness",
        "value": 52,
        "weight": 0.04,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "weak",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.918,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "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": "90 of 98 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 90,
                      "sampled": 98
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 54,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": true,
              "typed_language": false,
              "bootstrap_files": [],
              "has_devcontainer": true,
              "has_linter_config": true,
              "typecheck_configs": [
                "ludwig/py.typed"
              ],
              "agent_commit_share": 0,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "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": ".flake8",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".flake8"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "ludwig/py.typed",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "ludwig/py.typed"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "devcontainer, Dockerfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "devcontainer, Dockerfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "no agent-authored commits among the last 100",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 82,
            "inputs": {
              "primary_language": "Python",
              "largest_source_bytes": 107706,
              "source_files_sampled": 805,
              "oversized_source_files": 7
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Python with type-check config (ludwig/py.typed)",
                "points": 27,
                "status": "partial",
                "details": [
                  {
                    "code": "typecheck_config_language",
                    "params": {
                      "files": "ludwig/py.typed",
                      "language": "Python"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "7/805 source files over 60KB",
                "points": 54.5,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 805,
                      "oversized": 7
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "weak",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "examples",
                "notebooks"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples, notebooks",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples, notebooks"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? Carries a deliberately small weight: agent tooling is a real maintenance signal, but its absence must never gate the top of the scale (calibration saturates at raw 91, so 100/100 remains reachable with AI Readiness at zero)."
      }
    ],
    "classification": {
      "top": [
        "library"
      ],
      "labels": [
        "library"
      ],
      "scores": {
        "library": 8
      },
      "primary": "library",
      "evidence": [
        {
          "tier": "distribution",
          "label": "library",
          "source": "registry:pypi",
          "weight": 6
        },
        {
          "tier": "description",
          "label": "library",
          "source": "description:library",
          "weight": 2
        }
      ],
      "artifacts": [],
      "confidence": "medium",
      "host_extension": false,
      "runs_as_process": false,
      "consumed_by_code": true
    },
    "metrics_version": "2.5.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "deps.dev does not index pypi:ludwig@0.17.8; advisories assessed against the repository dependency graph instead",
    "No resolved dependencies carried a version and a supported ecosystem"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-27T00:43:05.617223Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/l/ludwig-ai/ludwig.svg",
  "full_name": "ludwig-ai/ludwig",
  "license_state": "standard",
  "license_spdx": "Apache-2.0"
}

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

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

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