From f52cc1b96ac9d89bd801b86b12bfed30eecd1fea Mon Sep 17 00:00:00 2001 From: localai-org-maint-bot Date: Fri, 2 Oct 2026 23:59:13 +0200 Subject: [PATCH] feat(swagger): update swagger (#12433) Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: mudler <2420543+mudler@users.noreply.github.com> --- swagger/docs.go | 195 +++++++++++++++++------------- swagger/swagger.json | 195 +++++++++++++++++------------- swagger/swagger.yaml | 279 ++++++++++++++++++++++--------------------- 3 files changed, 364 insertions(+), 305 deletions(-) diff --git a/swagger/docs.go b/swagger/docs.go index f155d5283..cce42189e 100644 --- a/swagger/docs.go +++ b/swagger/docs.go @@ -2909,6 +2909,7 @@ const docTemplate = `{ }, "/v1/audio/diarization": { "post": { + "description": "JSON accepts model, file (raw base64 audio), include_text, include_speaker_profiles and response_format. Profiles require voice-recognition permission and json or verbose_json; unsupported backends return 501.", "consumes": [ "multipart/form-data", "application/json" @@ -2934,7 +2935,7 @@ const docTemplate = `{ }, { "type": "integer", - "description": "exact speaker count (>0 forces; 0 = auto)", + "description": "exact speaker count (\u003e0 forces; 0 = auto)", "name": "num_speakers", "in": "formData" }, @@ -2974,6 +2975,12 @@ const docTemplate = `{ "name": "language", "in": "formData" }, + { + "type": "boolean", + "description": "export portable biometric profiles (voice-recognition permission; JSON formats only)", + "name": "include_speaker_profiles", + "in": "formData" + }, { "type": "boolean", "description": "include per-segment transcript when the backend supports it", @@ -2985,12 +2992,6 @@ const docTemplate = `{ "description": "json (default), verbose_json, or rttm", "name": "response_format", "in": "formData" - }, - { - "type": "boolean", - "description": "Export portable biometric profiles; requires voice-recognition permission. Omitted by default.", - "name": "include_speaker_profiles", - "in": "formData" } ], "responses": { @@ -3000,8 +3001,7 @@ const docTemplate = `{ "$ref": "#/definitions/schema.DiarizationResult" } } - }, - "description": "JSON accepts model, file (raw base64 audio), include_text, include_speaker_profiles and response_format. Profiles require voice-recognition permission and json or verbose_json; unsupported backends return 501." + } } }, "/v1/audio/speech": { @@ -4206,6 +4206,7 @@ const docTemplate = `{ }, "/v1/voice/register": { "post": { + "description": "Supply either audio or speaker_profiles plus an explicit numeric speaker_slot. The selected model must expose matching trusted encoder metadata for portable enrollment. Registrations are global and ephemeral, with a fresh ID for each request.", "tags": [ "voice-recognition" ], @@ -4228,8 +4229,7 @@ const docTemplate = `{ "$ref": "#/definitions/schema.VoiceRegisterResponse" } } - }, - "description": "Supply either audio or speaker_profiles plus an explicit numeric speaker_slot. The selected model must expose matching trusted encoder metadata for portable enrollment. Registrations are global and ephemeral, with a fresh ID for each request." + } } }, "/v1/voice/verify": { @@ -4337,73 +4337,6 @@ const docTemplate = `{ } }, "definitions": { - "schema.SpeakerProfiles": { - "type": "object", - "properties": { - "version": { - "type": "integer" - }, - "encoder": { - "$ref": "#/definitions/schema.SpeakerEncoder" - }, - "speakers": { - "type": "array", - "items": { - "$ref": "#/definitions/schema.SpeakerProfile" - } - } - } - }, - "schema.SpeakerProfile": { - "type": "object", - "properties": { - "speaker": { - "type": "integer", - "description": "Raw numeric slot matching the decimal segment/summary label, not SPEAKER_NN." - }, - "clean_duration": { - "type": "number" - }, - "intervals": { - "type": "array", - "items": { - "$ref": "#/definitions/schema.SpeakerProfileInterval" - } - }, - "unavailable_reason": { - "type": "string", - "x-nullable": true - }, - "embedding": { - "type": "array", - "items": { - "type": "number" - } - } - } - }, - "schema.SpeakerProfileInterval": { - "type": "object", - "properties": { - "start": { - "type": "number" - }, - "end": { - "type": "number" - } - } - }, - "schema.SpeakerEncoder": { - "type": "object", - "properties": { - "identity": { - "type": "string" - }, - "dimension": { - "type": "integer" - } - } - }, "config.Gallery": { "type": "object", "properties": { @@ -5342,12 +5275,32 @@ const docTemplate = `{ } } }, + "proto.SpeakerEncoder": { + "type": "object", + "properties": { + "dimension": { + "type": "integer" + }, + "identity": { + "description": "sha256 of loaded GGUF bytes", + "type": "string" + } + } + }, "proto.StatusResponse": { "type": "object", "properties": { "memory": { "$ref": "#/definitions/proto.MemoryUsageData" }, + "speaker_encoder": { + "description": "trusted metadata from the loaded server encoder, never request data", + "allOf": [ + { + "$ref": "#/definitions/proto.SpeakerEncoder" + } + ] + }, "state": { "$ref": "#/definitions/proto.StatusResponse_State" } @@ -5904,6 +5857,9 @@ const docTemplate = `{ "$ref": "#/definitions/schema.DiarizationSegment" } }, + "speaker_profiles": { + "$ref": "#/definitions/schema.SpeakerProfiles" + }, "speakers": { "type": "array", "items": { @@ -5912,9 +5868,6 @@ const docTemplate = `{ }, "task": { "type": "string" - }, - "speaker_profiles": { - "$ref": "#/definitions/schema.SpeakerProfiles" } } }, @@ -7571,6 +7524,12 @@ const docTemplate = `{ "ignore_eos": { "type": "boolean" }, + "include_speaker_profiles": { + "type": "boolean" + }, + "include_text": { + "type": "boolean" + }, "input": {}, "instruction": { "description": "Edit endpoint", @@ -8242,6 +8201,71 @@ const docTemplate = `{ } } }, + "schema.SpeakerEncoder": { + "type": "object", + "properties": { + "dimension": { + "type": "integer" + }, + "identity": { + "type": "string" + } + } + }, + "schema.SpeakerProfile": { + "type": "object", + "properties": { + "clean_duration": { + "type": "number" + }, + "embedding": { + "type": "array", + "items": { + "type": "number" + } + }, + "intervals": { + "type": "array", + "items": { + "$ref": "#/definitions/schema.SpeakerProfileInterval" + } + }, + "speaker": { + "type": "integer" + }, + "unavailable_reason": { + "type": "string" + } + } + }, + "schema.SpeakerProfileInterval": { + "type": "object", + "properties": { + "end": { + "type": "number" + }, + "start": { + "type": "number" + } + } + }, + "schema.SpeakerProfiles": { + "type": "object", + "properties": { + "encoder": { + "$ref": "#/definitions/schema.SpeakerEncoder" + }, + "speakers": { + "type": "array", + "items": { + "$ref": "#/definitions/schema.SpeakerProfile" + } + }, + "version": { + "type": "integer" + } + } + }, "schema.StreamOptions": { "type": "object", "properties": { @@ -8976,15 +9000,14 @@ const docTemplate = `{ "name": { "type": "string" }, - "store": { - "type": "string" - }, "speaker_profiles": { "$ref": "#/definitions/schema.SpeakerProfiles" }, "speaker_slot": { - "type": "integer", - "description": "Required with speaker_profiles, mutually exclusive with audio; explicit raw numeric speaker slot." + "type": "integer" + }, + "store": { + "type": "string" } } }, diff --git a/swagger/swagger.json b/swagger/swagger.json index dd5380831..6f1467a6a 100644 --- a/swagger/swagger.json +++ b/swagger/swagger.json @@ -2906,6 +2906,7 @@ }, "/v1/audio/diarization": { "post": { + "description": "JSON accepts model, file (raw base64 audio), include_text, include_speaker_profiles and response_format. Profiles require voice-recognition permission and json or verbose_json; unsupported backends return 501.", "consumes": [ "multipart/form-data", "application/json" @@ -2931,7 +2932,7 @@ }, { "type": "integer", - "description": "exact speaker count (>0 forces; 0 = auto)", + "description": "exact speaker count (\u003e0 forces; 0 = auto)", "name": "num_speakers", "in": "formData" }, @@ -2971,6 +2972,12 @@ "name": "language", "in": "formData" }, + { + "type": "boolean", + "description": "export portable biometric profiles (voice-recognition permission; JSON formats only)", + "name": "include_speaker_profiles", + "in": "formData" + }, { "type": "boolean", "description": "include per-segment transcript when the backend supports it", @@ -2982,12 +2989,6 @@ "description": "json (default), verbose_json, or rttm", "name": "response_format", "in": "formData" - }, - { - "type": "boolean", - "description": "Export portable biometric profiles; requires voice-recognition permission. Omitted by default.", - "name": "include_speaker_profiles", - "in": "formData" } ], "responses": { @@ -2997,8 +2998,7 @@ "$ref": "#/definitions/schema.DiarizationResult" } } - }, - "description": "JSON accepts model, file (raw base64 audio), include_text, include_speaker_profiles and response_format. Profiles require voice-recognition permission and json or verbose_json; unsupported backends return 501." + } } }, "/v1/audio/speech": { @@ -4203,6 +4203,7 @@ }, "/v1/voice/register": { "post": { + "description": "Supply either audio or speaker_profiles plus an explicit numeric speaker_slot. The selected model must expose matching trusted encoder metadata for portable enrollment. Registrations are global and ephemeral, with a fresh ID for each request.", "tags": [ "voice-recognition" ], @@ -4225,8 +4226,7 @@ "$ref": "#/definitions/schema.VoiceRegisterResponse" } } - }, - "description": "Supply either audio or speaker_profiles plus an explicit numeric speaker_slot. The selected model must expose matching trusted encoder metadata for portable enrollment. Registrations are global and ephemeral, with a fresh ID for each request." + } } }, "/v1/voice/verify": { @@ -4334,73 +4334,6 @@ } }, "definitions": { - "schema.SpeakerProfiles": { - "type": "object", - "properties": { - "version": { - "type": "integer" - }, - "encoder": { - "$ref": "#/definitions/schema.SpeakerEncoder" - }, - "speakers": { - "type": "array", - "items": { - "$ref": "#/definitions/schema.SpeakerProfile" - } - } - } - }, - "schema.SpeakerProfile": { - "type": "object", - "properties": { - "speaker": { - "type": "integer", - "description": "Raw numeric slot matching the decimal segment/summary label, not SPEAKER_NN." - }, - "clean_duration": { - "type": "number" - }, - "intervals": { - "type": "array", - "items": { - "$ref": "#/definitions/schema.SpeakerProfileInterval" - } - }, - "unavailable_reason": { - "type": "string", - "x-nullable": true - }, - "embedding": { - "type": "array", - "items": { - "type": "number" - } - } - } - }, - "schema.SpeakerProfileInterval": { - "type": "object", - "properties": { - "start": { - "type": "number" - }, - "end": { - "type": "number" - } - } - }, - "schema.SpeakerEncoder": { - "type": "object", - "properties": { - "identity": { - "type": "string" - }, - "dimension": { - "type": "integer" - } - } - }, "config.Gallery": { "type": "object", "properties": { @@ -5339,12 +5272,32 @@ } } }, + "proto.SpeakerEncoder": { + "type": "object", + "properties": { + "dimension": { + "type": "integer" + }, + "identity": { + "description": "sha256 of loaded GGUF bytes", + "type": "string" + } + } + }, "proto.StatusResponse": { "type": "object", "properties": { "memory": { "$ref": "#/definitions/proto.MemoryUsageData" }, + "speaker_encoder": { + "description": "trusted metadata from the loaded server encoder, never request data", + "allOf": [ + { + "$ref": "#/definitions/proto.SpeakerEncoder" + } + ] + }, "state": { "$ref": "#/definitions/proto.StatusResponse_State" } @@ -5901,6 +5854,9 @@ "$ref": "#/definitions/schema.DiarizationSegment" } }, + "speaker_profiles": { + "$ref": "#/definitions/schema.SpeakerProfiles" + }, "speakers": { "type": "array", "items": { @@ -5909,9 +5865,6 @@ }, "task": { "type": "string" - }, - "speaker_profiles": { - "$ref": "#/definitions/schema.SpeakerProfiles" } } }, @@ -7568,6 +7521,12 @@ "ignore_eos": { "type": "boolean" }, + "include_speaker_profiles": { + "type": "boolean" + }, + "include_text": { + "type": "boolean" + }, "input": {}, "instruction": { "description": "Edit endpoint", @@ -8239,6 +8198,71 @@ } } }, + "schema.SpeakerEncoder": { + "type": "object", + "properties": { + "dimension": { + "type": "integer" + }, + "identity": { + "type": "string" + } + } + }, + "schema.SpeakerProfile": { + "type": "object", + "properties": { + "clean_duration": { + "type": "number" + }, + "embedding": { + "type": "array", + "items": { + "type": "number" + } + }, + "intervals": { + "type": "array", + "items": { + "$ref": "#/definitions/schema.SpeakerProfileInterval" + } + }, + "speaker": { + "type": "integer" + }, + "unavailable_reason": { + "type": "string" + } + } + }, + "schema.SpeakerProfileInterval": { + "type": "object", + "properties": { + "end": { + "type": "number" + }, + "start": { + "type": "number" + } + } + }, + "schema.SpeakerProfiles": { + "type": "object", + "properties": { + "encoder": { + "$ref": "#/definitions/schema.SpeakerEncoder" + }, + "speakers": { + "type": "array", + "items": { + "$ref": "#/definitions/schema.SpeakerProfile" + } + }, + "version": { + "type": "integer" + } + } + }, "schema.StreamOptions": { "type": "object", "properties": { @@ -8973,15 +8997,14 @@ "name": { "type": "string" }, - "store": { - "type": "string" - }, "speaker_profiles": { "$ref": "#/definitions/schema.SpeakerProfiles" }, "speaker_slot": { - "type": "integer", - "description": "Required with speaker_profiles, mutually exclusive with audio; explicit raw numeric speaker slot." + "type": "integer" + }, + "store": { + "type": "string" } } }, diff --git a/swagger/swagger.yaml b/swagger/swagger.yaml index f4d10dd12..84c48cd9a 100644 --- a/swagger/swagger.yaml +++ b/swagger/swagger.yaml @@ -1,50 +1,5 @@ basePath: / definitions: - schema.SpeakerProfiles: - type: object - properties: - version: - type: integer - encoder: - $ref: '#/definitions/schema.SpeakerEncoder' - speakers: - type: array - items: - $ref: '#/definitions/schema.SpeakerProfile' - schema.SpeakerProfile: - type: object - properties: - speaker: - type: integer - description: Raw numeric slot matching the decimal segment/summary label, not - SPEAKER_NN. - clean_duration: - type: number - intervals: - type: array - items: - $ref: '#/definitions/schema.SpeakerProfileInterval' - unavailable_reason: - type: string - x-nullable: true - embedding: - type: array - items: - type: number - schema.SpeakerProfileInterval: - type: object - properties: - start: - type: number - end: - type: number - schema.SpeakerEncoder: - type: object - properties: - identity: - type: string - dimension: - type: integer config.Gallery: properties: artifact_verification: @@ -723,10 +678,23 @@ definitions: total: type: integer type: object + proto.SpeakerEncoder: + properties: + dimension: + type: integer + identity: + description: sha256 of loaded GGUF bytes + type: string + type: object proto.StatusResponse: properties: memory: $ref: '#/definitions/proto.MemoryUsageData' + speaker_encoder: + allOf: + - $ref: '#/definitions/proto.SpeakerEncoder' + description: trusted metadata from the loaded server encoder, never request + data state: $ref: '#/definitions/proto.StatusResponse_State' type: object @@ -1095,7 +1063,6 @@ definitions: type: string type: object schema.DiarizationResult: - type: object properties: duration: type: number @@ -1104,17 +1071,18 @@ definitions: num_speakers: type: integer segments: - type: array items: $ref: '#/definitions/schema.DiarizationSegment' - speakers: type: array - items: - $ref: '#/definitions/schema.DiarizationSpeaker' - task: - type: string speaker_profiles: $ref: '#/definitions/schema.SpeakerProfiles' + speakers: + items: + $ref: '#/definitions/schema.DiarizationSpeaker' + type: array + task: + type: string + type: object schema.DiarizationSegment: properties: end: @@ -2254,6 +2222,10 @@ definitions: $ref: '#/definitions/functions.JSONFunctionStructure' ignore_eos: type: boolean + include_speaker_profiles: + type: boolean + include_text: + type: boolean input: {} instruction: description: Edit endpoint @@ -2783,6 +2755,48 @@ definitions: model: type: string type: object + schema.SpeakerEncoder: + properties: + dimension: + type: integer + identity: + type: string + type: object + schema.SpeakerProfile: + properties: + clean_duration: + type: number + embedding: + items: + type: number + type: array + intervals: + items: + $ref: '#/definitions/schema.SpeakerProfileInterval' + type: array + speaker: + type: integer + unavailable_reason: + type: string + type: object + schema.SpeakerProfileInterval: + properties: + end: + type: number + start: + type: number + type: object + schema.SpeakerProfiles: + properties: + encoder: + $ref: '#/definitions/schema.SpeakerEncoder' + speakers: + items: + $ref: '#/definitions/schema.SpeakerProfile' + type: array + version: + type: integer + type: object schema.StreamOptions: properties: include_usage: @@ -3299,26 +3313,24 @@ definitions: type: array type: object schema.VoiceRegisterRequest: - type: object properties: audio: type: string labels: - type: object additionalProperties: type: string + type: object model: type: string name: type: string - store: - type: string speaker_profiles: $ref: '#/definitions/schema.SpeakerProfiles' speaker_slot: type: integer - description: Required with speaker_profiles, mutually exclusive with audio; - explicit raw numeric speaker slot. + store: + type: string + type: object schema.VoiceRegisterResponse: properties: id: @@ -5392,69 +5404,70 @@ paths: consumes: - multipart/form-data - application/json - tags: - - audio - summary: Identify speakers in audio (who spoke when). - parameters: - - type: string - description: model - name: model - in: formData - required: true - - type: file - description: audio file - name: file - in: formData - required: true - - type: integer - description: exact speaker count (>0 forces; 0 = auto) - name: num_speakers - in: formData - - type: integer - description: lower bound when auto-detecting - name: min_speakers - in: formData - - type: integer - description: upper bound when auto-detecting - name: max_speakers - in: formData - - type: number - description: clustering distance threshold when num_speakers is unknown - name: clustering_threshold - in: formData - - type: number - description: discard segments shorter than this (seconds) - name: min_duration_on - in: formData - - type: number - description: merge gaps shorter than this (seconds) - name: min_duration_off - in: formData - - type: string - description: audio language hint (only meaningful for backends that bundle ASR) - name: language - in: formData - - type: boolean - description: include per-segment transcript when the backend supports it - name: include_text - in: formData - - type: string - description: json (default), verbose_json, or rttm - name: response_format - in: formData - - type: boolean - description: Export portable biometric profiles; requires voice-recognition - permission. Omitted by default. - name: include_speaker_profiles - in: formData - responses: - '200': - description: OK - schema: - $ref: '#/definitions/schema.DiarizationResult' description: JSON accepts model, file (raw base64 audio), include_text, include_speaker_profiles and response_format. Profiles require voice-recognition permission and json or verbose_json; unsupported backends return 501. + parameters: + - description: model + in: formData + name: model + required: true + type: string + - description: audio file + in: formData + name: file + required: true + type: file + - description: exact speaker count (>0 forces; 0 = auto) + in: formData + name: num_speakers + type: integer + - description: lower bound when auto-detecting + in: formData + name: min_speakers + type: integer + - description: upper bound when auto-detecting + in: formData + name: max_speakers + type: integer + - description: clustering distance threshold when num_speakers is unknown + in: formData + name: clustering_threshold + type: number + - description: discard segments shorter than this (seconds) + in: formData + name: min_duration_on + type: number + - description: merge gaps shorter than this (seconds) + in: formData + name: min_duration_off + type: number + - description: audio language hint (only meaningful for backends that bundle + ASR) + in: formData + name: language + type: string + - description: export portable biometric profiles (voice-recognition permission; + JSON formats only) + in: formData + name: include_speaker_profiles + type: boolean + - description: include per-segment transcript when the backend supports it + in: formData + name: include_text + type: boolean + - description: json (default), verbose_json, or rttm + in: formData + name: response_format + type: string + responses: + "200": + description: OK + schema: + $ref: '#/definitions/schema.DiarizationResult' + summary: Identify speakers in audio (who spoke when). + tags: + - audio /v1/audio/speech: post: consumes: @@ -6237,25 +6250,25 @@ paths: - voice-recognition /v1/voice/register: post: - tags: - - voice-recognition - summary: Register a speaker for 1:N identification. - parameters: - - description: query params - name: request - in: body - required: true - schema: - $ref: '#/definitions/schema.VoiceRegisterRequest' - responses: - '200': - description: Response - schema: - $ref: '#/definitions/schema.VoiceRegisterResponse' description: Supply either audio or speaker_profiles plus an explicit numeric speaker_slot. The selected model must expose matching trusted encoder metadata for portable enrollment. Registrations are global and ephemeral, with a fresh ID for each request. + parameters: + - description: query params + in: body + name: request + required: true + schema: + $ref: '#/definitions/schema.VoiceRegisterRequest' + responses: + "200": + description: Response + schema: + $ref: '#/definitions/schema.VoiceRegisterResponse' + summary: Register a speaker for 1:N identification. + tags: + - voice-recognition /v1/voice/verify: post: parameters: