jorel
Version:
The easiest way to use LLMs, including streams, images, documents, tools and various agent scenarios.
198 lines (197 loc) • 6.43 kB
TypeScript
import { Nullable } from "../shared";
import { LLmToolContextSegment, LlmToolKit } from "../tools";
import { LoggerOption, LogLevel, LogService } from "../logger";
import { ZodObject } from "zod";
export type LlmToolChoice = "none" | "auto" | "required" | string;
export type JsonSpecification = ZodObject<any> | Record<string, unknown>;
export interface LlmModelParameterOverrides {
noTemperature: boolean;
noSystemMessage: boolean;
}
export type LlmModelParameterOverridesLookup = {
[model: string]: Partial<LlmModelParameterOverrides>;
};
interface CoreLlmGenerationConfig {
temperature?: Nullable<number>;
maxTokens?: number;
json?: boolean | JsonSpecification;
jsonDescription?: string;
tools?: LlmToolKit;
toolChoice?: LlmToolChoice;
logLevel?: LogLevel;
}
export interface LlmGenerationConfig extends CoreLlmGenerationConfig {
logger?: LogService;
}
export interface InitLlmGenerationConfig extends CoreLlmGenerationConfig {
logger?: LoggerOption | LogService;
}
export interface LlmSystemMessage {
id?: string;
role: "system";
content: string;
createdAt?: number;
}
export interface LLmMessageTextContent {
type: "text";
text: string;
}
export interface LLmMessageImageUrlContent {
type: "imageUrl";
mimeType?: string;
url: string;
metadata?: Record<string, number | string | boolean | null>;
}
export interface LLmMessageImageDataUrlContent {
type: "imageData";
mimeType?: string;
data: string;
metadata?: Record<string, number | string | boolean | null>;
}
export type LlmUserMessageContent = LLmMessageTextContent | LLmMessageImageUrlContent | LLmMessageImageDataUrlContent;
export interface LlmUserMessage {
id?: string;
role: "user";
content: LlmUserMessageContent[];
createdAt?: number;
}
export type LlmFunctionParameter = "string" | "number" | "integer" | "boolean" | "array" | "object";
export interface LlmFunctionParameters {
type?: LlmFunctionParameter;
properties?: Record<string, Partial<LlmFunctionParameters>>;
items?: Partial<LlmFunctionParameters> | Partial<LlmFunctionParameters>[];
required?: string[];
additionalProperties?: boolean | Partial<LlmFunctionParameters>;
[key: string]: unknown;
}
export interface LlmFunction {
type: "function";
function: {
name: string;
description: string;
parameters?: LlmFunctionParameters;
};
}
export interface LlmToolCallRequest {
id: string;
function: {
name: string;
arguments: object;
};
}
export type LlmToolExecutionInputs = any;
export type LlmToolExecutionOutputs = any;
export type LlmToolExecutor = (ToolExecutionInputs: LlmToolExecutionInputs, context: LLmToolContextSegment, secureContext: LLmToolContextSegment) => Promise<LlmToolExecutionOutputs>;
export type LlmToolCallApprovalState = "noApprovalRequired" | "requiresApproval" | "approved" | "rejected";
export interface LlmToolCall__Pending {
id: string;
approvalState: LlmToolCallApprovalState;
executionState: "pending";
request: LlmToolCallRequest;
result: null;
error?: null;
}
export interface LlmToolCall__InProgress {
id: string;
approvalState: LlmToolCallApprovalState;
executionState: "inProgress";
request: LlmToolCallRequest;
result: Nullable<object>;
error?: null;
}
export interface LlmToolCall__Completed {
id: string;
approvalState: LlmToolCallApprovalState;
executionState: "completed";
request: LlmToolCallRequest;
result: object;
error?: null;
}
export interface LlmToolCall__Error {
id: string;
approvalState: LlmToolCallApprovalState;
executionState: "error";
request: LlmToolCallRequest;
result: null;
error: {
type: string;
message: string;
numberOfAttempts: number;
lastAttempt: Date;
};
}
export type LlmToolCall = LlmToolCall__Pending | LlmToolCall__InProgress | LlmToolCall__Completed | LlmToolCall__Error;
export interface LlmAssistantMessage {
id: string;
role: "assistant";
content: string;
meta?: LlmAssistantMessageMeta;
createdAt?: number;
}
export interface LlmAssistantMessageWithToolCalls {
id: string;
role: "assistant_with_tools";
content: Nullable<string>;
toolCalls: LlmToolCall[];
meta?: LlmAssistantMessageMeta;
createdAt?: number;
}
export interface LlmAssistantMessageMeta {
model: string;
provider: string;
temperature: number | undefined;
durationMs: number;
inputTokens?: number;
outputTokens?: number;
}
export type LlmMessage = LlmSystemMessage | LlmUserMessage | LlmAssistantMessage | LlmAssistantMessageWithToolCalls;
export type LlmResponse = (LlmAssistantMessage | LlmAssistantMessageWithToolCalls) & {
meta: LlmAssistantMessageMeta;
};
export interface LlmTextResponseWithMeta {
response: string;
meta: LlmAssistantMessageMeta;
messages: LlmMessage[];
}
export interface LlmJsonResponseWithMeta {
response: object;
meta: LlmAssistantMessageMeta;
messages: LlmMessage[];
}
export interface LlmStreamResponseChunk {
type: "chunk";
content: string;
}
export interface LlmStreamResponse {
type: "response";
role: "assistant";
content: string;
meta: LlmAssistantMessageMeta;
}
export interface LlmStreamResponseWithToolCalls {
type: "response";
role: "assistant_with_tools";
content: Nullable<string>;
toolCalls: LlmToolCall[];
meta: LlmAssistantMessageMeta;
}
export interface LlmStreamResponseMessages {
type: "messages";
messages: LlmMessage[];
}
export interface LlmStreamToolCallStarted {
type: "toolCallStarted";
toolCall: LlmToolCall__Pending;
}
export interface LlmStreamToolCallCompleted {
type: "toolCallCompleted";
toolCall: LlmToolCall__Completed | LlmToolCall__Error;
}
export interface LlmCoreProvider {
readonly name: string;
generateResponse(model: string, messages: LlmMessage[], config?: LlmGenerationConfig): Promise<LlmResponse>;
generateResponseStream(model: string, messages: LlmMessage[], config?: LlmGenerationConfig): AsyncGenerator<LlmStreamResponseChunk | LlmStreamResponse | LlmStreamResponseWithToolCalls | LlmStreamToolCallStarted | LlmStreamToolCallCompleted, void, unknown>;
getAvailableModels(): Promise<string[]>;
createEmbedding(model: string, text: string): Promise<number[]>;
}
export {};