59 lines
1.6 KiB
TypeScript
59 lines
1.6 KiB
TypeScript
import { z } from "zod";
|
|
import {
|
|
flattenOpenAIChatMessages,
|
|
OpenAIV1ChatCompletionSchema,
|
|
} from "./openai";
|
|
import { APIFormatTransformer } from "./index";
|
|
|
|
export const OpenAIV1TextCompletionSchema = z
|
|
.object({
|
|
model: z
|
|
.string()
|
|
.max(100)
|
|
.regex(
|
|
/^gpt-3.5-turbo-instruct/,
|
|
"Model must start with 'gpt-3.5-turbo-instruct'"
|
|
),
|
|
prompt: z.string({
|
|
required_error:
|
|
"No `prompt` found. Ensure you've set the correct completion endpoint.",
|
|
}),
|
|
logprobs: z.number().int().nullish().default(null),
|
|
echo: z.boolean().optional().default(false),
|
|
best_of: z.literal(1).optional(),
|
|
stop: z
|
|
.union([z.string().max(500), z.array(z.string().max(500)).max(4)])
|
|
.optional(),
|
|
suffix: z.string().max(1000).optional(),
|
|
})
|
|
.strip()
|
|
.merge(OpenAIV1ChatCompletionSchema.omit({ messages: true, logprobs: true }));
|
|
|
|
export const transformOpenAIToOpenAIText: APIFormatTransformer<
|
|
typeof OpenAIV1TextCompletionSchema
|
|
> = async (req) => {
|
|
const { body } = req;
|
|
const result = OpenAIV1ChatCompletionSchema.safeParse(body);
|
|
if (!result.success) {
|
|
req.log.warn(
|
|
{ issues: result.error.issues, body },
|
|
"Invalid OpenAI-to-OpenAI-text request"
|
|
);
|
|
throw result.error;
|
|
}
|
|
|
|
const { messages, ...rest } = result.data;
|
|
const prompt = flattenOpenAIChatMessages(messages);
|
|
|
|
let stops = rest.stop
|
|
? Array.isArray(rest.stop)
|
|
? rest.stop
|
|
: [rest.stop]
|
|
: [];
|
|
stops.push("\n\nUser:");
|
|
stops = [...new Set(stops)];
|
|
|
|
const transformed = { ...rest, prompt: prompt, stop: stops };
|
|
return OpenAIV1TextCompletionSchema.parse(transformed);
|
|
};
|