hts/packages/isdk/prompts/openai.tsx

282 lines
6.9 KiB
TypeScript

import { Message } from '../shared/types';
export function experimental_buildOpenAIMessages(
messages: Message[],
): ChatCompletionMessageParam[] {
return messages.map(message => {
switch (message.role) {
case 'system':
case 'user':
return {
role: message.role,
content: message.content,
} satisfies ChatCompletionMessageParam;
case 'assistant': {
const function_call = message.function_call;
if (
function_call !== undefined &&
(typeof function_call === 'string' ||
function_call.arguments === undefined ||
function_call.name === undefined)
) {
throw new Error(
'Invalid function call in message. Expected a function call object',
);
}
return {
role: message.role,
content: message.content,
function_call:
function_call === undefined
? undefined
: {
name: function_call.name!,
arguments: function_call.arguments!,
},
} satisfies ChatCompletionMessageParam;
}
case 'function': {
if (message.name === undefined) {
throw new Error('Invalid function call in message. Expected a name');
}
return {
role: message.role,
content: message.content,
name: message.name,
} satisfies ChatCompletionMessageParam;
}
case 'data': {
throw "unsupported message role 'data'";
}
case 'tool': {
if (message.name === undefined) {
throw new Error('Invalid tool message. Expected a name');
}
if (message.tool_call_id === undefined) {
throw new Error('Invalid tool message. Expected a tool_call_id');
}
return {
role: message.role,
content: message.content,
tool_call_id: message.tool_call_id,
} satisfies ChatCompletionMessageParam;
}
}
});
}
// copy of open ai messages (so we don't have a dependency on the openai package)
export type ChatCompletionMessageParam =
| ChatCompletionSystemMessageParam
| ChatCompletionUserMessageParam
| ChatCompletionAssistantMessageParam
| ChatCompletionToolMessageParam
| ChatCompletionFunctionMessageParam;
export interface ChatCompletionSystemMessageParam {
/**
* The contents of the system message.
*/
content: string;
/**
* The role of the messages author, in this case `system`.
*/
role: 'system';
/**
* An optional name for the participant. Provides the model information to
* differentiate between participants of the same role.
*/
name?: string;
}
export interface ChatCompletionUserMessageParam {
/**
* The contents of the user message.
*/
content: string | Array<ChatCompletionContentPart>;
/**
* The role of the messages author, in this case `user`.
*/
role: 'user';
/**
* An optional name for the participant. Provides the model information to
* differentiate between participants of the same role.
*/
name?: string;
}
export type ChatCompletionContentPart =
| ChatCompletionContentPartText
| ChatCompletionContentPartImage;
export interface ChatCompletionContentPartText {
/**
* The text content.
*/
text: string;
/**
* The type of the content part.
*/
type: 'text';
}
export interface ChatCompletionContentPartImage {
image_url: ChatCompletionContentPartImage.ImageURL;
/**
* The type of the content part.
*/
type: 'image_url';
}
export namespace ChatCompletionContentPartImage {
export interface ImageURL {
/**
* Either a URL of the image or the base64 encoded image data.
*/
url: string;
/**
* Specifies the detail level of the image. Learn more in the
* [Vision guide](https://platform.openai.com/docs/guides/vision/low-or-high-fidelity-image-understanding).
*/
detail?: 'auto' | 'low' | 'high';
}
}
export interface ChatCompletionAssistantMessageParam {
/**
* The role of the messages author, in this case `assistant`.
*/
role: 'assistant';
/**
* The contents of the assistant message. Required unless `tool_calls` or
* `function_call` is specified.
*/
content?: string | null;
/**
* @deprecated: Deprecated and replaced by `tool_calls`. The name and arguments of
* a function that should be called, as generated by the model.
*/
function_call?: ChatCompletionAssistantMessageParam.FunctionCall;
/**
* An optional name for the participant. Provides the model information to
* differentiate between participants of the same role.
*/
name?: string;
/**
* The tool calls generated by the model, such as function calls.
*/
tool_calls?: Array<ChatCompletionMessageToolCall>;
}
export namespace ChatCompletionAssistantMessageParam {
/**
* @deprecated: Deprecated and replaced by `tool_calls`. The name and arguments of
* a function that should be called, as generated by the model.
*/
export interface FunctionCall {
/**
* The arguments to call the function with, as generated by the model in JSON
* format. Note that the model does not always generate valid JSON, and may
* hallucinate parameters not defined by your function schema. Validate the
* arguments in your code before calling your function.
*/
arguments: string;
/**
* The name of the function to call.
*/
name: string;
}
}
export interface ChatCompletionMessageToolCall {
/**
* The ID of the tool call.
*/
id: string;
/**
* The function that the model called.
*/
function: ChatCompletionMessageToolCall.Function;
/**
* The type of the tool. Currently, only `function` is supported.
*/
type: 'function';
}
export namespace ChatCompletionMessageToolCall {
/**
* The function that the model called.
*/
export interface Function {
/**
* The arguments to call the function with, as generated by the model in JSON
* format. Note that the model does not always generate valid JSON, and may
* hallucinate parameters not defined by your function schema. Validate the
* arguments in your code before calling your function.
*/
arguments: string;
/**
* The name of the function to call.
*/
name: string;
}
}
export interface ChatCompletionToolMessageParam {
/**
* The contents of the tool message.
*/
content: string;
/**
* The role of the messages author, in this case `tool`.
*/
role: 'tool';
/**
* Tool call that this message is responding to.
*/
tool_call_id: string;
}
export interface ChatCompletionFunctionMessageParam {
/**
* The return value from the function call, to return to the model.
*/
content: string | null;
/**
* The name of the function to call.
*/
name: string;
/**
* The role of the messages author, in this case `function`.
*/
role: 'function';
}