{"componentChunkName":"component---src-gatsby-theme-chronoblog-templates-note-js","path":"/notes/llm-integration-openrouter/","result":{"data":{"mdx":{"parent":{"__typename":"File","fields":{"gitLogLatestDate":"2026-06-08 13:49:04 +0200"}},"id":"b5a18031-c7d5-5dab-a24e-7a4e14b3b80c","excerpt":"OpenRouter  is a unified API gateway to hundreds of language models from providers such as OpenAI, Anthropic, Google, and Meta. You use one…","frontmatter":{"title":"LLM integration with OpenRouter","date":"2026-06-08 09:30:00 UTC","job_ad":null,"job_ad_id":null,"job_ad_url":null,"tags":["openrouter","llm","api","node","ai"],"cover":{"childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAIAAABM9SnKAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA7ElEQVQY00WQ246DMAxE+f9v3O2SpA0slFsSwI5vFautOvKDJZ/RaNzYn0SUqM4Ttj/JuRQfJ5zMTKr6BpiIxhHbNrVtWhcxs4bZalUAMtNrOeUauFwiAicyKyIRsaoh/gMVVVWbocfbbV1mYq7TE4Mv3qVH2BEYgIIv319T8GUvtC7gXfJu8y4FX9ImDZMhCl7JRtUQrKJVMBFTtVIqnHLszCTMnyvCBTfvSpQzDQM97vkeUted8ywVSZXNTPX6yLZxjMc95Bj3voec32Yz23eeJonxcG4dR1oWZRb7SLeVh4G67vjt4TlKTvoCp1FaC4+tduEAAAAASUVORK5CYII=","aspectRatio":3.2542372881355934,"src":"/static/ca9fb714b60eb190748be014ff6b74bf/c4ecb/cover.png","srcSet":"/static/ca9fb714b60eb190748be014ff6b74bf/57ab0/cover.png 192w,\n/static/ca9fb714b60eb190748be014ff6b74bf/f4739/cover.png 384w,\n/static/ca9fb714b60eb190748be014ff6b74bf/c4ecb/cover.png 768w,\n/static/ca9fb714b60eb190748be014ff6b74bf/77bb2/cover.png 981w","srcWebp":"/static/ca9fb714b60eb190748be014ff6b74bf/dd090/cover.webp","srcSetWebp":"/static/ca9fb714b60eb190748be014ff6b74bf/ae504/cover.webp 192w,\n/static/ca9fb714b60eb190748be014ff6b74bf/fef30/cover.webp 384w,\n/static/ca9fb714b60eb190748be014ff6b74bf/dd090/cover.webp 768w,\n/static/ca9fb714b60eb190748be014ff6b74bf/4ca9b/cover.webp 981w","sizes":"(max-width: 768px) 100vw, 768px","presentationWidth":768,"presentationHeight":236},"resize":{"src":"/static/ca9fb714b60eb190748be014ff6b74bf/c4ecb/cover.png"}}}},"fields":{"slug":"/notes/llm-integration-openrouter/","readingTime":{"text":"5 min read"}},"body":"function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsxRuntime classic */\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"title\": \"LLM integration with OpenRouter\",\n  \"date\": \"2026-06-08 09:30:00 UTC\",\n  \"cover\": \"./cover.png\",\n  \"tags\": [\"openrouter\", \"llm\", \"api\", \"node\", \"ai\"],\n  \"canonical_url\": \"https://sevic.dev/notes/llm-integration-openrouter/\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, [\"components\"]);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://openrouter.ai/\"\n  }), \"OpenRouter\"), \" is a unified API gateway to hundreds of language models from providers such as OpenAI, Anthropic, Google, and Meta. You use one API key and one billing surface, and swap models by changing a \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"provider/model\"), \" slug. OpenRouter exposes a \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Chat Completions\"), \"-compatible HTTP API.\"), mdx(\"p\", null, \"This post shows three Node.js integration paths: the official \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://openrouter.ai/docs/client-sdks/typescript/overview\"\n  }), mdx(\"inlineCode\", {\n    parentName: \"a\"\n  }, \"@openrouter/sdk\")), \", the \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://www.npmjs.com/package/openai\"\n  }), mdx(\"inlineCode\", {\n    parentName: \"a\"\n  }, \"openai\")), \" package with \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"baseURL\"), \", and the \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://ai-sdk.dev/\"\n  }), \"Vercel AI SDK\"), \" with \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://www.npmjs.com/package/@openrouter/ai-sdk-provider\"\n  }), mdx(\"inlineCode\", {\n    parentName: \"a\"\n  }, \"@openrouter/ai-sdk-provider\")), \".\"), mdx(\"p\", null, \"For deeper patterns on each stack, see the \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://sevic.dev/notes/chatgpt-api-nodejs/\"\n  }), \"Chat Completions API\"), \", \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://sevic.dev/notes/llm-integration-openai-responses-api/\"\n  }), \"OpenAI Responses API\"), \" (OpenAI direct only), and \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://sevic.dev/notes/llm-integration-vercel-ai-sdk/\"\n  }), \"Vercel AI SDK\"), \" posts.\"), mdx(\"h3\", {\n    \"id\": \"prerequisites\"\n  }, \"Prerequisites\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"OpenRouter account\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", _extends({\n    parentName: \"li\"\n  }, {\n    \"href\": \"https://openrouter.ai/settings/keys\"\n  }), \"API key\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Credits or billing enabled as needed\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Node.js version 26\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Install packages for the path you use:\", mdx(\"ul\", {\n    parentName: \"li\"\n  }, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"@openrouter/sdk\"), \" (\", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"npm i @openrouter/sdk\"), \")\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"openai\"), \" (\", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"npm i openai\"), \")\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"ai\"), \" and \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"@openrouter/ai-sdk-provider\"), \" (\", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"npm i ai @openrouter/ai-sdk-provider\"), \")\")))), mdx(\"h3\", {\n    \"id\": \"configuration\"\n  }, \"Configuration\"), mdx(\"p\", null, \"Read credentials from the environment in production.\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"Variable\"), mdx(\"th\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"Purpose\"))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"OPENROUTER_API_KEY\")), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"Bearer token from OpenRouter settings\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"OPENROUTER_MODEL\")), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"Default model slug, for example \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"openai/gpt-5.5\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"OPENROUTER_SITE_URL\")), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"Optional site URL sent as \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"HTTP-Referer\"), \" for rankings on openrouter.ai\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"OPENROUTER_SITE_TITLE\")), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"Optional app name sent as \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"X-OpenRouter-Title\"))))), mdx(\"p\", null, \"Model IDs use the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"provider/model\"), \" format, for example \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"openai/gpt-5.5\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"anthropic/claude-opus-4.8\"), \", or \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"google/gemini-3.1-flash-lite\"), \". Browse the full catalog at \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://openrouter.ai/models\"\n  }), \"openrouter.ai/models\"), \".\"), mdx(\"p\", null, \"The examples below use \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"openai/gpt-5.5\"), \", matching the model in the other LLM posts in this series. Override it with \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"OPENROUTER_MODEL\"), \" when you want a different model.\"), mdx(\"h3\", {\n    \"id\": \"openroutersdk\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"h3\"\n  }, \"@openrouter/sdk\")), mdx(\"p\", null, \"OpenRouter's official TypeScript SDK is type-safe and generated from the OpenAPI spec.\"), mdx(\"h4\", {\n    \"id\": \"client-setup\"\n  }, \"Client setup\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"import { OpenRouter } from '@openrouter/sdk';\\n\\nconst client = new OpenRouter({\\n  apiKey: process.env.OPENROUTER_API_KEY,\\n  httpReferer: process.env.OPENROUTER_SITE_URL,\\n  appTitle: process.env.OPENROUTER_SITE_TITLE,\\n});\\n\")), mdx(\"h4\", {\n    \"id\": \"basic-integration\"\n  }, \"Basic integration\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"const response = await client.chat.send({\\n  chatRequest: {\\n    model: process.env.OPENROUTER_MODEL ?? 'openai/gpt-5.5',\\n    messages: [\\n      { role: 'user', content: 'Write a one-sentence bedtime story about a unicorn.' },\\n    ],\\n  },\\n});\\n\\nconsole.log(response.choices[0].message.content);\\n\")), mdx(\"h4\", {\n    \"id\": \"system-prompt\"\n  }, \"System prompt\"), mdx(\"p\", null, \"Add a \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"system\"), \" message before the user turn to set tone, format, and role.\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"const response = await client.chat.send({\\n  chatRequest: {\\n    model: process.env.OPENROUTER_MODEL ?? 'openai/gpt-5.5',\\n    messages: [\\n      { role: 'system', content: 'Reply in one short sentence. Use plain language.' },\\n      { role: 'user', content: 'Explain what an LLM is.' },\\n    ],\\n  },\\n});\\n\\nconsole.log(response.choices[0].message.content);\\n\")), mdx(\"h4\", {\n    \"id\": \"streaming\"\n  }, \"Streaming\"), mdx(\"p\", null, \"Set \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"stream: true\"), \" and read incremental text from \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"choices[0].delta.content\"), \".\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"const stream = await client.chat.send({\\n  chatRequest: {\\n    model: process.env.OPENROUTER_MODEL ?? 'openai/gpt-5.5',\\n    messages: [{ role: 'user', content: 'List three colors.' }],\\n    stream: true,\\n  },\\n});\\n\\nprocess.stdout.write('[stream] ');\\nfor await (const chunk of stream) {\\n  const delta = chunk.choices[0]?.delta?.content;\\n  if (delta) {\\n    process.stdout.write(delta);\\n  }\\n}\\nprocess.stdout.write('\\\\n');\\n\")), mdx(\"h4\", {\n    \"id\": \"model-switching\"\n  }, \"Model switching\"), mdx(\"p\", null, \"Change only the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"model\"), \" string to route the same code to a different provider.\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"const models = ['openai/gpt-5.5', 'google/gemini-3.1-flash-lite'];\\n\\nfor (const model of models) {\\n  const response = await client.chat.send({\\n    chatRequest: {\\n      model,\\n      messages: [{ role: 'user', content: 'Reply with exactly one word: ok.' }],\\n    },\\n  });\\n\\n  console.log(model, '->', response.choices[0].message.content);\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"openai-package\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"h3\"\n  }, \"openai\"), \" package\"), mdx(\"p\", null, \"If you already use the OpenAI SDK, point it at OpenRouter with \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"baseURL\"), \". The request shape matches the \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://sevic.dev/notes/chatgpt-api-nodejs/\"\n  }), \"Chat Completions API\"), \".\"), mdx(\"h4\", {\n    \"id\": \"client-setup-1\"\n  }, \"Client setup\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"import OpenAI from 'openai';\\n\\nconst client = new OpenAI({\\n  apiKey: process.env.OPENROUTER_API_KEY,\\n  baseURL: 'https://openrouter.ai/api/v1',\\n  defaultHeaders: {\\n    'HTTP-Referer': process.env.OPENROUTER_SITE_URL,\\n    'X-OpenRouter-Title': process.env.OPENROUTER_SITE_TITLE,\\n  },\\n});\\n\")), mdx(\"h4\", {\n    \"id\": \"basic-integration-1\"\n  }, \"Basic integration\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"const completion = await client.chat.completions.create({\\n  model: process.env.OPENROUTER_MODEL ?? 'openai/gpt-5.5',\\n  messages: [\\n    { role: 'user', content: 'Write a one-sentence bedtime story about a unicorn.' },\\n  ],\\n});\\n\\nconsole.log(completion.choices[0].message.content);\\n\")), mdx(\"h4\", {\n    \"id\": \"system-prompt-1\"\n  }, \"System prompt\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"const completion = await client.chat.completions.create({\\n  model: process.env.OPENROUTER_MODEL ?? 'openai/gpt-5.5',\\n  messages: [\\n    { role: 'system', content: 'Reply in one short sentence. Use plain language.' },\\n    { role: 'user', content: 'Explain what an LLM is.' },\\n  ],\\n});\\n\\nconsole.log(completion.choices[0].message.content);\\n\")), mdx(\"h4\", {\n    \"id\": \"streaming-1\"\n  }, \"Streaming\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"const stream = await client.chat.completions.create({\\n  model: process.env.OPENROUTER_MODEL ?? 'openai/gpt-5.5',\\n  messages: [{ role: 'user', content: 'List three colors.' }],\\n  stream: true,\\n});\\n\\nprocess.stdout.write('[stream] ');\\nfor await (const chunk of stream) {\\n  const delta = chunk.choices[0]?.delta?.content;\\n  if (delta) {\\n    process.stdout.write(delta);\\n  }\\n}\\nprocess.stdout.write('\\\\n');\\n\")), mdx(\"p\", null, \"For JSON schema output, Markdown-to-HTML, and few-shot prompting, reuse the patterns from the \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://sevic.dev/notes/chatgpt-api-nodejs/\"\n  }), \"Chat Completions post\"), \" with the OpenRouter client and model slug above.\"), mdx(\"h3\", {\n    \"id\": \"vercel-ai-sdk\"\n  }, \"Vercel AI SDK\"), mdx(\"p\", null, \"The \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://www.npmjs.com/package/@openrouter/ai-sdk-provider\"\n  }), mdx(\"inlineCode\", {\n    parentName: \"a\"\n  }, \"@openrouter/ai-sdk-provider\")), \" package exposes OpenRouter models to \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"generateText\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"streamText\"), \", and related helpers from the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"ai\"), \" package. See the \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://openrouter.ai/docs/guides/community/vercel-ai-sdk\"\n  }), \"OpenRouter Vercel AI SDK guide\"), \" for the full integration reference.\"), mdx(\"h4\", {\n    \"id\": \"client-setup-2\"\n  }, \"Client setup\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"import { createOpenRouter } from '@openrouter/ai-sdk-provider';\\n\\nconst openrouter = createOpenRouter({\\n  apiKey: process.env.OPENROUTER_API_KEY,\\n  appUrl: process.env.OPENROUTER_SITE_URL,\\n  appName: process.env.OPENROUTER_SITE_TITLE,\\n});\\n\")), mdx(\"p\", null, \"The returned provider is callable. Pass a model slug directly: \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"openrouter('openai/gpt-5.5')\"), \".\"), mdx(\"h4\", {\n    \"id\": \"basic-integration-2\"\n  }, \"Basic integration\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"import { generateText } from 'ai';\\n\\nconst { text } = await generateText({\\n  model: openrouter(process.env.OPENROUTER_MODEL ?? 'openai/gpt-5.5'),\\n  prompt: 'Write a one-sentence bedtime story about a unicorn.',\\n});\\n\\nconsole.log(text);\\n\")), mdx(\"h4\", {\n    \"id\": \"system-prompt-2\"\n  }, \"System prompt\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"const { text } = await generateText({\\n  model: openrouter(process.env.OPENROUTER_MODEL ?? 'openai/gpt-5.5'),\\n  system: 'Reply in one short sentence. Use plain language.',\\n  prompt: 'Explain what an LLM is.',\\n});\\n\\nconsole.log(text);\\n\")), mdx(\"h4\", {\n    \"id\": \"streaming-2\"\n  }, \"Streaming\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"import { streamText } from 'ai';\\n\\nconst result = streamText({\\n  model: openrouter(process.env.OPENROUTER_MODEL ?? 'openai/gpt-5.5'),\\n  prompt: 'List three colors.',\\n});\\n\\nprocess.stdout.write('[stream] ');\\nfor await (const part of result.textStream) {\\n  process.stdout.write(part);\\n}\\nprocess.stdout.write('\\\\n');\\n\")), mdx(\"p\", null, \"For structured output, embeddings, and web search, see the \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://sevic.dev/notes/llm-integration-vercel-ai-sdk/\"\n  }), \"Vercel AI SDK post\"), \". Those patterns apply when you call OpenAI directly; OpenRouter coverage depends on the model and endpoint.\"), mdx(\"h3\", {\n    \"id\": \"demo\"\n  }, \"Demo\"), mdx(\"p\", null, \"Runnable scripts for each integration path live in the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"openrouter-demo\"), \" folder. Get access via \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://sevic.dev/demos\"\n  }), \"code demos\"), \".\"));\n}\n;\nMDXContent.isMDXComponent = true;"}},"pageContext":{"id":"b5a18031-c7d5-5dab-a24e-7a4e14b3b80c"}},"staticQueryHashes":["1961101537","2542493696"]}