OpenRouter 集成与实践

OpenRouter 集成与实践

Vercel AI SDK

3 分钟阅读

Vercel AI SDK

将 OpenRouter 与 Vercel AI SDK 配合使用

Vercel AI SDK

你可以使用 Vercel AI SDK 将 OpenRouter 集成到 Next.js 应用中。首先安装 @openrouter/ai-sdk-provider

npm install @openrouter/ai-sdk-provider

然后你可以使用 streamText() API 从 OpenRouter 流式输出文本。

import { createOpenRouter } from '@openrouter/ai-sdk-provider';
import { streamText } from 'ai';
import { z } from 'zod';

export const getLasagnaRecipe = async (modelName: string) => {
  const openrouter = createOpenRouter({
    apiKey: '<OPENROUTER_API_KEY>',
  });

  const response = streamText({
    model: openrouter(modelName),
    prompt: '写一份供 4 人食用的素食千层面食谱。',
  });

  await response.consumeStream();
  return response.text;
};

export const getWeather = async (modelName: string) => {
  const openrouter = createOpenRouter({
    apiKey: '<OPENROUTER_API_KEY>',
  });

  const response = streamText({
    model: openrouter(modelName),
    prompt: '旧金山(San Francisco, CA)现在是华氏多少度?',
    tools: {
      getCurrentWeather: {
        description: '获取给定地点的当前天气',
        parameters: z.object({
          location: z
            .string()
            .describe('城市和州,例如 San Francisco, CA'),
          unit: z.enum(['celsius', 'fahrenheit']).optional(),
        }),
        execute: async ({ location, unit = 'celsius' }) => {
          // 天气的模拟响应
          const weatherData = {
            'Boston, MA': {
              celsius: '15°C',
              fahrenheit: '59°F',
            },
            'San Francisco, CA': {
              celsius: '18°C',
              fahrenheit: '64°F',
            },
          };

          const weather = weatherData[location];
          if (!weather) {
            return `${location} 的天气数据不可用。`;
          }

          return `${location} 当前天气为 ${weather[unit]}。`;
        },
      },
    },
  });

  await response.consumeStream();
  return response.text;
};

视频生成

OpenRouter 通过 AI SDK 的 experimental_generateVideo API 支持视频生成。该 SDK 提供程序会自动处理异步的提交-轮询-下载工作流。

import { createOpenRouter } from '@openrouter/ai-sdk-provider';
import { experimental_generateVideo as generateVideo } from 'ai';

const openrouter = createOpenRouter({
  apiKey: '<OPENROUTER_API_KEY>',
});

const { video } = await generateVideo({
  model: openrouter.videoModel('google/veo-3.1'),
  prompt: '一只金毛寻回犬在阳光明媚的海滩上玩抛接游戏,背景是拍岸的海浪',
  aspectRatio: '16:9',
  duration: 4,
});

console.log(video.mediaType); // 'video/mp4'
console.log(video.uint8Array.byteLength); // 视频大小(字节)

透传选项

每个视频模型都支持可通过 extraBody 中的 provider.options、按提供商 slug 作为键透传的模型特定参数。每个模型的完整 allowed_passthrough_parameters 列表见视频生成文档

import { createOpenRouter } from '@openrouter/ai-sdk-provider';
import { experimental_generateVideo as generateVideo } from 'ai';

const openrouter = createOpenRouter({
  apiKey: '<OPENROUTER_API_KEY>',
});

const { video } = await generateVideo({
  model: openrouter.videoModel('google/veo-3.1', {
    generateAudio: true,
    extraBody: {
      provider: {
        options: {
          'google-vertex': {
            parameters: {
              personGeneration: 'allow_all',
              enhancePrompt: true,
            },
          },
        },
      },
    },
  }),
  prompt: '阳光花园中一朵花绽放的延时摄影',
  aspectRatio: '16:9',
});

视频模型设置

设置类型默认值说明
generateAudiobooleanfalse是否在生成视频的同时生成音频
pollIntervalMsnumber2000等待生成时的轮询间隔(毫秒)
maxPollTimeMsnumber600000超时前的最长等待时间(毫秒)
extraBodyobject合并到该模型每次请求中的默认 body 参数

图生视频

你可以传入参考图像来引导视频生成:

import { createOpenRouter } from '@openrouter/ai-sdk-provider';
import { experimental_generateVideo as generateVideo } from 'ai';

const openrouter = createOpenRouter({
  apiKey: '<OPENROUTER_API_KEY>',
});

const { video } = await generateVideo({
  model: openrouter.videoModel('alibaba/wan-2.7'),
  prompt: '一个角色穿过森林',
  image: new URL('https://example.com/first-frame.png'),
  resolution: '1920x1080',
});

提供商元数据

响应包含可通过 providerMetadata 访问的 OpenRouter 特定元数据:

import { createOpenRouter } from '@openrouter/ai-sdk-provider';
import { experimental_generateVideo as generateVideo } from 'ai';

const openrouter = createOpenRouter({
  apiKey: '<OPENROUTER_API_KEY>',
});

const result = await generateVideo({
  model: openrouter.videoModel('google/veo-3.1'),
  prompt: '日出时分,镜头缓缓横移过平静的高山湖泊',
  aspectRatio: '16:9',
});

console.log(result.providerMetadata?.openrouter);
// { generationId: 'gen-...', cost: 0.25 }

支持的模型、分辨率、宽高比以及提供商特定选项的完整列表,见视频生成文档