cencori 1.3.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +40 -0
- package/dist/documents/index.d.mts +94 -0
- package/dist/documents/index.d.ts +94 -0
- package/dist/documents/index.js +88 -0
- package/dist/documents/index.js.map +1 -0
- package/dist/documents/index.mjs +63 -0
- package/dist/documents/index.mjs.map +1 -0
- package/dist/index.d.mts +24 -2
- package/dist/index.d.ts +24 -2
- package/dist/index.js +125 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +124 -0
- package/dist/index.mjs.map +1 -1
- package/dist/vision/index.d.mts +25 -2
- package/dist/vision/index.d.ts +25 -2
- package/dist/vision/index.js +62 -0
- package/dist/vision/index.js.map +1 -1
- package/dist/vision/index.mjs +62 -0
- package/dist/vision/index.mjs.map +1 -1
- package/package.json +6 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ai/index.ts","../src/agents/index.ts","../src/vision/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 image: VisionImage;\n prompt?: string;\n model?: string;\n maxTokens?: number;\n temperature?: number;\n responseFormat?: 'text' | 'json';\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 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 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 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","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 { 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 * 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.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":[]}
|
|
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"]}
|