コンテンツにスキップ

Vercel AI SDK

Vercel AI SDK は @ai-sdk/openai-compatible で ai& に接続します。

Terminal window
npm install ai @ai-sdk/openai-compatible
import { 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 に設定します。

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)”
Terminal window
npm install @ai-sdk/react
app/api/chat/route.ts
import { 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 }),
});
}
app/page.tsx
"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?",
});

推論モデルは 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",
},
},
});