import {z} from 'zod' export type GetApiModelFamiliesFamilyNameArgs = {family_name: string}; export type GetApiModelFamiliesFamilyNameOptions = {baseUrl?: string | undefined, fetch?: typeof fetch | undefined}; export const pricingType = z.enum(["tokens", "time", "uptime", "input_length", "input_tokens", "input_character_length", "image_units", "output_length", "frame_units"]); export const modelPricingTime = z.object({discount: z.number().nullable().optional(), discount_ends_at: z.number().int().nullable().optional(), short: z.string().nullable().optional(), full: z.string().nullable().optional(), table: z.record(z.string(), z.unknown()).nullable().optional(), type: z.string().optional(), cents_per_sec: z.number()}); export const modelPricingTokens = z.object({discount: z.number().nullable().optional(), discount_ends_at: z.number().int().nullable().optional(), short: z.string().nullable().optional(), full: z.string().nullable().optional(), table: z.record(z.string(), z.unknown()).nullable().optional(), type: z.string().optional(), cents_per_input_token: z.number(), cents_per_output_token: z.number(), rate_per_input_token_cached: z.number().nullable().optional(), rate_per_input_token_cache_write: z.number().nullable().optional(), rate_per_service_tier_priority: z.number().nullable().optional(), rate_per_service_tier_flex: z.number().nullable().optional(), rate_per_explicit_cache_write_token: z.record(z.string(), z.number()).nullable().optional(), explicit_cache_granularity_tokens: z.number().int().nullable().optional()}); export const modelPricingInputLength = z.object({discount: z.number().nullable().optional(), discount_ends_at: z.number().int().nullable().optional(), short: z.string().nullable().optional(), full: z.string().nullable().optional(), table: z.record(z.string(), z.unknown()).nullable().optional(), type: z.string().optional(), cents_per_input_sec: z.number()}); export const modelPricingInputTokens = z.object({discount: z.number().nullable().optional(), discount_ends_at: z.number().int().nullable().optional(), short: z.string().nullable().optional(), full: z.string().nullable().optional(), table: z.record(z.string(), z.unknown()).nullable().optional(), type: z.string().optional(), cents_per_input_token: z.number(), cents_per_image_token: z.number().nullable().optional()}); export const modelPricingUptime = z.object({discount: z.number().nullable().optional(), discount_ends_at: z.number().int().nullable().optional(), short: z.string().nullable().optional(), full: z.string().nullable().optional(), table: z.record(z.string(), z.unknown()).nullable().optional(), type: z.string().optional(), cents_per_sec: z.number()}); export const modelPricingInputCharacterLength = z.object({discount: z.number().nullable().optional(), discount_ends_at: z.number().int().nullable().optional(), short: z.string().nullable().optional(), full: z.string().nullable().optional(), table: z.record(z.string(), z.unknown()).nullable().optional(), type: z.string().optional(), cents_per_input_chars: z.number()}); export const modelPricingImageUnits = z.object({discount: z.number().nullable().optional(), discount_ends_at: z.number().int().nullable().optional(), short: z.string().nullable().optional(), full: z.string().nullable().optional(), table: z.record(z.string(), z.unknown()).nullable().optional(), type: z.string().optional(), cents_per_image_unit: z.number(), default_width: z.number().int(), default_height: z.number().int(), default_iterations: z.number().int(), default_price_cents: z.number().nullable().optional(), usage_from_cost: z.boolean()}); export const modelPricingOutputLength = z.object({discount: z.number().nullable().optional(), discount_ends_at: z.number().int().nullable().optional(), short: z.string().nullable().optional(), full: z.string().nullable().optional(), table: z.record(z.string(), z.unknown()).nullable().optional(), type: z.string().optional(), cents_per_output_sec: z.number()}); export const modelPricingFrameUnits = z.object({discount: z.number().nullable().optional(), discount_ends_at: z.number().int().nullable().optional(), short: z.string().nullable().optional(), full: z.string().nullable().optional(), table: z.record(z.string(), z.unknown()).nullable().optional(), type: z.string().optional(), cents_per_frame_unit: z.number()}); export const pricingPageEntryOut = z.object({model_name: z.string(), short_name: z.string(), max_tokens: z.number().int().nullable().optional(), pricing: z.union([modelPricingTime, modelPricingTokens, modelPricingInputLength, modelPricingInputTokens, modelPricingUptime, modelPricingInputCharacterLength, modelPricingImageUnits, modelPricingOutputLength, modelPricingFrameUnits])}); export const pricingPageSectionOut = z.object({section_id: z.string(), ptype: pricingType, title: z.string(), description: z.string(), mf_description: z.string().optional(), entries: z.array(pricingPageEntryOut)}); export const fAQEntryOut = z.object({faq_id: z.string(), question: z.string(), answer: z.string(), order: z.number().int().optional()}); export const modelFamilyOut = z.object({name: z.string().min(1), title: z.string(), description: z.string(), developer: z.string(), meta_title: z.string().nullable().optional(), meta_description: z.string().nullable().optional(), featured_models: z.array(z.string()), pp_sections_out: z.array(pricingPageSectionOut), faq_entries: z.array(fAQEntryOut).optional()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Model Family * * GET /model-families/{family_name} */ export const getApiModelFamiliesFamilyName = async (args: GetApiModelFamiliesFamilyNameArgs, options?: GetApiModelFamiliesFamilyNameOptions) => { const {baseUrl = "https://api.deepinfra.com", fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") const url = `${baseUrl.replace(/\/+$/, '')}/model-families/${encodeURIComponent(String(args.family_name))}${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(modelFamilyOut, await res.json()) };