Generates a completion
Generates a completion from endpoint . Your endpoint ID can be found in the
API tab of your endpoint or in the URL.
Parameters
Baseplate API key. Needs to be in the format βBearer &BASEPLATE_API_KEYβ
A json object with keys matching the variables of your deployed template
A prompt for Anthropic, ada, babbage, curie, and davinci models. One of
messages or prompt is required.
An array of the chat history, for gpt-3.5 and gpt-4 models. One of messages or
prompt is required.
If true, response will be sent back as Server Sent Events. A [DONE] message is
sent at the end of the completion and the search results (if applicable) are
sent after the [DONE]. See below for example.
A user string to use for OpenAIβs API.
-  π’ 200: OK 
-  π  401: Unauthorized 
{
  "id": "cmpl-6htWn45Ch0G37ZZFI48zt29k5atNe",
  "object": "text_completion",
  "created": 1675919573,
  "model": "text-davinci-003",
  "choices": [
    {
      "text": "\n\nThis Jacket is the ultimate in shoe fashion. It's sleek, stylish",
      "index": 0,
      "logprobs": null,
      "finish_reason": "length",
      "usage_id": "89b572c6-f0c9-40b5-bdb4-dc5cb6a99144"
    }
  ],
  "usage": {
    "prompt_tokens": 23,
    "completion_tokens": 16,
    "total_tokens": 39
  },
  "search_results": [
    {
      "data": {
        "text": "Example text."
      },
      "embedding": "Example text.",
      "image_paths": null,
      "confidence": 0.84870479,
      "metadata": {
        "documentId": "007c8ab6-4972-4457-9a1b-244fdefb22bc",
        "rowId": 571724,
        "url": "/5274962e-04c3-4a23-b3d5-1d7e1ea6a230/text.pdf"
      },
      "variable": "context",
      "last_accessed": "2023-05-03T00:03:40.525+00:00",
      "query": "example query"
    }
  ],
  "prompt_cost": 0.00046,
  "completion_cost": 0.00032,
  "baseplate_model_name": "text-davinci-003"
}
Steaming Example (Next.js 13)
Heres an example if you are using NextJS 13/React:
Backend (/api/completions/chat/route.ts):
import {
  createParser,
  ParsedEvent,
  ReconnectInterval,
} from "eventsource-parser";
export async function POST(request: Request) {
const body = await request.json();
  const encoder = new TextEncoder();
  const decoder = new TextDecoder();
const res = await fetch("https://app.baseplate.ai/api/endpoints/${endpoint-id}/completions", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      Authorization: `Bearer ${process.env.BASEPLATE_API_KEY}`,
    },
    body: JSON.stringify({
      messages: body.messages,
      stream: true,
    }),
  });
  const stream = new ReadableStream({
    async start(controller) {
      // callback
      function onParse(event: ParsedEvent | ReconnectInterval) {
        if (event.type === "event") {
          const data = event.data;
          // https://beta.openai.com/docs/api-reference/completions/create#completions/create-stream
          if (data === "[DONE]") {
            controller.close();
            return;
          }
          try {
            const json = JSON.parse(data);
            const text =
              json.choices[0].delta?.content || json.choices[0].text || "";
            const queue = encoder.encode(text);
            controller.enqueue(queue);
          } catch (e) {
            // maybe parse error
            controller.error(e);
          }
        }
      }
      // stream response (SSE) from OpenAI may be fragmented into multiple chunks
      // this ensures we properly read chunks and invoke an event for each SSE event stream
      const parser = createParser(onParse);
      // https://web.dev/streams/#asynchronous-iteration
      for await (const chunk of res.body as any) {
        parser.feed(decoder.decode(chunk));
      }
    },
  });
  return new Response(stream);
}
try {
      res = await fetch(`/api/completions/chat`, {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
        },
        body: JSON.stringify({
          messages: [{role: "user", content: "Hello"}],
        }),
      }).catch((err) => {
        throw err;
      });
    } catch (e: any) {
      console.error(e);
      return;
    }
    setGenerating(false);
    if (!res.ok) {
      const error = await res.json();
      console.error(`Error generating: ${error.message}`);
      return;
    }
    const stream = res.body;
    if (!stream) {
      return;
    }
    const reader = stream.getReader();
    const decoder = new TextDecoder();
    let done = false;
    while (!done) {
      const { value, done: doneReading } = await reader.read();
      done = doneReading;
      const chunkValue = decoder.decode(value);
      console.log(chunkValue);
    }