Files
SonicForgeStudio/md/api_contract/openapi.json
T

7233 lines
140 KiB
JSON

{
"openapi": "3.1.0",
"info": {
"title": "ScoreFX API Engine",
"version": "0.1.0"
},
"paths": {
"/api/v1/audio/upload": {
"post": {
"tags": [
"audio"
],
"summary": "Upload Audio",
"operationId": "upload_audio_api_v1_audio_upload_post",
"parameters": [
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
}
],
"requestBody": {
"required": true,
"content": {
"multipart/form-data": {
"schema": {
"$ref": "#/components/schemas/Body_upload_audio_api_v1_audio_upload_post"
}
}
}
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/audio/edit": {
"post": {
"tags": [
"audio"
],
"summary": "Edit Audio",
"operationId": "edit_audio_api_v1_audio_edit_post",
"parameters": [
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/EditRequest"
}
}
}
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/audio/download/{file_id}": {
"get": {
"tags": [
"audio"
],
"summary": "Download Audio",
"operationId": "download_audio_api_v1_audio_download__file_id__get",
"parameters": [
{
"name": "file_id",
"in": "path",
"required": true,
"schema": {
"type": "string",
"title": "File Id"
}
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/audio/waveform/{file_id}": {
"get": {
"tags": [
"audio"
],
"summary": "Get Waveform",
"description": "API endpoint vẽ Peak Waveform đồng bộ (Week 2).\nTrả về dữ liệu peak waveform cho hiển thị đồ thị sóng âm trên Frontend.",
"operationId": "get_waveform_api_v1_audio_waveform__file_id__get",
"parameters": [
{
"name": "file_id",
"in": "path",
"required": true,
"schema": {
"type": "string",
"title": "File Id"
}
},
{
"name": "num_peaks",
"in": "query",
"required": false,
"schema": {
"type": "integer",
"maximum": 4000,
"minimum": 50,
"default": 800,
"title": "Num Peaks"
}
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/audio/waveform-rms/{file_id}": {
"get": {
"tags": [
"audio"
],
"summary": "Get Waveform Rms",
"description": "API endpoint vẽ RMS Waveform (mượt hơn peak).",
"operationId": "get_waveform_rms_api_v1_audio_waveform_rms__file_id__get",
"parameters": [
{
"name": "file_id",
"in": "path",
"required": true,
"schema": {
"type": "string",
"title": "File Id"
}
},
{
"name": "num_points",
"in": "query",
"required": false,
"schema": {
"type": "integer",
"maximum": 4000,
"minimum": 50,
"default": 800,
"title": "Num Points"
}
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/audio/analyze-ai": {
"post": {
"tags": [
"audio"
],
"summary": "Analyze Audio With Ai",
"description": "API endpoint phân tích cấu trúc khuôn nhạc bằng AI (Week 4).\nGọi OpenAI Compatible API (DeepSeek/Ollama) để phân đoạn bố cục.",
"operationId": "analyze_audio_with_ai_api_v1_audio_analyze_ai_post",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/AIAnalysisRequest"
}
}
},
"required": true
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/audio/export": {
"post": {
"tags": [
"audio"
],
"summary": "Export Audio",
"description": "API endpoint xuất tệp âm thanh sang nhiều định dạng (WAV/MP3/OGG).",
"operationId": "export_audio_api_v1_audio_export_post",
"parameters": [
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ExportRequest"
}
}
}
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/audio/export/midi": {
"post": {
"tags": [
"audio"
],
"summary": "Export Midi",
"operationId": "export_midi_api_v1_audio_export_midi_post",
"parameters": [
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/MidiExportRequest"
}
}
}
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/audio/ai-scan": {
"post": {
"tags": [
"audio"
],
"summary": "Ai Scan Audio",
"description": "17_AI_SCAN.md Feature 1: AI Loop Scan & Automated Marker Labeling.\nUses AIDSPEngine to find optimal recurring loop region with zero-crossing alignment.",
"operationId": "ai_scan_audio_api_v1_audio_ai_scan_post",
"parameters": [
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/AIScanRequest"
}
}
}
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/audio/ai-cut": {
"post": {
"tags": [
"audio"
],
"summary": "Ai Cut Audio",
"description": "17_AI_SCAN.md Feature 2: Fade-Free AI Cut (Zero-Crossing Aligned Slicing).\nExecutes raw binary sample slice at exact zero-crossing coordinates.",
"operationId": "ai_cut_audio_api_v1_audio_ai_cut_post",
"parameters": [
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/AICutRequest"
}
}
}
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/audio/python-tool": {
"post": {
"tags": [
"audio"
],
"summary": "Run Python Dsp Tool",
"description": "Non-AI Python DSP Tools endpoint.\nHandles normalize peak, invert phase, swap channels, zero-crossing align, and synth wave generation.",
"operationId": "run_python_dsp_tool_api_v1_audio_python_tool_post",
"parameters": [
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PythonToolRequest"
}
}
}
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/audio/my-files": {
"post": {
"tags": [
"audio"
],
"summary": "List User Files",
"operationId": "list_user_files_api_v1_audio_my_files_post",
"parameters": [
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
},
{
"name": "x-auth-token",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Auth-Token"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/MyFilesRequest"
}
}
}
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/audio/reference-analyze": {
"post": {
"tags": [
"audio"
],
"summary": "Analyze Reference",
"description": "Gap 11: A/B reference track - analyze LUFS/dBTP/centroid of a\nreference file (local path from media/browse, or uploaded file_id),\nreturn compare metrics + playback url for the A/B toggle.",
"operationId": "analyze_reference_api_v1_audio_reference_analyze_post",
"parameters": [
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ReferenceAnalyzeRequest"
}
}
}
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/audio/my-files/{file_id}": {
"delete": {
"tags": [
"audio"
],
"summary": "Delete User File",
"operationId": "delete_user_file_api_v1_audio_my_files__file_id__delete",
"parameters": [
{
"name": "file_id",
"in": "path",
"required": true,
"schema": {
"type": "string",
"title": "File Id"
}
},
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
},
{
"name": "x-auth-token",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Auth-Token"
}
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/audio/tasks/{task_id}": {
"get": {
"tags": [
"tasks"
],
"summary": "Get Task Status",
"operationId": "get_task_status_api_v1_audio_tasks__task_id__get",
"parameters": [
{
"name": "task_id",
"in": "path",
"required": true,
"schema": {
"type": "string",
"title": "Task Id"
}
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/multitrack/mix": {
"post": {
"tags": [
"multitrack"
],
"summary": "Mix Multitrack Session",
"description": "API endpoint để xử lý hòa âm đa kênh (Multitrack Mixdown).\nNhận cấu hình JSON từ Client và gửi task xuống Celery Worker.",
"operationId": "mix_multitrack_session_api_v1_multitrack_mix_post",
"parameters": [
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/MultitrackSessionRequest"
}
}
}
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/multitrack/process-session": {
"post": {
"tags": [
"multitrack"
],
"summary": "Process Session",
"description": "API endpoint để xử lý toàn bộ session với nhiều tracks và clips.\nXử lý từng clip, sau đó hòa âm tất cả tracks lại với nhau.",
"operationId": "process_session_api_v1_multitrack_process_session_post",
"parameters": [
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/MultitrackSessionRequest"
}
}
}
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/auth/login": {
"post": {
"tags": [
"auth"
],
"summary": "Login",
"operationId": "login_api_v1_auth_login_post",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/LoginRequest"
}
}
},
"required": true
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/auth/local": {
"post": {
"tags": [
"auth"
],
"summary": "Local Login",
"description": "Auto-login standalone: chỉ cho phép từ loopback (máy chạy engine).\nClient LAN nhận 403 → buộc đăng nhập mật khẩu qua /login.",
"operationId": "local_login_api_v1_auth_local_post",
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
}
}
}
},
"/api/v1/auth/register": {
"post": {
"tags": [
"auth"
],
"summary": "Register",
"operationId": "register_api_v1_auth_register_post",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/RegisterRequest"
}
}
},
"required": true
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/auth/change-password": {
"post": {
"tags": [
"auth"
],
"summary": "Change Password",
"operationId": "change_password_api_v1_auth_change_password_post",
"parameters": [
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
},
{
"name": "x-auth-token",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Auth-Token"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ChangePasswordRequest"
}
}
}
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/auth/profile": {
"get": {
"tags": [
"auth"
],
"summary": "Get Profile",
"operationId": "get_profile_api_v1_auth_profile_get",
"parameters": [
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
},
{
"name": "x-auth-token",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Auth-Token"
}
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/auth/first-time": {
"get": {
"tags": [
"auth"
],
"summary": "Auth First Time",
"operationId": "auth_first_time_api_v1_auth_first_time_get",
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
}
}
}
},
"/api/v1/admin/users": {
"get": {
"tags": [
"admin"
],
"summary": "List Users",
"operationId": "list_users_api_v1_admin_users_get",
"parameters": [
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
},
{
"name": "x-auth-token",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Auth-Token"
}
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
},
"post": {
"tags": [
"admin"
],
"summary": "Create User",
"operationId": "create_user_api_v1_admin_users_post",
"parameters": [
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
},
{
"name": "x-auth-token",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Auth-Token"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CreateUserRequest"
}
}
}
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/admin/users/{user_id}/role": {
"put": {
"tags": [
"admin"
],
"summary": "Update User Role",
"operationId": "update_user_role_api_v1_admin_users__user_id__role_put",
"parameters": [
{
"name": "user_id",
"in": "path",
"required": true,
"schema": {
"type": "string",
"title": "User Id"
}
},
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
},
{
"name": "x-auth-token",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Auth-Token"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/UpdateUserRoleRequest"
}
}
}
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/admin/quotas/{user_id}": {
"put": {
"tags": [
"admin"
],
"summary": "Update User Quota",
"operationId": "update_user_quota_api_v1_admin_quotas__user_id__put",
"parameters": [
{
"name": "user_id",
"in": "path",
"required": true,
"schema": {
"type": "string",
"title": "User Id"
}
},
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
},
{
"name": "x-auth-token",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Auth-Token"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/UpdateUserQuotaRequest"
}
}
}
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/admin/users/{user_id}": {
"delete": {
"tags": [
"admin"
],
"summary": "Delete User",
"operationId": "delete_user_api_v1_admin_users__user_id__delete",
"parameters": [
{
"name": "user_id",
"in": "path",
"required": true,
"schema": {
"type": "string",
"title": "User Id"
}
},
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
},
{
"name": "x-auth-token",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Auth-Token"
}
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/projects/temp": {
"post": {
"tags": [
"projects"
],
"summary": "Save Temp Project",
"operationId": "save_temp_project_api_v1_projects_temp_post",
"parameters": [
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SaveTempProjectRequest"
}
}
}
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
},
"get": {
"tags": [
"projects"
],
"summary": "Get Temp Project",
"operationId": "get_temp_project_api_v1_projects_temp_get",
"parameters": [
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/projects/temp/revision": {
"get": {
"tags": [
"projects"
],
"summary": "Temp Project Revision",
"description": "Revision nhẹ của bản temp: updated_at + client_id — frontend poll 2-3s\nđể realtime sync giữa LAN browser và Tauri standalone (không tải full\ndata_json mỗi lần). client_id = client ghi bản cuối → client khác bỏ qua\nbản do CHÍNH NÓ ghi (chống ping-pong).",
"operationId": "temp_project_revision_api_v1_projects_temp_revision_get",
"parameters": [
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/projects/save-to-disk": {
"post": {
"tags": [
"projects"
],
"summary": "Save Project To Disk",
"description": "Ctrl-S trên desktop: lưu project ra THƯ MỤC CỦA HỆ ĐIỀU HÀNH\n(Documents/SonicForgeDAW/Projects — bản desktop). Docker/headless KHÔNG\ndùng endpoint này (frontend lưu Cloud). Auth optional — desktop có thể\nchưa login.",
"operationId": "save_project_to_disk_api_v1_projects_save_to_disk_post",
"parameters": [
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SaveProjectRequest"
}
}
}
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/projects/disk": {
"get": {
"tags": [
"projects"
],
"summary": "List Disk Projects",
"description": "Danh sách file Ctrl-S desktop (Documents/SonicForgeDAW/Projects),\nmới nhất trước. Auth optional.",
"operationId": "list_disk_projects_api_v1_projects_disk_get",
"parameters": [
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/projects/disk/{filename}": {
"get": {
"tags": [
"projects"
],
"summary": "Get Disk Project",
"description": "Đọc nội dung 1 file dự án trên đĩa (mở lại sau khi restart).",
"operationId": "get_disk_project_api_v1_projects_disk__filename__get",
"parameters": [
{
"name": "filename",
"in": "path",
"required": true,
"schema": {
"type": "string",
"title": "Filename"
}
},
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/projects/cloud": {
"post": {
"tags": [
"projects"
],
"summary": "Save Cloud Project",
"operationId": "save_cloud_project_api_v1_projects_cloud_post",
"parameters": [
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
},
{
"name": "x-auth-token",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Auth-Token"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SaveProjectRequest"
}
}
}
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
},
"get": {
"tags": [
"projects"
],
"summary": "List Cloud Projects",
"operationId": "list_cloud_projects_api_v1_projects_cloud_get",
"parameters": [
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
},
{
"name": "x-auth-token",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Auth-Token"
}
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/projects/cloud/{project_id}": {
"get": {
"tags": [
"projects"
],
"summary": "Get Cloud Project",
"operationId": "get_cloud_project_api_v1_projects_cloud__project_id__get",
"parameters": [
{
"name": "project_id",
"in": "path",
"required": true,
"schema": {
"type": "string",
"title": "Project Id"
}
},
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
},
{
"name": "x-auth-token",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Auth-Token"
}
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
},
"delete": {
"tags": [
"projects"
],
"summary": "Delete Cloud Project",
"operationId": "delete_cloud_project_api_v1_projects_cloud__project_id__delete",
"parameters": [
{
"name": "project_id",
"in": "path",
"required": true,
"schema": {
"type": "string",
"title": "Project Id"
}
},
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
},
{
"name": "x-auth-token",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Auth-Token"
}
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
},
"put": {
"tags": [
"projects"
],
"summary": "Update Cloud Project",
"operationId": "update_cloud_project_api_v1_projects_cloud__project_id__put",
"parameters": [
{
"name": "project_id",
"in": "path",
"required": true,
"schema": {
"type": "string",
"title": "Project Id"
}
},
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
},
{
"name": "x-auth-token",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Auth-Token"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SaveProjectRequest"
}
}
}
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/projects/cloud/{project_id}/backup": {
"post": {
"tags": [
"projects"
],
"summary": "Create Project Backup",
"operationId": "create_project_backup_api_v1_projects_cloud__project_id__backup_post",
"parameters": [
{
"name": "project_id",
"in": "path",
"required": true,
"schema": {
"type": "string",
"title": "Project Id"
}
},
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
},
{
"name": "x-auth-token",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Auth-Token"
}
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/projects/cloud/{project_id}/backups": {
"get": {
"tags": [
"projects"
],
"summary": "List Project Backups",
"operationId": "list_project_backups_api_v1_projects_cloud__project_id__backups_get",
"parameters": [
{
"name": "project_id",
"in": "path",
"required": true,
"schema": {
"type": "string",
"title": "Project Id"
}
},
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
},
{
"name": "x-auth-token",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Auth-Token"
}
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/projects/cloud/backups/{backup_id}": {
"delete": {
"tags": [
"projects"
],
"summary": "Delete Project Backup",
"operationId": "delete_project_backup_api_v1_projects_cloud_backups__backup_id__delete",
"parameters": [
{
"name": "backup_id",
"in": "path",
"required": true,
"schema": {
"type": "string",
"title": "Backup Id"
}
},
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
},
{
"name": "x-auth-token",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Auth-Token"
}
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/projects/cloud/backups/cleanup": {
"post": {
"tags": [
"projects"
],
"summary": "Cleanup All Backups",
"operationId": "cleanup_all_backups_api_v1_projects_cloud_backups_cleanup_post",
"parameters": [
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
},
{
"name": "x-auth-token",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Auth-Token"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CleanupBackupsRequest"
}
}
}
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/projects/cloud/{project_id}/render": {
"post": {
"tags": [
"projects"
],
"summary": "Render Project Endpoint",
"operationId": "render_project_endpoint_api_v1_projects_cloud__project_id__render_post",
"parameters": [
{
"name": "project_id",
"in": "path",
"required": true,
"schema": {
"type": "string",
"title": "Project Id"
}
},
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
},
{
"name": "x-auth-token",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Auth-Token"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/RenderProjectRequest"
}
}
}
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/user/preferences": {
"get": {
"tags": [
"user_config"
],
"summary": "Get User Preferences",
"operationId": "get_user_preferences_api_v1_user_preferences_get",
"parameters": [
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
},
"post": {
"tags": [
"user_config"
],
"summary": "Save User Preferences",
"operationId": "save_user_preferences_api_v1_user_preferences_post",
"parameters": [
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SavePreferencesRequest"
}
}
}
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/user/config/ai": {
"get": {
"tags": [
"user_config"
],
"summary": "Get User Ai Config",
"operationId": "get_user_ai_config_api_v1_user_config_ai_get",
"parameters": [
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
},
"post": {
"tags": [
"user_config"
],
"summary": "Save User Ai Config",
"operationId": "save_user_ai_config_api_v1_user_config_ai_post",
"parameters": [
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SaveAIConfigRequest"
}
}
}
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/ai/proxy": {
"post": {
"tags": [
"ai"
],
"summary": "Proxy Llm",
"operationId": "proxy_llm_api_v1_ai_proxy_post",
"parameters": [
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
},
{
"name": "x-auth-token",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Auth-Token"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ProxyRequest"
}
}
}
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/ai/presets": {
"get": {
"tags": [
"ai"
],
"summary": "List Presets",
"operationId": "list_presets_api_v1_ai_presets_get",
"parameters": [
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
},
"post": {
"tags": [
"ai"
],
"summary": "Save Preset",
"operationId": "save_preset_api_v1_ai_presets_post",
"parameters": [
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/AIPresetSchema"
}
}
}
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/ai/presets/{preset_id}": {
"delete": {
"tags": [
"ai"
],
"summary": "Delete Preset",
"operationId": "delete_preset_api_v1_ai_presets__preset_id__delete",
"parameters": [
{
"name": "preset_id",
"in": "path",
"required": true,
"schema": {
"type": "string",
"title": "Preset Id"
}
},
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/plugins/dirs": {
"get": {
"tags": [
"plugins"
],
"summary": "Get Plugin Dirs",
"operationId": "get_plugin_dirs_api_v1_plugins_dirs_get",
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
}
}
},
"post": {
"tags": [
"plugins"
],
"summary": "Save Plugin Dirs",
"operationId": "save_plugin_dirs_api_v1_plugins_dirs_post",
"parameters": [
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
},
{
"name": "x-auth-token",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Auth-Token"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/DirsRequest"
}
}
}
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/plugins/scan": {
"post": {
"tags": [
"plugins"
],
"summary": "Scan Plugin Dirs",
"description": "Scan các dir hiệu lực (env + user override): cập nhật catalog\nsoundfont (inspector/scanner) + liệt kê VST. Trả về danh sách riêng rẽ\nVST (vst_found) + SoundFont (soundfonts) theo từng thư mục user khai báo.",
"operationId": "scan_plugin_dirs_api_v1_plugins_scan_post",
"parameters": [
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
},
{
"name": "x-auth-token",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Auth-Token"
}
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/plugins/available": {
"get": {
"tags": [
"plugins"
],
"summary": "List Plugins",
"operationId": "list_plugins_api_v1_plugins_available_get",
"parameters": [
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
},
{
"name": "x-auth-token",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Auth-Token"
}
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/plugins/pick-dir": {
"post": {
"tags": [
"plugins"
],
"summary": "Pick Plugin Directory",
"description": "Mở NATIVE folder picker. Không cần auth (desktop local, chỉ mở dialog).\nTrả {\"path\": \"<thư mục>\"} hoặc {\"path\": None} (hủy/không có dialog).\nĐịnh nghĩa def (sync) → FastAPI chạy trong threadpool — không block loop\ntrong lúc user chọn thư mục (có thể mất phút).",
"operationId": "pick_plugin_directory_api_v1_plugins_pick_dir_post",
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
}
}
}
},
"/api/v1/plugins/default-soundfonts": {
"get": {
"tags": [
"plugins"
],
"summary": "List Default Soundfonts",
"operationId": "list_default_soundfonts_api_v1_plugins_default_soundfonts_get",
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
}
}
}
},
"/api/v1/plugins/soundfonts/catalog": {
"get": {
"tags": [
"plugins"
],
"summary": "Soundfont Catalog",
"operationId": "soundfont_catalog_api_v1_plugins_soundfonts_catalog_get",
"parameters": [
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
},
{
"name": "x-auth-token",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Auth-Token"
}
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/plugins/soundfont-instruments/{sf_id}": {
"get": {
"tags": [
"plugins"
],
"summary": "List Soundfont Instruments",
"operationId": "list_soundfont_instruments_api_v1_plugins_soundfont_instruments__sf_id__get",
"parameters": [
{
"name": "sf_id",
"in": "path",
"required": true,
"schema": {
"type": "string",
"title": "Sf Id"
}
},
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
},
{
"name": "x-auth-token",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Auth-Token"
}
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/plugins/upload-soundfont": {
"post": {
"tags": [
"plugins"
],
"summary": "Upload Soundfont",
"operationId": "upload_soundfont_api_v1_plugins_upload_soundfont_post",
"parameters": [
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
},
{
"name": "x-auth-token",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Auth-Token"
}
}
],
"requestBody": {
"required": true,
"content": {
"multipart/form-data": {
"schema": {
"$ref": "#/components/schemas/Body_upload_soundfont_api_v1_plugins_upload_soundfont_post"
}
}
}
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/plugins/soundfont/{sf_id}": {
"delete": {
"tags": [
"plugins"
],
"summary": "Delete Soundfont",
"operationId": "delete_soundfont_api_v1_plugins_soundfont__sf_id__delete",
"parameters": [
{
"name": "sf_id",
"in": "path",
"required": true,
"schema": {
"type": "string",
"title": "Sf Id"
}
},
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
},
{
"name": "x-auth-token",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Auth-Token"
}
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/plugins/soundfonts/download/{sf_id}": {
"get": {
"tags": [
"plugins"
],
"summary": "Download Soundfont Asset",
"operationId": "download_soundfont_asset_api_v1_plugins_soundfonts_download__sf_id__get",
"parameters": [
{
"name": "sf_id",
"in": "path",
"required": true,
"schema": {
"type": "string",
"title": "Sf Id"
}
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/plugins/fx-gui": {
"post": {
"tags": [
"plugins"
],
"summary": "Open Fx Gui",
"description": "Mở native GUI của VST FX (mastering chain / FX rack) qua bridge.\n\nBridge có mode `--open-fx-gui <job.json>` (Windows): spawn tiến trình riêng\ngiữ vòng lặp message pump, tạo window 800x600 + attach IPlugView của plugin.\nĐây là GUI tách rời — user chỉnh thông số, đóng window là bridge thoát\n(exit 0). Không spawn 2 lần cho cùng plugin đang mở (tránh trùng GUI).",
"operationId": "open_fx_gui_api_v1_plugins_fx_gui_post",
"parameters": [
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
},
{
"name": "x-auth-token",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Auth-Token"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/FxGuiRequest"
}
}
}
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/plugins/fx-gui/close": {
"post": {
"tags": [
"plugins"
],
"summary": "Close Fx Gui",
"description": "Đóng bridge fx-gui đang chạy cho plugin (embed mode) — frontend gọi khi\nuser đóng panel embed. Không lỗi nếu plugin chưa mở (closed=False).",
"operationId": "close_fx_gui_api_v1_plugins_fx_gui_close_post",
"parameters": [
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
},
{
"name": "x-auth-token",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Auth-Token"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/FxGuiCloseRequest"
}
}
}
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/plugins/fx-gui/hide": {
"post": {
"tags": [
"plugins"
],
"summary": "Hide Fx Gui",
"description": "Ẩn GUI native (ed.hide — giữ editor + instance, mở lại nhanh). Chỉ\náp dụng editor in-process fxrt; GUI spawn mode (HTTP bridge) tự có /hide\nriêng — trả applied=False không lỗi.",
"operationId": "hide_fx_gui_api_v1_plugins_fx_gui_hide_post",
"parameters": [
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
},
{
"name": "x-auth-token",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Auth-Token"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/FxGuiNativeRequest"
}
}
}
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/plugins/fx-gui/show": {
"post": {
"tags": [
"plugins"
],
"summary": "Show Fx Gui",
"description": "Hiện lại GUI native (ed.show).",
"operationId": "show_fx_gui_api_v1_plugins_fx_gui_show_post",
"parameters": [
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
},
{
"name": "x-auth-token",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Auth-Token"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/FxGuiNativeRequest"
}
}
}
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/plugins/fx-gui/rect": {
"post": {
"tags": [
"plugins"
],
"summary": "Fx Gui Rect",
"description": "M7: anchor PluginWindow native vào rect panel embed (SetWindowPos phía\nC++ khi rect đổi — mirror FxGuiServer /show của float/embed). Frontend đo\nrect panel mỗi 250ms và gửi; chỉ áp dụng editor in-process fxrt — GUI spawn\nmode (HTTP bridge) tự có /show riêng, trả applied=False không lỗi.",
"operationId": "fx_gui_rect_api_v1_plugins_fx_gui_rect_post",
"parameters": [
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
},
{
"name": "x-auth-token",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Auth-Token"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/FxGuiRectRequest"
}
}
}
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/plugins/preview": {
"post": {
"tags": [
"plugins"
],
"summary": "Preview Instrument",
"description": "Quick-render preview VSTi (âm thật, cùng code path với export).",
"operationId": "preview_instrument_api_v1_plugins_preview_post",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PreviewRequest"
}
}
},
"required": true
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/plugins/midi-render": {
"post": {
"tags": [
"plugins"
],
"summary": "Midi Render",
"description": "Export MIDI notes → WAV với âm của VSTi instrument (lưu vào processed).\n\nPreview/export MIDI notes với âm VSTi trước đây KHÔNG thực hiện được:\n- preview realtime chỉ phát qua loa hệ thống (không vào audio graph DAW)\n- clientSideExport chỉ render soundfont (midiCache = FluidSynth WASM)\n- /plugins/preview có sẵn nhưng frontend không gọi\nEndpoint này render offline bằng pedalboard (đúng plugin + preset như\nexport) → trả file_id để UI preview / gán clip vào project / download.",
"operationId": "midi_render_api_v1_plugins_midi_render_post",
"parameters": [
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
},
{
"name": "x-auth-token",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Auth-Token"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/MidiRenderRequest"
}
}
}
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/plugins/fx": {
"get": {
"tags": [
"plugins"
],
"summary": "List Fx Plugins",
"description": "List VST effect plugins (is_fx) — native_bridge --scan trên các dir.\n\nChỉ plugin VST3 effect (Ozone, Scaler Audio, ...); instrument/VST2 bị\nbridge loại. refresh=true → quét lại (Plugins Manager → Scan).",
"operationId": "list_fx_plugins_api_v1_plugins_fx_get",
"parameters": [
{
"name": "refresh",
"in": "query",
"required": false,
"schema": {
"type": "boolean",
"default": false,
"title": "Refresh"
}
},
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
},
{
"name": "x-auth-token",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Auth-Token"
}
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/plugins/fx-render": {
"post": {
"tags": [
"plugins"
],
"summary": "Fx Render",
"description": "Áp fx_chain lên WAV đầu vào → WAV mới trong PROCESSED_DIR.",
"operationId": "fx_render_api_v1_plugins_fx_render_post",
"parameters": [
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
},
{
"name": "x-auth-token",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Auth-Token"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/FxRenderRequest"
}
}
}
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/plugins/fx-realtime/start": {
"post": {
"tags": [
"plugins"
],
"summary": "Fx Realtime Start",
"description": "Start bridge realtime FX loop + SHM. Client mở WS /ws/fx-realtime/{id}\n(token qua query param 'token' hoặc Authorization Bearer) rồi gửi block\nstereo float32 interleaved (block_size*2 float = 2048B), nhận block đã xử lý.",
"operationId": "fx_realtime_start_api_v1_plugins_fx_realtime_start_post",
"parameters": [
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
},
{
"name": "x-auth-token",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Auth-Token"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/FxRealtimeStartRequest"
}
}
}
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/plugins/fx-realtime/stop": {
"post": {
"tags": [
"plugins"
],
"summary": "Fx Realtime Stop",
"description": "Dừng session realtime (running=0 → bridge thoát, SHM unlink).",
"operationId": "fx_realtime_stop_api_v1_plugins_fx_realtime_stop_post",
"parameters": [
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
},
{
"name": "x-auth-token",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Auth-Token"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/FxRealtimeStopRequest"
}
}
}
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/plugins/fx-realtime/set-chain": {
"post": {
"tags": [
"plugins"
],
"summary": "Fx Realtime Set Chain",
"description": "Cập nhật chain trên session realtime ĐANG CHẠY — KHÔNG restart session.\nEngine ghi lại job file (seq++); bridge poll seq → RealtimeFxChain::setChain\n(worker load chain mới, swap atomic dưới mutex — audio thread copy\nshared_ptr, không dừng) → load/đổi VST FX + đổi preset GUI không ngắt âm/\ncrackle. Session/WS/SHM giữ nguyên.",
"operationId": "fx_realtime_set_chain_api_v1_plugins_fx_realtime_set_chain_post",
"parameters": [
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
},
{
"name": "x-auth-token",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Auth-Token"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/FxRealtimeSetChainRequest"
}
}
}
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/plugins/soundfont-render": {
"post": {
"tags": [
"plugins"
],
"summary": "Soundfont Render",
"description": "Preview/play MIDI notes bằng âm soundfont thật — native FluidSynth trên OS.\n\nKhác FluidSynthWASM (docker): âm render server-side bằng pyfluidsynth, trả\nWAV để client play. Dùng cho: preview/keyboard, play MIDI item khi chạy\ntransport ở môi trường standalone.",
"operationId": "soundfont_render_api_v1_plugins_soundfont_render_post",
"parameters": [
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
},
{
"name": "x-auth-token",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Auth-Token"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SoundfontRenderRequest"
}
}
}
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/plugins/render": {
"post": {
"tags": [
"plugins"
],
"summary": "Render Project",
"operationId": "render_project_api_v1_plugins_render_post",
"parameters": [
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
},
{
"name": "x-auth-token",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Auth-Token"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/RenderRequest"
}
}
}
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/plugins/bridge/status": {
"get": {
"tags": [
"plugins"
],
"summary": "Bridge Status",
"description": "E1: trạng thái native bridge. Rust ghi bridge_status (JSON) khi spawn/\nhealth-check; nếu chưa có → probe tail bridge.log (dòng started/exists).",
"operationId": "bridge_status_api_v1_plugins_bridge_status_get",
"parameters": [
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
},
{
"name": "x-auth-token",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Auth-Token"
}
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/plugins/bridge/load": {
"post": {
"tags": [
"plugins"
],
"summary": "Bridge Load",
"description": "E2: resolve path thật của asset rồi (a) ghi bridge_load.request cho Rust\nwatcher (nếu có) và (b) trả path để JS gọi invoke load_native_instrument\ntrực tiếp — pipeline hoạt động ngay, không chờ watcher.",
"operationId": "bridge_load_api_v1_plugins_bridge_load_post",
"parameters": [
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
},
{
"name": "x-auth-token",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Auth-Token"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/BridgeLoadRequest"
}
}
}
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/plugins/bridge/log": {
"get": {
"tags": [
"plugins"
],
"summary": "Bridge Log",
"description": "E5: tail bridge.log cho UI debug. Log Rust ghi tại %APPDATA%/SonicForgeDAW/logs/bridge.log.",
"operationId": "bridge_log_api_v1_plugins_bridge_log_get",
"parameters": [
{
"name": "lines",
"in": "query",
"required": false,
"schema": {
"type": "integer",
"maximum": 2000,
"minimum": 1,
"default": 100,
"title": "Lines"
}
},
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
},
{
"name": "x-auth-token",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Auth-Token"
}
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/plugins/bridge/gui": {
"post": {
"tags": [
"plugins"
],
"summary": "Bridge Gui",
"description": "E6: mở native GUI VSTi trên máy chạy server — fallback cho browser LAN\nkhông có Tauri. Pipeline giống invoke open_vst_gui: LOAD_INSTRUMENT rồi\nOPEN_GUI qua SHM daw_vst_bridge.",
"operationId": "bridge_gui_api_v1_plugins_bridge_gui_post",
"parameters": [
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
},
{
"name": "x-auth-token",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Auth-Token"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/BridgeGuiRequest"
}
}
}
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/files/save-dialog": {
"post": {
"tags": [
"files"
],
"summary": "Save File Dialog",
"description": "Mở NATIVE Save As dialog. Không cần auth (desktop local, chỉ mở dialog).\nTrả {\"path\": \"<đường dẫn user chọn>\"} hoặc {\"path\": None} (hủy/không có\ndialog). def (sync) → FastAPI chạy threadpool — không block loop.",
"operationId": "save_file_dialog_api_v1_files_save_dialog_post",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SaveDialogRequest"
}
}
},
"required": true
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/files/write": {
"post": {
"tags": [
"files"
],
"summary": "Write Export File",
"description": "Ghi bytes đã export vào đường dẫn tuyệt đối user chọn qua save dialog.\nTrả {\"path\": ..., \"bytes\": N} — frontend toast kèm đường dẫn thật.",
"operationId": "write_export_file_api_v1_files_write_post",
"requestBody": {
"content": {
"multipart/form-data": {
"schema": {
"$ref": "#/components/schemas/Body_write_export_file_api_v1_files_write_post"
}
}
},
"required": true
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/media/computer": {
"get": {
"tags": [
"media"
],
"summary": "List Computer Roots",
"description": "Liệt kê các ổ đĩa / mount point thật của máy (My Computer).",
"operationId": "list_computer_roots_api_v1_media_computer_get",
"parameters": [
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
},
{
"name": "x-auth-token",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Auth-Token"
}
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/media/browse": {
"get": {
"tags": [
"media"
],
"summary": "Browse Directory",
"description": "Liệt kê nội dung một thư mục trên máy: thư mục con + file audio/MIDI.",
"operationId": "browse_directory_api_v1_media_browse_get",
"parameters": [
{
"name": "path",
"in": "query",
"required": true,
"schema": {
"type": "string",
"title": "Path"
}
},
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
},
{
"name": "x-auth-token",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Auth-Token"
}
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/media/file": {
"get": {
"tags": [
"media"
],
"summary": "Serve Local File",
"description": "Phục vụ file audio/MIDI cục bộ để preview.",
"operationId": "serve_local_file_api_v1_media_file_get",
"parameters": [
{
"name": "path",
"in": "query",
"required": true,
"schema": {
"type": "string",
"title": "Path"
}
},
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
},
{
"name": "x-auth-token",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Auth-Token"
}
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/system/capabilities": {
"get": {
"tags": [
"system"
],
"summary": "Get Capabilities",
"description": "Khả năng của môi trường hiện tại (public — cần trước khi đăng nhập).\n\n- runtime: \"desktop\" (server + client cùng 1 máy Windows/macOS) |\n \"headless\" (docker server + browser UI)\n- features.preset_upload: luôn True (upload .vstpreset qua web UI)\n- features.preview_mode: \"quick_render\" (pedalboard render clip ngắn —\n âm thật giống export) | \"wasm\" (Preview Synth trong browser)",
"operationId": "get_capabilities_api_v1_system_capabilities_get",
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
}
}
}
},
"/api/v1/presets": {
"get": {
"tags": [
"presets"
],
"summary": "List Presets",
"description": "Danh sách preset trong thư viện (public — frontend cần trước login).",
"operationId": "list_presets_api_v1_presets_get",
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
}
}
}
},
"/api/v1/presets/upload": {
"post": {
"tags": [
"presets"
],
"summary": "Upload Preset",
"description": "Upload preset (.vstpreset / .fxp / .fxb / .dspreset) vào thư viện.",
"operationId": "upload_preset_api_v1_presets_upload_post",
"parameters": [
{
"name": "plugin_hint",
"in": "query",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Plugin Hint"
}
},
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
},
{
"name": "x-auth-token",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Auth-Token"
}
}
],
"requestBody": {
"required": true,
"content": {
"multipart/form-data": {
"schema": {
"$ref": "#/components/schemas/Body_upload_preset_api_v1_presets_upload_post"
}
}
}
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/presets/{preset_id}/download": {
"get": {
"tags": [
"presets"
],
"summary": "Download Preset",
"operationId": "download_preset_api_v1_presets__preset_id__download_get",
"parameters": [
{
"name": "preset_id",
"in": "path",
"required": true,
"schema": {
"type": "string",
"title": "Preset Id"
}
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/api/v1/presets/{preset_id}": {
"delete": {
"tags": [
"presets"
],
"summary": "Delete Preset",
"operationId": "delete_preset_api_v1_presets__preset_id__delete",
"parameters": [
{
"name": "preset_id",
"in": "path",
"required": true,
"schema": {
"type": "string",
"title": "Preset Id"
}
},
{
"name": "authorization",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Authorization"
}
},
{
"name": "x-auth-token",
"in": "header",
"required": false,
"schema": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "X-Auth-Token"
}
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/health": {
"get": {
"summary": "Health",
"operationId": "health_health_get",
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
}
}
}
},
"/": {
"get": {
"summary": "Get Index",
"operationId": "get_index__get",
"responses": {
"200": {
"description": "Successful Response",
"content": {
"text/html": {
"schema": {
"type": "string"
}
}
}
}
}
}
},
"/favicon.svg": {
"get": {
"summary": "Get Favicon",
"operationId": "get_favicon_favicon_svg_get",
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
}
}
}
},
"/ai-prompt-generator": {
"get": {
"summary": "Get Ai Prompt Generator",
"operationId": "get_ai_prompt_generator_ai_prompt_generator_get",
"responses": {
"200": {
"description": "Successful Response",
"content": {
"text/html": {
"schema": {
"type": "string"
}
}
}
}
}
}
}
},
"components": {
"schemas": {
"AIAnalysisRequest": {
"properties": {
"file_id": {
"type": "string",
"title": "File Id"
},
"api_base_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Api Base Url"
},
"model": {
"type": "string",
"title": "Model",
"default": "deepseek-chat"
}
},
"type": "object",
"required": [
"file_id"
],
"title": "AIAnalysisRequest"
},
"AICutRequest": {
"properties": {
"source_track_id": {
"type": "string",
"title": "Source Track Id"
},
"file_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "File Id"
},
"selection_start": {
"type": "number",
"title": "Selection Start"
},
"selection_end": {
"type": "number",
"title": "Selection End"
}
},
"type": "object",
"required": [
"source_track_id",
"selection_start",
"selection_end"
],
"title": "AICutRequest"
},
"AIPresetSchema": {
"properties": {
"id": {
"type": "string",
"title": "Id"
},
"name": {
"type": "string",
"title": "Name"
},
"keywords": {
"items": {
"type": "string"
},
"type": "array",
"title": "Keywords"
},
"category": {
"type": "string",
"title": "Category",
"default": "General"
},
"default_bars": {
"type": "integer",
"title": "Default Bars",
"default": 8
},
"default_bpm": {
"type": "integer",
"title": "Default Bpm",
"default": 120
},
"default_scale": {
"type": "string",
"title": "Default Scale",
"default": "C Major"
},
"system_instruction_template": {
"type": "string",
"title": "System Instruction Template"
},
"is_user_defined": {
"type": "boolean",
"title": "Is User Defined",
"default": true
},
"is_favorite": {
"type": "boolean",
"title": "Is Favorite",
"default": false
},
"created_at": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Created At"
}
},
"type": "object",
"required": [
"id",
"name",
"keywords",
"system_instruction_template"
],
"title": "AIPresetSchema"
},
"AIProviderSetting": {
"properties": {
"id": {
"type": "string",
"title": "Id"
},
"name": {
"type": "string",
"title": "Name"
},
"provider_type": {
"type": "string",
"title": "Provider Type"
},
"api_base_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Api Base Url",
"default": "https://api.openai.com/v1"
},
"api_key": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Api Key",
"default": ""
},
"model_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Model Name",
"default": "gpt-4o"
},
"temperature": {
"type": "number",
"title": "Temperature",
"default": 0.7
},
"is_active": {
"type": "boolean",
"title": "Is Active",
"default": true
}
},
"type": "object",
"required": [
"id",
"name",
"provider_type"
],
"title": "AIProviderSetting"
},
"AIScanRequest": {
"properties": {
"track_id": {
"type": "string",
"title": "Track Id"
},
"file_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "File Id"
},
"min_loop_duration": {
"type": "number",
"title": "Min Loop Duration",
"default": 2.0
},
"max_loop_duration": {
"type": "number",
"title": "Max Loop Duration",
"default": 6.0
}
},
"type": "object",
"required": [
"track_id"
],
"title": "AIScanRequest"
},
"Body_upload_audio_api_v1_audio_upload_post": {
"properties": {
"file": {
"type": "string",
"contentMediaType": "application/octet-stream",
"title": "File"
}
},
"type": "object",
"required": [
"file"
],
"title": "Body_upload_audio_api_v1_audio_upload_post"
},
"Body_upload_preset_api_v1_presets_upload_post": {
"properties": {
"file": {
"type": "string",
"contentMediaType": "application/octet-stream",
"title": "File"
}
},
"type": "object",
"required": [
"file"
],
"title": "Body_upload_preset_api_v1_presets_upload_post"
},
"Body_upload_soundfont_api_v1_plugins_upload_soundfont_post": {
"properties": {
"file": {
"type": "string",
"contentMediaType": "application/octet-stream",
"title": "File"
}
},
"type": "object",
"required": [
"file"
],
"title": "Body_upload_soundfont_api_v1_plugins_upload_soundfont_post"
},
"Body_write_export_file_api_v1_files_write_post": {
"properties": {
"path": {
"type": "string",
"title": "Path"
},
"file": {
"type": "string",
"contentMediaType": "application/octet-stream",
"title": "File"
}
},
"type": "object",
"required": [
"path",
"file"
],
"title": "Body_write_export_file_api_v1_files_write_post"
},
"BridgeGuiRequest": {
"properties": {
"name": {
"type": "string",
"title": "Name"
},
"path": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Path"
},
"instrumentType": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Instrumenttype"
},
"channel": {
"type": "integer",
"title": "Channel",
"default": 0
}
},
"type": "object",
"required": [
"name"
],
"title": "BridgeGuiRequest"
},
"BridgeLoadRequest": {
"properties": {
"name": {
"type": "string",
"title": "Name"
},
"path": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Path"
},
"instrumentType": {
"type": "string",
"title": "Instrumenttype",
"default": "SF2"
},
"channel": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Channel"
}
},
"type": "object",
"required": [
"name"
],
"title": "BridgeLoadRequest"
},
"ChangePasswordRequest": {
"properties": {
"old_password": {
"type": "string",
"title": "Old Password"
},
"new_password": {
"type": "string",
"title": "New Password"
}
},
"type": "object",
"required": [
"old_password",
"new_password"
],
"title": "ChangePasswordRequest"
},
"CleanupBackupsRequest": {
"properties": {
"keep": {
"type": "integer",
"title": "Keep",
"default": 10
}
},
"type": "object",
"title": "CleanupBackupsRequest"
},
"ClipConfig": {
"properties": {
"clip_id": {
"type": "string",
"title": "Clip Id"
},
"start_time_seconds": {
"type": "number",
"title": "Start Time Seconds"
},
"end_time_seconds": {
"type": "number",
"title": "End Time Seconds"
},
"loop_count": {
"type": "integer",
"title": "Loop Count",
"default": 1
},
"apply_zero_crossing": {
"type": "boolean",
"title": "Apply Zero Crossing",
"default": true
},
"fade_in_ms": {
"type": "integer",
"title": "Fade In Ms",
"default": 150
},
"fade_out_ms": {
"type": "integer",
"title": "Fade Out Ms",
"default": 150
}
},
"type": "object",
"required": [
"clip_id",
"start_time_seconds",
"end_time_seconds"
],
"title": "ClipConfig"
},
"CreateUserRequest": {
"properties": {
"username": {
"type": "string",
"title": "Username"
},
"email": {
"type": "string",
"title": "Email"
},
"password": {
"type": "string",
"title": "Password"
},
"role": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Role",
"default": "standard"
}
},
"type": "object",
"required": [
"username",
"email",
"password"
],
"title": "CreateUserRequest"
},
"DirsRequest": {
"properties": {
"vst_dir": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Vst Dir"
},
"soundfont_dir": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Soundfont Dir"
},
"plugin_dirs": {
"anyOf": [
{
"items": {},
"type": "array"
},
{
"type": "null"
}
],
"title": "Plugin Dirs"
}
},
"type": "object",
"title": "DirsRequest"
},
"EditRequest": {
"properties": {
"file_id": {
"type": "string",
"title": "File Id"
},
"cut_start_ms": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"title": "Cut Start Ms"
},
"cut_end_ms": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"title": "Cut End Ms"
},
"zero_crossing_align": {
"type": "boolean",
"title": "Zero Crossing Align",
"default": true
},
"loop_count": {
"type": "integer",
"title": "Loop Count",
"default": 1
},
"fade_in_ms": {
"type": "number",
"title": "Fade In Ms",
"default": 0.0
},
"fade_out_ms": {
"type": "number",
"title": "Fade Out Ms",
"default": 0.0
},
"volume_change_db": {
"type": "number",
"title": "Volume Change Db",
"default": 0.0
}
},
"type": "object",
"required": [
"file_id"
],
"title": "EditRequest"
},
"ExportRequest": {
"properties": {
"file_id": {
"type": "string",
"title": "File Id"
},
"format": {
"type": "string",
"title": "Format",
"default": "wav"
},
"sample_rate": {
"type": "integer",
"title": "Sample Rate",
"default": 44100
},
"bit_depth": {
"type": "integer",
"title": "Bit Depth",
"default": 16
}
},
"type": "object",
"required": [
"file_id"
],
"title": "ExportRequest"
},
"ExportSettings": {
"properties": {
"sample_rate": {
"type": "integer",
"title": "Sample Rate",
"default": 44100
},
"bit_depth": {
"type": "integer",
"title": "Bit Depth",
"default": 16
},
"format": {
"type": "string",
"title": "Format",
"default": "wav"
}
},
"type": "object",
"title": "ExportSettings"
},
"FxGuiCloseRequest": {
"properties": {
"path": {
"type": "string",
"title": "Path"
}
},
"type": "object",
"required": [
"path"
],
"title": "FxGuiCloseRequest",
"description": "Đóng bridge fx-gui đã mở cho plugin (embed mode)."
},
"FxGuiNativeRequest": {
"properties": {
"path": {
"type": "string",
"title": "Path"
}
},
"type": "object",
"required": [
"path"
],
"title": "FxGuiNativeRequest",
"description": "Hide/Show GUI native (editor instance DSP trong session fxrt)."
},
"FxGuiRectBody": {
"properties": {
"x": {
"type": "integer",
"title": "X",
"default": 0
},
"y": {
"type": "integer",
"title": "Y",
"default": 0
},
"w": {
"type": "integer",
"title": "W",
"default": 0
},
"h": {
"type": "integer",
"title": "H",
"default": 0
}
},
"type": "object",
"title": "FxGuiRectBody",
"description": "Rect màn hình (px vật lý, gốc trên-trái; x/y âm = màn hình trái)."
},
"FxGuiRectRequest": {
"properties": {
"path": {
"type": "string",
"title": "Path"
},
"rect": {
"$ref": "#/components/schemas/FxGuiRectBody",
"default": {
"x": 0,
"y": 0,
"w": 0,
"h": 0
}
}
},
"type": "object",
"required": [
"path"
],
"title": "FxGuiRectRequest",
"description": "M7: anchor rect cho GUI native — rect panel nơi GUI embed xuất hiện."
},
"FxGuiRequest": {
"properties": {
"path": {
"type": "string",
"title": "Path"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Name"
},
"embed": {
"type": "boolean",
"title": "Embed",
"default": false
},
"shm": {
"type": "string",
"title": "Shm",
"default": ""
},
"preset_b64": {
"type": "string",
"title": "Preset B64",
"default": ""
},
"master": {
"type": "boolean",
"title": "Master",
"default": false
}
},
"type": "object",
"required": [
"path"
],
"title": "FxGuiRequest",
"description": "Mở native GUI của VST FX qua bridge (Windows desktop)."
},
"FxRealtimeSetChainRequest": {
"properties": {
"session_id": {
"type": "string",
"title": "Session Id",
"default": ""
},
"fx_chain": {
"items": {},
"type": "array",
"title": "Fx Chain",
"default": []
}
},
"type": "object",
"title": "FxRealtimeSetChainRequest"
},
"FxRealtimeStartRequest": {
"properties": {
"fx_chain": {
"items": {},
"type": "array",
"title": "Fx Chain",
"default": []
},
"sample_rate": {
"type": "integer",
"title": "Sample Rate",
"default": 44100
}
},
"type": "object",
"title": "FxRealtimeStartRequest",
"description": "Start một session FX realtime (master chain qua fx_vst_bridge\n--realtime-fx + SHM ring). Trả session_id để client mở WebSocket\n/ws/fx-realtime/{session_id} đẩy/kéo block audio."
},
"FxRealtimeStopRequest": {
"properties": {
"session_id": {
"type": "string",
"title": "Session Id",
"default": ""
}
},
"type": "object",
"title": "FxRealtimeStopRequest"
},
"FxRenderRequest": {
"properties": {
"input_file_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Input File Id"
},
"input_path": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Input Path"
},
"fx_chain": {
"items": {},
"type": "array",
"title": "Fx Chain",
"default": []
},
"sample_rate": {
"type": "integer",
"title": "Sample Rate",
"default": 44100
}
},
"type": "object",
"title": "FxRenderRequest",
"description": "Render WAV qua chuỗi FX (VST3 effect + builtin gain/normalize).\n\nDùng cho masterbus (render xong project → Ozone trên bus) và FX Rack\nper-track (preview offline qua bridge; realtime vẫn WebAudio)."
},
"HTTPValidationError": {
"properties": {
"detail": {
"items": {
"$ref": "#/components/schemas/ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
},
"LoginRequest": {
"properties": {
"username": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Username",
"default": "admin"
},
"password": {
"type": "string",
"title": "Password"
}
},
"type": "object",
"required": [
"password"
],
"title": "LoginRequest"
},
"MidiExportRequest": {
"properties": {
"bpm": {
"type": "number",
"title": "Bpm",
"default": 120.0
},
"ppq": {
"type": "integer",
"title": "Ppq",
"default": 480
},
"tracks": {
"items": {
"$ref": "#/components/schemas/MidiExportTrackModel"
},
"type": "array",
"title": "Tracks",
"default": []
}
},
"type": "object",
"title": "MidiExportRequest"
},
"MidiExportTrackModel": {
"properties": {
"name": {
"type": "string",
"title": "Name",
"default": "Track"
},
"notes": {
"items": {
"$ref": "#/components/schemas/MidiNoteModel"
},
"type": "array",
"title": "Notes",
"default": []
}
},
"type": "object",
"title": "MidiExportTrackModel"
},
"MidiNoteModel": {
"properties": {
"pitch": {
"type": "integer",
"title": "Pitch",
"default": 60
},
"start_beat": {
"type": "number",
"title": "Start Beat",
"default": 0.0
},
"duration_beats": {
"type": "number",
"title": "Duration Beats",
"default": 1.0
},
"velocity": {
"type": "number",
"title": "Velocity",
"default": 0.8
}
},
"type": "object",
"title": "MidiNoteModel"
},
"MidiRenderRequest": {
"properties": {
"instrument_id": {
"type": "string",
"title": "Instrument Id"
},
"notes": {
"items": {},
"type": "array",
"title": "Notes",
"default": []
},
"bpm": {
"type": "number",
"title": "Bpm",
"default": 120.0
},
"sample_rate": {
"type": "integer",
"title": "Sample Rate",
"default": 44100
},
"preset_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Preset Id"
},
"preset_path": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Preset Path"
},
"preset_data": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Preset Data"
}
},
"type": "object",
"required": [
"instrument_id"
],
"title": "MidiRenderRequest",
"description": "Render MIDI notes → audio qua VSTi (âm thật, cùng code path với export).\n\ninstrument_id = plugin_id của track synth_engine (khớp key scan của\nPluginManager). Đây là cầu nối preset → pedalboard: preset chỉnh trong\nnative GUI (.vstpreset) được áp vào pedalboard trước khi render."
},
"MultitrackSessionRequest": {
"properties": {
"session_id": {
"type": "string",
"title": "Session Id"
},
"export_settings": {
"$ref": "#/components/schemas/ExportSettings"
},
"tracks": {
"items": {
"$ref": "#/components/schemas/TrackConfig"
},
"type": "array",
"title": "Tracks"
}
},
"type": "object",
"required": [
"session_id",
"export_settings",
"tracks"
],
"title": "MultitrackSessionRequest"
},
"MyFilesRequest": {
"properties": {
"active_file_ids": {
"items": {
"type": "string"
},
"type": "array",
"title": "Active File Ids",
"default": []
}
},
"type": "object",
"title": "MyFilesRequest"
},
"PreviewRequest": {
"properties": {
"instrument_id": {
"type": "string",
"title": "Instrument Id"
},
"notes": {
"items": {},
"type": "array",
"title": "Notes",
"default": []
},
"bpm": {
"type": "number",
"title": "Bpm",
"default": 120.0
},
"sample_rate": {
"type": "integer",
"title": "Sample Rate",
"default": 44100
},
"soundfont_bank": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Soundfont Bank",
"default": 0
},
"soundfont_program": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Soundfont Program",
"default": 0
},
"preset_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Preset Id"
},
"preset_path": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Preset Path"
},
"preset_data": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Preset Data"
}
},
"type": "object",
"required": [
"instrument_id"
],
"title": "PreviewRequest",
"description": "Quick-render preview: pedalboard render clip ngắn bằng ĐÚNG plugin +\npreset (cùng code path với export) → trả wav để browser phát.\nÂm preview = âm export (khác Preview Synth WASM hiện tại)."
},
"ProxyRequest": {
"properties": {
"url": {
"type": "string",
"title": "Url"
},
"headers": {
"additionalProperties": {
"type": "string"
},
"type": "object",
"title": "Headers",
"default": {}
},
"body": {
"additionalProperties": true,
"type": "object",
"title": "Body",
"default": {}
}
},
"type": "object",
"required": [
"url"
],
"title": "ProxyRequest"
},
"PythonToolRequest": {
"properties": {
"tool_type": {
"type": "string",
"title": "Tool Type"
},
"track_id": {
"type": "string",
"title": "Track Id"
},
"file_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "File Id"
},
"time_pos": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"title": "Time Pos",
"default": 0.0
},
"freq": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"title": "Freq",
"default": 440.0
},
"duration": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"title": "Duration",
"default": 2.0
},
"wave_type": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Wave Type",
"default": "sine"
}
},
"type": "object",
"required": [
"tool_type",
"track_id"
],
"title": "PythonToolRequest"
},
"ReferenceAnalyzeRequest": {
"properties": {
"path": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Path"
},
"file_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "File Id"
}
},
"type": "object",
"title": "ReferenceAnalyzeRequest"
},
"RegisterRequest": {
"properties": {
"username": {
"type": "string",
"title": "Username"
},
"email": {
"type": "string",
"title": "Email"
},
"password": {
"type": "string",
"title": "Password"
}
},
"type": "object",
"required": [
"username",
"email",
"password"
],
"title": "RegisterRequest"
},
"RenderProjectRequest": {
"properties": {
"sample_rate": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Sample Rate",
"default": 44100
},
"metadata": {
"anyOf": [
{
"additionalProperties": true,
"type": "object"
},
{
"type": "null"
}
],
"title": "Metadata"
}
},
"type": "object",
"title": "RenderProjectRequest"
},
"RenderRequest": {
"properties": {
"project_json": {
"additionalProperties": true,
"type": "object",
"title": "Project Json"
},
"output_filename": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Output Filename",
"default": "render_output.wav"
},
"bit_depth": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Bit Depth",
"default": 32
},
"sample_rate": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Sample Rate",
"default": 0
},
"dither": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Dither",
"default": false
},
"normalize": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Normalize",
"default": false
},
"normalize_target": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Normalize Target",
"default": "-1dbtp"
},
"mono_check": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Mono Check",
"default": false
},
"metadata": {
"anyOf": [
{
"additionalProperties": true,
"type": "object"
},
{
"type": "null"
}
],
"title": "Metadata"
}
},
"type": "object",
"required": [
"project_json"
],
"title": "RenderRequest"
},
"SaveAIConfigRequest": {
"properties": {
"providers": {
"items": {
"$ref": "#/components/schemas/AIProviderSetting"
},
"type": "array",
"title": "Providers"
}
},
"type": "object",
"required": [
"providers"
],
"title": "SaveAIConfigRequest"
},
"SaveDialogRequest": {
"properties": {
"default_name": {
"type": "string",
"title": "Default Name",
"default": "untitled"
},
"filter_name": {
"type": "string",
"title": "Filter Name",
"default": "File"
},
"filter_ext": {
"type": "string",
"title": "Filter Ext",
"default": "bin"
}
},
"type": "object",
"title": "SaveDialogRequest"
},
"SavePreferencesRequest": {
"properties": {
"preferences": {
"additionalProperties": true,
"type": "object",
"title": "Preferences"
}
},
"type": "object",
"required": [
"preferences"
],
"title": "SavePreferencesRequest"
},
"SaveProjectRequest": {
"properties": {
"name": {
"type": "string",
"title": "Name"
},
"data_json": {
"type": "string",
"title": "Data Json"
}
},
"type": "object",
"required": [
"name",
"data_json"
],
"title": "SaveProjectRequest"
},
"SaveTempProjectRequest": {
"properties": {
"data_json": {
"type": "string",
"title": "Data Json"
},
"client_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Client Id"
}
},
"type": "object",
"required": [
"data_json"
],
"title": "SaveTempProjectRequest"
},
"SoundfontRenderRequest": {
"properties": {
"soundfont_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Soundfont Id"
},
"soundfont_path": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Soundfont Path"
},
"bank": {
"type": "integer",
"title": "Bank",
"default": 0
},
"program": {
"type": "integer",
"title": "Program",
"default": 0
},
"notes": {
"items": {},
"type": "array",
"title": "Notes",
"default": []
},
"bpm": {
"type": "number",
"title": "Bpm",
"default": 120.0
},
"sample_rate": {
"type": "integer",
"title": "Sample Rate",
"default": 44100
}
},
"type": "object",
"title": "SoundfontRenderRequest",
"description": "Render MIDI notes → WAV bằng soundfont THẬT qua native FluidSynth\n(pyfluidsynth) — luồng âm instrument cho môi trường STANDALONE (xử lí\ntrực tiếp trên OS; docker dùng FluidSynthWASM ở client)."
},
"TrackConfig": {
"properties": {
"track_id": {
"type": "string",
"title": "Track Id"
},
"file_id": {
"type": "string",
"title": "File Id"
},
"volume": {
"type": "number",
"title": "Volume",
"default": 1.0
},
"muted": {
"type": "boolean",
"title": "Muted",
"default": false
},
"clips": {
"items": {
"$ref": "#/components/schemas/ClipConfig"
},
"type": "array",
"title": "Clips",
"default": []
}
},
"type": "object",
"required": [
"track_id",
"file_id"
],
"title": "TrackConfig"
},
"UpdateUserQuotaRequest": {
"properties": {
"storage_limit_mb": {
"type": "integer",
"title": "Storage Limit Mb"
},
"max_tracks": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Max Tracks",
"default": 16
}
},
"type": "object",
"required": [
"storage_limit_mb"
],
"title": "UpdateUserQuotaRequest"
},
"UpdateUserRoleRequest": {
"properties": {
"role": {
"type": "string",
"title": "Role"
},
"is_active": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Is Active",
"default": true
}
},
"type": "object",
"required": [
"role"
],
"title": "UpdateUserRoleRequest"
},
"ValidationError": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
},
"input": {
"title": "Input"
},
"ctx": {
"type": "object",
"title": "Context"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
}
}
}
}