Platform OpenAI Spec

July 15, 2026 · View on GitHub

Generation

To generate the openapi.yaml files, the generator imports each FastAPI app in an isolated subprocess and calls its .openapi() method directly (no running server), then applies a series of schema fixes and validation passes.

To generate the updated OpenAPI schema, run:

uv run --frozen python -m script.generate_openapi_spec

Output layout

The generator no longer emits one spec per microservice and merges them. It now produces:

One aggregate platform spec, built from the platform runner (nmp.platform_runner.server:create_platform_openapi_app) with plugin services deliberately excluded (NEMO_PLUGIN_SERVICES_ALLOWLIST="" — see SERVICES in script/generate_openapi_spec.py). This aggregate covers the core platform services (entities, jobs, models, inference gateway, secrets, files, platform-common, etc.) and lands in:

FileContents
openapi/openapi.yamlFinal merged GA + EA platform spec
openapi/ga/openapi.yamlGA-only platform spec
openapi/ea/openapi.yamlEA-only platform spec
openapi/ga/individual/platform.openapi.yamlThe platform spec before GA/EA merge

One spec per opted-in plugin, written next to each plugin — never merged into the platform spec. A plugin opts in by declaring a [tool.nemo.openapi] table in its own pyproject.toml; discover_plugins() (script/openapi_helper/plugin_config.py) enumerates those, builds each plugin's FastAPI app via the convention loader (or a factory_override), and emits:

PluginOutput File
Agentsplugins/nemo-agents/openapi/openapi.yaml
Auditorplugins/nemo-auditor/openapi/openapi.yaml
Customizationplugins/nemo-customizer/openapi/openapi.yaml
Data Designerplugins/nemo-data-designer/openapi/openapi.yaml
Deploymentsplugins/nemo-deployments/openapi/openapi.yaml
Evaluatorplugins/nemo-evaluator/openapi/openapi.yaml
Safe Synthesizerplugins/nemo-safe-synthesizer/openapi/openapi.yaml

The Customization spec is assembled at generation time from whichever customization contributors (nemo.customization.contributors entry points — e.g. automodel, rl, unsloth) are installed in the workspace, so its route surface depends on the synced environment. To add a new plugin to this list, add an (empty is fine) [tool.nemo.openapi] table to its pyproject.toml; if the plugin has more than one nemo.services entry point, set service_name in that table to disambiguate.

The platform GA and EA specs are merged with the --keep-versions flag to preserve version information in the final openapi.yaml.

Conflicts

Currently, there are some conflicts between the schemas coming from different microservices, when they are overlapping types. Some are bugs, some need to be reconciled (one of the schemas is out of date). This will be fixed in the next releases. For now, when that happens, the schemas are duplicated, with a suffix.

Recursive Schemas

There are some recursive schemas that cause issues with the OpenAPI validator. These are currently fixed by removing the recursive reference and replacing it with a generic object.

Examples Integration

The OpenAPI specification includes example requests and responses for various endpoints. These examples are generated from the /openapi/api-examples files.

As a POC, the included files have been generated with an LLM(Cursor) to analyze and extract examples from the tool calling notebooks.

Currently, the examples are manually generated from notebooks. A robust system that automatically generates examples from all notebooks will be integrated in the future to ensure comprehensive and up-to-date API documentation.

NOTE

The aggregate platform spec is now generated directly from the platform runner (nmp.platform_runner.server), so it corresponds to what is actually mounted at runtime. Only the GA and EA variants of that single platform spec are merged; individual core services are no longer emitted and merged separately.