{"_id":"@byomsdk/sdk","_rev":"3-403c0377c6074c5712e6ab245b09cdfc","name":"@byomsdk/sdk","dist-tags":{"latest":"0.3.0"},"versions":{"0.1.0":{"name":"@byomsdk/sdk","version":"0.1.0","keywords":["ai","llm","openai","anthropic","ollama","browser-extension","bring-your-own-model"],"author":{"name":"Bring Your Model Team"},"license":"MIT","_id":"@byomsdk/sdk@0.1.0","maintainers":[{"name":"bringyourmodel","email":"indrasish@outlook.com"}],"homepage":"https://bringyourmodel.com","bugs":{"url":"https://github.com/indraai/bringyourmodel/issues"},"dist":{"shasum":"34872740842668b0515e0c98bdc8a0e2d331d3af","tarball":"https://registry.npmjs.org/@byomsdk/sdk/-/sdk-0.1.0.tgz","fileCount":19,"integrity":"sha512-mFVUjDrXb/vb5skW4x9rlDXJiFJ8zrfiovKVvlelRR8/1BWBBzhxukizBcKEXC5DgiX26lW8z2rYCEcewoliCA==","signatures":[{"sig":"MEQCIBJzElXEfPCnbzxUkzzxrLMrRlYDPgL/aZaAoDd4AB70AiAI096hVl7vsaSwpwhb1s1/OoMV9FE2f5ZBxQennlZVcA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":404168},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.cjs"}},"./iife":"./dist/byom.iife.min.global.js","./types":{"types":"./dist/index.d.ts"},"./package.json":"./package.json"},"gitHead":"4141dca1ed38ebbb2a8d062e972d23923ecf5d9f","scripts":{"dev":"tsup --watch","lint":"eslint src","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","check:bundle":"node ./scripts/check-iife-budget.mjs","prepublishOnly":"pnpm run build"},"_npmUser":{"name":"bringyourmodel","email":"indrasish@outlook.com"},"repository":{"url":"git+https://github.com/indraai/bringyourmodel.git","type":"git","directory":"packages/sdk"},"_npmVersion":"10.9.2","description":"Bring Your Own Model - SDK for accessing user-owned AI providers via the Bring Your Model browser extension","directories":{},"_nodeVersion":"22.17.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.0","jsdom":"^25.0.1","vitest":"^2.1.0","typescript":"^5.7.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.1.0_1779654301374_0.9925539212237571","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@byomsdk/sdk","version":"0.2.0","keywords":["ai","llm","openai","anthropic","ollama","browser-extension","bring-your-own-model"],"author":{"name":"Bring Your Model Team"},"license":"Apache-2.0","_id":"@byomsdk/sdk@0.2.0","maintainers":[{"name":"bringyourmodel","email":"indrasish@outlook.com"}],"homepage":"https://github.com/indrasishbanerjee/BringYourModel#readme","bugs":{"url":"https://github.com/indrasishbanerjee/BringYourModel/issues"},"dist":{"shasum":"e7abc56ca1c0db1dc37a1a8b6a4c313fd3f06dbd","tarball":"https://registry.npmjs.org/@byomsdk/sdk/-/sdk-0.2.0.tgz","fileCount":20,"integrity":"sha512-ZRg0qmDuzjXU+tHu38uUvB2Wotl199JrCq31nUt7e2eS3OpQwiAk+a46SypRGi06S1Ea3dPXqPpU80nO5aZlZA==","signatures":[{"sig":"MEUCIAMlfM1MIyMtpBmAv0XwZkQpGVoT9QfIPf0YvLclbpUPAiEA+TpSy4oqh3kiAOdVMP0p4seyHtOi5Ay5+x4lgPOiAlA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":529131},"main":"./dist/index.cjs","type":"module","_from":"file:byomsdk-sdk-0.2.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.cjs"}},"./iife":"./dist/byom.iife.min.global.js","./types":{"types":"./dist/index.d.ts"},"./package.json":"./package.json"},"scripts":{"dev":"tsup --watch","lint":"eslint src","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","check:bundle":"node ./scripts/check-iife-budget.mjs"},"_npmUser":{"name":"bringyourmodel","email":"indrasish@outlook.com"},"_resolved":"C:\\Users\\indra\\AppData\\Local\\Temp\\d6d9af7e2c6212b3e9abf30e1e5f05da\\byomsdk-sdk-0.2.0.tgz","_integrity":"sha512-ZRg0qmDuzjXU+tHu38uUvB2Wotl199JrCq31nUt7e2eS3OpQwiAk+a46SypRGi06S1Ea3dPXqPpU80nO5aZlZA==","repository":{"url":"git+https://github.com/indrasishbanerjee/BringYourModel.git","type":"git","directory":"packages/sdk"},"_npmVersion":"10.9.2","description":"Bring Your Own Model - SDK for accessing user-owned AI providers via the Bring Your Model browser extension","directories":{},"_nodeVersion":"22.17.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.0","jsdom":"^25.0.1","vitest":"^2.1.0","typescript":"^5.7.0","@byom/shared":"0.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.2.0_1780630961334_0.6322849322306032","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@byomsdk/sdk","version":"0.3.0","description":"Bring Your Own Model - SDK for accessing user-owned AI providers via the Bring Your Model browser extension","type":"module","main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.cjs"}},"./types":{"types":"./dist/index.d.ts"},"./iife":"./dist/byom.iife.min.global.js","./openai":{"import":{"types":"./dist/openai.d.ts","default":"./dist/openai.js"},"require":{"types":"./dist/openai.d.ts","default":"./dist/openai.cjs"}},"./prompt-api":{"import":{"types":"./dist/prompt-api.d.ts","default":"./dist/prompt-api.js"},"require":{"types":"./dist/prompt-api.d.ts","default":"./dist/prompt-api.cjs"}},"./package.json":"./package.json"},"publishConfig":{"access":"public"},"devDependencies":{"jsdom":"^25.0.1","tsup":"^8.3.0","typescript":"^5.7.0","vitest":"^2.1.0","@byom/shared":"0.0.0"},"keywords":["ai","llm","openai","anthropic","ollama","browser-extension","bring-your-own-model"],"author":{"name":"Bring Your Model Team"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/indrasishbanerjee/BringYourModel.git","directory":"packages/sdk"},"homepage":"https://github.com/indrasishbanerjee/BringYourModel#readme","bugs":{"url":"https://github.com/indrasishbanerjee/BringYourModel/issues"},"scripts":{"build":"tsup","dev":"tsup --watch","lint":"eslint src","test":"vitest run","test:watch":"vitest","typecheck":"tsc --noEmit","check:bundle":"node ./scripts/check-iife-budget.mjs"},"_id":"@byomsdk/sdk@0.3.0","_integrity":"sha512-HUtmZu21HveUn259u3+0cWHSPfh2QdeDmQqU2QR3+bcvcjfe07aKrpMOnbIQddg7PIQHL7/GBN8WIspwF4DdIQ==","_resolved":"C:\\Users\\indra\\AppData\\Local\\Temp\\fc769c3142aefef766e11138e12eb548\\byomsdk-sdk-0.3.0.tgz","_from":"file:byomsdk-sdk-0.3.0.tgz","_nodeVersion":"22.17.1","_npmVersion":"10.9.2","dist":{"integrity":"sha512-HUtmZu21HveUn259u3+0cWHSPfh2QdeDmQqU2QR3+bcvcjfe07aKrpMOnbIQddg7PIQHL7/GBN8WIspwF4DdIQ==","shasum":"322596fdca84d6bb216a8c483e704385f1022390","tarball":"https://registry.npmjs.org/@byomsdk/sdk/-/sdk-0.3.0.tgz","fileCount":38,"unpackedSize":1208289,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDDdgf9lQwmG2SXSHLRukQPVdoDKH0uym+TAoWqyewA3wIgcpEEKvcbuGhkLiv9pV6Fl3KrxiJQxn2qKjgr2ID4J+o="}]},"_npmUser":{"name":"bringyourmodel","email":"indrasish@outlook.com"},"directories":{},"maintainers":[{"name":"bringyourmodel","email":"indrasish@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sdk_0.3.0_1781246558658_0.44586447257534556"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-24T20:25:01.202Z","modified":"2026-06-12T06:42:39.161Z","0.1.0":"2026-05-24T20:25:01.554Z","0.2.0":"2026-06-05T03:42:41.510Z","0.3.0":"2026-06-12T06:42:38.931Z"},"bugs":{"url":"https://github.com/indrasishbanerjee/BringYourModel/issues"},"author":{"name":"Bring Your Model Team"},"license":"Apache-2.0","homepage":"https://github.com/indrasishbanerjee/BringYourModel#readme","keywords":["ai","llm","openai","anthropic","ollama","browser-extension","bring-your-own-model"],"repository":{"type":"git","url":"git+https://github.com/indrasishbanerjee/BringYourModel.git","directory":"packages/sdk"},"description":"Bring Your Own Model - SDK for accessing user-owned AI providers via the Bring Your Model browser extension","maintainers":[{"name":"bringyourmodel","email":"indrasish@outlook.com"}],"readme":"# @byomsdk/sdk\n\nBrowser SDK for websites that integrate with the [Bring Your Model](https://bringyourmodel.com) extension.\n\nBring Your Model lets users connect their own AI providers in a browser extension and approve which websites can use them. This SDK gives websites a small, zero-dependency API for text generation, streaming, embeddings, classification, extraction, chat sessions, extension events, and capability checks.\n\n## Requirements\n\n- **Browser only** — uses `window`, `document`, and `crypto`. Not for Node.js or SSR.\n- Users must have the Bring Your Model browser extension installed.\n- Users must configure at least one provider in the extension.\n- The site must be approved by the user before provider calls run.\n\n## Install\n\n```bash\nnpm install @byomsdk/sdk\n```\n\n## Quick start\n\n```typescript\nimport { byom } from '@byomsdk/sdk';\n\nconst available = await byom.isAvailable();\nif (!available) {\n  throw new Error('Bring Your Model extension is not available');\n}\n\nconst caps = await byom.getCapabilities();\nif (!caps?.vaultUnlocked) {\n  throw new Error('Unlock the extension vault first');\n}\n\nconst result = await byom.ask({\n  task: 'summarize',\n  input: 'Long text to summarize...',\n});\n\nconsole.log(result.text, result.costUSD);\n```\n\n## Streaming\n\n```typescript\nimport { byom } from '@byomsdk/sdk';\n\nasync function runStream() {\n  const gen = byom.stream({ input: 'Write a haiku about TypeScript.' });\n  let result = await gen.next();\n\n  while (!result.done) {\n    console.log(result.value.text);\n    result = await gen.next();\n  }\n\n  const finish = result.value;\n  console.log(finish.model, finish.costUSD);\n}\n```\n\n## Chat session\n\n```typescript\nimport { byom } from '@byomsdk/sdk';\n\nconst session = byom.chat({ systemMessage: 'You are a concise assistant.' });\n\nconst reply = await session.send('What is BYOM?');\nconsole.log(reply.text);\n\nconsole.log(session.history());\nsession.close();\n```\n\n## Error handling\n\nAll methods throw typed errors. Use `instanceof` for recoverable cases:\n\n```typescript\nimport {\n  byom,\n  BudgetExceededError,\n  PermissionDeniedError,\n  ExtensionNotInstalledError,\n  ByomError,\n} from '@byomsdk/sdk';\n\ntry {\n  await byom.ask({ input: 'Hello' });\n} catch (err) {\n  if (err instanceof ExtensionNotInstalledError) {\n    // prompt user to install the extension\n  } else if (err instanceof PermissionDeniedError) {\n    // site needs consent — trigger a request to open the consent flow\n  } else if (err instanceof BudgetExceededError) {\n    console.log(err.details); // { budgetType, current, limit }\n  } else if (err instanceof ByomError) {\n    console.log(err.code, err.message);\n  }\n}\n```\n\n## Configuration\n\nFor advanced use, create a client with a custom timeout (applied on first `getClient()` call only):\n\n```typescript\nimport { getClient } from '@byomsdk/sdk';\n\nconst client = getClient({ timeoutMs: 60_000 });\nawait client.ask({ input: 'Long running task...' });\n```\n\n## CDN (IIFE)\n\n```html\n<script src=\"https://cdn.jsdelivr.net/npm/@byomsdk/sdk/dist/byom.iife.min.global.js\"></script>\n<script>\n  byom.isAvailable().then(function (ok) {\n    if (!ok) return;\n    return byom.ask({ input: 'Hello from BYOM' });\n  }).then(function (result) {\n    if (result) console.log(result.text);\n  });\n</script>\n```\n\nThe IIFE build attaches `byom` to `window.byom`.\n\n## Teardown\n\n`byom.destroy()` disconnects the bridge and resets global state. Use in tests or SPA unmount — not required for normal pages.\n\n## Progressive enhancement (fallback)\n\n```typescript\nimport { createByomWithFallback, createInstallPromptState, getInstallUrl } from '@byomsdk/sdk';\n\nconst ai = createByomWithFallback({\n  askFallback: async (req, signal) => {\n    const res = await fetch('/api/ai/ask', {\n      method: 'POST',\n      body: JSON.stringify(req),\n      signal,\n    });\n    return res.json();\n  },\n});\n\nconst state = await createInstallPromptState();\nif (state.recommendedAction === 'install-extension') {\n  window.location.href = getInstallUrl();\n}\n```\n\nSee [fallback strategy](../../docs/fallback-strategy.md).\n\n## OpenAI compatibility\n\n```typescript\nimport { OpenAI } from '@byomsdk/sdk/openai';\n\nconst client = new OpenAI();\nconst completion = await client.chat.completions.create({\n  model: 'gpt-4o-mini',\n  messages: [{ role: 'user', content: 'Hello' }],\n});\n```\n\nSee [OpenAI compat](../../docs/openai-compat.md).\n\n## Prompt API shim\n\n```typescript\nimport { createPromptApi } from '@byomsdk/sdk/prompt-api';\n\nconst ai = createPromptApi();\nconst session = await ai.languageModel.create();\nconst text = await session.prompt('Summarize this page.');\n```\n\nSee [Prompt API compat](../../docs/prompt-api-compat.md).\n\n## API reference\n\nFull API documentation: [docs/sdk-api.md](../../docs/sdk-api.md)\n\n### Main methods\n\n| Method | Description |\n|--------|-------------|\n| `byom.isAvailable()` | Ping the extension bridge |\n| `byom.getCapabilities()` | Version, supported tasks, grant/vault status |\n| `byom.ask()` | Single-shot text generation |\n| `byom.stream()` | Streaming text generation |\n| `byom.embed()` | Embedding vectors |\n| `byom.classify()` | Text classification |\n| `byom.extract()` | Structured extraction via JSON Schema |\n| `byom.chat()` | Multi-turn chat session |\n| `byom.on()` | Subscribe to extension events |\n| `byom.destroy()` | Tear down global bridge/client state |\n\n## License\n\nApache-2.0 — see [LICENSE](./LICENSE).\n","readmeFilename":"README.md"}