continuedev/continue · error · Error

AI SDK provider does not support legacy completions API. Use

Error message

AI SDK provider does not support legacy completions API. Use chat completions instead.

What it means

The AiSdk adapter intentionally does not implement the legacy /v1/completions text-completion API; calling completionNonStream always throws telling you to use chat completions.

Source

Thrown at packages/openai-adapters/src/apis/AiSdk.ts:242

      topP: body.top_p ?? undefined,
      stopSequences: body.stop
        ? Array.isArray(body.stop)
          ? body.stop
          : [body.stop]
        : undefined,
      tools: vercelTools,
      toolChoice: convertToolChoiceToVercel(body.tool_choice),
      abortSignal: signal,
    });

    yield* convertVercelStream(result.fullStream as any, { model: modelId });
  }

  async completionNonStream(
    _body: CompletionCreateParamsNonStreaming,
    _signal: AbortSignal,
  ): Promise<Completion> {
    throw new Error(
      "AI SDK provider does not support legacy completions API. Use chat completions instead.",
    );
  }

  async *completionStream(
    _body: CompletionCreateParamsStreaming,
    _signal: AbortSignal,
  ): AsyncGenerator<Completion> {
    throw new Error(
      "AI SDK provider does not support legacy completions API. Use chat completions instead.",
    );
  }

  async *fimStream(
    _body: FimCreateParamsStreaming,
    _signal: AbortSignal,
  ): AsyncGenerator<ChatCompletionChunk> {
    throw new Error(

View on GitHub (pinned to 5522c6f44c)

Solutions

  1. Switch the call to chatCompletionNonStream/chatCompletionStream with a messages array
  2. Use a different provider adapter (e.g. native OpenAI) if legacy completions are required
  3. Update tooling to send chat-format requests

Example fix

// before
await llm.completionNonStream({ model, prompt: 'Hello' }, signal);

// after
await llm.chatCompletionNonStream({ model, messages: [{ role: 'user', content: 'Hello' }] }, signal);
Defensive patterns

Strategy: fallback

Validate before calling

if (llm instanceof AiSdk) { useChatCompletions(); } // never call completion* on AiSdk

Type guard

function supportsLegacyCompletions(llm: unknown): boolean { return !(llm instanceof AiSdk); }

Try / catch

try { await llm.completionNonStream(body, signal); } catch (e) { if (/legacy completions/.test(e.message)) { await llm.chatCompletionNonStream({ model: body.model, messages: [{ role: 'user', content: body.prompt }] }, signal); } else throw e; }

Prevention

When it happens

Trigger: Routing a legacy CompletionCreateParamsNonStreaming request (plain prompt, no messages) to an AiSdk-backed model — e.g. old code paths or tools using the text completions endpoint.

Common situations: Migrating older integrations that used text completions; generic OpenAI-compatible tooling that tries /completions before /chat/completions.

Related errors


AI-assisted analysis of continuedev/continue@5522c6f44c (2026-08-27). Data as JSON: /api/errors/feed0fdeb29e79df. Report an issue: GitHub.