{"_id":"@disseqt-ai/sdk","_rev":"5-1cbbd6453ee8ac02f43719c556d95f1f","name":"@disseqt-ai/sdk","dist-tags":{"latest":"0.3.0"},"versions":{"0.1.0":{"name":"@disseqt-ai/sdk","version":"0.1.0","keywords":["ai","llm","validation","sdk","guardrails","observability","agentic","tracing","disseqt"],"author":{"name":"Disseqt AI Limited","email":"support@disseqt.ai"},"license":"Proprietary","_id":"@disseqt-ai/sdk@0.1.0","maintainers":[{"name":"tushar.mudgal","email":"tushar.mudgal@disseqt.ai"},{"name":"sumit-disseqt","email":"sumit.das@disseqt.ai"}],"homepage":"https://docs.disseqt.ai","bugs":{"url":"https://github.com/DisseqtAI/disseqt-node-sdk/issues"},"dist":{"shasum":"5688164c606fff7c2c59bf21fb676c5e08d8d6d1","tarball":"https://registry.npmjs.org/@disseqt-ai/sdk/-/sdk-0.1.0.tgz","fileCount":32,"integrity":"sha512-aGdIDb/AN7Odfk1Eig6izj1EI8tUX78zbvkrjnit1MBXm2wDcna9n9IEmEjH8RdaK6D2vqWuy6uOuJQobE/+/w==","signatures":[{"sig":"MEYCIQCkqkDPCBJr0YXw4Vj9GVDRgzq0+tVAaOBTrCcNe+NLWwIhAIdNi8up77Exvio+jGXY/5xW3o5Ji3pz7nHuTO4b8uQR","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@disseqt-ai%2fsdk@0.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1261583},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.18.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./agentic":{"types":"./dist/agentic/index.d.ts","import":"./dist/agentic/index.js","require":"./dist/agentic/index.cjs"},"./validation":{"types":"./dist/validation/index.d.ts","import":"./dist/validation/index.js","require":"./dist/validation/index.cjs"},"./prompt-packs":{"types":"./dist/prompt-packs/index.d.ts","import":"./dist/prompt-packs/index.js","require":"./dist/prompt-packs/index.cjs"}},"gitHead":"ddf11e9acceb8bdc49a43ce84f820f3dc39052f8","scripts":{"lint":"eslint .","test":"vitest run","build":"tsup","clean":"rimraf dist coverage","format":"prettier --write .","prepack":"npm run clean && npm run lint && npm run typecheck && npm run test && npm run build","smoke:all":"npm run build && node scripts/smoke-all.mjs","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check .","pack:dry-run":"npm pack --dry-run","smoke:all:live":"npm run build && DISSEQT_LIVE=1 node scripts/smoke-all.mjs --live","validators:all":"tsx scripts/run-all-validators.ts"},"_npmUser":{"name":"sumit-disseqt","email":"sumit.das@disseqt.ai"},"repository":{"url":"git+https://github.com/DisseqtAI/disseqt-node-sdk.git","type":"git"},"_npmVersion":"10.8.2","description":"Node.js SDK for Disseqt AI validation, prompt packs, and agentic tracing.","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.3","tsup":"^8.3.5","eslint":"^9.17.0","rimraf":"^6.0.1","vitest":"^2.1.8","prettier":"^3.4.2","typescript":"^5.7.2","@types/node":"^22.10.2","@vitest/coverage-v8":"^2.1.9","eslint-config-prettier":"^9.1.0","@typescript-eslint/parser":"^8.18.1","@typescript-eslint/eslint-plugin":"^8.18.1"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.1.0_1779958516291_0.052354391438295345","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@disseqt-ai/sdk","version":"0.1.1","keywords":["ai","llm","validation","sdk","guardrails","observability","agentic","tracing","disseqt"],"author":{"name":"Disseqt AI Limited","email":"support@disseqt.ai"},"license":"Proprietary","_id":"@disseqt-ai/sdk@0.1.1","maintainers":[{"name":"tushar.mudgal","email":"tushar.mudgal@disseqt.ai"},{"name":"sumit-disseqt","email":"sumit.das@disseqt.ai"}],"homepage":"https://docs.disseqt.ai","bugs":{"url":"https://github.com/DisseqtAI/disseqt-node-sdk/issues"},"dist":{"shasum":"5f1c76fac633cac5519d492bd6d6f02b6bd04aff","tarball":"https://registry.npmjs.org/@disseqt-ai/sdk/-/sdk-0.1.1.tgz","fileCount":32,"integrity":"sha512-//oERYdTp8YRIyZ4w3KSLpGXepK5sYYT9iwrScmQBZVmMumRtGw3TrgQpoj3k6mrPx3gyI44ib5fjJr7d4uGyA==","signatures":[{"sig":"MEUCIHE5le5Lgr/piBgEe7gExJoxDAOSwFt1Ydan/OTEFg/ZAiEA2rkisRgbAECrwxGfrXjPzqPGHJ9jdAwhP1XmIuC9YhM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@disseqt-ai%2fsdk@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1278366},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.18.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./agentic":{"types":"./dist/agentic/index.d.ts","import":"./dist/agentic/index.js","require":"./dist/agentic/index.cjs"},"./validation":{"types":"./dist/validation/index.d.ts","import":"./dist/validation/index.js","require":"./dist/validation/index.cjs"},"./prompt-packs":{"types":"./dist/prompt-packs/index.d.ts","import":"./dist/prompt-packs/index.js","require":"./dist/prompt-packs/index.cjs"}},"gitHead":"8095b8dcc655a003f648c3928250e63e71968940","scripts":{"lint":"eslint .","test":"vitest run","build":"tsup","clean":"rimraf dist coverage","format":"prettier --write .","prepack":"npm run clean && npm run lint && npm run typecheck && npm run test && npm run build","smoke:all":"npm run build && node scripts/smoke-all.mjs","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check .","pack:dry-run":"npm pack --dry-run","smoke:all:live":"npm run build && DISSEQT_LIVE=1 node scripts/smoke-all.mjs --live","validators:all":"tsx scripts/run-all-validators.ts"},"_npmUser":{"name":"sumit-disseqt","email":"sumit.das@disseqt.ai"},"repository":{"url":"git+https://github.com/DisseqtAI/disseqt-node-sdk.git","type":"git"},"_npmVersion":"10.8.2","description":"Node.js SDK for Disseqt AI validation, prompt packs, and agentic tracing.","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.3","tsup":"^8.3.5","eslint":"^9.17.0","rimraf":"^6.0.1","vitest":"^2.1.8","prettier":"^3.4.2","typescript":"^5.7.2","@types/node":"^22.10.2","@vitest/coverage-v8":"^2.1.9","eslint-config-prettier":"^9.1.0","@typescript-eslint/parser":"^8.18.1","@typescript-eslint/eslint-plugin":"^8.18.1"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.1.1_1779966929806_0.37408091533191756","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@disseqt-ai/sdk","version":"0.1.2","keywords":["ai","llm","validation","sdk","guardrails","observability","agentic","tracing","disseqt"],"author":{"name":"Disseqt AI Limited","email":"support@disseqt.ai"},"license":"Proprietary","_id":"@disseqt-ai/sdk@0.1.2","maintainers":[{"name":"tushar.mudgal","email":"tushar.mudgal@disseqt.ai"},{"name":"sumit-disseqt","email":"sumit.das@disseqt.ai"}],"homepage":"https://docs.disseqt.ai","bugs":{"url":"https://github.com/DisseqtAI/disseqt-node-sdk/issues"},"dist":{"shasum":"f07758e21f48f76ed2e575ece61de138b7339573","tarball":"https://registry.npmjs.org/@disseqt-ai/sdk/-/sdk-0.1.2.tgz","fileCount":32,"integrity":"sha512-sF2P/ArbvI7AgIP/gJuBMiHMeuVq/+u1CaS/oOBwrTaTV4vQLkrQ7R/ov8ZKhTqSSYJ9PPV7fnPZHOWWUCOiNA==","signatures":[{"sig":"MEQCIEV/iSbnNrpXLLhhDPDXqMTXstM8w+TXeNOCdgboSFkRAiBlUyvXc2ILVgMcg2NRdS5mmWBUXORSjmBnj1bu5IZi1g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@disseqt-ai%2fsdk@0.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1278395},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.18.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./agentic":{"types":"./dist/agentic/index.d.ts","import":"./dist/agentic/index.js","require":"./dist/agentic/index.cjs"},"./validation":{"types":"./dist/validation/index.d.ts","import":"./dist/validation/index.js","require":"./dist/validation/index.cjs"},"./prompt-packs":{"types":"./dist/prompt-packs/index.d.ts","import":"./dist/prompt-packs/index.js","require":"./dist/prompt-packs/index.cjs"}},"gitHead":"fc8ff84aeb6351e0c97e98de16eccd04a2906f14","scripts":{"lint":"eslint .","test":"vitest run","build":"tsup","clean":"rimraf dist coverage","format":"prettier --write .","prepack":"npm run clean && npm run lint && npm run typecheck && npm run test && npm run build","smoke:all":"npm run build && node scripts/smoke-all.mjs","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check .","pack:dry-run":"npm pack --dry-run","smoke:all:live":"npm run build && DISSEQT_LIVE=1 node scripts/smoke-all.mjs --live","validators:all":"tsx scripts/run-all-validators.ts"},"_npmUser":{"name":"sumit-disseqt","email":"sumit.das@disseqt.ai"},"repository":{"url":"git+https://github.com/DisseqtAI/disseqt-node-sdk.git","type":"git"},"_npmVersion":"10.8.2","description":"Node.js SDK for Disseqt AI validation, prompt packs, and agentic tracing.","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.3","tsup":"^8.3.5","eslint":"^9.17.0","rimraf":"^6.0.1","vitest":"^2.1.8","prettier":"^3.4.2","typescript":"^5.7.2","@types/node":"^22.10.2","@vitest/coverage-v8":"^2.1.9","eslint-config-prettier":"^9.1.0","@typescript-eslint/parser":"^8.18.1","@typescript-eslint/eslint-plugin":"^8.18.1"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.1.2_1779967383243_0.4061726380592465","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@disseqt-ai/sdk","version":"0.2.0","keywords":["ai","llm","validation","sdk","guardrails","observability","agentic","tracing","disseqt"],"author":{"name":"Disseqt AI Limited","email":"support@disseqt.ai"},"license":"Proprietary","_id":"@disseqt-ai/sdk@0.2.0","maintainers":[{"name":"tushar.mudgal","email":"tushar.mudgal@disseqt.ai"},{"name":"sumit-disseqt","email":"sumit.das@disseqt.ai"}],"homepage":"https://docs.disseqt.ai","bugs":{"url":"https://github.com/DisseqtAI/disseqt-node-sdk/issues"},"dist":{"shasum":"20bb434d62e0f5a841126730621a5997a262acf9","tarball":"https://registry.npmjs.org/@disseqt-ai/sdk/-/sdk-0.2.0.tgz","fileCount":32,"integrity":"sha512-lIyvhvj+20m4UxI1ww5wCrj82V8D7PX6TVdGWK1WJEwIJUDa9D7RhaCfvBNx5ntKnkgOxHncV6pb8CG2a9wyRg==","signatures":[{"sig":"MEQCICesQjmzI4BefzUep3JdezPbs8UUS4mJFCB5uwTKSu8zAiB7wM5FqTY4/AA23tpGFTjZieZXp3+qsYa4trw0S8ADqg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@disseqt-ai%2fsdk@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1292288},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.18.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./agentic":{"types":"./dist/agentic/index.d.ts","import":"./dist/agentic/index.js","require":"./dist/agentic/index.cjs"},"./validation":{"types":"./dist/validation/index.d.ts","import":"./dist/validation/index.js","require":"./dist/validation/index.cjs"},"./prompt-packs":{"types":"./dist/prompt-packs/index.d.ts","import":"./dist/prompt-packs/index.js","require":"./dist/prompt-packs/index.cjs"}},"gitHead":"ef51f692f6e0f28950f404c3e619692089471e45","scripts":{"lint":"eslint .","test":"vitest run","build":"tsup","clean":"rimraf dist coverage","format":"prettier --write .","prepack":"npm run clean && npm run lint && npm run typecheck && npm run test && npm run build","smoke:all":"npm run build && node scripts/smoke-all.mjs","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check .","pack:dry-run":"npm pack --dry-run","smoke:all:live":"npm run build && DISSEQT_LIVE=1 node scripts/smoke-all.mjs --live","validators:all":"tsx scripts/run-all-validators.ts"},"_npmUser":{"name":"sumit-disseqt","email":"sumit.das@disseqt.ai"},"repository":{"url":"git+https://github.com/DisseqtAI/disseqt-node-sdk.git","type":"git"},"_npmVersion":"10.8.2","description":"Node.js SDK for Disseqt AI validation, prompt packs, and agentic tracing.","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.3","tsup":"^8.3.5","eslint":"^9.17.0","rimraf":"^6.0.1","vitest":"^2.1.8","prettier":"^3.4.2","typescript":"^5.7.2","@types/node":"^22.10.2","@vitest/coverage-v8":"^2.1.9","eslint-config-prettier":"^9.1.0","@typescript-eslint/parser":"^8.18.1","@typescript-eslint/eslint-plugin":"^8.18.1"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.2.0_1780482322947_0.9473843427573039","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@disseqt-ai/sdk","version":"0.3.0","description":"Node.js SDK for Disseqt AI validation, prompt packs, and agentic tracing.","license":"Proprietary","author":{"name":"Disseqt AI Limited","email":"support@disseqt.ai"},"type":"module","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"},"./validation":{"types":"./dist/validation/index.d.ts","import":"./dist/validation/index.js","require":"./dist/validation/index.cjs"},"./prompt-packs":{"types":"./dist/prompt-packs/index.d.ts","import":"./dist/prompt-packs/index.js","require":"./dist/prompt-packs/index.cjs"},"./agentic":{"types":"./dist/agentic/index.d.ts","import":"./dist/agentic/index.js","require":"./dist/agentic/index.cjs"}},"engines":{"node":">=18.18.0"},"scripts":{"build":"tsup","clean":"rimraf dist coverage","postinstall":"node scripts/compat-brace-expansion.cjs","test":"vitest run","test:watch":"vitest","typecheck":"tsc --noEmit","lint":"eslint .","format":"prettier --write .","format:check":"prettier --check .","smoke:all":"npm run build && node scripts/smoke-all.mjs","smoke:all:live":"npm run build && DISSEQT_LIVE=1 node scripts/smoke-all.mjs --live","validators:all":"tsx scripts/run-all-validators.ts","prepack":"npm run clean && npm run lint && npm run typecheck && npm run test && npm run build","pack:dry-run":"npm pack --dry-run"},"keywords":["ai","llm","validation","sdk","guardrails","observability","agentic","tracing","disseqt"],"repository":{"type":"git","url":"git+https://github.com/DisseqtAI/disseqt-node-sdk.git"},"bugs":{"url":"https://github.com/DisseqtAI/disseqt-node-sdk/issues"},"homepage":"https://docs.disseqt.ai","publishConfig":{"access":"public"},"devDependencies":{"@types/node":"^22.10.2","@typescript-eslint/eslint-plugin":"^8.18.1","@typescript-eslint/parser":"^8.18.1","@vitest/coverage-v8":"^3.2.7","eslint":"^9.17.0","eslint-config-prettier":"^9.1.0","prettier":"^3.4.2","rimraf":"^6.0.1","tsup":"^8.5.1","tsx":"^4.23.5","typescript":"^5.7.2","vitest":"^3.2.7"},"overrides":{"postcss":"^8.5.18","brace-expansion":"5.0.8","js-yaml":"^4.3.0","esbuild":"^0.28.1"},"_id":"@disseqt-ai/sdk@0.3.0","gitHead":"bd87cd8794915044f73d47e45a52b847a8a5712d","_nodeVersion":"20.20.2","_npmVersion":"10.8.2","dist":{"integrity":"sha512-b+n1a8JNOr8kh1Rn+DwWdNGwvMy1cIlQ9O+jOGd+ytbc9uHR225sG2c6sXXtwDEo66jy1fPZXFYagn3Q+kBizA==","shasum":"8721ef16af2a41b689bccc705046a66b94a962aa","tarball":"https://registry.npmjs.org/@disseqt-ai/sdk/-/sdk-0.3.0.tgz","fileCount":32,"unpackedSize":1633228,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@disseqt-ai%2fsdk@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDPb+nYshC4exlQVBvX+fsXzE6GfuhOrTlZ3eefsxx6rQIgaaRG3peLa9ojP8R6KqefvFNqWPCFOygWZB+EV4epoOQ="}]},"_npmUser":{"name":"sumit-disseqt","email":"sumit.das@disseqt.ai"},"directories":{},"maintainers":[{"name":"tushar.mudgal","email":"tushar.mudgal@disseqt.ai"},{"name":"sumit-disseqt","email":"sumit.das@disseqt.ai"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sdk_0.3.0_1787502949178_0.15331576472148933"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-28T08:55:16.104Z","modified":"2026-08-23T16:35:49.769Z","0.1.0":"2026-05-28T08:55:16.452Z","0.1.1":"2026-05-28T11:15:29.979Z","0.1.2":"2026-05-28T11:23:03.445Z","0.2.0":"2026-06-03T10:25:23.088Z","0.3.0":"2026-08-23T16:35:49.327Z"},"bugs":{"url":"https://github.com/DisseqtAI/disseqt-node-sdk/issues"},"author":{"name":"Disseqt AI Limited","email":"support@disseqt.ai"},"license":"Proprietary","homepage":"https://docs.disseqt.ai","keywords":["ai","llm","validation","sdk","guardrails","observability","agentic","tracing","disseqt"],"repository":{"type":"git","url":"git+https://github.com/DisseqtAI/disseqt-node-sdk.git"},"description":"Node.js SDK for Disseqt AI validation, prompt packs, and agentic tracing.","maintainers":[{"name":"tushar.mudgal","email":"tushar.mudgal@disseqt.ai"},{"name":"sumit-disseqt","email":"sumit.das@disseqt.ai"}],"readme":"# @disseqt-ai/sdk\n\n[![npm version](https://img.shields.io/npm/v/@disseqt-ai/sdk.svg)](https://www.npmjs.com/package/@disseqt-ai/sdk)\n[![Node](https://img.shields.io/node/v/@disseqt-ai/sdk.svg)](https://nodejs.org)\n[![Types](https://img.shields.io/npm/types/@disseqt-ai/sdk.svg)](https://www.npmjs.com/package/@disseqt-ai/sdk)\n[![License](https://img.shields.io/badge/license-Proprietary-blue.svg)](LICENSE)\n\nThe official **Node.js / TypeScript SDK** for the [Disseqt AI](https://disseqt.ai) platform. Validate LLM inputs and outputs, score RAG and agentic workflows, run prompt packs, and emit OpenTelemetry-style traces — all from a single package, with first-class TypeScript types for ESM and CommonJS consumers.\n\n**[Documentation](https://docs.disseqt.ai)** · **[API Reference](https://docs.disseqt.ai)** · **[Examples](./examples)** · **[Changelog](./CHANGELOG.md)**\n\n---\n\n## Contents\n\n- [Features](#features)\n- [Installation](#installation)\n- [Quick Start](#quick-start)\n  - [Validation](#validation)\n  - [Realtime Policies](#realtime-policies)\n  - [Composite Scoring](#composite-scoring)\n  - [Agentic Tracing](#agentic-tracing)\n  - [Prompt Packs](#prompt-packs)\n- [Configuration](#configuration)\n- [Available Validators](#available-validators)\n- [Request Models](#request-models)\n- [Response Format](#response-format)\n- [Error Handling](#error-handling)\n- [Two API Styles](#two-api-styles)\n- [Defaults and Wire Conventions](#defaults-and-wire-conventions)\n- [Smoke Testing](#smoke-testing)\n- [Development](#development)\n- [License](#license)\n\n---\n\n## Features\n\nThe package exposes three independent clients that share the same auth conventions but otherwise serve different product surfaces.\n\n| Client                               | Purpose                                                                                                                                      |\n| ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------- |\n| **`Client`** (alias `DisseqtClient`) | Synchronous request/response validation — 70 validators across 6 domains plus the composite scorer.                                          |\n| **`DisseqtAgenticClient`**           | Fire-and-forget tracing. Emits OpenTelemetry-style spans for LLM calls, tool calls, and agent actions, with automatic batching and flushing. |\n| **`DisseqtAPIClient`**               | Prompt-pack lifecycle: generate, run, attach output validations, download results.                                                           |\n\nShared traits:\n\n- **TypeScript-first**, with hand-written types for every request and response shape.\n- **Dual-module build** — ESM (`import`) and CommonJS (`require`) consumers both supported, types ship in `dist/`.\n- **Zero runtime dependencies.**\n- **Snake_case and camelCase** are both accepted on every config and request init.\n\n---\n\n## Installation\n\n```bash\nnpm install @disseqt-ai/sdk\n```\n\nRequires **Node 18.18 or newer**. Works under any modern bundler (Vite, esbuild, webpack, Next.js, Remix, etc.).\n\n---\n\n## Quick Start\n\n### Validation\n\n```ts\nimport { Client } from '@disseqt-ai/sdk';\n\nconst client = new Client({\n  projectId: 'your-project-id',\n  apiKey: 'your-api-key',\n});\n\nconst result = await client.input.toxicity(\n  { prompt: 'You are absolutely worthless and should be ashamed.' },\n  { threshold: 0.5, customLabels: ['Safe', 'Toxic'], labelThresholds: [0.5] },\n);\n\nconsole.log(result.score); // 0.9994\nconsole.log(result.threshold_validated_result); // \"Fail\"\n```\n\nEvery domain has a typed accessor on `Client`:\n\n```ts\nawait client.input.promptInjection(data, config);\nawait client.output.factualConsistency(data, config);\nawait client.rag.contextRelevance(data, config);\nawait client.agentic.topicAdherence(data, config);\nawait client.mcp.dataLeakage(data, config);\nawait client.themes.classify(data); // no config\nawait client.composite.evaluate(data); // no config\n```\n\nSee [Two API Styles](#two-api-styles) for the equivalent low-level `client.validate(validator)` form.\n\n#### LLM-as-a-Judge\n\nAny paired validator can be graded by a certified LLM judge on **your own**\nLLM account — set `llmAsAJudge: true` with the mandatory `llmId` (copy it from\nDashboard → AI Inventory → LLM Integrations → ID column). Full guide:\n[docs/llm-as-a-judge.md](./docs/llm-as-a-judge.md).\n\n```ts\nconfig: { threshold: 0.5, llmAsAJudge: true, llmId: '25dc0684-…' }\n```\n\n### Realtime Policies\n\nA **realtime policy** is a named, versioned bundle of validators — with their thresholds, labels, and a decision strategy — that you author once in the Disseqt dashboard and evaluate by **policy id**, straight from `client.validate()`. No validator, no config, no threshold in code — the policy owns all of that:\n\n```ts\nimport { Client, InputValidationRequest, anyBlocking } from '@disseqt-ai/sdk';\n\nconst client = new Client({\n  projectId: 'your-project-id',\n  apiKey: 'your-api-key',\n  applicationName: 'checkout-bot', // required to evaluate policies\n});\n\nconst result = await client.validate(new InputValidationRequest({ prompt: userInput }), {\n  policies: ['994ad00e-bff4-4cff-8a45-2635f3f3fcd0'],\n});\n\nif (anyBlocking(result)) {\n  throw new Error('Blocked by realtime policy');\n}\n```\n\nFor each policy id the server resolves the latest published version, runs every validator the policy specifies, applies the policy's decision strategy, returns one **BLOCK/PASS** verdict with a per-rule breakdown, and records the decision on the dashboard's **Decisions** ledger. Change a threshold in the dashboard, publish, and every caller picks it up — no code deploy.\n\n`validate()` has three call shapes:\n\n```ts\n// 1. Validator only — classic, unchanged.\nawait client.validate(validator);\n\n// 2. Validator + policies — the validator runs as usual AND the same\n//    input is evaluated against each policy id.\nconst result = await client.validate(validator, { policies: [policyId] });\nresult.validation; // the validator's own result\nresult.policies; // one full-policy verdict per id, in order\n\n// 3. Policies only — pass a bare request model; the policies decide everything.\nawait client.validate(new InputValidationRequest({ prompt }), { policies: [policyId] });\n```\n\nA client-level default applies the same list to every call (a per-call `{ policies }` always overrides it):\n\n```ts\nconst governed = new Client({\n  projectId,\n  apiKey,\n  applicationName: 'checkout-bot',\n  policies: ['994ad00e-…'], // every validate() call is now policy-checked\n});\n```\n\nRead verdicts with the typed helpers:\n\n```ts\nimport { parsePolicy, isBlocking, isAsync, anyBlocking } from '@disseqt-ai/sdk';\n\nconst decision = parsePolicy(result.policies[0]);\ndecision?.decision; // 'BLOCK' | 'PASS'\ndecision?.enforcement; // 'sync' | 'async'\ndecision?.rulesets; // per-rule breakdown: validator, status, score, threshold\n```\n\nSee [`examples/realtime-policies.ts`](examples/realtime-policies.ts) for a runnable walkthrough.\n\n### Composite Scoring\n\nAggregates many validators into one weighted score:\n\n```ts\nconst result = await client.composite.evaluate({\n  llmInputQuery: 'What is the capital of France?',\n  llmOutput: 'The capital of France is Paris.',\n  llmInputContext: 'France is a country in Europe.',\n  evaluationMode: 'binary_threshold',\n  weightsOverride: {\n    top_level: {\n      factual_semantic_alignment: 0.5,\n      language: 0.25,\n      safety_security_integrity: 0.25,\n    },\n    submetrics: {\n      /* per-metric weights, see examples/composite-score.ts */\n    },\n  },\n});\n\nconsole.log(result.overall_confidence.score);\nconsole.log(result.overall_confidence.label);\n```\n\n### Agentic Tracing\n\n```ts\nimport {\n  DisseqtAgenticClient,\n  SpanKind,\n  startTrace,\n  traceLlmCall,\n  traceToolCall,\n} from '@disseqt-ai/sdk';\n\nconst tracing = new DisseqtAgenticClient({\n  projectId: 'your-project-id',\n  apiKey: 'your-api-key',\n  serviceName: 'assistant-service',\n});\n\nawait startTrace(tracing, 'agent_workflow', { intentId: 'help-user' }).run(async (trace) => {\n  const agent = trace.startSpan('agent_execution', SpanKind.AgentExec);\n  agent.setAgentInfo('assistant', 'agent-001');\n\n  const llm = traceLlmCall(trace, {\n    name: 'chat_completion',\n    modelName: 'gpt-4',\n    provider: 'openai',\n    inputMessages: [{ role: 'user', content: 'Hi' }],\n    outputMessages: [{ role: 'assistant', content: 'Hello' }],\n    inputTokens: 10,\n    outputTokens: 5,\n  });\n  llm.close();\n\n  const tool = traceToolCall(trace, { name: 'lookup', toolName: 'search', callId: 'call-1' });\n  tool.close();\n\n  agent.close();\n});\n\n// Always flush + shut down before process exit so buffered spans get sent.\nawait tracing.flush();\nawait tracing.shutdown();\n```\n\n`startTrace(...).run(callback)` is the safest pattern: the wrapper closes the trace and sends it to the buffer when the callback resolves or throws. For a function-decorator style, see `traceFunction` in [src/agentic/helpers.ts](./src/agentic/helpers.ts).\n\n### Prompt Packs\n\n```ts\nimport {\n  DisseqtAPIClient,\n  OutputValidationMetric,\n  PromptPackOutputValidationCategory,\n} from '@disseqt-ai/sdk';\n\nconst api = new DisseqtAPIClient({\n  projectId: 'your-project-id',\n  apiKey: 'your-api-key',\n});\n\n// 1. Generate a pack.\nconst pack = await api.generatePromptPack({\n  packName: 'Security Pack',\n  packShortDesc: 'AI-generated prompts for security testing',\n  author: 'AI Generator',\n  domain: 'Security',\n  generationType: 'AI',\n  categories: [\n    { mainCategory: 'reliability_and_safety', subcategory: 'hate_speech', promptsCount: 5 },\n  ],\n});\n\n// 2. Run it against a model.\nconst run = await api.createRun(String(pack.id ?? pack.pack_id), {\n  runName: 'SDK Evaluation Run',\n  runType: 'evaluation',\n  apiKey: 'provider-api-key',\n  modelName: 'gpt-4',\n  provider: 'openai',\n});\n\n// 3. Attach output validations.\nawait api.createOutputValidation(String(run.id ?? run.run_id), {\n  promptPackOutputValidationRunName: 'Safety Validation',\n  metricEvaluations: [\n    {\n      metricName: OutputValidationMetric.Toxicity,\n      category: PromptPackOutputValidationCategory.OutputValidation,\n    },\n  ],\n});\n```\n\nSnake_case method aliases (`generate_prompt_pack`, `create_run`, `download_pack_csv`, …) are exposed alongside their camelCase counterparts.\n\n---\n\n## Configuration\n\nAll three clients accept a config object passed directly into the constructor — no environment-variable lookups happen inside the SDK.\n\n### `Client` (validation)\n\n```ts\nconst client = new Client({\n  projectId: 'your-project-id', // required\n  apiKey: 'your-api-key', // required\n  baseUrl: 'https://api.disseqt.ai/realtime-validations', // default; override for staging\n  timeout: 30, // seconds; default 30\n  applicationName: 'checkout-bot', // required only to evaluate realtime policies\n  realtimePolicyBaseUrl: 'https://api.disseqt.ai/realtime-validations', // default\n  policies: ['994ad00e-…'], // optional client-wide policy default\n});\n```\n\n### `DisseqtAgenticClient` (tracing)\n\n```ts\nconst tracing = new DisseqtAgenticClient({\n  projectId: 'your-project-id', // required\n  apiKey: 'your-api-key', // required\n  serviceName: 'my-service', // required; shown on dashboards\n  serviceVersion: '1.0.0', // optional\n  environment: 'production', // optional\n  endpoint: 'https://api.disseqt.ai/agentic-monitoring/api/v1/traces', // default\n  maxBatchSize: 100, // optional buffer settings\n  flushIntervalMs: 1000,\n  maxRetries: 3,\n});\n```\n\n### `DisseqtAPIClient` (prompt packs)\n\n```ts\nconst api = new DisseqtAPIClient({\n  projectId: 'your-project-id', // required\n  apiKey: 'your-api-key', // required\n  baseUrl: 'https://api.disseqt.ai', // default\n  timeout: 30, // seconds\n});\n```\n\n### `SDKConfigInput`\n\nEvery standard validator accepts a config block with these fields:\n\n```ts\n{\n  threshold: number;                    // required; 0..1\n  customLabels?: string[];              // optional, e.g. ['Safe', 'Risk', 'Critical']\n  labelThresholds?: number[];           // optional; must have customLabels.length - 1 entries\n}\n```\n\n`themes` and `composite` validators ignore this config.\n\n---\n\n## Available Validators\n\nThe SDK ships **70 validator slugs** across six working domains. Use the typed helper on `Client` (e.g. `client.input.toxicity(...)`) or the generic surface (see [Two API Styles](#two-api-styles)).\n\n### Input Validation (`client.input.*`)\n\n`toxicity` · `bias` · `prompt-injection` · `intersectionality` · `racial-bias` · `gender-bias` · `political-bias` · `self-harm` · `violence` · `terrorism` · `sexual-content` · `hate-speech` · `nsfw` · `invisible-text` · `child-safety` · `intent-guard` · `intent-compliance`\n\n### Output Validation (`client.output.*`)\n\n`factual-consistency` · `answer-relevance` · `conceptual-similarity` · `grammatical-correctness` · `response-tone` · `clarity` · `coherence` · `creativity` · `readability` · `diversity` · `narrative-continuity` · `bias` · `gender-bias` · `racial-bias` · `political-bias` · `intersectionality` · `toxicity` · `nsfw` · `terrorism` · `violence` · `self-harm` · `sexual-content` · `hate-speech` · `child-safety` · `data-leakage` · `insecure-output` · `intent-guard` · `intent-compliance` · `bleu-score` · `rouge-score` · `meteor-score` · `cosine-similarity` · `fuzzy-score` · `compression-score`\n\n### RAG Grounding (`client.rag.*`)\n\n`context-relevance` · `context-recall` · `context-precision` · `context-entities-recall` · `noise-sensitivity` · `response-relevancy` · `faithfulness`\n\n### Agentic Behavior (`client.agentic.*`)\n\n`topic-adherence` · `tool-call-accuracy` · `tool-failure-rate` · `plan-optimality` · `agent-goal-accuracy` · `intent-resolution` · `plan-coherence` · `fallback-rate`\n\n### MCP Security (`client.mcp.*`)\n\n`prompt-injection` · `data-leakage` · `insecure-output`\n\n### Composite Score (`client.composite.evaluate`)\n\nSingle endpoint that aggregates many validators with configurable weights. Hits `/api/v1/validators/composite/evaluate` (no `/sdk/` prefix). See [examples/composite-score.ts](./examples/composite-score.ts).\n\n---\n\n## Request Models\n\nEach validation domain has a typed request shape. Pass a plain object or an instance — both work.\n\n| Model                     | Fields                                                                                                                                                           |\n| ------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `InputValidationRequest`  | `prompt` (required), `context?`, `response?`                                                                                                                     |\n| `OutputValidationRequest` | `prompt?`, `context?`, `response?`                                                                                                                               |\n| `RagGroundingRequest`     | `prompt?`, `context?`, `response?` (context is usually required by the semantics)                                                                                |\n| `AgenticBehaviourRequest` | `conversationHistory?`, `toolCalls?`, `agentResponses?`, `referenceData?`                                                                                        |\n| `McpSecurityRequest`      | `prompt?`, `context?`, `response?`                                                                                                                               |\n| `ThemesClassifierRequest` | `text` (required), `returnSubthemes?` (default `true`), `maxThemes?` (default `3`)                                                                               |\n| `CompositeScoreRequest`   | `llmInputQuery` (required), `llmOutput` (required), `llmInputContext?`, `evaluationMode?`, `weightsOverride?`, `labelsThresholdsOverride?`, `overallConfidence?` |\n\nAll models accept both `camelCase` and `snake_case` field names. On the wire, the SDK serialises everything to `snake_case`.\n\n---\n\n## Response Format\n\nStandard validator responses are plain JSON objects with this common shape:\n\n```ts\n{\n  success: boolean;\n  validator_type: string;       // domain, e.g. \"input-validation\"\n  validator_name: string;       // slug, e.g. \"toxicity\"\n  result: {\n    data: {\n      metric_name: string;\n      actual_value: number;\n      actual_value_type: 'float';\n      metric_labels: string[];\n      threshold: ['Pass' | 'Fail'];\n      threshold_score: number;\n      others: Record<string, unknown>;\n    };\n    status: { code: string; message: string };\n  };\n  score: number;\n  threshold_validated_result: string;   // first matching custom_label\n  duration: string;\n  request_id: string;\n  credit_details?: { /* ... */ };\n}\n```\n\nThe composite scorer returns a different envelope; see [`CompositeScoreResponse`](./src/validation/models.ts).\n\n---\n\n## Error Handling\n\nThe SDK throws structured errors so you can branch on them cleanly:\n\n```ts\nimport { Client, DisseqtHttpError, DisseqtJsonError } from '@disseqt-ai/sdk';\n\nconst client = new Client({ projectId, apiKey });\n\ntry {\n  const result = await client.input.toxicity({ prompt: '...' }, { threshold: 0.5 });\n} catch (err) {\n  if (err instanceof DisseqtHttpError) {\n    console.error(`HTTP ${err.statusCode} ${err.method} ${err.url}`);\n    console.error(`body: ${err.responseBody}`);\n  } else if (err instanceof DisseqtJsonError) {\n    console.error(`server returned non-JSON: ${err.responseText}`);\n  } else {\n    throw err;\n  }\n}\n```\n\n| Error class        | Raised when                                                                                    |\n| ------------------ | ---------------------------------------------------------------------------------------------- |\n| `DisseqtHttpError` | Server returned a non-2xx status; `statusCode`, `responseBody`, `method`, `url` are populated. |\n| `DisseqtJsonError` | Response body wasn't valid JSON; `responseText` is populated.                                  |\n| `DisseqtError`     | Base class; useful when you want a single `instanceof` check.                                  |\n\n---\n\n## Two API Styles\n\nEvery validation call has two equivalent forms. Use whichever fits your code.\n\n**Typed helpers** (recommended for new code) — TypeScript catches slug typos at compile time:\n\n```ts\nawait client.input.toxicity({ prompt: 'Hello' }, { threshold: 0.5 });\n```\n\n**Generic surface** — useful when the slug is dynamic at runtime, or when porting code from another SDK:\n\n```ts\nimport { InputValidator, InputValidation, SDKConfigInput } from '@disseqt-ai/sdk';\n\nawait client.validate(\n  new InputValidator({\n    slug: InputValidation.Toxicity,\n    data: { prompt: 'Hello' },\n    config: new SDKConfigInput({ threshold: 0.5 }),\n  }),\n);\n```\n\nBoth go through the same HTTP transport and produce identical results. The typed helpers are thin wrappers around `client.validate(...)`.\n\n---\n\n## Defaults and Wire Conventions\n\nDefaults used when you don't override them:\n\n| Setting                         | Value                                                         |\n| ------------------------------- | ------------------------------------------------------------- |\n| Validation base URL             | `https://api.disseqt.ai/realtime-validations`                 |\n| Validation route                | `POST /api/v1/sdk/validators/{domain}/{validator}`            |\n| Composite route                 | `POST /api/v1/validators/composite/evaluate`                  |\n| Prompt-packs base URL           | `https://api.disseqt.ai`                                      |\n| Prompt-packs path prefix        | `/sdk/prompt-packs/api/v1/sdk/prompt-packs`                   |\n| Agentic tracing endpoint        | `https://api.disseqt.ai/agentic-monitoring/api/v1/traces`     |\n| Auth headers                    | `X-API-Key`, `X-Project-Id`, `Content-Type: application/json` |\n| Default timeout                 | 30 seconds                                                    |\n| Buffer flush interval (tracing) | 1000 ms                                                       |\n| Buffer max size (tracing)       | 100 spans                                                     |\n\nTo target staging instead of production, pass `baseUrl: 'https://stage-api.disseqt.ai/realtime-validations'` (or the equivalent staging URL for tracing / prompt-packs).\n\n---\n\n## Smoke Testing\n\nBundled scripts for verifying the SDK works against your environment.\n\n**Mocked**, no credentials required:\n\n```bash\nnpm run smoke:all\n```\n\n**Live**, requires credentials:\n\n```bash\nDISSEQT_API_KEY=... DISSEQT_PROJECT_ID=... npm run smoke:all:live\n```\n\n**End-to-end against the live validation gateway** (70 validators, ~50 seconds):\n\n```bash\nDISSEQT_API_KEY=... DISSEQT_PROJECT_ID=... npm run validators:all\n```\n\nOptional overrides:\n\n```bash\nDISSEQT_VALIDATION_BASE_URL=https://api.disseqt.ai/realtime-validations\nDISSEQT_AGENTIC_ENDPOINT=https://api.disseqt.ai/agentic-monitoring/api/v1/traces\nDISSEQT_TIMEOUT_SECONDS=30\n```\n\nEach script prints one-line `[PASS]` / `[FAIL]` entries and exits non-zero if any case fails.\n\n---\n\n## Development\n\n```bash\n# Clone and set up\ngit clone https://github.com/DisseqtAI/disseqt-node-sdk.git\ncd disseqt-node-sdk\nnpm install\n\n# Run the gates locally before pushing\nnpm run lint          # ESLint\nnpm run typecheck     # tsc --noEmit\nnpm run format:check  # Prettier\nnpm test              # Vitest, 78+ unit tests\nnpm run build         # tsup, produces dist/\n```\n\n### Repository layout\n\n```\nsrc/\n  validation/    # Client, validators, request models, helpers\n  agentic/       # DisseqtAgenticClient, trace, span, buffer, transport\n  prompt-packs/  # DisseqtAPIClient, request models\n  http/          # Shared transport + types\nexamples/        # Runnable .ts snippets per surface\nscripts/         # Smoke runners\ntests/           # Vitest specs (one per source folder)\n```\n\n---\n\n## License\n\nProprietary — Copyright © Disseqt AI Limited. All rights reserved. See [LICENSE](./LICENSE) for terms.\n\nSupport and licensing inquiries: **support@disseqt.ai**\n","readmeFilename":"README.md"}