{"_id":"@aitofy/ai-chat","_rev":"2-4e92af75d414585cd54a667476b468d4","name":"@aitofy/ai-chat","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"name":"@aitofy/ai-chat","version":"0.1.0","keywords":["ai","ai-sdk","openai","chatgpt","gpt-4","gpt-5","claude","anthropic","gemini","google-ai","grok","xai","groq","deepseek","llm","llm-api","chat","chat-api","unified-api","multi-provider","sdk","typescript","zero-dependency","cost-tracking","streaming","function-calling"],"author":{"name":"Aitofy","email":"hello@aitofy.dev"},"license":"MIT","_id":"@aitofy/ai-chat@0.1.0","maintainers":[{"name":"masterpk","email":"huanthuyon671@gmail.com"}],"homepage":"https://aitofy.dev/ai-chat","bugs":{"url":"https://github.com/aitofy-dev/ai-chat/issues"},"dist":{"shasum":"373c3f00d9820241236d86543f457ca410e40225","tarball":"https://registry.npmjs.org/@aitofy/ai-chat/-/ai-chat-0.1.0.tgz","fileCount":9,"integrity":"sha512-J1Y8Upoo12hdtwkTnZdgR2a/+02TkXXQ2Zwl/qYolHKZmAUWoBa1SsAjL06o/AJZBQZL86mZakK60it9Uy0K1g==","signatures":[{"sig":"MEUCIQCkAj7sav+X5Cny/sVuqkajXywFQbRnvS2Y8+T0Sa7a2AIgImUnh5mZR9bcJFKwd/y+zAh8uvTjBQz1EZhEiNzj/KQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":411923},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"a997ce9b33093d329e4384c8ed434934c1caf7fe","scripts":{"dev":"tsup --watch","test":"vitest run src/index.test.ts","build":"tsup","test:all":"vitest run","test:run":"vitest run src/index.test.ts","typecheck":"tsc --noEmit","prepublishOnly":"npm run build","test:integration":"vitest run src/integration.test.ts"},"_npmUser":{"name":"masterpk","email":"huanthuyon671@gmail.com"},"repository":{"url":"git+https://github.com/aitofy-dev/ai-chat.git","type":"git"},"_npmVersion":"10.8.2","description":"Lightweight Chat/LLM SDK - OpenAI, Claude, Gemini, Grok, Groq in one unified API. Zero dependencies, Result-based error handling.","directories":{},"sideEffects":false,"_nodeVersion":"20.19.0","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","tsup":"^8.0.1","dotenv":"^17.2.3","vitest":"^1.1.0","typescript":"^5.3.0","@types/node":"^20.10.0"},"_npmOperationalInternal":{"tmp":"tmp/ai-chat_0.1.0_1767790346084_0.42728676286366407","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@aitofy/ai-chat","version":"0.1.1","description":"Lightweight Chat/LLM SDK - OpenAI, Claude, Gemini, Grok, Groq in one unified API. Zero dependencies, Result-based error handling.","keywords":["ai","ai-sdk","openai","chatgpt","gpt-4","gpt-5","claude","anthropic","gemini","google-ai","grok","xai","groq","deepseek","llm","llm-api","chat","chat-api","unified-api","multi-provider","sdk","typescript","zero-dependency","cost-tracking","streaming","function-calling"],"author":{"name":"Aitofy","email":"hello@aitofy.dev"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/aitofy-dev/ai-chat.git"},"homepage":"https://aitofy.dev/ai-chat","bugs":{"url":"https://github.com/aitofy-dev/ai-chat/issues"},"main":"./dist/index.js","module":"./dist/index.mjs","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","build":"tsup","test":"vitest run src/index.test.ts","test:run":"vitest run src/index.test.ts","test:integration":"vitest run src/integration.test.ts","test:all":"vitest run","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"devDependencies":{"@types/node":"^20.10.0","dotenv":"^17.2.3","tsup":"^8.0.1","tsx":"^4.21.0","typescript":"^5.3.0","vitest":"^1.1.0"},"engines":{"node":">=18.0.0"},"sideEffects":false,"_id":"@aitofy/ai-chat@0.1.1","gitHead":"f2a9a0c87cc4c78852741720aea61f29b99488b0","_nodeVersion":"20.19.0","_npmVersion":"10.8.2","dist":{"integrity":"sha512-H6ZCmxmdZgSgKQbf37zcsD5RUq32kM+8XPrn5dJEDczripwvURXky5RrQO7auy8XqijAyPsJ8VNFLlrcfxOJuA==","shasum":"d9112d890dec01a70f8588eda9e22ae5135eb00d","tarball":"https://registry.npmjs.org/@aitofy/ai-chat/-/ai-chat-0.1.1.tgz","fileCount":10,"unpackedSize":415738,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIEsiiqvLKav3Hv8A7UEPd2b65yhzB5k2GGT90OF655RuAiAK+Y8GSR9Tc8heUDDpVjGGYwlai904eUN2YiVD2Tm5Bw=="}]},"_npmUser":{"name":"masterpk","email":"huanthuyon671@gmail.com"},"directories":{},"maintainers":[{"name":"masterpk","email":"huanthuyon671@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ai-chat_0.1.1_1767802000262_0.3372005220047396"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-07T12:52:25.996Z","modified":"2026-01-07T16:06:40.665Z","0.1.0":"2026-01-07T12:52:26.246Z","0.1.1":"2026-01-07T16:06:40.422Z"},"bugs":{"url":"https://github.com/aitofy-dev/ai-chat/issues"},"author":{"name":"Aitofy","email":"hello@aitofy.dev"},"license":"MIT","homepage":"https://aitofy.dev/ai-chat","keywords":["ai","ai-sdk","openai","chatgpt","gpt-4","gpt-5","claude","anthropic","gemini","google-ai","grok","xai","groq","deepseek","llm","llm-api","chat","chat-api","unified-api","multi-provider","sdk","typescript","zero-dependency","cost-tracking","streaming","function-calling"],"repository":{"type":"git","url":"git+https://github.com/aitofy-dev/ai-chat.git"},"description":"Lightweight Chat/LLM SDK - OpenAI, Claude, Gemini, Grok, Groq in one unified API. Zero dependencies, Result-based error handling.","maintainers":[{"name":"masterpk","email":"huanthuyon671@gmail.com"}],"readme":"# @aitofy/ai-chat\n\n> Lightweight Chat/LLM SDK - OpenAI, Claude, Gemini, Grok in one unified API\n\n[![npm version](https://badge.fury.io/js/%40aitofy%2Fai-chat.svg)](https://www.npmjs.com/package/@aitofy/ai-chat)\n[![Bundle Size](https://img.shields.io/bundlephobia/minzip/@aitofy/ai-chat)](https://bundlephobia.com/package/@aitofy/ai-chat)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\n## ✨ Features\n\n- 🚀 **Zero dependencies** - Uses native `fetch`, no bloat\n- 🎯 **Result-based** - No try-catch needed, clear error handling\n- 💰 **Cost tracking** - Know exactly what each request costs\n- 📊 **Cost analytics** - Daily/weekly/monthly cost reports saved locally\n- ⚡ **~52KB bundle** - Tiny footprint\n- 🔧 **Fluent API** - Chainable, readable code\n- 🌐 **6 providers** - OpenAI, Anthropic, Google, xAI, Groq, DeepSeek\n- 🎯 **90+ models** - All major models with built-in pricing\n- 🏷️ **Model aliases** - Use `fast`, `best`, `cheap` instead of model names\n- 🎨 **Custom aliases** - Override defaults or add your own\n- ⚙️ **Global defaults** - Set once, apply to all requests\n- 🔄 **Auto-retry** - Exponential backoff for rate limits\n- 🔀 **Fallback chain** - Auto-switch providers on failure\n- 💸 **Budget limits** - Set max cost per request/session\n- 👁️ **Vision support** - Image input via URL or base64\n- 🛠️ **Tools/Functions** - Function calling support\n\n## 📦 Installation\n\n```bash\nnpm install @aitofy/ai-chat\n# or\npnpm add @aitofy/ai-chat\n# or\nyarn add @aitofy/ai-chat\n```\n\n## 🚀 Quick Start (Zero Config!)\n\n```typescript\n// Just set env vars - that's it!\n// OPENAI_API_KEY=sk-xxx\n// ANTHROPIC_API_KEY=sk-ant-xxx\n\nimport { ask } from '@aitofy/ai-chat';\n\n// One-liner with auto-config\nconst result = await ask('fast', 'What is 2+2?');\n\nif (result.ok) {\n  console.log(result.data.content);  // \"4\"\n  console.log(result.data.cost);     // { total: 0.00001 }\n}\n```\n\n## 🏷️ Model Aliases\n\nDon't know which model to use? Use aliases!\n\n```typescript\nawait ask('fast', 'Quick question');      // → gemini-2.5-flash-lite\nawait ask('fastest', 'Urgent!');          // → llama-3.1-8b-instant (Groq)\nawait ask('cheap', 'Save money');         // → gpt-4o-mini\nawait ask('cheapest', 'Budget mode');     // → llama-3.1-8b-instant\nawait ask('best', 'Important task');      // → claude-opus-4.5\nawait ask('smartest', 'Complex task');    // → gpt-5.2-pro\nawait ask('code', 'Write a function');    // → gpt-5.1-codex\nawait ask('vision', 'Describe image');    // → gpt-4o\nawait ask('long', 'Very long text');      // → gemini-2.5-pro (1M+ tokens)\nawait ask('reasoning', 'Think step by step'); // → o3\nawait ask('thinking', 'Deep analysis');   // → o1\nawait ask('image', 'Generate an image');  // → imagen-4\nawait ask('video', 'Generate a video');   // → veo-3.1\n```\n\n### Custom Aliases\n\nOverride defaults or add your own:\n\n```typescript\nconst ai = new AI({\n  aliases: {\n    'fast': 'gpt-4o-mini',          // Override default\n    'mybot': 'claude-sonnet-4',     // Add new alias\n  }\n});\n\n// Or set at runtime\nai.setAlias('fast', 'gemini-2.5-flash');\n\n// Set multiple\nai.setAliases({\n  'dev': 'gpt-4o-mini',\n  'prod': 'gpt-5.2-pro'\n});\n\n// Use your aliases\nawait ai.ask('mybot', 'Hello');\n\n// Check resolution\nconsole.log(ai.resolveAlias('fast')); // 'gemini-2.5-flash'\nconsole.log(ai.aliases);               // All current aliases\n```\n\n### Explore Models & Pricing\n\n```typescript\nconst ai = new AI();\n\n// List all 90+ models\nconsole.log(ai.models());  // ['gpt-4o', 'claude-sonnet-4', ...]\n\n// List models for a provider\nconsole.log(ai.modelsFor('openai'));  // ['gpt-4o', 'gpt-5.2', 'o1', ...]\n\n// Get pricing for any model\nconsole.log(ai.pricing('gpt-4o'));  // { input: 2.5, output: 10, provider: 'openai' }\n\n// Get all aliases\nconsole.log(ai.aliases);  // { fast: 'gemini-2.5-flash-lite', best: 'claude-opus-4.5', ... }\n```\n\n## 📖 API\n\n### Fluent API\n\n```typescript\nimport { chat } from '@aitofy/ai-chat';\n\nconst result = await chat('best')\n  .system('You are a helpful assistant')\n  .user('Explain quantum computing')\n  .maxTokens(500)\n  .temperature(0.7)\n  .send();\n```\n\n### Cost Estimation\n\n```typescript\n// Estimate cost BEFORE sending\nconst estimate = chat('gpt-4o')\n  .user('Very long prompt here...')\n  .estimateCost();\n\nconsole.log(`Estimated: $${estimate.inputCost.toFixed(6)}`);\n```\n\n### Streaming\n\n```typescript\nfor await (const chunk of chat('fast').user('Tell me a story').stream()) {\n  if (chunk.type === 'content') {\n    process.stdout.write(chunk.content);\n  }\n}\n```\n\n### Tools / Function Calling\n\n```typescript\nconst result = await chat('best')\n  .user('What is the weather in Tokyo?')\n  .tools([{\n    name: 'get_weather',\n    description: 'Get current weather',\n    parameters: {\n      type: 'object',\n      properties: {\n        city: { type: 'string' }\n      }\n    }\n  }])\n  .send();\n\nif (result.data.toolCalls) {\n  console.log(result.data.toolCalls[0].arguments.city); // \"Tokyo\"\n}\n```\n\n### Vision (Image Input)\n\n```typescript\nconst result = await chat('vision')\n  .user('What is in this image?')\n  .image('https://example.com/photo.jpg')\n  .send();\n```\n\n## 📊 Cost Analytics\n\nAutomatically track costs to local file:\n\n```typescript\nimport { ask, getCostTracker } from '@aitofy/ai-chat';\n\n// All requests auto-tracked\nawait ask('fast', 'Hello');\nawait ask('cheap', 'World');\n\n// View report\nconst tracker = getCostTracker();\ntracker.printReport();\n\n// Output:\n// 📊 AI Cost Analytics Report\n// ════════════════════════════════════════\n// 📅 Today:      $0.0012\n// 📆 This Week:  $0.0245\n// 📅 This Month: $0.1234\n// 💰 All Time:   $1.5678\n//\n// 🏆 Top Models:\n//    1. gpt-4o-mini: $0.5432\n//    2. gemini-2.5-flash: $0.3210\n//\n// 🏢 By Provider:\n//    • openai: $0.8765\n//    • google: $0.4321\n// ════════════════════════════════════════\n```\n\n### Analytics API\n\n```typescript\nconst tracker = getCostTracker();\n\ntracker.today        // Today's cost\ntracker.thisWeek     // Last 7 days\ntracker.thisMonth    // Last 30 days\ntracker.total        // All time total\n\ntracker.getDate('2026-01-07')   // Specific date\ntracker.getLastDays(7)          // Array of last N days\ntracker.summary()               // Full summary object\n\ntracker.clear()                 // Reset all data\n```\n\n## ⚙️ Advanced Configuration\n\n```typescript\nimport AI from '@aitofy/ai-chat';\n\nconst ai = new AI({\n  // Auto-detect from env vars (default: true)\n  autoDetect: true,\n  \n  // Or manually configure\n  providers: {\n    openai: { apiKey: 'sk-...' },\n    anthropic: { apiKey: 'sk-ant-...' },\n    google: { apiKey: 'AIza...' },\n  },\n  \n  // Budget protection\n  maxCostPerRequest: 0.10,  // Max $0.10 per request\n  budgetLimit: 5.00,        // Max $5 total\n  \n  // Auto-retry with backoff\n  retry: true,  // or { maxAttempts: 5, initialDelay: 1000 }\n  \n  // Fallback chain\n  fallback: ['claude-sonnet-4', 'gpt-4o', 'gemini-2.5-pro'],\n  \n  // Logging\n  logging: 'verbose',  // or true for basic\n  \n  // Cost tracking\n  trackCosts: true,   // Save to .ai-costs.json\n  \n  // 🆕 Global defaults for ALL requests (can be overridden per-request)\n  defaults: {\n    temperature: 0.7,      // Default creativity\n    maxTokens: 1000,       // Default max output\n    topP: 0.9,             // Nucleus sampling\n    frequencyPenalty: 0,   // Reduce repetition\n    presencePenalty: 0,    // Encourage new topics\n    timeout: 30000,        // 30s timeout\n    responseFormat: 'text' // 'text' or 'json'\n  }\n});\n\n// Now all requests use these defaults:\nawait ai.ask('fast', 'Hello');  // Uses temperature=0.7, maxTokens=1000, etc.\n\n// Override per-request when needed:\nawait ai.chat('fast')\n  .temperature(0.2)   // Override: more deterministic\n  .maxTokens(500)     // Override: shorter output\n  .user('Hello')\n  .send();\n```\n\n### Per-Request Options\n\n```typescript\nimport { chat } from '@aitofy/ai-chat';\n\nconst result = await chat('best')\n  // Messages\n  .system('You are a coding assistant')\n  .user('Write a function')\n  .assistant('Here is the function...')  // Prior assistant response\n  \n  // Generation settings\n  .temperature(0.7)           // 0.0 - 2.0 (default: 0.7)\n  .maxTokens(1000)            // Max output tokens\n  .topP(0.9)                  // Nucleus sampling\n  .frequencyPenalty(0.5)      // Reduce repetition\n  .presencePenalty(0.5)       // Encourage new topics\n  .stop(['END', '---'])       // Stop sequences\n  \n  // Output format\n  .json()                     // Force JSON output\n  .responseFormat('json')     // Same as .json()\n  \n  // Vision (attach images)\n  .image('https://example.com/photo.jpg')\n  .imageBase64('data:image/png;base64,...')\n  \n  // Tools / Function calling\n  .tools([{ name: 'get_weather', ... }])\n  .toolChoice('auto')         // 'auto' | 'none' | { name: 'fn_name' }\n  \n  // Control\n  .timeout(30000)             // 30 second timeout\n  .signal(abortController.signal)  // Abort controller\n  \n  .send();\n\n// Or get as stream\nfor await (const chunk of chat('fast').user('Tell story').stream()) {\n  process.stdout.write(chunk.content || '');\n}\n```\n\n### Cost Estimation Before Sending\n\n```typescript\nconst builder = chat('gpt-4o')\n  .system('You are helpful')\n  .user('Very long prompt here...');\n\n// Estimate BEFORE sending\nconst estimate = builder.estimateCost();\nconsole.log(`Input: $${estimate.inputCost.toFixed(6)}`);\nconsole.log(`Est output: $${estimate.estimatedOutputCost.toFixed(6)}`);\n\n// Only send if under budget\nif (estimate.inputCost < 0.01) {\n  const result = await builder.send();\n}\n```\n\n## 🎯 Error Handling\n\nNo try-catch needed! Every response is a `Result<T, E>`:\n\n```typescript\nconst result = await ask('gpt-4o', 'Hello');\n\nif (result.ok) {\n  console.log(result.data.content);\n} else {\n  switch (result.error.code) {\n    case 'NO_API_KEY': console.log('Missing API key'); break;\n    case 'RATE_LIMIT': console.log(`Retry in ${result.error.retryAfter}s`); break;\n    case 'INVALID_MODEL': console.log('Unknown model'); break;\n    case 'API_ERROR': console.log(`API error: ${result.error.status}`); break;\n    case 'NETWORK': console.log('Network error'); break;\n    case 'TIMEOUT': console.log('Request timed out'); break;\n  }\n}\n```\n\n## 🤖 Supported Models (90+)\n\n| Provider | Models |\n|----------|--------|\n| **OpenAI** (37) | gpt-5.2, gpt-5.2-pro, gpt-5, gpt-5-mini, gpt-4.1, gpt-4o, gpt-4o-mini, o1, o3, o4-mini, gpt-realtime, gpt-image-* |\n| **Anthropic** (10) | claude-opus-4.5/4.1/4, claude-sonnet-4.5/4, claude-haiku-4.5/3.5/3 |\n| **Google** (22) | gemini-3-pro/flash, gemini-2.5-pro/flash/flash-lite, gemini-2.0-flash, imagen-4/3, veo-3.1/3/2 |\n| **xAI** (10) | grok-4-*/3/3-mini, grok-code-fast-1, grok-2-vision |\n| **Groq** (10) | gpt-oss-*, llama-4-*, llama-3.3-70b, llama-3.1-8b, qwen3-32b, kimi-k2 |\n| **DeepSeek** (2) | deepseek-chat, deepseek-reasoner |\n\n## 💰 Built-in Pricing\n\nPricing data is embedded - no API calls needed:\n\n```typescript\nimport { PRICING } from '@aitofy/ai-chat';\n\nconst pricing = PRICING['gpt-4o'];\n// { input: 2.5, output: 10, provider: 'openai', vision: true, tools: true }\n```\n\n## 📊 Response Structure\n\n```typescript\ninterface ChatResult {\n  content: string;\n  model: string;\n  provider: 'openai' | 'anthropic' | 'google' | 'xai' | 'groq' | 'deepseek';\n  usage: {\n    inputTokens: number;\n    outputTokens: number;\n    totalTokens: number;\n  };\n  cost: {\n    input: number;   // USD\n    output: number;  // USD\n    total: number;   // USD\n  };\n  latency: number;   // milliseconds\n  toolCalls?: ToolCall[];\n  finishReason?: string;\n}\n```\n\n## 🆚 Why @aitofy/ai-chat?\n\n| Feature | @aitofy/ai-chat | Vercel AI SDK | LangChain |\n|---------|:---------------:|:-------------:|:---------:|\n| Bundle size | **52 KB** | ~500 KB | ~2 MB |\n| Dependencies | **0** | Many | Many |\n| Result-based errors | ✅ | ❌ | ❌ |\n| Cost tracking | ✅ | ❌ | ❌ |\n| Cost analytics | ✅ | ❌ | ❌ |\n| Model aliases | ✅ | ❌ | ❌ |\n| Custom aliases | ✅ | ❌ | ❌ |\n| Global defaults | ✅ | ❌ | ❌ |\n| Vision support | ✅ | ✅ | ✅ |\n| Auto-retry | ✅ | ✅ | ✅ |\n| Budget limits | ✅ | ❌ | ❌ |\n| Zero config | ✅ | ❌ | ❌ |\n| Learning curve | Low | Medium | High |\n\n## 📚 Related Packages\n\n- [@aitofy/ai-speech](https://npmjs.com/package/@aitofy/ai-speech) - TTS/STT\n- [@aitofy/ai-image](https://npmjs.com/package/@aitofy/ai-image) - Image generation\n- [@aitofy/ai](https://npmjs.com/package/@aitofy/ai) - All-in-one bundle\n\n## 📄 License\n\nMIT © [Aitofy](https://aitofy.dev)\n","readmeFilename":"README.md"}