cencori 1.2.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -51
- package/dist/ai/index.d.mts +32 -1
- package/dist/ai/index.d.ts +32 -1
- package/dist/ai/index.js +131 -0
- package/dist/ai/index.js.map +1 -1
- package/dist/ai/index.mjs +131 -0
- package/dist/ai/index.mjs.map +1 -1
- package/dist/compute/index.d.mts +1 -1
- package/dist/compute/index.d.ts +1 -1
- package/dist/index.d.mts +208 -4
- package/dist/index.d.ts +208 -4
- package/dist/index.js +348 -8
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +345 -8
- package/dist/index.mjs.map +1 -1
- package/dist/memory/index.d.mts +1 -1
- package/dist/memory/index.d.ts +1 -1
- package/dist/react/index.d.mts +52 -0
- package/dist/react/index.d.ts +52 -0
- package/dist/react/index.js +395 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/index.mjs +367 -0
- package/dist/react/index.mjs.map +1 -0
- package/dist/storage/index.d.mts +1 -1
- package/dist/storage/index.d.ts +1 -1
- package/dist/storage/index.js +7 -7
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/index.mjs +7 -7
- package/dist/storage/index.mjs.map +1 -1
- package/dist/tanstack/index.d.mts +1 -1
- package/dist/tanstack/index.d.ts +1 -1
- package/dist/tanstack/index.js +3 -0
- package/dist/tanstack/index.js.map +1 -1
- package/dist/tanstack/index.mjs +3 -0
- package/dist/tanstack/index.mjs.map +1 -1
- package/dist/telemetry/index.d.mts +1 -1
- package/dist/telemetry/index.d.ts +1 -1
- package/dist/{types-Cr0muEt3.d.mts → types-kh1whvNH.d.mts} +135 -1
- package/dist/{types-Cr0muEt3.d.ts → types-kh1whvNH.d.ts} +135 -1
- package/dist/vision/index.d.mts +99 -0
- package/dist/vision/index.d.ts +99 -0
- package/dist/vision/index.js +93 -0
- package/dist/vision/index.js.map +1 -0
- package/dist/vision/index.mjs +68 -0
- package/dist/vision/index.mjs.map +1 -0
- package/dist/workflow/index.d.mts +1 -1
- package/dist/workflow/index.d.ts +1 -1
- package/package.json +20 -2
package/dist/tanstack/index.js
CHANGED
|
@@ -45,6 +45,7 @@ var CENCORI_CHAT_MODELS = [
|
|
|
45
45
|
"o4-mini",
|
|
46
46
|
"o1",
|
|
47
47
|
// Anthropic
|
|
48
|
+
"claude-opus-4.8",
|
|
48
49
|
"claude-3-5-sonnet",
|
|
49
50
|
"claude-3-opus",
|
|
50
51
|
"claude-3-haiku",
|
|
@@ -60,6 +61,8 @@ var CENCORI_CHAT_MODELS = [
|
|
|
60
61
|
"mistral-large",
|
|
61
62
|
"codestral",
|
|
62
63
|
// DeepSeek
|
|
64
|
+
"deepseek-v4-pro",
|
|
65
|
+
"deepseek-v4-flash",
|
|
63
66
|
"deepseek-v3.2",
|
|
64
67
|
"deepseek-reasoner",
|
|
65
68
|
// Groq
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/tanstack/index.ts"],"sourcesContent":["/**\n * Cencori AI SDK - TanStack AI Integration\n * \n * @example\n * import { cencori } from 'cencori/tanstack';\n * import { chat } from '@tanstack/ai';\n * \n * const result = await chat({\n * adapter: cencori('gpt-4o'),\n * messages: [{ role: 'user', content: 'Hello!' }]\n * });\n * \n * @packageDocumentation\n */\n\nimport type {\n TextAdapter,\n TextOptions,\n StreamChunk,\n ContentStreamChunk,\n DoneStreamChunk,\n ErrorStreamChunk,\n ToolCallStreamChunk,\n Modality,\n DefaultMessageMetadataByModality,\n} from '@tanstack/ai';\n\n// Re-export types for convenience\nexport type {\n TextAdapter,\n TextOptions,\n StreamChunk,\n};\n\n/**\n * Cencori provider options\n */\nexport interface CencoriProviderOptions {\n /** Cencori API key */\n apiKey?: string;\n /** Base URL for Cencori API (defaults to https://cencori.com) */\n baseUrl?: string;\n /** Custom headers */\n headers?: Record<string, string>;\n}\n\n/**\n * Cencori model-specific options\n */\nexport interface CencoriModelOptions {\n /** User ID for attribution */\n userId?: string;\n}\n\n// All models supported through Cencori Gateway\nexport const CENCORI_CHAT_MODELS = [\n // OpenAI\n 'gpt-5.5',\n 'gpt-5.4',\n 'gpt-5.4-pro',\n 'gpt-5.3-chat-latest',\n 'gpt-5.2',\n 'gpt-5.1',\n 'gpt-5',\n 'gpt-5-mini',\n 'gpt-5-nano',\n 'gpt-4.1',\n 'gpt-4o',\n 'gpt-4o-mini',\n 'o3-pro',\n 'o3',\n 'o4-mini',\n 'o1',\n // Anthropic\n 'claude-3-5-sonnet',\n 'claude-3-opus',\n 'claude-3-haiku',\n // Google\n 'gemini-2.5-flash',\n 'gemini-2.0-flash',\n 'gemini-3-pro',\n // xAI\n 'grok-voice-think-fast',\n 'grok-4',\n 'grok-3',\n // Mistral\n 'mistral-large',\n 'codestral',\n // DeepSeek\n 'deepseek-v3.2',\n 'deepseek-reasoner',\n // Groq\n 'llama-3-70b',\n 'mixtral-8x7b',\n] as const;\n\nexport type CencoriChatModel = (typeof CENCORI_CHAT_MODELS)[number];\n\n/**\n * Cencori adapter for TanStack AI\n */\nclass CencoriTextAdapter implements TextAdapter<\n CencoriChatModel,\n CencoriModelOptions,\n readonly ['text', 'image'],\n DefaultMessageMetadataByModality\n> {\n readonly kind = 'text' as const;\n readonly name = 'cencori';\n readonly model: CencoriChatModel;\n\n '~types': {\n providerOptions: CencoriModelOptions;\n inputModalities: readonly ['text', 'image'];\n messageMetadataByModality: DefaultMessageMetadataByModality;\n } = {} as any;\n\n private config: {\n apiKey: string;\n baseUrl: string;\n headers?: Record<string, string>;\n };\n private providerOptions: CencoriProviderOptions;\n\n constructor(model: CencoriChatModel, options: CencoriProviderOptions = {}) {\n this.model = model;\n this.providerOptions = options;\n\n const apiKey = options.apiKey ?? process.env.CENCORI_API_KEY;\n if (!apiKey) {\n throw new Error(\n 'Cencori API key is required. Pass it via options.apiKey or set CENCORI_API_KEY environment variable.'\n );\n }\n\n this.config = {\n apiKey,\n baseUrl: options.baseUrl ?? 'https://cencori.com',\n headers: options.headers,\n };\n }\n\n /**\n * Stream chat completions from the model\n */\n async *chatStream(options: TextOptions<CencoriModelOptions>): AsyncIterable<StreamChunk> {\n // Convert tools to Cencori format if present\n const tools = options.tools ? Object.values(options.tools).map(t => ({\n type: 'function' as const,\n function: {\n name: t.name,\n description: t.description,\n parameters: t.inputSchema || {},\n },\n })) : undefined;\n\n const response = await fetch(`${this.config.baseUrl}/api/ai/chat`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'CENCORI_API_KEY': this.config.apiKey!,\n ...this.config.headers,\n },\n body: JSON.stringify({\n model: this.model,\n messages: options.messages,\n temperature: options.temperature,\n maxTokens: options.maxTokens,\n stream: true,\n userId: options.modelOptions?.userId,\n tools,\n }),\n signal: options.abortController?.signal,\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({ error: 'Unknown error' })) as { error?: string };\n const errorChunk: ErrorStreamChunk = {\n type: 'error',\n id: this.generateId(),\n model: this.model,\n timestamp: Date.now(),\n error: {\n message: errorData.error || response.statusText,\n code: String(response.status),\n },\n };\n yield errorChunk;\n return;\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('Response body is null');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n let content = '';\n const promptTokens = 0;\n let completionTokens = 0;\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n // Emit done chunk\n const doneChunk: DoneStreamChunk = {\n type: 'done',\n id: this.generateId(),\n model: this.model,\n timestamp: Date.now(),\n finishReason: 'stop',\n usage: {\n promptTokens,\n completionTokens,\n totalTokens: promptTokens + completionTokens,\n },\n };\n yield doneChunk;\n return;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.trim() === '') continue;\n if (!line.startsWith('data: ')) continue;\n\n const data = line.slice(6);\n if (data === '[DONE]') {\n const doneChunk: DoneStreamChunk = {\n type: 'done',\n id: this.generateId(),\n model: this.model,\n timestamp: Date.now(),\n finishReason: 'stop',\n usage: {\n promptTokens,\n completionTokens,\n totalTokens: promptTokens + completionTokens,\n },\n };\n yield doneChunk;\n return;\n }\n\n try {\n const chunk = JSON.parse(data);\n\n if (chunk.delta) {\n content += chunk.delta;\n completionTokens += Math.ceil(chunk.delta.length / 4);\n\n const contentChunk: ContentStreamChunk = {\n type: 'content',\n id: this.generateId(),\n model: this.model,\n timestamp: Date.now(),\n delta: chunk.delta,\n content: content,\n role: 'assistant',\n };\n yield contentChunk;\n }\n\n // Handle tool calls\n if (chunk.tool_calls && chunk.tool_calls.length > 0) {\n for (const tc of chunk.tool_calls) {\n const toolCallChunk: ToolCallStreamChunk = {\n type: 'tool_call',\n id: this.generateId(),\n model: this.model,\n timestamp: Date.now(),\n toolCall: {\n id: tc.id,\n type: 'function',\n function: {\n name: tc.function.name,\n arguments: tc.function.arguments,\n },\n },\n index: 0,\n };\n yield toolCallChunk;\n }\n }\n\n if (chunk.finish_reason) {\n const doneChunk: DoneStreamChunk = {\n type: 'done',\n id: this.generateId(),\n model: this.model,\n timestamp: Date.now(),\n finishReason: chunk.finish_reason === 'tool_calls' ? 'tool_calls'\n : chunk.finish_reason === 'stop' ? 'stop' : null,\n usage: {\n promptTokens,\n completionTokens,\n totalTokens: promptTokens + completionTokens,\n },\n };\n yield doneChunk;\n return;\n }\n } catch {\n // Skip malformed JSON\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n /**\n * Generate structured output\n */\n async structuredOutput(options: {\n chatOptions: TextOptions<CencoriModelOptions>;\n outputSchema: any;\n }): Promise<{ data: unknown; rawText: string }> {\n const response = await fetch(`${this.config.baseUrl}/api/ai/chat`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'CENCORI_API_KEY': this.config.apiKey!,\n ...this.config.headers,\n },\n body: JSON.stringify({\n model: this.model,\n messages: options.chatOptions.messages,\n temperature: options.chatOptions.temperature,\n maxTokens: options.chatOptions.maxTokens,\n stream: false,\n responseFormat: {\n type: 'json_schema',\n json_schema: {\n name: 'structured_output',\n schema: options.outputSchema,\n strict: true,\n },\n },\n }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({ error: 'Unknown error' })) as { error?: string };\n throw new Error(`Cencori API error: ${errorData.error || response.statusText}`);\n }\n\n const result = await response.json() as { content: string };\n const rawText = result.content;\n\n try {\n const data = JSON.parse(rawText);\n return { data, rawText };\n } catch {\n throw new Error(`Failed to parse structured output: ${rawText}`);\n }\n }\n\n private generateId(): string {\n return `cencori-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n }\n}\n\n/**\n * Create a Cencori adapter for TanStack AI\n * \n * @example\n * import { createCencori } from 'cencori/tanstack';\n * \n * const myProvider = createCencori({ apiKey: 'csk_...' });\n * const adapter = myProvider('gpt-4o');\n */\nexport function createCencori(options: CencoriProviderOptions = {}) {\n return function cencoriProvider<T extends CencoriChatModel>(model: T) {\n return new CencoriTextAdapter(model, options);\n };\n}\n\n/**\n * Default Cencori provider\n * Uses CENCORI_API_KEY environment variable\n * \n * @example\n * import { cencori } from 'cencori/tanstack';\n * import { chat } from '@tanstack/ai';\n * \n * const result = await chat({\n * adapter: cencori('gpt-4o'),\n * messages: [{ role: 'user', content: 'Hello!' }]\n * });\n */\nexport function cencori<T extends CencoriChatModel>(model: T) {\n return new CencoriTextAdapter(model, {});\n}\n\n// Export adapter class for advanced use cases\nexport { CencoriTextAdapter };\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/tanstack/index.ts"],"sourcesContent":["/**\n * Cencori AI SDK - TanStack AI Integration\n * \n * @example\n * import { cencori } from 'cencori/tanstack';\n * import { chat } from '@tanstack/ai';\n * \n * const result = await chat({\n * adapter: cencori('gpt-4o'),\n * messages: [{ role: 'user', content: 'Hello!' }]\n * });\n * \n * @packageDocumentation\n */\n\nimport type {\n TextAdapter,\n TextOptions,\n StreamChunk,\n ContentStreamChunk,\n DoneStreamChunk,\n ErrorStreamChunk,\n ToolCallStreamChunk,\n Modality,\n DefaultMessageMetadataByModality,\n} from '@tanstack/ai';\n\n// Re-export types for convenience\nexport type {\n TextAdapter,\n TextOptions,\n StreamChunk,\n};\n\n/**\n * Cencori provider options\n */\nexport interface CencoriProviderOptions {\n /** Cencori API key */\n apiKey?: string;\n /** Base URL for Cencori API (defaults to https://cencori.com) */\n baseUrl?: string;\n /** Custom headers */\n headers?: Record<string, string>;\n}\n\n/**\n * Cencori model-specific options\n */\nexport interface CencoriModelOptions {\n /** User ID for attribution */\n userId?: string;\n}\n\n// All models supported through Cencori Gateway\nexport const CENCORI_CHAT_MODELS = [\n // OpenAI\n 'gpt-5.5',\n 'gpt-5.4',\n 'gpt-5.4-pro',\n 'gpt-5.3-chat-latest',\n 'gpt-5.2',\n 'gpt-5.1',\n 'gpt-5',\n 'gpt-5-mini',\n 'gpt-5-nano',\n 'gpt-4.1',\n 'gpt-4o',\n 'gpt-4o-mini',\n 'o3-pro',\n 'o3',\n 'o4-mini',\n 'o1',\n // Anthropic\n 'claude-opus-4.8',\n 'claude-3-5-sonnet',\n 'claude-3-opus',\n 'claude-3-haiku',\n // Google\n 'gemini-2.5-flash',\n 'gemini-2.0-flash',\n 'gemini-3-pro',\n // xAI\n 'grok-voice-think-fast',\n 'grok-4',\n 'grok-3',\n // Mistral\n 'mistral-large',\n 'codestral',\n // DeepSeek\n 'deepseek-v4-pro',\n 'deepseek-v4-flash',\n 'deepseek-v3.2',\n 'deepseek-reasoner',\n // Groq\n 'llama-3-70b',\n 'mixtral-8x7b',\n] as const;\n\nexport type CencoriChatModel = (typeof CENCORI_CHAT_MODELS)[number];\n\n/**\n * Cencori adapter for TanStack AI\n */\nclass CencoriTextAdapter implements TextAdapter<\n CencoriChatModel,\n CencoriModelOptions,\n readonly ['text', 'image'],\n DefaultMessageMetadataByModality\n> {\n readonly kind = 'text' as const;\n readonly name = 'cencori';\n readonly model: CencoriChatModel;\n\n '~types': {\n providerOptions: CencoriModelOptions;\n inputModalities: readonly ['text', 'image'];\n messageMetadataByModality: DefaultMessageMetadataByModality;\n } = {} as any;\n\n private config: {\n apiKey: string;\n baseUrl: string;\n headers?: Record<string, string>;\n };\n private providerOptions: CencoriProviderOptions;\n\n constructor(model: CencoriChatModel, options: CencoriProviderOptions = {}) {\n this.model = model;\n this.providerOptions = options;\n\n const apiKey = options.apiKey ?? process.env.CENCORI_API_KEY;\n if (!apiKey) {\n throw new Error(\n 'Cencori API key is required. Pass it via options.apiKey or set CENCORI_API_KEY environment variable.'\n );\n }\n\n this.config = {\n apiKey,\n baseUrl: options.baseUrl ?? 'https://cencori.com',\n headers: options.headers,\n };\n }\n\n /**\n * Stream chat completions from the model\n */\n async *chatStream(options: TextOptions<CencoriModelOptions>): AsyncIterable<StreamChunk> {\n // Convert tools to Cencori format if present\n const tools = options.tools ? Object.values(options.tools).map(t => ({\n type: 'function' as const,\n function: {\n name: t.name,\n description: t.description,\n parameters: t.inputSchema || {},\n },\n })) : undefined;\n\n const response = await fetch(`${this.config.baseUrl}/api/ai/chat`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'CENCORI_API_KEY': this.config.apiKey!,\n ...this.config.headers,\n },\n body: JSON.stringify({\n model: this.model,\n messages: options.messages,\n temperature: options.temperature,\n maxTokens: options.maxTokens,\n stream: true,\n userId: options.modelOptions?.userId,\n tools,\n }),\n signal: options.abortController?.signal,\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({ error: 'Unknown error' })) as { error?: string };\n const errorChunk: ErrorStreamChunk = {\n type: 'error',\n id: this.generateId(),\n model: this.model,\n timestamp: Date.now(),\n error: {\n message: errorData.error || response.statusText,\n code: String(response.status),\n },\n };\n yield errorChunk;\n return;\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('Response body is null');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n let content = '';\n const promptTokens = 0;\n let completionTokens = 0;\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n // Emit done chunk\n const doneChunk: DoneStreamChunk = {\n type: 'done',\n id: this.generateId(),\n model: this.model,\n timestamp: Date.now(),\n finishReason: 'stop',\n usage: {\n promptTokens,\n completionTokens,\n totalTokens: promptTokens + completionTokens,\n },\n };\n yield doneChunk;\n return;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.trim() === '') continue;\n if (!line.startsWith('data: ')) continue;\n\n const data = line.slice(6);\n if (data === '[DONE]') {\n const doneChunk: DoneStreamChunk = {\n type: 'done',\n id: this.generateId(),\n model: this.model,\n timestamp: Date.now(),\n finishReason: 'stop',\n usage: {\n promptTokens,\n completionTokens,\n totalTokens: promptTokens + completionTokens,\n },\n };\n yield doneChunk;\n return;\n }\n\n try {\n const chunk = JSON.parse(data);\n\n if (chunk.delta) {\n content += chunk.delta;\n completionTokens += Math.ceil(chunk.delta.length / 4);\n\n const contentChunk: ContentStreamChunk = {\n type: 'content',\n id: this.generateId(),\n model: this.model,\n timestamp: Date.now(),\n delta: chunk.delta,\n content: content,\n role: 'assistant',\n };\n yield contentChunk;\n }\n\n // Handle tool calls\n if (chunk.tool_calls && chunk.tool_calls.length > 0) {\n for (const tc of chunk.tool_calls) {\n const toolCallChunk: ToolCallStreamChunk = {\n type: 'tool_call',\n id: this.generateId(),\n model: this.model,\n timestamp: Date.now(),\n toolCall: {\n id: tc.id,\n type: 'function',\n function: {\n name: tc.function.name,\n arguments: tc.function.arguments,\n },\n },\n index: 0,\n };\n yield toolCallChunk;\n }\n }\n\n if (chunk.finish_reason) {\n const doneChunk: DoneStreamChunk = {\n type: 'done',\n id: this.generateId(),\n model: this.model,\n timestamp: Date.now(),\n finishReason: chunk.finish_reason === 'tool_calls' ? 'tool_calls'\n : chunk.finish_reason === 'stop' ? 'stop' : null,\n usage: {\n promptTokens,\n completionTokens,\n totalTokens: promptTokens + completionTokens,\n },\n };\n yield doneChunk;\n return;\n }\n } catch {\n // Skip malformed JSON\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n /**\n * Generate structured output\n */\n async structuredOutput(options: {\n chatOptions: TextOptions<CencoriModelOptions>;\n outputSchema: any;\n }): Promise<{ data: unknown; rawText: string }> {\n const response = await fetch(`${this.config.baseUrl}/api/ai/chat`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'CENCORI_API_KEY': this.config.apiKey!,\n ...this.config.headers,\n },\n body: JSON.stringify({\n model: this.model,\n messages: options.chatOptions.messages,\n temperature: options.chatOptions.temperature,\n maxTokens: options.chatOptions.maxTokens,\n stream: false,\n responseFormat: {\n type: 'json_schema',\n json_schema: {\n name: 'structured_output',\n schema: options.outputSchema,\n strict: true,\n },\n },\n }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({ error: 'Unknown error' })) as { error?: string };\n throw new Error(`Cencori API error: ${errorData.error || response.statusText}`);\n }\n\n const result = await response.json() as { content: string };\n const rawText = result.content;\n\n try {\n const data = JSON.parse(rawText);\n return { data, rawText };\n } catch {\n throw new Error(`Failed to parse structured output: ${rawText}`);\n }\n }\n\n private generateId(): string {\n return `cencori-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n }\n}\n\n/**\n * Create a Cencori adapter for TanStack AI\n * \n * @example\n * import { createCencori } from 'cencori/tanstack';\n * \n * const myProvider = createCencori({ apiKey: 'csk_...' });\n * const adapter = myProvider('gpt-4o');\n */\nexport function createCencori(options: CencoriProviderOptions = {}) {\n return function cencoriProvider<T extends CencoriChatModel>(model: T) {\n return new CencoriTextAdapter(model, options);\n };\n}\n\n/**\n * Default Cencori provider\n * Uses CENCORI_API_KEY environment variable\n * \n * @example\n * import { cencori } from 'cencori/tanstack';\n * import { chat } from '@tanstack/ai';\n * \n * const result = await chat({\n * adapter: cencori('gpt-4o'),\n * messages: [{ role: 'user', content: 'Hello!' }]\n * });\n */\nexport function cencori<T extends CencoriChatModel>(model: T) {\n return new CencoriTextAdapter(model, {});\n}\n\n// Export adapter class for advanced use cases\nexport { CencoriTextAdapter };\n"],"mappings":"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","names":[]}
|
package/dist/tanstack/index.mjs
CHANGED
|
@@ -18,6 +18,7 @@ var CENCORI_CHAT_MODELS = [
|
|
|
18
18
|
"o4-mini",
|
|
19
19
|
"o1",
|
|
20
20
|
// Anthropic
|
|
21
|
+
"claude-opus-4.8",
|
|
21
22
|
"claude-3-5-sonnet",
|
|
22
23
|
"claude-3-opus",
|
|
23
24
|
"claude-3-haiku",
|
|
@@ -33,6 +34,8 @@ var CENCORI_CHAT_MODELS = [
|
|
|
33
34
|
"mistral-large",
|
|
34
35
|
"codestral",
|
|
35
36
|
// DeepSeek
|
|
37
|
+
"deepseek-v4-pro",
|
|
38
|
+
"deepseek-v4-flash",
|
|
36
39
|
"deepseek-v3.2",
|
|
37
40
|
"deepseek-reasoner",
|
|
38
41
|
// Groq
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/tanstack/index.ts"],"sourcesContent":["/**\n * Cencori AI SDK - TanStack AI Integration\n * \n * @example\n * import { cencori } from 'cencori/tanstack';\n * import { chat } from '@tanstack/ai';\n * \n * const result = await chat({\n * adapter: cencori('gpt-4o'),\n * messages: [{ role: 'user', content: 'Hello!' }]\n * });\n * \n * @packageDocumentation\n */\n\nimport type {\n TextAdapter,\n TextOptions,\n StreamChunk,\n ContentStreamChunk,\n DoneStreamChunk,\n ErrorStreamChunk,\n ToolCallStreamChunk,\n Modality,\n DefaultMessageMetadataByModality,\n} from '@tanstack/ai';\n\n// Re-export types for convenience\nexport type {\n TextAdapter,\n TextOptions,\n StreamChunk,\n};\n\n/**\n * Cencori provider options\n */\nexport interface CencoriProviderOptions {\n /** Cencori API key */\n apiKey?: string;\n /** Base URL for Cencori API (defaults to https://cencori.com) */\n baseUrl?: string;\n /** Custom headers */\n headers?: Record<string, string>;\n}\n\n/**\n * Cencori model-specific options\n */\nexport interface CencoriModelOptions {\n /** User ID for attribution */\n userId?: string;\n}\n\n// All models supported through Cencori Gateway\nexport const CENCORI_CHAT_MODELS = [\n // OpenAI\n 'gpt-5.5',\n 'gpt-5.4',\n 'gpt-5.4-pro',\n 'gpt-5.3-chat-latest',\n 'gpt-5.2',\n 'gpt-5.1',\n 'gpt-5',\n 'gpt-5-mini',\n 'gpt-5-nano',\n 'gpt-4.1',\n 'gpt-4o',\n 'gpt-4o-mini',\n 'o3-pro',\n 'o3',\n 'o4-mini',\n 'o1',\n // Anthropic\n 'claude-3-5-sonnet',\n 'claude-3-opus',\n 'claude-3-haiku',\n // Google\n 'gemini-2.5-flash',\n 'gemini-2.0-flash',\n 'gemini-3-pro',\n // xAI\n 'grok-voice-think-fast',\n 'grok-4',\n 'grok-3',\n // Mistral\n 'mistral-large',\n 'codestral',\n // DeepSeek\n 'deepseek-v3.2',\n 'deepseek-reasoner',\n // Groq\n 'llama-3-70b',\n 'mixtral-8x7b',\n] as const;\n\nexport type CencoriChatModel = (typeof CENCORI_CHAT_MODELS)[number];\n\n/**\n * Cencori adapter for TanStack AI\n */\nclass CencoriTextAdapter implements TextAdapter<\n CencoriChatModel,\n CencoriModelOptions,\n readonly ['text', 'image'],\n DefaultMessageMetadataByModality\n> {\n readonly kind = 'text' as const;\n readonly name = 'cencori';\n readonly model: CencoriChatModel;\n\n '~types': {\n providerOptions: CencoriModelOptions;\n inputModalities: readonly ['text', 'image'];\n messageMetadataByModality: DefaultMessageMetadataByModality;\n } = {} as any;\n\n private config: {\n apiKey: string;\n baseUrl: string;\n headers?: Record<string, string>;\n };\n private providerOptions: CencoriProviderOptions;\n\n constructor(model: CencoriChatModel, options: CencoriProviderOptions = {}) {\n this.model = model;\n this.providerOptions = options;\n\n const apiKey = options.apiKey ?? process.env.CENCORI_API_KEY;\n if (!apiKey) {\n throw new Error(\n 'Cencori API key is required. Pass it via options.apiKey or set CENCORI_API_KEY environment variable.'\n );\n }\n\n this.config = {\n apiKey,\n baseUrl: options.baseUrl ?? 'https://cencori.com',\n headers: options.headers,\n };\n }\n\n /**\n * Stream chat completions from the model\n */\n async *chatStream(options: TextOptions<CencoriModelOptions>): AsyncIterable<StreamChunk> {\n // Convert tools to Cencori format if present\n const tools = options.tools ? Object.values(options.tools).map(t => ({\n type: 'function' as const,\n function: {\n name: t.name,\n description: t.description,\n parameters: t.inputSchema || {},\n },\n })) : undefined;\n\n const response = await fetch(`${this.config.baseUrl}/api/ai/chat`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'CENCORI_API_KEY': this.config.apiKey!,\n ...this.config.headers,\n },\n body: JSON.stringify({\n model: this.model,\n messages: options.messages,\n temperature: options.temperature,\n maxTokens: options.maxTokens,\n stream: true,\n userId: options.modelOptions?.userId,\n tools,\n }),\n signal: options.abortController?.signal,\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({ error: 'Unknown error' })) as { error?: string };\n const errorChunk: ErrorStreamChunk = {\n type: 'error',\n id: this.generateId(),\n model: this.model,\n timestamp: Date.now(),\n error: {\n message: errorData.error || response.statusText,\n code: String(response.status),\n },\n };\n yield errorChunk;\n return;\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('Response body is null');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n let content = '';\n const promptTokens = 0;\n let completionTokens = 0;\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n // Emit done chunk\n const doneChunk: DoneStreamChunk = {\n type: 'done',\n id: this.generateId(),\n model: this.model,\n timestamp: Date.now(),\n finishReason: 'stop',\n usage: {\n promptTokens,\n completionTokens,\n totalTokens: promptTokens + completionTokens,\n },\n };\n yield doneChunk;\n return;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.trim() === '') continue;\n if (!line.startsWith('data: ')) continue;\n\n const data = line.slice(6);\n if (data === '[DONE]') {\n const doneChunk: DoneStreamChunk = {\n type: 'done',\n id: this.generateId(),\n model: this.model,\n timestamp: Date.now(),\n finishReason: 'stop',\n usage: {\n promptTokens,\n completionTokens,\n totalTokens: promptTokens + completionTokens,\n },\n };\n yield doneChunk;\n return;\n }\n\n try {\n const chunk = JSON.parse(data);\n\n if (chunk.delta) {\n content += chunk.delta;\n completionTokens += Math.ceil(chunk.delta.length / 4);\n\n const contentChunk: ContentStreamChunk = {\n type: 'content',\n id: this.generateId(),\n model: this.model,\n timestamp: Date.now(),\n delta: chunk.delta,\n content: content,\n role: 'assistant',\n };\n yield contentChunk;\n }\n\n // Handle tool calls\n if (chunk.tool_calls && chunk.tool_calls.length > 0) {\n for (const tc of chunk.tool_calls) {\n const toolCallChunk: ToolCallStreamChunk = {\n type: 'tool_call',\n id: this.generateId(),\n model: this.model,\n timestamp: Date.now(),\n toolCall: {\n id: tc.id,\n type: 'function',\n function: {\n name: tc.function.name,\n arguments: tc.function.arguments,\n },\n },\n index: 0,\n };\n yield toolCallChunk;\n }\n }\n\n if (chunk.finish_reason) {\n const doneChunk: DoneStreamChunk = {\n type: 'done',\n id: this.generateId(),\n model: this.model,\n timestamp: Date.now(),\n finishReason: chunk.finish_reason === 'tool_calls' ? 'tool_calls'\n : chunk.finish_reason === 'stop' ? 'stop' : null,\n usage: {\n promptTokens,\n completionTokens,\n totalTokens: promptTokens + completionTokens,\n },\n };\n yield doneChunk;\n return;\n }\n } catch {\n // Skip malformed JSON\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n /**\n * Generate structured output\n */\n async structuredOutput(options: {\n chatOptions: TextOptions<CencoriModelOptions>;\n outputSchema: any;\n }): Promise<{ data: unknown; rawText: string }> {\n const response = await fetch(`${this.config.baseUrl}/api/ai/chat`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'CENCORI_API_KEY': this.config.apiKey!,\n ...this.config.headers,\n },\n body: JSON.stringify({\n model: this.model,\n messages: options.chatOptions.messages,\n temperature: options.chatOptions.temperature,\n maxTokens: options.chatOptions.maxTokens,\n stream: false,\n responseFormat: {\n type: 'json_schema',\n json_schema: {\n name: 'structured_output',\n schema: options.outputSchema,\n strict: true,\n },\n },\n }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({ error: 'Unknown error' })) as { error?: string };\n throw new Error(`Cencori API error: ${errorData.error || response.statusText}`);\n }\n\n const result = await response.json() as { content: string };\n const rawText = result.content;\n\n try {\n const data = JSON.parse(rawText);\n return { data, rawText };\n } catch {\n throw new Error(`Failed to parse structured output: ${rawText}`);\n }\n }\n\n private generateId(): string {\n return `cencori-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n }\n}\n\n/**\n * Create a Cencori adapter for TanStack AI\n * \n * @example\n * import { createCencori } from 'cencori/tanstack';\n * \n * const myProvider = createCencori({ apiKey: 'csk_...' });\n * const adapter = myProvider('gpt-4o');\n */\nexport function createCencori(options: CencoriProviderOptions = {}) {\n return function cencoriProvider<T extends CencoriChatModel>(model: T) {\n return new CencoriTextAdapter(model, options);\n };\n}\n\n/**\n * Default Cencori provider\n * Uses CENCORI_API_KEY environment variable\n * \n * @example\n * import { cencori } from 'cencori/tanstack';\n * import { chat } from '@tanstack/ai';\n * \n * const result = await chat({\n * adapter: cencori('gpt-4o'),\n * messages: [{ role: 'user', content: 'Hello!' }]\n * });\n */\nexport function cencori<T extends CencoriChatModel>(model: T) {\n return new CencoriTextAdapter(model, {});\n}\n\n// Export adapter class for advanced use cases\nexport { CencoriTextAdapter };\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/tanstack/index.ts"],"sourcesContent":["/**\n * Cencori AI SDK - TanStack AI Integration\n * \n * @example\n * import { cencori } from 'cencori/tanstack';\n * import { chat } from '@tanstack/ai';\n * \n * const result = await chat({\n * adapter: cencori('gpt-4o'),\n * messages: [{ role: 'user', content: 'Hello!' }]\n * });\n * \n * @packageDocumentation\n */\n\nimport type {\n TextAdapter,\n TextOptions,\n StreamChunk,\n ContentStreamChunk,\n DoneStreamChunk,\n ErrorStreamChunk,\n ToolCallStreamChunk,\n Modality,\n DefaultMessageMetadataByModality,\n} from '@tanstack/ai';\n\n// Re-export types for convenience\nexport type {\n TextAdapter,\n TextOptions,\n StreamChunk,\n};\n\n/**\n * Cencori provider options\n */\nexport interface CencoriProviderOptions {\n /** Cencori API key */\n apiKey?: string;\n /** Base URL for Cencori API (defaults to https://cencori.com) */\n baseUrl?: string;\n /** Custom headers */\n headers?: Record<string, string>;\n}\n\n/**\n * Cencori model-specific options\n */\nexport interface CencoriModelOptions {\n /** User ID for attribution */\n userId?: string;\n}\n\n// All models supported through Cencori Gateway\nexport const CENCORI_CHAT_MODELS = [\n // OpenAI\n 'gpt-5.5',\n 'gpt-5.4',\n 'gpt-5.4-pro',\n 'gpt-5.3-chat-latest',\n 'gpt-5.2',\n 'gpt-5.1',\n 'gpt-5',\n 'gpt-5-mini',\n 'gpt-5-nano',\n 'gpt-4.1',\n 'gpt-4o',\n 'gpt-4o-mini',\n 'o3-pro',\n 'o3',\n 'o4-mini',\n 'o1',\n // Anthropic\n 'claude-opus-4.8',\n 'claude-3-5-sonnet',\n 'claude-3-opus',\n 'claude-3-haiku',\n // Google\n 'gemini-2.5-flash',\n 'gemini-2.0-flash',\n 'gemini-3-pro',\n // xAI\n 'grok-voice-think-fast',\n 'grok-4',\n 'grok-3',\n // Mistral\n 'mistral-large',\n 'codestral',\n // DeepSeek\n 'deepseek-v4-pro',\n 'deepseek-v4-flash',\n 'deepseek-v3.2',\n 'deepseek-reasoner',\n // Groq\n 'llama-3-70b',\n 'mixtral-8x7b',\n] as const;\n\nexport type CencoriChatModel = (typeof CENCORI_CHAT_MODELS)[number];\n\n/**\n * Cencori adapter for TanStack AI\n */\nclass CencoriTextAdapter implements TextAdapter<\n CencoriChatModel,\n CencoriModelOptions,\n readonly ['text', 'image'],\n DefaultMessageMetadataByModality\n> {\n readonly kind = 'text' as const;\n readonly name = 'cencori';\n readonly model: CencoriChatModel;\n\n '~types': {\n providerOptions: CencoriModelOptions;\n inputModalities: readonly ['text', 'image'];\n messageMetadataByModality: DefaultMessageMetadataByModality;\n } = {} as any;\n\n private config: {\n apiKey: string;\n baseUrl: string;\n headers?: Record<string, string>;\n };\n private providerOptions: CencoriProviderOptions;\n\n constructor(model: CencoriChatModel, options: CencoriProviderOptions = {}) {\n this.model = model;\n this.providerOptions = options;\n\n const apiKey = options.apiKey ?? process.env.CENCORI_API_KEY;\n if (!apiKey) {\n throw new Error(\n 'Cencori API key is required. Pass it via options.apiKey or set CENCORI_API_KEY environment variable.'\n );\n }\n\n this.config = {\n apiKey,\n baseUrl: options.baseUrl ?? 'https://cencori.com',\n headers: options.headers,\n };\n }\n\n /**\n * Stream chat completions from the model\n */\n async *chatStream(options: TextOptions<CencoriModelOptions>): AsyncIterable<StreamChunk> {\n // Convert tools to Cencori format if present\n const tools = options.tools ? Object.values(options.tools).map(t => ({\n type: 'function' as const,\n function: {\n name: t.name,\n description: t.description,\n parameters: t.inputSchema || {},\n },\n })) : undefined;\n\n const response = await fetch(`${this.config.baseUrl}/api/ai/chat`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'CENCORI_API_KEY': this.config.apiKey!,\n ...this.config.headers,\n },\n body: JSON.stringify({\n model: this.model,\n messages: options.messages,\n temperature: options.temperature,\n maxTokens: options.maxTokens,\n stream: true,\n userId: options.modelOptions?.userId,\n tools,\n }),\n signal: options.abortController?.signal,\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({ error: 'Unknown error' })) as { error?: string };\n const errorChunk: ErrorStreamChunk = {\n type: 'error',\n id: this.generateId(),\n model: this.model,\n timestamp: Date.now(),\n error: {\n message: errorData.error || response.statusText,\n code: String(response.status),\n },\n };\n yield errorChunk;\n return;\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('Response body is null');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n let content = '';\n const promptTokens = 0;\n let completionTokens = 0;\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n // Emit done chunk\n const doneChunk: DoneStreamChunk = {\n type: 'done',\n id: this.generateId(),\n model: this.model,\n timestamp: Date.now(),\n finishReason: 'stop',\n usage: {\n promptTokens,\n completionTokens,\n totalTokens: promptTokens + completionTokens,\n },\n };\n yield doneChunk;\n return;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.trim() === '') continue;\n if (!line.startsWith('data: ')) continue;\n\n const data = line.slice(6);\n if (data === '[DONE]') {\n const doneChunk: DoneStreamChunk = {\n type: 'done',\n id: this.generateId(),\n model: this.model,\n timestamp: Date.now(),\n finishReason: 'stop',\n usage: {\n promptTokens,\n completionTokens,\n totalTokens: promptTokens + completionTokens,\n },\n };\n yield doneChunk;\n return;\n }\n\n try {\n const chunk = JSON.parse(data);\n\n if (chunk.delta) {\n content += chunk.delta;\n completionTokens += Math.ceil(chunk.delta.length / 4);\n\n const contentChunk: ContentStreamChunk = {\n type: 'content',\n id: this.generateId(),\n model: this.model,\n timestamp: Date.now(),\n delta: chunk.delta,\n content: content,\n role: 'assistant',\n };\n yield contentChunk;\n }\n\n // Handle tool calls\n if (chunk.tool_calls && chunk.tool_calls.length > 0) {\n for (const tc of chunk.tool_calls) {\n const toolCallChunk: ToolCallStreamChunk = {\n type: 'tool_call',\n id: this.generateId(),\n model: this.model,\n timestamp: Date.now(),\n toolCall: {\n id: tc.id,\n type: 'function',\n function: {\n name: tc.function.name,\n arguments: tc.function.arguments,\n },\n },\n index: 0,\n };\n yield toolCallChunk;\n }\n }\n\n if (chunk.finish_reason) {\n const doneChunk: DoneStreamChunk = {\n type: 'done',\n id: this.generateId(),\n model: this.model,\n timestamp: Date.now(),\n finishReason: chunk.finish_reason === 'tool_calls' ? 'tool_calls'\n : chunk.finish_reason === 'stop' ? 'stop' : null,\n usage: {\n promptTokens,\n completionTokens,\n totalTokens: promptTokens + completionTokens,\n },\n };\n yield doneChunk;\n return;\n }\n } catch {\n // Skip malformed JSON\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n /**\n * Generate structured output\n */\n async structuredOutput(options: {\n chatOptions: TextOptions<CencoriModelOptions>;\n outputSchema: any;\n }): Promise<{ data: unknown; rawText: string }> {\n const response = await fetch(`${this.config.baseUrl}/api/ai/chat`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'CENCORI_API_KEY': this.config.apiKey!,\n ...this.config.headers,\n },\n body: JSON.stringify({\n model: this.model,\n messages: options.chatOptions.messages,\n temperature: options.chatOptions.temperature,\n maxTokens: options.chatOptions.maxTokens,\n stream: false,\n responseFormat: {\n type: 'json_schema',\n json_schema: {\n name: 'structured_output',\n schema: options.outputSchema,\n strict: true,\n },\n },\n }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({ error: 'Unknown error' })) as { error?: string };\n throw new Error(`Cencori API error: ${errorData.error || response.statusText}`);\n }\n\n const result = await response.json() as { content: string };\n const rawText = result.content;\n\n try {\n const data = JSON.parse(rawText);\n return { data, rawText };\n } catch {\n throw new Error(`Failed to parse structured output: ${rawText}`);\n }\n }\n\n private generateId(): string {\n return `cencori-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n }\n}\n\n/**\n * Create a Cencori adapter for TanStack AI\n * \n * @example\n * import { createCencori } from 'cencori/tanstack';\n * \n * const myProvider = createCencori({ apiKey: 'csk_...' });\n * const adapter = myProvider('gpt-4o');\n */\nexport function createCencori(options: CencoriProviderOptions = {}) {\n return function cencoriProvider<T extends CencoriChatModel>(model: T) {\n return new CencoriTextAdapter(model, options);\n };\n}\n\n/**\n * Default Cencori provider\n * Uses CENCORI_API_KEY environment variable\n * \n * @example\n * import { cencori } from 'cencori/tanstack';\n * import { chat } from '@tanstack/ai';\n * \n * const result = await chat({\n * adapter: cencori('gpt-4o'),\n * messages: [{ role: 'user', content: 'Hello!' }]\n * });\n */\nexport function cencori<T extends CencoriChatModel>(model: T) {\n return new CencoriTextAdapter(model, {});\n}\n\n// Export adapter class for advanced use cases\nexport { CencoriTextAdapter };\n"],"mappings":"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","names":[]}
|
|
@@ -199,6 +199,132 @@ interface ImageGenerationResponse {
|
|
|
199
199
|
model: string;
|
|
200
200
|
provider: string;
|
|
201
201
|
}
|
|
202
|
+
/**
|
|
203
|
+
* A response input item for the Responses API.
|
|
204
|
+
* Can be a message, function call, or function call output.
|
|
205
|
+
*/
|
|
206
|
+
type ResponseInputItem = {
|
|
207
|
+
type: 'message';
|
|
208
|
+
role: 'user' | 'assistant' | 'system';
|
|
209
|
+
content: string;
|
|
210
|
+
} | {
|
|
211
|
+
type: 'function_call';
|
|
212
|
+
id: string;
|
|
213
|
+
call_id: string;
|
|
214
|
+
name: string;
|
|
215
|
+
arguments: string;
|
|
216
|
+
status?: string;
|
|
217
|
+
} | {
|
|
218
|
+
type: 'function_call_output';
|
|
219
|
+
call_id: string;
|
|
220
|
+
output: string;
|
|
221
|
+
} | {
|
|
222
|
+
type: 'file';
|
|
223
|
+
filename: string;
|
|
224
|
+
content: string;
|
|
225
|
+
mime_type?: string;
|
|
226
|
+
};
|
|
227
|
+
/**
|
|
228
|
+
* Built-in tool types for the Responses API
|
|
229
|
+
*/
|
|
230
|
+
type WebSearchTool = {
|
|
231
|
+
type: 'web_search_preview';
|
|
232
|
+
search_context_size?: 'low' | 'medium' | 'high';
|
|
233
|
+
user_location?: {
|
|
234
|
+
type: 'approximate';
|
|
235
|
+
country?: string;
|
|
236
|
+
city?: string;
|
|
237
|
+
region?: string;
|
|
238
|
+
};
|
|
239
|
+
};
|
|
240
|
+
type FileSearchTool = {
|
|
241
|
+
type: 'file_search';
|
|
242
|
+
max_num_results?: number;
|
|
243
|
+
filters?: Record<string, unknown>;
|
|
244
|
+
};
|
|
245
|
+
type CodeInterpreterTool = {
|
|
246
|
+
type: 'code_interpreter';
|
|
247
|
+
};
|
|
248
|
+
/**
|
|
249
|
+
* A tool in the Responses API
|
|
250
|
+
*/
|
|
251
|
+
type ResponsesTool = WebSearchTool | FileSearchTool | CodeInterpreterTool | ToolDefinition;
|
|
252
|
+
/**
|
|
253
|
+
* Request for the Responses API
|
|
254
|
+
*/
|
|
255
|
+
interface ResponsesRequest {
|
|
256
|
+
model: string;
|
|
257
|
+
input: string | ResponseInputItem[];
|
|
258
|
+
instructions?: string;
|
|
259
|
+
tools?: ResponsesTool[];
|
|
260
|
+
tool_choice?: 'auto' | 'none' | 'required' | {
|
|
261
|
+
type: 'function';
|
|
262
|
+
name: string;
|
|
263
|
+
};
|
|
264
|
+
temperature?: number;
|
|
265
|
+
max_output_tokens?: number;
|
|
266
|
+
top_p?: number;
|
|
267
|
+
store?: boolean;
|
|
268
|
+
metadata?: Record<string, string>;
|
|
269
|
+
previous_response_id?: string;
|
|
270
|
+
parallel_tool_calls?: boolean;
|
|
271
|
+
truncation?: 'auto' | 'disabled';
|
|
272
|
+
response_format?: {
|
|
273
|
+
type: 'text' | 'json_object' | 'json_schema';
|
|
274
|
+
json_schema?: {
|
|
275
|
+
name: string;
|
|
276
|
+
description?: string;
|
|
277
|
+
schema: Record<string, unknown>;
|
|
278
|
+
strict?: boolean;
|
|
279
|
+
};
|
|
280
|
+
};
|
|
281
|
+
include?: string[];
|
|
282
|
+
stream?: boolean;
|
|
283
|
+
user?: string;
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* A single output item from a Responses API response
|
|
287
|
+
*/
|
|
288
|
+
type UrlCitation = {
|
|
289
|
+
type: 'url_citation';
|
|
290
|
+
start_index: number;
|
|
291
|
+
end_index: number;
|
|
292
|
+
url: string;
|
|
293
|
+
title?: string;
|
|
294
|
+
};
|
|
295
|
+
interface ResponsesOutputItem {
|
|
296
|
+
id: string;
|
|
297
|
+
type: 'message' | 'function_call' | 'web_search_call' | 'file_search_call' | 'code_interpreter_call' | 'reasoning';
|
|
298
|
+
status?: 'completed' | 'failed' | 'in_progress';
|
|
299
|
+
role?: 'assistant';
|
|
300
|
+
content?: Array<{
|
|
301
|
+
type: 'output_text' | 'refusal';
|
|
302
|
+
text?: string;
|
|
303
|
+
annotations?: UrlCitation[];
|
|
304
|
+
}>;
|
|
305
|
+
call_id?: string;
|
|
306
|
+
name?: string;
|
|
307
|
+
arguments?: string;
|
|
308
|
+
output?: Record<string, unknown>;
|
|
309
|
+
error?: string;
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Response from the Responses API
|
|
313
|
+
*/
|
|
314
|
+
interface ResponsesResponse {
|
|
315
|
+
id: string;
|
|
316
|
+
object: 'response';
|
|
317
|
+
created: number;
|
|
318
|
+
model: string;
|
|
319
|
+
output: ResponsesOutputItem[];
|
|
320
|
+
usage: {
|
|
321
|
+
input_tokens: number;
|
|
322
|
+
output_tokens: number;
|
|
323
|
+
total_tokens: number;
|
|
324
|
+
};
|
|
325
|
+
status: 'completed' | 'failed' | 'in_progress';
|
|
326
|
+
metadata?: Record<string, string>;
|
|
327
|
+
}
|
|
202
328
|
interface ComputeRunOptions {
|
|
203
329
|
input?: Record<string, unknown>;
|
|
204
330
|
timeout?: number;
|
|
@@ -219,5 +345,13 @@ interface RequestOptions {
|
|
|
219
345
|
body?: string;
|
|
220
346
|
headers?: Record<string, string>;
|
|
221
347
|
}
|
|
348
|
+
/**
|
|
349
|
+
* Options for generic API requests
|
|
350
|
+
*/
|
|
351
|
+
interface RequestOptions {
|
|
352
|
+
method: 'GET' | 'POST' | 'PUT' | 'DELETE';
|
|
353
|
+
body?: string;
|
|
354
|
+
headers?: Record<string, string>;
|
|
355
|
+
}
|
|
222
356
|
|
|
223
|
-
export type { CencoriConfig as C, EmbeddingRequest as E, GenerateObjectRequest as G, ImageGenerationRequest as I,
|
|
357
|
+
export type { CencoriConfig as C, EmbeddingRequest as E, FileSearchTool as F, GenerateObjectRequest as G, ImageGenerationRequest as I, ResponsesRequest as R, ToolCall as T, UrlCitation as U, VectorSearchOptions as V, WorkflowTriggerOptions as W, ChatRequest as a, ChatResponse as b, CompletionRequest as c, EmbeddingResponse as d, GenerateObjectResponse as e, ImageGenerationResponse as f, ResponsesResponse as g, ComputeRunOptions as h, RequestOptions as i, ChatMessage as j, ResponsesOutputItem as k, ResponseInputItem as l, ResponsesTool as m, WebSearchTool as n, CodeInterpreterTool as o };
|
|
@@ -199,6 +199,132 @@ interface ImageGenerationResponse {
|
|
|
199
199
|
model: string;
|
|
200
200
|
provider: string;
|
|
201
201
|
}
|
|
202
|
+
/**
|
|
203
|
+
* A response input item for the Responses API.
|
|
204
|
+
* Can be a message, function call, or function call output.
|
|
205
|
+
*/
|
|
206
|
+
type ResponseInputItem = {
|
|
207
|
+
type: 'message';
|
|
208
|
+
role: 'user' | 'assistant' | 'system';
|
|
209
|
+
content: string;
|
|
210
|
+
} | {
|
|
211
|
+
type: 'function_call';
|
|
212
|
+
id: string;
|
|
213
|
+
call_id: string;
|
|
214
|
+
name: string;
|
|
215
|
+
arguments: string;
|
|
216
|
+
status?: string;
|
|
217
|
+
} | {
|
|
218
|
+
type: 'function_call_output';
|
|
219
|
+
call_id: string;
|
|
220
|
+
output: string;
|
|
221
|
+
} | {
|
|
222
|
+
type: 'file';
|
|
223
|
+
filename: string;
|
|
224
|
+
content: string;
|
|
225
|
+
mime_type?: string;
|
|
226
|
+
};
|
|
227
|
+
/**
|
|
228
|
+
* Built-in tool types for the Responses API
|
|
229
|
+
*/
|
|
230
|
+
type WebSearchTool = {
|
|
231
|
+
type: 'web_search_preview';
|
|
232
|
+
search_context_size?: 'low' | 'medium' | 'high';
|
|
233
|
+
user_location?: {
|
|
234
|
+
type: 'approximate';
|
|
235
|
+
country?: string;
|
|
236
|
+
city?: string;
|
|
237
|
+
region?: string;
|
|
238
|
+
};
|
|
239
|
+
};
|
|
240
|
+
type FileSearchTool = {
|
|
241
|
+
type: 'file_search';
|
|
242
|
+
max_num_results?: number;
|
|
243
|
+
filters?: Record<string, unknown>;
|
|
244
|
+
};
|
|
245
|
+
type CodeInterpreterTool = {
|
|
246
|
+
type: 'code_interpreter';
|
|
247
|
+
};
|
|
248
|
+
/**
|
|
249
|
+
* A tool in the Responses API
|
|
250
|
+
*/
|
|
251
|
+
type ResponsesTool = WebSearchTool | FileSearchTool | CodeInterpreterTool | ToolDefinition;
|
|
252
|
+
/**
|
|
253
|
+
* Request for the Responses API
|
|
254
|
+
*/
|
|
255
|
+
interface ResponsesRequest {
|
|
256
|
+
model: string;
|
|
257
|
+
input: string | ResponseInputItem[];
|
|
258
|
+
instructions?: string;
|
|
259
|
+
tools?: ResponsesTool[];
|
|
260
|
+
tool_choice?: 'auto' | 'none' | 'required' | {
|
|
261
|
+
type: 'function';
|
|
262
|
+
name: string;
|
|
263
|
+
};
|
|
264
|
+
temperature?: number;
|
|
265
|
+
max_output_tokens?: number;
|
|
266
|
+
top_p?: number;
|
|
267
|
+
store?: boolean;
|
|
268
|
+
metadata?: Record<string, string>;
|
|
269
|
+
previous_response_id?: string;
|
|
270
|
+
parallel_tool_calls?: boolean;
|
|
271
|
+
truncation?: 'auto' | 'disabled';
|
|
272
|
+
response_format?: {
|
|
273
|
+
type: 'text' | 'json_object' | 'json_schema';
|
|
274
|
+
json_schema?: {
|
|
275
|
+
name: string;
|
|
276
|
+
description?: string;
|
|
277
|
+
schema: Record<string, unknown>;
|
|
278
|
+
strict?: boolean;
|
|
279
|
+
};
|
|
280
|
+
};
|
|
281
|
+
include?: string[];
|
|
282
|
+
stream?: boolean;
|
|
283
|
+
user?: string;
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* A single output item from a Responses API response
|
|
287
|
+
*/
|
|
288
|
+
type UrlCitation = {
|
|
289
|
+
type: 'url_citation';
|
|
290
|
+
start_index: number;
|
|
291
|
+
end_index: number;
|
|
292
|
+
url: string;
|
|
293
|
+
title?: string;
|
|
294
|
+
};
|
|
295
|
+
interface ResponsesOutputItem {
|
|
296
|
+
id: string;
|
|
297
|
+
type: 'message' | 'function_call' | 'web_search_call' | 'file_search_call' | 'code_interpreter_call' | 'reasoning';
|
|
298
|
+
status?: 'completed' | 'failed' | 'in_progress';
|
|
299
|
+
role?: 'assistant';
|
|
300
|
+
content?: Array<{
|
|
301
|
+
type: 'output_text' | 'refusal';
|
|
302
|
+
text?: string;
|
|
303
|
+
annotations?: UrlCitation[];
|
|
304
|
+
}>;
|
|
305
|
+
call_id?: string;
|
|
306
|
+
name?: string;
|
|
307
|
+
arguments?: string;
|
|
308
|
+
output?: Record<string, unknown>;
|
|
309
|
+
error?: string;
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Response from the Responses API
|
|
313
|
+
*/
|
|
314
|
+
interface ResponsesResponse {
|
|
315
|
+
id: string;
|
|
316
|
+
object: 'response';
|
|
317
|
+
created: number;
|
|
318
|
+
model: string;
|
|
319
|
+
output: ResponsesOutputItem[];
|
|
320
|
+
usage: {
|
|
321
|
+
input_tokens: number;
|
|
322
|
+
output_tokens: number;
|
|
323
|
+
total_tokens: number;
|
|
324
|
+
};
|
|
325
|
+
status: 'completed' | 'failed' | 'in_progress';
|
|
326
|
+
metadata?: Record<string, string>;
|
|
327
|
+
}
|
|
202
328
|
interface ComputeRunOptions {
|
|
203
329
|
input?: Record<string, unknown>;
|
|
204
330
|
timeout?: number;
|
|
@@ -219,5 +345,13 @@ interface RequestOptions {
|
|
|
219
345
|
body?: string;
|
|
220
346
|
headers?: Record<string, string>;
|
|
221
347
|
}
|
|
348
|
+
/**
|
|
349
|
+
* Options for generic API requests
|
|
350
|
+
*/
|
|
351
|
+
interface RequestOptions {
|
|
352
|
+
method: 'GET' | 'POST' | 'PUT' | 'DELETE';
|
|
353
|
+
body?: string;
|
|
354
|
+
headers?: Record<string, string>;
|
|
355
|
+
}
|
|
222
356
|
|
|
223
|
-
export type { CencoriConfig as C, EmbeddingRequest as E, GenerateObjectRequest as G, ImageGenerationRequest as I,
|
|
357
|
+
export type { CencoriConfig as C, EmbeddingRequest as E, FileSearchTool as F, GenerateObjectRequest as G, ImageGenerationRequest as I, ResponsesRequest as R, ToolCall as T, UrlCitation as U, VectorSearchOptions as V, WorkflowTriggerOptions as W, ChatRequest as a, ChatResponse as b, CompletionRequest as c, EmbeddingResponse as d, GenerateObjectResponse as e, ImageGenerationResponse as f, ResponsesResponse as g, ComputeRunOptions as h, RequestOptions as i, ChatMessage as j, ResponsesOutputItem as k, ResponseInputItem as l, ResponsesTool as m, WebSearchTool as n, CodeInterpreterTool as o };
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { C as CencoriConfig } from '../types-kh1whvNH.mjs';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Vision API — analyze, describe, OCR, and classify images.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* const result = await cencori.vision.analyze({
|
|
8
|
+
* image: { url: 'https://example.com/photo.jpg' },
|
|
9
|
+
* prompt: 'What breed of dog is this?',
|
|
10
|
+
* });
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* const { text } = await cencori.vision.ocr({ image: { base64, mimeType: 'image/png' } });
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
type VisionProvider = 'openai' | 'anthropic' | 'google';
|
|
17
|
+
type VisionTask = 'analyze' | 'describe' | 'ocr' | 'classify';
|
|
18
|
+
interface VisionImage {
|
|
19
|
+
/** https:// URL or data: URL. Exactly one of `url` or `base64` must be set. */
|
|
20
|
+
url?: string;
|
|
21
|
+
/** Raw base64 (no data: prefix). Requires `mimeType`. */
|
|
22
|
+
base64?: string;
|
|
23
|
+
/** Image mime type. Required when using `base64`. */
|
|
24
|
+
mimeType?: string;
|
|
25
|
+
}
|
|
26
|
+
interface VisionRequest {
|
|
27
|
+
image: VisionImage;
|
|
28
|
+
prompt?: string;
|
|
29
|
+
model?: string;
|
|
30
|
+
maxTokens?: number;
|
|
31
|
+
temperature?: number;
|
|
32
|
+
responseFormat?: 'text' | 'json';
|
|
33
|
+
}
|
|
34
|
+
interface VisionUsage {
|
|
35
|
+
promptTokens: number;
|
|
36
|
+
completionTokens: number;
|
|
37
|
+
totalTokens: number;
|
|
38
|
+
}
|
|
39
|
+
interface VisionCost {
|
|
40
|
+
providerCostUsd: number;
|
|
41
|
+
cencoriChargeUsd: number;
|
|
42
|
+
markupPercentage: number;
|
|
43
|
+
}
|
|
44
|
+
interface VisionResult {
|
|
45
|
+
analysis: string;
|
|
46
|
+
model: string;
|
|
47
|
+
provider: VisionProvider;
|
|
48
|
+
usage: VisionUsage;
|
|
49
|
+
cost: VisionCost;
|
|
50
|
+
}
|
|
51
|
+
interface VisionDescribeResult {
|
|
52
|
+
description: string;
|
|
53
|
+
model: string;
|
|
54
|
+
provider: VisionProvider;
|
|
55
|
+
usage: VisionUsage;
|
|
56
|
+
cost: VisionCost;
|
|
57
|
+
}
|
|
58
|
+
interface VisionOcrResult {
|
|
59
|
+
text: string;
|
|
60
|
+
model: string;
|
|
61
|
+
provider: VisionProvider;
|
|
62
|
+
usage: VisionUsage;
|
|
63
|
+
cost: VisionCost;
|
|
64
|
+
}
|
|
65
|
+
interface VisionClassification {
|
|
66
|
+
primary_category?: string;
|
|
67
|
+
tags?: string[];
|
|
68
|
+
objects?: string[];
|
|
69
|
+
safe_for_work?: boolean;
|
|
70
|
+
confidence?: number;
|
|
71
|
+
summary?: string;
|
|
72
|
+
[key: string]: unknown;
|
|
73
|
+
}
|
|
74
|
+
interface VisionClassifyResult {
|
|
75
|
+
classification: VisionClassification | string;
|
|
76
|
+
raw: string;
|
|
77
|
+
model: string;
|
|
78
|
+
provider: VisionProvider;
|
|
79
|
+
usage: VisionUsage;
|
|
80
|
+
cost: VisionCost;
|
|
81
|
+
}
|
|
82
|
+
declare class VisionNamespace {
|
|
83
|
+
private config;
|
|
84
|
+
constructor(config: Required<CencoriConfig>);
|
|
85
|
+
/**
|
|
86
|
+
* General image analysis — provide your own prompt.
|
|
87
|
+
* Default prompt: "Describe this image in detail."
|
|
88
|
+
*/
|
|
89
|
+
analyze(request: VisionRequest): Promise<VisionResult>;
|
|
90
|
+
/** Describe the image in rich detail. */
|
|
91
|
+
describe(request: VisionRequest): Promise<VisionDescribeResult>;
|
|
92
|
+
/** Extract all visible text from the image. */
|
|
93
|
+
ocr(request: VisionRequest): Promise<VisionOcrResult>;
|
|
94
|
+
/** Return structured tags, objects, and category classification. */
|
|
95
|
+
classify(request: VisionRequest): Promise<VisionClassifyResult>;
|
|
96
|
+
private post;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export { type VisionClassification, type VisionClassifyResult, type VisionCost, type VisionDescribeResult, type VisionImage, VisionNamespace, type VisionOcrResult, type VisionProvider, type VisionRequest, type VisionResult, type VisionTask, type VisionUsage };
|