[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M79BAFCSMSRG6AT7GGGAYB2H":3,"skill-same:01M79BAFCSMSRG6AT7GGGAYB2H":46},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":19,"linkOnly":20,"markdownContent":21,"markdownBody":22,"frontMatter":23,"refName":24,"commitSha":25,"skillDirectory":26,"forksCount":27,"repositoryHtmlUrl":28,"repositoryHomepageUrl":6,"ownerHtmlUrl":29,"ownerBlogUrl":6,"ownerDescription":30,"updatedAt":31,"install":32,"resources":45},"01M79BAFCSMSRG6AT7GGGAYB2H","build-with-ipa",null,"Build or adapt browser apps to use the Inference Provider API (IPA, window.inference) for user-approved AI inference. Use for IPA chat, tools, hosted search, images, or bounded speech in an app. Not for implementing a browser extension or other IPA provider.","SamSamskies\u002Finference-provider-api","SamSamskies","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F3655410?v=4","01M79BA31BJFFFNX0KV8NS0CAC","Sam Samskies","01M79BA32CE4FQF4P08Z9CG7S3",8,"MIT","https:\u002F\u002Fgithub.com\u002FSamSamskies\u002Finference-provider-api\u002Fblob\u002Fmain\u002Fskills\u002Fbuild-with-ipa\u002FSKILL.md",[],[],"2026-11-15 14:19:17",false,"---\nname: build-with-ipa\ndescription: Build or adapt browser apps to use the Inference Provider API (IPA, window.inference) for user-approved AI inference. Use for IPA chat, tools, hosted search, images, or bounded speech in an app. Not for implementing a browser extension or other IPA provider.\n---\n\n# Build with IPA\n\nIPA is an experimental browser API. The [specification](https:\u002F\u002Fgithub.com\u002FSamSamskies\u002Finference-provider-api\u002Fblob\u002Fmain\u002FSPEC.md) defines its contract; the [ipa-tools README](https:\u002F\u002Fgithub.com\u002FSamSamskies\u002Finference-provider-api\u002Fblob\u002Fmain\u002Fpackages\u002Fipa-tools\u002FREADME.md) documents current helpers. Start with the [chat demo](https:\u002F\u002Fgithub.com\u002FSamSamskies\u002Finference-provider-api\u002Ftree\u002Fmain\u002Fexamples\u002Fchat) for streaming, the [translate demo](https:\u002F\u002Fgithub.com\u002FSamSamskies\u002Finference-provider-api\u002Ftree\u002Fmain\u002Fexamples\u002Ftranslate) for a final-only result, or the [charts demo](https:\u002F\u002Fgithub.com\u002FSamSamskies\u002Finference-provider-api\u002Ftree\u002Fmain\u002Fexamples\u002Fcharts) for page-executed tools. If this repository is available locally, read those files there instead. Check the relevant spec sections before implementing a feature; do not treat an example or a particular injector's extra methods as part of the standard.\n\n## Integrate into the app\n\n1. Fit IPA into the app's existing architecture and requested UX. IPA runs in a top-level browser page on HTTPS or loopback HTTP. It may be absent until a compatible injector is installed. Check `window.inference?.request` before enabling inference; explain how to install a compatible provider when it is missing. If late injection matters, `ipa-tools` offers `waitForInference`, but do not await it before first paint.\n2. Use `window.inference.request` for streaming. For `method: \"chat\"`, iterate its `AsyncIterable`: `accepted` means the request is cleared to reach a provider; `delta` carries display text; `reasoning_delta` is optional; `done` contains the final message, model, and optional usage. A nonstreaming chat provider may yield only `accepted` and `done`. Iteration throws on failure, so handle `error.code` (`permission_denied`, `invalid_request`, `unavailable`, `provider_error`, `aborted`) rather than relying on `instanceof` across extension worlds. Pass an `AbortSignal` when the UI offers cancellation.\n3. For apps needing only the final result, use `complete` or `createInference().complete` from `ipa-tools`. For page-executed function tools, prefer its `runTools` helper or implement the spec's multi-round loop. `ipa-tools` supplies types and helpers; it does not inject `window.inference`, select a provider or model, or expose API keys. Keep provider credentials out of page code.\n4. Gate optional request features using `window.inference.getFeatures?.() ?? {}`. `toolCalling`, `webSearch`, `imageInput`, and `imageOutput` are independent. Do not send an unadvertised function tool, hosted search tool, image part, or `output.images: true`. Feature flags describe the injector's API surface, not a promise that the selected provider or model can fulfill a request. `web_search` is hosted, so do not put it in page-side tool handlers. Request `options` are preferences, not model selection; check `features.options` when deciding whether an option can have an effect.\n5. Show a waiting state while permission resolves; the injector owns the permission prompt and the user chooses the provider and model there. An `accepted` chunk means permission has been resolved, including for an existing grant; it does not prove a prompt appeared. A tool result can be sent in a later round without another permission preview, so disclose what page tools may send before the first request. Treat image input and output and hosted search as distinct capabilities when presenting controls.\n6. For bounded speech, first check `features.methods?.transcribe?.acceptedMedia` or `features.methods?.synthesize`. Use the same `request` with `method: \"transcribe\"` and `media` (completed Blob, raw base64 with a type, or a page-resolved URL), or `method: \"synthesize\"` and `text`. Transcription ends with `done.transcript`; synthesis yields encoded `audio_delta` bytes (MP3 by default; explicit WAV only when `methods.synthesize` is an object whose `outputMediaTypes` includes `audio\u002Fwav`) and metadata-only `done.audio`. Legacy `synthesize: true` means MP3 only; create playback Blobs using the returned media type. Keep `complete` and `runTools` chat-only. Never add method-named API functions, select provider\u002Fmodel\u002Fvoice IDs from page code, upload live microphone streams, or autoplay output. Stop any page-owned recording before requesting separate IPA transcription approval. Read the [speech examples](https:\u002F\u002Fgithub.com\u002FSamSamskies\u002Finference-provider-api\u002Fblob\u002Fmain\u002Fexamples\u002Fspeech\u002FREADME.md); detect advertised method support before use.\n\n## Verify the integration\n\nExercise the relevant app flow in a secure browser context with a compatible injector such as [Inference Bridge](https:\u002F\u002Fgithub.com\u002FSamSamskies\u002Finference-bridge). Check the missing-injector state, permission denial, a successful final response (with and without streaming deltas), and cancellation if offered. For each optional feature used, check both advertised and unavailable states. A fallback backend is a separate app choice; do not present its output as IPA.\n","# Build with IPA\n\nIPA is an experimental browser API. The [specification](https:\u002F\u002Fgithub.com\u002FSamSamskies\u002Finference-provider-api\u002Fblob\u002Fmain\u002FSPEC.md) defines its contract; the [ipa-tools README](https:\u002F\u002Fgithub.com\u002FSamSamskies\u002Finference-provider-api\u002Fblob\u002Fmain\u002Fpackages\u002Fipa-tools\u002FREADME.md) documents current helpers. Start with the [chat demo](https:\u002F\u002Fgithub.com\u002FSamSamskies\u002Finference-provider-api\u002Ftree\u002Fmain\u002Fexamples\u002Fchat) for streaming, the [translate demo](https:\u002F\u002Fgithub.com\u002FSamSamskies\u002Finference-provider-api\u002Ftree\u002Fmain\u002Fexamples\u002Ftranslate) for a final-only result, or the [charts demo](https:\u002F\u002Fgithub.com\u002FSamSamskies\u002Finference-provider-api\u002Ftree\u002Fmain\u002Fexamples\u002Fcharts) for page-executed tools. If this repository is available locally, read those files there instead. Check the relevant spec sections before implementing a feature; do not treat an example or a particular injector's extra methods as part of the standard.\n\n## Integrate into the app\n\n1. Fit IPA into the app's existing architecture and requested UX. IPA runs in a top-level browser page on HTTPS or loopback HTTP. It may be absent until a compatible injector is installed. Check `window.inference?.request` before enabling inference; explain how to install a compatible provider when it is missing. If late injection matters, `ipa-tools` offers `waitForInference`, but do not await it before first paint.\n2. Use `window.inference.request` for streaming. For `method: \"chat\"`, iterate its `AsyncIterable`: `accepted` means the request is cleared to reach a provider; `delta` carries display text; `reasoning_delta` is optional; `done` contains the final message, model, and optional usage. A nonstreaming chat provider may yield only `accepted` and `done`. Iteration throws on failure, so handle `error.code` (`permission_denied`, `invalid_request`, `unavailable`, `provider_error`, `aborted`) rather than relying on `instanceof` across extension worlds. Pass an `AbortSignal` when the UI offers cancellation.\n3. For apps needing only the final result, use `complete` or `createInference().complete` from `ipa-tools`. For page-executed function tools, prefer its `runTools` helper or implement the spec's multi-round loop. `ipa-tools` supplies types and helpers; it does not inject `window.inference`, select a provider or model, or expose API keys. Keep provider credentials out of page code.\n4. Gate optional request features using `window.inference.getFeatures?.() ?? {}`. `toolCalling`, `webSearch`, `imageInput`, and `imageOutput` are independent. Do not send an unadvertised function tool, hosted search tool, image part, or `output.images: true`. Feature flags describe the injector's API surface, not a promise that the selected provider or model can fulfill a request. `web_search` is hosted, so do not put it in page-side tool handlers. Request `options` are preferences, not model selection; check `features.options` when deciding whether an option can have an effect.\n5. Show a waiting state while permission resolves; the injector owns the permission prompt and the user chooses the provider and model there. An `accepted` chunk means permission has been resolved, including for an existing grant; it does not prove a prompt appeared. A tool result can be sent in a later round without another permission preview, so disclose what page tools may send before the first request. Treat image input and output and hosted search as distinct capabilities when presenting controls.\n6. For bounded speech, first check `features.methods?.transcribe?.acceptedMedia` or `features.methods?.synthesize`. Use the same `request` with `method: \"transcribe\"` and `media` (completed Blob, raw base64 with a type, or a page-resolved URL), or `method: \"synthesize\"` and `text`. Transcription ends with `done.transcript`; synthesis yields encoded `audio_delta` bytes (MP3 by default; explicit WAV only when `methods.synthesize` is an object whose `outputMediaTypes` includes `audio\u002Fwav`) and metadata-only `done.audio`. Legacy `synthesize: true` means MP3 only; create playback Blobs using the returned media type. Keep `complete` and `runTools` chat-only. Never add method-named API functions, select provider\u002Fmodel\u002Fvoice IDs from page code, upload live microphone streams, or autoplay output. Stop any page-owned recording before requesting separate IPA transcription approval. Read the [speech examples](https:\u002F\u002Fgithub.com\u002FSamSamskies\u002Finference-provider-api\u002Fblob\u002Fmain\u002Fexamples\u002Fspeech\u002FREADME.md); detect advertised method support before use.\n\n## Verify the integration\n\nExercise the relevant app flow in a secure browser context with a compatible injector such as [Inference Bridge](https:\u002F\u002Fgithub.com\u002FSamSamskies\u002Finference-bridge). Check the missing-injector state, permission denial, a successful final response (with and without streaming deltas), and cancellation if offered. For each optional feature used, check both advertised and unavailable states. A fallback backend is a separate app choice; do not present its output as IPA.\n",{"name":5,"description":7},"main","66008805fb0fd5e62a437d45ce98e8b7d0f164ec","skills\u002Fbuild-with-ipa",1,"https:\u002F\u002Fgithub.com\u002FSamSamskies\u002Finference-provider-api","https:\u002F\u002Fgithub.com\u002FSamSamskies","Hey. Hey. Hey! This is library 😂","2026-11-12 11:32:34",{"source":8,"skillName":5,"commands":33,"prompt":43,"zipAvailable":44},[34,37,40],{"tool":35,"command":36},"npx","npx skills add SamSamskies\u002Finference-provider-api --skill build-with-ipa",{"tool":38,"command":39},"bunx","bunx skills add SamSamskies\u002Finference-provider-api --skill build-with-ipa",{"tool":41,"command":42},"pnpm","pnpm dlx skills add SamSamskies\u002Finference-provider-api --skill build-with-ipa","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FSamSamskies\u002Finference-provider-api\u002Fblob\u002Fmain\u002Fskills\u002Fbuild-with-ipa\u002FSKILL.md",true,[],[47,54,60],{"skillNo":48,"name":49,"nameZh":6,"description":50,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":51,"categories":52,"keywords":53,"publishedAt":19},"01M79BAC37XW9C6NSJ1RBC07TG","ship-ipa-package","Prepare and verify npm releases of ipa-tools or ipa-prompt-api-fallback in this repository.","https:\u002F\u002Fgithub.com\u002FSamSamskies\u002Finference-provider-api\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fship-ipa-package\u002FSKILL.md",[],[],{"skillNo":55,"name":49,"nameZh":6,"description":56,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":57,"categories":58,"keywords":59,"publishedAt":19},"01M79BA7XC7DB5WZMBJ9N4KT2Z","Prepare and verify npm releases of ipa-tools or ipa-prompt-api-fallback in inference-provider-api. Use for shipping a named package, preparing a version bump, or checking publication and its demo update. Questions about whether a release is needed call for advice, not publication.","https:\u002F\u002Fgithub.com\u002FSamSamskies\u002Finference-provider-api\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fship-ipa-package\u002FSKILL.md",[],[],{"skillNo":61,"name":62,"nameZh":6,"description":63,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":64,"categories":65,"keywords":66,"publishedAt":19},"01M79BA4NRRXAT6TRE55AMQQ43","create-demo-og","Create or update matching Open Graph preview cards and social metadata for demo apps in the inference-provider-api repository. Use when adding an OG image or share preview to a demo under examples\u002F, or refreshing one of these demo cards.","https:\u002F\u002Fgithub.com\u002FSamSamskies\u002Finference-provider-api\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fcreate-demo-og\u002FSKILL.md",[],[]]