{"record":{"id":"ff24d2654d6e4197","repo":"siyuan-note/siyuan","slug":"window-siyuan-languages-kernel-28","errorCode":null,"errorMessage":"window.siyuan.languages._kernel[28]","messagePattern":"window\\.siyuan\\.languages\\._kernel\\[28\\]","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"app/src/ai/editorSSE.ts","lineNumber":114,"sourceCode":"        method: \"POST\",\n        headers: {\"Content-Type\": \"application/json\"},\n        body: JSON.stringify(request),\n        signal,\n    });\n    const contentType = response.headers.get(\"Content-Type\") || \"\";\n    if (!response.ok || !contentType.includes(\"text/event-stream\")) {\n        let message = window.siyuan.languages._kernel[28];\n        try {\n            const data = await response.json();\n            message = data?.msg || data?.message || message;\n        } catch (e) {\n            // 响应不是 JSON 时使用统一错误文案。\n        }\n        throw new Error(message);\n    }\n    const reader = response.body?.getReader();\n    if (!reader) {\n        throw new Error(window.siyuan.languages._kernel[28]);\n    }\n    const decoder = new TextDecoder();\n    const parserState = createAIEditorSSEParserState();\n    let terminalReceived = false;\n    while (true) {\n        const result = await reader.read();\n        if (result.done) {\n            break;\n        }\n        parseAIEditorSSE(parserState, decoder.decode(result.value, {stream: true})).forEach(event => {\n            terminalReceived = terminalReceived || event.type === \"done\" || event.type === \"error\";\n            onEvent(event);\n        });\n    }\n    parseAIEditorSSE(parserState, decoder.decode(), true).forEach(event => {\n        terminalReceived = terminalReceived || event.type === \"done\" || event.type === \"error\";\n        onEvent(event);\n    });","sourceCodeStart":96,"sourceCodeEnd":132,"githubUrl":"https://github.com/siyuan-note/siyuan/blob/8641553a1f07374001902d3ce773285db1292b2d/app/src/ai/editorSSE.ts#L96-L132","documentation":"Fallback error text used by fetchAIEditorSSE when the failed /api/ai/editor/chat response body cannot be parsed as JSON (for example an HTML error page from a proxy). The localized kernel message window.siyuan.languages._kernel[28] is kept as the generic error and thrown after the json() parse fails, because no server-side msg is available.","triggerScenarios":"Thrown at app/src/ai/editorSSE.ts:114 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Treat the message as generic: the real cause is the HTTP status, not the text","Check for proxies or gateways returning non-JSON error bodies between client and kernel","Retry after confirming kernel health and AI configuration"],"exampleFix":null,"handlingStrategy":"fallback","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"8641553a1f07374001902d3ce773285db1292b2d","analyzedAt":"2026-09-11T16:08:28.414Z","contentChangedAt":"2026-09-11T16:08:28.414Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}