{"record":{"id":"39c234f4b312d90f","repo":"chenfei-wu/TaskMatrix","slug":"openai-api-error-39c234","errorCode":null,"errorMessage":"OpenAI API error.","messagePattern":"OpenAI API error\\.","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"LowCodeLLM/src/planningLLM.py","lineNumber":63,"sourceCode":"\r\nclass planningLLM:\r\n    def __init__(self, temperature) -> None:\r\n        self.prefix = PLANNING_LLM_PREFIX\r\n        self.suffix = PLANNING_LLM_SUFFIX\r\n        self.LLM = OpenAIWrapper(temperature)\r\n        self.messages = [{\"role\": \"system\", \"content\": \"You are a helpful assistant.\"}]\r\n\r\n    def get_workflow(self, task_prompt):\r\n        '''\r\n        - input: task_prompt\r\n        - output: workflow (json)\r\n        '''\r\n        messages = self.messages + [{'role': 'user', \"content\": PLANNING_LLM_PREFIX+'\\nThe task is:\\n'+task_prompt+PLANNING_LLM_SUFFIX}]\r\n        response, status = self.LLM.run(messages)\r\n        if status:\r\n            return self._txt2json(response)\r\n        else:\r\n            return \"OpenAI API error.\"\r\n\r\n    def extend_workflow(self, task_prompt, current_workflow, step):\r\n        messages = self.messages + [{'role': 'user', \"content\": PLANNING_LLM_PREFIX+'\\nThe task is:\\n'+task_prompt+PLANNING_LLM_SUFFIX}]\r\n        messages.append({'role': 'user', \"content\": EXTEND_PREFIX+\r\n                         'The current SOP is:\\n'+current_workflow+\r\n                         '\\nThe step needs to be extended is:\\n'+step+\r\n                         PLANNING_LLM_SUFFIX})\r\n        response, status = self.LLM.run(messages)\r\n        if status:\r\n            return self._txt2json(response)\r\n        else:\r\n            return \"OpenAI API error.\"\r\n\r\n    def _txt2json(self, workflow_txt):\r\n        ''' convert the workflow in natural language to json format '''\r\n        workflow = []\r\n        try:\r\n            steps = workflow_txt.split('\\n')\r","sourceCodeStart":45,"sourceCodeEnd":81,"githubUrl":"https://github.com/chenfei-wu/TaskMatrix/blob/4b7664f8d3a23804ac1b795d75a73efd162769f0/LowCodeLLM/src/planningLLM.py#L45-L81","documentation":"Returned by planningLLM.get_workflow when the underlying OpenAI chat completion call fails. OpenAIWrapper catches all exceptions and returns status=False, so this string hides the actual cause (auth, quota, Azure misconfig, network).","triggerScenarios":"POST /api/get_workflow where openai.ChatCompletion.create throws: missing/invalid OPENAIKEY, USE_AZURE=true with missing/wrong API_BASE/API_VERSION/MODEL, rate limits, or network failure.","commonSituations":"Server started without exporting OpenAI/Azure env vars; Azure deployment name mismatch; openai library version newer than the 0.x ChatCompletion API the code uses; exhausted quota.","solutions":["Add logging of the exception in OpenAIWrapper._post_request_chat to surface the real error.","Check OPENAIKEY and Azure variables (USE_AZURE, API_BASE, API_VERSION, MODEL) in the server environment.","Confirm the installed openai package still exposes openai.ChatCompletion (0.x API); pin openai<1.0 or migrate to openai.ChatCompletion -> client.chat.completions.create.","Retry on transient rate-limit errors."],"exampleFix":"# before\nresponse, status = self.LLM.run(messages)\nif status: return self._txt2json(response)\nelse: return \"OpenAI API error.\"\n# after - surface wrapper exception and retry once\nresponse, status = self.LLM.run(messages)\nif not status:\n    response, status = self.LLM.run(messages)  # simple retry\nif status: return self._txt2json(response)\nelse: raise RuntimeError('OpenAI call failed in get_workflow')","handlingStrategy":"retry","validationCode":"import os\nmissing = [v for v in ('OPENAIKEY',) if not os.environ.get(v)]\nif os.environ.get('USE_AZURE','').lower()=='true':\n    missing += [v for v in ('API_BASE','API_VERSION','MODEL') if not os.environ.get(v)]\nassert not missing, f'missing env: {missing}'","typeGuard":"def is_workflow_json(w) -> bool:\n    if not isinstance(w, str) or w == 'OpenAI API error.': return False\n    import json; json.loads(w); return True","tryCatchPattern":"result = llm.get_workflow(task)\nif result == 'OpenAI API error.':\n    # fix config or retry with backoff; do not parse it as workflow JSON","preventionTips":["Pre-check env config at startup and fail fast","Retry transient OpenAI failures with exponential backoff","Pin openai<1.0 since the code uses the ChatCompletion 0.x API"],"tags":["openai","chatcompletion","azure-openai","api-key","lowcodellm"],"backgroundTag":"openai-api-error","analyzedSha":"4b7664f8d3a23804ac1b795d75a73efd162769f0","analyzedAt":"2026-08-27T13:26:11.787Z","schemaVersion":2},"datasetVersion":"2026-08-27T19:17:21.184Z"}