{"record":{"id":"73bca98db80107ad","repo":"siyuan-note/siyuan","slug":"no-ai-editing-config","errorCode":null,"errorMessage":"no AI editing config","messagePattern":"no AI editing config","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"kernel/model/ai.go","lineNumber":167,"sourceCode":"func (stream *AIEditorChatStream) Close() {\n\tstream.cancel()\n\tstream.stream.Close()\n}\n\n// NewAIEditorChatStream 创建绑定到编辑器请求生命周期的模型流。\nfunc NewAIEditorChatStream(ctx context.Context, ids []string, input, action string, history []AIEditorMessage) (*AIEditorChatStream, error) {\n\tif !Conf.AI.HasAnyProvider() {\n\t\treturn nil, errors.New(\"no AI provider configured\")\n\t}\n\n\tprov, m := Conf.AI.GetEditingModel()\n\tif nil == prov || nil == m {\n\t\treturn nil, errors.New(\"no AI editing model configured\")\n\t}\n\tediting := Conf.AI.Editing\n\tif nil == editing {\n\t\treturn nil, errors.New(\"no AI editing config\")\n\t}\n\n\tif \"\" == input && 0 < len(ids) {\n\t\tinput = getBlocksContent(ids)\n\t}\n\tprompt := BuildAIEditorPrompt(input, action)\n\tif \"\" == strings.TrimSpace(prompt) {\n\t\treturn nil, errors.New(\"AI editor input is empty\")\n\t}\n\n\tmessages := buildAIEditorMessages(prompt, history, editing.MaxHistoryMessages)\n\n\treq := openai.ChatCompletionRequest{\n\t\tModel:               m.Name,\n\t\tMaxCompletionTokens: editing.MaxCompletionTokens,\n\t\tTemperature:         float32(editing.Temperature),\n\t\tMessages:            messages,\n\t\tStream:              true,\n\t}","sourceCodeStart":149,"sourceCodeEnd":185,"githubUrl":"https://github.com/siyuan-note/siyuan/blob/9f775e8a12daef8255556097396f9b2739078892/kernel/model/ai.go#L149-L185","documentation":"NewAIEditorChatStream creates a streaming chat session used by the AI editor. After confirming a provider exists, it reads Conf.AI.Editing, which holds editor-specific AI settings (MaxCompletionTokens, Temperature, MaxHistoryMessages). SiYuan throws \"no AI editing config\" when that Editing section is nil, meaning the workspace configuration was loaded without (or never received) the AI editing settings block.","triggerScenarios":"Calling NewAIEditorChatStream (via the aiEditorChatContract API) when conf.AI.Editing is nil — e.g. a hand-edited or partially migrated conf.json that lacks the \"editing\" object under \"ai\", or a config struct unmarshalled from an older workspace where the section did not exist.","commonSituations":"Upgrading an old workspace whose conf.json predates the AI editing feature; manually stripping the ai.editing key; a corrupted or truncated conf.json where the editing object failed to deserialize; tools/scripts that rewrite the config and drop unknown sections.","solutions":["Open the workspace conf.json and add a valid \"editing\" object under \"ai\" (or restore it from a backup), then restart the kernel","Set up AI editing via the SiYuan settings UI (设置 - AI) so the editing section is written to conf.json","Check kernel logs for conf.json unmarshal errors; fix any JSON corruption preventing the editing section from loading","Verify Conf.AI.Editing is initialized after loading config (upstream default initialization) if running a modified kernel"],"exampleFix":"// conf.json (workspace) before\n\"ai\": { \"providers\": [ ... ] }\n// after\n\"ai\": { \"providers\": [ ... ], \"editing\": { \"maxCompletionTokens\": 4096, \"temperature\": 0.5, \"maxHistoryMessages\": 10 } }","handlingStrategy":"validation","validationCode":"if conf.AI == nil || conf.AI.Editing == nil {\n    return errors.New(\"AI editing is not configured; open 设置 - AI and save settings\")\n}","typeGuard":"func hasAIEditingConfig(c *conf.AI) bool { return c != nil && c.Editing != nil }","tryCatchPattern":"resp, err := api.AIEditorChatStream(req)\nif err != nil {\n    if strings.Contains(err.Error(), \"no AI editing config\") {\n        // prompt user to complete AI settings\n    }\n}","preventionTips":["Never hand-edit conf.json without validating JSON afterwards","Complete the AI settings UI at least once after creating a workspace","Back up conf.json before upgrades"],"tags":["ai","configuration","missing-config"],"backgroundTag":"missing-required-config","analyzedSha":"9f775e8a12daef8255556097396f9b2739078892","analyzedAt":"2026-09-19T03:17:15.984Z","contentChangedAt":"2026-09-19T03:17:15.984Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}