{"_id":"@dysporium-sdk/utils","name":"@dysporium-sdk/utils","dist-tags":{"latest":"3.0.0"},"versions":{"3.0.0":{"name":"@dysporium-sdk/utils","version":"3.0.0","description":"Utility functions for Dysporium SDK - caching, cost tracking, middleware","type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"keywords":["ai","sdk","llm","utils","caching","cost-tracking","middleware"],"license":"MIT","repository":{"type":"git","url":"git+https://github.com/Dysporium/dysporium-ai-sdk.git","directory":"packages/utils"},"publishConfig":{"access":"public"},"dependencies":{"@dysporium-sdk/provider":"^3.0.0"},"devDependencies":{"@types/node":"^20.10.0","tsup":"^8.0.0","typescript":"^5.3.0"},"scripts":{"build":"tsup","dev":"tsup --watch","clean":"rm -rf dist"},"_id":"@dysporium-sdk/utils@3.0.0","bugs":{"url":"https://github.com/Dysporium/dysporium-ai-sdk/issues"},"homepage":"https://github.com/Dysporium/dysporium-ai-sdk#readme","_integrity":"sha512-jMmqJXMlkaIKSCX+w9fQhLnZnNqHVQsz0A0SCZ6VU53FaRS8fR75rWUd1232abFc0JCCr9e8SuzPcXVNRSxxLw==","_resolved":"C:\\Users\\paulm\\AppData\\Local\\Temp\\bfb52a1a1af8f2f5395382193f0846f5\\dysporium-sdk-utils-3.0.0.tgz","_from":"file:dysporium-sdk-utils-3.0.0.tgz","_nodeVersion":"20.19.6","_npmVersion":"11.1.0","dist":{"integrity":"sha512-jMmqJXMlkaIKSCX+w9fQhLnZnNqHVQsz0A0SCZ6VU53FaRS8fR75rWUd1232abFc0JCCr9e8SuzPcXVNRSxxLw==","shasum":"b6ff3735d73b796dd901bc815f3f88dcbab22b69","tarball":"https://registry.npmjs.org/@dysporium-sdk/utils/-/utils-3.0.0.tgz","fileCount":6,"unpackedSize":108665,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDUIKShPNbXtN3r8ui15HAq1BZ7WrA5BTttx9+DxXcm8gIgFFr6LksxJxZ09+EqFPcmSf+2Cox4XzyyA1X2j5i/k28="}]},"_npmUser":{"name":"paulmothapo","email":"paulmothapo.personal@gmail.com"},"directories":{},"maintainers":[{"name":"paulmothapo","email":"paulmothapo.personal@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/utils_3.0.0_1766839875912_0.16168463317759563"},"_hasShrinkwrap":false}},"time":{"created":"2025-12-27T12:51:15.803Z","3.0.0":"2025-12-27T12:51:16.071Z","modified":"2025-12-27T12:51:16.413Z"},"maintainers":[{"name":"paulmothapo","email":"paulmothapo.personal@gmail.com"}],"description":"Utility functions for Dysporium SDK - caching, cost tracking, middleware","homepage":"https://github.com/Dysporium/dysporium-ai-sdk#readme","keywords":["ai","sdk","llm","utils","caching","cost-tracking","middleware"],"repository":{"type":"git","url":"git+https://github.com/Dysporium/dysporium-ai-sdk.git","directory":"packages/utils"},"bugs":{"url":"https://github.com/Dysporium/dysporium-ai-sdk/issues"},"license":"MIT","readme":"# @dysporium-sdk/utils\r\n\r\nUtility functions for Dysporium SDK - caching, cost tracking, and middleware.\r\n\r\n## Installation\r\n\r\n```bash\r\nnpm install @dysporium-sdk/utils\r\n```\r\n\r\n## Features\r\n\r\n- **Request/Response Hooks** - Middleware for logging, metrics, and custom processing\r\n- **Response Caching** - In-memory and semantic caching for LLM responses\r\n- **Cost Tracking** - Track and estimate costs across OpenAI, Anthropic, and Qwen\r\n\r\n## Usage\r\n\r\n### Request/Response Hooks\r\n\r\n```typescript\r\nimport { MiddlewareManager, createLoggingHook } from '@dysporium-sdk/utils';\r\n\r\n// Create middleware manager with logging\r\nconst middleware = new MiddlewareManager(createLoggingHook());\r\n\r\n// Add custom hooks\r\nmiddleware.beforeRequest((ctx) => {\r\n  console.log(`Request ${ctx.requestId} to ${ctx.modelId}`);\r\n});\r\n\r\nmiddleware.afterResponse((ctx) => {\r\n  console.log(`Response in ${ctx.duration}ms, used ${ctx.result.usage.totalTokens} tokens`);\r\n});\r\n\r\nmiddleware.onError((ctx) => {\r\n  console.error(`Error: ${ctx.error.message}`);\r\n});\r\n```\r\n\r\n### Response Caching\r\n\r\n```typescript\r\nimport { MemoryCache, generateCacheKey } from '@dysporium-sdk/utils';\r\n\r\n// Create cache with 1 hour TTL\r\nconst cache = new MemoryCache({ ttl: 3600000, maxSize: 1000 });\r\n\r\n// Check cache before making request\r\nconst key = generateCacheKey(options, modelId, provider);\r\nconst cached = cache.get(key);\r\n\r\nif (cached) {\r\n  return cached;\r\n}\r\n\r\n// Make request and cache result\r\nconst result = await generateText(options);\r\ncache.set(key, result);\r\n\r\n// Get cache stats\r\nconsole.log(cache.stats()); // { hits, misses, size, hitRate }\r\n```\r\n\r\n### Semantic Cache\r\n\r\n```typescript\r\nimport { SemanticCache } from '@dysporium-sdk/utils';\r\n\r\n// Cache responses based on semantic similarity\r\nconst cache = new SemanticCache({\r\n  similarityThreshold: 0.95,\r\n  ttl: 3600000,\r\n});\r\n\r\n// Find similar cached response\r\nconst embedding = await embed({ model, value: prompt });\r\nconst cached = cache.findSimilar(embedding);\r\n\r\nif (!cached) {\r\n  const result = await generateText(options);\r\n  cache.add(prompt, embedding, result);\r\n}\r\n```\r\n\r\n### Cost Tracking\r\n\r\n```typescript\r\nimport { \r\n  CostTracker, \r\n  calculateCost, \r\n  formatCost,\r\n  formatSummary \r\n} from '@dysporium-sdk/utils';\r\n\r\n// Calculate cost for a single request\r\nconst cost = calculateCost(result.usage, 'gpt-4o', 'openai');\r\nconsole.log(formatCost(cost.totalCost)); // $0.0123\r\n\r\n// Track costs over time\r\nconst tracker = new CostTracker();\r\n\r\n// Track each request\r\ntracker.track(result.usage, 'gpt-4o', 'openai');\r\ntracker.track(result2.usage, 'claude-sonnet-4-5', 'anthropic');\r\n\r\n// Get summary\r\nconst summary = tracker.getSummary();\r\nconsole.log(formatSummary(summary));\r\n\r\n// Check budget\r\nif (tracker.isBudgetExceeded(10.00)) {\r\n  console.warn('Daily budget exceeded!');\r\n}\r\n\r\n// Get cost for last hour\r\nconst hourCost = tracker.getCostForPeriod(60);\r\n```\r\n\r\n### Pricing Data\r\n\r\n```typescript\r\nimport { \r\n  OPENAI_PRICING, \r\n  ANTHROPIC_PRICING, \r\n  QWEN_PRICING \r\n} from '@dysporium-sdk/utils';\r\n\r\n// Access pricing for any model\r\nconsole.log(OPENAI_PRICING['gpt-4o']);\r\n// { inputPer1M: 2.50, outputPer1M: 10.00, cachedInputPer1M: 1.25 }\r\n\r\nconsole.log(ANTHROPIC_PRICING['claude-sonnet-4-5']);\r\n// { inputPer1M: 3.00, outputPer1M: 15.00, cachedInputPer1M: 0.30 }\r\n```\r\n\r\n## API Reference\r\n\r\n### Hooks\r\n\r\n- `MiddlewareManager` - Manage request/response hooks\r\n- `createLoggingHook()` - Built-in logging hook\r\n- `createMetricsHook()` - Built-in metrics collection hook\r\n\r\n### Caching\r\n\r\n- `MemoryCache` - In-memory LRU cache with TTL\r\n- `SemanticCache` - Similarity-based caching using embeddings\r\n- `generateCacheKey()` - Generate deterministic cache keys\r\n- `createCacheMiddleware()` - Create cache middleware\r\n\r\n### Cost Tracking\r\n\r\n- `CostTracker` - Track costs over time\r\n- `calculateCost()` - Calculate cost from usage\r\n- `estimateCost()` - Estimate cost from token counts\r\n- `formatCost()` - Format cost as string\r\n- `formatSummary()` - Format cost summary\r\n\r\n## License\r\n\r\nMIT\r\n\r\n","readmeFilename":"README.md","_rev":"1-a7b9a06615831c68587e86b80edf916d"}