{"_id":"@2ndopinion/sdk","_rev":"4-7ecd7415a44136b33462408196615006","name":"@2ndopinion/sdk","dist-tags":{"latest":"0.3.1"},"versions":{"0.1.0":{"name":"@2ndopinion/sdk","version":"0.1.0","license":"MIT","_id":"@2ndopinion/sdk@0.1.0","maintainers":[{"name":"bmello11","email":"brianmello96@gmail.com"}],"dist":{"shasum":"eb3add878c984410d4037fafed6522a7f3de711d","tarball":"https://registry.npmjs.org/@2ndopinion/sdk/-/sdk-0.1.0.tgz","fileCount":3,"integrity":"sha512-J1e5frxIOxIUfkjHbHfxljsa88/IpY39bjiNwepSjFFg9V/zBo5JErSvY8JIZ1DECYoD7lU+WSvAtz52AZMVGw==","signatures":[{"sig":"MEYCIQCr97fbXVusKZ6ZWbvvY0bBj4LJtGT9uWAAfwNI8zGkuwIhAPpnUmjb4MeIsTDtGqxp0WJpDxYpGJXogAUP8TfPGXUB","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8497},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"0ec660cb8ad5f270f464de28b2dfb2f0ad185ae9","scripts":{"dev":"tsc --watch","build":"tsc"},"_npmUser":{"name":"bmello11","email":"brianmello96@gmail.com"},"_npmVersion":"11.11.0","description":"JavaScript/TypeScript SDK for the 2ndOpinion API","directories":{},"_nodeVersion":"24.14.1","dependencies":{"@2ndopinion/shared":"workspace:*"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.1.0_1775063125896_0.08218715589796832","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@2ndopinion/sdk","version":"0.2.0","keywords":["code-review","ai","claude","codex","gemini","mcp","developer-tools","sdk","api","second-opinion","consensus","security-audit","bug-detection","test-generation"],"author":{"name":"2ndOpinion","email":"hello@get2ndopinion.dev"},"license":"MIT","_id":"@2ndopinion/sdk@0.2.0","maintainers":[{"name":"bmello11","email":"brianmello96@gmail.com"}],"homepage":"https://get2ndopinion.dev","bugs":{"url":"https://github.com/brianmello8/2ndopinion/issues"},"dist":{"shasum":"27c026bc4fd45a17176c3cb0f65c18491b3421be","tarball":"https://registry.npmjs.org/@2ndopinion/sdk/-/sdk-0.2.0.tgz","fileCount":4,"integrity":"sha512-ntBjeTXh330Uhzn5/E1mkFhTMPfWksSYbLUZ/n9trssqsPd48gTA6IJcZwt7xM9Z4YkirbRy37EwfDn1RjfqsA==","signatures":[{"sig":"MEUCIQD3GaFmvozlnQfstGMBb0c+G8km74RmsY1BROpNIQXJbQIgAsA7B03DLXtDYdcKHSFP6uBipBqvmry1Ze1zGABp36M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12151},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"57c584df711893593e10e2d13bc9083e1d447d74","scripts":{"dev":"tsc --watch","build":"tsc"},"_npmUser":{"name":"bmello11","email":"brianmello96@gmail.com"},"repository":{"url":"git+https://github.com/brianmello8/2ndopinion.git","type":"git","directory":"packages/sdk-js"},"_npmVersion":"11.11.0","description":"Official JavaScript/TypeScript SDK for 2ndOpinion — AI-to-AI code review where Claude, Codex, and Gemini review your code together","directories":{},"_nodeVersion":"24.14.1","dependencies":{"@2ndopinion/shared":"workspace:*"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.2.0_1775142071611_0.7435009569800517","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@2ndopinion/sdk","version":"0.3.0","keywords":["code-review","ai","claude","codex","gemini","mcp","developer-tools","sdk","api","second-opinion","consensus","security-audit","bug-detection","test-generation"],"author":{"name":"2ndOpinion","email":"hello@get2ndopinion.dev"},"license":"MIT","_id":"@2ndopinion/sdk@0.3.0","maintainers":[{"name":"bmello11","email":"brianmello96@gmail.com"}],"homepage":"https://get2ndopinion.dev","bugs":{"url":"https://github.com/brianmello8/2ndopinion/issues"},"dist":{"shasum":"45820c47f6f67c28a4fc56a6b6102ab1e078281f","tarball":"https://registry.npmjs.org/@2ndopinion/sdk/-/sdk-0.3.0.tgz","fileCount":4,"integrity":"sha512-wvpjoKR0jm4ubjJLksBOco93cFFZFXp5JaWt6Md1mA56s4KzJUPzxfiEM2vI0NuPbBShExxWmjHU5/MaKBjW+w==","signatures":[{"sig":"MEYCIQC27V9K9Vlq4/rg2fD+wlVGWsokg47n6uXHIoLJUHnfHwIhAKsBGLF+oPe4L1N1fmP6LzlpFJrdNsUcjDPg5WwBa46N","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12769},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"d1fb9eb18a5f2e1b5efb8e0d5f2d799b06b6093b","scripts":{"dev":"tsc --watch","build":"tsc"},"_npmUser":{"name":"bmello11","email":"brianmello96@gmail.com"},"repository":{"url":"git+https://github.com/brianmello8/2ndopinion.git","type":"git","directory":"packages/sdk-js"},"_npmVersion":"11.11.0","description":"Official JavaScript/TypeScript SDK for 2ndOpinion — AI-to-AI code review where Claude, Codex, and Gemini review your code together","directories":{},"_nodeVersion":"24.14.1","dependencies":{"@2ndopinion/shared":"workspace:*"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.3.0_1775244025241_0.9147359762821206","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@2ndopinion/sdk","version":"0.3.1","description":"Official JavaScript/TypeScript SDK for 2ndOpinion — AI-to-AI code review where Claude, Codex, and Gemini review your code together","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","dev":"tsc --watch"},"keywords":["code-review","ai","claude","codex","gemini","mcp","developer-tools","sdk","api","second-opinion","consensus","security-audit","bug-detection","test-generation"],"homepage":"https://get2ndopinion.dev","author":{"name":"2ndOpinion","email":"hello@get2ndopinion.dev"},"license":"UNLICENSED","dependencies":{"@2ndopinion/shared":"workspace:*"},"devDependencies":{"typescript":"^5"},"_id":"@2ndopinion/sdk@0.3.1","_nodeVersion":"24.14.1","_npmVersion":"11.11.0","dist":{"integrity":"sha512-hnc0VAgF+MEeypPAubjD3mckqeFsZlx4vUL9ee++DFifhB/0i6qVTrQ4Eem4+bHMEy0MqHokdW6wMuR1Lo0WeA==","shasum":"22b1ad1aed093facb4265d204b1f240de7693793","tarball":"https://registry.npmjs.org/@2ndopinion/sdk/-/sdk-0.3.1.tgz","fileCount":4,"unpackedSize":12571,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIDZpPHR/lXbMKidFusqFDTYcQAlI9Vh+kN3MADED9cD8AiA5+/spPBbYv2fxPOL20WlHSiAc3D2sOAp9cSL3m8VnvA=="}]},"_npmUser":{"name":"bmello11","email":"brianmello96@gmail.com"},"directories":{},"maintainers":[{"name":"bmello11","email":"brianmello96@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sdk_0.3.1_1775777846983_0.058910065022129254"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-01T17:05:25.822Z","modified":"2026-04-09T23:37:27.251Z","0.1.0":"2026-04-01T17:05:26.024Z","0.2.0":"2026-04-02T15:01:11.781Z","0.3.0":"2026-04-03T19:20:25.415Z","0.3.1":"2026-04-09T23:37:27.127Z"},"author":{"name":"2ndOpinion","email":"hello@get2ndopinion.dev"},"license":"UNLICENSED","homepage":"https://get2ndopinion.dev","keywords":["code-review","ai","claude","codex","gemini","mcp","developer-tools","sdk","api","second-opinion","consensus","security-audit","bug-detection","test-generation"],"description":"Official JavaScript/TypeScript SDK for 2ndOpinion — AI-to-AI code review where Claude, Codex, and Gemini review your code together","maintainers":[{"name":"bmello11","email":"brianmello96@gmail.com"}],"readme":"# @2ndopinion/sdk\n\nOfficial JavaScript/TypeScript SDK for [2ndOpinion](https://get2ndopinion.dev) — the AI-to-AI code review platform where Claude, Codex, and Gemini review your code together.\n\n## Installation\n\n```bash\nnpm install @2ndopinion/sdk\n```\n\n## Quick Start\n\n```typescript\nimport { SecondOpinion } from '@2ndopinion/sdk';\n\nconst client = new SecondOpinion('sk_2op_your_key_here');\n\n// Get a code review\nconst result = await client.opinion({\n  diff: `--- a/auth.js\\n+++ b/auth.js\\n@@ -1,3 +1,3 @@\\n-const token = req.headers.authorization;\\n+const token = req.query.token;`,\n  llm: 'codex',\n});\n\nconsole.log(result.analysis.summary);\nconsole.log(result.analysis.recommendation); // 'accept' | 'review' | 'reject'\n```\n\n## Methods\n\n| Method | Description | Credits |\n|--------|-------------|---------|\n| `opinion(diff, llm?, context?)` | Single-model code review with risk analysis | 1 |\n| `review(diff, llm?, context?)` | Alias for opinion | 1 |\n| `ask(question, llm?, code?, context?)` | Ask an AI model a question about code | 1 |\n| `batch(files[], llm?)` | Analyze up to 20 files concurrently | 1 each |\n| `status()` | Check account credits, tier, and usage | 0 |\n| `stream(diff, llm?, context?)` | SSE streaming analysis | 1 |\n\n## Examples\n\n### Ask a Question\n\n```typescript\nconst answer = await client.ask({\n  question: 'Is this SQL query vulnerable to injection?',\n  code: `db.query(\"SELECT * FROM users WHERE id = \" + userId)`,\n  llm: 'claude',\n});\nconsole.log(answer.response);\n```\n\n### Check Usage\n\n```typescript\nconst usage = await client.status();\nconsole.log(`${usage.totalAvailable} credits remaining (${usage.tier} plan)`);\n```\n\n### Streaming\n\n```typescript\nfor await (const chunk of client.stream({ diff: myDiff, llm: 'gemini' })) {\n  process.stdout.write(chunk);\n}\n```\n\n### Batch Review\n\n```typescript\nconst results = await client.batch({\n  files: [\n    { path: 'auth.js', diff: authDiff },\n    { path: 'db.js', diff: dbDiff },\n  ],\n});\nresults.forEach(r => console.log(`${r.file}: ${r.analysis.recommendation}`));\n```\n\n## Error Handling\n\n```typescript\nimport { SecondOpinion, SecondOpinionError } from '@2ndopinion/sdk';\n\ntry {\n  const result = await client.opinion({ diff: myDiff });\n} catch (err) {\n  if (err instanceof SecondOpinionError) {\n    switch (err.code) {\n      case 'RATE_LIMIT': // Wait and retry\n      case 'INSUFFICIENT_CREDITS': // Upgrade plan\n      case 'UNAUTHORIZED': // Check API key\n    }\n  }\n}\n```\n\n## CI/CD Usage\n\nUse the SDK in Node.js scripts for automated pipelines:\n\n```typescript\nimport { SecondOpinion } from '@2ndopinion/sdk';\nimport { execSync } from 'child_process';\n\nconst client = new SecondOpinion(process.env.SECONDOPINION_API_KEY!);\nconst diff = execSync('git diff HEAD~1').toString();\n\nconst result = await client.opinion({ diff, llm: 'codex' });\n\nif (result.analysis.recommendation === 'reject') {\n  console.error('Code review failed:', result.analysis.summary);\n  process.exit(1);\n}\n```\n\nOr use the CLI directly with `--ci` for JSON output:\n\n```bash\nnpx 2ndopinion analyze --ci | jq '.verdict'\n```\n\n## Get an API Key\n\n1. Sign up at [get2ndopinion.dev/signup](https://get2ndopinion.dev/signup)\n2. Go to [Dashboard > API Keys](https://get2ndopinion.dev/dashboard/keys)\n3. Create a key and use it in the constructor\n\n## Pricing\n\nFree tier includes 5 credits/month. [See all plans](https://get2ndopinion.dev/pricing).\n\n## Links\n\n- [Documentation](https://get2ndopinion.dev/docs)\n- [API Reference](https://get2ndopinion.dev/docs/api)\n- [Playground](https://get2ndopinion.dev/playground) — try without signing up\n- [Pricing](https://get2ndopinion.dev/pricing)\n- [Support](mailto:hello@get2ndopinion.dev)\n","readmeFilename":"README.md"}