auto-git:

[add] src/AssistantMessageContent.jsx
 [add] src/appConfig.js
 [add] src/attachments.jsx
 [add] src/chatText.js
 [add] src/modelPicker.js
This commit is contained in:
2026-05-06 03:25:28 +02:00
parent 4f6771e787
commit 5268ec4607
5 changed files with 444 additions and 0 deletions

124
src/chatText.js Normal file
View File

@@ -0,0 +1,124 @@
export function sanitizeChatTitle(title) {
let cleanedTitle = String(title || '')
.replace(/<think(?:ing)?>[\s\S]*?<\/think(?:ing)?>/gi, '')
.trim()
let previousTitle = null
while (cleanedTitle && cleanedTitle !== previousTitle) {
previousTitle = cleanedTitle
cleanedTitle = cleanedTitle
.replace(/^\s*#+\s*/, '')
.replace(/^\s*\*{1,2}\s*/, '')
.replace(/\s*\*{1,2}\s*$/, '')
.trim()
}
return cleanedTitle.replace(/\s+/g, ' ').trim()
}
function appendOllamaErrorHint(text, marker, block) {
if (text.includes(marker)) {
return text
}
return `${text}\n\n${block}`
}
export function enrichOllamaErrorText(text) {
const raw = String(text || '')
const trimmed = raw.trim()
if (!trimmed) {
return raw
}
const lower = trimmed.toLowerCase()
const looksLikeOllamaError = (
lower.startsWith('error:') ||
lower.startsWith('ollama error:') ||
lower.includes("client error '") ||
lower.includes("server error '") ||
(lower.includes('http') && lower.includes('error')) ||
lower.includes('unknown model architecture') ||
lower.includes('out of memory')
)
if (!looksLikeOllamaError) {
return raw
}
if (lower.includes('unknown model architecture')) {
return appendOllamaErrorHint(
raw,
'[ERROR - Unsupported Model]',
'[ERROR - Unsupported Model]\nThis Ollama version does not support the model.\nUpdate Ollama.'
)
}
if (lower.includes('out of memory')) {
return appendOllamaErrorHint(
raw,
'[ERROR - Out of Memory]',
'[ERROR - Out of Memory]\nThe model is too large for available memory.\nUse a smaller or quantized model.'
)
}
if (lower.includes('502')) {
return appendOllamaErrorHint(
raw,
'[ERROR 502 - Bad Gateway]',
'[ERROR 502 - Bad Gateway]\nOllama did not return a valid response.\nTry restarting or updating Ollama.'
)
}
if (lower.includes('500')) {
return appendOllamaErrorHint(
raw,
'[ERROR 500 - Internal Server Error]',
"[ERROR 500 - Internal Server Error]\nOllama crashed while processing the request.\nCheck 'ollama logs' and memory usage."
)
}
if (lower.includes('404')) {
return appendOllamaErrorHint(
raw,
'[ERROR 404 - Not Found]',
"[ERROR 404 - Not Found]\nThe model or endpoint was not found.\nCheck the model name or run 'ollama pull <model>'."
)
}
if (lower.includes('400')) {
return appendOllamaErrorHint(
raw,
'[ERROR 400 - Bad Request]',
'[ERROR 400 - Bad Request]\nThe request sent to Ollama was invalid.\nCheck parameters or payload format.'
)
}
return raw
}
export function splitThinkBlocks(text) {
if (!text) return { think: null, answer: '' }
const openTagRe = /<think(?:ing)?>/i
const closeTagRe = /<\/think(?:ing)?>/i
const openMatch = text.match(openTagRe)
if (!openMatch) {
return { think: null, answer: text }
}
const openTagIndex = openMatch.index
const openTagLength = openMatch[0].length
const answerPartBeforeThink = text.substring(0, openTagIndex).trim()
const contentAfterOpenTag = text.substring(openTagIndex + openTagLength)
const closeMatch = contentAfterOpenTag.match(closeTagRe)
let thinkInner = null
let finalAnswer = answerPartBeforeThink
if (closeMatch) {
thinkInner = contentAfterOpenTag.substring(0, closeMatch.index).trim()
finalAnswer += contentAfterOpenTag.substring(closeMatch.index + closeMatch[0].length)
} else {
thinkInner = contentAfterOpenTag.trim()
}
return { think: thinkInner || null, answer: finalAnswer.trim() }
}