Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
163 commits
Select commit Hold shift + click to select a range
f4c6b55
new model manager, server and models packages
grzegorz-roboflow Aug 31, 2026
50476c3
harden model manager and server: executor routing, decode limits, url…
grzegorz-roboflow Aug 31, 2026
af2d9f1
restore sam3 rle mask format default
grzegorz-roboflow Sep 1, 2026
e6d63e6
gate control-plane routes behind ENABLE_CONTROL_PLANE_ROUTES
grzegorz-roboflow Sep 1, 2026
5665f14
port legacy manager features to direct backend stack
grzegorz-roboflow Sep 1, 2026
70e98fe
uv.lock
grzegorz-roboflow Sep 2, 2026
1e2ddf4
Remove stale dependencies
grzegorz-roboflow Sep 2, 2026
20ee30b
Update uv.lock
grzegorz-roboflow Sep 2, 2026
e153feb
Mention image type in GH actions
grzegorz-roboflow Sep 3, 2026
095811c
build linux/arm64
grzegorz-roboflow Sep 3, 2026
f3333de
Install the model manager stack in the JP7.2 image
grzegorz-roboflow Sep 8, 2026
e108471
Port changes from iuri/model-manager-pillow-heif-floor
grzegorz-roboflow Sep 21, 2026
cfa46f3
fix unit tests
grzegorz-roboflow Sep 21, 2026
9fa4878
Scope bearer auth to v2 routes and add legacy server configuration
grzegorz-roboflow Sep 21, 2026
9cf9441
Add legacy entities, image loading, error mapping and model bridge to…
grzegorz-roboflow Sep 21, 2026
64442cc
Add legacy translation layer and model routes to inference_server
grzegorz-roboflow Sep 21, 2026
560126d
Add legacy core-model routes and prediction visualization to inferenc…
grzegorz-roboflow Sep 22, 2026
9b66000
Move workflows HTTP contract into roboflow_workflows
grzegorz-roboflow Sep 22, 2026
50ae6d6
Add workflows host bindings and gateway models provider to inference_…
grzegorz-roboflow Sep 22, 2026
e89ed3f
Re-export workflows HTTP contract from legacy inference and bump pins…
grzegorz-roboflow Sep 22, 2026
3bce9fa
Add workflows router and execution to inference_server
grzegorz-roboflow Sep 22, 2026
9ffcb2b
Report resolved model package from the direct backend and run tensor-…
grzegorz-roboflow Sep 22, 2026
a13ef5a
Install workflows into inference_server images and CI
grzegorz-roboflow Sep 22, 2026
1c1a57b
Report resolved model package details from DirectBackend.stats
grzegorz-roboflow Sep 22, 2026
b418854
Harden workflows host platform access and close legacy parity gaps
grzegorz-roboflow Sep 22, 2026
4ddcf74
uv.lock
grzegorz-roboflow Sep 22, 2026
1133d50
Restore docs workflow from main
grzegorz-roboflow Sep 22, 2026
9aebec1
Fix inference_server tests on FastAPI 0.140+ and Python 3.13.15
grzegorz-roboflow Sep 22, 2026
b524bc7
Support Python 3.13 in inference-server and inference-model-manager
grzegorz-roboflow Sep 22, 2026
cac2ce8
Delete inference_server/uv.lock
grzegorz-roboflow Sep 22, 2026
44b8a6a
Check inference_models lock in check_code_quality
grzegorz-roboflow Sep 22, 2026
827e08d
remove unneeded uv.lock
grzegorz-roboflow Sep 22, 2026
2ed75d5
Fix slim install guard in the model-manager/server unit test job
grzegorz-roboflow Sep 22, 2026
dadf596
Fix slim install guard in the model-manager/server unit test job
grzegorz-roboflow Sep 22, 2026
4a842cd
Require the unreleased inference-models and roboflow-workflows features
grzegorz-roboflow Sep 22, 2026
7200572
update dependencies
grzegorz-roboflow Sep 22, 2026
ddc9f42
workflows 0.2.2rc1
grzegorz-roboflow Sep 22, 2026
408cfeb
bump workflows dependency
grzegorz-roboflow Sep 22, 2026
acd7b5c
Remove obsolete images
grzegorz-roboflow Sep 22, 2026
d890341
Scope GITHUB_TOKEN in the inference-server stack publish workflow
grzegorz-roboflow Sep 22, 2026
638bb5e
Stop returning registry error text in 401 and 404 bodies
grzegorz-roboflow Sep 22, 2026
7d9903f
Serve legacy landing page and default to port 9001
grzegorz-roboflow Sep 23, 2026
f74de1e
Port the Workflow Builder and path-aware CORS middleware
grzegorz-roboflow Sep 23, 2026
2d6ffc1
Exclude /build from general CORS and keep loaded cached models in the…
grzegorz-roboflow Sep 23, 2026
fca0535
Add server-image dropdown to the x86 integration workflow
grzegorz-roboflow Sep 23, 2026
1b982d6
Add server-image dropdown to the T4 regression workflow
grzegorz-roboflow Sep 23, 2026
fea8dfd
Document running the legacy integration suite against inference_server
grzegorz-roboflow Sep 23, 2026
a535686
Assert slim-install routes through the OpenAPI schema
grzegorz-roboflow Sep 23, 2026
7a3452d
Fix regression tests / clip
grzegorz-roboflow Sep 23, 2026
8dd7d1f
Serve inference_models pipelines through the manager
grzegorz-roboflow Sep 23, 2026
b980bf5
Bump roboflow-workflows to 0.2.3rc1
grzegorz-roboflow Sep 23, 2026
d83964f
Cover custom Python blocks in the workflows router tests
grzegorz-roboflow Sep 23, 2026
e4682df
Authorize pipeline stages in the model stat layer
grzegorz-roboflow Sep 23, 2026
9394efb
Split batched results that arrive as per-image tuples
grzegorz-roboflow Sep 24, 2026
2dbf150
Return 404 for YOLO-World on the legacy routes
grzegorz-roboflow Sep 24, 2026
d28ca16
Drop the per-model GPU memory delta from backend stats
grzegorz-roboflow Sep 24, 2026
82caaa9
Report the device the model was asked to load on
grzegorz-roboflow Sep 24, 2026
5d41cff
Declare one backend state vocabulary
grzegorz-roboflow Sep 24, 2026
9473b86
Rename the manager dispatch concept to action
grzegorz-roboflow Sep 24, 2026
83ad830
Make pillow-heif optional
grzegorz-roboflow Sep 25, 2026
462011c
Remove HEIC decode and the pillow-heif extra
grzegorz-roboflow Sep 25, 2026
8ed5a9e
Fix keypoints and rich classification serializers
grzegorz-roboflow Sep 25, 2026
1237811
Reload with the original context after eviction
grzegorz-roboflow Sep 25, 2026
3efbf01
Namespace server-generated SAM image ids
grzegorz-roboflow Sep 25, 2026
5e4cd2d
Gate URL image fetches on ALLOW_URL_INPUT and OFFLINE_MODE
grzegorz-roboflow Sep 25, 2026
1194b97
Bump roboflow-workflows to 0.2.3rc2
grzegorz-roboflow Sep 25, 2026
c536ae0
Initially resolve conflicts with main
PawelPeczek-Roboflow Sep 29, 2026
3d45b87
Fix initial resolutions issue
PawelPeczek-Roboflow Sep 29, 2026
87ea168
Fix/api v1 parity issues (#3090)
PawelPeczek-Roboflow Sep 30, 2026
e0563fc
Add inference_server, inference_model_manager and inference_models as…
grzegorz-roboflow Oct 6, 2026
ddd581b
Merge branch 'main' into feat/new-model-manager
grzegorz-roboflow Oct 6, 2026
88ce3c4
Merge branch 'main' into feat/new-model-manager
grzegorz-roboflow Oct 6, 2026
fedbd8b
tests & isort
grzegorz-roboflow Oct 6, 2026
038af4f
tests
grzegorz-roboflow Oct 6, 2026
52a6cda
Decode capability instances from the routing key and check every rout…
grzegorz-roboflow Oct 6, 2026
7b916b7
fix batch size
grzegorz-roboflow Oct 7, 2026
3c4a16e
Measure model-side inference time per call in the model manager and e…
grzegorz-roboflow Oct 7, 2026
b79086c
Report usage in legacy's row shape: model, workflows and workflow_blo…
grzegorz-roboflow Oct 7, 2026
5ae47b3
Declare redis as a dependency of inference-server
grzegorz-roboflow Oct 7, 2026
4370b2c
Add a redis extra to inference-server and install it in the server im…
grzegorz-roboflow Oct 7, 2026
8b1368a
Add an enterprise extra to inference-server and install it in the ser…
grzegorz-roboflow Oct 7, 2026
81915ac
Add a streams extra to inference-server and install stream_vision in …
grzegorz-roboflow Oct 7, 2026
270e63b
Default the per-call timeout to the vLLM request timeout on vLLM pool…
grzegorz-roboflow Oct 8, 2026
6f9ae51
uv.lock
grzegorz-roboflow Oct 8, 2026
33984d1
Keep inference-models defaults and signatures as on main and request …
grzegorz-roboflow Oct 8, 2026
1e5ca72
Keep inference-models defaults and signatures as on main and request …
grzegorz-roboflow Oct 8, 2026
ae7712f
Install the server workflows configuration before stream modules load…
grzegorz-roboflow Oct 9, 2026
452ed81
Merge branch 'main' into feat/new-model-manager
grzegorz-roboflow Oct 9, 2026
353f5c2
Bump inference-models to 0.39.2rc6, roboflow-workflows to 0.2.5rc3 an…
grzegorz-roboflow Oct 9, 2026
2a047f5
pin version
grzegorz-roboflow Oct 9, 2026
fa85d13
Report X-Model-Id on legacy error responses like the legacy server, k…
grzegorz-roboflow Oct 12, 2026
e470112
Merge branch 'main' into feat/new-model-manager
grzegorz-roboflow Oct 12, 2026
977f179
Pin inference-model-manager 0.5.4 in inference-server
grzegorz-roboflow Oct 12, 2026
6423795
Tell models the colour order of decoded images when the caller does n…
grzegorz-roboflow Oct 12, 2026
f45a46a
Decode 16-bit and other deep PNG, TIFF, BigTIFF, JPEG 2000 and AVIF i…
grzegorz-roboflow Oct 12, 2026
3d6401a
Merge branch 'main' into feat/new-model-manager
grzegorz-roboflow Oct 13, 2026
59ca6f6
Merge branch 'main' into feat/new-model-manager
grzegorz-roboflow Oct 13, 2026
5d032b8
Mirror the workflows mask coordinate metadata and action recognition …
grzegorz-roboflow Oct 13, 2026
9da3217
Keep action recognition confidence in the legacy server's timeline pr…
grzegorz-roboflow Oct 13, 2026
14c22a9
Decode oriented TIFFs with the orientation tag reset and rotate once,…
grzegorz-roboflow Oct 13, 2026
4792c9e
Run only the slim install tests in the slim CI env and never skip tes…
grzegorz-roboflow Oct 13, 2026
255b7f1
Report usage model descriptors and image load failures the way the le…
grzegorz-roboflow Oct 14, 2026
041ecbf
Report the platform's model latency in usage rows like the legacy ser…
grzegorz-roboflow Oct 14, 2026
2310732
Merge branch 'main' into feat/new-model-manager
grzegorz-roboflow Oct 14, 2026
38c74f5
Restore the legacy Docker images, entrypoint and ignore files to main
grzegorz-roboflow Oct 14, 2026
2f0f609
Remove the legacy model manager process adapter from the legacy server
grzegorz-roboflow Oct 14, 2026
3a0f1f8
Keep inference-models loading behaviour unchanged for the legacy server
grzegorz-roboflow Oct 14, 2026
adaffd9
Merge branch 'main' into feat/new-model-manager
grzegorz-roboflow Oct 14, 2026
be2a862
Run the Jetson 5.1.1 regression tests on the default inference-models…
grzegorz-roboflow Oct 14, 2026
b398d60
Run the inference server integration tests in the new stack CI workflow
grzegorz-roboflow Oct 14, 2026
79424b7
Bump inference-models to 0.39.4rc4 and require it from inference-mode…
grzegorz-roboflow Oct 14, 2026
330d061
Flatten list slots when taking from the in-memory usage queue
grzegorz-roboflow Oct 14, 2026
08ff121
Keep the internal service secret off nested usage rows
grzegorz-roboflow Oct 14, 2026
ffbdb42
Stop the pipeline usage collector when its flush fails
grzegorz-roboflow Oct 14, 2026
5e5b282
Redact direct API key lookup failures and honour proxy and TLS settin…
grzegorz-roboflow Oct 14, 2026
9957ea3
Drop empty entries from the workspace allow-list like legacy
grzegorz-roboflow Oct 14, 2026
e3147d9
Keep API keys out of workflow platform error chains and stop sending …
grzegorz-roboflow Oct 14, 2026
d6c88a0
Remove the per-request image cap from workflow model steps
grzegorz-roboflow Oct 14, 2026
1c1d3fe
Carry block model requirements in the air-gapped describe
grzegorz-roboflow Oct 14, 2026
90ca5fc
Key usage rows by source tags as the legacy collector does
grzegorz-roboflow Oct 14, 2026
ed763c9
Make compact v2 serialization accept strided arrays
grzegorz-roboflow Oct 14, 2026
44af882
Label open-vocabulary detections with every requested class
grzegorz-roboflow Oct 14, 2026
06237be
Free executor workers while plugin requests are pending and report GP…
grzegorz-roboflow Oct 14, 2026
2fcea5b
Apply the https and domain-name URL rules to v2 image URLs
grzegorz-roboflow Oct 14, 2026
43e5106
Reject unsafe adapter paths and honour allow_untrusted_packages in th…
grzegorz-roboflow Oct 14, 2026
f2b5b30
Keep manager and auth kwargs out of v2 model params
grzegorz-roboflow Oct 14, 2026
a72cd23
Apply root_path before classifying v2 auth routes and guard the usage…
grzegorz-roboflow Oct 14, 2026
b86d0e3
Require hosted authorization on v2 routes and answer oversized hosted…
grzegorz-roboflow Oct 14, 2026
015ac8d
Anchor the URL redaction pattern so long scheme-like runs sanitize in…
grzegorz-roboflow Oct 14, 2026
e7ed8a3
Settle and close every v2 batch item before re-raising
grzegorz-roboflow Oct 14, 2026
a472fed
Keep image orientation for embeddings off the event loop
grzegorz-roboflow Oct 14, 2026
b6eecdc
Bound decoded bytes, frames and container header walks in the decode …
grzegorz-roboflow Oct 14, 2026
c2288e0
Merge branch 'main' into feat/new-model-manager
grzegorz-roboflow Oct 15, 2026
45c0bd4
Run the CUDA health check and registry GPU stats off the event loop
grzegorz-roboflow Oct 15, 2026
3464a5c
Honour the input colour order in SAM3 and declare RGB for SAM3 workfl…
grzegorz-roboflow Oct 15, 2026
f4b156b
Apply legacy environment mapping before the server configuration read…
grzegorz-roboflow Oct 15, 2026
f762238
Type v2 query, multipart and JSON parameters by their declared types
grzegorz-roboflow Oct 15, 2026
680dff7
Include anomaly results in v2 classification responses
grzegorz-roboflow Oct 15, 2026
302f0c0
Report the status of a platform refusal in usage rows, so 402 and 423…
grzegorz-roboflow Oct 15, 2026
fbf4cca
Record the model usage row when a workflow model step cannot fetch it…
grzegorz-roboflow Oct 15, 2026
d92b086
Report VLM usage descriptors the way the legacy server does, so Cosmo…
grzegorz-roboflow Oct 15, 2026
adaf9c2
Pin the usage row a workflow run with an unloadable input image posts…
grzegorz-roboflow Oct 15, 2026
d726055
Merge branch 'main' into feat/new-model-manager
grzegorz-roboflow Oct 16, 2026
1663bfc
Decode AVIF with OpenCV where imagecodecs crashes on single-frame dec…
grzegorz-roboflow Oct 16, 2026
ad65f74
Match legacy usage rows: requested model aliases, workflow-execution …
grzegorz-roboflow Oct 16, 2026
7e03d14
Carry the request source on workflow usage rows and stop sending the …
grzegorz-roboflow Oct 16, 2026
0e89a66
Pin the RF-DETR NAS latency descriptor the model usage row posts for …
grzegorz-roboflow Oct 16, 2026
bb2bd96
Merge branch 'main' into feat/new-model-manager
grzegorz-roboflow Oct 16, 2026
c1c090b
uv.lock
grzegorz-roboflow Oct 16, 2026
20ccf28
uv.lock
grzegorz-roboflow Oct 16, 2026
747e714
Decode AVIF with Pillow where imagecodecs cannot decode a frame, sinc…
grzegorz-roboflow Oct 16, 2026
be4d4fc
Skip the inference_server test image build when a prebuilt image dige…
grzegorz-roboflow Oct 16, 2026
c151bb9
Revert the unused usage-row resource_details merge in the legacy usag…
grzegorz-roboflow Oct 16, 2026
8baca31
Raise again on an incomplete onnxruntime install instead of silently …
grzegorz-roboflow Oct 16, 2026
365f277
Move the unreleased inference-models and roboflow-workflows changelog…
grzegorz-roboflow Oct 16, 2026
a7f5e72
Pin inference-models 0.39.5rc2, which raises again on an incomplete o…
grzegorz-roboflow Oct 16, 2026
8d6fa43
Merge branch 'main' into feat/new-model-manager
grzegorz-roboflow Oct 16, 2026
a6de249
Lock workflows and streamvision against inference-models 0.39.5rc2 an…
grzegorz-roboflow Oct 16, 2026
a351d8e
Accept tensorrt_lean as the TensorRT runtime component
grzegorz-roboflow Oct 19, 2026
cdfdabd
Ship the full TensorRT 10.12.0.36 runtime and a C compiler in the GPU…
grzegorz-roboflow Oct 19, 2026
bb18bad
Document the serving decoder default and the nvjpeg parity caveat
grzegorz-roboflow Oct 19, 2026
bd714ff
Drop TensorRT builder resources from the GPU serving image
grzegorz-roboflow Oct 19, 2026
630d65d
Merge branch 'main' into feat/new-model-manager
grzegorz-roboflow Oct 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
32 changes: 23 additions & 9 deletions .github/workflows/docker.inference_server.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
name: Build inference_server images
run-name: Build inference_server images (${{ (!inputs.cpu && !inputs.gpu && !inputs.jetson_5_1_1 && !inputs.jetson_6_0_0 && !inputs.jetson_6_2_0) && 'all' || '' }}${{ inputs.cpu && 'cpu' || '' }}${{ inputs.gpu && format('{0}gpu', inputs.cpu && ', ' || '') || '' }}${{ inputs.jetson_5_1_1 && format('{0}jetson-5.1.1', (inputs.cpu || inputs.gpu) && ', ' || '') || '' }}${{ inputs.jetson_6_0_0 && format('{0}jetson-6.0.0', (inputs.cpu || inputs.gpu || inputs.jetson_5_1_1) && ', ' || '') || '' }}${{ inputs.jetson_6_2_0 && format('{0}jetson-6.2.0', (inputs.cpu || inputs.gpu || inputs.jetson_5_1_1 || inputs.jetson_6_0_0) && ', ' || '') || '' }})

# Manual only. When you click "Run workflow", pick your branch as the ref —
# it builds that ref's code (never main on its own). Tick the targets you want;
Expand All @@ -15,7 +16,7 @@ on:
default: false
cpu:
type: boolean
description: "Build CPU (amd64)"
description: "Build CPU (amd64 + arm64/Apple Silicon)"
default: false
jetson_5_1_1:
type: boolean
Expand All @@ -31,7 +32,7 @@ on:
default: false
tag_suffix:
type: string
description: "Postfix appended to image tag, e.g. -test → :gpu-0.1.0-test"
description: "Postfix appended after a dash, e.g. test → :gpu-0.1.0-test (no leading dash needed)"
default: ""
push:
type: boolean
Expand All @@ -46,16 +47,23 @@ jobs:
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.set.outputs.matrix }}
version: ${{ steps.ver.outputs.version }}
server_version: ${{ steps.ver.outputs.server_version }}
manager_version: ${{ steps.ver.outputs.manager_version }}
models_version: ${{ steps.ver.outputs.models_version }}
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Read inference_server version
- name: Read package versions
id: ver
run: |
v=$(python -c "import tomllib; print(tomllib.load(open('inference_server/pyproject.toml','rb'))['project']['version'])")
echo "version=$v" >> "$GITHUB_OUTPUT"
echo "inference_server version: $v"
get() { python -c "import tomllib,sys; print(tomllib.load(open(sys.argv[1],'rb'))['project']['version'])" "$1"; }
sv=$(get inference_server/pyproject.toml)
mv=$(get inference_model_manager/pyproject.toml)
iv=$(get inference_models/pyproject.toml)
echo "server_version=$sv" >> "$GITHUB_OUTPUT"
echo "manager_version=$mv" >> "$GITHUB_OUTPUT"
echo "models_version=$iv" >> "$GITHUB_OUTPUT"
echo "inference_server=$sv inference_model_manager=$mv inference_models=$iv"
- name: Compute build matrix (none selected = all)
id: set
env:
Expand All @@ -69,7 +77,7 @@ jobs:
all_json=$(cat <<EOF
[
{"name":"gpu","dockerfile":"inference_server/docker/Dockerfile.gpu","platform":"linux/amd64","depot_project":"grl7ffzxd7","sel":"$GPU"},
{"name":"cpu","dockerfile":"inference_server/docker/Dockerfile.cpu","platform":"linux/amd64","depot_project":"grl7ffzxd7","sel":"$CPU"},
{"name":"cpu","dockerfile":"inference_server/docker/Dockerfile.cpu","platform":"linux/amd64,linux/arm64","depot_project":"grl7ffzxd7","sel":"$CPU"},
{"name":"jetson-5.1.1","dockerfile":"inference_server/docker/Dockerfile.jetson.5.1.1","platform":"linux/arm64","depot_project":"2rp7mfjw7q","sel":"$J511"},
{"name":"jetson-6.0.0","dockerfile":"inference_server/docker/Dockerfile.jetson.6.0.0","platform":"linux/arm64","depot_project":"2rp7mfjw7q","sel":"$J600"},
{"name":"jetson-6.2.0","dockerfile":"inference_server/docker/Dockerfile.jetson.6.2.0","platform":"linux/arm64","depot_project":"2rp7mfjw7q","sel":"$J620"}
Expand Down Expand Up @@ -115,4 +123,10 @@ jobs:
platforms: ${{ matrix.platform }}
pull: true
push: ${{ inputs.push }}
tags: ${{ env.IMAGE }}:${{ matrix.name }}-${{ needs.setup.outputs.version }}${{ inputs.tag_suffix }}
tags: ${{ env.IMAGE }}:${{ matrix.name }}-${{ needs.setup.outputs.server_version }}${{ inputs.tag_suffix != '' && format('-{0}', inputs.tag_suffix) || '' }}
labels: |
org.opencontainers.image.version=${{ needs.setup.outputs.server_version }}
org.opencontainers.image.revision=${{ github.sha }}
com.roboflow.inference_server.version=${{ needs.setup.outputs.server_version }}
com.roboflow.inference_model_manager.version=${{ needs.setup.outputs.manager_version }}
com.roboflow.inference_models.version=${{ needs.setup.outputs.models_version }}
Original file line number Diff line number Diff line change
Expand Up @@ -102,12 +102,15 @@ jobs:
run: |
python -m pip install --upgrade pip
pip install --upgrade setuptools
pip install -r requirements/_requirements.txt \
pip install --extra-index-url https://download.pytorch.org/whl/cpu \
-r requirements/_requirements.txt \
-r requirements/requirements.cpu.txt \
-r requirements/requirements.http.txt \
-r requirements/requirements.sdk.http.txt \
-r requirements/requirements.sdk.webrtc.txt \
-r requirements/requirements.test.unit.txt
-r requirements/requirements.test.unit.txt \
-r requirements/requirements.transformers.txt
pip install --no-deps './inference_models[torch-cpu,onnx-cpu]'

- name: 🏗️ Build and install same-checkout server dependencies
run: |
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ jobs:
python -m pip install --upgrade pip
pip install --upgrade setuptools
pip install --extra-index-url https://download.pytorch.org/whl/cpu -r requirements/_requirements.txt -r requirements/requirements.cpu.txt -r requirements/requirements.sdk.http.txt -r requirements/requirements.test.unit.txt -r requirements/requirements.http.txt -r requirements/requirements.yolo_world.txt -r requirements/requirements.doctr.txt -r requirements/requirements.sam.txt -r requirements/requirements.transformers.txt -r requirements/requirements.cli.txt -r requirements/requirements.sdk.http.txt
pip install --no-deps ./inference_models
pip install --no-deps './inference_models[torch-cpu,onnx-cpu]'
- name: 🏗️ Build and install roboflow-workflows and streamvision wheels
run: |
make create_workflows_wheel create_streamvision_wheel
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/integration_tests_inference_models.yml
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ jobs:
python -m pip install --upgrade pip
pip install --upgrade setuptools
pip install --extra-index-url https://download.pytorch.org/whl/cpu -r requirements/_requirements.txt -r requirements/requirements.cpu.txt -r requirements/requirements.sdk.http.txt -r requirements/requirements.test.unit.txt -r requirements/requirements.http.txt -r requirements/requirements.yolo_world.txt -r requirements/requirements.sam.txt -r requirements/requirements.transformers.txt
pip install --no-deps './inference_models[torch-cpu,onnx-cpu]'
- name: 🏗️ Build and install roboflow-workflows and streamvision wheels
run: |
make create_workflows_wheel create_streamvision_wheel
Expand Down
27 changes: 23 additions & 4 deletions .github/workflows/integration_tests_inference_server_x86.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,13 @@ on:
description: "Prebuilt roboflow/roboflow-inference-server-cpu tag to test (e.g. 1.6.2-post3-rc1). Empty = build the image from this ref."
type: string
default: ""
server-image:
description: "Server under test: legacy inference image or the new inference_server image"
type: choice
default: legacy
options:
- legacy
- new
workflow_call:
# Called by fast_track_integration_tests.yml with a prebuilt image tag, so
# the 15-minute in-job image build is skipped.
Expand Down Expand Up @@ -95,6 +102,9 @@ jobs:
contents: read
id-token: write
env:
SERVER_IMAGE: ${{ github.event.inputs.server-image || 'legacy' }}
INFERENCE_SERVER_REPO: ${{ github.event.inputs.server-image == 'new' && 'inference-server-experimental' || 'roboflow-inference-server-cpu' }}
PYTEST_EXTRA_ARGS: ${{ github.event.inputs.server-image == 'new' && '--ignore=tests/inference/integration_tests/test_video_processing_endpoints.py --ignore=tests/inference/integration_tests/yolo_world_test.py --deselect tests/inference/integration_tests/test_workflow_endpoints.py::test_compilation_endpoint_when_compilation_succeeds_with_custom_block' || '' }}
MODEL_MODE: ${{ matrix.use-inference-models }}
IMAGE_FAMILY: cpu
IMAGE_TAG: ${{ inputs.image_tag }}
Expand All @@ -107,7 +117,7 @@ jobs:
strategy:
fail-fast: true
matrix:
use-inference-models: ${{ fromJSON((inputs.use-inference-models || 'all') == 'all'&& '["true","false"]'|| format('["{0}"]', inputs.use-inference-models)) }}
use-inference-models: ${{ fromJSON(github.event.inputs.server-image == 'new' && '["true"]' || ((inputs.use-inference-models || 'all') == 'all' && '["true","false"]' || format('["{0}"]', inputs.use-inference-models))) }}
timeout-minutes: 60

steps:
Expand Down Expand Up @@ -160,7 +170,7 @@ jobs:
python -m pip install --upgrade pip
python -m pip install -r requirements/requirements.test.unit.txt -r requirements/requirements.test.integration.txt -r requirements/requirements.code_analysis.txt
- name: 🔨 Build and Push Test Docker
if: ${{ inputs.image_tag == '' && inputs.image_digest == '' && !inputs.private_image }}
if: ${{ env.SERVER_IMAGE == 'legacy' && inputs.image_tag == '' && inputs.image_digest == '' && !inputs.private_image }}
run: |
docker pull roboflow/roboflow-inference-server-cpu:test
docker build -t roboflow/roboflow-inference-server-cpu:test -f docker/dockerfiles/Dockerfile.onnx.cpu .
Expand All @@ -182,9 +192,13 @@ jobs:
-e CPU_IMAGE_TEST=true \
-v "$PWD/tests/docker/test_cpu_torch_runtime.py:/test_cpu_torch_runtime.py:ro" \
"$INFERENCE_TEST_IMAGE" -c 'python3 -m pip install pytest && python3 -m pytest /test_cpu_torch_runtime.py -v'
- name: 🔨 Build Test Docker - inference_server
if: ${{ env.SERVER_IMAGE == 'new' && inputs.image_digest == '' && !inputs.private_image }}
run: |
docker build -t roboflow/inference-server-experimental:test -f inference_server/docker/Dockerfile.cpu .
- name: 🔋 Start Test Docker
run: |
USE_INFERENCE_MODELS="$MODEL_MODE" PORT=9101 INFERENCE_SERVER_REPO=roboflow-inference-server-cpu make start_test_docker_cpu
USE_INFERENCE_MODELS="$MODEL_MODE" PORT=9101 INFERENCE_SERVER_REPO="$INFERENCE_SERVER_REPO" make start_test_docker_cpu
CI_IMAGE_ACTION=port python3 .github/scripts/ci_image.py
- name: 🧪 Integration Tests of inference server [x86 CPU]
env:
Expand All @@ -198,8 +212,13 @@ jobs:
melee_API_KEY: ${{ secrets.MELEE_API_KEY }}
yolonas_test_API_KEY: ${{ secrets.YOLONAS_TEST_API_KEY }}
run: |
USE_INFERENCE_MODELS="$MODEL_MODE" PORT="${TEST_PORT:-9101}" SKIP_LMM_TEST=True python -m pytest tests/inference/integration_tests
USE_INFERENCE_MODELS="$MODEL_MODE" PORT="${TEST_PORT:-9101}" SKIP_LMM_TEST=True python -m pytest tests/inference/integration_tests $PYTEST_EXTRA_ARGS
make stop_test_docker
- name: 📜 Dump server logs on failure
if: failure()
run: |
docker logs "$INFERENCE_TEST_CONTAINER" --tail 1000 || true
make stop_test_docker || true
- name: Remove this job's test container
if: ${{ always() }}
run: |
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/integration_tests_workflows_x86.yml
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ jobs:
python -m pip install --upgrade pip
pip install --upgrade setuptools
pip install --extra-index-url https://download.pytorch.org/whl/cpu -r requirements/_requirements.txt -r requirements/requirements.sam.txt -r requirements/requirements.cpu.txt -r requirements/requirements.http.txt -r requirements/requirements.test.unit.txt -r requirements/requirements.doctr.txt -r requirements/requirements.yolo_world.txt -r requirements/requirements.transformers.txt -r requirements/requirements.sdk.http.txt -r requirements/requirements.easyocr.txt
pip install --no-deps ./inference_models
pip install --no-deps './inference_models[torch-cpu,onnx-cpu]'
- name: 🔤 Cache Workflows font assets
uses: actions/cache@v5
with:
Expand Down
177 changes: 177 additions & 0 deletions .github/workflows/publish.pypi.inference_server_stack.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,177 @@
name: publish inference-server stack
on:
#release:
# types: [created]
workflow_dispatch:
inputs:
publish:
description: "Actually publish the package to PyPI"
required: false
default: false
type: boolean
candidate_run_id:
description: "Run id of the build-candidates run to publish"
required: false
default: ""
type: string

# build-candidates only reads the checkout; publish-gated widens this for
# trusted publishing.
permissions:
contents: read

jobs:
build-candidates:
if: ${{ !inputs.publish }}
runs-on:
labels: depot-ubuntu-22.04-small
group: public-depot
steps:
- name: 🛎️ Checkout
uses: actions/checkout@v4
- name: 📦 Set up uv
uses: astral-sh/setup-uv@v5
- name: Assert matching versions
run: |
python - <<'EOF'
import tomllib
v1 = tomllib.load(open("inference_model_manager/pyproject.toml","rb"))["project"]["version"]
v2 = tomllib.load(open("inference_server/pyproject.toml","rb"))["project"]["version"]
assert v1 == v2, f"version mismatch: {v1} != {v2}"
EOF
- name: 🔨 Build inference-model-manager
run: cd inference_model_manager && uv build
- name: 🔨 Build inference-server
run: cd inference_server && uv build
- name: Guard against private module leaks
run: |
set -euo pipefail
python - <<'EOF'
import fnmatch
import pathlib
import sys
import tarfile
import zipfile

DISTS = {
"inference_model_manager": pathlib.Path("inference_model_manager/dist"),
"inference_server": pathlib.Path("inference_server/dist"),
}
SDIST_SCAFFOLDING = {
"PKG-INFO",
"MANIFEST.in",
"pyproject.toml",
"setup.cfg",
"setup.py",
"README",
"README.md",
"README.rst",
"README.txt",
"LICENSE",
"LICENCE",
"LICENSE.md",
"LICENSE.txt",
"NOTICE",
"NOTICE.md",
"NOTICE.txt",
}

failures = []

def allowed(package, name):
if name == package:
return True
for pattern in (
f"{package}-*.dist-info",
f"{package}-*.data",
f"{package}.egg-info",
f"{package}-*.egg-info",
):
if fnmatch.fnmatch(name, pattern):
return True
return name in SDIST_SCAFFOLDING

def members_of(path):
if path.name.endswith(".whl"):
with zipfile.ZipFile(path) as archive:
return [n for n in archive.namelist() if n.strip("/")], False
if path.name.endswith((".tar.gz", ".tgz")):
with tarfile.open(path) as archive:
return [m.name for m in archive.getmembers() if m.name.strip("./")], True
raise ValueError(f"unrecognised distribution file: {path}")

def top_levels(path):
names, is_sdist = members_of(path)
if not names:
raise ValueError(f"{path}: archive is empty")
tops = set()
for name in names:
parts = [p for p in name.replace("\\", "/").split("/") if p not in ("", ".")]
if not parts:
continue
if is_sdist:
# sdists nest everything under a single <name>-<version>/ root
if len(parts) < 2:
continue
tops.add(parts[1])
else:
tops.add(parts[0])
if not tops:
raise ValueError(f"{path}: no inspectable entries")
return tops

for package, dist_dir in DISTS.items():
if not dist_dir.is_dir():
failures.append(f"{dist_dir}: directory missing")
continue
files = sorted(p for p in dist_dir.iterdir() if p.is_file())
if not files:
failures.append(f"{dist_dir}: no distribution files built")
continue
print(f"{package}: inspecting {len(files)} distribution file(s)")
for path in files:
try:
tops = top_levels(path)
except (ValueError, tarfile.TarError, zipfile.BadZipFile) as error:
failures.append(str(error))
continue
for name in sorted(tops):
if not allowed(package, name):
failures.append(f"{path}: disallowed top-level entry {name!r}")

if failures:
for failure in failures:
print(f"LEAK GUARD FAILURE: {failure}")
sys.exit(1)
print("leak guard: all distribution files contain only allowlisted top-level entries")
EOF
- name: 📦 Bundle candidates
run: |
mkdir -p /tmp/candidate/dists
cp inference_model_manager/dist/* inference_server/dist/* /tmp/candidate/dists/
(cd /tmp/candidate/dists && shasum -a 256 * > ../SHA256SUMS)
- uses: actions/upload-artifact@v4
with:
name: public-wheels
path: /tmp/candidate/
publish-gated:
if: ${{ inputs.publish }}
runs-on:
labels: depot-ubuntu-22.04-small
group: public-depot
permissions:
id-token: write
contents: read
actions: read
steps:
- uses: actions/download-artifact@v4
with:
name: public-wheels
path: /tmp/candidate
run-id: ${{ inputs.candidate_run_id }}
github-token: ${{ secrets.GITHUB_TOKEN }}
- name: Verify candidate checksums
run: cd /tmp/candidate/dists && shasum -a 256 -c ../SHA256SUMS
- uses: pypa/gh-action-pypi-publish@release/v1
with:
packages-dir: /tmp/candidate/dists/
Loading
Loading