{"_id":"@aid-on/fractop","_rev":"8-f86749608de5b5709edf8d4d44c3d13a","name":"@aid-on/fractop","dist-tags":{"latest":"0.6.6"},"versions":{"0.1.0":{"name":"@aid-on/fractop","version":"0.1.0","keywords":["llm","fractal","chunking","long-context","text-processing","ai","medical-grade","reliability"],"author":{"name":"Aid-On Team"},"license":"MIT","_id":"@aid-on/fractop@0.1.0","maintainers":[{"name":"aid-on","email":"hiromi.motodera@aid-on.org"}],"homepage":"https://github.com/Aid-On/fractop#readme","bugs":{"url":"https://github.com/Aid-On/fractop/issues"},"dist":{"shasum":"3fd74db88c4951d32e3d2e287a791fee6639e72d","tarball":"https://registry.npmjs.org/@aid-on/fractop/-/fractop-0.1.0.tgz","fileCount":4,"integrity":"sha512-M+PwB3yP3Ba3ufiAWDwWrJryAmOdLmG6GGNyuCmivaCoYibCw4v4muDtPvfZAjboSAsEjkjCgG3WGDq7grgJBA==","signatures":[{"sig":"MEUCICvUf50enXlJLW9eQuXaUlxOGaPKAzMGdYi6AALrhheOAiEA/XJZPJyIJNVAdtGwyGrzkyiNvDEXsnMoNcf9OLWUtnI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":21028},"main":"dist/index.js","types":"dist/index.d.ts","scripts":{"test":"vitest run","build":"tsc","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"aid-on","email":"hiromi.motodera@aid-on.org"},"repository":{"url":"git+https://github.com/Aid-On/fractop.git","type":"git"},"_npmVersion":"10.8.2","description":"FractoP - Fractal Processor for infinite-length text processing with LLMs","directories":{},"_nodeVersion":"20.19.6","dependencies":{"@aid-on/nagare":"^0.1.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^1.0.0","typescript":"^5.0.0","@vitest/coverage-v8":"^1.6.1"},"_npmOperationalInternal":{"tmp":"tmp/fractop_0.1.0_1766734227599_0.7017018436159881","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@aid-on/fractop","version":"0.2.0","keywords":["llm","fractal","chunking","long-context","text-processing","ai","medical-grade","reliability"],"author":{"name":"Aid-On Team"},"license":"MIT","_id":"@aid-on/fractop@0.2.0","maintainers":[{"name":"aid-on","email":"hiromi.motodera@aid-on.org"}],"homepage":"https://github.com/Aid-On/fractop#readme","bugs":{"url":"https://github.com/Aid-On/fractop/issues"},"dist":{"shasum":"e81310b8a0380848374809309d5d4b8ae2244674","tarball":"https://registry.npmjs.org/@aid-on/fractop/-/fractop-0.2.0.tgz","fileCount":25,"integrity":"sha512-aHMSZNbGiXAPb4nJNP/Zke0Esj58Vgwb+TVdTia1AS+l/fmXpzJwNh+wBfMAAMM/0Bh3vkr4r7UZMTSKONGZbw==","signatures":[{"sig":"MEUCIHIuKvnPsRKmE7dMwSmblCuWVSw/51tsOeZiDlYPI4dnAiEA1urNjrk5irP6rghs2CTdcKIyMyYa+XM0nm0fPXCvJtw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":85166},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","scripts":{"test":"vitest run","build":"tsc","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"aid-on","email":"hiromi.motodera@aid-on.org"},"repository":{"url":"git+https://github.com/Aid-On/fractop.git","type":"git"},"_npmVersion":"10.8.2","description":"FractoP - Fractal Processor for infinite-length text processing with LLMs","directories":{},"_nodeVersion":"20.19.6","dependencies":{"@aid-on/nagare":"^0.1.0","@aid-on/unillm":"file:../unillm"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^1.0.0","typescript":"^5.0.0","@vitest/coverage-v8":"^1.6.1"},"_npmOperationalInternal":{"tmp":"tmp/fractop_0.2.0_1766737118633_0.8581525147566769","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@aid-on/fractop","version":"0.3.0","keywords":["llm","fractal","chunking","long-context","text-processing","ai","medical-grade","reliability"],"author":{"name":"Aid-On Team"},"license":"MIT","_id":"@aid-on/fractop@0.3.0","maintainers":[{"name":"aid-on","email":"hiromi.motodera@aid-on.org"}],"homepage":"https://github.com/Aid-On/fractop#readme","bugs":{"url":"https://github.com/Aid-On/fractop/issues"},"dist":{"shasum":"426fed61f91af83d563082b4ac1b64c260005c6b","tarball":"https://registry.npmjs.org/@aid-on/fractop/-/fractop-0.3.0.tgz","fileCount":25,"integrity":"sha512-u6wnjx1LU4Fgt2T+WKQrjOyd61bvpN8oFIXs3AyD0FvYI+wXycBSswQL5kjFf8zCH2QBcW0WwM+zP+IV0MkaGA==","signatures":[{"sig":"MEUCIHaYaQQPmYuEnCTGnm3IUgACQ2mSaDtOx9NHnJiqmL6eAiEA5p59CUy6M/gH3oZsMKGC7K+SSrqvoAvjrTe385iOcns=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":85166},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","scripts":{"test":"vitest run","build":"tsc","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"aid-on","email":"hiromi.motodera@aid-on.org"},"repository":{"url":"git+https://github.com/Aid-On/fractop.git","type":"git"},"_npmVersion":"10.8.2","description":"FractoP - Fractal Processor for infinite-length text processing with LLMs","directories":{},"_nodeVersion":"20.19.6","dependencies":{"@aid-on/nagare":"^0.1.0","@aid-on/unillm":"file:../unillm"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^1.0.0","typescript":"^5.0.0","@vitest/coverage-v8":"^1.6.1"},"_npmOperationalInternal":{"tmp":"tmp/fractop_0.3.0_1766737492578_0.20391392729525215","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@aid-on/fractop","version":"0.5.0","keywords":["llm","fractal","chunking","long-context","text-processing","ai","medical-grade","reliability"],"author":{"name":"Aid-On Team"},"license":"MIT","_id":"@aid-on/fractop@0.5.0","maintainers":[{"name":"aid-on","email":"hiromi.motodera@aid-on.org"}],"homepage":"https://github.com/Aid-On/fractop#readme","bugs":{"url":"https://github.com/Aid-On/fractop/issues"},"dist":{"shasum":"2c7ec10b547029cc8196c7973a1d14b7d0b80c7d","tarball":"https://registry.npmjs.org/@aid-on/fractop/-/fractop-0.5.0.tgz","fileCount":31,"integrity":"sha512-47q8F/fWuFZbgeMNX69mIdqiOG1kmTkSToOfJXiMdFfpGPVARkpyB3jj81ialIvTfWaLJw8TuvpUSRaxLbyrug==","signatures":[{"sig":"MEUCIQCKceVeybMDsIRXMQV+08igWLDaDgGbEMTTXg9QrHC4oAIgH9bKk6/HwZzRpgSo+A52oGr+oSD793o4HJ5rBvklv5s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":120016},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","scripts":{"test":"vitest run","build":"tsc","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"aid-on","email":"hiromi.motodera@aid-on.org"},"repository":{"url":"git+https://github.com/Aid-On/fractop.git","type":"git"},"_npmVersion":"10.8.2","description":"FractoP - Fractal Processor for infinite-length text processing with LLMs","directories":{},"_nodeVersion":"20.19.6","dependencies":{"@aid-on/nagare":"^0.1.0","@aid-on/unillm":"file:../unillm"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^1.0.0","typescript":"^5.0.0","@vitest/coverage-v8":"^1.6.1"},"_npmOperationalInternal":{"tmp":"tmp/fractop_0.5.0_1766740878676_0.32220154465728235","host":"s3://npm-registry-packages-npm-production"}},"0.6.2":{"name":"@aid-on/fractop","version":"0.6.2","keywords":["llm","fractal","chunking","long-context","text-processing","ai","medical-grade","reliability"],"author":{"name":"Aid-On Team"},"license":"MIT","_id":"@aid-on/fractop@0.6.2","maintainers":[{"name":"aid-on","email":"hiromi.motodera@aid-on.org"}],"homepage":"https://github.com/Aid-On/fractop#readme","bugs":{"url":"https://github.com/Aid-On/fractop/issues"},"dist":{"shasum":"53de8a9be746c10e75f1a6bc5f995dfd0705976c","tarball":"https://registry.npmjs.org/@aid-on/fractop/-/fractop-0.6.2.tgz","fileCount":10,"integrity":"sha512-GnDVm7KL5DxLPDXOaf6KD4VFxrBEJ2vm+54zKRjnT/K4s9Vz+D2WMOweJQGYOFFG0c/onTrf61ekRzp6a2/Ryw==","signatures":[{"sig":"MEUCIQDB4EX1F9up1zHErXLTK0TzcQniTZQtAttXNyilfUFeZAIgQVVLkcOQj8vtv2ezljYr/++6mlIekoGazgFAnMDLas4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":255072},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"scripts":{"test":"vitest run","build":"tsup","build:tsc":"tsc","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"aid-on","email":"hiromi.motodera@aid-on.org"},"repository":{"url":"git+https://github.com/Aid-On/fractop.git","type":"git"},"_npmVersion":"10.8.2","description":"FractoP - Fractal Processor for infinite-length text processing with LLMs","directories":{},"sideEffects":false,"_nodeVersion":"20.19.6","dependencies":{"@aid-on/nagare":"^0.2.1","@aid-on/unillm":"^0.5.1"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vitest":"^1.0.0","typescript":"^5.0.0","@vitest/coverage-v8":"^1.6.1"},"_npmOperationalInternal":{"tmp":"tmp/fractop_0.6.2_1767191021399_0.13215316724403636","host":"s3://npm-registry-packages-npm-production"}},"0.6.3":{"name":"@aid-on/fractop","version":"0.6.3","keywords":["llm","fractal","chunking","long-context","text-processing","ai","medical-grade","reliability"],"author":{"name":"Aid-On Team"},"license":"MIT","_id":"@aid-on/fractop@0.6.3","maintainers":[{"name":"aid-on","email":"hiromi.motodera@aid-on.org"}],"homepage":"https://github.com/Aid-On/fractop#readme","bugs":{"url":"https://github.com/Aid-On/fractop/issues"},"dist":{"shasum":"345a9988f5bfab19b87f7ecbeaa8342cc2729c41","tarball":"https://registry.npmjs.org/@aid-on/fractop/-/fractop-0.6.3.tgz","fileCount":10,"integrity":"sha512-+guTz/KNDDnCU4QNcZ9nJwxDo1A884Pw7fvLlS4bKW6AorM3dPGijAcf7S+87MYLjRKmO2u26J76dh3P7sEz0w==","signatures":[{"sig":"MEUCIEsk6O5Qe7G8xL5sg1O2Sfumjp67nJmfmCwO7kF+/9U9AiEAv819cxI36HZVFnxNJ2ir/qwoq1BvWqqeYXHMc2hqoeE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":249936},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"scripts":{"test":"vitest run","build":"tsup","build:tsc":"tsc","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"aid-on","email":"hiromi.motodera@aid-on.org"},"repository":{"url":"git+https://github.com/Aid-On/fractop.git","type":"git"},"_npmVersion":"10.8.2","description":"FractoP - Fractal Processor for infinite-length text processing with LLMs","directories":{},"sideEffects":false,"_nodeVersion":"20.19.6","dependencies":{"@aid-on/nagare":"^0.2.2","@aid-on/unillm":"^0.5.2"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vitest":"^1.0.0","typescript":"^5.0.0","@vitest/coverage-v8":"^1.6.1"},"_npmOperationalInternal":{"tmp":"tmp/fractop_0.6.3_1771341601232_0.9495281148523944","host":"s3://npm-registry-packages-npm-production"}},"0.6.4":{"name":"@aid-on/fractop","version":"0.6.4","keywords":["llm","fractal","chunking","long-context","text-processing","ai","medical-grade","reliability"],"author":{"name":"Aid-On Team"},"license":"MIT","_id":"@aid-on/fractop@0.6.4","maintainers":[{"name":"aid-on","email":"hiromi.motodera@aid-on.org"}],"homepage":"https://github.com/Aid-On/fractop#readme","bugs":{"url":"https://github.com/Aid-On/fractop/issues"},"dist":{"shasum":"d826ce8db9f513a6bf023958c251e481459e7991","tarball":"https://registry.npmjs.org/@aid-on/fractop/-/fractop-0.6.4.tgz","fileCount":10,"integrity":"sha512-nJi0iHyP5BDI/YySOaHdUPIlJ952fVUBeJnui9uG1UNQRXdZmL7GmgR+9eEmT+fPXxIKIoIfAE2yWIpPREBxzg==","signatures":[{"sig":"MEQCIBJMe45Dl5xxEQXXp1tgbp1JbmCjZMy1AUvE0SZM0LUaAiBddIbNnAA0o4wirKri4phSOIrSFiHDGMwGZaT6ksSMLQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":249936},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"scripts":{"test":"vitest run","build":"tsup","build:tsc":"tsc","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"aid-on","email":"hiromi.motodera@aid-on.org"},"repository":{"url":"git+https://github.com/Aid-On/fractop.git","type":"git"},"_npmVersion":"10.8.2","description":"FractoP - Fractal Processor for infinite-length text processing with LLMs","directories":{},"sideEffects":false,"_nodeVersion":"20.19.6","dependencies":{"@aid-on/nagare":"^0.2.3","@aid-on/unillm":"^0.5.3"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vitest":"^1.0.0","typescript":"^5.0.0","@vitest/coverage-v8":"^1.6.1"},"_npmOperationalInternal":{"tmp":"tmp/fractop_0.6.4_1771343152333_0.03814660302543804","host":"s3://npm-registry-packages-npm-production"}},"0.6.6":{"name":"@aid-on/fractop","version":"0.6.6","type":"module","description":"FractoP - Fractal Processor for infinite-length text processing with LLMs","main":"dist/index.cjs","module":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/Aid-On/fractop.git"},"bugs":{"url":"https://github.com/Aid-On/fractop/issues"},"homepage":"https://github.com/Aid-On/fractop#readme","author":{"name":"Aid-On Team"},"scripts":{"build":"tsup","build:tsc":"tsc","typecheck":"tsc --noEmit","test":"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage"},"keywords":["llm","fractal","chunking","long-context","text-processing","ai","medical-grade","reliability"],"license":"MIT","dependencies":{"@aid-on/nagare":"^0.2.5","@aid-on/unillm":"^0.5.5"},"devDependencies":{"@vitest/coverage-v8":"^1.6.1","tsup":"^8.5.1","typescript":"^5.0.0","vitest":"^1.0.0"},"_id":"@aid-on/fractop@0.6.6","_nodeVersion":"20.19.6","_npmVersion":"10.8.2","dist":{"integrity":"sha512-R/kFMpsfq2tnY18aHjlSJ9LEZZpjnuEOJ0NeZgHHU51kxV1DqeHj2BvQeyCcylPiJfHTBSMemYSw37zmwlPgOQ==","shasum":"3c1aece76893aeaf5d404d8afe8cb62fb3da37d5","tarball":"https://registry.npmjs.org/@aid-on/fractop/-/fractop-0.6.6.tgz","fileCount":10,"unpackedSize":251336,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDcQC6fMNRzuCQWBRawcG4XIb6NcOyJkAlxswODfAEGsQIgEb/Kxw5JXw8wkwYZ6+ucoRFwcQjolB3tnNfy29Qvh3Q="}]},"_npmUser":{"name":"aid-on","email":"hiromi.motodera@aid-on.org"},"directories":{},"maintainers":[{"name":"aid-on","email":"hiromi.motodera@aid-on.org"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/fractop_0.6.6_1771435069723_0.5153844950175785"},"_hasShrinkwrap":false}},"time":{"created":"2025-12-26T07:30:27.505Z","modified":"2026-02-18T17:17:50.011Z","0.1.0":"2025-12-26T07:30:27.729Z","0.2.0":"2025-12-26T08:18:38.794Z","0.3.0":"2025-12-26T08:24:52.725Z","0.5.0":"2025-12-26T09:21:18.822Z","0.6.2":"2025-12-31T14:23:41.605Z","0.6.3":"2026-02-17T15:20:01.379Z","0.6.4":"2026-02-17T15:45:52.472Z","0.6.6":"2026-02-18T17:17:49.884Z"},"bugs":{"url":"https://github.com/Aid-On/fractop/issues"},"author":{"name":"Aid-On Team"},"license":"MIT","homepage":"https://github.com/Aid-On/fractop#readme","keywords":["llm","fractal","chunking","long-context","text-processing","ai","medical-grade","reliability"],"repository":{"type":"git","url":"git+https://github.com/Aid-On/fractop.git"},"description":"FractoP - Fractal Processor for infinite-length text processing with LLMs","maintainers":[{"name":"aid-on","email":"hiromi.motodera@aid-on.org"}],"readme":"# @aid-on/fractop\n\n[![npm version](https://badge.fury.io/js/@aid-on%2Ffractop.svg)](https://www.npmjs.com/package/@aid-on/fractop)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![TypeScript](https://img.shields.io/badge/TypeScript-5.0%2B-blue)](https://www.typescriptlang.org/)\n\n[日本語](./README.ja.md) | English\n\nFractoP (Fractal Processor) - Elegant text processing for LLMs with streaming, batching, and fractal chunking.\n\n## 🚨 The Problem\n\n**LLMs have context limits.** GPT-4 caps at 128K tokens. Claude at 200K. Even Gemini's 2M context fills up fast.\n\nWhat happens when you need to:\n- Summarize a 500-page PDF?\n- Analyze a codebase with 10,000 files?\n- Translate an entire book?\n- Process millions of customer reviews?\n\n```typescript\n// ❌ This fails\nconst summary = await llm.process(entire500PagePDF);\n// Error: Context length exceeded (400,000 tokens > 128,000 limit)\n```\n\n## ✅ The Solution: FractoP\n\nFractoP intelligently chunks your text, processes each piece, and merges results - all while preserving context.\n\n```typescript\n// ✅ This works for ANY size document\nconst summary = await fractop()\n  .withLLM(llm)\n  .chunking({ size: 3000, overlap: 300 })\n  .parallel(5)\n  .run(entire500PagePDF);\n```\n\n## ✨ Features\n\n- **🎯 Fluent API**: Elegant chainable interface for building processing pipelines\n- **🌊 Nagare Streaming**: Reactive stream processing with `Stream<T>` integration\n- **🔄 Smart Chunking**: Intelligent text splitting with overlap for context preservation\n- **⚡ Parallel Processing**: Concurrent chunk processing for maximum performance\n- **🛡️ Enterprise Reliability**: Timeouts, retries, and circuit breaker patterns built-in\n- **🎨 UnillM Integration**: Works seamlessly with any LLM through UnillM adapters\n- **📦 Batch Processing**: Process multiple documents efficiently\n- **🔁 Auto-retry**: Exponential backoff for transient failures\n\n## Installation\n\n```bash\nnpm install @aid-on/fractop\n```\n\n## 🚀 Quick Start\n\n### Primary Interface - Fluent API\n\nThe most elegant way to use FractoP:\n\n```typescript\nimport { fractop } from '@aid-on/fractop';\n\n// Simple and elegant\nconst results = await fractop()\n  .withLLM(async (chunk) => {\n    // Your LLM logic here\n    const response = await callYourLLM(chunk);\n    return response;\n  })\n  .chunking({ size: 3000, overlap: 300 })\n  .parallel(5)\n  .retry(3, 1000)\n  .timeout(30000)\n  .run(longText);\n```\n\n### With GROQ/OpenAI\n\n```typescript\nconst summaries = await fractop()\n  .withLLM(async (chunk) => {\n    const response = await fetch('https://api.groq.com/openai/v1/chat/completions', {\n      method: 'POST',\n      headers: {\n        'Authorization': `Bearer ${GROQ_API_KEY}`,\n        'Content-Type': 'application/json'\n      },\n      body: JSON.stringify({\n        model: 'llama-3.1-8b-instant',\n        messages: [\n          { role: 'system', content: 'Summarize concisely.' },\n          { role: 'user', content: chunk }\n        ]\n      })\n    });\n    const data = await response.json();\n    return data.choices[0].message.content;\n  })\n  .chunking({ size: 2000, overlap: 200 })\n  .run(document);\n```\n\n### With UnillM\n\n```typescript\n// UnillM configuration object\nconst results = await fractop()\n  .withLLM({\n    model: 'groq:llama-3.1-70b',\n    credentials: { groqApiKey: process.env.GROQ_API_KEY },\n    messages: (chunk) => [\n      { role: 'system', content: 'Extract key points.' },\n      { role: 'user', content: chunk }\n    ],\n    options: { temperature: 0.7 }\n  })\n  .chunking({ size: 3000 })\n  .parallel(3)\n  .run(text);\n\n// Or with custom transform\nconst entities = await fractop<Entity[]>()\n  .withLLM({\n    model: 'anthropic:claude-3-5-haiku',\n    credentials: { anthropicApiKey: process.env.ANTHROPIC_API_KEY },\n    messages: (chunk) => [\n      { role: 'system', content: 'Extract entities as JSON.' },\n      { role: 'user', content: chunk }\n    ],\n    transform: (response) => JSON.parse(response.text)\n  })\n  .run(document);\n```\n\n## 🌊 Streaming with Nagare\n\nProcess large documents with memory-efficient streaming:\n\n```typescript\nimport { fractopStream } from '@aid-on/fractop';\n\n// Stream results as they're processed\nconst stream = fractopStream(largeDocument)\n  .withLLM(async (chunk) => await processChunk(chunk))\n  .chunking({ size: 2000, overlap: 200 })\n  .parallel(3)\n  .stream();\n\n// Reactive stream operations\nawait stream\n  .map(result => result.toUpperCase())\n  .filter(result => result.length > 100)\n  .take(10)\n  .collect();\n```\n\n### Batch Processing\n\nProcess multiple documents efficiently:\n\n```typescript\nimport { fractopBatch } from '@aid-on/fractop';\n\nconst documents = ['doc1.txt', 'doc2.txt', 'doc3.txt'];\n\nconst results = await fractopBatch(documents)\n  .withLLM(async (chunk) => await summarize(chunk))\n  .chunking({ size: 2000 })\n  .collectAll();\n\n// Results is a Map<string, T[]>\nfor (const [doc, summaries] of results) {\n  console.log(`${doc}: ${summaries.length} chunks processed`);\n}\n```\n\n## 🔧 Advanced Features\n\n### Custom Processing Pipeline\n\n```typescript\nconst pipeline = await fractop<ExtractedEntity>()\n  .withLLM(llmProcessor)\n  .chunking({ size: 4000, overlap: 400 })\n  .parallel(5)\n  .retry(3, 2000)\n  .timeout(60000, true)  // per-chunk timeout\n  .minResults(50)\n  .merge('simple')  // or provide custom merger\n  .run(text);\n```\n\n### Context-Aware Processing\n\n```typescript\nconst results = await fractop()\n  .withLLM(llmProcessor)\n  .context(async (text) => {\n    // Generate global context from full document\n    return await generateSummary(text.substring(0, 5000));\n  })\n  .process(async (chunk, context) => {\n    // Process each chunk with context\n    return await extractWithContext(chunk, context);\n  })\n  .merge((results) => customMergeLogic(results))\n  .run(document);\n```\n\n### Stream Processing\n\nProcess documents as reactive streams:\n\n```typescript\n// Stream individual results\nconst stream = fractopStream(document)\n  .withLLM(async (chunk) => await analyze(chunk))\n  .chunking({ size: 2000, overlap: 200 })\n  .stream();\n\n// Use Nagare's reactive operators\nconst processed = await stream\n  .map(result => transform(result))\n  .filter(result => result.score > 0.8)\n  .collect();\n```\n\n## 🏗️ Architecture\n\nFractoP's fractal architecture enables processing of unlimited document sizes:\n\n```mermaid\ngraph TD\n    A[Input Text] --> B[Smart Chunking]\n    B --> C[Parallel/Sequential Processing]\n    C --> D[Stream Results]\n    D --> E[Merge & Deduplicate]\n    E --> F[Final Output]\n```\n\n### Key Concepts\n\n1. **Fractal Chunking**: Intelligent text splitting that preserves context\n2. **Stream Processing**: Memory-efficient processing with Nagare streams\n3. **Context Propagation**: Maintains document understanding across chunks\n4. **Result Merging**: Smart deduplication and aggregation\n\n## 📊 Performance\n\n```typescript\n// Optimize for speed\nconst fast = await fractop()\n  .withLLM(llm)\n  .chunking({ size: 5000 })  // Larger chunks\n  .parallel(10)               // High concurrency\n  .run(text);\n\n// Optimize for quality\nconst quality = await fractop()\n  .withLLM(llm)\n  .chunking({ size: 2000, overlap: 500 })  // More overlap\n  .retry(5, 2000)                          // More retries\n  .timeout(120000)                         // Longer timeout\n  .run(text);\n```\n\n## 🛡️ Reliability Features\n\n### Automatic Retries\n```typescript\nfractop()\n  .withLLM(llm)\n  .retry(3, 1000)  // 3 retries with exponential backoff\n  .run(text);\n```\n\n### Timeouts\n```typescript\nfractop()\n  .withLLM(llm)\n  .timeout(60000)        // Overall timeout\n  .timeout(5000, true)   // Per-chunk timeout\n  .run(text);\n```\n\n### Circuit Breaker\nAutomatically stops processing after consecutive failures to prevent cascade failures.\n\n## 💡 Real-World Examples\n\n### 📚 Summarize a 500-Page Research Paper\n\n```typescript\nconst paper = readFileSync('quantum-computing-thesis.pdf', 'utf-8');\n// 200,000+ characters - would fail with direct LLM call\n\nconst summary = await fractop()\n  .withLLM({\n    model: 'groq:llama-3.1-70b',\n    credentials: { groqApiKey: process.env.GROQ_API_KEY },\n    messages: (chunk) => [\n      { role: 'system', content: 'Summarize key findings. Be concise.' },\n      { role: 'user', content: chunk }\n    ]\n  })\n  .chunking({ size: 3000, overlap: 300 })\n  .parallel(5)  // Process 5 chunks simultaneously\n  .run(paper);\n\n// Merge summaries into final document\nconst finalSummary = summary.join('\\n\\n');\n```\n\n### 🔍 Analyze 1000+ Files in a Codebase\n\n```typescript\nconst files = globSync('src/**/*.ts');  // 1000+ TypeScript files\nconst fullCode = files.map(f => readFileSync(f)).join('\\n');\n// Millions of characters - impossible with single LLM call\n\n// Extract all API endpoints\nconst endpoints = await fractop()\n  .withLLM({\n    model: 'anthropic:claude-3-5-haiku',\n    credentials: { anthropicApiKey: API_KEY },\n    messages: (chunk) => [\n      { role: 'system', content: 'Extract REST API endpoints as JSON.' },\n      { role: 'user', content: chunk }\n    ],\n    transform: (res) => JSON.parse(res.text)\n  })\n  .chunking({ size: 4000, overlap: 500 })  // Overlap prevents missing endpoints\n  .parallel(10)  // Analyze 10 files simultaneously\n  .run(fullCode);\n\n// Deduplicate results\nconst uniqueEndpoints = [...new Set(endpoints.flat())];\nconsole.log(`Found ${uniqueEndpoints.length} API endpoints`);\n```\n\n### 🌐 Translate an Entire Book\n\n```typescript\nconst book = await fetch('https://gutenberg.org/files/2600/2600-0.txt')\n  .then(r => r.text());  // War and Peace - 3.2 million characters!\n\nconst translatedBook = await fractop()\n  .withLLM({\n    model: 'gemini:gemini-2.5-pro',\n    credentials: { geminiApiKey: process.env.GEMINI_API_KEY },\n    messages: (chunk) => [\n      { role: 'system', content: 'Translate to Japanese. Keep literary style.' },\n      { role: 'user', content: chunk }\n    ]\n  })\n  .chunking({ \n    size: 2000,      // Smaller chunks for quality\n    overlap: 200     // Preserve sentence flow\n  })\n  .retry(3, 2000)    // Retry failed chunks\n  .timeout(120000)   // 2 min timeout per chunk\n  .run(book);\n\nwriteFileSync('war-and-peace-ja.txt', translatedBook.join(''));\n```\n\n### 📊 Process 50,000 Customer Reviews\n\n```typescript\n// 50,000 support tickets from database\nconst tickets = await db.query('SELECT * FROM tickets LIMIT 50000');\nconst ticketTexts = tickets.map(t => t.content);\n\n// Process in batches with streaming\nconst analysis = await fractopBatch(ticketTexts)\n  .withLLM({\n    model: 'groq:llama-3.1-8b-instant',  // Fast model for high volume\n    credentials: { groqApiKey: API_KEY },\n    messages: (ticket) => [\n      { role: 'system', content: 'Output: sentiment|category|priority' },\n      { role: 'user', content: ticket }\n    ],\n    transform: (res) => {\n      const [sentiment, category, priority] = res.text.split('|');\n      return { sentiment, category, priority };\n    }\n  })\n  .collectAll();\n\n// Aggregate insights\nconst insights = {\n  sentiments: { positive: 0, negative: 0, neutral: 0 },\n  categories: new Map(),\n  highPriority: []\n};\n\nfor (const [ticket, results] of analysis) {\n  results.forEach(r => {\n    insights.sentiments[r.sentiment]++;\n    if (r.priority === 'high') insights.highPriority.push(ticket);\n  });\n}\n```\n\n### 🤖 Generate Tests for Large Components\n\n```typescript\nconst component = readFileSync('src/Dashboard.tsx', 'utf-8');\n// 5000-line React component\n\nconst tests = await fractop()\n  .withLLM({\n    model: 'openai:gpt-4o',\n    credentials: { openaiApiKey: process.env.OPENAI_API_KEY },\n    messages: (chunk) => [\n      { role: 'system', content: 'Generate Jest unit tests with React Testing Library.' },\n      { role: 'user', content: chunk }\n    ]\n  })\n  .chunking({ size: 1500 })  // Each chunk gets targeted tests\n  .parallel(3)\n  .run(component);\n\n// Combine into test suite\nconst testFile = `\ndescribe('Dashboard Component', () => {\n  ${tests.join('\\n\\n')}\n});\n`;\nwriteFileSync('Dashboard.test.tsx', testFile);\n```\n\n### 💬 Real-time Document Q&A\n\n```typescript\nasync function askDocument(doc: string, question: string) {\n  // Stream through document to find answers\n  return await fractopStream(doc)\n    .withLLM({\n      model: 'gemini:gemini-2.5-flash',  // Fast for real-time\n      credentials: { geminiApiKey: API_KEY },\n      messages: (chunk) => [\n        { role: 'user', content: `Answer \"${question}\" from: ${chunk}` }\n      ]\n    })\n    .chunking({ size: 3000, overlap: 500 })\n    .stream()\n    .filter(answer => answer.length > 20)  // Filter relevant answers\n    .take(3)  // First 3 good answers\n    .collect();\n}\n\n// Usage\nconst manual = readFileSync('kubernetes-manual.txt', 'utf-8');\nconst answers = await askDocument(manual, \"How to set up auto-scaling?\");\n// Returns in seconds, not minutes!\n```\n\n## 🎯 Common Use Cases\n\n### Document Summarization\n```typescript\nconst summary = await fractop()\n  .withLLM(async (chunk) => await summarize(chunk))\n  .chunking({ size: 3000, overlap: 300 })\n  .merge(results => results.join('\\n'))\n  .run(document);\n```\n\n### Keyword Extraction\n```typescript\nconst keywords = await fractop<string[]>()\n  .withLLM(async (chunk) => await extractKeywords(chunk))\n  .chunking({ size: 2000 })\n  .merge(results => [...new Set(results.flat())])\n  .run(document);\n```\n\n### Translation\n```typescript\nconst translated = await fractop()\n  .withLLM(async (chunk) => await translate(chunk, 'ja'))\n  .chunking({ size: 2000, overlap: 200 })\n  .run(document);\n```\n\n### Question Answering\n```typescript\nconst answers = await fractop()\n  .withLLM(async (chunk) => await answerQuestion(chunk, question))\n  .chunking({ size: 3000 })\n  .parallel(5)\n  .run(document);\n```\n\n## ⚙️ Configuration\n\n### Default Settings\n\n```typescript\n{\n  chunkSize: 3000,        // Optimized for LLM token limits\n  overlapSize: 300,       // Context preservation\n  concurrency: 3,         // Parallel processing threads\n  maxRetries: 2,          // Retry attempts\n  retryDelay: 1000,       // Initial retry delay (ms)\n  chunkTimeout: 30000     // Per-chunk timeout (ms)\n}\n```\n\n### Advanced Configuration\n\n```typescript\nconst processor = fractop()\n  .withLLM(llm)\n  .chunking({ \n    size: 4000,      // Larger chunks for better context\n    overlap: 500     // More overlap for continuity\n  })\n  .parallel(5)       // 5 concurrent processors\n  .retry(3, 2000)    // 3 retries, 2s initial delay\n  .timeout(60000)    // 1 minute overall timeout\n  .minResults(100)   // Minimum 100 results\n  .build();\n```\n\n## 📦 API Reference\n\n### Main Exports\n\n```typescript\n// Primary fluent interface\nimport { fractop } from '@aid-on/fractop';\n\n// Streaming interfaces\nimport { fractopStream, fractopBatch } from '@aid-on/fractop';\n\n// Core processor (advanced use)\nimport { FractalProcessor } from '@aid-on/fractop';\n\n// Utilities\nimport { simpleMerge, weightedMerge } from '@aid-on/fractop';\n```\n\n### Fluent API Methods\n\n| Method | Description |\n|--------|-------------|\n| `.withLLM(fn\\|config)` | Set LLM processor (function or UnillM config) |\n| `.chunking(opts)` | Configure chunk size and overlap |\n| `.parallel(n)` | Enable parallel processing |\n| `.retry(n, delay)` | Configure retry behavior |\n| `.timeout(ms, perChunk?)` | Set timeout limits |\n| `.context(fn)` | Set context generator |\n| `.process(fn)` | Set chunk processor |\n| `.merge(strategy)` | Set merge strategy |\n| `.minResults(n)` | Set minimum result count |\n| `.run(text)` | Execute processing |\n\n## 🔬 TypeScript\n\nFull TypeScript support with generics:\n\n```typescript\ninterface Analysis {\n  sentiment: 'positive' | 'negative' | 'neutral';\n  score: number;\n  keywords: string[];\n}\n\nconst results = await fractop<Analysis>()\n  .withLLM(async (chunk): Promise<Analysis> => {\n    // Type-safe processing\n    return analyzeChunk(chunk);\n  })\n  .merge((results: Analysis[][]) => {\n    // Type-safe merging\n    return combineAnalyses(results);\n  })\n  .run(document);\n\n// results is Analysis[]\n```\n\n## 🚀 Performance Tips\n\n1. **Chunk Size**: Balance between context and token limits (2000-4000 chars recommended)\n2. **Overlap**: 10-20% of chunk size for good context preservation\n3. **Concurrency**: Match your LLM rate limits (3-5 for most providers)\n4. **Streaming**: Use `fractopStream` for documents > 100KB\n5. **Batching**: Use `fractopBatch` for multiple documents\n\n## License\n\nMIT","readmeFilename":"README.md"}