{"record":{"id":"5ef6dddca72e62f9","repo":"continuedev/continue","slug":"ai-sdk-provider-does-not-support-fill-in-the-middl","errorCode":null,"errorMessage":"AI SDK provider does not support fill-in-the-middle (FIM) completions.","messagePattern":"AI SDK provider does not support fill-in-the-middle \\(FIM\\) completions\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/openai-adapters/src/apis/AiSdk.ts","lineNumber":260,"sourceCode":"    throw new Error(\n      \"AI SDK provider does not support legacy completions API. Use chat completions instead.\",\n    );\n  }\n\n  async *completionStream(\n    _body: CompletionCreateParamsStreaming,\n    _signal: AbortSignal,\n  ): AsyncGenerator<Completion> {\n    throw new Error(\n      \"AI SDK provider does not support legacy completions API. Use chat completions instead.\",\n    );\n  }\n\n  async *fimStream(\n    _body: FimCreateParamsStreaming,\n    _signal: AbortSignal,\n  ): AsyncGenerator<ChatCompletionChunk> {\n    throw new Error(\n      \"AI SDK provider does not support fill-in-the-middle (FIM) completions.\",\n    );\n  }\n\n  async embed(body: EmbeddingCreateParams): Promise<CreateEmbeddingResponse> {\n    this.initializeProvider();\n\n    const { embed: aiEmbed, embedMany } = await import(\"ai\");\n\n    const modelId = typeof body.model === \"string\" ? body.model : body.model;\n    const model = this.provider!(modelId);\n\n    const inputs = Array.isArray(body.input) ? body.input : [body.input];\n    const stringInputs = inputs.map((input) =>\n      typeof input === \"string\" ? input : String(input),\n    );\n\n    if (stringInputs.length === 1) {","sourceCodeStart":242,"sourceCodeEnd":278,"githubUrl":"https://github.com/continuedev/continue/blob/5522c6f44ca0ac3528b37244818fbfa39b5af470/packages/openai-adapters/src/apis/AiSdk.ts#L242-L278","documentation":"The AiSdk adapter delegates to the Vercel AI SDK, which has no fill-in-the-middle (FIM) completion API. fimStream is therefore a hard stub that throws for every call. Use a provider adapter that natively supports FIM (e.g. Codestral/OpenAI-compatible FIM endpoints).","triggerScenarios":"Calling fimStream(body, signal) on an AiSdk adapter, e.g. code-completion features in an editor plugin configured with an AI SDK provider.","commonSituations":"Configuring a coding assistant's FIM/autocomplete backend with the AI SDK provider type instead of a FIM-capable adapter like Mistral Codestral or Continue's FIM adapters.","solutions":["Configure a FIM-capable adapter (Codestral, HuggingFace FIM, OpenAI-compatible FIM endpoint) for autocomplete","Route only chat/embedding traffic through AiSdk and keep FIM on a separate provider config","Guard call sites: check the adapter type before invoking fimStream"],"exampleFix":"// before\nconst chunks = api.fimStream({ prompt, suffix, model }, signal);\n\n// after\nconst fimApi = new Codestral(...); // FIM-capable adapter\nconst chunks = fimApi.fimStream({ prompt, suffix, model }, signal);","handlingStrategy":"type-guard","validationCode":"if (api instanceof AiSdk) throw new Error('Configure a FIM-capable adapter for autocomplete');","typeGuard":"function supportsFim(api: BaseApi): boolean {\n  return typeof api.fimStream === 'function' && !(api instanceof AiSdk) && !(api instanceof Anthropic);\n}","tryCatchPattern":"try { yield* api.fimStream(body, signal); }\ncatch (e) { if (/fill-in-the-middle/.test(String(e))) return; /* degrade to no autocomplete */ throw e; }","preventionTips":["Keep a dedicated FIM provider config separate from chat providers","Feature-flag autocomplete based on adapter capabilities"],"tags":["ai-sdk","fim","code-completion","unsupported-feature"],"backgroundTag":"unsupported-api-method","analyzedSha":"5522c6f44ca0ac3528b37244818fbfa39b5af470","analyzedAt":"2026-08-27T11:28:54.683Z","schemaVersion":2},"datasetVersion":"2026-08-27T13:17:12.746Z"}