packages/contracts/non-json-openapi-responses.md
Scope: endpoints emitted by api/dev/generate_swagger_specs.py into the generated console, openapi, service, and web specs.
The current Flask-RESTX generator still emits these response entries under application/json. The schema model names below record the actual runtime response intent so contract generation does not treat them as missing annotations.
| Spec | Method | Path | Runtime response | Schema |
|---|---|---|---|---|
| console | POST | /apps/{app_id}/text-to-audio | Audio stream, usually audio/mpeg | AudioBinaryResponse |
| console | POST | /installed-apps/{installed_app_id}/text-to-audio | Audio stream, usually audio/mpeg | AudioBinaryResponse |
| console | POST | /trial-apps/{app_id}/text-to-audio | Audio stream, usually audio/mpeg | AudioBinaryResponse |
| web | POST | /text-to-audio | Audio stream, usually audio/mpeg | AudioBinaryResponse |
| service | POST | /text-to-audio | Audio stream, usually audio/mpeg | AudioBinaryResponse |
| console | POST | /datasets/{dataset_id}/documents/download-zip | application/zip attachment | BinaryFileResponse |
| service | POST | /datasets/{dataset_id}/documents/download-zip | application/zip attachment | BinaryFileResponse |
| service | GET | /files/{file_id}/preview | Original file MIME type, optionally attachment | BinaryFileResponse |
| console | GET | /workspaces/current/plugin/icon | Plugin asset MIME type | BinaryFileResponse |
| console | GET | /workspaces/current/plugin/asset | application/octet-stream | BinaryFileResponse |
| console | GET | /workspaces/current/tool-provider/builtin/{provider}/icon | Tool icon MIME type | BinaryFileResponse |
| console | GET | /workspaces/current/trigger-provider/{provider}/icon | Trigger icon response | BinaryFileResponse |
| console | GET | /workspaces/{tenant_id}/model-providers/{provider}/{icon_type}/{lang} | Model provider icon MIME type | BinaryFileResponse |
| Spec | Method | Path | Runtime response | Schema |
|---|---|---|---|---|
| console | GET | /apps/{app_id}/feedbacks/export | text/csv attachment by default; format=json returns JSON attachment | TextFileResponse |
| console | GET | /workspaces/current/customized-snippets/{snippet_id}/export | application/x-yaml attachment | TextFileResponse |
| Spec | Method | Path | Runtime response | Schema |
|---|---|---|---|---|
| console | GET | /workflow/{workflow_run_id}/events | text/event-stream | EventStreamResponse |
| console | GET | /apps/{app_id}/workflows/draft/runs/{run_id}/node-outputs/events | text/event-stream | EventStreamResponse |
| console | GET | /apps/{app_id}/workflows/published/runs/{run_id}/node-outputs/events | text/event-stream | EventStreamResponse |
| openapi | POST | /apps/{app_id}/run | text/event-stream | EventStreamResponse |
| openapi | GET | /apps/{app_id}/tasks/{task_id}/events | text/event-stream | EventStreamResponse |
| service | GET | /workflow/{task_id}/events | text/event-stream | EventStreamResponse |
| web | GET | /workflow/{task_id}/events | text/event-stream | EventStreamResponse |
These endpoints call helper.compact_generate_response(...). They return JSON in blocking mode and text/event-stream in streaming mode. Some console/debug paths always pass streaming=True.
| Spec | Method | Path | Streaming behavior | Schema |
|---|---|---|---|---|
| console | POST | /apps/{app_id}/completion-messages | response_mode=streaming | GeneratedAppResponse |
| console | POST | /apps/{app_id}/advanced-chat/workflows/draft/run | Always streaming | GeneratedAppResponse |
| console | POST | /apps/{app_id}/advanced-chat/workflows/draft/iteration/nodes/{node_id}/run | Always streaming | GeneratedAppResponse |
| console | POST | /apps/{app_id}/advanced-chat/workflows/draft/loop/nodes/{node_id}/run | Always streaming | GeneratedAppResponse |
| console | POST | /apps/{app_id}/workflows/draft/run | Always streaming | GeneratedAppResponse |
| console | POST | /apps/{app_id}/workflows/draft/iteration/nodes/{node_id}/run | Always streaming | GeneratedAppResponse |
| console | POST | /apps/{app_id}/workflows/draft/loop/nodes/{node_id}/run | Always streaming | GeneratedAppResponse |
| console | POST | /apps/{app_id}/workflows/draft/trigger/run | Returns waiting JSON until an event arrives; then streams workflow events | GeneratedAppResponse |
| console | POST | /apps/{app_id}/workflows/draft/trigger/run-all | Returns waiting JSON until an event arrives; then streams workflow events | GeneratedAppResponse |
| console | GET | /installed-apps/{installed_app_id}/messages/{message_id}/more-like-this | response_mode=streaming | GeneratedAppResponse |
| console | POST | /installed-apps/{installed_app_id}/completion-messages | response_mode=streaming | GeneratedAppResponse |
| console | POST | /installed-apps/{installed_app_id}/chat-messages | Always streaming | GeneratedAppResponse |
| console | POST | /installed-apps/{installed_app_id}/workflows/run | Always streaming | GeneratedAppResponse |
| console | POST | /trial-apps/{app_id}/chat-messages | Always streaming | GeneratedAppResponse |
| console | POST | /trial-apps/{app_id}/completion-messages | response_mode=streaming | GeneratedAppResponse |
| console | POST | /trial-apps/{app_id}/workflows/run | Always streaming | GeneratedAppResponse |
| console | POST | /snippets/{snippet_id}/workflows/draft/run | Always streaming | GeneratedAppResponse |
| console | POST | /snippets/{snippet_id}/workflows/draft/iteration/nodes/{node_id}/run | Always streaming | GeneratedAppResponse |
| console | POST | /snippets/{snippet_id}/workflows/draft/loop/nodes/{node_id}/run | Always streaming | GeneratedAppResponse |
| console | POST | /rag/pipelines/{pipeline_id}/workflows/draft/run | Always streaming | RagPipelineOpaqueResponse |
| console | POST | /rag/pipelines/{pipeline_id}/workflows/published/run | response_mode=streaming | RagPipelineOpaqueResponse |
| console | POST | /rag/pipelines/{pipeline_id}/workflows/draft/iteration/nodes/{node_id}/run | Always streaming | RagPipelineOpaqueResponse |
| console | POST | /rag/pipelines/{pipeline_id}/workflows/draft/loop/nodes/{node_id}/run | Always streaming | RagPipelineOpaqueResponse |
| console | POST | /rag/pipelines/{pipeline_id}/workflows/draft/datasource/nodes/{node_id}/run | Always streaming | RagPipelineOpaqueResponse |
| console | POST | /rag/pipelines/{pipeline_id}/workflows/published/datasource/nodes/{node_id}/run | Always streaming | RagPipelineOpaqueResponse |
| service | POST | /completion-messages | response_mode=streaming | GeneratedAppResponse |
| service | POST | /chat-messages | response_mode=streaming; agent apps are streaming-only | GeneratedAppResponse |
| service | POST | /workflows/run | response_mode=streaming | GeneratedAppResponse |
| service | POST | /workflows/{workflow_id}/run | response_mode=streaming | GeneratedAppResponse |
| service | POST | /datasets/{dataset_id}/pipeline/run | response_mode=streaming | GeneratedAppResponse |
| service | POST | /datasets/{dataset_id}/pipeline/datasource/nodes/{node_id}/run | Always streaming | GeneratedAppResponse |
| web | POST | /completion-messages | response_mode=streaming | GeneratedAppResponse |
| web | POST | /chat-messages | response_mode=streaming; agent apps are streaming-only | GeneratedAppResponse |
| web | GET | /messages/{message_id}/more-like-this | response_mode=streaming | GeneratedAppResponse |
| web | POST | /workflows/run | Always streaming | GeneratedAppResponse |
These console endpoints are browser redirect flows with no 2xx success response. They are documented in the backend OpenAPI as 302 responses with RedirectResponse, but openapi-ts.api.config.ts excludes 3xx-only operations from the oRPC contract input because they are not JSON contract operations.
| Spec | Method | Path | Runtime response | Schema |
|---|---|---|---|---|
| console | GET | /mcp/oauth/callback | Redirect to console OAuth result page | RedirectResponse |
| console | GET | /oauth/authorize/{provider} | Redirect to OAuth authorization URL | RedirectResponse |
| console | GET | /oauth/data-source/callback/{provider} | Redirect to console with data source OAuth result | RedirectResponse |
| console | GET | /oauth/login/{provider} | Redirect to OAuth authorization URL | RedirectResponse |
| console | GET | /oauth/plugin/{provider_id}/datasource/callback | Redirect to console OAuth callback page | RedirectResponse |
| console | GET | /oauth/plugin/{provider}/tool/callback | Redirect to console tool OAuth result page | RedirectResponse |
| console | GET | /oauth/plugin/{provider}/trigger/callback | Redirect to console trigger OAuth result page | RedirectResponse |