{"_id":"@buntok/ai","name":"@buntok/ai","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"@buntok/ai","version":"1.0.0","description":"Provider-agnostic AI SDK for Buntok — streaming, tool calling, chat history, RAG, and middleware","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":{"build":"tsup","dev":"tsup --watch","typecheck":"tsc --noEmit","lint":"biome check --write src/","clean":"rm -rf dist"},"keywords":["ai","llm","openai","anthropic","gemini","chat","streaming","tool-calling","rag","buntok"],"author":"","license":"MIT","dependencies":{},"peerDependencies":{"@buntok/core":">=1.0.0","zod":">=3.0.0","openai":">=4.0.0","@anthropic-ai/sdk":">=0.20.0","@google/genai":">=1.0.0","@mistralai/mistralai":">=1.0.0","@cohere-ai/sdk":">=7.0.0"},"peerDependenciesMeta":{"openai":{"optional":true},"@anthropic-ai/sdk":{"optional":true},"@google/genai":{"optional":true},"@mistralai/mistralai":{"optional":true},"@cohere-ai/sdk":{"optional":true}},"devDependencies":{"tsup":"^8.0.0","typescript":"^5.0.0"},"gitHead":"7e0b8997ff5a109bf26e1b9a9e023c16b8cd48bb","_id":"@buntok/ai@1.0.0","_nodeVersion":"24.15.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-jje7oOvh6cm8qQEW1exrMSnUoGSvDCUTIujBIcj3PZ49vgHaQjjRg00Xvo/CT9w2gT5l4VZesa4DKa+mAIKqDA==","shasum":"81e5cffe5c7f27014fd2e402237c3d9f3802b660","tarball":"https://registry.npmjs.org/@buntok/ai/-/ai-1.0.0.tgz","fileCount":8,"unpackedSize":351013,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCICmwUK5pcKKHLDtv6kvPsvrZmUoUYQMu3lp1z9rZer+GAiBBKa5WQpZGT83WfD5uzz3BnuQ/EXdvJfbvFkKJhPPgew=="}]},"_npmUser":{"name":"pitokkk","email":"pitokfauzi@gmail.com"},"directories":{},"maintainers":[{"name":"pitokkk","email":"pitokfauzi@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ai_1.0.0_1787458825915_0.2309351919787277"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-23T04:20:25.720Z","1.0.0":"2026-08-23T04:20:26.060Z","modified":"2026-08-23T04:20:26.339Z"},"maintainers":[{"name":"pitokkk","email":"pitokfauzi@gmail.com"}],"description":"Provider-agnostic AI SDK for Buntok — streaming, tool calling, chat history, RAG, and middleware","keywords":["ai","llm","openai","anthropic","gemini","chat","streaming","tool-calling","rag","buntok"],"license":"MIT","readme":"# @buntok/ai\n\nProvider-agnostic AI SDK for [Buntok](https://www.npmjs.com/package/@buntok/core) — streaming, tool calling, chat history, RAG, and middleware.\n\n## Features\n\n- **10 Providers** — OpenAI, Anthropic, Gemini, Mistral, Cohere, Groq, Ollama, xAI, OpenRouter, Llama\n- **Streaming** — Vercel AI SDK Data Stream Protocol v1\n- **Tool Calling** — automatic tool execution with multi-round conversations\n- **Chat History** — in-memory session management\n- **Embeddings** — vector search for RAG\n- **Middleware** — rate limiter, usage tracker, cost estimator, logger, cache\n- **Zero core deps** — provider SDKs are optional peer dependencies\n\n## Install\n\n```bash\nbun add @buntok/ai @buntok/core\n# Install only the providers you need:\nbun add openai\nbun add @anthropic-ai/sdk\nbun add @google/genai\n```\n\n## Quick Start\n\n```ts\nimport { AI, OpenAIProvider, streamResponse } from \"@buntok/ai\"\n\nconst ai = new AI({\n  provider: new OpenAIProvider({ apiKey: process.env.OPENAI_API_KEY }),\n  model: \"gpt-4o\",\n})\n\n// Simple chat\nconst response = await ai.chat({\n  messages: [{ role: \"user\", content: \"Hello!\" }],\n})\nconsole.log(response.content)\n\n// Streaming\nconst stream = ai.stream({\n  messages: [{ role: \"user\", content: \"Tell me a story\" }],\n})\nreturn streamResponse(ctx, stream)\n```\n\n## Providers\n\n| Provider | Package | Config |\n|----------|---------|--------|\n| OpenAI | `openai` | `OPENAI_API_KEY` |\n| Anthropic | `@anthropic-ai/sdk` | `ANTHROPIC_API_KEY` |\n| Gemini | `@google/genai` | `GEMINI_API_KEY` |\n| Mistral | `@mistralai/mistralai` | `MISTRAL_API_KEY` |\n| Cohere | `@cohere-ai/sdk` | `COHERE_API_KEY` |\n| Groq | *(built-in)* | `GROQ_API_KEY` |\n| Ollama | *(built-in)* | — (localhost:11434) |\n| xAI | *(built-in)* | `XAI_API_KEY` |\n| OpenRouter | *(built-in)* | `OPENROUTER_API_KEY` |\n| Llama | *(built-in)* | `LLAMA_API_KEY` |\n\nProviders marked *(built-in)* use the OpenAI-compatible API format — no SDK needed.\n\n### Using Groq (fast inference)\n\n```ts\nimport { AI, GroqProvider } from \"@buntok/ai\"\n\nconst ai = new AI({\n  provider: new GroqProvider({ apiKey: process.env.GROQ_API_KEY }),\n  model: \"llama-3.3-70b-versatile\",\n})\n```\n\n### Using Ollama (local)\n\n```ts\nimport { AI, OllamaProvider } from \"@buntok/ai\"\n\nconst ai = new AI({\n  provider: new OllamaProvider({ model: \"llama3.2\" }),\n})\n```\n\n## Tool Calling\n\n```ts\nimport { z } from \"zod\"\nimport { AI, OpenAIProvider } from \"@buntok/ai\"\n\nconst ai = new AI({\n  provider: new OpenAIProvider({ apiKey: \"...\" }),\n  model: \"gpt-4o\",\n})\n\nai.registerTools({\n  name: \"get_weather\",\n  description: \"Get weather for a city\",\n  parameters: z.object({ city: z.string() }),\n  execute: async ({ city }) => {\n    return { temp: 25, condition: \"sunny\" }\n  },\n})\n\n// Auto-executes tools and continues until done\nconst response = await ai.chatWithTools({\n  messages: [{ role: \"user\", content: \"What's the weather in Jakarta?\" }],\n})\n```\n\n## Streaming\n\n```ts\nimport { AI, OpenAIProvider, streamResponse, collectStream } from \"@buntok/ai\"\n\n// Return as SSE Response\nconst stream = ai.stream({ messages })\nreturn streamResponse(ctx, stream)\n\n// Or collect all text\nconst { content, toolCalls } = await collectStream(ai.stream({ messages }))\n```\n\n## Chat History\n\n```ts\nconst history = ai.getHistory()\n\n// Add messages\nhistory.add(\"user-123\", \"user\", \"Hello!\")\nhistory.add(\"user-123\", \"assistant\", \"Hi! How can I help?\")\n\n// Get messages for AI\nconst messages = history.toAIMessages(\"user-123\", \"You are a helpful assistant\")\n\n// Trim old messages\nhistory.trim(\"user-123\", 20) // keep last 20\n\n// Clear session\nhistory.clear(\"user-123\")\n```\n\n## Middleware\n\n```ts\nimport { AI, OpenAIProvider, rateLimiter, usageTracker, costEstimator, aiLogger } from \"@buntok/ai\"\n\nconst ai = new AI({\n  provider: new OpenAIProvider({ apiKey: \"...\" }),\n  model: \"gpt-4o\",\n  middleware: [\n    // Rate limit: 100 requests per minute\n    rateLimiter({ maxRequests: 100, windowMs: 60_000 }),\n\n    // Track usage\n    usageTracker({\n      onUsage: async (usage) => {\n        await db.insert(\"ai_usage\").values(usage)\n      },\n    }),\n\n    // Estimate cost\n    costEstimator({\n      pricing: {\n        \"gpt-4o\": { input: 2.5, output: 10 }, // USD per 1M tokens\n        \"claude-3-opus\": { input: 15, output: 75 },\n      },\n      onCost: async (cost) => {\n        console.log(`Request cost: $${cost.total.toFixed(4)}`)\n      },\n    }),\n\n    // Log requests\n    aiLogger(),\n  ],\n})\n```\n\n## Embeddings (RAG)\n\n```ts\nconst ai = new AI({\n  provider: new OpenAIProvider({ apiKey: \"...\" }),\n  model: \"text-embedding-3-small\",\n})\n\nconst { embeddings } = await ai.embed({\n  input: [\"Hello world\", \"How are you?\"],\n})\n\n// Use with your vector store\n```\n\n## Custom Provider\n\nImplement the `Provider` interface:\n\n```ts\nimport type { Provider, ChatOptions, ChatResponse, StreamChunk } from \"@buntok/ai\"\n\nclass MyProvider implements Provider {\n  readonly name = \"my-provider\"\n\n  async chat(options: ChatOptions): Promise<ChatResponse> {\n    // Your implementation\n  }\n\n  async *stream(options: ChatOptions): AsyncIterable<StreamChunk> {\n    // Your implementation\n  }\n}\n```\n\n## API Reference\n\n### `AI`\n\n| Method | Description |\n|--------|-------------|\n| `chat(options)` | Send chat request |\n| `stream(options)` | Stream chat response |\n| `streamResponse(ctx, options)` | Stream as SSE Response |\n| `chatWithTools(options)` | Auto-execute tools |\n| `embed(options)` | Generate embeddings |\n| `registerTools(...tools)` | Register tools |\n| `use(middleware)` | Add middleware |\n| `getHistory()` | Get history manager |\n\n### Types\n\n- `Message` — chat message\n- `Tool` — tool definition\n- `ChatOptions` — chat request options\n- `ChatResponse` — chat response\n- `StreamChunk` — streaming chunk\n- `Middleware` — middleware interface\n- `Provider` — provider interface\n\n## License\n\nMIT\n","readmeFilename":"README.md","_rev":"1-6a6e389018879b2efd7a84b53dd47da8"}