{
  "schemaVersion": 3,
  "dataset": {
    "version": 3,
    "date": "2026-08-13",
    "group": {
      "id": "ai-infrastructure",
      "name": "AI Infrastructure"
    },
    "repository": {
      "id": "bentoml",
      "repo": "bentoml/BentoML",
      "name": "BentoML",
      "keywords": [
        "BentoML"
      ]
    },
    "context": {
      "repository": "bentoml/BentoML",
      "url": "https://github.com/bentoml/BentoML",
      "description": "The easiest way to serve AI apps and models - Build Model Inference APIs, Job queues, LLM apps, Multi-model pipelines, and more!",
      "homepage": "https://bentoml.com",
      "language": "Python",
      "topics": [
        "ai-inference",
        "deep-learning",
        "generative-ai",
        "inference-platform",
        "llm",
        "llm-inference",
        "llm-serving",
        "llmops",
        "machine-learning",
        "ml-engineering",
        "mlops",
        "model-inference-service",
        "model-serving",
        "multimodal",
        "python"
      ],
      "license": "Apache-2.0",
      "defaultBranch": "main",
      "stars": 8786,
      "forks": 1009,
      "openIssues": 202,
      "archived": false,
      "collectedAt": "2026-08-13T18:02:07.786235+00:00"
    },
    "news": {
      "repository": "bentoml/BentoML",
      "collectedAt": "2026-08-13T18:02:07.786235+00:00",
      "latestRelease": {
        "repository": "bentoml/BentoML",
        "tag": "v1.4.39",
        "title": "v1.4.39",
        "url": "https://github.com/bentoml/BentoML/releases/tag/v1.4.39",
        "publishedAt": "2026-05-07T10:37:29Z",
        "notes": "## What's Changed\r\n* ci: pre-commit autoupdate [skip ci] by @pre-commit-ci[bot] in https://github.com/bentoml/BentoML/pull/5593\r\n* fix: prevent following symlinks when copying files in BentoStore by @frostming in https://github.com/bentoml/BentoML/pull/5598\r\n* fix: add sharing=locked to BuildKit cache mounts for multi-arch builds by @lawrence3699 in https://github.com/bentoml/BentoML/pull/5597\r\n* fix: enhance Dockerfile generation by normalizing base image lines and adding tests by @frostming in https://github.com/bentoml/BentoML/pull/5603\r\n* fix: defer prometheus_client import in bentoml.metrics to fix histogram collection in multiprocess mode by @ramkrishs in https://github.com/bentoml/BentoML/pull/5602\r\n* ci: pre-commit autoupdate [skip ci] by @pre-commit-ci[bot] in https://github.com/bentoml/BentoML/pull/5605\r\n* fix: handle string input in FileSchema by encoding to UTF-8 by @frostming in https://github.com/bentoml/BentoML/pull/5606\r\n\r\n## New Contributors\r\n* @lawrence3699 made their first contribution in https://github.com/bentoml/BentoML/pull/5597\r\n* @ramkrishs made their first contribution in https://github.com/bentoml/BentoML/pull/5602\r\n\r\n**Full Changelog**: https://github.com/bentoml/BentoML/compare/v1.4.38...v1.4.39",
        "highlights": [
          "What's Changed",
          "ci: pre-commit autoupdate [skip ci] by @pre-commit-ci[bot] in https://github.com/bentoml/BentoML/pull/5593",
          "fix: prevent following symlinks when copying files in BentoStore by @frostming in https://github.com/bentoml/BentoML/pull/5598",
          "fix: add sharing=locked to BuildKit cache mounts for multi-arch builds by @lawrence3699 in https://github.com/bentoml/BentoML/pull/5597",
          "fix: enhance Dockerfile generation by normalizing base image lines and adding tests by @frostming in https://github.com/bentoml/BentoML/pull/5603",
          "fix: defer prometheusclient import in bentoml.metrics to fix histogram collection in multiprocess mode by @ramkrishs in https://github.com/bentoml/BentoML/pull/5602"
        ],
        "prerelease": false
      },
      "upcoming": [],
      "communityDiscussions": []
    },
    "runs": [
      {
        "collectedAt": "2026-08-13T12:26:38.318Z",
        "since": "2026-08-12T12:26:38.318Z",
        "observedCount": 4,
        "changedCount": 4
      },
      {
        "collectedAt": "2026-08-13T13:48:00.446149Z",
        "since": "2026-08-12T13:48:00.446149Z",
        "observedCount": 3,
        "changedCount": 3
      },
      {
        "collectedAt": "2026-08-13T16:19:22.035158Z",
        "since": "2026-08-12T16:19:22.035158Z",
        "observedCount": 3,
        "changedCount": 0
      },
      {
        "collectedAt": "2026-08-13T17:43:20.785491Z",
        "since": "2026-08-12T17:43:20.785491Z",
        "observedCount": 3,
        "changedCount": 0
      },
      {
        "collectedAt": "2026-08-13T17:47:07.884300Z",
        "since": "2026-08-12T17:47:07.884300Z",
        "observedCount": 3,
        "changedCount": 0
      },
      {
        "collectedAt": "2026-08-13T18:01:55.420671Z",
        "since": "2026-08-12T18:01:55.420671Z",
        "observedCount": 3,
        "changedCount": 0
      }
    ],
    "signals": [
      {
        "id": "github:bentoml/BentoML:pull_request:5643",
        "source": "github",
        "group": "ai-infrastructure",
        "project": "bentoml/BentoML",
        "kind": "pull_request",
        "title": "fix(sdk): check generic args length on bare iterator return annotations to avoid IndexError",
        "text": "IODescriptor.from_output() currently crashes with an IndexError when a service method's return annotation is an unparameterized iterator type (e.g. t.Iterator, t.Generator, etc.) because it unconditionally indexes get_args(return_annotation)[0]. This PR fixes it by checking if generic arguments exist first, and defaulting the annotation to t.Any if get_args() returns an empty tuple. I have added regression unit tests to verify the fix works correctly for bare iterators and generators. Closes #5625",
        "url": "https://github.com/bentoml/BentoML/pull/5643",
        "createdAt": "2026-06-28T09:10:19Z",
        "updatedAt": "2026-08-12T21:55:37Z",
        "timestamp": "2026-08-12T21:55:37Z",
        "metrics": {
          "reactions": 0,
          "comments": 3
        },
        "labels": [],
        "author": "Hasnaathussain",
        "state": "open",
        "assignees": []
      },
      {
        "id": "github:bentoml/BentoML:pull_request:5671",
        "source": "github",
        "group": "ai-infrastructure",
        "project": "bentoml/BentoML",
        "kind": "pull_request",
        "title": "fix(server): retain CapacityLimiter slot until worker thread completes (#5642)",
        "text": "## What does this PR address? Fixes #5642 ### Problem & Root Cause When synchronous (`def`) `@bentoml.api` endpoints are executed via `ServiceAppFactory._to_thread`, cancellation can release the `CapacityLimiter` slot before the background worker has finished (or, in a narrow pre-start window, before AnyIO has queued the worker). A freed slot admits another request while the timed-out work is still running, violating the configured concurrency limit. ### Solution - Acquire the `CapacityLimiter` slot on behalf of a unique borrower token. - Submit the worker from a child task shielded from request cancellation, so the borrower cannot be released before AnyIO queues the worker. - Release the borrower from the worker wrapper's `finally:` block, after the sync function completes; release immediately if task creation itself fails. - Continue using `abandon_on_cancel=True` so request cancellation does not wait for the sync worker. ### Verification Added focused unit coverage in `tests/unit/_bentoml_impl/test_server_app.py` for normal execution, cancellation after worker start, and cancellation while the AnyIO default thread limiter is saturated before the worker starts. Local verification: Ruff and formatting pass; 3 focused tests pass. ## Before submitting: - [x] Does the Pull Request follow [Conventional Commits specification](https://www.conventionalcommits.org/en/v1.0.0/#summary) naming? - [x] Does the code follow BentoML's code style, `pre-commit run -a` script has passed? - [ ] Did your changes require updates to the documentation? Have you updated those accordingly? - [x] Did you write tests to cover your changes?",
        "url": "https://github.com/bentoml/BentoML/pull/5671",
        "createdAt": "2026-07-23T18:36:22Z",
        "updatedAt": "2026-08-12T20:30:15Z",
        "timestamp": "2026-08-12T20:30:15Z",
        "metrics": {
          "reactions": 0,
          "comments": 4
        },
        "labels": [],
        "author": "Hasnaathussain",
        "state": "open",
        "assignees": []
      },
      {
        "id": "github:bentoml/BentoML:pull_request:5673",
        "source": "github",
        "group": "ai-infrastructure",
        "project": "bentoml/BentoML",
        "kind": "pull_request",
        "title": "fix(build): resolve dockerfile_template against build ctx, not cwd",
        "text": "## Describe the bug `bentoml containerize` (and `build`) fails when `bentofile.yaml` specifies a `dockerfile_template` and the command is run from a directory other than the project root: ``` ValueError: Accessing file outside of current working directory is not allowed ``` Fixes #5566. ## Root cause `resolve_user_filepath` joins relative paths against `ctx` (the Bento build context) but enforces the `secure=True` containment check against a **hard-coded cwd** (`Path().resolve()`). The two bases disagree: a `dockerfile_template` that is legitimately relative to `build_ctx` is rejected whenever `build_ctx` differs from the current working directory. This is a regression from #5548, which added `secure=True` as the default. ## Fix - Use a single `base_dir` (`ctx` when provided, else `cwd`) for **both** the relative-path join and the containment check, so they can no longer disagree. - Inspect only the path *relative to* `base_dir` for hidden (`.`-prefixed) segments, so a `base_dir` that itself lives under a dotted path (a temp dir, `~/.cache`, etc.) no longer trips a false positive. - All other secure guarantees are preserved: absolute paths, escaping the base dir, hidden files, and `/etc`|`/proc` are still rejected. ## Testing Added `tests/unit/_internal/utils/test_filesystem.py` covering: - template legitimately relative to ctx outside cwd now resolves (the bug) - escaping ctx is still blocked - hidden files still blocked - dotted base_dir no longer false-positives - absolute path still blocked under secure - `secure=False` still permits outside access ``` 6 passed in 0.04s ```",
        "url": "https://github.com/bentoml/BentoML/pull/5673",
        "timestamp": "2026-08-12T12:55:15Z",
        "metrics": {
          "reactions": 0,
          "comments": 0
        },
        "labels": [],
        "author": "Solaris-star",
        "assignees": [],
        "change": "new"
      },
      {
        "id": "github:bentoml/BentoML:pull_request:5681",
        "source": "github",
        "group": "ai-infrastructure",
        "project": "bentoml/BentoML",
        "kind": "pull_request",
        "title": "docs: note OpenAI client base_url for multi-model gateways",
        "text": "## Summary The BentoML vLLM example already shows the OpenAI-compatible client pattern. This PR adds a short note that the same `OpenAI(base_url=...)` client pattern also works with OpenAI-compatible multi-model gateways when you are not self-hosting or using BentoCloud, using [DaoXE](https://daoxe.com) (`https://api.daoxe.com/v1`) as one concrete example. Docs only — no runtime behavior changes. ## Test plan - [ ] Docs still build - [ ] Existing OpenAI client example unchanged - [ ] Note is clearly optional / vendor-neutral Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
        "url": "https://github.com/bentoml/BentoML/pull/5681",
        "createdAt": "2026-08-03T01:48:25Z",
        "updatedAt": "2026-08-12T18:38:12Z",
        "timestamp": "2026-08-12T18:38:12Z",
        "metrics": {
          "reactions": 0,
          "comments": 1
        },
        "labels": [],
        "author": "seven7763",
        "state": "closed",
        "assignees": []
      }
    ],
    "events": [
      {
        "id": "event:4674c73c4f6c08cfb16a",
        "signalId": "github:bentoml/BentoML:pull_request:5643",
        "event": "changed",
        "observedAt": "2026-08-13T13:48:00.446149Z",
        "changedFields": [],
        "signal": {
          "id": "github:bentoml/BentoML:pull_request:5643",
          "source": "github",
          "group": "ai-infrastructure",
          "project": "bentoml/BentoML",
          "kind": "pull_request",
          "title": "fix(sdk): check generic args length on bare iterator return annotations to avoid IndexError",
          "text": "IODescriptor.from_output() currently crashes with an IndexError when a service method's return annotation is an unparameterized iterator type (e.g. t.Iterator, t.Generator, etc.) because it unconditionally indexes get_args(return_annotation)[0]. This PR fixes it by checking if generic arguments exist first, and defaulting the annotation to t.Any if get_args() returns an empty tuple. I have added regression unit tests to verify the fix works correctly for bare iterators and generators. Closes #5625",
          "url": "https://github.com/bentoml/BentoML/pull/5643",
          "createdAt": "2026-06-28T09:10:19Z",
          "updatedAt": "2026-08-12T21:55:37Z",
          "timestamp": "2026-08-12T21:55:37Z",
          "metrics": {
            "reactions": 0,
            "comments": 3
          },
          "labels": [],
          "author": "Hasnaathussain",
          "state": "open",
          "assignees": [],
          "change": "updated"
        }
      },
      {
        "id": "event:9e8023d1cdb0def90869",
        "signalId": "github:bentoml/BentoML:pull_request:5671",
        "event": "changed",
        "observedAt": "2026-08-13T13:48:00.446149Z",
        "changedFields": [],
        "signal": {
          "id": "github:bentoml/BentoML:pull_request:5671",
          "source": "github",
          "group": "ai-infrastructure",
          "project": "bentoml/BentoML",
          "kind": "pull_request",
          "title": "fix(server): retain CapacityLimiter slot until worker thread completes (#5642)",
          "text": "## What does this PR address? Fixes #5642 ### Problem & Root Cause When synchronous (`def`) `@bentoml.api` endpoints are executed via `ServiceAppFactory._to_thread`, cancellation can release the `CapacityLimiter` slot before the background worker has finished (or, in a narrow pre-start window, before AnyIO has queued the worker). A freed slot admits another request while the timed-out work is still running, violating the configured concurrency limit. ### Solution - Acquire the `CapacityLimiter` slot on behalf of a unique borrower token. - Submit the worker from a child task shielded from request cancellation, so the borrower cannot be released before AnyIO queues the worker. - Release the borrower from the worker wrapper's `finally:` block, after the sync function completes; release immediately if task creation itself fails. - Continue using `abandon_on_cancel=True` so request cancellation does not wait for the sync worker. ### Verification Added focused unit coverage in `tests/unit/_bentoml_impl/test_server_app.py` for normal execution, cancellation after worker start, and cancellation while the AnyIO default thread limiter is saturated before the worker starts. Local verification: Ruff and formatting pass; 3 focused tests pass. ## Before submitting: - [x] Does the Pull Request follow [Conventional Commits specification](https://www.conventionalcommits.org/en/v1.0.0/#summary) naming? - [x] Does the code follow BentoML's code style, `pre-commit run -a` script has passed? - [ ] Did your changes require updates to the documentation? Have you updated those accordingly? - [x] Did you write tests to cover your changes?",
          "url": "https://github.com/bentoml/BentoML/pull/5671",
          "createdAt": "2026-07-23T18:36:22Z",
          "updatedAt": "2026-08-12T20:30:15Z",
          "timestamp": "2026-08-12T20:30:15Z",
          "metrics": {
            "reactions": 0,
            "comments": 4
          },
          "labels": [],
          "author": "Hasnaathussain",
          "state": "open",
          "assignees": [],
          "change": "updated"
        }
      },
      {
        "id": "event:3c48670e9650622e9e54",
        "signalId": "github:bentoml/BentoML:pull_request:5681",
        "event": "changed",
        "observedAt": "2026-08-13T13:48:00.446149Z",
        "changedFields": [],
        "signal": {
          "id": "github:bentoml/BentoML:pull_request:5681",
          "source": "github",
          "group": "ai-infrastructure",
          "project": "bentoml/BentoML",
          "kind": "pull_request",
          "title": "docs: note OpenAI client base_url for multi-model gateways",
          "text": "## Summary The BentoML vLLM example already shows the OpenAI-compatible client pattern. This PR adds a short note that the same `OpenAI(base_url=...)` client pattern also works with OpenAI-compatible multi-model gateways when you are not self-hosting or using BentoCloud, using [DaoXE](https://daoxe.com) (`https://api.daoxe.com/v1`) as one concrete example. Docs only — no runtime behavior changes. ## Test plan - [ ] Docs still build - [ ] Existing OpenAI client example unchanged - [ ] Note is clearly optional / vendor-neutral Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "url": "https://github.com/bentoml/BentoML/pull/5681",
          "createdAt": "2026-08-03T01:48:25Z",
          "updatedAt": "2026-08-12T18:38:12Z",
          "timestamp": "2026-08-12T18:38:12Z",
          "metrics": {
            "reactions": 0,
            "comments": 1
          },
          "labels": [],
          "author": "seven7763",
          "state": "closed",
          "assignees": [],
          "change": "updated"
        }
      }
    ]
  }
}
