UNPKG

@instructor-ai/instructor

Version:
1 lines 30.8 kB
{"version":3,"sources":["../src/instructor.ts","../src/lib/index.ts","../src/constants/providers.ts","../src/index.ts"],"names":["OpenAI","Stream","ZodError","ZodStream","OAIResponseParser","OAIStream","withResponseModel","fromZodError","omit","keys","obj","result","key","iterableTee","iterable","n","buffers","resolvers","iterator","done","reader","index","resolve","item","buffer","_","i","thinkingJsonParser","ZMODE","MODE","MODE_TO_RESPONSE_PARSER","PROVIDERS","PROVIDER_SUPPORTED_MODES","NON_OAI_PROVIDER_URLS","PROVIDER_PARAMS_TRANSFORMERS","params","tool","PROVIDER_SUPPORTED_MODES_BY_MODEL","MAX_RETRIES_DEFAULT","Instructor","client","mode","debug","logger","retryAllErrors","requestOptions","isGenericClient","provider","isModeSupported","level","args","timestamp","max_retries","response_model","attempts","validationIssues","lastMessage","paramsTransformer","completionParams","makeCompletionCall","resolvedParams","completion","error","parsedCompletion","responseJson","makeCompletionCallWithRetries","data","validation","streamClient","checkForUsage","chunk","streamUsage","structuredStream","completion1","completion2","createInstructor","instructor","target","prop","receiver","src_default"],"mappings":"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","sourcesContent":["import {\n ChatCompletionCreateParamsWithModel,\n ClientTypeChatCompletionRequestOptions,\n GenericChatCompletion,\n GenericClient,\n InstructorConfig,\n LogLevel,\n OpenAILikeClient,\n ReturnTypeBasedOnParams\n} from \"@/types\"\nimport OpenAI from \"openai\"\nimport { Stream } from \"openai/streaming\"\nimport { z, ZodError } from \"zod\"\nimport ZodStream, { OAIResponseParser, OAIStream, withResponseModel } from \"zod-stream\"\nimport { fromZodError } from \"zod-validation-error\"\n\nimport {\n MODE_TO_RESPONSE_PARSER,\n NON_OAI_PROVIDER_URLS,\n Provider,\n PROVIDER_PARAMS_TRANSFORMERS,\n PROVIDER_SUPPORTED_MODES,\n PROVIDERS\n} from \"./constants/providers\"\nimport { iterableTee } from \"./lib\"\nimport { ClientTypeChatCompletionParams, CompletionMeta, Mode } from \"./types\"\n\nconst MAX_RETRIES_DEFAULT = 0\n\nclass Instructor<C> {\n readonly client: OpenAILikeClient<C>\n readonly mode: Mode\n readonly provider: Provider\n readonly debug: boolean = false\n readonly retryAllErrors: boolean = false\n readonly logger?: <T extends unknown[]>(level: LogLevel, ...args: T) => void\n\n /**\n * Creates an instance of the `Instructor` class.\n * @param {OpenAILikeClient} client - An OpenAI-like client.\n * @param {string} mode - The mode of operation.\n */\n constructor({\n client,\n mode,\n debug = false,\n logger = undefined,\n retryAllErrors = false\n }: InstructorConfig<C>) {\n if (!isGenericClient(client) && !(client instanceof OpenAI)) {\n throw new Error(\"Client does not match the required structure\")\n }\n\n if (client instanceof OpenAI) {\n this.client = client as OpenAI\n } else {\n this.client = client as C & GenericClient\n }\n\n // this.client = client\n this.mode = mode\n this.debug = debug\n this.retryAllErrors = retryAllErrors\n this.logger = logger ?? undefined\n\n const provider =\n typeof this.client?.baseURL === \"string\" ?\n this.client?.baseURL.includes(NON_OAI_PROVIDER_URLS.ANYSCALE) ? PROVIDERS.ANYSCALE\n : this.client?.baseURL.includes(NON_OAI_PROVIDER_URLS.TOGETHER) ? PROVIDERS.TOGETHER\n : this.client?.baseURL.includes(NON_OAI_PROVIDER_URLS.OAI) ? PROVIDERS.OAI\n : this.client?.baseURL.includes(NON_OAI_PROVIDER_URLS.ANTHROPIC) ? PROVIDERS.ANTHROPIC\n : this.client?.baseURL.includes(NON_OAI_PROVIDER_URLS.GROQ) ? PROVIDERS.GROQ\n : PROVIDERS.OTHER\n : PROVIDERS.OTHER\n\n this.provider = provider\n\n this.validateOptions()\n }\n\n private validateOptions() {\n const isModeSupported = PROVIDER_SUPPORTED_MODES[this.provider].includes(this.mode)\n\n if (this.provider === PROVIDERS.OTHER) {\n this.log(\"debug\", \"Unknown provider - cant validate options.\")\n }\n\n if (!isModeSupported) {\n this.log(\"warn\", `Mode ${this.mode} may not be supported by provider ${this.provider}`)\n }\n }\n\n private log<T extends unknown[]>(level: LogLevel, ...args: T) {\n if (this.logger) {\n this.logger(level, ...args)\n }\n\n if (!this.debug && level === \"debug\") {\n return\n }\n\n const timestamp = new Date().toISOString()\n switch (level) {\n case \"debug\":\n console.debug(`[Instructor:DEBUG] ${timestamp}:`, ...args)\n break\n case \"info\":\n console.info(`[Instructor:INFO] ${timestamp}:`, ...args)\n break\n case \"warn\":\n console.warn(`[Instructor:WARN] ${timestamp}:`, ...args)\n break\n case \"error\":\n console.error(`[Instructor:ERROR] ${timestamp}:`, ...args)\n break\n }\n }\n\n private async chatCompletionStandard<T extends z.AnyZodObject>(\n {\n max_retries = MAX_RETRIES_DEFAULT,\n response_model,\n ...params\n }: ChatCompletionCreateParamsWithModel<T>,\n requestOptions?: ClientTypeChatCompletionRequestOptions<C>\n ): Promise<z.infer<T>> {\n let attempts = 0\n let validationIssues = \"\"\n let lastMessage: OpenAI.ChatCompletionMessageParam | null = null\n\n const paramsTransformer = PROVIDER_PARAMS_TRANSFORMERS?.[this.provider]?.[this.mode]\n\n let completionParams = withResponseModel({\n params: {\n ...params,\n stream: params.stream ?? false\n } as OpenAI.ChatCompletionCreateParams,\n mode: this.mode,\n response_model\n })\n\n if (!!paramsTransformer) {\n completionParams = paramsTransformer(completionParams)\n }\n\n const makeCompletionCall = async () => {\n let resolvedParams = completionParams\n\n if (validationIssues?.length > 0) {\n resolvedParams = {\n ...completionParams,\n messages: [\n ...completionParams.messages,\n ...(lastMessage ? [lastMessage] : []),\n {\n role: \"user\",\n content: `Please correct the function call; errors encountered:\\n ${validationIssues}`\n }\n ]\n }\n }\n\n let completion\n\n try {\n if (this.client.chat?.completions?.create) {\n const result = await this.client.chat.completions.create(\n {\n ...resolvedParams,\n stream: false\n },\n requestOptions\n )\n\n completion = result as GenericChatCompletion<typeof result>\n } else {\n throw new Error(\"Unsupported client type -- no completion method found.\")\n }\n this.log(\"debug\", \"raw standard completion response: \", completion)\n } catch (error) {\n this.log(\n \"error\",\n `Error making completion call - mode: ${this.mode} | Client base URL: ${this.client.baseURL} | with params:`,\n resolvedParams,\n `raw error`,\n error\n )\n\n throw error\n }\n\n const responseParser = MODE_TO_RESPONSE_PARSER?.[this.mode] ?? OAIResponseParser\n const parsedCompletion = responseParser(completion as OpenAI.Chat.Completions.ChatCompletion)\n\n try {\n const responseJson = parsedCompletion.json ?? parsedCompletion\n const data = JSON.parse(responseJson) as z.infer<T> & {\n _meta?: CompletionMeta\n thinking?: string\n }\n return {\n ...data,\n _meta: {\n usage: completion?.usage ?? undefined,\n thinking: parsedCompletion?.thinking ?? undefined\n }\n }\n } catch (error) {\n this.log(\n \"error\",\n \"failed to parse completion\",\n parsedCompletion,\n this.mode,\n \"attempt: \",\n attempts,\n \"max attempts: \",\n max_retries\n )\n\n throw error\n }\n }\n\n const makeCompletionCallWithRetries = async () => {\n try {\n const data = await makeCompletionCall()\n\n const validation = await response_model.schema.safeParseAsync(data)\n this.log(\"debug\", response_model.name, \"Completion validation: \", validation)\n\n if (!validation.success) {\n if (\"error\" in validation) {\n lastMessage = {\n role: \"assistant\",\n content: JSON.stringify(data)\n }\n\n validationIssues = fromZodError(validation.error)?.message\n\n throw validation.error\n } else {\n throw new Error(\"Validation failed.\")\n }\n }\n\n return { ...validation.data, _meta: data?._meta ?? {} }\n } catch (error) {\n if (!this.retryAllErrors && !(error instanceof ZodError)) {\n throw error\n }\n\n if (attempts < max_retries) {\n this.log(\n \"debug\",\n `response model: ${response_model.name} - Retrying, attempt: `,\n attempts\n )\n\n this.log(\n \"warn\",\n `response model: ${response_model.name} - Validation issues: `,\n validationIssues,\n \" - Attempt: \",\n attempts,\n \" - Max attempts: \",\n max_retries\n )\n\n attempts++\n return await makeCompletionCallWithRetries()\n } else {\n this.log(\n \"debug\",\n `response model: ${response_model.name} - Max attempts reached: ${attempts}`\n )\n\n this.log(\n \"error\",\n `response model: ${response_model.name} - Validation issues: `,\n validationIssues\n )\n\n throw error\n }\n }\n }\n\n return makeCompletionCallWithRetries()\n }\n\n private async *chatCompletionStream<T extends z.AnyZodObject>(\n { max_retries, response_model, ...params }: ChatCompletionCreateParamsWithModel<T>,\n requestOptions?: ClientTypeChatCompletionRequestOptions<C>\n ): AsyncGenerator<Partial<T> & { _meta?: CompletionMeta }, void, unknown> {\n if (max_retries) {\n this.log(\"warn\", \"max_retries is not supported for streaming completions\")\n }\n\n const paramsTransformer = PROVIDER_PARAMS_TRANSFORMERS?.[this.provider]?.[this.mode]\n\n let completionParams = withResponseModel({\n params: {\n ...params,\n stream: true\n } as OpenAI.ChatCompletionCreateParams,\n response_model,\n mode: this.mode\n })\n\n if (paramsTransformer) {\n completionParams = paramsTransformer(completionParams)\n }\n\n const streamClient = new ZodStream({\n debug: this.debug ?? false\n })\n\n async function checkForUsage(\n reader: Stream<OpenAI.ChatCompletionChunk> | AsyncIterable<OpenAI.ChatCompletionChunk>\n ) {\n for await (const chunk of reader) {\n if (\"usage\" in chunk) {\n streamUsage = chunk.usage as CompletionMeta[\"usage\"]\n }\n }\n }\n\n let streamUsage: CompletionMeta[\"usage\"] | undefined\n const structuredStream = await streamClient.create({\n completionPromise: async () => {\n if (this.client.chat?.completions?.create) {\n const completion = await this.client.chat.completions.create(\n {\n ...completionParams,\n stream: true\n },\n requestOptions\n )\n\n this.log(\"debug\", \"raw stream completion response: \", completion)\n\n if (\n this.provider === \"OAI\" &&\n completionParams?.stream &&\n \"stream_options\" in completionParams &&\n completion instanceof Stream\n ) {\n const [completion1, completion2] = completion.tee()\n\n checkForUsage(completion1)\n\n return OAIStream({\n res: completion2\n })\n }\n\n //check if async iterator\n if (\n this.provider !== \"OAI\" &&\n completionParams?.stream &&\n completion?.[Symbol.asyncIterator]\n ) {\n const [completion1, completion2] = await iterableTee(\n completion as AsyncIterable<OpenAI.ChatCompletionChunk>,\n 2\n )\n\n checkForUsage(completion1)\n\n return OAIStream({\n res: completion2\n })\n }\n\n return OAIStream({\n res: completion as unknown as AsyncIterable<OpenAI.ChatCompletionChunk>\n })\n } else {\n throw new Error(\"Unsupported client type\")\n }\n },\n response_model\n })\n\n for await (const chunk of structuredStream) {\n yield {\n ...chunk,\n _meta: {\n usage: streamUsage ?? undefined,\n ...(chunk?._meta ?? {})\n }\n }\n }\n }\n\n private isChatCompletionCreateParamsWithModel<T extends z.AnyZodObject>(\n params: ChatCompletionCreateParamsWithModel<T>\n ): params is ChatCompletionCreateParamsWithModel<T> {\n return \"response_model\" in params\n }\n\n private isStandardStream(\n params: OpenAI.ChatCompletionCreateParams\n ): params is OpenAI.ChatCompletionCreateParams {\n return \"stream\" in params && params.stream === true\n }\n\n public chat = {\n completions: {\n create: async <\n T extends z.AnyZodObject,\n P extends T extends z.AnyZodObject ? ChatCompletionCreateParamsWithModel<T>\n : ClientTypeChatCompletionParams<OpenAILikeClient<C>> & { response_model: never }\n >(\n params: P,\n requestOptions?: ClientTypeChatCompletionRequestOptions<C>\n ): Promise<ReturnTypeBasedOnParams<typeof this.client, P>> => {\n if (this.isChatCompletionCreateParamsWithModel(params)) {\n if (params.stream) {\n return this.chatCompletionStream(params, requestOptions) as ReturnTypeBasedOnParams<\n typeof this.client,\n P & { stream: true }\n >\n } else {\n return this.chatCompletionStandard(params, requestOptions) as ReturnTypeBasedOnParams<\n typeof this.client,\n P\n >\n }\n } else {\n if (this.client.chat?.completions?.create) {\n const result =\n this.isStandardStream(params) ?\n await this.client.chat.completions.create(params, requestOptions)\n : await this.client.chat.completions.create(params, requestOptions)\n\n return result as unknown as ReturnTypeBasedOnParams<OpenAILikeClient<C>, P>\n } else {\n throw new Error(\"Completion method is undefined\")\n }\n }\n }\n }\n }\n}\n\nexport type InstructorClient<C> = Instructor<C> & OpenAILikeClient<C>\n\n/**\n * Creates an instance of the `Instructor` class.\n * @param {OpenAILikeClient} client - The OpenAI client.\n * @param {string} mode - The mode of operation.\n * @param {boolean} debug - Whether to log debug messages.\n * @returns {InstructorClient} The extended OpenAI client.\n *\n * @example\n * import createInstructor from \"@instructor-ai/instructor\"\n * import OpenAI from \"openai\n *\n * const OAI = new OpenAi({})\n *\n * const client = createInstructor({\n * client: OAI,\n * mode: \"TOOLS\",\n * })\n *\n * @param args\n * @returns\n */\nexport default function createInstructor<C>(args: InstructorConfig<C>): InstructorClient<C> {\n const instructor = new Instructor<C>(args)\n const instructorWithProxy = new Proxy(instructor, {\n get: (target, prop, receiver) => {\n if (prop in target) {\n return Reflect.get(target, prop, receiver)\n }\n\n return Reflect.get(target.client, prop, receiver)\n }\n })\n\n return instructorWithProxy as InstructorClient<C>\n}\n//eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction isGenericClient(client: any): client is GenericClient {\n return (\n typeof client === \"object\" &&\n client !== null &&\n \"chat\" in client &&\n typeof client.chat === \"object\" &&\n \"completions\" in client.chat &&\n typeof client.chat.completions === \"object\" &&\n \"create\" in client.chat.completions &&\n typeof client.chat.completions.create === \"function\"\n )\n}\n","export function omit<T extends object, K extends keyof T>(keys: K[], obj: T): Omit<T, K> {\n const result = {} as Omit<T, K>\n for (const key in obj) {\n if (obj.hasOwnProperty(key) && !keys.includes(key as unknown as K)) {\n result[key as unknown as Exclude<keyof T, K>] = obj[key] as unknown as T[Exclude<keyof T, K>]\n }\n }\n return result\n}\n\nexport async function iterableTee<T>(\n iterable: AsyncIterable<T>,\n n: number\n): Promise<AsyncGenerator<T>[]> {\n const buffers: T[][] = Array.from({ length: n }, () => [])\n const resolvers: (() => void)[] = []\n const iterator = iterable[Symbol.asyncIterator]()\n let done = false\n\n async function* reader(index: number) {\n while (true) {\n if (buffers[index].length > 0) {\n yield buffers[index].shift()!\n } else if (done) {\n break\n } else {\n await new Promise<void>(resolve => resolvers.push(resolve))\n }\n }\n }\n\n ;(async () => {\n for await (const item of {\n [Symbol.asyncIterator]: () => iterator\n }) {\n for (const buffer of buffers) {\n buffer.push(item)\n }\n\n while (resolvers.length > 0) {\n resolvers.shift()!()\n }\n }\n done = true\n while (resolvers.length > 0) {\n resolvers.shift()!()\n }\n })()\n\n return Array.from({ length: n }, (_, i) => reader(i))\n}\n","import { omit } from \"@/lib\"\nimport OpenAI from \"openai\"\nimport { z } from \"zod\"\nimport { thinkingJsonParser, withResponseModel, MODE as ZMODE } from \"zod-stream\"\n\nimport { Mode } from \"../types\"\n\nexport const MODE: typeof ZMODE = ZMODE\n\nexport const MODE_TO_RESPONSE_PARSER = {\n [MODE.THINKING_MD_JSON]: thinkingJsonParser\n}\n\nexport const PROVIDERS = {\n OAI: \"OAI\",\n ANYSCALE: \"ANYSCALE\",\n TOGETHER: \"TOGETHER\",\n ANTHROPIC: \"ANTHROPIC\",\n GROQ: \"GROQ\",\n OTHER: \"OTHER\"\n} as const\n\nexport type Provider = keyof typeof PROVIDERS\n\nexport const PROVIDER_SUPPORTED_MODES: {\n [key in Provider]: Mode[]\n} = {\n [PROVIDERS.OTHER]: [MODE.FUNCTIONS, MODE.TOOLS, MODE.JSON, MODE.JSON_SCHEMA, MODE.MD_JSON],\n [PROVIDERS.OAI]: [MODE.FUNCTIONS, MODE.TOOLS, MODE.JSON, MODE.MD_JSON],\n [PROVIDERS.ANYSCALE]: [MODE.TOOLS, MODE.JSON, MODE.JSON_SCHEMA, MODE.MD_JSON],\n [PROVIDERS.TOGETHER]: [MODE.TOOLS, MODE.JSON, MODE.JSON_SCHEMA, MODE.MD_JSON],\n [PROVIDERS.ANTHROPIC]: [MODE.MD_JSON, MODE.TOOLS],\n [PROVIDERS.GROQ]: [MODE.TOOLS, MODE.FUNCTIONS, MODE.MD_JSON]\n} as const\n\nexport const NON_OAI_PROVIDER_URLS = {\n [PROVIDERS.ANYSCALE]: \"api.endpoints.anyscale\",\n [PROVIDERS.TOGETHER]: \"api.together.xyz\",\n [PROVIDERS.OAI]: \"api.openai.com\",\n [PROVIDERS.ANTHROPIC]: \"api.anthropic.com\",\n [PROVIDERS.GROQ]: \"api.groq.com\"\n} as const\n\nexport const PROVIDER_PARAMS_TRANSFORMERS = {\n [PROVIDERS.GROQ]: {\n [MODE.TOOLS]: function groqToolsParamsTransformer<\n T extends z.AnyZodObject,\n P extends OpenAI.ChatCompletionCreateParams\n >(params: ReturnType<typeof withResponseModel<T, \"TOOLS\", P>>) {\n if (params.tools.some(tool => tool) && params.stream) {\n console.warn(\"Streaming may not be supported when using tools in Groq, try MD_JSON instead\")\n return params\n }\n\n return params\n }\n },\n [PROVIDERS.ANYSCALE]: {\n [MODE.JSON_SCHEMA]: function removeAdditionalPropertiesKeyJSONSchema<\n T extends z.AnyZodObject,\n P extends OpenAI.ChatCompletionCreateParams\n >(params: ReturnType<typeof withResponseModel<T, \"JSON_SCHEMA\", P>>) {\n if (\"additionalProperties\" in params.response_format.schema) {\n return {\n ...params,\n response_format: {\n ...params.response_format,\n schema: omit([\"additionalProperties\"], params.response_format.schema)\n }\n }\n }\n\n return params\n },\n [MODE.TOOLS]: function removeAdditionalPropertiesKeyTools<\n T extends z.AnyZodObject,\n P extends OpenAI.ChatCompletionCreateParams\n >(params: ReturnType<typeof withResponseModel<T, \"TOOLS\", P>>) {\n if (params.tools.some(tool => tool.function?.parameters)) {\n return {\n ...params,\n tools: params.tools.map(tool => {\n if (tool.function?.parameters) {\n return {\n ...tool,\n function: {\n ...tool.function,\n parameters: omit([\"additionalProperties\"], tool.function.parameters)\n }\n }\n }\n\n return tool\n })\n }\n }\n\n return params\n }\n }\n} as const\n\nexport const PROVIDER_SUPPORTED_MODES_BY_MODEL = {\n [PROVIDERS.OTHER]: {\n [MODE.FUNCTIONS]: [\"*\"],\n [MODE.TOOLS]: [\"*\"],\n [MODE.JSON]: [\"*\"],\n [MODE.MD_JSON]: [\"*\"],\n [MODE.JSON_SCHEMA]: [\"*\"],\n [MODE.THINKING_MD_JSON]: [\"*\"]\n },\n [PROVIDERS.OAI]: {\n [MODE.FUNCTIONS]: [\"*\"],\n [MODE.TOOLS]: [\"*\"],\n [MODE.JSON]: [\"*\"],\n [MODE.MD_JSON]: [\"*\"]\n },\n [PROVIDERS.TOGETHER]: {\n [MODE.MD_JSON]: [\"*\"]\n // [MODE.JSON_SCHEMA]: [\"*\"]\n // [MODE.TOOLS]: [\"*\"]\n },\n [PROVIDERS.ANYSCALE]: {\n [MODE.MD_JSON]: [\"*\"]\n // [MODE.JSON_SCHEMA]: [\"*\"]\n // [MODE.TOOLS]: [\"*\"]\n },\n [PROVIDERS.ANTHROPIC]: {\n [MODE.MD_JSON]: [\"*\"],\n [MODE.TOOLS]: [\"*\"]\n },\n [PROVIDERS.GROQ]: {\n [MODE.TOOLS]: [\"*\"],\n [MODE.MD_JSON]: [\"*\"],\n [MODE.THINKING_MD_JSON]: [\"deepseek-r1-distill-llama-70b\"]\n }\n}\n","import Instructor, { InstructorClient } from \"./instructor\"\n\nexport { type InstructorClient }\nexport * from \"./types\"\n\nexport default Instructor\n"]}