cencori 1.4.0 → 1.4.1

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ai/index.ts","../src/agents/index.ts","../src/vision/index.ts","../src/documents/index.ts","../src/sessions/index.ts","../src/compute/index.ts","../src/workflow/index.ts","../src/storage/index.ts","../src/memory/index.ts","../src/telemetry/index.ts","../src/utils.ts","../src/errors.ts","../src/cencori.ts","../src/vercel/cencori-chat-model.ts","../src/vercel/cencori-provider.ts"],"sourcesContent":["/**\n * AI Gateway - Chat, Completions, Embeddings, and Streaming\n * \n * @example\n * const response = await cencori.ai.chat({\n * model: 'gpt-4o',\n * messages: [{ role: 'user', content: 'Hello!' }]\n * });\n */\n\nimport type {\n CencoriConfig,\n ChatRequest,\n ChatResponse,\n CompletionRequest,\n EmbeddingRequest,\n EmbeddingResponse,\n GenerateObjectRequest,\n GenerateObjectResponse,\n ImageGenerationRequest,\n ImageGenerationResponse,\n ResponsesRequest,\n ResponsesResponse,\n ToolCall,\n} from '../types';\n\n// API Response types\ninterface OpenAIChatResponse {\n id?: string;\n model?: string;\n content?: string;\n finish_reason?: string;\n toolCalls?: Array<{\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n }>;\n tool_calls?: Array<{\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n }>;\n choices?: Array<{\n message?: {\n content?: string;\n tool_calls?: Array<{\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n }>;\n };\n finish_reason?: string;\n }>;\n usage?: {\n prompt_tokens?: number;\n completion_tokens?: number;\n total_tokens?: number;\n };\n}\n\ninterface OpenAIEmbeddingResponse {\n model: string;\n data?: Array<{\n embedding: number[];\n }>;\n usage?: {\n total_tokens?: number;\n };\n}\n\n/**\n * Stream chunk from chat stream\n */\nexport interface StreamChunk {\n delta: string;\n finish_reason?: 'stop' | 'length' | 'content_filter' | 'tool_calls' | 'error';\n /** Tool calls in progress during streaming */\n toolCalls?: ToolCall[];\n /** Error message if the stream encountered an error */\n error?: string;\n}\n\nexport class AINamespace {\n private config: Required<CencoriConfig>;\n\n constructor(config: Required<CencoriConfig>) {\n this.config = config;\n }\n\n /**\n * Create a chat completion\n * \n * @example\n * const response = await cencori.ai.chat({\n * model: 'gpt-4o',\n * messages: [{ role: 'user', content: 'Hello!' }]\n * });\n */\n async chat(request: ChatRequest): Promise<ChatResponse> {\n const response = await fetch(`${this.config.baseUrl}/api/ai/chat`, {\n method: 'POST',\n headers: {\n 'CENCORI_API_KEY': this.config.apiKey,\n 'Content-Type': 'application/json',\n ...this.config.headers,\n },\n body: JSON.stringify({\n model: request.model,\n messages: request.messages,\n temperature: request.temperature,\n maxTokens: request.maxTokens,\n stream: false,\n tools: request.tools,\n toolChoice: request.toolChoice,\n prompt: request.prompt,\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 data = await response.json() as OpenAIChatResponse;\n\n const choice = data.choices?.[0];\n const rawToolCalls = data.toolCalls ?? data.tool_calls ?? choice?.message?.tool_calls;\n const toolCalls = rawToolCalls?.map(tc => ({\n id: tc.id,\n type: tc.type as 'function',\n function: {\n name: tc.function.name,\n arguments: tc.function.arguments,\n },\n }));\n\n return {\n id: data.id ?? `chatcmpl-${Date.now()}`,\n model: data.model ?? request.model,\n content: data.content ?? choice?.message?.content ?? '',\n toolCalls,\n finishReason: (data.finish_reason ?? choice?.finish_reason) as ChatResponse['finishReason'],\n usage: {\n promptTokens: data.usage?.prompt_tokens ?? 0,\n completionTokens: data.usage?.completion_tokens ?? 0,\n totalTokens: data.usage?.total_tokens ?? 0,\n },\n };\n }\n\n /**\n * Stream chat completions\n * Returns an async generator that yields chunks as they arrive\n * \n * @example\n * for await (const chunk of cencori.ai.chatStream({ model: 'gpt-4o', messages })) {\n * process.stdout.write(chunk.delta);\n * }\n */\n async *chatStream(request: ChatRequest): AsyncGenerator<StreamChunk, void, unknown> {\n const response = await fetch(`${this.config.baseUrl}/api/ai/chat`, {\n method: 'POST',\n headers: {\n 'CENCORI_API_KEY': this.config.apiKey,\n 'Content-Type': 'application/json',\n ...this.config.headers,\n },\n body: JSON.stringify({\n model: request.model,\n messages: request.messages,\n temperature: request.temperature,\n maxTokens: request.maxTokens,\n stream: true,\n tools: request.tools,\n toolChoice: request.toolChoice,\n prompt: request.prompt,\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 if (!response.body) {\n throw new Error('Response body is null');\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n\n // Keep the last incomplete line in the buffer\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); // Remove 'data: ' prefix\n\n if (data === '[DONE]') {\n return;\n }\n\n try {\n const chunk = JSON.parse(data) as StreamChunk;\n yield chunk;\n } catch {\n // Skip malformed JSON\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n /**\n * Create a text completion\n * \n * @example\n * const response = await cencori.ai.completions({\n * model: 'gpt-4o',\n * prompt: 'Write a haiku about coding'\n * });\n */\n async completions(request: CompletionRequest): Promise<ChatResponse> {\n // Convert to chat format internally\n return this.chat({\n model: request.model,\n messages: [{ role: 'user', content: request.prompt }],\n temperature: request.temperature,\n maxTokens: request.maxTokens,\n });\n }\n\n /**\n * Create embeddings\n * \n * @example\n * const response = await cencori.ai.embeddings({\n * model: 'text-embedding-3-small',\n * input: 'Hello world'\n * });\n */\n async embeddings(request: EmbeddingRequest): Promise<EmbeddingResponse> {\n const response = await fetch(`${this.config.baseUrl}/api/ai/embeddings`, {\n method: 'POST',\n headers: {\n 'CENCORI_API_KEY': this.config.apiKey,\n 'Content-Type': 'application/json',\n ...this.config.headers,\n },\n body: JSON.stringify({\n model: request.model,\n input: request.input,\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 data = await response.json() as OpenAIEmbeddingResponse;\n\n return {\n model: data.model,\n embeddings: data.data?.map((d) => d.embedding) ?? [],\n usage: {\n totalTokens: data.usage?.total_tokens ?? 0,\n },\n };\n }\n\n /**\n * Generate structured output with JSON schema\n * \n * @example\n * const response = await cencori.ai.generateObject({\n * model: 'gpt-4o',\n * prompt: 'Generate a user profile',\n * schema: {\n * type: 'object',\n * properties: {\n * name: { type: 'string' },\n * age: { type: 'number' }\n * },\n * required: ['name', 'age']\n * }\n * });\n * console.log(response.object); // { name: 'John', age: 30 }\n */\n async generateObject<T = unknown>(request: GenerateObjectRequest): Promise<GenerateObjectResponse<T>> {\n // Build messages from prompt or use provided messages\n const messages = request.messages ?? [\n { role: 'user' as const, content: request.prompt ?? '' }\n ];\n\n // Use function calling to enforce JSON schema\n const response = await fetch(`${this.config.baseUrl}/api/ai/chat`, {\n method: 'POST',\n headers: {\n 'CENCORI_API_KEY': this.config.apiKey,\n 'Content-Type': 'application/json',\n ...this.config.headers,\n },\n body: JSON.stringify({\n model: request.model,\n messages,\n temperature: request.temperature,\n maxTokens: request.maxTokens,\n stream: false,\n tools: [{\n type: 'function',\n function: {\n name: request.schemaName ?? 'generate_object',\n description: request.schemaDescription ?? 'Generate a structured object matching the schema',\n parameters: request.schema,\n },\n }],\n toolChoice: {\n type: 'function',\n function: { name: request.schemaName ?? 'generate_object' },\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 data = await response.json() as OpenAIChatResponse;\n const toolCall = data.toolCalls?.[0] ?? data.tool_calls?.[0] ?? data.choices?.[0]?.message?.tool_calls?.[0];\n\n if (!toolCall) {\n throw new Error('Model did not return structured output');\n }\n\n let parsedObject: T;\n try {\n parsedObject = JSON.parse(toolCall.function.arguments) as T;\n } catch {\n throw new Error('Failed to parse structured output as JSON');\n }\n\n return {\n object: parsedObject,\n usage: {\n promptTokens: data.usage?.prompt_tokens ?? 0,\n completionTokens: data.usage?.completion_tokens ?? 0,\n totalTokens: data.usage?.total_tokens ?? 0,\n },\n };\n }\n\n /**\n * Generate images from a text prompt\n * \n * @example\n * const response = await cencori.ai.generateImage({\n * prompt: 'A futuristic city at sunset',\n * model: 'dall-e-3',\n * size: '1024x1024'\n * });\n * console.log(response.images[0].url);\n */\n async generateImage(request: ImageGenerationRequest): Promise<ImageGenerationResponse> {\n const response = await fetch(`${this.config.baseUrl}/api/ai/images/generate`, {\n method: 'POST',\n headers: {\n 'CENCORI_API_KEY': this.config.apiKey,\n 'Content-Type': 'application/json',\n ...this.config.headers,\n },\n body: JSON.stringify({\n prompt: request.prompt,\n model: request.model ?? 'dall-e-3',\n n: request.n,\n size: request.size,\n quality: request.quality,\n style: request.style,\n responseFormat: request.responseFormat,\n }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({ error: 'Unknown error' })) as { error?: string; message?: string };\n throw new Error(`Cencori API error: ${errorData.message || errorData.error || response.statusText}`);\n }\n\n const data = await response.json() as {\n images: Array<{ url?: string; b64_json?: string; revisedPrompt?: string }>;\n model: string;\n provider: string;\n };\n\n return {\n images: data.images.map(img => ({\n url: img.url,\n b64Json: img.b64_json,\n revisedPrompt: img.revisedPrompt,\n })),\n model: data.model,\n provider: data.provider,\n };\n }\n\n /**\n * RAG (Retrieval-Augmented Generation) - Chat with automatic memory context\n * \n * Searches your memory namespace for relevant context and includes it\n * in the prompt automatically. Returns the AI response along with sources.\n * \n * @example\n * const response = await cencori.ai.rag({\n * model: 'gpt-4o',\n * messages: [{ role: 'user', content: 'What are our company policies?' }],\n * namespace: 'company-docs',\n * limit: 5, // number of memories to retrieve\n * });\n * console.log(response.message.content);\n * console.log(response.sources); // retrieved context\n */\n async rag(request: RagRequest): Promise<RagResponse> {\n const response = await fetch(`${this.config.baseUrl}/api/ai/rag`, {\n method: 'POST',\n headers: {\n 'CENCORI_API_KEY': this.config.apiKey,\n 'Content-Type': 'application/json',\n ...this.config.headers,\n },\n body: JSON.stringify({\n model: request.model,\n messages: request.messages,\n namespace: request.namespace,\n temperature: request.temperature,\n maxTokens: request.maxTokens,\n limit: request.limit ?? 5,\n threshold: request.threshold ?? 0.5,\n include_sources: request.includeSources ?? true,\n stream: false,\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 data = await response.json() as RagApiResponse;\n\n return {\n message: {\n role: 'assistant',\n content: data.message.content,\n },\n model: data.model,\n provider: data.provider,\n usage: {\n promptTokens: data.usage.prompt_tokens,\n completionTokens: data.usage.completion_tokens,\n totalTokens: data.usage.total_tokens,\n },\n sources: data.sources?.map(s => ({\n content: s.content,\n metadata: s.metadata,\n similarity: s.similarity,\n })),\n latencyMs: data.latency_ms,\n };\n }\n\n /**\n * Send a request to the OpenAI-compatible Responses API.\n * Supports built-in tools: web_search_preview, file_search, code_interpreter.\n *\n * @example\n * const response = await cencori.ai.responses({\n * model: 'gpt-4o',\n * input: 'What is the weather in San Francisco?',\n * tools: [{ type: 'web_search_preview' }]\n * });\n * console.log(response.output[0].content?.[0]?.text);\n */\n async responses(request: ResponsesRequest): Promise<ResponsesResponse> {\n const response = await fetch(`${this.config.baseUrl}/v1/responses`, {\n method: 'POST',\n headers: {\n 'CENCORI_API_KEY': this.config.apiKey,\n 'Content-Type': 'application/json',\n ...this.config.headers,\n },\n body: JSON.stringify({\n model: request.model,\n input: request.input,\n instructions: request.instructions,\n tools: request.tools,\n tool_choice: request.tool_choice,\n temperature: request.temperature,\n max_output_tokens: request.max_output_tokens,\n top_p: request.top_p,\n store: request.store,\n metadata: request.metadata,\n previous_response_id: request.previous_response_id,\n parallel_tool_calls: request.parallel_tool_calls,\n truncation: request.truncation,\n response_format: request.response_format,\n include: request.include,\n stream: false,\n user: request.user,\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 return response.json() as Promise<ResponsesResponse>;\n }\n\n /**\n * Stream responses from the Responses API via SSE.\n * Yields parsed events as they arrive.\n *\n * @example\n * for await (const event of cencori.ai.responsesStream({\n * model: 'gpt-4o',\n * input: 'Tell me about AI',\n * })) {\n * if (event.type === 'response.output_text.delta') {\n * process.stdout.write(event.data.delta);\n * }\n * }\n */\n async *responsesStream(request: ResponsesRequest): AsyncGenerator<{ type: string; data: Record<string, unknown> }, void, unknown> {\n const response = await fetch(`${this.config.baseUrl}/v1/responses`, {\n method: 'POST',\n headers: {\n 'CENCORI_API_KEY': this.config.apiKey,\n 'Content-Type': 'application/json',\n ...this.config.headers,\n },\n body: JSON.stringify({\n model: request.model,\n input: request.input,\n instructions: request.instructions,\n tools: request.tools,\n tool_choice: request.tool_choice,\n temperature: request.temperature,\n max_output_tokens: request.max_output_tokens,\n top_p: request.top_p,\n store: request.store,\n metadata: request.metadata,\n previous_response_id: request.previous_response_id,\n parallel_tool_calls: request.parallel_tool_calls,\n truncation: request.truncation,\n response_format: request.response_format,\n include: request.include,\n stream: true,\n user: request.user,\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 if (!response.body) {\n throw new Error('Response body is null');\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n let eventType = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\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() === '') {\n eventType = '';\n continue;\n }\n if (line.startsWith('event: ')) {\n eventType = line.slice(7).trim();\n continue;\n }\n if (line.startsWith('data: ')) {\n const data = line.slice(6).trim();\n if (!data) continue;\n try {\n const parsed = JSON.parse(data) as Record<string, unknown>;\n yield { type: eventType || 'message', data: parsed };\n } catch {\n // skip malformed JSON\n }\n eventType = '';\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n /**\n * Stream RAG responses with automatic memory context\n * \n * @example\n * for await (const chunk of cencori.ai.ragStream({ model: 'gpt-4o', messages, namespace: 'docs' })) {\n * if (chunk.type === 'sources') console.log('Sources:', chunk.sources);\n * if (chunk.type === 'content') process.stdout.write(chunk.delta);\n * }\n */\n async *ragStream(request: RagRequest): AsyncGenerator<RagStreamChunk, void, unknown> {\n const response = await fetch(`${this.config.baseUrl}/api/ai/rag`, {\n method: 'POST',\n headers: {\n 'CENCORI_API_KEY': this.config.apiKey,\n 'Content-Type': 'application/json',\n ...this.config.headers,\n },\n body: JSON.stringify({\n model: request.model,\n messages: request.messages,\n namespace: request.namespace,\n temperature: request.temperature,\n maxTokens: request.maxTokens,\n limit: request.limit ?? 5,\n threshold: request.threshold ?? 0.5,\n include_sources: request.includeSources ?? true,\n stream: true,\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 if (!response.body) {\n throw new Error('Response body is null');\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) break;\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\n if (data === '[DONE]') {\n return;\n }\n\n try {\n const chunk = JSON.parse(data) as RagStreamChunk;\n yield chunk;\n } catch {\n // Skip malformed JSON\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n}\n\n// RAG Types\nexport interface RagRequest {\n model: string;\n messages: Array<{ role: 'system' | 'user' | 'assistant'; content: string }>;\n namespace: string;\n temperature?: number;\n maxTokens?: number;\n limit?: number;\n threshold?: number;\n includeSources?: boolean;\n}\n\nexport interface RagResponse {\n message: { role: string; content: string };\n model: string;\n provider: string;\n usage: {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n };\n sources?: Array<{\n content: string;\n metadata: Record<string, unknown>;\n similarity: number;\n }>;\n latencyMs: number;\n}\n\nexport interface RagStreamChunk {\n type: 'sources' | 'content';\n delta?: string;\n finish_reason?: string;\n sources?: Array<{\n content: string;\n metadata: Record<string, unknown>;\n similarity: number;\n }>;\n}\n\ninterface RagApiResponse {\n message: { role: string; content: string };\n model: string;\n provider: string;\n usage: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n };\n sources?: Array<{\n content: string;\n metadata: Record<string, unknown>;\n similarity: number;\n }>;\n latency_ms: number;\n}\n","import type { CencoriConfig } from '../types';\n\nexport interface AgentConfig {\n model: string;\n system_prompt: string | null;\n tools: string[];\n temperature: number | null;\n}\n\nexport interface Agent {\n id: string;\n name: string;\n description: string | null;\n is_active: boolean;\n shadow_mode: boolean;\n created_at: string;\n updated_at?: string;\n config: AgentConfig;\n}\n\nexport interface AgentListItem {\n id: string;\n name: string;\n description: string | null;\n is_active: boolean;\n shadow_mode: boolean;\n created_at: string;\n}\n\nexport interface CreateAgentParams {\n name: string;\n description?: string;\n config?: {\n model?: string;\n system_prompt?: string;\n tools?: string[];\n temperature?: number;\n };\n}\n\nexport interface UpdateAgentParams {\n name?: string;\n description?: string;\n is_active?: boolean;\n shadow_mode?: boolean;\n config?: {\n model?: string;\n system_prompt?: string;\n tools?: string[];\n temperature?: number;\n };\n}\n\nexport interface AgentKey {\n id: string;\n name: string;\n key_prefix: string;\n full_key?: string;\n environment: string;\n key_type: string;\n agent_id: string;\n created_at: string;\n}\n\nexport interface CreateAgentKeyParams {\n name?: string;\n environment?: 'production' | 'test';\n key_type?: 'secret' | 'publishable';\n allowed_domains?: string[];\n}\n\nexport class AgentsNamespace {\n private config: Required<CencoriConfig>;\n\n constructor(config: Required<CencoriConfig>) {\n this.config = config;\n }\n\n private async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const response = await fetch(`${this.config.baseUrl}${path}`, {\n method,\n headers: {\n 'CENCORI_API_KEY': this.config.apiKey,\n 'Content-Type': 'application/json',\n ...this.config.headers,\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({ error: 'Unknown error' })) as { error?: { message?: string } };\n throw new Error(`Cencori API error: ${errorData.error?.message || response.statusText}`);\n }\n\n if (response.status === 204) return undefined as T;\n return response.json() as Promise<T>;\n }\n\n async create(params: CreateAgentParams): Promise<Agent> {\n return this.request<Agent>('POST', '/v1/agents', params);\n }\n\n async list(): Promise<{ data: AgentListItem[] }> {\n return this.request<{ data: AgentListItem[] }>('GET', '/v1/agents');\n }\n\n async get(agentId: string): Promise<Agent> {\n return this.request<Agent>('GET', `/v1/agents/${agentId}`);\n }\n\n async updateConfig(agentId: string, params: UpdateAgentParams): Promise<Agent> {\n return this.request<Agent>('PATCH', `/v1/agents/${agentId}`, params);\n }\n\n async delete(agentId: string): Promise<void> {\n return this.request<void>('DELETE', `/v1/agents/${agentId}`);\n }\n\n async createKey(agentId: string, params?: CreateAgentKeyParams): Promise<AgentKey> {\n return this.request<AgentKey>('POST', `/v1/agents/${agentId}/keys`, params || {});\n }\n}\n","/**\n * Vision API — analyze, describe, OCR, and classify images.\n *\n * @example\n * const result = await cencori.vision.analyze({\n * image: { url: 'https://example.com/photo.jpg' },\n * prompt: 'What breed of dog is this?',\n * });\n *\n * @example\n * const { text } = await cencori.vision.ocr({ image: { base64, mimeType: 'image/png' } });\n */\n\nimport type { CencoriConfig } from '../types';\n\nexport type VisionProvider = 'openai' | 'anthropic' | 'google';\n\nexport type VisionTask = 'analyze' | 'describe' | 'ocr' | 'classify';\n\nexport interface VisionImage {\n /** https:// URL or data: URL. Exactly one of `url` or `base64` must be set. */\n url?: string;\n /** Raw base64 (no data: prefix). Requires `mimeType`. */\n base64?: string;\n /** Image mime type. Required when using `base64`. */\n mimeType?: string;\n}\n\nexport interface VisionRequest {\n /** Single image. Use this OR `images`. */\n image?: VisionImage;\n /** Multiple images to analyze together. */\n images?: VisionImage[];\n prompt?: string;\n model?: string;\n maxTokens?: number;\n temperature?: number;\n responseFormat?: 'text' | 'json';\n}\n\nexport interface VisionStreamChunk {\n delta?: string;\n done?: boolean;\n model?: string;\n provider?: VisionProvider;\n usage?: VisionUsage;\n cost?: VisionCost;\n error?: string;\n}\n\nexport interface VisionUsage {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n}\n\nexport interface VisionCost {\n providerCostUsd: number;\n cencoriChargeUsd: number;\n markupPercentage: number;\n}\n\nexport interface VisionResult {\n analysis: string;\n model: string;\n provider: VisionProvider;\n usage: VisionUsage;\n cost: VisionCost;\n}\n\nexport interface VisionDescribeResult {\n description: string;\n model: string;\n provider: VisionProvider;\n usage: VisionUsage;\n cost: VisionCost;\n}\n\nexport interface VisionOcrResult {\n text: string;\n model: string;\n provider: VisionProvider;\n usage: VisionUsage;\n cost: VisionCost;\n}\n\nexport interface VisionClassification {\n primary_category?: string;\n tags?: string[];\n objects?: string[];\n safe_for_work?: boolean;\n confidence?: number;\n summary?: string;\n [key: string]: unknown;\n}\n\nexport interface VisionClassifyResult {\n classification: VisionClassification | string;\n raw: string;\n model: string;\n provider: VisionProvider;\n usage: VisionUsage;\n cost: VisionCost;\n}\n\ninterface JsonBody {\n image_url?: string;\n image_base64?: string;\n mime_type?: string;\n images?: Array<{ url?: string; base64?: string; mime_type?: string }>;\n prompt?: string;\n model?: string;\n max_tokens?: number;\n temperature?: number;\n response_format?: 'text' | 'json';\n}\n\nfunction toBody(request: VisionRequest): JsonBody {\n const body: JsonBody = {\n prompt: request.prompt,\n model: request.model,\n max_tokens: request.maxTokens,\n temperature: request.temperature,\n response_format: request.responseFormat,\n };\n\n if (request.images && request.images.length > 0) {\n body.images = request.images.map(img => {\n if (img.url) return { url: img.url };\n if (img.base64) return { base64: img.base64, mime_type: img.mimeType };\n throw new Error('Each entry in images requires url or base64');\n });\n return body;\n }\n if (!request.image) {\n throw new Error('vision request requires `image` or `images[]`');\n }\n if (request.image.url) {\n body.image_url = request.image.url;\n } else if (request.image.base64) {\n body.image_base64 = request.image.base64;\n body.mime_type = request.image.mimeType;\n } else {\n throw new Error('vision request requires image.url or image.base64');\n }\n return body;\n}\n\nexport class VisionNamespace {\n private config: Required<CencoriConfig>;\n\n constructor(config: Required<CencoriConfig>) {\n this.config = config;\n }\n\n /**\n * General image analysis — provide your own prompt.\n * Default prompt: \"Describe this image in detail.\"\n */\n async analyze(request: VisionRequest): Promise<VisionResult> {\n return this.post<VisionResult>('/api/ai/vision', request);\n }\n\n /** Describe the image in rich detail. */\n async describe(request: VisionRequest): Promise<VisionDescribeResult> {\n return this.post<VisionDescribeResult>('/api/ai/vision/describe', request);\n }\n\n /** Extract all visible text from the image. */\n async ocr(request: VisionRequest): Promise<VisionOcrResult> {\n return this.post<VisionOcrResult>('/api/ai/vision/ocr', request);\n }\n\n /** Return structured tags, objects, and category classification. */\n async classify(request: VisionRequest): Promise<VisionClassifyResult> {\n return this.post<VisionClassifyResult>('/api/ai/vision/classify', request);\n }\n\n /**\n * Stream a vision analysis. Yields `{ delta }` chunks as text arrives, then\n * a final `{ done: true, model, provider, usage, cost }` chunk with totals.\n *\n * @example\n * for await (const chunk of cencori.vision.analyzeStream({ image: { url } })) {\n * if (chunk.delta) process.stdout.write(chunk.delta);\n * if (chunk.done) console.log(chunk.cost);\n * }\n */\n async *analyzeStream(request: VisionRequest): AsyncGenerator<VisionStreamChunk, void, unknown> {\n const body = { ...toBody(request), stream: true };\n const response = await fetch(`${this.config.baseUrl}/api/ai/vision`, {\n method: 'POST',\n headers: {\n 'CENCORI_API_KEY': this.config.apiKey,\n 'Content-Type': 'application/json',\n ...this.config.headers,\n },\n body: JSON.stringify(body),\n });\n if (!response.ok) {\n const data = await response.json().catch(() => ({}));\n const message =\n (data && typeof data === 'object' && 'message' in data && typeof data.message === 'string')\n ? data.message\n : `Vision stream request failed with status ${response.status}`;\n throw new Error(message);\n }\n if (!response.body) throw new Error('Response body is null');\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue;\n const data = line.slice(6);\n if (data === '[DONE]') return;\n try {\n yield JSON.parse(data) as VisionStreamChunk;\n } catch {\n // skip malformed frame\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n private async post<T>(path: string, request: VisionRequest): Promise<T> {\n const response = await fetch(`${this.config.baseUrl}${path}`, {\n method: 'POST',\n headers: {\n 'CENCORI_API_KEY': this.config.apiKey,\n 'Content-Type': 'application/json',\n ...this.config.headers,\n },\n body: JSON.stringify(toBody(request)),\n });\n const data = await response.json();\n if (!response.ok) {\n const message =\n (data && typeof data === 'object' && 'message' in data && typeof data.message === 'string')\n ? data.message\n : `Vision request failed with status ${response.status}`;\n const code =\n (data && typeof data === 'object' && 'error' in data && typeof data.error === 'string')\n ? data.error\n : 'request_failed';\n const err = new Error(message) as Error & { code?: string; details?: unknown };\n err.code = code;\n err.details = data;\n throw err;\n }\n return data as T;\n }\n}\n","/**\n * Documents API — extract text from PDFs and images, summarize, and query.\n *\n * @example\n * const { text, pageCount } = await cencori.documents.extract({\n * document: { url: 'https://example.com/contract.pdf' },\n * });\n *\n * @example\n * const { summary } = await cencori.documents.summarize({\n * document: { base64, mimeType: 'application/pdf' },\n * });\n *\n * @example\n * const { answer } = await cencori.documents.query({\n * document: { url: 'https://example.com/report.pdf' },\n * question: 'What is the total revenue for Q3?',\n * });\n */\n\nimport type { CencoriConfig } from '../types';\n\nexport type DocumentExtractMethod = 'pdf_text' | 'vision_ocr';\nexport type DocumentKind = 'pdf' | 'image';\n\nexport interface DocumentInput {\n url?: string;\n base64?: string;\n mimeType?: string;\n filename?: string;\n}\n\nexport interface DocumentRequest {\n document: DocumentInput;\n prompt?: string;\n model?: string;\n maxTokens?: number;\n temperature?: number;\n}\n\nexport interface DocumentQueryRequest extends DocumentRequest {\n question: string;\n}\n\nexport interface DocumentUsage {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n}\n\nexport interface DocumentCost {\n providerCostUsd: number;\n cencoriChargeUsd: number;\n markupPercentage: number;\n}\n\nexport interface DocumentExtractResult {\n text: string;\n pageCount: number;\n kind: DocumentKind;\n method: DocumentExtractMethod;\n model?: string;\n provider?: string;\n metadata?: Record<string, unknown>;\n usage?: DocumentUsage;\n cost?: DocumentCost;\n}\n\nexport interface DocumentSummarizeResult {\n summary: string;\n text: string;\n pageCount: number;\n model: string;\n provider: string;\n extractMethod: DocumentExtractMethod;\n usage: DocumentUsage;\n cost: DocumentCost;\n}\n\nexport interface DocumentQueryResult {\n answer: string;\n question: string;\n pageCount: number;\n model: string;\n provider: string;\n extractMethod: DocumentExtractMethod;\n usage: DocumentUsage;\n cost: DocumentCost;\n}\n\ninterface JsonBody {\n document_url?: string;\n document_base64?: string;\n mime_type?: string;\n filename?: string;\n prompt?: string;\n model?: string;\n max_tokens?: number;\n temperature?: number;\n question?: string;\n}\n\nfunction toBody(request: DocumentRequest, extra: Partial<JsonBody> = {}): JsonBody {\n const body: JsonBody = {\n prompt: request.prompt,\n model: request.model,\n max_tokens: request.maxTokens,\n temperature: request.temperature,\n ...extra,\n };\n if (request.document.url) {\n body.document_url = request.document.url;\n } else if (request.document.base64) {\n body.document_base64 = request.document.base64;\n body.mime_type = request.document.mimeType;\n body.filename = request.document.filename;\n } else {\n throw new Error('documents request requires document.url or document.base64');\n }\n return body;\n}\n\nexport class DocumentsNamespace {\n private config: Required<CencoriConfig>;\n\n constructor(config: Required<CencoriConfig>) {\n this.config = config;\n }\n\n /** Extract text from a PDF (native, no LLM) or image (via Vision OCR). */\n async extract(request: DocumentRequest): Promise<DocumentExtractResult> {\n return this.post<DocumentExtractResult>('/api/ai/documents/extract', toBody(request));\n }\n\n /** Extract then summarize the document with a chat model. */\n async summarize(request: DocumentRequest): Promise<DocumentSummarizeResult> {\n return this.post<DocumentSummarizeResult>('/api/ai/documents/summarize', toBody(request));\n }\n\n /** Extract then answer a question about the document. */\n async query(request: DocumentQueryRequest): Promise<DocumentQueryResult> {\n if (!request.question) throw new Error('documents.query requires a `question`');\n return this.post<DocumentQueryResult>('/api/ai/documents/query', toBody(request, { question: request.question }));\n }\n\n private async post<T>(path: string, body: JsonBody): Promise<T> {\n const response = await fetch(`${this.config.baseUrl}${path}`, {\n method: 'POST',\n headers: {\n 'CENCORI_API_KEY': this.config.apiKey,\n 'Content-Type': 'application/json',\n ...this.config.headers,\n },\n body: JSON.stringify(body),\n });\n const data = await response.json();\n if (!response.ok) {\n const message =\n (data && typeof data === 'object' && 'message' in data && typeof data.message === 'string')\n ? data.message\n : `Documents request failed with status ${response.status}`;\n const code =\n (data && typeof data === 'object' && 'error' in data && typeof data.error === 'string')\n ? data.error\n : 'request_failed';\n const err = new Error(message) as Error & { code?: string; details?: unknown };\n err.code = code;\n err.details = data;\n throw err;\n }\n return data as T;\n }\n}\n","import type { CencoriConfig } from '../types';\n\nexport interface Session {\n id: string;\n status: 'active' | 'paused' | 'completed' | 'failed';\n turn_count: number;\n created_at: string;\n updated_at: string;\n agent_id: string | null;\n metadata: Record<string, unknown>;\n total_cost: number;\n}\n\nexport interface SessionEvent {\n id: string;\n session_id: string;\n turn_number: number;\n sequence: number;\n event_type: string;\n payload: Record<string, unknown>;\n created_at: string;\n}\n\nexport interface CreateSessionParams {\n agent_id?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface TurnParams {\n input: string | Array<Record<string, unknown>>;\n tools?: Array<Record<string, unknown>>;\n instructions?: string;\n agent_id?: string;\n model?: string;\n temperature?: number;\n max_output_tokens?: number;\n tool_choice?: 'auto' | 'none' | 'required' | { type: 'function'; name: string };\n response_format?: Record<string, unknown>;\n user?: string;\n pause_on_tool_calls?: boolean;\n}\n\nexport interface ApproveRejectParams {\n action_id: string;\n tool_results?: Array<{ action_id: string; output: string }>;\n}\n\nexport interface PaginatedResponse<T> {\n data: T[];\n pagination: {\n page: number;\n limit: number;\n total: number;\n total_pages: number;\n };\n}\n\nexport interface SessionListParams {\n page?: number;\n limit?: number;\n status?: 'active' | 'paused' | 'completed' | 'failed';\n agent_id?: string;\n}\n\nexport class SessionsNamespace {\n private config: Required<CencoriConfig>;\n\n constructor(config: Required<CencoriConfig>) {\n this.config = config;\n }\n\n private async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const response = await fetch(`${this.config.baseUrl}${path}`, {\n method,\n headers: {\n 'CENCORI_API_KEY': this.config.apiKey,\n 'Content-Type': 'application/json',\n ...this.config.headers,\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({ error: 'Unknown error' })) as { error?: { message?: string } };\n throw new Error(`Cencori API error: ${errorData.error?.message || response.statusText}`);\n }\n\n if (response.status === 204) return undefined as T;\n return response.json() as Promise<T>;\n }\n\n async create(params?: CreateSessionParams): Promise<Session> {\n return this.request<Session>('POST', '/v1/sessions', params || {});\n }\n\n async list(params?: SessionListParams): Promise<PaginatedResponse<Session>> {\n const searchParams = new URLSearchParams();\n if (params?.page) searchParams.set('page', String(params.page));\n if (params?.limit) searchParams.set('limit', String(params.limit));\n if (params?.status) searchParams.set('status', params.status);\n if (params?.agent_id) searchParams.set('agent_id', params.agent_id);\n const qs = searchParams.toString();\n return this.request<PaginatedResponse<Session>>('GET', `/v1/sessions${qs ? `?${qs}` : ''}`);\n }\n\n async get(sessionId: string): Promise<Session> {\n return this.request<Session>('GET', `/v1/sessions/${sessionId}`);\n }\n\n async delete(sessionId: string): Promise<{ id: string; deleted: boolean }> {\n return this.request<{ id: string; deleted: boolean }>('DELETE', `/v1/sessions/${sessionId}`);\n }\n\n async submitTurn(sessionId: string, params: TurnParams): Promise<Response> {\n const url = `${this.config.baseUrl}/v1/sessions/${sessionId}/turns`;\n return fetch(url, {\n method: 'POST',\n headers: {\n 'CENCORI_API_KEY': this.config.apiKey,\n 'Content-Type': 'application/json',\n ...this.config.headers,\n },\n body: JSON.stringify(params),\n });\n }\n\n async submitTurnStream(sessionId: string, params: TurnParams): Promise<ReadableStream<Uint8Array> | null> {\n const response = await this.submitTurn(sessionId, params);\n if (!response.ok) {\n const err = await response.json().catch(() => ({ error: 'Unknown error' }));\n throw new Error(`Cencori API error: ${err.error?.message || response.statusText}`);\n }\n return response.body;\n }\n\n async getEvents(\n sessionId: string,\n params?: { page?: number; limit?: number; turn_number?: number },\n ): Promise<PaginatedResponse<SessionEvent>> {\n const searchParams = new URLSearchParams();\n if (params?.page) searchParams.set('page', String(params.page));\n if (params?.limit) searchParams.set('limit', String(params.limit));\n if (params?.turn_number) searchParams.set('turn_number', String(params.turn_number));\n const qs = searchParams.toString();\n return this.request<PaginatedResponse<SessionEvent>>('GET', `/v1/sessions/${sessionId}/events${qs ? `?${qs}` : ''}`);\n }\n\n async approve(sessionId: string, params: ApproveRejectParams): Promise<Response> {\n const url = `${this.config.baseUrl}/v1/sessions/${sessionId}/approve`;\n return fetch(url, {\n method: 'POST',\n headers: {\n 'CENCORI_API_KEY': this.config.apiKey,\n 'Content-Type': 'application/json',\n ...this.config.headers,\n },\n body: JSON.stringify(params),\n });\n }\n\n async approveStream(sessionId: string, params: ApproveRejectParams): Promise<ReadableStream<Uint8Array> | null> {\n const response = await this.approve(sessionId, params);\n if (!response.ok) {\n const err = await response.json().catch(() => ({ error: 'Unknown error' }));\n throw new Error(`Cencori API error: ${err.error?.message || response.statusText}`);\n }\n return response.body;\n }\n\n async reject(sessionId: string, params: ApproveRejectParams): Promise<{ id: string; action_id: string; resolution: string; status: string }> {\n return this.request('POST', `/v1/sessions/${sessionId}/reject`, params);\n }\n}\n","/**\n * Compute Namespace - Serverless Functions & GPU Access\n * \n * 🚧 Coming Soon\n * \n * @example\n * const result = await cencori.compute.run('my-function', { \n * input: { data: 'hello' } \n * });\n */\n\nimport type { ComputeRunOptions } from '../types';\n\nexport class ComputeNamespace {\n /**\n * Run a serverless function\n * \n * 🚧 Coming Soon - This feature is not yet available.\n */\n async run(functionId: string, options?: ComputeRunOptions): Promise<never> {\n throw new Error(\n `cencori.compute.run() is coming soon! ` +\n `Function \"${functionId}\" cannot be executed yet. ` +\n `Join our waitlist at https://cencori.com/compute`\n );\n }\n\n /**\n * Deploy a function\n * \n * 🚧 Coming Soon - This feature is not yet available.\n */\n async deploy(config: { name: string; code: string }): Promise<never> {\n throw new Error(\n `cencori.compute.deploy() is coming soon! ` +\n `Join our waitlist at https://cencori.com/compute`\n );\n }\n\n /**\n * List deployed functions\n * \n * 🚧 Coming Soon - This feature is not yet available.\n */\n async list(): Promise<never> {\n throw new Error(\n `cencori.compute.list() is coming soon! ` +\n `Join our waitlist at https://cencori.com/compute`\n );\n }\n}\n","/**\n * Workflow Namespace - AI Pipelines & Orchestration\n * \n * 🚧 Coming Soon\n * \n * @example\n * await cencori.workflow.trigger('data-enrichment', { \n * data: { userId: '123' } \n * });\n */\n\nimport type { WorkflowTriggerOptions } from '../types';\n\nexport class WorkflowNamespace {\n /**\n * Trigger a workflow\n * \n * 🚧 Coming Soon - This feature is not yet available.\n */\n async trigger(workflowId: string, options?: WorkflowTriggerOptions): Promise<never> {\n throw new Error(\n `cencori.workflow.trigger() is coming soon! ` +\n `Workflow \"${workflowId}\" cannot be triggered yet. ` +\n `Join our waitlist at https://cencori.com/workflow`\n );\n }\n\n /**\n * Create a new workflow\n * \n * 🚧 Coming Soon - This feature is not yet available.\n */\n async create(config: { name: string; steps: unknown[] }): Promise<never> {\n throw new Error(\n `cencori.workflow.create() is coming soon! ` +\n `Join our waitlist at https://cencori.com/workflow`\n );\n }\n\n /**\n * Get workflow run status\n * \n * 🚧 Coming Soon - This feature is not yet available.\n */\n async status(runId: string): Promise<never> {\n throw new Error(\n `cencori.workflow.status() is coming soon! ` +\n `Join our waitlist at https://cencori.com/workflow`\n );\n }\n\n /**\n * List workflows\n * \n * 🚧 Coming Soon - This feature is not yet available.\n */\n async list(): Promise<never> {\n throw new Error(\n `cencori.workflow.list() is coming soon! ` +\n `Join our waitlist at https://cencori.com/workflow`\n );\n }\n}\n","/**\n * Storage Namespace - Vector Database, Knowledge Base, RAG\n * \n * 🚧 Coming Soon\n * \n * @example\n * const results = await cencori.storage.vectors.search('query', { limit: 5 });\n */\n\nimport type { VectorSearchOptions } from '../types';\n\nclass VectorsNamespace {\n /**\n * Search vectors by query\n * \n * 🚧 Coming Soon - This feature is not yet available.\n */\n async search(query: string, options?: VectorSearchOptions): Promise<never> {\n throw new Error(\n `cencori.storage.vectors.search() is coming soon! ` +\n `Join our waitlist at https://cencori.com/memory`\n );\n }\n\n /**\n * Upsert vectors\n * \n * 🚧 Coming Soon - This feature is not yet available.\n */\n async upsert(vectors: { id: string; values: number[]; metadata?: Record<string, unknown> }[]): Promise<never> {\n throw new Error(\n `cencori.storage.vectors.upsert() is coming soon! ` +\n `Join our waitlist at https://cencori.com/memory`\n );\n }\n\n /**\n * Delete vectors by ID\n * \n * 🚧 Coming Soon - This feature is not yet available.\n */\n async delete(ids: string[]): Promise<never> {\n throw new Error(\n `cencori.storage.vectors.delete() is coming soon! ` +\n `Join our waitlist at https://cencori.com/memory`\n );\n }\n}\n\nclass KnowledgeNamespace {\n /**\n * Query the knowledge base\n * \n * 🚧 Coming Soon - This feature is not yet available.\n */\n async query(question: string): Promise<never> {\n throw new Error(\n `cencori.storage.knowledge.query() is coming soon! ` +\n `Join our waitlist at https://cencori.com/memory`\n );\n }\n\n /**\n * Add documents to knowledge base\n * \n * 🚧 Coming Soon - This feature is not yet available.\n */\n async add(documents: { content: string; metadata?: Record<string, unknown> }[]): Promise<never> {\n throw new Error(\n `cencori.storage.knowledge.add() is coming soon! ` +\n `Join our waitlist at https://cencori.com/memory`\n );\n }\n}\n\nclass FilesNamespace {\n /**\n * Upload a file\n * \n * 🚧 Coming Soon - This feature is not yet available.\n */\n async upload(file: Blob | Buffer, name: string): Promise<never> {\n throw new Error(\n `cencori.storage.files.upload() is coming soon! ` +\n `Join our waitlist at https://cencori.com/memory`\n );\n }\n\n /**\n * Process a file (extract text, OCR, etc.)\n * \n * 🚧 Coming Soon - This feature is not yet available.\n */\n async process(fileId: string): Promise<never> {\n throw new Error(\n `cencori.storage.files.process() is coming soon! ` +\n `Join our waitlist at https://cencori.com/memory`\n );\n }\n}\n\nexport class StorageNamespace {\n /**\n * Vector database operations\n */\n readonly vectors = new VectorsNamespace();\n\n /**\n * Knowledge base operations (RAG)\n */\n readonly knowledge = new KnowledgeNamespace();\n\n /**\n * File storage and processing\n */\n readonly files = new FilesNamespace();\n}\n","/**\n * Cencori Memory SDK\n * \n * Vector storage for RAG, conversation history, and semantic search.\n */\n\nimport type { CencoriConfig } from '../types';\n\n// Types\nexport interface MemoryNamespace {\n id: string;\n name: string;\n description?: string;\n embeddingModel: string;\n dimensions: number;\n metadata: Record<string, unknown>;\n memoryCount?: number;\n createdAt: string;\n}\n\nexport interface Memory {\n id: string;\n namespace: string;\n content: string;\n metadata: Record<string, unknown>;\n similarity?: number;\n expiresAt?: string;\n createdAt: string;\n updatedAt?: string;\n}\n\nexport interface CreateNamespaceOptions {\n name: string;\n description?: string;\n embeddingModel?: string;\n dimensions?: number;\n metadata?: Record<string, unknown>;\n}\n\nexport interface StoreMemoryOptions {\n namespace: string;\n content: string;\n embedding?: number[];\n metadata?: Record<string, unknown>;\n expiresAt?: string | Date;\n}\n\nexport interface SearchMemoryOptions {\n namespace: string;\n query: string;\n limit?: number;\n threshold?: number;\n filter?: Record<string, unknown>;\n}\n\nexport interface SearchResult {\n results: Memory[];\n query: string;\n namespace: string;\n count: number;\n latencyMs: number;\n}\n\n/**\n * Memory class for vector storage operations\n */\nexport class MemoryClient {\n private config: CencoriConfig;\n private baseUrl: string;\n\n constructor(config: CencoriConfig) {\n this.config = config;\n this.baseUrl = config.baseUrl || 'https://cencori.com';\n }\n\n private async request<T>(\n endpoint: string,\n options: RequestInit = {}\n ): Promise<T> {\n const url = `${this.baseUrl}${endpoint}`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...(options.headers as Record<string, string> || {}),\n };\n\n if (this.config.apiKey) {\n headers['CENCORI_API_KEY'] = this.config.apiKey;\n }\n\n const response = await fetch(url, {\n ...options,\n headers,\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throw new Error(error.message || `Request failed: ${response.status}`);\n }\n\n return response.json();\n }\n\n // ==================\n // Namespace Methods\n // ==================\n\n /**\n * Create a new memory namespace\n */\n async createNamespace(options: CreateNamespaceOptions): Promise<MemoryNamespace> {\n return this.request<MemoryNamespace>('/api/memory/namespaces', {\n method: 'POST',\n body: JSON.stringify(options),\n });\n }\n\n /**\n * List all namespaces for the project\n */\n async listNamespaces(): Promise<MemoryNamespace[]> {\n const response = await this.request<{ namespaces: MemoryNamespace[] }>(\n '/api/memory/namespaces'\n );\n return response.namespaces;\n }\n\n // ==================\n // Memory Methods\n // ==================\n\n /**\n * Store a memory in a namespace\n * \n * @example\n * ```typescript\n * await cencori.memory.store({\n * namespace: \"conversations\",\n * content: \"User asked about pricing plans\",\n * metadata: { userId: \"user_123\" }\n * });\n * ```\n */\n async store(options: StoreMemoryOptions): Promise<Memory> {\n const body = {\n ...options,\n expiresAt: options.expiresAt instanceof Date\n ? options.expiresAt.toISOString()\n : options.expiresAt,\n };\n\n return this.request<Memory>('/api/memory/store', {\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n\n /**\n * Semantic search across memories\n * \n * @example\n * ```typescript\n * const results = await cencori.memory.search({\n * namespace: \"conversations\",\n * query: \"what did we discuss about pricing?\",\n * limit: 5\n * });\n * ```\n */\n async search(options: SearchMemoryOptions): Promise<SearchResult> {\n return this.request<SearchResult>('/api/memory/search', {\n method: 'POST',\n body: JSON.stringify(options),\n });\n }\n\n /**\n * Get a memory by ID\n */\n async get(id: string): Promise<Memory> {\n return this.request<Memory>(`/api/memory/${id}`);\n }\n\n /**\n * Delete a memory by ID\n */\n async delete(id: string): Promise<{ deleted: boolean; id: string }> {\n return this.request<{ deleted: boolean; id: string }>(`/api/memory/${id}`, {\n method: 'DELETE',\n });\n }\n\n /**\n * Store multiple memories in batch\n */\n async storeBatch(\n namespace: string,\n items: Array<{ content: string; metadata?: Record<string, unknown> }>\n ): Promise<Memory[]> {\n const results = await Promise.all(\n items.map(item => this.store({ namespace, ...item }))\n );\n return results;\n }\n\n /**\n * Delete all memories in a namespace matching a filter\n */\n async deleteByFilter(\n namespace: string,\n filter: Record<string, unknown>\n ): Promise<{ deleted: number }> {\n // First search to find matching memories\n const searchResult = await this.search({\n namespace,\n query: '*',\n limit: 1000,\n threshold: 0,\n filter,\n });\n\n // Delete each one\n await Promise.all(searchResult.results.map(r => this.delete(r.id)));\n\n return { deleted: searchResult.results.length };\n }\n}\n\nexport function createMemoryClient(config: CencoriConfig): MemoryClient {\n return new MemoryClient(config);\n}\n","/**\n * Cencori Telemetry Client\n *\n * Report web traffic from your application to the Cencori dashboard.\n * Logs appear under the project's \"Web Gateway\" tab with your app's\n * real domain as the host.\n *\n * @example\n * const cencori = new Cencori({ apiKey: 'csk_...' });\n *\n * // In your server middleware / API route handler:\n * await cencori.telemetry.reportWebRequest({\n * host: 'dochat-zeta.vercel.app',\n * method: 'GET',\n * path: '/api/chat',\n * statusCode: 200,\n * });\n */\n\nimport type { CencoriConfig } from '../types';\n\nexport interface WebTelemetryPayload {\n /** The hostname of your application, e.g. \"dochat-zeta.vercel.app\" */\n host: string;\n /** HTTP method: GET, POST, PUT, DELETE, etc. */\n method: string;\n /** Request path, e.g. \"/api/chat\" */\n path: string;\n /** HTTP status code returned */\n statusCode: number;\n\n /** Optional unique request ID for tracing */\n requestId?: string;\n /** Query string without the leading \"?\" */\n queryString?: string;\n /** Human-readable log message */\n message?: string;\n /** Client User-Agent string */\n userAgent?: string;\n /** Referer header value */\n referer?: string;\n /** Client IP address */\n ipAddress?: string;\n /** ISO 3166-1 alpha-2 country code */\n countryCode?: string;\n /** Request latency in milliseconds */\n latencyMs?: number;\n}\n\nexport class TelemetryClient {\n private config: Required<CencoriConfig>;\n\n constructor(config: Required<CencoriConfig>) {\n this.config = config;\n }\n\n /**\n * Report a web request to the Cencori dashboard.\n *\n * Fire-and-forget — this method never throws and never blocks\n * your application. If the request fails, the error is silently\n * swallowed so it cannot disrupt your app's critical path.\n *\n * @param payload - Web request details to log\n *\n * @example\n * await cencori.telemetry.reportWebRequest({\n * host: req.headers.get('host') || 'unknown',\n * method: req.method,\n * path: new URL(req.url).pathname,\n * statusCode: response.status,\n * userAgent: req.headers.get('user-agent') || undefined,\n * latencyMs: Date.now() - startTime,\n * });\n */\n async reportWebRequest(payload: WebTelemetryPayload): Promise<void> {\n try {\n const url = `${this.config.baseUrl}/api/v1/telemetry/web`;\n\n await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'CENCORI_API_KEY': this.config.apiKey,\n },\n body: JSON.stringify(payload),\n });\n } catch {\n // Telemetry is best-effort — never disrupt the customer's app.\n }\n }\n}\n","/**\n * Utility functions for Cencori SDK\n */\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n/**\n * Fetch with automatic retry on 5xx errors\n * Uses exponential backoff: 1s, 2s, 4s\n */\nexport async function fetchWithRetry(\n url: string,\n options: RequestInit,\n maxRetries = 3\n): Promise<Response> {\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n try {\n const response = await fetch(url, options);\n\n // Return immediately if request succeeded or if it's a client error (4xx)\n if (response.ok || (response.status >= 400 && response.status < 500)) {\n return response;\n }\n\n // Retry on 5xx errors\n lastError = new Error(`HTTP ${response.status}: ${response.statusText}`);\n\n // Don't retry on last attempt\n if (attempt === maxRetries - 1) {\n return response;\n }\n\n // Exponential backoff: 1s, 2s, 4s\n await sleep(Math.pow(2, attempt) * 1000);\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n // Don't retry on last attempt\n if (attempt === maxRetries - 1) {\n throw lastError;\n }\n\n // Exponential backoff\n await sleep(Math.pow(2, attempt) * 1000);\n }\n }\n\n throw lastError || new Error('Max retries reached');\n}\n","/**\n * Cencori Error Classes\n * \n * Custom error types for better error handling\n */\n\nexport class CencoriError extends Error {\n constructor(\n message: string,\n public statusCode?: number,\n public code?: string\n ) {\n super(message);\n this.name = 'CencoriError';\n Object.setPrototypeOf(this, CencoriError.prototype);\n }\n}\n\nexport class AuthenticationError extends CencoriError {\n constructor(message = 'Invalid API key') {\n super(message, 401, 'INVALID_API_KEY');\n this.name = 'AuthenticationError';\n Object.setPrototypeOf(this, AuthenticationError.prototype);\n }\n}\n\nexport class RateLimitError extends CencoriError {\n constructor(message = 'Rate limit exceeded') {\n super(message, 429, 'RATE_LIMIT_EXCEEDED');\n this.name = 'RateLimitError';\n Object.setPrototypeOf(this, RateLimitError.prototype);\n }\n}\n\nexport class SafetyError extends CencoriError {\n constructor(message = 'Content safety violation', public reasons?: string[]) {\n super(message, 400, 'SAFETY_VIOLATION');\n this.name = 'SafetyError';\n Object.setPrototypeOf(this, SafetyError.prototype);\n }\n}\n","/**\n * Cencori - Unified AI Infrastructure SDK\n * \n * One SDK for AI Gateway, Compute, Workflow, and Storage.\n * Every operation is secured, logged, and tracked.\n * \n * @example\n * import { Cencori } from 'cencori';\n * \n * const cencori = new Cencori({ apiKey: 'csk_...' });\n * \n * // AI Gateway\n * const response = await cencori.ai.chat({\n * model: 'gpt-4o',\n * messages: [{ role: 'user', content: 'Hello!' }]\n * });\n * \n * // Compute (coming soon)\n * await cencori.compute.run('my-function', { input: data });\n * \n * // Workflow (coming soon)\n * await cencori.workflow.trigger('pipeline-id', { data });\n * \n * // Storage (coming soon)\n * await cencori.storage.vectors.search('query');\n */\n\nimport type { CencoriConfig, RequestOptions } from './types';\nimport { AINamespace } from './ai';\nimport { AgentsNamespace } from './agents';\nimport { VisionNamespace } from './vision';\nimport { DocumentsNamespace } from './documents';\nimport { SessionsNamespace } from './sessions';\nimport { ComputeNamespace } from './compute';\nimport { WorkflowNamespace } from './workflow';\nimport { StorageNamespace } from './storage';\nimport { MemoryClient } from './memory';\nimport { TelemetryClient } from './telemetry';\nimport { fetchWithRetry } from './utils';\nimport {\n CencoriError,\n AuthenticationError,\n RateLimitError,\n SafetyError\n} from './errors';\n\nconst DEFAULT_BASE_URL = 'https://api.cencori.com';\n\ninterface ErrorResponse {\n error?: string;\n reasons?: string[];\n}\n\nexport class Cencori {\n private config: Required<CencoriConfig>;\n\n /**\n * AI Gateway - Chat, completions, embeddings, responses with security & observability\n * \n * @example\n * await cencori.ai.chat({ model: 'gpt-4o', messages: [...] });\n */\n readonly ai: AINamespace;\n\n /**\n * Vision - Analyze, describe, OCR, and classify images\n *\n * @example\n * const result = await cencori.vision.analyze({\n * image: { url: 'https://example.com/photo.jpg' },\n * prompt: 'What breed is this dog?'\n * });\n *\n * @example\n * const { text } = await cencori.vision.ocr({\n * image: { base64, mimeType: 'image/png' }\n * });\n */\n readonly vision: VisionNamespace;\n\n /**\n * Documents - Extract text from PDFs and images, summarize, and query\n *\n * @example\n * const { text } = await cencori.documents.extract({\n * document: { url: 'https://example.com/contract.pdf' }\n * });\n *\n * @example\n * const { summary } = await cencori.documents.summarize({\n * document: { url: 'https://example.com/report.pdf' }\n * });\n *\n * @example\n * const { answer } = await cencori.documents.query({\n * document: { url },\n * question: 'What is the total revenue for Q3?',\n * });\n */\n readonly documents: DocumentsNamespace;\n\n /**\n * Agents - Create and manage AI agents programmatically.\n * \n * @example\n * const agent = await cencori.agents.create({\n * name: 'my-agent',\n * config: { model: 'gpt-4o', system_prompt: 'You are a helpful assistant.' }\n * });\n * \n * @example\n * const key = await cencori.agents.createKey(agent.id, { name: 'prod-key' });\n */\n readonly agents: AgentsNamespace;\n\n /**\n * Compute - Serverless functions & GPU access\n * \n * 🚧 Coming Soon\n * \n * @example\n * await cencori.compute.run('my-function', { input: data });\n */\n readonly compute: ComputeNamespace;\n\n /**\n * Workflow - AI pipelines & orchestration\n * \n * 🚧 Coming Soon\n * \n * @example\n * await cencori.workflow.trigger('pipeline-id', { data });\n */\n readonly workflow: WorkflowNamespace;\n\n /**\n * Storage - Vector database, knowledge base, RAG\n * \n * 🚧 Coming Soon\n * \n * @example\n * await cencori.storage.vectors.search('query');\n */\n readonly storage: StorageNamespace;\n\n /**\n * Memory - Vector storage for RAG, conversation history, semantic search\n * \n * @example\n * await cencori.memory.store({ namespace: 'conversations', content: '...' });\n * await cencori.memory.search({ namespace: 'conversations', query: '...' });\n */\n readonly memory: MemoryClient;\n\n /**\n * Sessions - Durable execution sessions for AI agents with pause/resume and event sourcing\n * \n * @example\n * const sessions = await cencori.sessions.list({ status: 'active' });\n * const session = await cencori.sessions.create({ agent_id: 'ag_...' });\n * await cencori.sessions.submitTurn(session.id, { input: 'Hello' });\n */\n readonly sessions: SessionsNamespace;\n\n /**\n * Telemetry - Report web traffic from your app to the Cencori dashboard\n * \n * @example\n * await cencori.telemetry.reportWebRequest({\n * host: 'dochat-zeta.vercel.app',\n * method: 'GET',\n * path: '/api/chat',\n * statusCode: 200,\n * });\n */\n readonly telemetry: TelemetryClient;\n\n /**\n * Create a new Cencori client\n * \n * @param config - Configuration options\n * @param config.apiKey - Your Cencori API key (starts with 'csk_')\n * @param config.baseUrl - Custom API base URL (default: https://cencori.com)\n * @param config.headers - Custom headers to include in requests\n * \n * @example\n * const cencori = new Cencori({ \n * apiKey: process.env.CENCORI_API_KEY \n * });\n */\n constructor(config: CencoriConfig = {}) {\n const apiKey = config.apiKey ?? process.env.CENCORI_API_KEY;\n\n if (!apiKey) {\n throw new Error(\n 'Cencori API key is required. ' +\n 'Pass it via new Cencori({ apiKey: \"csk_...\" }) or set CENCORI_API_KEY environment variable.'\n );\n }\n\n this.config = {\n apiKey,\n baseUrl: config.baseUrl ?? DEFAULT_BASE_URL,\n headers: config.headers ?? {},\n };\n\n // Initialize namespaces\n this.ai = new AINamespace(this.config);\n this.vision = new VisionNamespace(this.config);\n this.documents = new DocumentsNamespace(this.config);\n this.agents = new AgentsNamespace(this.config);\n this.compute = new ComputeNamespace();\n this.workflow = new WorkflowNamespace();\n this.storage = new StorageNamespace();\n this.memory = new MemoryClient(this.config);\n this.sessions = new SessionsNamespace(this.config);\n this.telemetry = new TelemetryClient(this.config);\n }\n\n /**\n * Get the base URL for API calls\n */\n getBaseUrl(): string {\n return this.config.baseUrl;\n }\n\n /**\n * Get the API key\n */\n getApiKey(): string {\n return this.config.apiKey;\n }\n\n /**\n * Get the current configuration (API key is masked)\n */\n getConfig(): { baseUrl: string; apiKeyHint: string } {\n return {\n baseUrl: this.config.baseUrl,\n apiKeyHint: `${this.config.apiKey.slice(0, 6)}...${this.config.apiKey.slice(-4)}`,\n };\n }\n\n /**\n * Make a generic API request with retry and error handling\n * \n * @example\n * const data = await cencori.request('/api/custom-endpoint', {\n * method: 'POST',\n * body: JSON.stringify({ foo: 'bar' })\n * });\n */\n async request<T>(endpoint: string, options: RequestOptions): Promise<T> {\n const url = `${this.config.baseUrl}${endpoint}`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'CENCORI_API_KEY': this.config.apiKey,\n ...this.config.headers,\n ...options.headers\n };\n\n try {\n const response = await fetchWithRetry(url, {\n method: options.method,\n headers,\n body: options.body\n });\n\n const data: unknown = await response.json();\n\n // Handle API errors\n if (!response.ok) {\n const errorData = data as ErrorResponse;\n\n if (response.status === 401) {\n throw new AuthenticationError(errorData.error || 'Invalid API key');\n }\n if (response.status === 429) {\n throw new RateLimitError(errorData.error || 'Rate limit exceeded');\n }\n if (response.status === 400 && errorData.reasons) {\n throw new SafetyError(errorData.error, errorData.reasons);\n }\n throw new CencoriError(\n errorData.error || 'Request failed',\n response.status\n );\n }\n\n return data as T;\n } catch (error) {\n // Re-throw custom errors\n if (error instanceof CencoriError) {\n throw error;\n }\n\n // Wrap unknown errors\n throw new CencoriError(\n error instanceof Error ? error.message : 'Unknown error occurred'\n );\n }\n }\n}\n\n// Export types\nexport type { CencoriConfig, ChatRequest, ChatResponse, ChatMessage, RequestOptions } from './types';\nexport type { AINamespace } from './ai';\nexport type { AgentsNamespace, Agent, AgentConfig, AgentListItem, CreateAgentParams, UpdateAgentParams, AgentKey, CreateAgentKeyParams } from './agents';\nexport type { ComputeNamespace } from './compute';\nexport type { WorkflowNamespace } from './workflow';\nexport type { StorageNamespace } from './storage';\nexport type { MemoryClient } from './memory';\nexport type { SessionsNamespace, Session, SessionEvent, CreateSessionParams, TurnParams, PaginatedResponse, SessionListParams } from './sessions';\nexport type { TelemetryClient, WebTelemetryPayload } from './telemetry';\n\n","/**\n * Cencori Chat Language Model\n * \n * Implements the Vercel AI SDK's LanguageModelV3 interface (AI SDK v6 compatible)\n */\n\nimport type {\n LanguageModelV3,\n LanguageModelV3CallOptions,\n LanguageModelV3GenerateResult,\n LanguageModelV3StreamResult,\n LanguageModelV3StreamPart,\n LanguageModelV3Content,\n LanguageModelV3Usage,\n LanguageModelV3FinishReason,\n SharedV3Warning,\n} from '@ai-sdk/provider';\n\nexport interface CencoriChatModelSettings {\n apiKey: string;\n baseUrl: string;\n headers?: Record<string, string>;\n userId?: string;\n}\n\ninterface CencoriMessage {\n role: 'system' | 'user' | 'assistant' | 'tool';\n content: string;\n toolCallId?: string;\n}\n\n/**\n * Tool definition in Cencori format (OpenAI-compatible)\n */\ninterface CencoriTool {\n type: 'function';\n function: {\n name: string;\n description: string;\n parameters: Record<string, any>;\n };\n}\n\n/**\n * Tool call from the model\n */\ninterface CencoriToolCall {\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n}\n\ninterface CencoriResponse {\n content: string;\n model: string;\n provider: string;\n usage: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n };\n cost_usd: number;\n finish_reason?: string;\n tool_calls?: CencoriToolCall[];\n}\n\ninterface CencoriStreamChunk {\n delta: string;\n finish_reason?: string;\n tool_calls?: CencoriToolCall[];\n}\n\nexport class CencoriChatLanguageModel implements LanguageModelV3 {\n readonly specificationVersion = 'v3' as const;\n readonly provider = 'cencori';\n\n readonly modelId: string;\n readonly supportedUrls: Record<string, RegExp[]> = {};\n private readonly settings: CencoriChatModelSettings;\n\n constructor(modelId: string, settings: CencoriChatModelSettings) {\n this.modelId = modelId;\n this.settings = settings;\n }\n\n private getHeaders(): Record<string, string> {\n return {\n 'Content-Type': 'application/json',\n 'CENCORI_API_KEY': this.settings.apiKey,\n ...this.settings.headers,\n };\n }\n\n private convertMessages(options: LanguageModelV3CallOptions): CencoriMessage[] {\n const messages: CencoriMessage[] = [];\n\n // In V3, options.prompt is directly an array of LanguageModelV3Message\n const promptMessages = options.prompt;\n\n if (!promptMessages || !Array.isArray(promptMessages)) {\n return messages;\n }\n\n for (const msg of promptMessages) {\n let content = '';\n\n if (msg.role === 'system') {\n // System messages have content as string directly\n content = msg.content as string;\n } else if (msg.role === 'user' || msg.role === 'assistant') {\n // User and assistant messages have content as array of parts\n const msgContent = msg.content;\n if (Array.isArray(msgContent)) {\n content = msgContent\n .filter((part: { type: string }) => part.type === 'text')\n .map((part: { type: string; text?: string }) => part.text || '')\n .join('');\n } else if (typeof msgContent === 'string') {\n content = msgContent;\n }\n }\n\n if (content && (msg.role === 'system' || msg.role === 'user' || msg.role === 'assistant')) {\n messages.push({\n role: msg.role as 'system' | 'user' | 'assistant',\n content,\n });\n }\n }\n\n return messages;\n }\n\n private mapFinishReason(reason?: string): LanguageModelV3FinishReason {\n let unified: 'stop' | 'length' | 'content-filter' | 'tool-calls' | 'error' | 'other';\n\n switch (reason) {\n case 'stop':\n case 'end_turn':\n unified = 'stop';\n break;\n case 'length':\n case 'max_tokens':\n unified = 'length';\n break;\n case 'content_filter':\n unified = 'content-filter';\n break;\n case 'tool_calls':\n case 'tool-calls':\n unified = 'tool-calls';\n break;\n case 'error':\n unified = 'error';\n break;\n default:\n unified = 'stop';\n }\n\n return { unified, raw: reason };\n }\n\n private buildUsage(inputTokens: number, outputTokens: number): LanguageModelV3Usage {\n return {\n inputTokens: {\n total: inputTokens,\n noCache: inputTokens,\n cacheRead: undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: outputTokens,\n text: outputTokens,\n reasoning: undefined,\n },\n };\n }\n\n /**\n * Convert Vercel AI SDK tools to Cencori format\n */\n private convertTools(options: LanguageModelV3CallOptions): CencoriTool[] | undefined {\n if (!options.tools || options.tools.length === 0) {\n return undefined;\n }\n\n return options.tools\n .filter(t => t.type === 'function')\n .map(t => ({\n type: 'function' as const,\n function: {\n name: t.name,\n description: t.description || '',\n parameters: t.inputSchema as Record<string, any>,\n },\n }));\n }\n\n /**\n * Convert Vercel AI SDK tool choice to Cencori format\n */\n private convertToolChoice(options: LanguageModelV3CallOptions): string | { type: 'function'; function: { name: string } } | undefined {\n const tc = options.toolChoice;\n if (!tc) return undefined;\n\n switch (tc.type) {\n case 'auto':\n return 'auto';\n case 'none':\n return 'none';\n case 'required':\n return 'required';\n case 'tool':\n return { type: 'function', function: { name: tc.toolName } };\n default:\n return undefined;\n }\n }\n\n async doGenerate(options: LanguageModelV3CallOptions): Promise<LanguageModelV3GenerateResult> {\n const messages = this.convertMessages(options);\n const tools = this.convertTools(options);\n const toolChoice = this.convertToolChoice(options);\n\n const response = await fetch(`${this.settings.baseUrl}/api/ai/chat`, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify({\n messages,\n model: this.modelId,\n temperature: options.temperature,\n maxTokens: options.maxOutputTokens,\n stream: false,\n userId: this.settings.userId,\n tools,\n toolChoice,\n }),\n signal: options.abortSignal,\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: 'Unknown error' })) as { error?: string };\n throw new Error(`Cencori API error: ${error.error || response.statusText}`);\n }\n\n const data = await response.json() as CencoriResponse;\n\n // Build content array\n const content: LanguageModelV3Content[] = [];\n\n // Add text content if present\n if (data.content) {\n content.push({\n type: 'text',\n text: data.content,\n providerMetadata: undefined,\n });\n }\n\n // Add tool calls if present\n if (data.tool_calls && data.tool_calls.length > 0) {\n for (const tc of data.tool_calls) {\n content.push({\n type: 'tool-call',\n toolCallId: tc.id,\n toolName: tc.function.name,\n input: tc.function.arguments,\n providerMetadata: undefined,\n });\n }\n }\n\n const warnings: SharedV3Warning[] = [];\n\n return {\n content,\n finishReason: this.mapFinishReason(data.finish_reason),\n usage: this.buildUsage(data.usage.prompt_tokens, data.usage.completion_tokens),\n warnings,\n };\n }\n\n async doStream(options: LanguageModelV3CallOptions): Promise<LanguageModelV3StreamResult> {\n const messages = this.convertMessages(options);\n const tools = this.convertTools(options);\n const toolChoice = this.convertToolChoice(options);\n const self = this;\n\n const response = await fetch(`${this.settings.baseUrl}/api/ai/chat`, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify({\n messages,\n model: this.modelId,\n temperature: options.temperature,\n maxTokens: options.maxOutputTokens,\n stream: true,\n userId: this.settings.userId,\n tools,\n toolChoice,\n }),\n signal: options.abortSignal,\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: 'Unknown error' })) as { error?: string };\n throw new Error(`Cencori API error: ${error.error || response.statusText}`);\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 const inputTokens = 0;\n let outputTokens = 0;\n const textPartId = 'text-0';\n let started = false;\n\n const stream = new ReadableStream<LanguageModelV3StreamPart>({\n async pull(controller) {\n try {\n const { done, value } = await reader.read();\n\n if (done) {\n // End text block and finish\n if (started) {\n controller.enqueue({\n type: 'text-end',\n id: textPartId,\n });\n }\n controller.enqueue({\n type: 'finish',\n finishReason: self.mapFinishReason('stop'),\n usage: self.buildUsage(inputTokens, outputTokens),\n });\n controller.close();\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 if (started) {\n controller.enqueue({\n type: 'text-end',\n id: textPartId,\n });\n }\n controller.enqueue({\n type: 'finish',\n finishReason: self.mapFinishReason('stop'),\n usage: self.buildUsage(inputTokens, outputTokens),\n });\n controller.close();\n return;\n }\n\n try {\n const chunk = JSON.parse(data) as CencoriStreamChunk;\n\n // Handle text delta\n if (chunk.delta) {\n // Start text if not started\n if (!started) {\n started = true;\n controller.enqueue({\n type: 'text-start',\n id: textPartId,\n });\n }\n\n outputTokens += Math.ceil(chunk.delta.length / 4); // Rough estimate\n controller.enqueue({\n type: 'text-delta',\n id: textPartId,\n delta: chunk.delta,\n });\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 // Emit complete tool-call event\n controller.enqueue({\n type: 'tool-call',\n toolCallId: tc.id,\n toolName: tc.function.name,\n input: tc.function.arguments,\n providerMetadata: undefined,\n });\n }\n }\n\n if (chunk.finish_reason) {\n if (started) {\n controller.enqueue({\n type: 'text-end',\n id: textPartId,\n });\n }\n controller.enqueue({\n type: 'finish',\n finishReason: self.mapFinishReason(chunk.finish_reason),\n usage: self.buildUsage(inputTokens, outputTokens),\n });\n controller.close();\n return;\n }\n } catch {\n // Skip malformed JSON\n }\n }\n } catch (error) {\n controller.error(error);\n }\n },\n cancel() {\n reader.cancel();\n },\n });\n\n return {\n stream,\n };\n }\n}\n","/**\n * Cencori AI Provider for Vercel AI SDK\n * \n * Use Cencori with streamText(), generateText(), and useChat()\n */\n\nimport { CencoriChatLanguageModel } from './cencori-chat-model';\nimport type { CencoriProviderSettings, CencoriChatSettings } from './types';\n\nexport interface CencoriProvider {\n /**\n * Create a Cencori chat model for use with Vercel AI SDK\n * \n * @param modelId - The model ID (e.g., 'gemini-2.5-flash', 'gpt-4o', 'claude-3-opus')\n * @param settings - Optional model-specific settings\n * @returns A LanguageModelV1 compatible model\n * \n * @example\n * import { cencori } from 'cencori';\n * import { streamText } from 'ai';\n * \n * const result = await streamText({\n * model: cencori('gemini-2.5-flash'),\n * messages: [{ role: 'user', content: 'Hello!' }]\n * });\n */\n (modelId: string, settings?: CencoriChatSettings): CencoriChatLanguageModel;\n\n /**\n * Create a chat model (alias for the provider function)\n */\n chat: (modelId: string, settings?: CencoriChatSettings) => CencoriChatLanguageModel;\n}\n\n/**\n * Create a Cencori provider instance\n * \n * @param options - Provider configuration options\n * @returns A Cencori provider\n * \n * @example\n * import { createCencori } from 'cencori';\n * \n * const cencori = createCencori({\n * apiKey: process.env.CENCORI_API_KEY\n * });\n * \n * const result = await streamText({\n * model: cencori('gemini-2.5-flash'),\n * messages: [{ role: 'user', content: 'Hello!' }]\n * });\n */\nexport function createCencori(options: CencoriProviderSettings = {}): CencoriProvider {\n const baseUrl = options.baseUrl ?? 'https://cencori.com';\n const apiKey = options.apiKey ?? process.env.CENCORI_API_KEY;\n\n if (!apiKey) {\n throw new Error('Cencori API key is required. Pass it via options.apiKey or set CENCORI_API_KEY environment variable.');\n }\n\n const createModel = (modelId: string, settings: CencoriChatSettings = {}) => {\n return new CencoriChatLanguageModel(modelId, {\n apiKey,\n baseUrl,\n headers: options.headers,\n ...settings,\n });\n };\n\n const provider = function (modelId: string, settings?: CencoriChatSettings) {\n return createModel(modelId, settings);\n } as CencoriProvider;\n\n provider.chat = createModel;\n\n return provider;\n}\n\n/**\n * Default Cencori provider instance\n * Uses CENCORI_API_KEY environment variable (lazy initialization)\n * \n * @example\n * import { cencori } from 'cencori';\n * import { streamText } from 'ai';\n * \n * const result = await streamText({\n * model: cencori('gemini-2.5-flash'),\n * messages: [{ role: 'user', content: 'Hello!' }]\n * });\n */\nexport const cencori: CencoriProvider = function (modelId: string, settings?: CencoriChatSettings) {\n const apiKey = process.env.CENCORI_API_KEY;\n if (!apiKey) {\n throw new Error('CENCORI_API_KEY environment variable is required. Set it or use createCencori({ apiKey: \"...\" }) instead.');\n }\n return new CencoriChatLanguageModel(modelId, {\n apiKey,\n baseUrl: 'https://cencori.com',\n ...settings,\n });\n} as CencoriProvider;\n\ncencori.chat = cencori;\n"],"mappings":"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","names":["toBody"]}
1
+ {"version":3,"sources":["../src/ai/index.ts","../src/agents/index.ts","../src/vision/index.ts","../src/voice/index.ts","../src/documents/index.ts","../src/sessions/index.ts","../src/compute/index.ts","../src/workflow/index.ts","../src/storage/index.ts","../src/memory/index.ts","../src/chat/index.ts","../src/telemetry/index.ts","../src/utils.ts","../src/errors.ts","../src/cencori.ts","../src/vercel/cencori-chat-model.ts","../src/vercel/cencori-provider.ts"],"sourcesContent":["/**\n * AI Gateway - Chat, Completions, Embeddings, and Streaming\n * \n * @example\n * const response = await cencori.ai.chat({\n * model: 'gpt-4o',\n * messages: [{ role: 'user', content: 'Hello!' }]\n * });\n */\n\nimport type {\n CencoriConfig,\n ChatRequest,\n ChatResponse,\n CompletionRequest,\n EmbeddingRequest,\n EmbeddingResponse,\n GenerateObjectRequest,\n GenerateObjectResponse,\n ImageGenerationRequest,\n ImageGenerationResponse,\n ResponsesRequest,\n ResponsesResponse,\n ToolCall,\n} from '../types';\n\n// API Response types\ninterface OpenAIChatResponse {\n id?: string;\n model?: string;\n content?: string;\n finish_reason?: string;\n toolCalls?: Array<{\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n }>;\n tool_calls?: Array<{\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n }>;\n choices?: Array<{\n message?: {\n content?: string;\n tool_calls?: Array<{\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n }>;\n };\n finish_reason?: string;\n }>;\n usage?: {\n prompt_tokens?: number;\n completion_tokens?: number;\n total_tokens?: number;\n };\n}\n\ninterface OpenAIEmbeddingResponse {\n model: string;\n data?: Array<{\n embedding: number[];\n }>;\n usage?: {\n total_tokens?: number;\n };\n}\n\n/**\n * Stream chunk from chat stream\n */\nexport interface StreamChunk {\n delta: string;\n finish_reason?: 'stop' | 'length' | 'content_filter' | 'tool_calls' | 'error';\n /** Tool calls in progress during streaming */\n toolCalls?: ToolCall[];\n /** Error message if the stream encountered an error */\n error?: string;\n}\n\nexport class AINamespace {\n private config: Required<CencoriConfig>;\n\n constructor(config: Required<CencoriConfig>) {\n this.config = config;\n }\n\n /**\n * Create a chat completion\n * \n * @example\n * const response = await cencori.ai.chat({\n * model: 'gpt-4o',\n * messages: [{ role: 'user', content: 'Hello!' }]\n * });\n */\n async chat(request: ChatRequest): Promise<ChatResponse> {\n const response = await fetch(`${this.config.baseUrl}/api/ai/chat`, {\n method: 'POST',\n headers: {\n 'CENCORI_API_KEY': this.config.apiKey,\n 'Content-Type': 'application/json',\n ...this.config.headers,\n },\n body: JSON.stringify({\n model: request.model,\n messages: request.messages,\n temperature: request.temperature,\n maxTokens: request.maxTokens,\n stream: false,\n tools: request.tools,\n toolChoice: request.toolChoice,\n prompt: request.prompt,\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 data = await response.json() as OpenAIChatResponse;\n\n const choice = data.choices?.[0];\n const rawToolCalls = data.toolCalls ?? data.tool_calls ?? choice?.message?.tool_calls;\n const toolCalls = rawToolCalls?.map(tc => ({\n id: tc.id,\n type: tc.type as 'function',\n function: {\n name: tc.function.name,\n arguments: tc.function.arguments,\n },\n }));\n\n return {\n id: data.id ?? `chatcmpl-${Date.now()}`,\n model: data.model ?? request.model,\n content: data.content ?? choice?.message?.content ?? '',\n toolCalls,\n finishReason: (data.finish_reason ?? choice?.finish_reason) as ChatResponse['finishReason'],\n usage: {\n promptTokens: data.usage?.prompt_tokens ?? 0,\n completionTokens: data.usage?.completion_tokens ?? 0,\n totalTokens: data.usage?.total_tokens ?? 0,\n },\n };\n }\n\n /**\n * Stream chat completions\n * Returns an async generator that yields chunks as they arrive\n * \n * @example\n * for await (const chunk of cencori.ai.chatStream({ model: 'gpt-4o', messages })) {\n * process.stdout.write(chunk.delta);\n * }\n */\n async *chatStream(request: ChatRequest): AsyncGenerator<StreamChunk, void, unknown> {\n const response = await fetch(`${this.config.baseUrl}/api/ai/chat`, {\n method: 'POST',\n headers: {\n 'CENCORI_API_KEY': this.config.apiKey,\n 'Content-Type': 'application/json',\n ...this.config.headers,\n },\n body: JSON.stringify({\n model: request.model,\n messages: request.messages,\n temperature: request.temperature,\n maxTokens: request.maxTokens,\n stream: true,\n tools: request.tools,\n toolChoice: request.toolChoice,\n prompt: request.prompt,\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 if (!response.body) {\n throw new Error('Response body is null');\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n\n // Keep the last incomplete line in the buffer\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); // Remove 'data: ' prefix\n\n if (data === '[DONE]') {\n return;\n }\n\n try {\n const chunk = JSON.parse(data) as StreamChunk;\n yield chunk;\n } catch {\n // Skip malformed JSON\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n /**\n * Create a text completion\n * \n * @example\n * const response = await cencori.ai.completions({\n * model: 'gpt-4o',\n * prompt: 'Write a haiku about coding'\n * });\n */\n async completions(request: CompletionRequest): Promise<ChatResponse> {\n // Convert to chat format internally\n return this.chat({\n model: request.model,\n messages: [{ role: 'user', content: request.prompt }],\n temperature: request.temperature,\n maxTokens: request.maxTokens,\n });\n }\n\n /**\n * Create embeddings\n * \n * @example\n * const response = await cencori.ai.embeddings({\n * model: 'text-embedding-3-small',\n * input: 'Hello world'\n * });\n */\n async embeddings(request: EmbeddingRequest): Promise<EmbeddingResponse> {\n const response = await fetch(`${this.config.baseUrl}/api/ai/embeddings`, {\n method: 'POST',\n headers: {\n 'CENCORI_API_KEY': this.config.apiKey,\n 'Content-Type': 'application/json',\n ...this.config.headers,\n },\n body: JSON.stringify({\n model: request.model,\n input: request.input,\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 data = await response.json() as OpenAIEmbeddingResponse;\n\n return {\n model: data.model,\n embeddings: data.data?.map((d) => d.embedding) ?? [],\n usage: {\n totalTokens: data.usage?.total_tokens ?? 0,\n },\n };\n }\n\n /**\n * Generate structured output with JSON schema\n * \n * @example\n * const response = await cencori.ai.generateObject({\n * model: 'gpt-4o',\n * prompt: 'Generate a user profile',\n * schema: {\n * type: 'object',\n * properties: {\n * name: { type: 'string' },\n * age: { type: 'number' }\n * },\n * required: ['name', 'age']\n * }\n * });\n * console.log(response.object); // { name: 'John', age: 30 }\n */\n async generateObject<T = unknown>(request: GenerateObjectRequest): Promise<GenerateObjectResponse<T>> {\n // Build messages from prompt or use provided messages\n const messages = request.messages ?? [\n { role: 'user' as const, content: request.prompt ?? '' }\n ];\n\n // Use function calling to enforce JSON schema\n const response = await fetch(`${this.config.baseUrl}/api/ai/chat`, {\n method: 'POST',\n headers: {\n 'CENCORI_API_KEY': this.config.apiKey,\n 'Content-Type': 'application/json',\n ...this.config.headers,\n },\n body: JSON.stringify({\n model: request.model,\n messages,\n temperature: request.temperature,\n maxTokens: request.maxTokens,\n stream: false,\n tools: [{\n type: 'function',\n function: {\n name: request.schemaName ?? 'generate_object',\n description: request.schemaDescription ?? 'Generate a structured object matching the schema',\n parameters: request.schema,\n },\n }],\n toolChoice: {\n type: 'function',\n function: { name: request.schemaName ?? 'generate_object' },\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 data = await response.json() as OpenAIChatResponse;\n const toolCall = data.toolCalls?.[0] ?? data.tool_calls?.[0] ?? data.choices?.[0]?.message?.tool_calls?.[0];\n\n if (!toolCall) {\n throw new Error('Model did not return structured output');\n }\n\n let parsedObject: T;\n try {\n parsedObject = JSON.parse(toolCall.function.arguments) as T;\n } catch {\n throw new Error('Failed to parse structured output as JSON');\n }\n\n return {\n object: parsedObject,\n usage: {\n promptTokens: data.usage?.prompt_tokens ?? 0,\n completionTokens: data.usage?.completion_tokens ?? 0,\n totalTokens: data.usage?.total_tokens ?? 0,\n },\n };\n }\n\n /**\n * Generate images from a text prompt\n * \n * @example\n * const response = await cencori.ai.generateImage({\n * prompt: 'A futuristic city at sunset',\n * model: 'dall-e-3',\n * size: '1024x1024'\n * });\n * console.log(response.images[0].url);\n */\n async generateImage(request: ImageGenerationRequest): Promise<ImageGenerationResponse> {\n const response = await fetch(`${this.config.baseUrl}/api/ai/images/generate`, {\n method: 'POST',\n headers: {\n 'CENCORI_API_KEY': this.config.apiKey,\n 'Content-Type': 'application/json',\n ...this.config.headers,\n },\n body: JSON.stringify({\n prompt: request.prompt,\n model: request.model ?? 'dall-e-3',\n n: request.n,\n size: request.size,\n quality: request.quality,\n style: request.style,\n responseFormat: request.responseFormat,\n }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({ error: 'Unknown error' })) as { error?: string; message?: string };\n throw new Error(`Cencori API error: ${errorData.message || errorData.error || response.statusText}`);\n }\n\n const data = await response.json() as {\n images: Array<{ url?: string; b64_json?: string; revisedPrompt?: string }>;\n model: string;\n provider: string;\n };\n\n return {\n images: data.images.map(img => ({\n url: img.url,\n b64Json: img.b64_json,\n revisedPrompt: img.revisedPrompt,\n })),\n model: data.model,\n provider: data.provider,\n };\n }\n\n /**\n * RAG (Retrieval-Augmented Generation) - Chat with automatic memory context\n * \n * Searches your memory namespace for relevant context and includes it\n * in the prompt automatically. Returns the AI response along with sources.\n * \n * @example\n * const response = await cencori.ai.rag({\n * model: 'gpt-4o',\n * messages: [{ role: 'user', content: 'What are our company policies?' }],\n * namespace: 'company-docs',\n * limit: 5, // number of memories to retrieve\n * });\n * console.log(response.message.content);\n * console.log(response.sources); // retrieved context\n */\n async rag(request: RagRequest): Promise<RagResponse> {\n const response = await fetch(`${this.config.baseUrl}/api/ai/rag`, {\n method: 'POST',\n headers: {\n 'CENCORI_API_KEY': this.config.apiKey,\n 'Content-Type': 'application/json',\n ...this.config.headers,\n },\n body: JSON.stringify({\n model: request.model,\n messages: request.messages,\n namespace: request.namespace,\n temperature: request.temperature,\n maxTokens: request.maxTokens,\n limit: request.limit ?? 5,\n threshold: request.threshold ?? 0.5,\n include_sources: request.includeSources ?? true,\n stream: false,\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 data = await response.json() as RagApiResponse;\n\n return {\n message: {\n role: 'assistant',\n content: data.message.content,\n },\n model: data.model,\n provider: data.provider,\n usage: {\n promptTokens: data.usage.prompt_tokens,\n completionTokens: data.usage.completion_tokens,\n totalTokens: data.usage.total_tokens,\n },\n sources: data.sources?.map(s => ({\n content: s.content,\n metadata: s.metadata,\n similarity: s.similarity,\n })),\n latencyMs: data.latency_ms,\n };\n }\n\n /**\n * Send a request to the OpenAI-compatible Responses API.\n * Supports built-in tools: web_search_preview, file_search, code_interpreter.\n *\n * @example\n * const response = await cencori.ai.responses({\n * model: 'gpt-4o',\n * input: 'What is the weather in San Francisco?',\n * tools: [{ type: 'web_search_preview' }]\n * });\n * console.log(response.output[0].content?.[0]?.text);\n */\n async responses(request: ResponsesRequest): Promise<ResponsesResponse> {\n const response = await fetch(`${this.config.baseUrl}/v1/responses`, {\n method: 'POST',\n headers: {\n 'CENCORI_API_KEY': this.config.apiKey,\n 'Content-Type': 'application/json',\n ...this.config.headers,\n },\n body: JSON.stringify({\n model: request.model,\n input: request.input,\n instructions: request.instructions,\n tools: request.tools,\n tool_choice: request.tool_choice,\n temperature: request.temperature,\n max_output_tokens: request.max_output_tokens,\n top_p: request.top_p,\n store: request.store,\n metadata: request.metadata,\n previous_response_id: request.previous_response_id,\n parallel_tool_calls: request.parallel_tool_calls,\n truncation: request.truncation,\n response_format: request.response_format,\n include: request.include,\n stream: false,\n user: request.user,\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 return response.json() as Promise<ResponsesResponse>;\n }\n\n /**\n * Stream responses from the Responses API via SSE.\n * Yields parsed events as they arrive.\n *\n * @example\n * for await (const event of cencori.ai.responsesStream({\n * model: 'gpt-4o',\n * input: 'Tell me about AI',\n * })) {\n * if (event.type === 'response.output_text.delta') {\n * process.stdout.write(event.data.delta);\n * }\n * }\n */\n async *responsesStream(request: ResponsesRequest): AsyncGenerator<{ type: string; data: Record<string, unknown> }, void, unknown> {\n const response = await fetch(`${this.config.baseUrl}/v1/responses`, {\n method: 'POST',\n headers: {\n 'CENCORI_API_KEY': this.config.apiKey,\n 'Content-Type': 'application/json',\n ...this.config.headers,\n },\n body: JSON.stringify({\n model: request.model,\n input: request.input,\n instructions: request.instructions,\n tools: request.tools,\n tool_choice: request.tool_choice,\n temperature: request.temperature,\n max_output_tokens: request.max_output_tokens,\n top_p: request.top_p,\n store: request.store,\n metadata: request.metadata,\n previous_response_id: request.previous_response_id,\n parallel_tool_calls: request.parallel_tool_calls,\n truncation: request.truncation,\n response_format: request.response_format,\n include: request.include,\n stream: true,\n user: request.user,\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 if (!response.body) {\n throw new Error('Response body is null');\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n let eventType = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\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() === '') {\n eventType = '';\n continue;\n }\n if (line.startsWith('event: ')) {\n eventType = line.slice(7).trim();\n continue;\n }\n if (line.startsWith('data: ')) {\n const data = line.slice(6).trim();\n if (!data) continue;\n try {\n const parsed = JSON.parse(data) as Record<string, unknown>;\n yield { type: eventType || 'message', data: parsed };\n } catch {\n // skip malformed JSON\n }\n eventType = '';\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n /**\n * Stream RAG responses with automatic memory context\n * \n * @example\n * for await (const chunk of cencori.ai.ragStream({ model: 'gpt-4o', messages, namespace: 'docs' })) {\n * if (chunk.type === 'sources') console.log('Sources:', chunk.sources);\n * if (chunk.type === 'content') process.stdout.write(chunk.delta);\n * }\n */\n async *ragStream(request: RagRequest): AsyncGenerator<RagStreamChunk, void, unknown> {\n const response = await fetch(`${this.config.baseUrl}/api/ai/rag`, {\n method: 'POST',\n headers: {\n 'CENCORI_API_KEY': this.config.apiKey,\n 'Content-Type': 'application/json',\n ...this.config.headers,\n },\n body: JSON.stringify({\n model: request.model,\n messages: request.messages,\n namespace: request.namespace,\n temperature: request.temperature,\n maxTokens: request.maxTokens,\n limit: request.limit ?? 5,\n threshold: request.threshold ?? 0.5,\n include_sources: request.includeSources ?? true,\n stream: true,\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 if (!response.body) {\n throw new Error('Response body is null');\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) break;\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\n if (data === '[DONE]') {\n return;\n }\n\n try {\n const chunk = JSON.parse(data) as RagStreamChunk;\n yield chunk;\n } catch {\n // Skip malformed JSON\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n}\n\n// RAG Types\nexport interface RagRequest {\n model: string;\n messages: Array<{ role: 'system' | 'user' | 'assistant'; content: string }>;\n namespace: string;\n temperature?: number;\n maxTokens?: number;\n limit?: number;\n threshold?: number;\n includeSources?: boolean;\n}\n\nexport interface RagResponse {\n message: { role: string; content: string };\n model: string;\n provider: string;\n usage: {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n };\n sources?: Array<{\n content: string;\n metadata: Record<string, unknown>;\n similarity: number;\n }>;\n latencyMs: number;\n}\n\nexport interface RagStreamChunk {\n type: 'sources' | 'content';\n delta?: string;\n finish_reason?: string;\n sources?: Array<{\n content: string;\n metadata: Record<string, unknown>;\n similarity: number;\n }>;\n}\n\ninterface RagApiResponse {\n message: { role: string; content: string };\n model: string;\n provider: string;\n usage: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n };\n sources?: Array<{\n content: string;\n metadata: Record<string, unknown>;\n similarity: number;\n }>;\n latency_ms: number;\n}\n","import type { CencoriConfig } from '../types';\n\nexport interface AgentConfig {\n model: string;\n system_prompt: string | null;\n tools: string[];\n temperature: number | null;\n}\n\nexport interface Agent {\n id: string;\n name: string;\n description: string | null;\n is_active: boolean;\n shadow_mode: boolean;\n created_at: string;\n updated_at?: string;\n config: AgentConfig;\n}\n\nexport interface AgentListItem {\n id: string;\n name: string;\n description: string | null;\n is_active: boolean;\n shadow_mode: boolean;\n created_at: string;\n}\n\nexport interface CreateAgentParams {\n name: string;\n description?: string;\n config?: {\n model?: string;\n system_prompt?: string;\n tools?: string[];\n temperature?: number;\n };\n}\n\nexport interface UpdateAgentParams {\n name?: string;\n description?: string;\n is_active?: boolean;\n shadow_mode?: boolean;\n config?: {\n model?: string;\n system_prompt?: string;\n tools?: string[];\n temperature?: number;\n };\n}\n\nexport interface AgentKey {\n id: string;\n name: string;\n key_prefix: string;\n full_key?: string;\n environment: string;\n key_type: string;\n agent_id: string;\n created_at: string;\n}\n\nexport interface CreateAgentKeyParams {\n name?: string;\n environment?: 'production' | 'test';\n key_type?: 'secret' | 'publishable';\n allowed_domains?: string[];\n}\n\nexport class AgentsNamespace {\n private config: Required<CencoriConfig>;\n\n constructor(config: Required<CencoriConfig>) {\n this.config = config;\n }\n\n private async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const response = await fetch(`${this.config.baseUrl}${path}`, {\n method,\n headers: {\n 'CENCORI_API_KEY': this.config.apiKey,\n 'Content-Type': 'application/json',\n ...this.config.headers,\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({ error: 'Unknown error' })) as { error?: { message?: string } };\n throw new Error(`Cencori API error: ${errorData.error?.message || response.statusText}`);\n }\n\n if (response.status === 204) return undefined as T;\n return response.json() as Promise<T>;\n }\n\n async create(params: CreateAgentParams): Promise<Agent> {\n return this.request<Agent>('POST', '/v1/agents', params);\n }\n\n async list(): Promise<{ data: AgentListItem[] }> {\n return this.request<{ data: AgentListItem[] }>('GET', '/v1/agents');\n }\n\n async get(agentId: string): Promise<Agent> {\n return this.request<Agent>('GET', `/v1/agents/${agentId}`);\n }\n\n async updateConfig(agentId: string, params: UpdateAgentParams): Promise<Agent> {\n return this.request<Agent>('PATCH', `/v1/agents/${agentId}`, params);\n }\n\n async delete(agentId: string): Promise<void> {\n return this.request<void>('DELETE', `/v1/agents/${agentId}`);\n }\n\n async createKey(agentId: string, params?: CreateAgentKeyParams): Promise<AgentKey> {\n return this.request<AgentKey>('POST', `/v1/agents/${agentId}/keys`, params || {});\n }\n}\n","/**\n * Vision API — analyze, describe, OCR, and classify images.\n *\n * @example\n * const result = await cencori.vision.analyze({\n * image: { url: 'https://example.com/photo.jpg' },\n * prompt: 'What breed of dog is this?',\n * });\n *\n * @example\n * const { text } = await cencori.vision.ocr({ image: { base64, mimeType: 'image/png' } });\n */\n\nimport type { CencoriConfig } from '../types';\n\nexport type VisionProvider = 'openai' | 'anthropic' | 'google';\n\nexport type VisionTask = 'analyze' | 'describe' | 'ocr' | 'classify';\n\nexport interface VisionImage {\n /** https:// URL or data: URL. Exactly one of `url` or `base64` must be set. */\n url?: string;\n /** Raw base64 (no data: prefix). Requires `mimeType`. */\n base64?: string;\n /** Image mime type. Required when using `base64`. */\n mimeType?: string;\n}\n\nexport interface VisionRequest {\n /** Single image. Use this OR `images`. */\n image?: VisionImage;\n /** Multiple images to analyze together. */\n images?: VisionImage[];\n prompt?: string;\n model?: string;\n maxTokens?: number;\n temperature?: number;\n responseFormat?: 'text' | 'json';\n}\n\nexport interface VisionStreamChunk {\n delta?: string;\n done?: boolean;\n model?: string;\n provider?: VisionProvider;\n usage?: VisionUsage;\n cost?: VisionCost;\n error?: string;\n}\n\nexport interface VisionUsage {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n}\n\nexport interface VisionCost {\n providerCostUsd: number;\n cencoriChargeUsd: number;\n markupPercentage: number;\n}\n\nexport interface VisionResult {\n analysis: string;\n model: string;\n provider: VisionProvider;\n usage: VisionUsage;\n cost: VisionCost;\n}\n\nexport interface VisionDescribeResult {\n description: string;\n model: string;\n provider: VisionProvider;\n usage: VisionUsage;\n cost: VisionCost;\n}\n\nexport interface VisionOcrResult {\n text: string;\n model: string;\n provider: VisionProvider;\n usage: VisionUsage;\n cost: VisionCost;\n}\n\nexport interface VisionClassification {\n primary_category?: string;\n tags?: string[];\n objects?: string[];\n safe_for_work?: boolean;\n confidence?: number;\n summary?: string;\n [key: string]: unknown;\n}\n\nexport interface VisionClassifyResult {\n classification: VisionClassification | string;\n raw: string;\n model: string;\n provider: VisionProvider;\n usage: VisionUsage;\n cost: VisionCost;\n}\n\ninterface JsonBody {\n image_url?: string;\n image_base64?: string;\n mime_type?: string;\n images?: Array<{ url?: string; base64?: string; mime_type?: string }>;\n prompt?: string;\n model?: string;\n max_tokens?: number;\n temperature?: number;\n response_format?: 'text' | 'json';\n}\n\nfunction toBody(request: VisionRequest): JsonBody {\n const body: JsonBody = {\n prompt: request.prompt,\n model: request.model,\n max_tokens: request.maxTokens,\n temperature: request.temperature,\n response_format: request.responseFormat,\n };\n\n if (request.images && request.images.length > 0) {\n body.images = request.images.map(img => {\n if (img.url) return { url: img.url };\n if (img.base64) return { base64: img.base64, mime_type: img.mimeType };\n throw new Error('Each entry in images requires url or base64');\n });\n return body;\n }\n if (!request.image) {\n throw new Error('vision request requires `image` or `images[]`');\n }\n if (request.image.url) {\n body.image_url = request.image.url;\n } else if (request.image.base64) {\n body.image_base64 = request.image.base64;\n body.mime_type = request.image.mimeType;\n } else {\n throw new Error('vision request requires image.url or image.base64');\n }\n return body;\n}\n\nexport class VisionNamespace {\n private config: Required<CencoriConfig>;\n\n constructor(config: Required<CencoriConfig>) {\n this.config = config;\n }\n\n /**\n * General image analysis — provide your own prompt.\n * Default prompt: \"Describe this image in detail.\"\n */\n async analyze(request: VisionRequest): Promise<VisionResult> {\n return this.post<VisionResult>('/api/ai/vision', request);\n }\n\n /** Describe the image in rich detail. */\n async describe(request: VisionRequest): Promise<VisionDescribeResult> {\n return this.post<VisionDescribeResult>('/api/ai/vision/describe', request);\n }\n\n /** Extract all visible text from the image. */\n async ocr(request: VisionRequest): Promise<VisionOcrResult> {\n return this.post<VisionOcrResult>('/api/ai/vision/ocr', request);\n }\n\n /** Return structured tags, objects, and category classification. */\n async classify(request: VisionRequest): Promise<VisionClassifyResult> {\n return this.post<VisionClassifyResult>('/api/ai/vision/classify', request);\n }\n\n /**\n * Stream a vision analysis. Yields `{ delta }` chunks as text arrives, then\n * a final `{ done: true, model, provider, usage, cost }` chunk with totals.\n *\n * @example\n * for await (const chunk of cencori.vision.analyzeStream({ image: { url } })) {\n * if (chunk.delta) process.stdout.write(chunk.delta);\n * if (chunk.done) console.log(chunk.cost);\n * }\n */\n async *analyzeStream(request: VisionRequest): AsyncGenerator<VisionStreamChunk, void, unknown> {\n const body = { ...toBody(request), stream: true };\n const response = await fetch(`${this.config.baseUrl}/api/ai/vision`, {\n method: 'POST',\n headers: {\n 'CENCORI_API_KEY': this.config.apiKey,\n 'Content-Type': 'application/json',\n ...this.config.headers,\n },\n body: JSON.stringify(body),\n });\n if (!response.ok) {\n const data = await response.json().catch(() => ({}));\n const message =\n (data && typeof data === 'object' && 'message' in data && typeof data.message === 'string')\n ? data.message\n : `Vision stream request failed with status ${response.status}`;\n throw new Error(message);\n }\n if (!response.body) throw new Error('Response body is null');\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue;\n const data = line.slice(6);\n if (data === '[DONE]') return;\n try {\n yield JSON.parse(data) as VisionStreamChunk;\n } catch {\n // skip malformed frame\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n private async post<T>(path: string, request: VisionRequest): Promise<T> {\n const response = await fetch(`${this.config.baseUrl}${path}`, {\n method: 'POST',\n headers: {\n 'CENCORI_API_KEY': this.config.apiKey,\n 'Content-Type': 'application/json',\n ...this.config.headers,\n },\n body: JSON.stringify(toBody(request)),\n });\n const data = await response.json();\n if (!response.ok) {\n const message =\n (data && typeof data === 'object' && 'message' in data && typeof data.message === 'string')\n ? data.message\n : `Vision request failed with status ${response.status}`;\n const code =\n (data && typeof data === 'object' && 'error' in data && typeof data.error === 'string')\n ? data.error\n : 'request_failed';\n const err = new Error(message) as Error & { code?: string; details?: unknown };\n err.code = code;\n err.details = data;\n throw err;\n }\n return data as T;\n }\n}\n","/**\n * Voice API — text-to-speech and speech-to-text across providers.\n *\n * @example\n * // TTS — synthesize speech (default provider: OpenAI)\n * const { audio, contentType } = await cencori.voice.speak({\n * input: 'Hello from Cencori.',\n * model: 'aura-asteria-en', // Deepgram; provider inferred from model\n * });\n * await fs.writeFile('hello.mp3', Buffer.from(audio));\n *\n * @example\n * // STT — transcribe audio\n * const { text } = await cencori.voice.transcribe({\n * audio: fileBytes,\n * model: 'nova-3', // Deepgram\n * });\n *\n * @example\n * // STT with speaker labels\n * const { segments } = await cencori.voice.diarize({\n * audio: fileBytes,\n * model: 'assemblyai-universal',\n * });\n */\n\nimport type { CencoriConfig } from '../types';\n\nexport type TTSProvider = 'openai' | 'deepgram' | 'cartesia' | 'spitch' | 'elevenlabs';\nexport type STTProvider = 'openai' | 'deepgram' | 'assemblyai' | 'spitch';\n\nexport type AudioFormat = 'mp3' | 'opus' | 'aac' | 'flac' | 'wav' | 'pcm';\nexport type TranscriptFormat = 'json' | 'text' | 'srt' | 'vtt' | 'verbose_json';\n\n/** Any audio payload the runtime can turn into bytes for upload. */\nexport type AudioInput = Blob | ArrayBuffer | ArrayBufferView | Uint8Array;\n\nexport interface SpeakRequest {\n /** Text to synthesize (max 4096 characters). */\n input: string;\n /** Model id — provider is inferred from it. Default: `tts-1` (OpenAI). */\n model?: string;\n /** Voice id/name. Provider-specific; falls back to the model's default. */\n voice?: string;\n /** Explicit provider. Optional — usually inferred from `model`. */\n provider?: TTSProvider;\n responseFormat?: AudioFormat;\n /** Playback speed, 0.25–4.0 (OpenAI only). */\n speed?: number;\n /** Language code (Spitch: e.g. `en`, `yo`, `ha`, `ig`, `am`). */\n language?: string;\n}\n\nexport interface SpeakResult {\n /** Raw audio bytes. Wrap in `Buffer.from(audio)` or a `Blob` to use. */\n audio: ArrayBuffer;\n contentType: string;\n provider: string;\n requestId?: string;\n}\n\nexport interface TranscribeRequest {\n /** Audio bytes to transcribe (max 25MB). */\n audio: AudioInput;\n /** Filename hint used for format detection. Default: `audio.mp3`. */\n filename?: string;\n /** Model id — provider is inferred from it. Default: `whisper-1` (OpenAI). */\n model?: string;\n /** Explicit provider. Optional — usually inferred from `model`. */\n provider?: STTProvider;\n /** Language hint (Spitch uses it as the target language). */\n language?: string;\n /** Optional context prompt (OpenAI only). */\n prompt?: string;\n temperature?: number;\n /** Request speaker labels where the provider supports it. */\n diarize?: boolean;\n /** Response shape. Default: `json`. */\n responseFormat?: TranscriptFormat;\n}\n\nexport interface TranscriptSegment {\n start: number;\n end: number;\n text: string;\n speaker?: string;\n}\n\nexport interface TranscriptWord {\n start: number;\n end: number;\n word: string;\n speaker?: string;\n}\n\nexport interface TranscribeResult {\n text: string;\n language?: string;\n duration?: number;\n provider?: string;\n model?: string;\n segments?: TranscriptSegment[];\n words?: TranscriptWord[];\n}\n\nexport interface VoiceModelInfo {\n id: string;\n provider: string;\n description?: string;\n}\n\nfunction toBlob(input: AudioInput): Blob {\n if (typeof Blob !== 'undefined' && input instanceof Blob) return input;\n if (input instanceof ArrayBuffer) return new Blob([new Uint8Array(input)]);\n // ArrayBufferView (Buffer, Uint8Array, DataView, …). Copy into a fresh\n // ArrayBuffer-backed array so the result is always a valid BlobPart.\n const view = input as ArrayBufferView;\n const bytes = new Uint8Array(view.byteLength);\n bytes.set(new Uint8Array(view.buffer, view.byteOffset, view.byteLength));\n return new Blob([bytes]);\n}\n\nexport class VoiceNamespace {\n private config: Required<CencoriConfig>;\n\n constructor(config: Required<CencoriConfig>) {\n this.config = config;\n }\n\n /**\n * Text-to-speech. Returns raw audio bytes plus the resolved provider.\n * Provider is inferred from `model` (default `tts-1`); pass `provider`\n * only to be explicit.\n */\n async speak(request: SpeakRequest): Promise<SpeakResult> {\n if (!request.input || !request.input.trim()) {\n throw new Error('voice.speak requires non-empty `input`');\n }\n const body = {\n input: request.input,\n model: request.model,\n voice: request.voice,\n provider: request.provider,\n response_format: request.responseFormat,\n speed: request.speed,\n language: request.language,\n };\n const response = await fetch(`${this.config.baseUrl}/api/ai/audio/speech`, {\n method: 'POST',\n headers: {\n 'CENCORI_API_KEY': this.config.apiKey,\n 'Content-Type': 'application/json',\n ...this.config.headers,\n },\n body: JSON.stringify(body),\n });\n if (!response.ok) {\n throw await this.error(response, 'voice.speak');\n }\n return {\n audio: await response.arrayBuffer(),\n contentType: response.headers.get('content-type') ?? 'application/octet-stream',\n provider: response.headers.get('x-provider') ?? request.provider ?? 'openai',\n requestId: response.headers.get('x-request-id') ?? undefined,\n };\n }\n\n /**\n * Speech-to-text. Provider is inferred from `model` (default `whisper-1`).\n * For `text`/`srt`/`vtt` formats the transcript is returned in `text`.\n */\n async transcribe(request: TranscribeRequest): Promise<TranscribeResult> {\n if (!request.audio) {\n throw new Error('voice.transcribe requires `audio`');\n }\n const form = new FormData();\n form.append('file', toBlob(request.audio), request.filename ?? 'audio.mp3');\n if (request.model) form.append('model', request.model);\n if (request.provider) form.append('provider', request.provider);\n if (request.language) form.append('language', request.language);\n if (request.prompt) form.append('prompt', request.prompt);\n if (typeof request.temperature === 'number') form.append('temperature', String(request.temperature));\n if (request.diarize) form.append('diarize', 'true');\n form.append('response_format', request.responseFormat ?? 'json');\n\n const response = await fetch(`${this.config.baseUrl}/api/ai/audio/transcriptions`, {\n method: 'POST',\n headers: {\n 'CENCORI_API_KEY': this.config.apiKey,\n ...this.config.headers,\n },\n body: form,\n });\n if (!response.ok) {\n throw await this.error(response, 'voice.transcribe');\n }\n // Text formats come back as plain text, not JSON.\n const format = request.responseFormat;\n if (format === 'text' || format === 'srt' || format === 'vtt') {\n return { text: await response.text(), provider: response.headers.get('x-provider') ?? undefined };\n }\n return (await response.json()) as TranscribeResult;\n }\n\n /**\n * Speech-to-text with speaker labels. Convenience wrapper over\n * `transcribe` that enables diarization and returns verbose segments.\n * Use a diarization-capable model (`nova-3`, `assemblyai-universal`).\n */\n async diarize(request: Omit<TranscribeRequest, 'diarize' | 'responseFormat'>): Promise<TranscribeResult> {\n return this.transcribe({ ...request, diarize: true, responseFormat: 'verbose_json' });\n }\n\n /** List the available voice models (TTS + STT) with their providers. */\n async listModels(): Promise<{ tts: VoiceModelInfo[]; stt: VoiceModelInfo[] }> {\n const [ttsRes, sttRes] = await Promise.all([\n fetch(`${this.config.baseUrl}/api/ai/audio/speech`, { headers: this.config.headers }),\n fetch(`${this.config.baseUrl}/api/ai/audio/transcriptions`, { headers: this.config.headers }),\n ]);\n const tts = ttsRes.ok ? (await ttsRes.json()).models ?? [] : [];\n const stt = sttRes.ok ? (await sttRes.json()).models ?? [] : [];\n return { tts, stt };\n }\n\n private async error(response: Response, op: string): Promise<Error> {\n const data = await response.json().catch(() => ({}));\n const message =\n (data && typeof data === 'object' && 'message' in data && typeof data.message === 'string')\n ? data.message\n : `${op} failed with status ${response.status}`;\n const code =\n (data && typeof data === 'object' && 'error' in data && typeof data.error === 'string')\n ? data.error\n : 'request_failed';\n const err = new Error(message) as Error & { code?: string; details?: unknown };\n err.code = code;\n err.details = data;\n return err;\n }\n}\n","/**\n * Documents API — extract text from PDFs and images, summarize, and query.\n *\n * @example\n * const { text, pageCount } = await cencori.documents.extract({\n * document: { url: 'https://example.com/contract.pdf' },\n * });\n *\n * @example\n * const { summary } = await cencori.documents.summarize({\n * document: { base64, mimeType: 'application/pdf' },\n * });\n *\n * @example\n * const { answer } = await cencori.documents.query({\n * document: { url: 'https://example.com/report.pdf' },\n * question: 'What is the total revenue for Q3?',\n * });\n */\n\nimport type { CencoriConfig } from '../types';\n\nexport type DocumentExtractMethod = 'pdf_text' | 'vision_ocr';\nexport type DocumentKind = 'pdf' | 'image';\n\nexport interface DocumentInput {\n url?: string;\n base64?: string;\n mimeType?: string;\n filename?: string;\n}\n\nexport interface DocumentRequest {\n document: DocumentInput;\n prompt?: string;\n model?: string;\n maxTokens?: number;\n temperature?: number;\n}\n\nexport interface DocumentQueryRequest extends DocumentRequest {\n question: string;\n}\n\nexport interface DocumentUsage {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n}\n\nexport interface DocumentCost {\n providerCostUsd: number;\n cencoriChargeUsd: number;\n markupPercentage: number;\n}\n\nexport interface DocumentExtractResult {\n text: string;\n pageCount: number;\n kind: DocumentKind;\n method: DocumentExtractMethod;\n model?: string;\n provider?: string;\n metadata?: Record<string, unknown>;\n usage?: DocumentUsage;\n cost?: DocumentCost;\n}\n\nexport interface DocumentSummarizeResult {\n summary: string;\n text: string;\n pageCount: number;\n model: string;\n provider: string;\n extractMethod: DocumentExtractMethod;\n usage: DocumentUsage;\n cost: DocumentCost;\n}\n\nexport interface DocumentQueryResult {\n answer: string;\n question: string;\n pageCount: number;\n model: string;\n provider: string;\n extractMethod: DocumentExtractMethod;\n usage: DocumentUsage;\n cost: DocumentCost;\n}\n\ninterface JsonBody {\n document_url?: string;\n document_base64?: string;\n mime_type?: string;\n filename?: string;\n prompt?: string;\n model?: string;\n max_tokens?: number;\n temperature?: number;\n question?: string;\n}\n\nfunction toBody(request: DocumentRequest, extra: Partial<JsonBody> = {}): JsonBody {\n const body: JsonBody = {\n prompt: request.prompt,\n model: request.model,\n max_tokens: request.maxTokens,\n temperature: request.temperature,\n ...extra,\n };\n if (request.document.url) {\n body.document_url = request.document.url;\n } else if (request.document.base64) {\n body.document_base64 = request.document.base64;\n body.mime_type = request.document.mimeType;\n body.filename = request.document.filename;\n } else {\n throw new Error('documents request requires document.url or document.base64');\n }\n return body;\n}\n\nexport class DocumentsNamespace {\n private config: Required<CencoriConfig>;\n\n constructor(config: Required<CencoriConfig>) {\n this.config = config;\n }\n\n /** Extract text from a PDF (native, no LLM) or image (via Vision OCR). */\n async extract(request: DocumentRequest): Promise<DocumentExtractResult> {\n return this.post<DocumentExtractResult>('/api/ai/documents/extract', toBody(request));\n }\n\n /** Extract then summarize the document with a chat model. */\n async summarize(request: DocumentRequest): Promise<DocumentSummarizeResult> {\n return this.post<DocumentSummarizeResult>('/api/ai/documents/summarize', toBody(request));\n }\n\n /** Extract then answer a question about the document. */\n async query(request: DocumentQueryRequest): Promise<DocumentQueryResult> {\n if (!request.question) throw new Error('documents.query requires a `question`');\n return this.post<DocumentQueryResult>('/api/ai/documents/query', toBody(request, { question: request.question }));\n }\n\n private async post<T>(path: string, body: JsonBody): Promise<T> {\n const response = await fetch(`${this.config.baseUrl}${path}`, {\n method: 'POST',\n headers: {\n 'CENCORI_API_KEY': this.config.apiKey,\n 'Content-Type': 'application/json',\n ...this.config.headers,\n },\n body: JSON.stringify(body),\n });\n const data = await response.json();\n if (!response.ok) {\n const message =\n (data && typeof data === 'object' && 'message' in data && typeof data.message === 'string')\n ? data.message\n : `Documents request failed with status ${response.status}`;\n const code =\n (data && typeof data === 'object' && 'error' in data && typeof data.error === 'string')\n ? data.error\n : 'request_failed';\n const err = new Error(message) as Error & { code?: string; details?: unknown };\n err.code = code;\n err.details = data;\n throw err;\n }\n return data as T;\n }\n}\n","import type { CencoriConfig } from '../types';\n\nexport interface Session {\n id: string;\n status: 'active' | 'paused' | 'completed' | 'failed';\n turn_count: number;\n created_at: string;\n updated_at: string;\n agent_id: string | null;\n metadata: Record<string, unknown>;\n total_cost: number;\n}\n\nexport interface SessionEvent {\n id: string;\n session_id: string;\n turn_number: number;\n sequence: number;\n event_type: string;\n payload: Record<string, unknown>;\n created_at: string;\n}\n\nexport interface CreateSessionParams {\n agent_id?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface TurnParams {\n input: string | Array<Record<string, unknown>>;\n tools?: Array<Record<string, unknown>>;\n instructions?: string;\n agent_id?: string;\n model?: string;\n temperature?: number;\n max_output_tokens?: number;\n tool_choice?: 'auto' | 'none' | 'required' | { type: 'function'; name: string };\n response_format?: Record<string, unknown>;\n user?: string;\n pause_on_tool_calls?: boolean;\n}\n\nexport interface ApproveRejectParams {\n action_id: string;\n tool_results?: Array<{ action_id: string; output: string }>;\n}\n\nexport interface PaginatedResponse<T> {\n data: T[];\n pagination: {\n page: number;\n limit: number;\n total: number;\n total_pages: number;\n };\n}\n\nexport interface SessionListParams {\n page?: number;\n limit?: number;\n status?: 'active' | 'paused' | 'completed' | 'failed';\n agent_id?: string;\n}\n\nexport class SessionsNamespace {\n private config: Required<CencoriConfig>;\n\n constructor(config: Required<CencoriConfig>) {\n this.config = config;\n }\n\n private async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const response = await fetch(`${this.config.baseUrl}${path}`, {\n method,\n headers: {\n 'CENCORI_API_KEY': this.config.apiKey,\n 'Content-Type': 'application/json',\n ...this.config.headers,\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({ error: 'Unknown error' })) as { error?: { message?: string } };\n throw new Error(`Cencori API error: ${errorData.error?.message || response.statusText}`);\n }\n\n if (response.status === 204) return undefined as T;\n return response.json() as Promise<T>;\n }\n\n async create(params?: CreateSessionParams): Promise<Session> {\n return this.request<Session>('POST', '/v1/sessions', params || {});\n }\n\n async list(params?: SessionListParams): Promise<PaginatedResponse<Session>> {\n const searchParams = new URLSearchParams();\n if (params?.page) searchParams.set('page', String(params.page));\n if (params?.limit) searchParams.set('limit', String(params.limit));\n if (params?.status) searchParams.set('status', params.status);\n if (params?.agent_id) searchParams.set('agent_id', params.agent_id);\n const qs = searchParams.toString();\n return this.request<PaginatedResponse<Session>>('GET', `/v1/sessions${qs ? `?${qs}` : ''}`);\n }\n\n async get(sessionId: string): Promise<Session> {\n return this.request<Session>('GET', `/v1/sessions/${sessionId}`);\n }\n\n async delete(sessionId: string): Promise<{ id: string; deleted: boolean }> {\n return this.request<{ id: string; deleted: boolean }>('DELETE', `/v1/sessions/${sessionId}`);\n }\n\n async submitTurn(sessionId: string, params: TurnParams): Promise<Response> {\n const url = `${this.config.baseUrl}/v1/sessions/${sessionId}/turns`;\n return fetch(url, {\n method: 'POST',\n headers: {\n 'CENCORI_API_KEY': this.config.apiKey,\n 'Content-Type': 'application/json',\n ...this.config.headers,\n },\n body: JSON.stringify(params),\n });\n }\n\n async submitTurnStream(sessionId: string, params: TurnParams): Promise<ReadableStream<Uint8Array> | null> {\n const response = await this.submitTurn(sessionId, params);\n if (!response.ok) {\n const err = await response.json().catch(() => ({ error: 'Unknown error' }));\n throw new Error(`Cencori API error: ${err.error?.message || response.statusText}`);\n }\n return response.body;\n }\n\n async getEvents(\n sessionId: string,\n params?: { page?: number; limit?: number; turn_number?: number },\n ): Promise<PaginatedResponse<SessionEvent>> {\n const searchParams = new URLSearchParams();\n if (params?.page) searchParams.set('page', String(params.page));\n if (params?.limit) searchParams.set('limit', String(params.limit));\n if (params?.turn_number) searchParams.set('turn_number', String(params.turn_number));\n const qs = searchParams.toString();\n return this.request<PaginatedResponse<SessionEvent>>('GET', `/v1/sessions/${sessionId}/events${qs ? `?${qs}` : ''}`);\n }\n\n async approve(sessionId: string, params: ApproveRejectParams): Promise<Response> {\n const url = `${this.config.baseUrl}/v1/sessions/${sessionId}/approve`;\n return fetch(url, {\n method: 'POST',\n headers: {\n 'CENCORI_API_KEY': this.config.apiKey,\n 'Content-Type': 'application/json',\n ...this.config.headers,\n },\n body: JSON.stringify(params),\n });\n }\n\n async approveStream(sessionId: string, params: ApproveRejectParams): Promise<ReadableStream<Uint8Array> | null> {\n const response = await this.approve(sessionId, params);\n if (!response.ok) {\n const err = await response.json().catch(() => ({ error: 'Unknown error' }));\n throw new Error(`Cencori API error: ${err.error?.message || response.statusText}`);\n }\n return response.body;\n }\n\n async reject(sessionId: string, params: ApproveRejectParams): Promise<{ id: string; action_id: string; resolution: string; status: string }> {\n return this.request('POST', `/v1/sessions/${sessionId}/reject`, params);\n }\n}\n","/**\n * Compute Namespace - Serverless Functions & GPU Access\n * \n * 🚧 Coming Soon\n * \n * @example\n * const result = await cencori.compute.run('my-function', { \n * input: { data: 'hello' } \n * });\n */\n\nimport type { ComputeRunOptions } from '../types';\n\nexport class ComputeNamespace {\n /**\n * Run a serverless function\n * \n * 🚧 Coming Soon - This feature is not yet available.\n */\n async run(functionId: string, options?: ComputeRunOptions): Promise<never> {\n throw new Error(\n `cencori.compute.run() is coming soon! ` +\n `Function \"${functionId}\" cannot be executed yet. ` +\n `Join our waitlist at https://cencori.com/compute`\n );\n }\n\n /**\n * Deploy a function\n * \n * 🚧 Coming Soon - This feature is not yet available.\n */\n async deploy(config: { name: string; code: string }): Promise<never> {\n throw new Error(\n `cencori.compute.deploy() is coming soon! ` +\n `Join our waitlist at https://cencori.com/compute`\n );\n }\n\n /**\n * List deployed functions\n * \n * 🚧 Coming Soon - This feature is not yet available.\n */\n async list(): Promise<never> {\n throw new Error(\n `cencori.compute.list() is coming soon! ` +\n `Join our waitlist at https://cencori.com/compute`\n );\n }\n}\n","/**\n * Workflow Namespace - AI Pipelines & Orchestration\n * \n * 🚧 Coming Soon\n * \n * @example\n * await cencori.workflow.trigger('data-enrichment', { \n * data: { userId: '123' } \n * });\n */\n\nimport type { WorkflowTriggerOptions } from '../types';\n\nexport class WorkflowNamespace {\n /**\n * Trigger a workflow\n * \n * 🚧 Coming Soon - This feature is not yet available.\n */\n async trigger(workflowId: string, options?: WorkflowTriggerOptions): Promise<never> {\n throw new Error(\n `cencori.workflow.trigger() is coming soon! ` +\n `Workflow \"${workflowId}\" cannot be triggered yet. ` +\n `Join our waitlist at https://cencori.com/workflow`\n );\n }\n\n /**\n * Create a new workflow\n * \n * 🚧 Coming Soon - This feature is not yet available.\n */\n async create(config: { name: string; steps: unknown[] }): Promise<never> {\n throw new Error(\n `cencori.workflow.create() is coming soon! ` +\n `Join our waitlist at https://cencori.com/workflow`\n );\n }\n\n /**\n * Get workflow run status\n * \n * 🚧 Coming Soon - This feature is not yet available.\n */\n async status(runId: string): Promise<never> {\n throw new Error(\n `cencori.workflow.status() is coming soon! ` +\n `Join our waitlist at https://cencori.com/workflow`\n );\n }\n\n /**\n * List workflows\n * \n * 🚧 Coming Soon - This feature is not yet available.\n */\n async list(): Promise<never> {\n throw new Error(\n `cencori.workflow.list() is coming soon! ` +\n `Join our waitlist at https://cencori.com/workflow`\n );\n }\n}\n","/**\n * Storage Namespace - Vector Database, Knowledge Base, RAG\n * \n * 🚧 Coming Soon\n * \n * @example\n * const results = await cencori.storage.vectors.search('query', { limit: 5 });\n */\n\nimport type { VectorSearchOptions } from '../types';\n\nclass VectorsNamespace {\n /**\n * Search vectors by query\n * \n * 🚧 Coming Soon - This feature is not yet available.\n */\n async search(query: string, options?: VectorSearchOptions): Promise<never> {\n throw new Error(\n `cencori.storage.vectors.search() is coming soon! ` +\n `Join our waitlist at https://cencori.com/memory`\n );\n }\n\n /**\n * Upsert vectors\n * \n * 🚧 Coming Soon - This feature is not yet available.\n */\n async upsert(vectors: { id: string; values: number[]; metadata?: Record<string, unknown> }[]): Promise<never> {\n throw new Error(\n `cencori.storage.vectors.upsert() is coming soon! ` +\n `Join our waitlist at https://cencori.com/memory`\n );\n }\n\n /**\n * Delete vectors by ID\n * \n * 🚧 Coming Soon - This feature is not yet available.\n */\n async delete(ids: string[]): Promise<never> {\n throw new Error(\n `cencori.storage.vectors.delete() is coming soon! ` +\n `Join our waitlist at https://cencori.com/memory`\n );\n }\n}\n\nclass KnowledgeNamespace {\n /**\n * Query the knowledge base\n * \n * 🚧 Coming Soon - This feature is not yet available.\n */\n async query(question: string): Promise<never> {\n throw new Error(\n `cencori.storage.knowledge.query() is coming soon! ` +\n `Join our waitlist at https://cencori.com/memory`\n );\n }\n\n /**\n * Add documents to knowledge base\n * \n * 🚧 Coming Soon - This feature is not yet available.\n */\n async add(documents: { content: string; metadata?: Record<string, unknown> }[]): Promise<never> {\n throw new Error(\n `cencori.storage.knowledge.add() is coming soon! ` +\n `Join our waitlist at https://cencori.com/memory`\n );\n }\n}\n\nclass FilesNamespace {\n /**\n * Upload a file\n * \n * 🚧 Coming Soon - This feature is not yet available.\n */\n async upload(file: Blob | Buffer, name: string): Promise<never> {\n throw new Error(\n `cencori.storage.files.upload() is coming soon! ` +\n `Join our waitlist at https://cencori.com/memory`\n );\n }\n\n /**\n * Process a file (extract text, OCR, etc.)\n * \n * 🚧 Coming Soon - This feature is not yet available.\n */\n async process(fileId: string): Promise<never> {\n throw new Error(\n `cencori.storage.files.process() is coming soon! ` +\n `Join our waitlist at https://cencori.com/memory`\n );\n }\n}\n\nexport class StorageNamespace {\n /**\n * Vector database operations\n */\n readonly vectors = new VectorsNamespace();\n\n /**\n * Knowledge base operations (RAG)\n */\n readonly knowledge = new KnowledgeNamespace();\n\n /**\n * File storage and processing\n */\n readonly files = new FilesNamespace();\n}\n","/**\n * Cencori Memory SDK\n * \n * Vector storage for RAG, conversation history, and semantic search.\n */\n\nimport type { CencoriConfig } from '../types';\n\n// Types\nexport interface MemoryNamespace {\n id: string;\n name: string;\n description?: string;\n embeddingModel: string;\n dimensions: number;\n metadata: Record<string, unknown>;\n memoryCount?: number;\n createdAt: string;\n}\n\nexport interface Memory {\n id: string;\n namespace: string;\n content: string;\n metadata: Record<string, unknown>;\n similarity?: number;\n expiresAt?: string;\n createdAt: string;\n updatedAt?: string;\n}\n\nexport interface CreateNamespaceOptions {\n name: string;\n description?: string;\n embeddingModel?: string;\n dimensions?: number;\n metadata?: Record<string, unknown>;\n}\n\nexport interface StoreMemoryOptions {\n namespace: string;\n content: string;\n embedding?: number[];\n metadata?: Record<string, unknown>;\n expiresAt?: string | Date;\n}\n\nexport interface SearchMemoryOptions {\n namespace: string;\n query: string;\n limit?: number;\n threshold?: number;\n filter?: Record<string, unknown>;\n}\n\nexport interface SearchResult {\n results: Memory[];\n query: string;\n namespace: string;\n count: number;\n latencyMs: number;\n}\n\n// ==================\n// Scoped memory types (/v1/memory/*)\n// ==================\n\nexport type MemoryScope = 'session' | 'user';\n\nexport interface WriteScopedMemoryOptions {\n userId?: string;\n sessionId?: string;\n scope?: MemoryScope;\n content: string;\n namespace?: string;\n metadata?: Record<string, unknown>;\n importance?: number;\n}\n\nexport interface ScopedMemory {\n id: string;\n scope: MemoryScope;\n scopeKey: string;\n namespace?: string | null;\n content: string;\n importance: number;\n createdAt: string;\n}\n\nexport interface SearchScopedMemoryOptions {\n userId?: string;\n sessionId?: string;\n scope?: MemoryScope;\n query: string;\n topK?: number;\n threshold?: number;\n namespace?: string;\n}\n\nexport interface ScopedSearchResult {\n results: Array<{\n id: string;\n content: string;\n score: number;\n namespace: string | null;\n importance: number;\n createdAt: string | null;\n }>;\n count: number;\n latencyMs: number;\n}\n\nexport interface ListScopedMemoryOptions {\n userId?: string;\n sessionId?: string;\n scope?: MemoryScope;\n namespace?: string;\n limit?: number;\n cursor?: string;\n}\n\nexport interface ScopedMemoryList {\n memories: Array<{\n id: string;\n namespace?: string | null;\n content: string;\n metadata?: Record<string, unknown>;\n importance: number;\n accessCount?: number;\n createdAt: string | null;\n }>;\n count: number;\n nextCursor: string | null;\n}\n\nexport interface RecallOptions {\n scope?: MemoryScope;\n sessionId?: string;\n namespace?: string;\n topK?: number;\n threshold?: number;\n}\n\nexport interface RememberExchange {\n user?: string;\n assistant?: string;\n}\n\nexport interface RememberOptions {\n scope?: MemoryScope;\n sessionId?: string;\n namespace?: string;\n extract?: { model?: string; prompt?: string; minImportance?: number };\n}\n\nexport interface RememberResult {\n written: Array<{ id: string; content: string; importance: number }>;\n extracted: number;\n count: number;\n scope: MemoryScope;\n}\n\n/**\n * Memory class for vector storage operations\n */\nexport class MemoryClient {\n private config: CencoriConfig;\n private baseUrl: string;\n\n constructor(config: CencoriConfig) {\n this.config = config;\n this.baseUrl = config.baseUrl || 'https://cencori.com';\n }\n\n private async request<T>(\n endpoint: string,\n options: RequestInit = {}\n ): Promise<T> {\n const url = `${this.baseUrl}${endpoint}`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...(options.headers as Record<string, string> || {}),\n };\n\n if (this.config.apiKey) {\n headers['CENCORI_API_KEY'] = this.config.apiKey;\n }\n\n const response = await fetch(url, {\n ...options,\n headers,\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throw new Error(error.message || `Request failed: ${response.status}`);\n }\n\n return response.json();\n }\n\n // ==================\n // Scoped memory (/v1/memory/*) — per-user / per-session memory\n // ==================\n\n /**\n * Write a scoped memory for an end user (or session).\n *\n * @example\n * ```typescript\n * await cencori.memory.write({\n * userId: session.user.id,\n * content: 'Prefers dark mode. Uses TypeScript primarily.',\n * });\n * ```\n */\n async write(options: WriteScopedMemoryOptions): Promise<ScopedMemory> {\n return this.request<ScopedMemory>('/v1/memory/write', {\n method: 'POST',\n body: JSON.stringify(options),\n });\n }\n\n /**\n * Semantic search over an end user's memories.\n *\n * @example\n * ```typescript\n * const memories = await cencori.memory.searchUser({\n * userId: session.user.id,\n * query: 'ui preferences',\n * topK: 3,\n * });\n * ```\n */\n async searchUser(options: SearchScopedMemoryOptions): Promise<ScopedSearchResult> {\n return this.request<ScopedSearchResult>('/v1/memory/search', {\n method: 'POST',\n body: JSON.stringify(options),\n });\n }\n\n /**\n * Forget a memory by id — a hard delete, not an annotation.\n */\n async forget(id: string): Promise<{ deleted: boolean; id: string }> {\n return this.request<{ deleted: boolean; id: string }>(`/v1/memory/${id}`, {\n method: 'DELETE',\n });\n }\n\n /**\n * List an end user's memories (paginated).\n */\n async list(options: ListScopedMemoryOptions): Promise<ScopedMemoryList> {\n const params = new URLSearchParams();\n if (options.userId) params.set('userId', options.userId);\n if (options.sessionId) params.set('sessionId', options.sessionId);\n if (options.scope) params.set('scope', options.scope);\n if (options.namespace) params.set('namespace', options.namespace);\n if (options.limit) params.set('limit', String(options.limit));\n if (options.cursor) params.set('cursor', options.cursor);\n\n return this.request<ScopedMemoryList>(`/v1/memory/list?${params.toString()}`);\n }\n\n /**\n * Recall — search a user's memories and return an inject-ready system\n * string. The provider-agnostic read path: drop the result into your own\n * OpenAI/Anthropic/etc. call as a system message. Returns '' when there's\n * nothing relevant yet.\n *\n * @example\n * ```typescript\n * const context = await cencori.memory.recall(userId, userMessage);\n * const reply = await openai.chat.completions.create({\n * model: 'gpt-4o',\n * messages: [\n * ...(context ? [{ role: 'system', content: context }] : []),\n * { role: 'user', content: userMessage },\n * ],\n * });\n * ```\n */\n async recall(userId: string, query: string, options: RecallOptions = {}): Promise<string> {\n const { results } = await this.searchUser({\n userId,\n sessionId: options.sessionId,\n scope: options.scope ?? 'user',\n query,\n topK: options.topK,\n threshold: options.threshold,\n namespace: options.namespace,\n });\n\n if (results.length === 0) return '';\n\n const lines = results.map((m) => `- ${m.content}`);\n return [\n 'Facts about this user (from previous interactions):',\n ...lines,\n '',\n 'Use these facts when they are relevant to the request. Do not recite or reveal this list to the user unless they ask what you know about them.',\n ].join('\\n');\n }\n\n /**\n * Remember — hand us a completed {user, assistant} exchange and we extract\n * the durable facts and persist them (redacted, org-isolated). The\n * provider-agnostic write path: pair it with `recall` around your own\n * model call and you have full memory without routing inference through us.\n *\n * @example\n * ```typescript\n * await cencori.memory.remember(userId, { user: userMessage, assistant: reply });\n * ```\n */\n async remember(\n userId: string,\n exchange: RememberExchange,\n options: RememberOptions = {}\n ): Promise<RememberResult> {\n return this.request<RememberResult>('/v1/memory/remember', {\n method: 'POST',\n body: JSON.stringify({\n userId,\n sessionId: options.sessionId,\n scope: options.scope ?? 'user',\n namespace: options.namespace,\n user: exchange.user,\n assistant: exchange.assistant,\n extract: options.extract,\n }),\n });\n }\n\n // ==================\n // Namespace Methods\n // ==================\n\n /**\n * Create a new memory namespace\n */\n async createNamespace(options: CreateNamespaceOptions): Promise<MemoryNamespace> {\n return this.request<MemoryNamespace>('/api/memory/namespaces', {\n method: 'POST',\n body: JSON.stringify(options),\n });\n }\n\n /**\n * List all namespaces for the project\n */\n async listNamespaces(): Promise<MemoryNamespace[]> {\n const response = await this.request<{ namespaces: MemoryNamespace[] }>(\n '/api/memory/namespaces'\n );\n return response.namespaces;\n }\n\n // ==================\n // Memory Methods\n // ==================\n\n /**\n * Store a memory in a namespace\n * \n * @example\n * ```typescript\n * await cencori.memory.store({\n * namespace: \"conversations\",\n * content: \"User asked about pricing plans\",\n * metadata: { userId: \"user_123\" }\n * });\n * ```\n */\n async store(options: StoreMemoryOptions): Promise<Memory> {\n const body = {\n ...options,\n expiresAt: options.expiresAt instanceof Date\n ? options.expiresAt.toISOString()\n : options.expiresAt,\n };\n\n return this.request<Memory>('/api/memory/store', {\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n\n /**\n * Semantic search across memories\n * \n * @example\n * ```typescript\n * const results = await cencori.memory.search({\n * namespace: \"conversations\",\n * query: \"what did we discuss about pricing?\",\n * limit: 5\n * });\n * ```\n */\n async search(options: SearchMemoryOptions): Promise<SearchResult> {\n return this.request<SearchResult>('/api/memory/search', {\n method: 'POST',\n body: JSON.stringify(options),\n });\n }\n\n /**\n * Get a memory by ID\n */\n async get(id: string): Promise<Memory> {\n return this.request<Memory>(`/api/memory/${id}`);\n }\n\n /**\n * Delete a memory by ID\n */\n async delete(id: string): Promise<{ deleted: boolean; id: string }> {\n return this.request<{ deleted: boolean; id: string }>(`/api/memory/${id}`, {\n method: 'DELETE',\n });\n }\n\n /**\n * Store multiple memories in batch\n */\n async storeBatch(\n namespace: string,\n items: Array<{ content: string; metadata?: Record<string, unknown> }>\n ): Promise<Memory[]> {\n const results = await Promise.all(\n items.map(item => this.store({ namespace, ...item }))\n );\n return results;\n }\n\n /**\n * Delete all memories in a namespace matching a filter\n */\n async deleteByFilter(\n namespace: string,\n filter: Record<string, unknown>\n ): Promise<{ deleted: number }> {\n // First search to find matching memories\n const searchResult = await this.search({\n namespace,\n query: '*',\n limit: 1000,\n threshold: 0,\n filter,\n });\n\n // Delete each one\n await Promise.all(searchResult.results.map(r => this.delete(r.id)));\n\n return { deleted: searchResult.results.length };\n }\n}\n\nexport function createMemoryClient(config: CencoriConfig): MemoryClient {\n return new MemoryClient(config);\n}\n","/**\n * Cencori Chat namespace — OpenAI-compatible chat completions with\n * gateway-level memory.\n *\n * The magic path: one line makes chat stateful.\n *\n * @example\n * ```typescript\n * const response = await cencori.chat.completions.create({\n * model: 'gpt-4o',\n * messages: [{ role: 'user', content: 'What did we agree about pricing?' }],\n * memory: { userId: session.user.id },\n * });\n * console.log(response.choices[0].message.content);\n * console.log(response.memory?.retrieved); // facts injected into this reply\n * ```\n */\n\nimport type { CencoriConfig } from '../types';\n\nexport interface ChatMemoryOptions {\n userId?: string;\n sessionId?: string;\n scope?: 'session' | 'user';\n retrieve?: boolean;\n write?: boolean;\n topK?: number;\n threshold?: number;\n namespace?: string;\n extract?: {\n model?: string;\n prompt?: string;\n minImportance?: number;\n };\n}\n\nexport interface ChatCompletionMessage {\n role: 'system' | 'user' | 'assistant' | 'tool';\n content: string;\n}\n\nexport interface ChatCompletionCreateParams {\n model: string;\n messages: ChatCompletionMessage[];\n temperature?: number;\n max_tokens?: number;\n user?: string;\n memory?: ChatMemoryOptions;\n tools?: unknown[];\n tool_choice?: unknown;\n prompt?: { name: string; variables?: Record<string, string> };\n}\n\nexport interface ChatCompletionResponse {\n id: string;\n object: string;\n created: number;\n model: string;\n choices: Array<{\n index: number;\n message: { role: string; content: string; tool_calls?: unknown[] };\n finish_reason: string;\n }>;\n usage?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n };\n memory?: {\n retrieved: Array<{ id: string; score: number; content: string }>;\n written: Array<{ id: string; content: string }>;\n write_status: 'pending' | 'disabled';\n };\n}\n\nexport interface ChatCompletionChunk {\n delta: string;\n raw: Record<string, unknown>;\n}\n\nexport interface ChatCompletionStream extends AsyncIterable<ChatCompletionChunk> {\n /** Number of memories injected into this request (from X-Cencori-Memory-Retrieved). */\n memoriesRetrieved: number;\n}\n\nclass Completions {\n constructor(private config: Required<CencoriConfig>) {}\n\n // The OpenAI-compat chat handler. Public /v1/chat/completions rewrites\n // here too; the SDK targets the app path directly (rewrite-independent).\n private endpoint(): string {\n return `${this.config.baseUrl}/api/v1/chat/completions`;\n }\n\n private headers(): Record<string, string> {\n return {\n 'CENCORI_API_KEY': this.config.apiKey,\n 'Content-Type': 'application/json',\n ...this.config.headers,\n };\n }\n\n /**\n * Create a chat completion. Include `memory: { userId }` to retrieve\n * relevant facts before the model call and persist new ones after it.\n */\n async create(params: ChatCompletionCreateParams): Promise<ChatCompletionResponse> {\n const response = await fetch(this.endpoint(), {\n method: 'POST',\n headers: this.headers(),\n body: JSON.stringify({ ...params, stream: false }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({})) as {\n error?: { message?: string } | string;\n message?: string;\n };\n const message =\n typeof errorData.error === 'object'\n ? errorData.error?.message\n : errorData.error || errorData.message;\n throw new Error(`Cencori API error: ${message || response.statusText}`);\n }\n\n return response.json() as Promise<ChatCompletionResponse>;\n }\n\n /**\n * Stream a chat completion (SSE). Memory writeback still runs after the\n * stream completes; `memoriesRetrieved` reports the injected count.\n */\n async stream(params: ChatCompletionCreateParams): Promise<ChatCompletionStream> {\n const response = await fetch(this.endpoint(), {\n method: 'POST',\n headers: this.headers(),\n body: JSON.stringify({ ...params, stream: true }),\n });\n\n if (!response.ok || !response.body) {\n const errorData = await response.json().catch(() => ({})) as { error?: unknown };\n throw new Error(`Cencori API error: ${JSON.stringify(errorData.error) || response.statusText}`);\n }\n\n const memoriesRetrieved = Number(response.headers.get('X-Cencori-Memory-Retrieved') || 0);\n const body = response.body;\n\n const iterable: ChatCompletionStream = {\n memoriesRetrieved,\n async *[Symbol.asyncIterator]() {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed.startsWith('data: ')) continue;\n const payload = trimmed.slice(6);\n if (payload === '[DONE]') return;\n\n try {\n const parsed = JSON.parse(payload) as Record<string, unknown>;\n const delta =\n ((parsed.choices as Array<{ delta?: { content?: string } }> | undefined)?.[0]\n ?.delta?.content) ?? '';\n yield { delta, raw: parsed };\n } catch {\n // Skip malformed chunks\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n },\n };\n\n return iterable;\n }\n}\n\nexport class ChatNamespace {\n readonly completions: Completions;\n\n constructor(config: Required<CencoriConfig>) {\n this.completions = new Completions(config);\n }\n}\n","/**\n * Cencori Telemetry Client\n *\n * Report web traffic from your application to the Cencori dashboard.\n * Logs appear under the project's \"Web Gateway\" tab with your app's\n * real domain as the host.\n *\n * @example\n * const cencori = new Cencori({ apiKey: 'csk_...' });\n *\n * // In your server middleware / API route handler:\n * await cencori.telemetry.reportWebRequest({\n * host: 'dochat-zeta.vercel.app',\n * method: 'GET',\n * path: '/api/chat',\n * statusCode: 200,\n * });\n */\n\nimport type { CencoriConfig } from '../types';\n\nexport interface WebTelemetryPayload {\n /** The hostname of your application, e.g. \"dochat-zeta.vercel.app\" */\n host: string;\n /** HTTP method: GET, POST, PUT, DELETE, etc. */\n method: string;\n /** Request path, e.g. \"/api/chat\" */\n path: string;\n /** HTTP status code returned */\n statusCode: number;\n\n /** Optional unique request ID for tracing */\n requestId?: string;\n /** Query string without the leading \"?\" */\n queryString?: string;\n /** Human-readable log message */\n message?: string;\n /** Client User-Agent string */\n userAgent?: string;\n /** Referer header value */\n referer?: string;\n /** Client IP address */\n ipAddress?: string;\n /** ISO 3166-1 alpha-2 country code */\n countryCode?: string;\n /** Request latency in milliseconds */\n latencyMs?: number;\n}\n\nexport class TelemetryClient {\n private config: Required<CencoriConfig>;\n\n constructor(config: Required<CencoriConfig>) {\n this.config = config;\n }\n\n /**\n * Report a web request to the Cencori dashboard.\n *\n * Fire-and-forget — this method never throws and never blocks\n * your application. If the request fails, the error is silently\n * swallowed so it cannot disrupt your app's critical path.\n *\n * @param payload - Web request details to log\n *\n * @example\n * await cencori.telemetry.reportWebRequest({\n * host: req.headers.get('host') || 'unknown',\n * method: req.method,\n * path: new URL(req.url).pathname,\n * statusCode: response.status,\n * userAgent: req.headers.get('user-agent') || undefined,\n * latencyMs: Date.now() - startTime,\n * });\n */\n async reportWebRequest(payload: WebTelemetryPayload): Promise<void> {\n try {\n const url = `${this.config.baseUrl}/api/v1/telemetry/web`;\n\n await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'CENCORI_API_KEY': this.config.apiKey,\n },\n body: JSON.stringify(payload),\n });\n } catch {\n // Telemetry is best-effort — never disrupt the customer's app.\n }\n }\n}\n","/**\n * Utility functions for Cencori SDK\n */\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n/**\n * Fetch with automatic retry on 5xx errors\n * Uses exponential backoff: 1s, 2s, 4s\n */\nexport async function fetchWithRetry(\n url: string,\n options: RequestInit,\n maxRetries = 3\n): Promise<Response> {\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n try {\n const response = await fetch(url, options);\n\n // Return immediately if request succeeded or if it's a client error (4xx)\n if (response.ok || (response.status >= 400 && response.status < 500)) {\n return response;\n }\n\n // Retry on 5xx errors\n lastError = new Error(`HTTP ${response.status}: ${response.statusText}`);\n\n // Don't retry on last attempt\n if (attempt === maxRetries - 1) {\n return response;\n }\n\n // Exponential backoff: 1s, 2s, 4s\n await sleep(Math.pow(2, attempt) * 1000);\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n // Don't retry on last attempt\n if (attempt === maxRetries - 1) {\n throw lastError;\n }\n\n // Exponential backoff\n await sleep(Math.pow(2, attempt) * 1000);\n }\n }\n\n throw lastError || new Error('Max retries reached');\n}\n","/**\n * Cencori Error Classes\n * \n * Custom error types for better error handling\n */\n\nexport class CencoriError extends Error {\n constructor(\n message: string,\n public statusCode?: number,\n public code?: string\n ) {\n super(message);\n this.name = 'CencoriError';\n Object.setPrototypeOf(this, CencoriError.prototype);\n }\n}\n\nexport class AuthenticationError extends CencoriError {\n constructor(message = 'Invalid API key') {\n super(message, 401, 'INVALID_API_KEY');\n this.name = 'AuthenticationError';\n Object.setPrototypeOf(this, AuthenticationError.prototype);\n }\n}\n\nexport class RateLimitError extends CencoriError {\n constructor(message = 'Rate limit exceeded') {\n super(message, 429, 'RATE_LIMIT_EXCEEDED');\n this.name = 'RateLimitError';\n Object.setPrototypeOf(this, RateLimitError.prototype);\n }\n}\n\nexport class SafetyError extends CencoriError {\n constructor(message = 'Content safety violation', public reasons?: string[]) {\n super(message, 400, 'SAFETY_VIOLATION');\n this.name = 'SafetyError';\n Object.setPrototypeOf(this, SafetyError.prototype);\n }\n}\n","/**\n * Cencori - Unified AI Infrastructure SDK\n * \n * One SDK for AI Gateway, Compute, Workflow, and Storage.\n * Every operation is secured, logged, and tracked.\n * \n * @example\n * import { Cencori } from 'cencori';\n * \n * const cencori = new Cencori({ apiKey: 'csk_...' });\n * \n * // AI Gateway\n * const response = await cencori.ai.chat({\n * model: 'gpt-4o',\n * messages: [{ role: 'user', content: 'Hello!' }]\n * });\n * \n * // Compute (coming soon)\n * await cencori.compute.run('my-function', { input: data });\n * \n * // Workflow (coming soon)\n * await cencori.workflow.trigger('pipeline-id', { data });\n * \n * // Storage (coming soon)\n * await cencori.storage.vectors.search('query');\n */\n\nimport type { CencoriConfig, RequestOptions } from './types';\nimport { AINamespace } from './ai';\nimport { AgentsNamespace } from './agents';\nimport { VisionNamespace } from './vision';\nimport { VoiceNamespace } from './voice';\nimport { DocumentsNamespace } from './documents';\nimport { SessionsNamespace } from './sessions';\nimport { ComputeNamespace } from './compute';\nimport { WorkflowNamespace } from './workflow';\nimport { StorageNamespace } from './storage';\nimport { MemoryClient } from './memory';\nimport { ChatNamespace } from './chat';\nimport { TelemetryClient } from './telemetry';\nimport { fetchWithRetry } from './utils';\nimport {\n CencoriError,\n AuthenticationError,\n RateLimitError,\n SafetyError\n} from './errors';\n\nconst DEFAULT_BASE_URL = 'https://api.cencori.com';\n\ninterface ErrorResponse {\n error?: string;\n reasons?: string[];\n}\n\nexport class Cencori {\n private config: Required<CencoriConfig>;\n\n /**\n * AI Gateway - Chat, completions, embeddings, responses with security & observability\n * \n * @example\n * await cencori.ai.chat({ model: 'gpt-4o', messages: [...] });\n */\n readonly ai: AINamespace;\n\n /**\n * Chat - OpenAI-compatible chat completions with gateway memory.\n * One line makes chat stateful.\n *\n * @example\n * const response = await cencori.chat.completions.create({\n * model: 'gpt-4o',\n * messages: [{ role: 'user', content: 'What did we agree about pricing?' }],\n * memory: { userId: session.user.id },\n * });\n */\n readonly chat: ChatNamespace;\n\n /**\n * Vision - Analyze, describe, OCR, and classify images\n *\n * @example\n * const result = await cencori.vision.analyze({\n * image: { url: 'https://example.com/photo.jpg' },\n * prompt: 'What breed is this dog?'\n * });\n *\n * @example\n * const { text } = await cencori.vision.ocr({\n * image: { base64, mimeType: 'image/png' }\n * });\n */\n readonly vision: VisionNamespace;\n\n /**\n * Voice - Text-to-speech and speech-to-text across providers\n *\n * @example\n * const { audio } = await cencori.voice.speak({\n * input: 'Hello from Cencori.',\n * model: 'aura-asteria-en', // Deepgram; provider inferred from model\n * });\n *\n * @example\n * const { text } = await cencori.voice.transcribe({\n * audio: fileBytes,\n * model: 'nova-3',\n * });\n *\n * @example\n * const { segments } = await cencori.voice.diarize({\n * audio: fileBytes,\n * model: 'assemblyai-universal',\n * });\n */\n readonly voice: VoiceNamespace;\n\n /**\n * Documents - Extract text from PDFs and images, summarize, and query\n *\n * @example\n * const { text } = await cencori.documents.extract({\n * document: { url: 'https://example.com/contract.pdf' }\n * });\n *\n * @example\n * const { summary } = await cencori.documents.summarize({\n * document: { url: 'https://example.com/report.pdf' }\n * });\n *\n * @example\n * const { answer } = await cencori.documents.query({\n * document: { url },\n * question: 'What is the total revenue for Q3?',\n * });\n */\n readonly documents: DocumentsNamespace;\n\n /**\n * Agents - Create and manage AI agents programmatically.\n * \n * @example\n * const agent = await cencori.agents.create({\n * name: 'my-agent',\n * config: { model: 'gpt-4o', system_prompt: 'You are a helpful assistant.' }\n * });\n * \n * @example\n * const key = await cencori.agents.createKey(agent.id, { name: 'prod-key' });\n */\n readonly agents: AgentsNamespace;\n\n /**\n * Compute - Serverless functions & GPU access\n * \n * 🚧 Coming Soon\n * \n * @example\n * await cencori.compute.run('my-function', { input: data });\n */\n readonly compute: ComputeNamespace;\n\n /**\n * Workflow - AI pipelines & orchestration\n * \n * 🚧 Coming Soon\n * \n * @example\n * await cencori.workflow.trigger('pipeline-id', { data });\n */\n readonly workflow: WorkflowNamespace;\n\n /**\n * Storage - Vector database, knowledge base, RAG\n * \n * 🚧 Coming Soon\n * \n * @example\n * await cencori.storage.vectors.search('query');\n */\n readonly storage: StorageNamespace;\n\n /**\n * Memory - Vector storage for RAG, conversation history, semantic search\n * \n * @example\n * await cencori.memory.store({ namespace: 'conversations', content: '...' });\n * await cencori.memory.search({ namespace: 'conversations', query: '...' });\n */\n readonly memory: MemoryClient;\n\n /**\n * Sessions - Durable execution sessions for AI agents with pause/resume and event sourcing\n * \n * @example\n * const sessions = await cencori.sessions.list({ status: 'active' });\n * const session = await cencori.sessions.create({ agent_id: 'ag_...' });\n * await cencori.sessions.submitTurn(session.id, { input: 'Hello' });\n */\n readonly sessions: SessionsNamespace;\n\n /**\n * Telemetry - Report web traffic from your app to the Cencori dashboard\n * \n * @example\n * await cencori.telemetry.reportWebRequest({\n * host: 'dochat-zeta.vercel.app',\n * method: 'GET',\n * path: '/api/chat',\n * statusCode: 200,\n * });\n */\n readonly telemetry: TelemetryClient;\n\n /**\n * Create a new Cencori client\n * \n * @param config - Configuration options\n * @param config.apiKey - Your Cencori API key (starts with 'csk_')\n * @param config.baseUrl - Custom API base URL (default: https://cencori.com)\n * @param config.headers - Custom headers to include in requests\n * \n * @example\n * const cencori = new Cencori({ \n * apiKey: process.env.CENCORI_API_KEY \n * });\n */\n constructor(config: CencoriConfig = {}) {\n const apiKey = config.apiKey ?? process.env.CENCORI_API_KEY;\n\n if (!apiKey) {\n throw new Error(\n 'Cencori API key is required. ' +\n 'Pass it via new Cencori({ apiKey: \"csk_...\" }) or set CENCORI_API_KEY environment variable.'\n );\n }\n\n this.config = {\n apiKey,\n baseUrl: config.baseUrl ?? DEFAULT_BASE_URL,\n headers: config.headers ?? {},\n };\n\n // Initialize namespaces\n this.ai = new AINamespace(this.config);\n this.chat = new ChatNamespace(this.config);\n this.vision = new VisionNamespace(this.config);\n this.voice = new VoiceNamespace(this.config);\n this.documents = new DocumentsNamespace(this.config);\n this.agents = new AgentsNamespace(this.config);\n this.compute = new ComputeNamespace();\n this.workflow = new WorkflowNamespace();\n this.storage = new StorageNamespace();\n this.memory = new MemoryClient(this.config);\n this.sessions = new SessionsNamespace(this.config);\n this.telemetry = new TelemetryClient(this.config);\n }\n\n /**\n * Get the base URL for API calls\n */\n getBaseUrl(): string {\n return this.config.baseUrl;\n }\n\n /**\n * Get the API key\n */\n getApiKey(): string {\n return this.config.apiKey;\n }\n\n /**\n * Get the current configuration (API key is masked)\n */\n getConfig(): { baseUrl: string; apiKeyHint: string } {\n return {\n baseUrl: this.config.baseUrl,\n apiKeyHint: `${this.config.apiKey.slice(0, 6)}...${this.config.apiKey.slice(-4)}`,\n };\n }\n\n /**\n * Make a generic API request with retry and error handling\n * \n * @example\n * const data = await cencori.request('/api/custom-endpoint', {\n * method: 'POST',\n * body: JSON.stringify({ foo: 'bar' })\n * });\n */\n async request<T>(endpoint: string, options: RequestOptions): Promise<T> {\n const url = `${this.config.baseUrl}${endpoint}`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'CENCORI_API_KEY': this.config.apiKey,\n ...this.config.headers,\n ...options.headers\n };\n\n try {\n const response = await fetchWithRetry(url, {\n method: options.method,\n headers,\n body: options.body\n });\n\n const data: unknown = await response.json();\n\n // Handle API errors\n if (!response.ok) {\n const errorData = data as ErrorResponse;\n\n if (response.status === 401) {\n throw new AuthenticationError(errorData.error || 'Invalid API key');\n }\n if (response.status === 429) {\n throw new RateLimitError(errorData.error || 'Rate limit exceeded');\n }\n if (response.status === 400 && errorData.reasons) {\n throw new SafetyError(errorData.error, errorData.reasons);\n }\n throw new CencoriError(\n errorData.error || 'Request failed',\n response.status\n );\n }\n\n return data as T;\n } catch (error) {\n // Re-throw custom errors\n if (error instanceof CencoriError) {\n throw error;\n }\n\n // Wrap unknown errors\n throw new CencoriError(\n error instanceof Error ? error.message : 'Unknown error occurred'\n );\n }\n }\n}\n\n// Export types\nexport type { CencoriConfig, ChatRequest, ChatResponse, ChatMessage, RequestOptions } from './types';\nexport type { AINamespace } from './ai';\nexport type { AgentsNamespace, Agent, AgentConfig, AgentListItem, CreateAgentParams, UpdateAgentParams, AgentKey, CreateAgentKeyParams } from './agents';\nexport type { ComputeNamespace } from './compute';\nexport type { WorkflowNamespace } from './workflow';\nexport type { StorageNamespace } from './storage';\nexport type { MemoryClient } from './memory';\nexport type { SessionsNamespace, Session, SessionEvent, CreateSessionParams, TurnParams, PaginatedResponse, SessionListParams } from './sessions';\nexport type { TelemetryClient, WebTelemetryPayload } from './telemetry';\n\n","/**\n * Cencori Chat Language Model\n * \n * Implements the Vercel AI SDK's LanguageModelV3 interface (AI SDK v6 compatible)\n */\n\nimport type {\n LanguageModelV3,\n LanguageModelV3CallOptions,\n LanguageModelV3GenerateResult,\n LanguageModelV3StreamResult,\n LanguageModelV3StreamPart,\n LanguageModelV3Content,\n LanguageModelV3Usage,\n LanguageModelV3FinishReason,\n SharedV3Warning,\n} from '@ai-sdk/provider';\n\nexport interface CencoriChatModelSettings {\n apiKey: string;\n baseUrl: string;\n headers?: Record<string, string>;\n userId?: string;\n}\n\ninterface CencoriMessage {\n role: 'system' | 'user' | 'assistant' | 'tool';\n content: string;\n toolCallId?: string;\n}\n\n/**\n * Tool definition in Cencori format (OpenAI-compatible)\n */\ninterface CencoriTool {\n type: 'function';\n function: {\n name: string;\n description: string;\n parameters: Record<string, any>;\n };\n}\n\n/**\n * Tool call from the model\n */\ninterface CencoriToolCall {\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n}\n\ninterface CencoriResponse {\n content: string;\n model: string;\n provider: string;\n usage: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n };\n cost_usd: number;\n finish_reason?: string;\n tool_calls?: CencoriToolCall[];\n}\n\ninterface CencoriStreamChunk {\n delta: string;\n finish_reason?: string;\n tool_calls?: CencoriToolCall[];\n}\n\nexport class CencoriChatLanguageModel implements LanguageModelV3 {\n readonly specificationVersion = 'v3' as const;\n readonly provider = 'cencori';\n\n readonly modelId: string;\n readonly supportedUrls: Record<string, RegExp[]> = {};\n private readonly settings: CencoriChatModelSettings;\n\n constructor(modelId: string, settings: CencoriChatModelSettings) {\n this.modelId = modelId;\n this.settings = settings;\n }\n\n private getHeaders(): Record<string, string> {\n return {\n 'Content-Type': 'application/json',\n 'CENCORI_API_KEY': this.settings.apiKey,\n ...this.settings.headers,\n };\n }\n\n private convertMessages(options: LanguageModelV3CallOptions): CencoriMessage[] {\n const messages: CencoriMessage[] = [];\n\n // In V3, options.prompt is directly an array of LanguageModelV3Message\n const promptMessages = options.prompt;\n\n if (!promptMessages || !Array.isArray(promptMessages)) {\n return messages;\n }\n\n for (const msg of promptMessages) {\n let content = '';\n\n if (msg.role === 'system') {\n // System messages have content as string directly\n content = msg.content as string;\n } else if (msg.role === 'user' || msg.role === 'assistant') {\n // User and assistant messages have content as array of parts\n const msgContent = msg.content;\n if (Array.isArray(msgContent)) {\n content = msgContent\n .filter((part: { type: string }) => part.type === 'text')\n .map((part: { type: string; text?: string }) => part.text || '')\n .join('');\n } else if (typeof msgContent === 'string') {\n content = msgContent;\n }\n }\n\n if (content && (msg.role === 'system' || msg.role === 'user' || msg.role === 'assistant')) {\n messages.push({\n role: msg.role as 'system' | 'user' | 'assistant',\n content,\n });\n }\n }\n\n return messages;\n }\n\n private mapFinishReason(reason?: string): LanguageModelV3FinishReason {\n let unified: 'stop' | 'length' | 'content-filter' | 'tool-calls' | 'error' | 'other';\n\n switch (reason) {\n case 'stop':\n case 'end_turn':\n unified = 'stop';\n break;\n case 'length':\n case 'max_tokens':\n unified = 'length';\n break;\n case 'content_filter':\n unified = 'content-filter';\n break;\n case 'tool_calls':\n case 'tool-calls':\n unified = 'tool-calls';\n break;\n case 'error':\n unified = 'error';\n break;\n default:\n unified = 'stop';\n }\n\n return { unified, raw: reason };\n }\n\n private buildUsage(inputTokens: number, outputTokens: number): LanguageModelV3Usage {\n return {\n inputTokens: {\n total: inputTokens,\n noCache: inputTokens,\n cacheRead: undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: outputTokens,\n text: outputTokens,\n reasoning: undefined,\n },\n };\n }\n\n /**\n * Convert Vercel AI SDK tools to Cencori format\n */\n private convertTools(options: LanguageModelV3CallOptions): CencoriTool[] | undefined {\n if (!options.tools || options.tools.length === 0) {\n return undefined;\n }\n\n return options.tools\n .filter(t => t.type === 'function')\n .map(t => ({\n type: 'function' as const,\n function: {\n name: t.name,\n description: t.description || '',\n parameters: t.inputSchema as Record<string, any>,\n },\n }));\n }\n\n /**\n * Convert Vercel AI SDK tool choice to Cencori format\n */\n private convertToolChoice(options: LanguageModelV3CallOptions): string | { type: 'function'; function: { name: string } } | undefined {\n const tc = options.toolChoice;\n if (!tc) return undefined;\n\n switch (tc.type) {\n case 'auto':\n return 'auto';\n case 'none':\n return 'none';\n case 'required':\n return 'required';\n case 'tool':\n return { type: 'function', function: { name: tc.toolName } };\n default:\n return undefined;\n }\n }\n\n async doGenerate(options: LanguageModelV3CallOptions): Promise<LanguageModelV3GenerateResult> {\n const messages = this.convertMessages(options);\n const tools = this.convertTools(options);\n const toolChoice = this.convertToolChoice(options);\n\n const response = await fetch(`${this.settings.baseUrl}/api/ai/chat`, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify({\n messages,\n model: this.modelId,\n temperature: options.temperature,\n maxTokens: options.maxOutputTokens,\n stream: false,\n userId: this.settings.userId,\n tools,\n toolChoice,\n }),\n signal: options.abortSignal,\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: 'Unknown error' })) as { error?: string };\n throw new Error(`Cencori API error: ${error.error || response.statusText}`);\n }\n\n const data = await response.json() as CencoriResponse;\n\n // Build content array\n const content: LanguageModelV3Content[] = [];\n\n // Add text content if present\n if (data.content) {\n content.push({\n type: 'text',\n text: data.content,\n providerMetadata: undefined,\n });\n }\n\n // Add tool calls if present\n if (data.tool_calls && data.tool_calls.length > 0) {\n for (const tc of data.tool_calls) {\n content.push({\n type: 'tool-call',\n toolCallId: tc.id,\n toolName: tc.function.name,\n input: tc.function.arguments,\n providerMetadata: undefined,\n });\n }\n }\n\n const warnings: SharedV3Warning[] = [];\n\n return {\n content,\n finishReason: this.mapFinishReason(data.finish_reason),\n usage: this.buildUsage(data.usage.prompt_tokens, data.usage.completion_tokens),\n warnings,\n };\n }\n\n async doStream(options: LanguageModelV3CallOptions): Promise<LanguageModelV3StreamResult> {\n const messages = this.convertMessages(options);\n const tools = this.convertTools(options);\n const toolChoice = this.convertToolChoice(options);\n const self = this;\n\n const response = await fetch(`${this.settings.baseUrl}/api/ai/chat`, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify({\n messages,\n model: this.modelId,\n temperature: options.temperature,\n maxTokens: options.maxOutputTokens,\n stream: true,\n userId: this.settings.userId,\n tools,\n toolChoice,\n }),\n signal: options.abortSignal,\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: 'Unknown error' })) as { error?: string };\n throw new Error(`Cencori API error: ${error.error || response.statusText}`);\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 const inputTokens = 0;\n let outputTokens = 0;\n const textPartId = 'text-0';\n let started = false;\n\n const stream = new ReadableStream<LanguageModelV3StreamPart>({\n async pull(controller) {\n try {\n const { done, value } = await reader.read();\n\n if (done) {\n // End text block and finish\n if (started) {\n controller.enqueue({\n type: 'text-end',\n id: textPartId,\n });\n }\n controller.enqueue({\n type: 'finish',\n finishReason: self.mapFinishReason('stop'),\n usage: self.buildUsage(inputTokens, outputTokens),\n });\n controller.close();\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 if (started) {\n controller.enqueue({\n type: 'text-end',\n id: textPartId,\n });\n }\n controller.enqueue({\n type: 'finish',\n finishReason: self.mapFinishReason('stop'),\n usage: self.buildUsage(inputTokens, outputTokens),\n });\n controller.close();\n return;\n }\n\n try {\n const chunk = JSON.parse(data) as CencoriStreamChunk;\n\n // Handle text delta\n if (chunk.delta) {\n // Start text if not started\n if (!started) {\n started = true;\n controller.enqueue({\n type: 'text-start',\n id: textPartId,\n });\n }\n\n outputTokens += Math.ceil(chunk.delta.length / 4); // Rough estimate\n controller.enqueue({\n type: 'text-delta',\n id: textPartId,\n delta: chunk.delta,\n });\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 // Emit complete tool-call event\n controller.enqueue({\n type: 'tool-call',\n toolCallId: tc.id,\n toolName: tc.function.name,\n input: tc.function.arguments,\n providerMetadata: undefined,\n });\n }\n }\n\n if (chunk.finish_reason) {\n if (started) {\n controller.enqueue({\n type: 'text-end',\n id: textPartId,\n });\n }\n controller.enqueue({\n type: 'finish',\n finishReason: self.mapFinishReason(chunk.finish_reason),\n usage: self.buildUsage(inputTokens, outputTokens),\n });\n controller.close();\n return;\n }\n } catch {\n // Skip malformed JSON\n }\n }\n } catch (error) {\n controller.error(error);\n }\n },\n cancel() {\n reader.cancel();\n },\n });\n\n return {\n stream,\n };\n }\n}\n","/**\n * Cencori AI Provider for Vercel AI SDK\n * \n * Use Cencori with streamText(), generateText(), and useChat()\n */\n\nimport { CencoriChatLanguageModel } from './cencori-chat-model';\nimport type { CencoriProviderSettings, CencoriChatSettings } from './types';\n\nexport interface CencoriProvider {\n /**\n * Create a Cencori chat model for use with Vercel AI SDK\n * \n * @param modelId - The model ID (e.g., 'gemini-2.5-flash', 'gpt-4o', 'claude-3-opus')\n * @param settings - Optional model-specific settings\n * @returns A LanguageModelV1 compatible model\n * \n * @example\n * import { cencori } from 'cencori';\n * import { streamText } from 'ai';\n * \n * const result = await streamText({\n * model: cencori('gemini-2.5-flash'),\n * messages: [{ role: 'user', content: 'Hello!' }]\n * });\n */\n (modelId: string, settings?: CencoriChatSettings): CencoriChatLanguageModel;\n\n /**\n * Create a chat model (alias for the provider function)\n */\n chat: (modelId: string, settings?: CencoriChatSettings) => CencoriChatLanguageModel;\n}\n\n/**\n * Create a Cencori provider instance\n * \n * @param options - Provider configuration options\n * @returns A Cencori provider\n * \n * @example\n * import { createCencori } from 'cencori';\n * \n * const cencori = createCencori({\n * apiKey: process.env.CENCORI_API_KEY\n * });\n * \n * const result = await streamText({\n * model: cencori('gemini-2.5-flash'),\n * messages: [{ role: 'user', content: 'Hello!' }]\n * });\n */\nexport function createCencori(options: CencoriProviderSettings = {}): CencoriProvider {\n const baseUrl = options.baseUrl ?? 'https://cencori.com';\n const apiKey = options.apiKey ?? process.env.CENCORI_API_KEY;\n\n if (!apiKey) {\n throw new Error('Cencori API key is required. Pass it via options.apiKey or set CENCORI_API_KEY environment variable.');\n }\n\n const createModel = (modelId: string, settings: CencoriChatSettings = {}) => {\n return new CencoriChatLanguageModel(modelId, {\n apiKey,\n baseUrl,\n headers: options.headers,\n ...settings,\n });\n };\n\n const provider = function (modelId: string, settings?: CencoriChatSettings) {\n return createModel(modelId, settings);\n } as CencoriProvider;\n\n provider.chat = createModel;\n\n return provider;\n}\n\n/**\n * Default Cencori provider instance\n * Uses CENCORI_API_KEY environment variable (lazy initialization)\n * \n * @example\n * import { cencori } from 'cencori';\n * import { streamText } from 'ai';\n * \n * const result = await streamText({\n * model: cencori('gemini-2.5-flash'),\n * messages: [{ role: 'user', content: 'Hello!' }]\n * });\n */\nexport const cencori: CencoriProvider = function (modelId: string, settings?: CencoriChatSettings) {\n const apiKey = process.env.CENCORI_API_KEY;\n if (!apiKey) {\n throw new Error('CENCORI_API_KEY environment variable is required. Set it or use createCencori({ apiKey: \"...\" }) instead.');\n }\n return new CencoriChatLanguageModel(modelId, {\n apiKey,\n baseUrl: 'https://cencori.com',\n ...settings,\n });\n} as CencoriProvider;\n\ncencori.chat = cencori;\n"],"mappings":"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","names":["toBody"]}