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