{"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":97,"sourceCode":"\tif err != nil {\n\t\treturn\n\t}\n\treturn\n}\n\nfunc chatGPTComplete(msg string, contextMsgs []string, cloud bool) (ret string, retContextMsgs []string, err error) {\n\tutil.PushEndlessProgress(\"Requesting...\")\n\tdefer util.ClearPushProgress(100)\n\n\tprov, m := Conf.AI.GetEditingModel()\n\tif nil == prov || nil == m {\n\t\terr = errors.New(\"no AI provider configured\")\n\t\treturn\n\t}\n\n\tediting := Conf.AI.Editing\n\tif nil == editing {\n\t\terr = errors.New(\"no AI editing config\")\n\t\treturn\n\t}\n\n\tif editing.MaxHistoryMessages < len(contextMsgs) {\n\t\tcontextMsgs = contextMsgs[len(contextMsgs)-editing.MaxHistoryMessages:]\n\t}\n\n\tvar gpt GPT\n\tif cloud {\n\t\tgpt = &CloudGPT{}\n\t} else {\n\t\tgpt = &OpenAIGPT{\n\t\t\tc:                   util.NewOpenAIClientWithModel(prov.APIKey, prov.BaseURL, m.Name),\n\t\t\tm:                   m,\n\t\t\ttimeout:             prov.RequestTimeout,\n\t\t\tmaxCompletionTokens: editing.MaxCompletionTokens,\n\t\t\ttemperature:         editing.Temperature,\n\t\t}","sourceCodeStart":79,"sourceCodeEnd":115,"githubUrl":"https://github.com/siyuan-note/siyuan/blob/251596fc0de2f9528c00c224252fd073a99973f4/kernel/model/ai.go#L79-L115","documentation":"Returned by chatGPTComplete when Conf.AI.Editing is nil. Even if a provider/model is configured, the editing-specific settings block (temperature, maxCompletionTokens, MaxHistoryMessages, ModelID) must exist; its absence means the editing feature was never initialized. This is checked after the provider check, so reaching it implies GetEditingModel found a valid provider/model but the editing config object itself is missing.","triggerScenarios":"Conf.AI.Editing is nil — typically from a hand-edited conf.json that omitted the \"editing\" object, a partial config import, or a downgrade/upgraded config that did not migrate the editing block.","commonSituations":"Editing conf.json directly and deleting/omitting the editing block; a config restore from an older backup predating the editing settings; a migration bug that leaves Editing nil despite providers being set.","solutions":["Use Settings - AI to set editing parameters (temperature, max tokens, history length) which initializes Conf.AI.Editing.","If editing conf.json by hand, add an \"editing\" object with modelId, maxTokens, temperature, and maxHistoryMessages.","After editing, restart the kernel so the config is reloaded and any defaults are applied."],"exampleFix":"// before: conf.json \"ai\" has providers but no \"editing\"\n{\"ai\": {\"providers\": [...]}}\n// after\n{\"ai\": {\"providers\": [...], \"editing\": {\"modelId\": \"gpt-4o-mini\", \"maxTokens\": 2048, \"temperature\": 0.7, \"maxHistoryMessages\": 7}}}","handlingStrategy":"validation","validationCode":"if Conf.AI.Editing == nil {\n    return errors.New(\"AI editing config missing; set editing model and parameters\")\n}","typeGuard":"func editingConfigReady(ai *conf.AI) bool { return ai.Editing != nil }","tryCatchPattern":null,"preventionTips":["Always populate the editing block when hand-editing conf.json.","Use the Settings UI to initialize AI editing parameters rather than raw edits.","Restart the kernel after config changes so defaults are applied."],"tags":["ai","config","openai","editing-config"],"backgroundTag":null,"analyzedSha":"251596fc0de2f9528c00c224252fd073a99973f4","analyzedAt":"2026-08-12T21:18:37.123Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}