+ {speechConfigTabSchema.stages.map((stage) =>
+ renderDynamicForms(stage, 'speech'),
+ )}
+
+ )}
+
{activeSection === 'safety' && safetyConfigTabSchema && (
{safetyConfigTabSchema.stages.map((stage) =>
diff --git a/web/src/app/infra/entities/api/index.ts b/web/src/app/infra/entities/api/index.ts
index 3223ed7b3..a9b30d841 100644
--- a/web/src/app/infra/entities/api/index.ts
+++ b/web/src/app/infra/entities/api/index.ts
@@ -52,6 +52,8 @@ export interface ModelProvider {
llm_count?: number;
embedding_count?: number;
rerank_count?: number;
+ asr_count?: number;
+ tts_count?: number;
created_at?: string;
updated_at?: string;
}
@@ -158,6 +160,38 @@ export interface RerankModel {
extra_args?: object;
}
+export interface ApiRespProviderASRModels {
+ models: ASRModel[];
+}
+
+export interface ApiRespProviderASRModel {
+ model: ASRModel;
+}
+
+export interface ASRModel {
+ uuid: string;
+ name: string;
+ provider_uuid: string;
+ provider?: ModelProvider;
+ extra_args?: object;
+}
+
+export interface ApiRespProviderTTSModels {
+ models: TTSModel[];
+}
+
+export interface ApiRespProviderTTSModel {
+ model: TTSModel;
+}
+
+export interface TTSModel {
+ uuid: string;
+ name: string;
+ provider_uuid: string;
+ provider?: ModelProvider;
+ extra_args?: object;
+}
+
export interface LangBotModelAvailability {
up: boolean | null;
last_probed_at: string | null;
@@ -694,6 +728,7 @@ interface GetPipelineConfig {
ai: object;
output: object;
safety: object;
+ speech?: object;
trigger: object;
}
diff --git a/web/src/app/infra/entities/form/dynamic.ts b/web/src/app/infra/entities/form/dynamic.ts
index 125f0b9bb..f870f7128 100644
--- a/web/src/app/infra/entities/form/dynamic.ts
+++ b/web/src/app/infra/entities/form/dynamic.ts
@@ -73,6 +73,8 @@ export enum DynamicFormItemType {
LLM_MODEL_SELECTOR = 'llm-model-selector',
EMBEDDING_MODEL_SELECTOR = 'embedding-model-selector',
RERANK_MODEL_SELECTOR = 'rerank-model-selector',
+ ASR_MODEL_SELECTOR = 'asr-model-selector',
+ TTS_MODEL_SELECTOR = 'tts-model-selector',
MODEL_FALLBACK_SELECTOR = 'model-fallback-selector',
PROMPT_EDITOR = 'prompt-editor',
UNKNOWN = 'unknown',
diff --git a/web/src/app/infra/http/BackendClient.ts b/web/src/app/infra/http/BackendClient.ts
index f12b60927..5c8f9a719 100644
--- a/web/src/app/infra/http/BackendClient.ts
+++ b/web/src/app/infra/http/BackendClient.ts
@@ -58,6 +58,12 @@ import {
ApiRespProviderRerankModels,
ApiRespProviderRerankModel,
RerankModel,
+ ApiRespProviderASRModels,
+ ApiRespProviderASRModel,
+ ASRModel,
+ ApiRespProviderTTSModels,
+ ApiRespProviderTTSModel,
+ TTSModel,
ApiRespPluginSystemStatus,
ApiRespBoxStatus,
BoxSessionInfo,
@@ -234,7 +240,7 @@ export class BackendClient extends BaseHttpClient {
public scanProviderModels(
uuid: string,
- modelType?: 'llm' | 'embedding' | 'rerank',
+ modelType?: 'llm' | 'embedding' | 'rerank' | 'asr' | 'tts',
): Promise
{
const params = modelType ? { type: modelType } : {};
return this.get(`/api/v1/provider/providers/${uuid}/scan-models`, params);
@@ -348,6 +354,68 @@ export class BackendClient extends BaseHttpClient {
return this.post(`/api/v1/provider/models/rerank/${uuid}/test`, model);
}
+ // ============ Provider Model ASR ============
+ public getProviderASRModels(
+ providerUuid?: string,
+ ): Promise {
+ const params = providerUuid ? { provider_uuid: providerUuid } : {};
+ return this.get('/api/v1/provider/models/asr', params);
+ }
+
+ public getProviderASRModel(uuid: string): Promise {
+ return this.get(`/api/v1/provider/models/asr/${uuid}`);
+ }
+
+ public createProviderASRModel(model: ASRModel): Promise