[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6Q3CGTMTPKN192D9BZ2N990":3,"skill-same:01M6Q3CGTMTPKN192D9BZ2N990":121},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":33,"publishedAt":54,"linkOnly":55,"markdownContent":56,"markdownBody":57,"frontMatter":58,"refName":61,"commitSha":62,"skillDirectory":63,"forksCount":64,"repositoryHtmlUrl":65,"repositoryHomepageUrl":6,"ownerHtmlUrl":66,"ownerBlogUrl":6,"ownerDescription":67,"updatedAt":68,"install":69,"resources":82},"01M6Q3CGTMTPKN192D9BZ2N990","javascript-sdk",null,"JavaScript\u002FTypeScript SDK for inference.sh - run AI apps, build agents, integrate 150+ models.\nPackage: @inferencesh\u002Fsdk (npm install). Full TypeScript support, streaming, file uploads.\nBuild agents with template or ad-hoc patterns, tool builder API, skills, human approval.\nUse for: JavaScript integration, TypeScript, Node.js, React, Next.js, frontend apps.\nTriggers: javascript sdk, typescript sdk, npm install, node.js api, js client, react ai,\nnext.js ai, frontend sdk, @inferencesh\u002Fsdk, typescript agent, browser sdk, js integration","Kernel8901\u002Fai-agent-skills-classification","Kernel8901","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F72647553?v=4","01M6KV388J2H5PNC8D8P940BJD","01M6KV38CS5B3AY63RKZB410YM",7,"MIT","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F网页与前端开发\u002Fjavascript-sdk\u002FSKILL.md",[17,22,25,28],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000009","前端开发","SCENARIO","使用场景",{"categoryNo":23,"categoryName":24,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":26,"categoryName":27,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":29,"categoryName":30,"taxonomyType":31,"taxonomyTypeDesc":32},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53],"javascript sdk","sdk","javascript","Bash","apps","human","next","builder","integrate","install","node","template","frontend","api","streaming","browser","run","react","support","typescript","2026-11-10 10:12:30",false,"---\nname: javascript-sdk\ndescription: |\n  JavaScript\u002FTypeScript SDK for inference.sh - run AI apps, build agents, integrate 150+ models.\n  Package: @inferencesh\u002Fsdk (npm install). Full TypeScript support, streaming, file uploads.\n  Build agents with template or ad-hoc patterns, tool builder API, skills, human approval.\n  Use for: JavaScript integration, TypeScript, Node.js, React, Next.js, frontend apps.\n  Triggers: javascript sdk, typescript sdk, npm install, node.js api, js client, react ai,\n  next.js ai, frontend sdk, @inferencesh\u002Fsdk, typescript agent, browser sdk, js integration\nallowed-tools: Bash(npm *), Bash(npx *), Bash(node *), Bash(pnpm *), Bash(yarn *)\n---\n\n# JavaScript SDK\n\nBuild AI applications with the [inference.sh](https:\u002F\u002Finference.sh) JavaScript\u002FTypeScript SDK.\n\n## Quick Start\n\n```bash\nnpm install @inferencesh\u002Fsdk\n```\n\n```typescript\nimport { inference } from '@inferencesh\u002Fsdk';\n\nconst client = inference({ apiKey: 'inf_your_key' });\n\n\u002F\u002F Run an AI app\nconst result = await client.run({\n  app: 'infsh\u002Fflux-schnell',\n  input: { prompt: 'A sunset over mountains' }\n});\nconsole.log(result.output);\n```\n\n## Installation\n\n```bash\nnpm install @inferencesh\u002Fsdk\n# or\nyarn add @inferencesh\u002Fsdk\n# or\npnpm add @inferencesh\u002Fsdk\n```\n\n**Requirements:** Node.js 18.0.0+ (or modern browser with fetch)\n\n## Authentication\n\n```typescript\nimport { inference } from '@inferencesh\u002Fsdk';\n\n\u002F\u002F Direct API key\nconst client = inference({ apiKey: 'inf_your_key' });\n\n\u002F\u002F From environment variable (recommended)\nconst client = inference({ apiKey: process.env.INFERENCE_API_KEY });\n\n\u002F\u002F For frontend apps (use proxy)\nconst client = inference({ proxyUrl: '\u002Fapi\u002Finference\u002Fproxy' });\n```\n\nGet your API key: Settings → API Keys → Create API Key\n\n## Running Apps\n\n### Basic Execution\n\n```typescript\nconst result = await client.run({\n  app: 'infsh\u002Fflux-schnell',\n  input: { prompt: 'A cat astronaut' }\n});\n\nconsole.log(result.status);  \u002F\u002F \"completed\"\nconsole.log(result.output);  \u002F\u002F Output data\n```\n\n### Fire and Forget\n\n```typescript\nconst task = await client.run({\n  app: 'google\u002Fveo-3-1-fast',\n  input: { prompt: 'Drone flying over mountains' }\n}, { wait: false });\n\nconsole.log(`Task ID: ${task.id}`);\n\u002F\u002F Check later with client.getTask(task.id)\n```\n\n### Streaming Progress\n\n```typescript\nconst stream = await client.run({\n  app: 'google\u002Fveo-3-1-fast',\n  input: { prompt: 'Ocean waves at sunset' }\n}, { stream: true });\n\nfor await (const update of stream) {\n  console.log(`Status: ${update.status}`);\n  if (update.logs?.length) {\n    console.log(update.logs.at(-1));\n  }\n}\n```\n\n### Run Parameters\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `app` | string | App ID (namespace\u002Fname@version) |\n| `input` | object | Input matching app schema |\n| `setup` | object | Hidden setup configuration |\n| `infra` | string | 'cloud' or 'private' |\n| `session` | string | Session ID for stateful execution |\n| `session_timeout` | number | Idle timeout (1-3600 seconds) |\n\n## File Handling\n\n### Automatic Upload\n\n```typescript\nconst result = await client.run({\n  app: 'image-processor',\n  input: {\n    image: '\u002Fpath\u002Fto\u002Fimage.png'  \u002F\u002F Auto-uploaded\n  }\n});\n```\n\n### Manual Upload\n\n```typescript\n\u002F\u002F Basic upload\nconst file = await client.uploadFile('\u002Fpath\u002Fto\u002Fimage.png');\n\n\u002F\u002F With options\nconst file = await client.uploadFile('\u002Fpath\u002Fto\u002Fimage.png', {\n  filename: 'custom_name.png',\n  contentType: 'image\u002Fpng',\n  public: true\n});\n\nconst result = await client.run({\n  app: 'image-processor',\n  input: { image: file.uri }\n});\n```\n\n### Browser File Upload\n\n```typescript\nconst input = document.querySelector('input[type=\"file\"]');\nconst file = await client.uploadFile(input.files[0]);\n```\n\n## Sessions (Stateful Execution)\n\nKeep workers warm across multiple calls:\n\n```typescript\n\u002F\u002F Start new session\nconst result = await client.run({\n  app: 'my-app',\n  input: { action: 'init' },\n  session: 'new',\n  session_timeout: 300  \u002F\u002F 5 minutes\n});\nconst sessionId = result.session_id;\n\n\u002F\u002F Continue in same session\nconst result2 = await client.run({\n  app: 'my-app',\n  input: { action: 'process' },\n  session: sessionId\n});\n```\n\n## Agent SDK\n\n### Template Agents\n\nUse pre-built agents from your workspace:\n\n```typescript\nconst agent = client.agent('my-team\u002Fsupport-agent@latest');\n\n\u002F\u002F Send message\nconst response = await agent.sendMessage('Hello!');\nconsole.log(response.text);\n\n\u002F\u002F Multi-turn conversation\nconst response2 = await agent.sendMessage('Tell me more');\n\n\u002F\u002F Reset conversation\nagent.reset();\n\n\u002F\u002F Get chat history\nconst chat = await agent.getChat();\n```\n\n### Ad-hoc Agents\n\nCreate custom agents programmatically:\n\n```typescript\nimport { tool, string, number, appTool } from '@inferencesh\u002Fsdk';\n\n\u002F\u002F Define tools\nconst calculator = tool('calculate')\n  .describe('Perform a calculation')\n  .param('expression', string('Math expression'))\n  .build();\n\nconst imageGen = appTool('generate_image', 'infsh\u002Fflux-schnell@latest')\n  .describe('Generate an image')\n  .param('prompt', string('Image description'))\n  .build();\n\n\u002F\u002F Create agent\nconst agent = client.agent({\n  core_app: { ref: 'infsh\u002Fclaude-sonnet-4@latest' },\n  system_prompt: 'You are a helpful assistant.',\n  tools: [calculator, imageGen],\n  temperature: 0.7,\n  max_tokens: 4096\n});\n\nconst response = await agent.sendMessage('What is 25 * 4?');\n```\n\n### Available Core Apps\n\n| Model | App Reference |\n|-------|---------------|\n| Claude Sonnet 4 | `infsh\u002Fclaude-sonnet-4@latest` |\n| Claude 3.5 Haiku | `infsh\u002Fclaude-haiku-35@latest` |\n| GPT-4o | `infsh\u002Fgpt-4o@latest` |\n| GPT-4o Mini | `infsh\u002Fgpt-4o-mini@latest` |\n\n## Tool Builder API\n\n### Parameter Types\n\n```typescript\nimport {\n  string, number, integer, boolean,\n  enumOf, array, obj, optional\n} from '@inferencesh\u002Fsdk';\n\nconst name = string('User\\'s name');\nconst age = integer('Age in years');\nconst score = number('Score 0-1');\nconst active = boolean('Is active');\nconst priority = enumOf(['low', 'medium', 'high'], 'Priority');\nconst tags = array(string('Tag'), 'List of tags');\nconst address = obj({\n  street: string('Street'),\n  city: string('City'),\n  zip: optional(string('ZIP'))\n}, 'Address');\n```\n\n### Client Tools (Run in Your Code)\n\n```typescript\nconst greet = tool('greet')\n  .display('Greet User')\n  .describe('Greets a user by name')\n  .param('name', string('Name to greet'))\n  .requireApproval()\n  .build();\n```\n\n### App Tools (Call AI Apps)\n\n```typescript\nconst generate = appTool('generate_image', 'infsh\u002Fflux-schnell@latest')\n  .describe('Generate an image from text')\n  .param('prompt', string('Image description'))\n  .setup({ model: 'schnell' })\n  .input({ steps: 20 })\n  .requireApproval()\n  .build();\n```\n\n### Agent Tools (Delegate to Sub-agents)\n\n```typescript\nimport { agentTool } from '@inferencesh\u002Fsdk';\n\nconst researcher = agentTool('research', 'my-org\u002Fresearcher@v1')\n  .describe('Research a topic')\n  .param('topic', string('Topic to research'))\n  .build();\n```\n\n### Webhook Tools (Call External APIs)\n\n```typescript\nimport { webhookTool } from '@inferencesh\u002Fsdk';\n\nconst notify = webhookTool('slack', 'https:\u002F\u002Fhooks.slack.com\u002F...')\n  .describe('Send Slack notification')\n  .secret('SLACK_SECRET')\n  .param('channel', string('Channel'))\n  .param('message', string('Message'))\n  .build();\n```\n\n### Internal Tools (Built-in Capabilities)\n\n```typescript\nimport { internalTools } from '@inferencesh\u002Fsdk';\n\nconst config = internalTools()\n  .plan()\n  .memory()\n  .webSearch(true)\n  .codeExecution(true)\n  .imageGeneration({\n    enabled: true,\n    appRef: 'infsh\u002Fflux@latest'\n  })\n  .build();\n\nconst agent = client.agent({\n  core_app: { ref: 'infsh\u002Fclaude-sonnet-4@latest' },\n  internal_tools: config\n});\n```\n\n## Streaming Agent Responses\n\n```typescript\nconst response = await agent.sendMessage('Explain quantum computing', {\n  onMessage: (msg) => {\n    if (msg.content) {\n      process.stdout.write(msg.content);\n    }\n  },\n  onToolCall: async (call) => {\n    console.log(`\\n[Tool: ${call.name}]`);\n    const result = await executeTool(call.name, call.args);\n    agent.submitToolResult(call.id, result);\n  }\n});\n```\n\n## File Attachments\n\n```typescript\n\u002F\u002F From file path (Node.js)\nimport { readFileSync } from 'fs';\nconst response = await agent.sendMessage('What\\'s in this image?', {\n  files: [readFileSync('image.png')]\n});\n\n\u002F\u002F From base64\nconst response = await agent.sendMessage('Analyze this', {\n  files: ['data:image\u002Fpng;base64,iVBORw0KGgo...']\n});\n\n\u002F\u002F From browser File object\nconst input = document.querySelector('input[type=\"file\"]');\nconst response = await agent.sendMessage('Describe this', {\n  files: [input.files[0]]\n});\n```\n\n## Skills (Reusable Context)\n\n```typescript\nconst agent = client.agent({\n  core_app: { ref: 'infsh\u002Fclaude-sonnet-4@latest' },\n  skills: [\n    {\n      name: 'code-review',\n      description: 'Code review guidelines',\n      content: '# Code Review\\n\\n1. Check security\\n2. Check performance...'\n    },\n    {\n      name: 'api-docs',\n      description: 'API documentation',\n      url: 'https:\u002F\u002Fexample.com\u002Fskills\u002Fapi-docs.md'\n    }\n  ]\n});\n```\n\n## Server Proxy (Frontend Apps)\n\nFor browser apps, proxy through your backend to keep API keys secure:\n\n### Client Setup\n\n```typescript\nconst client = inference({\n  proxyUrl: '\u002Fapi\u002Finference\u002Fproxy'\n  \u002F\u002F No apiKey needed on frontend\n});\n```\n\n### Next.js Proxy (App Router)\n\n```typescript\n\u002F\u002F app\u002Fapi\u002Finference\u002Fproxy\u002Froute.ts\nimport { createRouteHandler } from '@inferencesh\u002Fsdk\u002Fproxy\u002Fnextjs';\n\nconst route = createRouteHandler({\n  apiKey: process.env.INFERENCE_API_KEY\n});\n\nexport const POST = route.POST;\n```\n\n### Express Proxy\n\n```typescript\nimport express from 'express';\nimport { createProxyMiddleware } from '@inferencesh\u002Fsdk\u002Fproxy\u002Fexpress';\n\nconst app = express();\napp.use('\u002Fapi\u002Finference\u002Fproxy', createProxyMiddleware({\n  apiKey: process.env.INFERENCE_API_KEY\n}));\n```\n\n### Supported Frameworks\n\n- Next.js (App Router & Pages Router)\n- Express\n- Hono\n- Remix\n- SvelteKit\n\n## TypeScript Support\n\nFull type definitions included:\n\n```typescript\nimport type {\n  TaskDTO,\n  ChatDTO,\n  ChatMessageDTO,\n  AgentTool,\n  TaskStatusCompleted,\n  TaskStatusFailed\n} from '@inferencesh\u002Fsdk';\n\nif (result.status === TaskStatusCompleted) {\n  console.log('Done!');\n} else if (result.status === TaskStatusFailed) {\n  console.log('Failed:', result.error);\n}\n```\n\n## Error Handling\n\n```typescript\nimport { RequirementsNotMetException, InferenceError } from '@inferencesh\u002Fsdk';\n\ntry {\n  const result = await client.run({ app: 'my-app', input: {...} });\n} catch (e) {\n  if (e instanceof RequirementsNotMetException) {\n    console.log('Missing requirements:');\n    for (const err of e.errors) {\n      console.log(`  - ${err.type}: ${err.key}`);\n    }\n  } else if (e instanceof InferenceError) {\n    console.log('API error:', e.message);\n  }\n}\n```\n\n## Human Approval Workflows\n\n```typescript\nconst response = await agent.sendMessage('Delete all temp files', {\n  onToolCall: async (call) => {\n    if (call.requiresApproval) {\n      const approved = await promptUser(`Allow ${call.name}?`);\n      if (approved) {\n        const result = await executeTool(call.name, call.args);\n        agent.submitToolResult(call.id, result);\n      } else {\n        agent.submitToolResult(call.id, { error: 'Denied by user' });\n      }\n    }\n  }\n});\n```\n\n## CommonJS Support\n\n```javascript\nconst { inference, tool, string } = require('@inferencesh\u002Fsdk');\n\nconst client = inference({ apiKey: 'inf_...' });\nconst result = await client.run({...});\n```\n\n## Reference Files\n\n- [Agent Patterns](references\u002Fagent-patterns.md) - Multi-agent, RAG, batch processing patterns\n- [Tool Builder](references\u002Ftool-builder.md) - Complete tool builder API reference\n- [Server Proxy](references\u002Fserver-proxy.md) - Next.js, Express, Hono, Remix, SvelteKit setup\n- [Streaming](references\u002Fstreaming.md) - Real-time progress updates and SSE handling\n- [File Handling](references\u002Ffiles.md) - Upload, download, and manage files\n- [Sessions](references\u002Fsessions.md) - Stateful execution with warm workers\n- [TypeScript](references\u002Ftypescript.md) - Type definitions and type-safe patterns\n- [React Integration](references\u002Freact-integration.md) - Hooks, components, and patterns\n\n## Related Skills\n\n```bash\n# Python SDK\nnpx skills add inference-sh\u002Fagent-skills@python-sdk\n\n# Full platform skill (all 150+ apps via CLI)\nnpx skills add inference-sh\u002Fagent-skills@inference-sh\n\n# LLM models\nnpx skills add inference-sh\u002Fagent-skills@llm-models\n\n# Image generation\nnpx skills add inference-sh\u002Fagent-skills@ai-image-generation\n```\n\n## Documentation\n\n- [JavaScript SDK Reference](https:\u002F\u002Finference.sh\u002Fdocs\u002Fapi\u002Fsdk-javascript) - Full API documentation\n- [Agent SDK Overview](https:\u002F\u002Finference.sh\u002Fdocs\u002Fapi\u002Fagent-sdk) - Building agents\n- [Tool Builder Reference](https:\u002F\u002Finference.sh\u002Fdocs\u002Fapi\u002Fagent-tools) - Creating tools\n- [Server Proxy Setup](https:\u002F\u002Finference.sh\u002Fdocs\u002Fapi\u002Fsdk\u002Fserver-proxy) - Frontend integration\n- [Authentication](https:\u002F\u002Finference.sh\u002Fdocs\u002Fapi\u002Fauthentication) - API key setup\n- [Streaming](https:\u002F\u002Finference.sh\u002Fdocs\u002Fapi\u002Fsdk\u002Fstreaming) - Real-time updates\n- [File Uploads](https:\u002F\u002Finference.sh\u002Fdocs\u002Fapi\u002Fsdk\u002Ffiles) - File handling\n","# JavaScript SDK\n\nBuild AI applications with the [inference.sh](https:\u002F\u002Finference.sh) JavaScript\u002FTypeScript SDK.\n\n## Quick Start\n\n```bash\nnpm install @inferencesh\u002Fsdk\n```\n\n```typescript\nimport { inference } from '@inferencesh\u002Fsdk';\n\nconst client = inference({ apiKey: 'inf_your_key' });\n\n\u002F\u002F Run an AI app\nconst result = await client.run({\n  app: 'infsh\u002Fflux-schnell',\n  input: { prompt: 'A sunset over mountains' }\n});\nconsole.log(result.output);\n```\n\n## Installation\n\n```bash\nnpm install @inferencesh\u002Fsdk\n# or\nyarn add @inferencesh\u002Fsdk\n# or\npnpm add @inferencesh\u002Fsdk\n```\n\n**Requirements:** Node.js 18.0.0+ (or modern browser with fetch)\n\n## Authentication\n\n```typescript\nimport { inference } from '@inferencesh\u002Fsdk';\n\n\u002F\u002F Direct API key\nconst client = inference({ apiKey: 'inf_your_key' });\n\n\u002F\u002F From environment variable (recommended)\nconst client = inference({ apiKey: process.env.INFERENCE_API_KEY });\n\n\u002F\u002F For frontend apps (use proxy)\nconst client = inference({ proxyUrl: '\u002Fapi\u002Finference\u002Fproxy' });\n```\n\nGet your API key: Settings → API Keys → Create API Key\n\n## Running Apps\n\n### Basic Execution\n\n```typescript\nconst result = await client.run({\n  app: 'infsh\u002Fflux-schnell',\n  input: { prompt: 'A cat astronaut' }\n});\n\nconsole.log(result.status);  \u002F\u002F \"completed\"\nconsole.log(result.output);  \u002F\u002F Output data\n```\n\n### Fire and Forget\n\n```typescript\nconst task = await client.run({\n  app: 'google\u002Fveo-3-1-fast',\n  input: { prompt: 'Drone flying over mountains' }\n}, { wait: false });\n\nconsole.log(`Task ID: ${task.id}`);\n\u002F\u002F Check later with client.getTask(task.id)\n```\n\n### Streaming Progress\n\n```typescript\nconst stream = await client.run({\n  app: 'google\u002Fveo-3-1-fast',\n  input: { prompt: 'Ocean waves at sunset' }\n}, { stream: true });\n\nfor await (const update of stream) {\n  console.log(`Status: ${update.status}`);\n  if (update.logs?.length) {\n    console.log(update.logs.at(-1));\n  }\n}\n```\n\n### Run Parameters\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `app` | string | App ID (namespace\u002Fname@version) |\n| `input` | object | Input matching app schema |\n| `setup` | object | Hidden setup configuration |\n| `infra` | string | 'cloud' or 'private' |\n| `session` | string | Session ID for stateful execution |\n| `session_timeout` | number | Idle timeout (1-3600 seconds) |\n\n## File Handling\n\n### Automatic Upload\n\n```typescript\nconst result = await client.run({\n  app: 'image-processor',\n  input: {\n    image: '\u002Fpath\u002Fto\u002Fimage.png'  \u002F\u002F Auto-uploaded\n  }\n});\n```\n\n### Manual Upload\n\n```typescript\n\u002F\u002F Basic upload\nconst file = await client.uploadFile('\u002Fpath\u002Fto\u002Fimage.png');\n\n\u002F\u002F With options\nconst file = await client.uploadFile('\u002Fpath\u002Fto\u002Fimage.png', {\n  filename: 'custom_name.png',\n  contentType: 'image\u002Fpng',\n  public: true\n});\n\nconst result = await client.run({\n  app: 'image-processor',\n  input: { image: file.uri }\n});\n```\n\n### Browser File Upload\n\n```typescript\nconst input = document.querySelector('input[type=\"file\"]');\nconst file = await client.uploadFile(input.files[0]);\n```\n\n## Sessions (Stateful Execution)\n\nKeep workers warm across multiple calls:\n\n```typescript\n\u002F\u002F Start new session\nconst result = await client.run({\n  app: 'my-app',\n  input: { action: 'init' },\n  session: 'new',\n  session_timeout: 300  \u002F\u002F 5 minutes\n});\nconst sessionId = result.session_id;\n\n\u002F\u002F Continue in same session\nconst result2 = await client.run({\n  app: 'my-app',\n  input: { action: 'process' },\n  session: sessionId\n});\n```\n\n## Agent SDK\n\n### Template Agents\n\nUse pre-built agents from your workspace:\n\n```typescript\nconst agent = client.agent('my-team\u002Fsupport-agent@latest');\n\n\u002F\u002F Send message\nconst response = await agent.sendMessage('Hello!');\nconsole.log(response.text);\n\n\u002F\u002F Multi-turn conversation\nconst response2 = await agent.sendMessage('Tell me more');\n\n\u002F\u002F Reset conversation\nagent.reset();\n\n\u002F\u002F Get chat history\nconst chat = await agent.getChat();\n```\n\n### Ad-hoc Agents\n\nCreate custom agents programmatically:\n\n```typescript\nimport { tool, string, number, appTool } from '@inferencesh\u002Fsdk';\n\n\u002F\u002F Define tools\nconst calculator = tool('calculate')\n  .describe('Perform a calculation')\n  .param('expression', string('Math expression'))\n  .build();\n\nconst imageGen = appTool('generate_image', 'infsh\u002Fflux-schnell@latest')\n  .describe('Generate an image')\n  .param('prompt', string('Image description'))\n  .build();\n\n\u002F\u002F Create agent\nconst agent = client.agent({\n  core_app: { ref: 'infsh\u002Fclaude-sonnet-4@latest' },\n  system_prompt: 'You are a helpful assistant.',\n  tools: [calculator, imageGen],\n  temperature: 0.7,\n  max_tokens: 4096\n});\n\nconst response = await agent.sendMessage('What is 25 * 4?');\n```\n\n### Available Core Apps\n\n| Model | App Reference |\n|-------|---------------|\n| Claude Sonnet 4 | `infsh\u002Fclaude-sonnet-4@latest` |\n| Claude 3.5 Haiku | `infsh\u002Fclaude-haiku-35@latest` |\n| GPT-4o | `infsh\u002Fgpt-4o@latest` |\n| GPT-4o Mini | `infsh\u002Fgpt-4o-mini@latest` |\n\n## Tool Builder API\n\n### Parameter Types\n\n```typescript\nimport {\n  string, number, integer, boolean,\n  enumOf, array, obj, optional\n} from '@inferencesh\u002Fsdk';\n\nconst name = string('User\\'s name');\nconst age = integer('Age in years');\nconst score = number('Score 0-1');\nconst active = boolean('Is active');\nconst priority = enumOf(['low', 'medium', 'high'], 'Priority');\nconst tags = array(string('Tag'), 'List of tags');\nconst address = obj({\n  street: string('Street'),\n  city: string('City'),\n  zip: optional(string('ZIP'))\n}, 'Address');\n```\n\n### Client Tools (Run in Your Code)\n\n```typescript\nconst greet = tool('greet')\n  .display('Greet User')\n  .describe('Greets a user by name')\n  .param('name', string('Name to greet'))\n  .requireApproval()\n  .build();\n```\n\n### App Tools (Call AI Apps)\n\n```typescript\nconst generate = appTool('generate_image', 'infsh\u002Fflux-schnell@latest')\n  .describe('Generate an image from text')\n  .param('prompt', string('Image description'))\n  .setup({ model: 'schnell' })\n  .input({ steps: 20 })\n  .requireApproval()\n  .build();\n```\n\n### Agent Tools (Delegate to Sub-agents)\n\n```typescript\nimport { agentTool } from '@inferencesh\u002Fsdk';\n\nconst researcher = agentTool('research', 'my-org\u002Fresearcher@v1')\n  .describe('Research a topic')\n  .param('topic', string('Topic to research'))\n  .build();\n```\n\n### Webhook Tools (Call External APIs)\n\n```typescript\nimport { webhookTool } from '@inferencesh\u002Fsdk';\n\nconst notify = webhookTool('slack', 'https:\u002F\u002Fhooks.slack.com\u002F...')\n  .describe('Send Slack notification')\n  .secret('SLACK_SECRET')\n  .param('channel', string('Channel'))\n  .param('message', string('Message'))\n  .build();\n```\n\n### Internal Tools (Built-in Capabilities)\n\n```typescript\nimport { internalTools } from '@inferencesh\u002Fsdk';\n\nconst config = internalTools()\n  .plan()\n  .memory()\n  .webSearch(true)\n  .codeExecution(true)\n  .imageGeneration({\n    enabled: true,\n    appRef: 'infsh\u002Fflux@latest'\n  })\n  .build();\n\nconst agent = client.agent({\n  core_app: { ref: 'infsh\u002Fclaude-sonnet-4@latest' },\n  internal_tools: config\n});\n```\n\n## Streaming Agent Responses\n\n```typescript\nconst response = await agent.sendMessage('Explain quantum computing', {\n  onMessage: (msg) => {\n    if (msg.content) {\n      process.stdout.write(msg.content);\n    }\n  },\n  onToolCall: async (call) => {\n    console.log(`\\n[Tool: ${call.name}]`);\n    const result = await executeTool(call.name, call.args);\n    agent.submitToolResult(call.id, result);\n  }\n});\n```\n\n## File Attachments\n\n```typescript\n\u002F\u002F From file path (Node.js)\nimport { readFileSync } from 'fs';\nconst response = await agent.sendMessage('What\\'s in this image?', {\n  files: [readFileSync('image.png')]\n});\n\n\u002F\u002F From base64\nconst response = await agent.sendMessage('Analyze this', {\n  files: ['data:image\u002Fpng;base64,iVBORw0KGgo...']\n});\n\n\u002F\u002F From browser File object\nconst input = document.querySelector('input[type=\"file\"]');\nconst response = await agent.sendMessage('Describe this', {\n  files: [input.files[0]]\n});\n```\n\n## Skills (Reusable Context)\n\n```typescript\nconst agent = client.agent({\n  core_app: { ref: 'infsh\u002Fclaude-sonnet-4@latest' },\n  skills: [\n    {\n      name: 'code-review',\n      description: 'Code review guidelines',\n      content: '# Code Review\\n\\n1. Check security\\n2. Check performance...'\n    },\n    {\n      name: 'api-docs',\n      description: 'API documentation',\n      url: 'https:\u002F\u002Fexample.com\u002Fskills\u002Fapi-docs.md'\n    }\n  ]\n});\n```\n\n## Server Proxy (Frontend Apps)\n\nFor browser apps, proxy through your backend to keep API keys secure:\n\n### Client Setup\n\n```typescript\nconst client = inference({\n  proxyUrl: '\u002Fapi\u002Finference\u002Fproxy'\n  \u002F\u002F No apiKey needed on frontend\n});\n```\n\n### Next.js Proxy (App Router)\n\n```typescript\n\u002F\u002F app\u002Fapi\u002Finference\u002Fproxy\u002Froute.ts\nimport { createRouteHandler } from '@inferencesh\u002Fsdk\u002Fproxy\u002Fnextjs';\n\nconst route = createRouteHandler({\n  apiKey: process.env.INFERENCE_API_KEY\n});\n\nexport const POST = route.POST;\n```\n\n### Express Proxy\n\n```typescript\nimport express from 'express';\nimport { createProxyMiddleware } from '@inferencesh\u002Fsdk\u002Fproxy\u002Fexpress';\n\nconst app = express();\napp.use('\u002Fapi\u002Finference\u002Fproxy', createProxyMiddleware({\n  apiKey: process.env.INFERENCE_API_KEY\n}));\n```\n\n### Supported Frameworks\n\n- Next.js (App Router & Pages Router)\n- Express\n- Hono\n- Remix\n- SvelteKit\n\n## TypeScript Support\n\nFull type definitions included:\n\n```typescript\nimport type {\n  TaskDTO,\n  ChatDTO,\n  ChatMessageDTO,\n  AgentTool,\n  TaskStatusCompleted,\n  TaskStatusFailed\n} from '@inferencesh\u002Fsdk';\n\nif (result.status === TaskStatusCompleted) {\n  console.log('Done!');\n} else if (result.status === TaskStatusFailed) {\n  console.log('Failed:', result.error);\n}\n```\n\n## Error Handling\n\n```typescript\nimport { RequirementsNotMetException, InferenceError } from '@inferencesh\u002Fsdk';\n\ntry {\n  const result = await client.run({ app: 'my-app', input: {...} });\n} catch (e) {\n  if (e instanceof RequirementsNotMetException) {\n    console.log('Missing requirements:');\n    for (const err of e.errors) {\n      console.log(`  - ${err.type}: ${err.key}`);\n    }\n  } else if (e instanceof InferenceError) {\n    console.log('API error:', e.message);\n  }\n}\n```\n\n## Human Approval Workflows\n\n```typescript\nconst response = await agent.sendMessage('Delete all temp files', {\n  onToolCall: async (call) => {\n    if (call.requiresApproval) {\n      const approved = await promptUser(`Allow ${call.name}?`);\n      if (approved) {\n        const result = await executeTool(call.name, call.args);\n        agent.submitToolResult(call.id, result);\n      } else {\n        agent.submitToolResult(call.id, { error: 'Denied by user' });\n      }\n    }\n  }\n});\n```\n\n## CommonJS Support\n\n```javascript\nconst { inference, tool, string } = require('@inferencesh\u002Fsdk');\n\nconst client = inference({ apiKey: 'inf_...' });\nconst result = await client.run({...});\n```\n\n## Reference Files\n\n- [Agent Patterns](references\u002Fagent-patterns.md) - Multi-agent, RAG, batch processing patterns\n- [Tool Builder](references\u002Ftool-builder.md) - Complete tool builder API reference\n- [Server Proxy](references\u002Fserver-proxy.md) - Next.js, Express, Hono, Remix, SvelteKit setup\n- [Streaming](references\u002Fstreaming.md) - Real-time progress updates and SSE handling\n- [File Handling](references\u002Ffiles.md) - Upload, download, and manage files\n- [Sessions](references\u002Fsessions.md) - Stateful execution with warm workers\n- [TypeScript](references\u002Ftypescript.md) - Type definitions and type-safe patterns\n- [React Integration](references\u002Freact-integration.md) - Hooks, components, and patterns\n\n## Related Skills\n\n```bash\n# Python SDK\nnpx skills add inference-sh\u002Fagent-skills@python-sdk\n\n# Full platform skill (all 150+ apps via CLI)\nnpx skills add inference-sh\u002Fagent-skills@inference-sh\n\n# LLM models\nnpx skills add inference-sh\u002Fagent-skills@llm-models\n\n# Image generation\nnpx skills add inference-sh\u002Fagent-skills@ai-image-generation\n```\n\n## Documentation\n\n- [JavaScript SDK Reference](https:\u002F\u002Finference.sh\u002Fdocs\u002Fapi\u002Fsdk-javascript) - Full API documentation\n- [Agent SDK Overview](https:\u002F\u002Finference.sh\u002Fdocs\u002Fapi\u002Fagent-sdk) - Building agents\n- [Tool Builder Reference](https:\u002F\u002Finference.sh\u002Fdocs\u002Fapi\u002Fagent-tools) - Creating tools\n- [Server Proxy Setup](https:\u002F\u002Finference.sh\u002Fdocs\u002Fapi\u002Fsdk\u002Fserver-proxy) - Frontend integration\n- [Authentication](https:\u002F\u002Finference.sh\u002Fdocs\u002Fapi\u002Fauthentication) - API key setup\n- [Streaming](https:\u002F\u002Finference.sh\u002Fdocs\u002Fapi\u002Fsdk\u002Fstreaming) - Real-time updates\n- [File Uploads](https:\u002F\u002Finference.sh\u002Fdocs\u002Fapi\u002Fsdk\u002Ffiles) - File handling\n",{"name":5,"description":59,"allowed-tools":60},"JavaScript\u002FTypeScript SDK for inference.sh - run AI apps, build agents, integrate 150+ models.\nPackage: @inferencesh\u002Fsdk (npm install). Full TypeScript support, streaming, file uploads.\nBuild agents with template or ad-hoc patterns, tool builder API, skills, human approval.\nUse for: JavaScript integration, TypeScript, Node.js, React, Next.js, frontend apps.\nTriggers: javascript sdk, typescript sdk, npm install, node.js api, js client, react ai,\nnext.js ai, frontend sdk, @inferencesh\u002Fsdk, typescript agent, browser sdk, js integration\n","Bash(npm *), Bash(npx *), Bash(node *), Bash(pnpm *), Bash(yarn *)","main","f4cb2d49f7667e79ef7804f50396d5aaffdf1f56","网页与前端开发\u002Fjavascript-sdk",1,"https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification","https:\u002F\u002Fgithub.com\u002FKernel8901","a little little little dobe in life but science geek","2026-04-05 16:43:56",{"source":8,"skillName":5,"commands":70,"prompt":80,"zipAvailable":81},[71,74,77],{"tool":72,"command":73},"npx","npx skills add Kernel8901\u002Fai-agent-skills-classification --skill javascript-sdk",{"tool":75,"command":76},"bunx","bunx skills add Kernel8901\u002Fai-agent-skills-classification --skill javascript-sdk",{"tool":78,"command":79},"pnpm","pnpm dlx skills add Kernel8901\u002Fai-agent-skills-classification --skill javascript-sdk","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F网页与前端开发\u002Fjavascript-sdk\u002FSKILL.md",true,[83,89,93,97,101,105,109,113,117],{"path":84,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":87,"sourceHtmlUrl":88},"_meta.json","REFERENCE","参考文档",280,"https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F网页与前端开发\u002Fjavascript-sdk\u002F_meta.json",{"path":90,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":91,"sourceHtmlUrl":92},"references\u002Fagent-patterns.md",10157,"https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F网页与前端开发\u002Fjavascript-sdk\u002Freferences\u002Fagent-patterns.md",{"path":94,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":95,"sourceHtmlUrl":96},"references\u002Ffiles.md",9000,"https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F网页与前端开发\u002Fjavascript-sdk\u002Freferences\u002Ffiles.md",{"path":98,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":99,"sourceHtmlUrl":100},"references\u002Freact-integration.md",13492,"https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F网页与前端开发\u002Fjavascript-sdk\u002Freferences\u002Freact-integration.md",{"path":102,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":103,"sourceHtmlUrl":104},"references\u002Fserver-proxy.md",8596,"https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F网页与前端开发\u002Fjavascript-sdk\u002Freferences\u002Fserver-proxy.md",{"path":106,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":107,"sourceHtmlUrl":108},"references\u002Fsessions.md",8762,"https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F网页与前端开发\u002Fjavascript-sdk\u002Freferences\u002Fsessions.md",{"path":110,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":111,"sourceHtmlUrl":112},"references\u002Fstreaming.md",9501,"https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F网页与前端开发\u002Fjavascript-sdk\u002Freferences\u002Fstreaming.md",{"path":114,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":115,"sourceHtmlUrl":116},"references\u002Ftool-builder.md",10593,"https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F网页与前端开发\u002Fjavascript-sdk\u002Freferences\u002Ftool-builder.md",{"path":118,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":119,"sourceHtmlUrl":120},"references\u002Ftypescript.md",8045,"https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F网页与前端开发\u002Fjavascript-sdk\u002Freferences\u002Ftypescript.md",[122,146,171,182,192,221],{"skillNo":123,"name":124,"nameZh":6,"description":125,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":126,"categories":127,"keywords":128,"publishedAt":54},"01M6Q5R6WZ06RRB9RQTW54B34B","zyfai","Earn yield on any Ethereum wallet on Base, Arbitrum, and Plasma. Use when a user wants passive DeFi yield on their funds. Deploys a non-custodial subaccount (Safe) linked to their EOA, enables automated yield optimization, and lets them deposit\u002Fwithdraw anytime.","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F金融\u002Fzyfai-sdk\u002FSKILL.md",[],[124,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145],"safe","ethereum","defi","Optimization","user","use","Wallet","base","deposit","withdraw","yield","arbitrum","non-custodial","passive","defi yield","earn","yield optimization",{"skillNo":147,"name":148,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":149,"categories":150,"keywords":154,"publishedAt":54},"01M6Q5R337B5JSNER4P4YS03TN","zerion-api","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F金融\u002Fzerion-api\u002FSKILL.md",[151,152,153],{"categoryNo":23,"categoryName":24,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":26,"categoryName":27,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":29,"categoryName":30,"taxonomyType":31,"taxonomyTypeDesc":32},[47,155,156,157,158,159,160,131,161,135,162,163,164,165,166,167,168,169,170],"zerion api","zerion","MCP","mcp server","server","blockchain","transactions","crypto wallet","crypto","evm","solana","query","across","positions","token","prices",{"skillNo":172,"name":173,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":174,"categories":175,"keywords":179,"publishedAt":54},"01M6Q5QZFYTDAZMZ27BN5VZXAR","zerion-api-skill","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F金融\u002Fzerion-api-skill\u002FSKILL.md",[176,177,178],{"categoryNo":23,"categoryName":24,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":26,"categoryName":27,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":29,"categoryName":30,"taxonomyType":31,"taxonomyTypeDesc":32},[47,180,181,155,156,157,158,159,160,131,161,135,163,164,165,166,167,168,169,170],"api skill","zerion api skill",{"skillNo":183,"name":184,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":185,"categories":186,"keywords":190,"publishedAt":54},"01M6Q5QW17QW98RA3FE45E4RD8","zerion-api-mcp","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F金融\u002Fzerion-api-mcp\u002FSKILL.md",[187,188,189],{"categoryNo":23,"categoryName":24,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":26,"categoryName":27,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":29,"categoryName":30,"taxonomyType":31,"taxonomyTypeDesc":32},[157,47,191,155,156,158,159,131,161,135,162,163,164,165,166,167,168,169,170],"zerion api mcp",{"skillNo":193,"name":194,"nameZh":6,"description":195,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":196,"categories":197,"keywords":201,"publishedAt":54},"01M6Q5QQYZB7A501BDEQWKGSJT","yahoo-finance-forex","Fetches real-time FOREX news and market data from Yahoo Finance for major currency pairs (EUR\u002FUSD, GBP\u002FUSD, USD\u002FJPY, etc.). Analyzes sentiment and provides trading context.","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F金融\u002Fyahoo-finance-forex\u002FSKILL.md",[198],{"categoryNo":199,"categoryName":200,"taxonomyType":31,"taxonomyTypeDesc":32},"01JBSEEDCAT000000000000040","财务",[202,203,204,205,206,207,208,209,210,211,43,212,213,214,215,216,217,218,219,220],"finance","yahoo finance","forex","yahoo","yahoo finance forex","github","https","sentiment","real-time","python3","Market","usd","news","time","currency","gbp","pip","market data","for",{"skillNo":222,"name":223,"nameZh":6,"description":224,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":225,"categories":226,"keywords":228,"publishedAt":54},"01M6Q5QM6VS84WZVM7BKXXPF32","yahoo-finance","This skill should be used when the user asks to \"get stock prices\", \"check stock quotes\", \"look up earnings\", \"get financial data\", \"find trending stocks\", or needs stock market data from Yahoo Finance.","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F金融\u002Fyahoo-finance-cli\u002FSKILL.md",[227],{"categoryNo":199,"categoryName":200,"taxonomyType":31,"taxonomyTypeDesc":32},[202,203,205,229,230,231,232,233,234,212,235,236,237,238,239,240,241,242,170,219],"cli","homebrew","find","check","brew","up","local","get","stock","link","trending","sf","quotes","ln"]