{"_id":"@aismarttalk/anondocs-sdk","_rev":"5-6930514e2bc0240e3e550b1d7fc01d90","name":"@aismarttalk/anondocs-sdk","dist-tags":{"latest":"1.2.1"},"versions":{"1.0.1":{"name":"@aismarttalk/anondocs-sdk","version":"1.0.1","keywords":["anondocs","anonymization","pii","privacy","llm","document-processing"],"author":{"name":"AI SmartTalk"},"license":"MIT","_id":"@aismarttalk/anondocs-sdk@1.0.1","maintainers":[{"name":"odran","email":"odran@webforger.fr"},{"name":"caillaudpa","email":"pierre-antoine@aismarttalk.tech"}],"homepage":"https://github.com/AI-Smarttalk/anondocs-sdk#readme","bugs":{"url":"https://github.com/AI-Smarttalk/anondocs-sdk/issues"},"dist":{"shasum":"285f1efa00ac72d7ef8424c233e8afa196f4a0b6","tarball":"https://registry.npmjs.org/@aismarttalk/anondocs-sdk/-/anondocs-sdk-1.0.1.tgz","fileCount":19,"integrity":"sha512-sW/he2KN3INdhXmMlpTk1OJKPWhYbKputY2kh38K9D3jnHeyt9jw+YaxfsRJ7GwFzqfXycvus20gI1l5KUziBg==","signatures":[{"sig":"MEQCIHNEmZ5Z6tgXVjV8ZPrBWUHjY7QJ0aF36Jq9Aj6kv9nfAiBxANF4jU1kE+7dm8VKc7F9DPBiQo9/4xGLfOQCwjQqIw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":37400},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"gitHead":"b0bae4b76debd8d31d7f4a501086adfc3d4bcf12","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"tsc","prepare":"npm run build"},"_npmUser":{"name":"odran","email":"odran@webforger.fr"},"repository":{"url":"git+https://github.com/AI-Smarttalk/anondocs-sdk.git","type":"git"},"_npmVersion":"10.8.1","description":"TypeScript SDK for AnonDocs API - Privacy-first text and document anonymization","directories":{},"_nodeVersion":"22.4.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.3.0","@types/node":"^20.10.0"},"_npmOperationalInternal":{"tmp":"tmp/anondocs-sdk_1.0.1_1762247185796_0.4255512089693809","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@aismarttalk/anondocs-sdk","version":"1.0.3","keywords":["anondocs","anonymization","pii","privacy","llm","document-processing"],"author":{"name":"AI SmartTalk"},"license":"MIT","_id":"@aismarttalk/anondocs-sdk@1.0.3","maintainers":[{"name":"odran","email":"odran@webforger.fr"},{"name":"caillaudpa","email":"pierre-antoine@aismarttalk.tech"}],"homepage":"https://github.com/AI-Smarttalk/anondocs-sdk#readme","bugs":{"url":"https://github.com/AI-Smarttalk/anondocs-sdk/issues"},"dist":{"shasum":"7adbc39988f3cf29fed3d387f18f8237ac37c087","tarball":"https://registry.npmjs.org/@aismarttalk/anondocs-sdk/-/anondocs-sdk-1.0.3.tgz","fileCount":19,"integrity":"sha512-kPVolQ6/8Oq2MAZFg722gQk88Onltlfo1HNY/CIEjyRO03POVDVMo7kHfwR++6mQ/+G2CsSnmSCfq2BlrbXKhw==","signatures":[{"sig":"MEUCIC4QbEV7cHkuZrH6Ke0d0xyrFOyUbpnX2NbkEkKa7lS9AiEAoEpuQG6W0L3slY2FujWNgEokwQ29cwtPNifD2qdxiT4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":37836},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"2442fe0dbacdb877a19f84bb27a23894f887cf7f","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"tsc","prepare":"npm run build"},"_npmUser":{"name":"odran","email":"odran@webforger.fr"},"repository":{"url":"git+https://github.com/AI-Smarttalk/anondocs-sdk.git","type":"git"},"_npmVersion":"10.8.1","description":"TypeScript SDK for AnonDocs API - Privacy-first text and document anonymization","directories":{},"_nodeVersion":"22.4.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.3.0","@types/node":"^20.10.0"},"_npmOperationalInternal":{"tmp":"tmp/anondocs-sdk_1.0.3_1762247632022_0.15465080089359384","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@aismarttalk/anondocs-sdk","version":"1.1.0","keywords":["anondocs","anonymization","pii","privacy","llm","document-processing"],"author":{"name":"AI SmartTalk"},"license":"MIT","_id":"@aismarttalk/anondocs-sdk@1.1.0","maintainers":[{"name":"odran","email":"odran@webforger.fr"},{"name":"caillaudpa","email":"pierre-antoine@aismarttalk.tech"}],"homepage":"https://anondocs.aismarttalk.tech","bugs":{"url":"https://github.com/AI-Smarttalk/anondocs-sdk/issues"},"dist":{"shasum":"543268375a1160b7d6afa0391f72b456e938df91","tarball":"https://registry.npmjs.org/@aismarttalk/anondocs-sdk/-/anondocs-sdk-1.1.0.tgz","fileCount":19,"integrity":"sha512-fzHBygH1bk8yjJoJcX24YH4lFvkVEuFcccDYUHOV1a2ZG1u1W6WNofDGT8AV5UUvTT/+lPzOCBSCF/5oxAMb5g==","signatures":[{"sig":"MEUCIGFrxmq0cmMJYz6vCm51D8RLBG5ri0jcn9OeAfvnbgr8AiEAlblkeNTnWoU8+ZBODLCD/PfwZ3QFzK7yR7h4lpjf9ig=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":38275},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"988c6b4c73552985848b8c5a1851eb5eb652a59c","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"tsc","prepare":"npm run build"},"_npmUser":{"name":"odran","email":"odran@webforger.fr"},"repository":{"url":"git+https://github.com/AI-Smarttalk/anondocs-sdk.git","type":"git"},"_npmVersion":"10.8.1","description":"TypeScript SDK for AnonDocs API - Privacy-first text and document anonymization","directories":{},"_nodeVersion":"22.4.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.3.0","@types/node":"^20.10.0"},"_npmOperationalInternal":{"tmp":"tmp/anondocs-sdk_1.1.0_1762248070941_0.38966823599744815","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@aismarttalk/anondocs-sdk","version":"1.2.0","keywords":["anondocs","anonymization","pii","privacy","llm","document-processing"],"author":{"name":"AI SmartTalk"},"license":"MIT","_id":"@aismarttalk/anondocs-sdk@1.2.0","maintainers":[{"name":"odran","email":"odran@webforger.fr"},{"name":"caillaudpa","email":"pierre-antoine@aismarttalk.tech"}],"homepage":"https://anondocs.aismarttalk.tech","bugs":{"url":"https://github.com/AI-Smarttalk/anondocs-sdk/issues"},"dist":{"shasum":"2424fbe7d8a39d5781c12c2c81e622bb7a163e9a","tarball":"https://registry.npmjs.org/@aismarttalk/anondocs-sdk/-/anondocs-sdk-1.2.0.tgz","fileCount":19,"integrity":"sha512-CjUXCF5MAbh+YYc4wsilE9vZ3XiBrFAoXUORFkplBvt2MDaLGsy64Gd/+IyMg91GfnHF7bgzv3oArJluPirGfg==","signatures":[{"sig":"MEYCIQC9rt4OnLL3+AkrD/Ekd2JxJiu3Se63xKuDSysq0WCZ8gIhANB+61/QNhcuMqROJ31t34gq2maWf0EZG8ZItPZl8XVG","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":40508},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"ac33853e75c19aabdf5de08f6e178d890b95e354","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"tsc","prepare":"npm run build"},"_npmUser":{"name":"odran","email":"odran@webforger.fr"},"repository":{"url":"git+https://github.com/AI-Smarttalk/anondocs-sdk.git","type":"git"},"_npmVersion":"10.8.1","description":"TypeScript SDK for AnonDocs API - Privacy-first text and document anonymization","directories":{},"_nodeVersion":"22.4.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.3.0","@types/node":"^20.10.0"},"_npmOperationalInternal":{"tmp":"tmp/anondocs-sdk_1.2.0_1762263585284_0.26548428249409306","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@aismarttalk/anondocs-sdk","version":"1.2.1","description":"TypeScript SDK for AnonDocs API - Privacy-first text and document anonymization","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"keywords":["anondocs","anonymization","pii","privacy","llm","document-processing"],"author":{"name":"AI SmartTalk"},"license":"MIT","homepage":"https://anondocs.aismarttalk.tech","devDependencies":{"@types/node":"^20.10.0","typescript":"^5.3.0"},"engines":{"node":">=18.0.0"},"repository":{"type":"git","url":"git+https://github.com/AI-Smarttalk/anondocs-sdk.git"},"publishConfig":{"access":"public"},"_id":"@aismarttalk/anondocs-sdk@1.2.1","gitHead":"c2251751379dabdaa456326fa021f3d71de60fc1","bugs":{"url":"https://github.com/AI-Smarttalk/anondocs-sdk/issues"},"_nodeVersion":"22.4.1","_npmVersion":"10.8.1","dist":{"integrity":"sha512-XPn6Ah4/pjSLUXwP3yaAlwzU5Ry6ThPPUGU9aDdSRXPTvyqcOih/StCQH2TEALTu1gFXO1aVwrBRQV+INg42fA==","shasum":"b88d2e255fa283d38c87907142ff864df93bad38","tarball":"https://registry.npmjs.org/@aismarttalk/anondocs-sdk/-/anondocs-sdk-1.2.1.tgz","fileCount":19,"unpackedSize":40869,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCICBGUX0iEoV5s3c/12dHr2C9pZgy6/R90aotjrW0NzpNAiAsjk6ScOxpnLQv2gE6zsVyAADaUDsD/mJL0B76yr7S6A=="}]},"_npmUser":{"name":"odran","email":"odran@webforger.fr"},"directories":{},"maintainers":[{"name":"odran","email":"odran@webforger.fr"},{"name":"caillaudpa","email":"pierre-antoine@aismarttalk.tech"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/anondocs-sdk_1.2.1_1762336974285_0.33684000547601767"},"_hasShrinkwrap":false}},"time":{"created":"2025-11-04T09:06:25.685Z","modified":"2025-11-05T10:02:54.708Z","1.0.1":"2025-11-04T09:06:26.010Z","1.0.3":"2025-11-04T09:13:52.248Z","1.1.0":"2025-11-04T09:21:11.128Z","1.2.0":"2025-11-04T13:39:45.515Z","1.2.1":"2025-11-05T10:02:54.480Z"},"bugs":{"url":"https://github.com/AI-Smarttalk/anondocs-sdk/issues"},"author":{"name":"AI SmartTalk"},"license":"MIT","homepage":"https://anondocs.aismarttalk.tech","keywords":["anondocs","anonymization","pii","privacy","llm","document-processing"],"repository":{"type":"git","url":"git+https://github.com/AI-Smarttalk/anondocs-sdk.git"},"description":"TypeScript SDK for AnonDocs API - Privacy-first text and document anonymization","maintainers":[{"name":"odran","email":"odran@webforger.fr"},{"name":"caillaudpa","email":"pierre-antoine@aismarttalk.tech"}],"readme":"# AnonDocs SDK\n\nTypeScript/JavaScript SDK for [AnonDocs](https://anondocs.aismarttalk.tech) - Privacy-first text and document anonymization powered by LLMs.\n\nMade with ❤️ by [AI SmartTalk](https://aismarttalk.tech)\n\n## Installation\n\n```bash\nnpm install @aismarttalk/anondocs-sdk\n```\n\n## Quick Start\n\n```typescript\nimport { AnonDocsClient } from '@aismarttalk/anondocs-sdk';\n\nconst client = new AnonDocsClient({\n  baseUrl: 'http://localhost:3000',\n  defaultProvider: 'ollama'\n});\n\n// Anonymize text\nconst result = await client.anonymizeText('My name is John Smith and my email is john@example.com');\n\nconsole.log(result.anonymizedText);\n// Output: \"My name is [NAME] and my email is [EMAIL]\"\n\nconsole.log(result.piiDetected);\n// Output: { names: ['John Smith'], emails: ['john@example.com'], ... }\n\nconsole.log(result.replacements);\n// Output: [\n//   { original: 'John Smith', anonymized: '[NAME]' },\n//   { original: 'john@example.com', anonymized: '[EMAIL]' }\n// ]\n```\n\n## Features\n\n- 🔒 **Privacy-first** anonymization using local or cloud LLMs\n- 📄 **Document support** (PDF, DOCX, TXT)\n- ✨ **DOCX formatting preserved** - Bold, italic, colors, and more!\n- 🎯 **Precision mapping** - Track every replacement with `replacements` array\n- 🌊 **Streaming** with real-time progress updates\n- 💾 **Full TypeScript** support with strict types\n- 🚀 **Works in Node.js and Browser**\n- ⚡ **Multiple LLM providers** (OpenAI, Anthropic, Ollama)\n- 🆓 **Zero runtime dependencies**\n\n## API Reference\n\n### Initialize Client\n\n```typescript\nconst client = new AnonDocsClient({\n  baseUrl: 'http://localhost:3000',  // Optional, defaults to localhost\n  defaultProvider: 'ollama',          // Optional: 'openai' | 'anthropic' | 'ollama'\n  timeout: 30000                      // Optional, defaults to 30s\n});\n```\n\n### Check Health\n\n```typescript\nconst health = await client.health();\n// Returns: { status: 'ok', timestamp: '2025-11-04T...' }\n```\n\n### Anonymize Text\n\n```typescript\nconst result = await client.anonymizeText(\n  'John Smith lives at 123 Main St and his email is john@example.com',\n  { provider: 'ollama' }  // Optional, uses defaultProvider if not specified\n);\n\nconsole.log(result.anonymizedText);\nconsole.log(result.piiDetected);\nconsole.log(result.processingTimeMs);\nconsole.log(result.wordsPerMinute);\nconsole.log(result.chunksProcessed);\n```\n\n### Anonymize Document\n\n**Node.js:**\n\n```typescript\nimport { readFileSync } from 'fs';\n\nconst fileBuffer = readFileSync('./document.pdf');\nconst result = await client.anonymizeDocument(fileBuffer, {\n  provider: 'ollama'\n});\n\n// For DOCX files: formatting is preserved!\nif (result.downloadUrl) {\n  console.log('Download anonymized DOCX:', result.downloadUrl);\n  console.log('Original filename:', result.originalFilename);\n}\n\n// Access replacement mappings\nresult.replacements.forEach(r => {\n  console.log(`\"${r.original}\" → \"${r.anonymized}\"`);\n});\n```\n\n**Browser:**\n\n```typescript\nconst fileInput = document.querySelector('input[type=\"file\"]');\nconst file = fileInput.files[0];\n\nconst result = await client.anonymizeDocument(file, {\n  provider: 'openai'\n});\n\n// Download DOCX with preserved formatting\nif (result.downloadUrl) {\n  window.open(result.downloadUrl, '_blank');\n}\n```\n\n### Streaming Anonymization\n\nGet real-time progress updates for long texts or documents:\n\n```typescript\nawait client.streamAnonymizeText(longText, {\n  provider: 'ollama',\n  onProgress: (event) => {\n    console.log(`${event.progress}% - ${event.message}`);\n    // Progress: 0-100\n    // Types: 'started', 'chunk_processing', 'chunk_completed', 'completed', 'error'\n  },\n  onComplete: (result) => {\n    console.log('Done!', result.anonymizedText);\n  },\n  onError: (error) => {\n    console.error('Error:', error.message);\n  }\n});\n```\n\n### Streaming Document Anonymization\n\n```typescript\nawait client.streamAnonymizeDocument(file, {\n  provider: 'ollama',\n  onProgress: (event) => {\n    updateProgressBar(event.progress);\n  },\n  onComplete: (result) => {\n    displayResults(result);\n  },\n  onError: (error) => {\n    showError(error);\n  }\n});\n```\n\n## Response Types\n\n### AnonymizationResult\n\n```typescript\ninterface AnonymizationResult {\n  anonymizedText: string;\n  piiDetected: {\n    names: string[];\n    addresses: string[];\n    emails: string[];\n    phoneNumbers: string[];\n    dates: string[];\n    organizations: string[];\n    other: string[];\n  };\n  replacements: Array<{\n    original: string;      // Exact original PII text\n    anonymized: string;    // What it was replaced with (e.g., \"[NAME]\")\n  }>;\n  chunksProcessed: number;\n  wordsPerMinute: number;\n  processingTimeMs: number;\n  // DOCX only: present when document is DOCX with preserved formatting\n  downloadUrl?: string;\n  filename?: string;\n  originalFilename?: string;\n}\n```\n\n**What's New:**\n- ✨ **`replacements`** - Precision mapping of original → anonymized text\n- ✨ **`downloadUrl`** - Download link for DOCX files with preserved formatting\n- ✨ **`filename`** - Generated filename for the anonymized document\n- ✨ **`originalFilename`** - Original document filename\n\n### ProgressEvent\n\n```typescript\ninterface ProgressEvent {\n  type: 'started' | 'chunk_processing' | 'chunk_completed' | 'completed' | 'error';\n  progress: number;        // 0-100\n  message: string;\n  currentChunk?: number;   // 1-indexed\n  totalChunks?: number;\n  data?: AnonymizationResult;  // Only on 'completed'\n}\n```\n\n## Error Handling\n\nThe SDK provides typed error classes:\n\n```typescript\nimport { \n  AnonDocsError,\n  AnonDocsApiError,\n  AnonDocsNetworkError,\n  AnonDocsValidationError,\n  AnonDocsStreamError\n} from '@aismarttalk/anondocs-sdk';\n\ntry {\n  await client.anonymizeText('');\n} catch (error) {\n  if (error instanceof AnonDocsValidationError) {\n    console.error('Validation error:', error.message);\n  } else if (error instanceof AnonDocsApiError) {\n    console.error('API error:', error.statusCode, error.message);\n  } else if (error instanceof AnonDocsNetworkError) {\n    console.error('Network error:', error.message);\n  }\n}\n```\n\n## Supported File Types\n\n- **DOCX**: `application/vnd.openxmlformats-officedocument.wordprocessingml.document`\n  - ✅ **Formatting preserved** (bold, italic, colors, alignment, etc.)\n  - ✅ **Download link provided** via `downloadUrl`\n  - ✅ **Best anonymization experience**\n- **PDF**: `application/pdf`\n  - ⚠️ Text extraction only (no formatting preserved)\n  - Returns anonymized text in response\n- **TXT**: `text/plain`\n  - Plain text anonymization\n  - Returns anonymized text in response\n\nMax file size: **10MB**\n\n## LLM Providers\n\n- **OpenAI** - Cloud-based, requires API key\n- **Anthropic** - Cloud-based, requires API key\n- **Ollama** - Local/self-hosted, privacy-first\n\n## Examples\n\nSee the [`examples/`](./examples) directory for complete usage examples:\n\n- [`basic-usage.ts`](./examples/basic-usage.ts) - Simple text anonymization\n- [`streaming-usage.ts`](./examples/streaming-usage.ts) - Real-time progress tracking\n- [`document-usage.ts`](./examples/document-usage.ts) - File upload for Node.js and Browser\n\n## TypeScript Support\n\nThe SDK is written in TypeScript and includes full type definitions. All types are exported:\n\n```typescript\nimport type {\n  LLMProvider,\n  PIIDetected,\n  PIIReplacement,\n  AnonymizationResult,\n  ProgressEvent,\n  ClientConfig\n} from '@aismarttalk/anondocs-sdk';\n```\n\n## Requirements\n\n- **Node.js**: >= 18.0.0 (uses native `fetch`, `FormData`, `Blob`)\n- **Browser**: Modern browsers with `fetch` and `ReadableStream` support\n- **Zero runtime dependencies** - works everywhere!\n\n## License\n\nMIT\n\n## Links\n\n- 🌐 **Website**: [anondocs.aismarttalk.tech](https://anondocs.aismarttalk.tech)\n- 📦 **NPM**: [@aismarttalk/anondocs-sdk](https://www.npmjs.com/package/@aismarttalk/anondocs-sdk)\n- 💻 **GitHub**: [AI-Smarttalk/anondocs-sdk](https://github.com/AI-Smarttalk/anondocs-sdk)\n- 📚 **Documentation**: [anondocs.aismarttalk.tech/documentation](https://anondocs.aismarttalk.tech/docs/intro)\n\n## Made with ❤️ by [AI SmartTalk](https://aismarttalk.tech)\n\n","readmeFilename":"README.md"}