model_server
Copilot instructions953 starsChanged 3 years agoApache-2.0View on GitHub
OpenVINO Model Server (OVMS) is a high-performance inference serving platform built on top of OpenVINO and OpenVINO GenAI. The codebase is primarily C++ with Bazel as the build system. Supporting infrastructure uses Makefiles, Dockerfiles (Ubuntu & Red Hat), and batch files (Windows). Performance is a top priority — both throughput and latency are critical. Code changes should be evaluated for their performance impact. Avoid unnecessary copies, allocations, and blocking operations on the hot path. When analyzing a Pull Request, follow…
- Deletes or force-pushes
We split this copilot-instructions.md into the rules it gives an agent
24 rules. About 0 are common, 10 are distinctive, and 14 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈10
Distinctive · estimate
This author's own choices. Worth a look.
14
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 25
Run make style to check formatting
- Distinctive: line 47
When analyzing a Pull Request, follow this protocol:
- Distinctive: line 49
Follow C++ Core Guidelines strictly.
- Very specific: line 50
Check for hidden performance costs: avoid dynamic_cast on the hot path.
- Distinctive: line 51
Avoid copies: ensure large data structures (tensors, buffers) are passed by reference or moved, not copied.
- Very specific: line 52
Documentation: ensure new public APIs have docstrings in C++ headers and Python bindings.
- Very specific: line 53
Test coverage: ensure that new features or changes have corresponding tests in src/test/.
- Very specific: line 57
Use const and constexpr wherever possible.
- Distinctive: line 59
Prefer member initializer lists over direct assignments in constructor bodies.
- Very specific: line 60
Verify that the result of every newly introduced function is used in at least one call site (except void functions).
- Distinctive: line 61
Use descriptive function and variable names.
- Distinctive: line 62
When initial container values are known upfront, prefer initializer-list / brace-initialization over constructing an empty container and …
- Very specific: line 64
Forward-declare in headers, include in
.cpp: if a header only uses pointers or references to a type, use a forward declaration (class … - Very specific: line 69
Never use const T& parameters with default arguments that construct temporaries (e.g.
- Very specific: line 70
When accepting const T& in constructors or functions that store the reference, verify that the referenced object's lifetime outlives the …
- Distinctive: line 71
Prefer overloads over default arguments for non-trivial types passed by reference.
- Very specific: line 83
If a -build image exists, start a container from it with the repository mounted:
- Very specific: line 89
If a container from a previous session is still available (docker ps -a), reuse it with docker start -i <container> or docker exec -it …
- Distinctive: line 166
Before running tests, test models must be prepared:
- Distinctive: line 173
If LLM test models change (e.g., new model version, OpenVINO version change or config update), you may need to remove and regenerate the …
- Distinctive: line 185
Run the full test suite only after the targeted tests pass.
- Very specific: line 190
Test files follow the *_test.cpp naming convention
- Very specific: line 191
Test utilities: test_utils.hpp, light_test_utils.hpp, c_api_test_utils.hpp
- Very specific: line 192
Test models are stored in src/test/ subdirectories (e.g., dummy/, passthrough/, summator/)
≈ “Common” is an estimate: at least 1 in 5 of the 3,669 Copilot instructions files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Copilot Instructions for OpenVINO Model Server (OVMS)
Project Overview
OpenVINO Model Server (OVMS) is a high-performance inference serving platform built on top of OpenVINO and OpenVINO GenAI. The codebase is primarily C++ with Bazel as the build system. Supporting infrastructure uses Makefiles, Dockerfiles (Ubuntu & Red Hat), and batch files (Windows).
Performance is a top priority — both throughput and latency are critical. Code changes should be evaluated for their performance impact. Avoid unnecessary copies, allocations, and blocking operations on the hot path.
Repository Structure
src/— Main C++ source code (server, gRPC/REST handlers, model management, pipelines, mediapipe, LLM, C API)src/test/— C++ unit tests (gtest-based); this is where most developer tests livesrc/python/— Python custom node bindings and related codedemos/— End-user demo applicationsclient/— Client libraries (C++, Python, Go, Java)docs/— Documentationthird_party/— Third-party dependency definitions for BazelDockerfile.ubuntu/Dockerfile.redhat— Multi-stage Dockerfiles for Linux buildsMakefile— Orchestrates Docker-based builds and test runs*.batfiles — Windows build and setup scripts
Code Style
- C++ style is enforced via
cpplintandclang-format - Run
make styleto check formatting - Apache 2.0 license headers are required on all source files
Expertise Areas
- OpenVINO Expertise:
- Proficient with OpenVINO core libraries and
ov::genaicomponents - Familiar with OpenVINO performance optimization techniques
- Proficient with OpenVINO core libraries and
- C++ Proficiency:
- Strong C++17 skills
- Familiar with best practices in memory management, concurrency, and template programming
- Serving Infrastructure:
- gRPC and REST API handler design
- Model management, pipeline orchestration, and MediaPipe integration
- C API (
libovms_shared.so) surface and bindings
- Build System Awareness:
- Bazel build configuration and dependency management
- Minimizing C++ build times: forward declarations, include-what-you-use, avoiding transitive header leakage
- Understanding of Bazel targets, build flags (
--//:distro), and multi-stage Docker builds
Code Review Instructions for PRs
When analyzing a Pull Request, follow this protocol:
- Follow C++ Core Guidelines strictly. Include references in review comments.
- Check for hidden performance costs: avoid
dynamic_caston the hot path; suggeststatic_castor redesign if the type is known. - Avoid copies: ensure large data structures (tensors, buffers) are passed by reference or moved, not copied.
- Documentation: ensure new public APIs have docstrings in C++ headers and Python bindings; update
docs/as needed. - Test coverage: ensure that new features or changes have corresponding tests in
src/test/. - Formatting & safety:
- No
using namespace std; using namespace ov;. Prefer explicit using with specific symbols if needed, for readability. - No
autofor primitive types where it obscures readability. - Use
constandconstexprwherever possible.
- No
- Pass non-fundamental values by
constreference wherever possible. - Prefer member initializer lists over direct assignments in constructor bodies.
- Verify that the result of every newly introduced function is used in at least one call site (except
voidfunctions). - Use descriptive function and variable names. Avoid duplicate code — extract common functionality into reusable utilities.
- When initial container values are known upfront, prefer initializer-list / brace-initialization over constructing an empty container and inserting.
- Unused functions and includes are not allowed. Build times are already long — do not add unnecessary
#includedirectives. Prefer forward declarations where possible and follow the include-what-you-use principle.- Forward-declare in headers, include in
.cpp: if a header only uses pointers or references to a type, use a forward declaration (class Foo;) instead of#include "foo.hpp". Move the full#includeto the.cppfile where the type is actually used. - Keep headers self-contained but minimal: each header must compile on its own, but should not pull in transitive dependencies that callers don't need.
- Prefer opaque types / Pimpl: for complex implementation details, consider the Pimpl idiom to keep implementation-only types out of the public header entirely.
- Never include a header solely for a typedef or enum: forward-declare the enum (
enum class Foo;in C++17) or relocate the typedef to a lightweightfwd.hpp-style header.
- Forward-declare in headers, include in
- No dangling references or temporaries bound to
const T&:- Never use
const T¶meters with default arguments that construct temporaries (e.g.const std::string& param = ""). This binds a reference to a temporary — use a function overload instead, or pass by value. - When accepting
const T&in constructors or functions that store the reference, verify that the referenced object's lifetime outlives the usage to avoid dangling references. - Prefer overloads over default arguments for non-trivial types passed by reference.
- Never use
Build System
Bazel (primary build tool)
Building and testing is done inside a Docker -build container with the repository mounted. Developers do not run Bazel on the host directly.
Important: Building the -build image from scratch is time-expensive, but may be required if dependencies or the build environment change. Before building a new one, check if one already exists:
docker images | grep -- -buildIf a -build image exists, start a container from it with the repository mounted:
docker run -it -v $(pwd):/ovms \
-e http_proxy=$http_proxy -e https_proxy=$https_proxy -e no_proxy=$no_proxy \
<image_name> bashIf a container from a previous session is still available (docker ps -a), reuse it with docker start -i <container> or docker exec -it <container> bash.
Key Bazel targets:
| Target | Description |
//src:ovms | Main OVMS server binary |
//src:ovms_test | C++ unit tests (gtest) |
//src:ovms_shared | C API shared library (libovms_shared.so) |
Build the server:
bazel build //src:ovmsBuild and run unit tests:
bazel build //src:ovms_test
bazel test --test_summary=detailed --test_output=streamed //src:ovms_testRed Hat builds — distro flag
For Red Hat (UBI9) builds, the --//:distro=redhat flag must be passed to all Bazel commands:
bazel build --//:distro=redhat //src:ovms
bazel test --//:distro=redhat //src:ovms_testThe default distro is ubuntu. Inside the -build container, the distro is auto-detected from /etc/redhat-release.
Makefile (Docker-based workflow)
The Makefile orchestrates full Docker-based builds. Key targets:
| Target | Description |
make docker_build | Full build: builder image → package → release images (default target) |
make ovms_builder_image | Build the -build Docker image (compilation container) |
make targz_package | Extract .tar.gz release package |
make ovms_release_images | Build CPU and GPU release Docker images |
make run_unit_tests | Run C++ unit tests in the -build container |
make test_functional | Run Python functional tests |
make style / make cpplint | Code style checks |
Red Hat build via Make:
make docker_build BASE_OS=redhatSupported BASE_OS values: ubuntu24, ubuntu22, redhat
Dockerfile stages
Both Dockerfile.ubuntu and Dockerfile.redhat use multi-stage builds:
| Stage | Purpose |
base_build | System dependencies, Boost, Azure SDK, OpenCV |
build | Bazel + OpenVINO setup, compiles OVMS (the -build container) |
capi-build | Builds C API shared library and examples |
pkg | Packages everything into a .tar.gz |
release | Minimal runtime image with entrypoint |
Windows builds
Windows builds use batch files in the repository root:
windows_install_build_dependencies.bat— Install build dependencies (MSVC 2022 Build Tools, etc.)windows_build.bat— Main build scriptwindows_test.bat— Run tests
Windows-specific Bazel config: --config=win_mp_on (Python support is always built; windows_create_package.bat --with_python optionally adds the embedded Python runtime to the ZIP).
Testing
Test setup
Before running tests, test models must be prepared:
make prepare_modelsModels are exported using the demos/common/export_models/export_model.py script (used internally by the test setup).
If LLM test models change (e.g., new model version, OpenVINO version change or config update), you may need to remove and regenerate the LLM test data:
rm -rf src/test/llm_testing
make prepare_modelsRunning tests
Running the full //src:ovms_test suite is time-consuming. During development, always run only the test fixtures relevant to your changes first using --test_filter:
bazel test --test_summary=detailed --test_output=streamed --test_filter="SuiteName.TestName" //src:ovms_testRun the full test suite only after the targeted tests pass.
Test structure
- Unit tests are in
src/test/— gtest-based C++ tests covering all server components - Test files follow the
*_test.cppnaming convention - Test utilities:
test_utils.hpp,light_test_utils.hpp,c_api_test_utils.hpp - Test models are stored in
src/test/subdirectories (e.g.,dummy/,passthrough/,summator/) - Specialized test areas:
src/test/llm/,src/test/mediapipe/,src/test/python/,src/test/embeddings/
Where files are headingNew Copilot instructions files have more rules about branches and pull requests, and fewer about code style.
Of the Copilot instructions files we read, the 2,297 first seen in the last six months, against the older ones: the kind of rule that gained most share, and the kind that lost most. About files like this in general, not this one, and an estimate, since a kind is a pattern in the words.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

