Vercel AI SDK
Vercel AI SDK は @ai-sdk/openai-compatible で ai& に接続します。
セットアップ
Section titled “セットアップ”npm install ai @ai-sdk/openai-compatibleimport { createOpenAICompatible } from "@ai-sdk/openai-compatible";
export const aiand = createOpenAICompatible({ name: "aiand", baseURL: "https://api.aiand.com/v1", apiKey: process.env.AIAND_API_KEY, includeUsage: true,});API キーは ai& コンソール で発行し、AIAND_API_KEY に設定します。
テキスト生成
Section titled “テキスト生成”import { generateText } from "ai";import { aiand } from "./client";
const { text } = await generateText({ model: aiand("deepseek-ai/deepseek-v4-flash"), prompt: "Tell me a haiku about Tokyo.",});
console.log(text);システムプロンプトは { role: "system" } メッセージではなく instructions に置きます。
ブラウザにストリーム (Next.js App Router)
Section titled “ブラウザにストリーム (Next.js App Router)”npm install @ai-sdk/reactimport { convertToModelMessages, createUIMessageStreamResponse, streamText, toUIMessageStream, type UIMessage } from "ai";import { aiand } from "@/lib/aiand";
export async function POST(req: Request) { const { messages }: { messages: UIMessage[] } = await req.json(); const result = streamText({ model: aiand("deepseek-ai/deepseek-v4-flash"), messages: await convertToModelMessages(messages), }); return createUIMessageStreamResponse({ stream: toUIMessageStream({ stream: result.stream }), });}"use client";import { useChat } from "@ai-sdk/react";import { useState } from "react";
export default function Page() { const { messages, sendMessage } = useChat(); const [input, setInput] = useState(""); return ( <form onSubmit={(e) => { e.preventDefault(); sendMessage({ text: input }); setInput(""); }} > {messages.map((m) => ( <div key={m.id}> {m.role}:{" "} {m.parts.map((part, i) => (part.type === "text" ? <span key={i}>{part.text}</span> : null))} </div> ))} <input value={input} onChange={(e) => setInput(e.target.value)} /> </form> );}import { generateText, tool } from "ai";import { z } from "zod";import { aiand } from "./client";
const result = await generateText({ model: aiand("deepseek-ai/deepseek-v4-flash"), tools: { getWeather: tool({ description: "Get current weather", inputSchema: z.object({ city: z.string() }), execute: async ({ city }) => `Sunny in ${city}, 22°C`, }), }, prompt: "What's the weather in Tokyo?",});推論 (reasoning)
Section titled “推論 (reasoning)”推論モデルは providerOptions でレベルを受け取ります。モデルごとの対応レベルは モデルカタログ の reasoning_efforts にあります。
const { text } = await generateText({ model: aiand("moonshotai/kimi-k3"), prompt: "Solve this step by step: What is 15 * 23?", providerOptions: { aiand: { reasoningEffort: "high", }, },});