{"record":{"id":"2187af4a84441a28","repo":"linshenkx/prompt-optimizer","slug":"invalid-response-format-2187af","errorCode":"INVALID_RESPONSE_FORMAT","errorMessage":"INVALID_RESPONSE_FORMAT","messagePattern":"INVALID_RESPONSE_FORMAT","errorType":"error_code","errorClass":"ImageError","httpStatus":null,"severity":"error","filePath":"packages/core/src/services/image/adapters/ollama.ts","lineNumber":187,"sourceCode":"      let errorMessage = `Ollama API error: ${response.status} ${response.statusText}`\n      try {\n        const errorData = await response.json()\n        if (typeof errorData?.error?.message === 'string') {\n          errorMessage = errorData.error.message\n        }\n      } catch {\n        // ignore JSON parse errors\n      }\n      throw new ImageError(IMAGE_ERROR_CODES.GENERATION_FAILED, errorMessage)\n    }\n\n    const json = await response.json()\n    return this.parseImageResponse(json, config)\n  }\n\n  private parseImageResponse(response: any, config: ImageModelConfig): ImageResult {\n    if (!response?.data || !Array.isArray(response.data)) {\n      throw new ImageError(IMAGE_ERROR_CODES.INVALID_RESPONSE_FORMAT)\n    }\n\n    const images = response.data.map((item: any) => {\n      if (!item?.b64_json || typeof item.b64_json !== 'string') {\n        throw new ImageError(IMAGE_ERROR_CODES.INVALID_RESPONSE_FORMAT)\n      }\n      const dataUrl = `data:image/png;base64,${item.b64_json}`\n      return {\n        b64: item.b64_json,\n        mimeType: 'image/png',\n        url: dataUrl\n      }\n    })\n\n    return {\n      images,\n      metadata: {\n        providerId: 'ollama',","sourceCodeStart":169,"sourceCodeEnd":205,"githubUrl":"https://github.com/linshenkx/prompt-optimizer/blob/3e677b1d9f7e0493c142c175560531e7ae786dce/packages/core/src/services/image/adapters/ollama.ts#L169-L205","documentation":"parseImageResponse in the Ollama adapter requires the response JSON to have an array data field; otherwise it throws INVALID_RESPONSE_FORMAT. Ollama must mimic the OpenAI images response shape for the adapter to accept it.","triggerScenarios":"Ollama returns a payload without data[] — native Ollama API format ({ models: ... } or generation format), an error object, or a non-images route responding.","commonSituations":"Pointing the adapter at Ollama's native API (11434 without the OpenAI-compat path), older Ollama versions with different response shapes, or mismatched endpoint paths.","solutions":["Log the raw Ollama response body to see its actual shape","Ensure the base URL uses Ollama's OpenAI-compatible /v1/images/generations route","Upgrade/downgrade Ollama to a version whose images API matches the adapter's expectation"],"exampleFix":null,"handlingStrategy":"type-guard","validationCode":"// ensure base URL targets the OpenAI-compat route\nassert(config.baseUrl.match(/\\/v1$/), 'Ollama base URL should end with /v1')","typeGuard":"function isOpenAiImagesShape(r: unknown): r is { data: unknown[] } {\n  return !!r && Array.isArray((r as any).data)\n}","tryCatchPattern":"try { ... } catch (e) {\n  if (e instanceof ImageError && e.code === IMAGE_ERROR_CODES.INVALID_RESPONSE_FORMAT)\n    // check base URL points at /v1, not native API\n}","preventionTips":["Point the adapter at Ollama's /v1 OpenAI-compat endpoint","Capture raw responses in dev to catch shape mismatches"],"tags":["ollama","response-validation","api-contract"],"backgroundTag":"invalid-api-response-shape","analyzedSha":"3e677b1d9f7e0493c142c175560531e7ae786dce","analyzedAt":"2026-08-27T21:29:16.709Z","schemaVersion":2},"datasetVersion":"2026-08-28T00:17:15.603Z"}