feat: opt-in static schema gen with legacy runtime fallback (#2800)
* fix: make static schema generation opt-in via COG_STATIC_SCHEMA env var
The static Go tree-sitter schema generator was the default for SDK >= 0.17.0,
which risks breaking builds when the parser encounters types it cannot resolve.
- Gate static schema gen behind COG_STATIC_SCHEMA=1 (or "true") env var
- Legacy runtime schema generation (boot container + python introspection)
remains the default
- When opted in, gracefully fall back to legacy on ErrUnresolvableType
instead of hard-failing the build
- Add unit tests for canUseStaticSchemaGen (12 table-driven cases)
- Add integration test for the static->legacy fallback path
- Update existing static/multi-file integration tests to set the env var
* docs: update schema architecture doc for opt-in static generation model
Reflect that static schema generation is opt-in via COG_STATIC_SCHEMA=1,
with legacy runtime path as the default and automatic fallback.
* fix: restore legacy runtime schema generation modules for fallback path
Restore the Python modules needed by the legacy runtime schema generation
path (python -m cog.command.openapi_schema). These were deleted in 61eedf3d
but are needed as the fallback when the static Go parser encounters types
it cannot resolve.
Restored modules: _adt, _inspector, _schemas, coder, config, errors, mode,
suppress_output, command/__init__, command/openapi_schema.
config.py is trimmed to only what openapi_schema.py needs (removed
get_predictor_types which depended on deleted get_predict/get_train).
* fix: simplify schema gen gating — let coglet handle missing schema for train/serve
Remove the skipLabels override that forced static schema gen for
cog train/serve paths. Now useStatic is purely opt-in via
COG_STATIC_SCHEMA=1 for all commands.
For train/serve without the env var, no schema is generated at
build time. Coglet gracefully handles this (warns and accepts all
input). These are local-only images that don't need strict schema
validation.
Also improves the static_schema_fallback integration test to use
a realistic mypackage/__init__.py scenario instead of a plain class.
* fix: restore static gen for train/serve paths, handle pydantic v2 in legacy inspector
Two IT failures:
1. training_setup: cog train needs schema for -i flag parsing. The CLI
fetches it from coglet's /openapi.json, which returns 503 when no
schema file exists. Re-enable static gen for skipLabels paths (same
as main) since there's no post-build legacy fallback for these.
2. pydantic2_output: the legacy runtime inspector (_inspector.py) didn't
handle pydantic v2 BaseModel as output types — only cog.BaseModel.
Add conditional pydantic.BaseModel check with model_fields iteration.
* fix: suppress pyright reportMissingImports for optional pydantic import
* fix: flatten nested error handling to early returns, case-insensitive env var check