ai-utils.js
Version:
Build AI applications, chatbots, and agents with JavaScript and TypeScript.
345 lines (344 loc) • 12.5 kB
TypeScript
import z from "zod";
import { AbstractModel } from "../../../model-function/AbstractModel.js";
import { FunctionOptions } from "../../../model-function/FunctionOptions.js";
import { GenerateJsonOrTextModel } from "../../../model-function/generate-json/GenerateJsonOrTextModel.js";
import { DeltaEvent } from "../../../model-function/generate-text/DeltaEvent.js";
import { TextGenerationModel, TextGenerationModelSettings } from "../../../model-function/generate-text/TextGenerationModel.js";
import { PromptMapping } from "../../../prompt/PromptMapping.js";
import { PromptMappingTextGenerationModel } from "../../../prompt/PromptMappingTextGenerationModel.js";
import { ResponseHandler } from "../../../util/api/postToApi.js";
import { OpenAIModelSettings } from "../OpenAIModelSettings.js";
import { TikTokenTokenizer } from "../TikTokenTokenizer.js";
import { OpenAIChatMessage } from "./OpenAIChatMessage.js";
import { OpenAIChatAutoFunctionPrompt, OpenAIChatSingleFunctionPrompt, OpenAIFunctionDescription } from "./OpenAIChatPrompt.js";
import { OpenAIChatDelta } from "./OpenAIChatStreamIterable.js";
export declare const OPENAI_CHAT_MODELS: {
"gpt-4": {
contextWindowSize: number;
promptTokenCostInMillicents: number;
completionTokenCostInMillicents: number;
};
"gpt-4-0314": {
contextWindowSize: number;
promptTokenCostInMillicents: number;
completionTokenCostInMillicents: number;
};
"gpt-4-0613": {
contextWindowSize: number;
promptTokenCostInMillicents: number;
completionTokenCostInMillicents: number;
};
"gpt-4-32k": {
contextWindowSize: number;
promptTokenCostInMillicents: number;
completionTokenCostInMillicents: number;
};
"gpt-4-32k-0314": {
contextWindowSize: number;
promptTokenCostInMillicents: number;
completionTokenCostInMillicents: number;
};
"gpt-4-32k-0613": {
contextWindowSize: number;
promptTokenCostInMillicents: number;
completionTokenCostInMillicents: number;
};
"gpt-3.5-turbo": {
contextWindowSize: number;
promptTokenCostInMillicents: number;
completionTokenCostInMillicents: number;
};
"gpt-3.5-turbo-0301": {
contextWindowSize: number;
promptTokenCostInMillicents: number;
completionTokenCostInMillicents: number;
};
"gpt-3.5-turbo-0613": {
contextWindowSize: number;
promptTokenCostInMillicents: number;
completionTokenCostInMillicents: number;
};
"gpt-3.5-turbo-16k": {
contextWindowSize: number;
promptTokenCostInMillicents: number;
completionTokenCostInMillicents: number;
};
"gpt-3.5-turbo-16k-0613": {
contextWindowSize: number;
promptTokenCostInMillicents: number;
completionTokenCostInMillicents: number;
};
};
export type OpenAIChatModelType = keyof typeof OPENAI_CHAT_MODELS;
export declare const isOpenAIChatModel: (model: string) => model is "gpt-4" | "gpt-4-0314" | "gpt-4-0613" | "gpt-4-32k" | "gpt-4-32k-0314" | "gpt-4-32k-0613" | "gpt-3.5-turbo" | "gpt-3.5-turbo-0301" | "gpt-3.5-turbo-0613" | "gpt-3.5-turbo-16k" | "gpt-3.5-turbo-16k-0613";
export declare const calculateOpenAIChatCostInMillicents: ({ model, response, }: {
model: OpenAIChatModelType;
response: OpenAIChatResponse;
}) => number;
export interface OpenAIChatCallSettings {
model: OpenAIChatModelType;
functions?: Array<{
name: string;
description?: string;
parameters: unknown;
}>;
functionCall?: "none" | "auto" | {
name: string;
};
temperature?: number;
topP?: number;
n?: number;
stop?: string | string[];
maxTokens?: number;
presencePenalty?: number;
frequencyPenalty?: number;
}
export interface OpenAIChatSettings extends TextGenerationModelSettings, OpenAIModelSettings, OpenAIChatCallSettings {
isUserIdForwardingEnabled?: boolean;
}
/**
* Create a text generation model that calls the OpenAI chat completion API.
*
* @see https://platform.openai.com/docs/api-reference/chat/create
*
* @example
* const model = new OpenAIChatModel({
* model: "gpt-3.5-turbo",
* temperature: 0.7,
* maxTokens: 500,
* });
*
* const { text } = await generateText([
* model,
* OpenAIChatMessage.system(
* "Write a short story about a robot learning to love:"
* ),
* ]);
*/
export declare class OpenAIChatModel extends AbstractModel<OpenAIChatSettings> implements TextGenerationModel<OpenAIChatMessage[], OpenAIChatResponse, OpenAIChatDelta, OpenAIChatSettings>, GenerateJsonOrTextModel<OpenAIChatSingleFunctionPrompt<unknown> | OpenAIChatAutoFunctionPrompt<Array<OpenAIFunctionDescription<unknown>>>, OpenAIChatResponse, OpenAIChatSettings> {
constructor(settings: OpenAIChatSettings);
readonly provider: "openai";
get modelName(): "gpt-4" | "gpt-4-0314" | "gpt-4-0613" | "gpt-4-32k" | "gpt-4-32k-0314" | "gpt-4-32k-0613" | "gpt-3.5-turbo" | "gpt-3.5-turbo-0301" | "gpt-3.5-turbo-0613" | "gpt-3.5-turbo-16k" | "gpt-3.5-turbo-16k-0613";
readonly contextWindowSize: number;
readonly tokenizer: TikTokenTokenizer;
private get apiKey();
/**
* Counts the prompt tokens required for the messages. This includes the message base tokens
* and the prompt base tokens.
*/
countPromptTokens(messages: OpenAIChatMessage[]): Promise<number>;
callAPI<RESULT>(messages: Array<OpenAIChatMessage>, options: {
responseFormat: OpenAIChatResponseFormatType<RESULT>;
} & FunctionOptions<Partial<OpenAIChatCallSettings & OpenAIModelSettings & {
user?: string;
}>>): Promise<RESULT>;
generateTextResponse(prompt: OpenAIChatMessage[], options?: FunctionOptions<OpenAIChatSettings>): Promise<{
object: "chat.completion";
model: string;
id: string;
created: number;
usage: {
prompt_tokens: number;
total_tokens: number;
completion_tokens: number;
};
choices: {
message: {
content: string | null;
role: "assistant";
function_call?: {
name: string;
arguments: string;
} | undefined;
};
finish_reason: string;
index: number;
logprobs?: any;
}[];
}>;
extractText(response: OpenAIChatResponse): string;
generateDeltaStreamResponse(prompt: OpenAIChatMessage[], options?: FunctionOptions<OpenAIChatSettings>): Promise<AsyncIterable<DeltaEvent<OpenAIChatDelta>>>;
extractTextDelta(fullDelta: OpenAIChatDelta): string | undefined;
/**
* JSON generation uses the OpenAI GPT function calling API.
* It provides a single function specification and instructs the model to provide parameters for calling the function.
* The result is returned as parsed JSON.
*
* @see https://platform.openai.com/docs/guides/gpt/function-calling
*/
generateJsonResponse(prompt: OpenAIChatSingleFunctionPrompt<unknown> | OpenAIChatAutoFunctionPrompt<Array<OpenAIFunctionDescription<unknown>>>, options?: FunctionOptions<OpenAIChatSettings> | undefined): PromiseLike<OpenAIChatResponse>;
mapPrompt<INPUT_PROMPT>(promptMapping: PromptMapping<INPUT_PROMPT, OpenAIChatMessage[]>): PromptMappingTextGenerationModel<INPUT_PROMPT, OpenAIChatMessage[], OpenAIChatResponse, OpenAIChatDelta, OpenAIChatSettings, this>;
withSettings(additionalSettings: Partial<OpenAIChatSettings>): this;
get maxCompletionTokens(): number | undefined;
withMaxCompletionTokens(maxCompletionTokens: number): this;
withStopTokens(stopTokens: string[]): this;
}
declare const openAIChatResponseSchema: z.ZodObject<{
id: z.ZodString;
object: z.ZodLiteral<"chat.completion">;
created: z.ZodNumber;
model: z.ZodString;
choices: z.ZodArray<z.ZodObject<{
message: z.ZodObject<{
role: z.ZodLiteral<"assistant">;
content: z.ZodNullable<z.ZodString>;
function_call: z.ZodOptional<z.ZodObject<{
name: z.ZodString;
arguments: z.ZodString;
}, "strip", z.ZodTypeAny, {
name: string;
arguments: string;
}, {
name: string;
arguments: string;
}>>;
}, "strip", z.ZodTypeAny, {
content: string | null;
role: "assistant";
function_call?: {
name: string;
arguments: string;
} | undefined;
}, {
content: string | null;
role: "assistant";
function_call?: {
name: string;
arguments: string;
} | undefined;
}>;
index: z.ZodNumber;
logprobs: z.ZodNullable<z.ZodAny>;
finish_reason: z.ZodString;
}, "strip", z.ZodTypeAny, {
message: {
content: string | null;
role: "assistant";
function_call?: {
name: string;
arguments: string;
} | undefined;
};
finish_reason: string;
index: number;
logprobs?: any;
}, {
message: {
content: string | null;
role: "assistant";
function_call?: {
name: string;
arguments: string;
} | undefined;
};
finish_reason: string;
index: number;
logprobs?: any;
}>, "many">;
usage: z.ZodObject<{
prompt_tokens: z.ZodNumber;
completion_tokens: z.ZodNumber;
total_tokens: z.ZodNumber;
}, "strip", z.ZodTypeAny, {
prompt_tokens: number;
total_tokens: number;
completion_tokens: number;
}, {
prompt_tokens: number;
total_tokens: number;
completion_tokens: number;
}>;
}, "strip", z.ZodTypeAny, {
object: "chat.completion";
model: string;
id: string;
created: number;
usage: {
prompt_tokens: number;
total_tokens: number;
completion_tokens: number;
};
choices: {
message: {
content: string | null;
role: "assistant";
function_call?: {
name: string;
arguments: string;
} | undefined;
};
finish_reason: string;
index: number;
logprobs?: any;
}[];
}, {
object: "chat.completion";
model: string;
id: string;
created: number;
usage: {
prompt_tokens: number;
total_tokens: number;
completion_tokens: number;
};
choices: {
message: {
content: string | null;
role: "assistant";
function_call?: {
name: string;
arguments: string;
} | undefined;
};
finish_reason: string;
index: number;
logprobs?: any;
}[];
}>;
export type OpenAIChatResponse = z.infer<typeof openAIChatResponseSchema>;
export type OpenAIChatResponseFormatType<T> = {
stream: boolean;
handler: ResponseHandler<T>;
};
export declare const OpenAIChatResponseFormat: {
/**
* Returns the response as a JSON object.
*/
json: {
stream: false;
handler: ResponseHandler<{
object: "chat.completion";
model: string;
id: string;
created: number;
usage: {
prompt_tokens: number;
total_tokens: number;
completion_tokens: number;
};
choices: {
message: {
content: string | null;
role: "assistant";
function_call?: {
name: string;
arguments: string;
} | undefined;
};
finish_reason: string;
index: number;
logprobs?: any;
}[];
}>;
};
/**
* Returns an async iterable over the text deltas (only the tex different of the first choice).
*/
deltaIterable: {
stream: true;
handler: ({ response }: {
response: Response;
}) => Promise<AsyncIterable<DeltaEvent<OpenAIChatDelta>>>;
};
};
export {};