Debug drawer get config from page
This commit is contained in:
@@ -14,6 +14,11 @@ interface ToolItem {
|
|||||||
isCustom?: boolean;
|
isCustom?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const isSiliconflowVendor = (vendor?: string) => {
|
||||||
|
const normalized = String(vendor || '').trim().toLowerCase();
|
||||||
|
return normalized === 'siliconflow' || normalized === '硅基流动';
|
||||||
|
};
|
||||||
|
|
||||||
export const AssistantsPage: React.FC = () => {
|
export const AssistantsPage: React.FC = () => {
|
||||||
const [assistants, setAssistants] = useState<Assistant[]>([]);
|
const [assistants, setAssistants] = useState<Assistant[]>([]);
|
||||||
const [voices, setVoices] = useState<Voice[]>([]);
|
const [voices, setVoices] = useState<Voice[]>([]);
|
||||||
@@ -934,6 +939,9 @@ export const AssistantsPage: React.FC = () => {
|
|||||||
isOpen={debugOpen}
|
isOpen={debugOpen}
|
||||||
onClose={() => setDebugOpen(false)}
|
onClose={() => setDebugOpen(false)}
|
||||||
assistant={selectedAssistant}
|
assistant={selectedAssistant}
|
||||||
|
voices={voices}
|
||||||
|
llmModels={llmModels}
|
||||||
|
asrModels={asrModels}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
@@ -1020,7 +1028,14 @@ const BotIcon = ({className}: {className?: string}) => (
|
|||||||
);
|
);
|
||||||
|
|
||||||
// --- Debug Drawer Component ---
|
// --- Debug Drawer Component ---
|
||||||
export const DebugDrawer: React.FC<{ isOpen: boolean; onClose: () => void; assistant: Assistant }> = ({ isOpen, onClose, assistant }) => {
|
export const DebugDrawer: React.FC<{
|
||||||
|
isOpen: boolean;
|
||||||
|
onClose: () => void;
|
||||||
|
assistant: Assistant;
|
||||||
|
voices: Voice[];
|
||||||
|
llmModels: LLMModel[];
|
||||||
|
asrModels: ASRModel[];
|
||||||
|
}> = ({ isOpen, onClose, assistant, voices, llmModels, asrModels }) => {
|
||||||
const [mode, setMode] = useState<'text' | 'voice' | 'video'>('text');
|
const [mode, setMode] = useState<'text' | 'voice' | 'video'>('text');
|
||||||
const [messages, setMessages] = useState<{role: 'user' | 'model', text: string}[]>([]);
|
const [messages, setMessages] = useState<{role: 'user' | 'model', text: string}[]>([]);
|
||||||
const [inputText, setInputText] = useState('');
|
const [inputText, setInputText] = useState('');
|
||||||
@@ -1175,6 +1190,77 @@ export const DebugDrawer: React.FC<{ isOpen: boolean; onClose: () => void; assis
|
|||||||
};
|
};
|
||||||
|
|
||||||
const fetchRuntimeMetadata = async (): Promise<Record<string, any>> => {
|
const fetchRuntimeMetadata = async (): Promise<Record<string, any>> => {
|
||||||
|
const warnings: string[] = [];
|
||||||
|
const services: Record<string, any> = {};
|
||||||
|
|
||||||
|
if (assistant.llmModelId) {
|
||||||
|
const llm = llmModels.find((item) => item.id === assistant.llmModelId);
|
||||||
|
if (llm) {
|
||||||
|
services.llm = {
|
||||||
|
provider: 'openai',
|
||||||
|
model: llm.modelName || llm.name,
|
||||||
|
apiKey: llm.apiKey,
|
||||||
|
baseUrl: llm.baseUrl,
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
warnings.push(`LLM model not found in loaded list: ${assistant.llmModelId}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (assistant.asrModelId) {
|
||||||
|
const asr = asrModels.find((item) => item.id === assistant.asrModelId);
|
||||||
|
if (asr) {
|
||||||
|
const asrProvider = isSiliconflowVendor(asr.vendor) ? 'siliconflow' : 'buffered';
|
||||||
|
services.asr = {
|
||||||
|
provider: asrProvider,
|
||||||
|
model: asr.modelName || asr.name,
|
||||||
|
apiKey: asrProvider === 'siliconflow' ? asr.apiKey : null,
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
warnings.push(`ASR model not found in loaded list: ${assistant.asrModelId}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (assistant.voice) {
|
||||||
|
const voice = voices.find((item) => item.id === assistant.voice);
|
||||||
|
if (voice) {
|
||||||
|
const ttsProvider = isSiliconflowVendor(voice.vendor) ? 'siliconflow' : 'edge';
|
||||||
|
services.tts = {
|
||||||
|
provider: ttsProvider,
|
||||||
|
model: voice.model,
|
||||||
|
apiKey: ttsProvider === 'siliconflow' ? voice.apiKey : null,
|
||||||
|
voice: voice.voiceKey || voice.id,
|
||||||
|
speed: assistant.speed || voice.speed || 1.0,
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
services.tts = {
|
||||||
|
voice: assistant.voice,
|
||||||
|
speed: assistant.speed || 1.0,
|
||||||
|
};
|
||||||
|
warnings.push(`Voice resource not found in loaded list: ${assistant.voice}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const localResolved = {
|
||||||
|
assistantId: assistant.id,
|
||||||
|
sources: {
|
||||||
|
llmModelId: assistant.llmModelId || '',
|
||||||
|
asrModelId: assistant.asrModelId || '',
|
||||||
|
voiceId: assistant.voice || '',
|
||||||
|
},
|
||||||
|
warnings,
|
||||||
|
sessionStartMetadata: {
|
||||||
|
systemPrompt: assistant.prompt || '',
|
||||||
|
greeting: assistant.opener || '',
|
||||||
|
services,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
setResolvedConfigView(JSON.stringify(localResolved, null, 2));
|
||||||
|
return localResolved.sessionStartMetadata;
|
||||||
|
};
|
||||||
|
|
||||||
|
const fetchRuntimeMetadataFromDb = async (): Promise<Record<string, any>> => {
|
||||||
try {
|
try {
|
||||||
const resolved = await fetchAssistantRuntimeConfig(assistant.id);
|
const resolved = await fetchAssistantRuntimeConfig(assistant.id);
|
||||||
setResolvedConfigView(
|
setResolvedConfigView(
|
||||||
@@ -1189,7 +1275,7 @@ export const DebugDrawer: React.FC<{ isOpen: boolean; onClose: () => void; assis
|
|||||||
2,
|
2,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
return resolved.sessionStartMetadata || {};
|
return resolved.sessionStartMetadata || { systemPrompt: assistant.prompt || '', greeting: assistant.opener || '', services: {} };
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Failed to load runtime config, using fallback.', error);
|
console.error('Failed to load runtime config, using fallback.', error);
|
||||||
const fallback = {
|
const fallback = {
|
||||||
@@ -1239,7 +1325,11 @@ export const DebugDrawer: React.FC<{ isOpen: boolean; onClose: () => void; assis
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const metadata = await fetchRuntimeMetadata();
|
let metadata = await fetchRuntimeMetadata();
|
||||||
|
if (!metadata || typeof metadata !== 'object') {
|
||||||
|
// Safety fallback, should not happen with local resolution.
|
||||||
|
metadata = await fetchRuntimeMetadataFromDb();
|
||||||
|
}
|
||||||
setWsStatus('connecting');
|
setWsStatus('connecting');
|
||||||
setWsError('');
|
setWsError('');
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user