')) {
console.log('Detected thinking process visualization in response');
// For content with HTML thinking visualizations, we need to protect them
}
// First, extract HTML thinking visualization to protect it from replacements
const thinkingBlocks: string[] = [];
let processedContent = content.replace(/
/g, (match) => {
const placeholder = `__THINKING_BLOCK_${thinkingBlocks.length}__`;
thinkingBlocks.push(match);
return placeholder;
});
// Then extract code blocks to protect them from other replacements
const codeBlocks: string[] = [];
processedContent = processedContent.replace(/```(\w+)?\n([\s\S]+?)\n```/gs, (match, language, code) => {
const placeholder = `__CODE_BLOCK_${codeBlocks.length}__`;
const languageClass = language ? ` language-${language}` : '';
codeBlocks.push(`
${code}
`);
return placeholder;
});
// Apply other markdown formatting
processedContent = processedContent
.replace(/\*\*(.*?)\*\*/g, '
$1')
.replace(/\*(.*?)\*/g, '
$1')
.replace(/`([^`]+)`/g, '
$1
')
.replace(/\n/g, '
');
// Restore code blocks
codeBlocks.forEach((block, index) => {
processedContent = processedContent.replace(`__CODE_BLOCK_${index}__`, block);
});
// Restore thinking visualization blocks
thinkingBlocks.forEach((block, index) => {
processedContent = processedContent.replace(`__THINKING_BLOCK_${index}__`, block);
});
return processedContent;
}
/**
* Validate embedding providers configuration
* Check if there are issues with the embedding providers that might affect LLM functionality
*/
async validateEmbeddingProviders() {
try {
// Check if AI is enabled
const aiEnabled = options.is('aiEnabled');
if (!aiEnabled) {
this.validationWarning.style.display = 'none';
return;
}
// Get the default embedding provider
const defaultProvider = options.get('embeddingsDefaultProvider') || 'openai';
// Get provider precedence
const precedenceStr = options.get('aiProviderPrecedence') || 'openai,anthropic,ollama';
let precedenceList: string[] = [];
if (precedenceStr) {
if (precedenceStr.startsWith('[') && precedenceStr.endsWith(']')) {
precedenceList = JSON.parse(precedenceStr);
} else if (precedenceStr.includes(',')) {
precedenceList = precedenceStr.split(',').map(p => p.trim());
} else {
precedenceList = [precedenceStr];
}
}
// Get enabled providers - this is a simplification since we don't have direct DB access
// We'll determine enabled status based on the presence of keys or settings
const enabledProviders: string[] = [];
// OpenAI is enabled if API key is set
const openaiKey = options.get('openaiApiKey');
if (openaiKey) {
enabledProviders.push('openai');
}
// Anthropic is enabled if API key is set
const anthropicKey = options.get('anthropicApiKey');
if (anthropicKey) {
enabledProviders.push('anthropic');
}
// Ollama is enabled if the setting is true
const ollamaEnabled = options.is('ollamaEnabled');
if (ollamaEnabled) {
enabledProviders.push('ollama');
}
// Local is always available
enabledProviders.push('local');
// Perform validation checks
const defaultInPrecedence = precedenceList.includes(defaultProvider);
const defaultIsEnabled = enabledProviders.includes(defaultProvider);
const allPrecedenceEnabled = precedenceList.every((p: string) => enabledProviders.includes(p));
// Show warning if there are issues
if (!defaultInPrecedence || !defaultIsEnabled || !allPrecedenceEnabled) {
let message = '
AI Provider Configuration Issues';
message += '
';
if (!defaultInPrecedence) {
message += `- The default embedding provider "${defaultProvider}" is not in your provider precedence list.
`;
}
if (!defaultIsEnabled) {
message += `- The default embedding provider "${defaultProvider}" is not enabled.
`;
}
if (!allPrecedenceEnabled) {
const disabledProviders = precedenceList.filter((p: string) => !enabledProviders.includes(p));
message += `- The following providers in your precedence list are not enabled: ${disabledProviders.join(', ')}.
`;
}
message += '
';
message += '
';
// Update HTML content - no need to attach event listeners here anymore
this.validationWarning.innerHTML = message;
this.validationWarning.style.display = 'block';
} else {
this.validationWarning.style.display = 'none';
}
} catch (error) {
console.error('Error validating embedding providers:', error);
this.validationWarning.style.display = 'none';
}
}
}