Vercel AI SDK با پیکو هوش؛ streamText و generateText
با بستهی @ai-sdk/openai-compatible مدلهای پیکو هوش را در Vercel AI SDK و Next.js استفاده کنید؛ generateText، streamText، ابزار و Route Handler.
پیکو هوش·انتشار: ·بهروزرسانی: ·۶ دقیقه مطالعه
خلاصه: Vercel AI SDK کتابخانهی TypeScript برای ساخت اپهای هوش مصنوعی است. برای APIهای سازگار با OpenAI، بستهی @ai-sdk/openai-compatible تابع createOpenAICompatible را میدهد که با baseURL و apiKey به پیکو هوش وصل میشود. سپس همان generateText، streamText و ابزارها را استفاده میکنید. API این SDK بین نسخههای اصلی تغییر کرده است؛ نمونهها برای نسخهی ۵ (ai@5) نوشته شدهاند و تفاوت نسخهی ۴ و نسخههای جدیدتر کنار هر قطعه ذکر شده است؛ مستندات رسمی در ai-sdk.dev است.
نصب
npm install ai @ai-sdk/openai-compatible @ai-sdk/react zod
استفاده: pico('gpt-6-sol') یا pico.chatModel('claude-sonnet-5-5'). شناسهها از کاتالوگ میآیند. کلید را فقط سمت سرور نگه دارید و در کلاینت (مرورگر) هرگز قرار ندهید.
generateText
import { generateText } from 'ai';
import { pico } from './lib/pico';
const { text, usage } = await generateText({
model: pico('gpt-6-sol'),
system: 'پاسخها کوتاه و فارسی باشند.',
prompt: 'تفاوت SSR و SSG را توضیح بده.',
maxOutputTokens: 400, // در نسخهی ۴ نام آن maxTokens است
});
console.log(text, usage);
Claude Code را با متغیرهای ANTHROPIC_BASE_URL و کلید پیکو هوش روی اندپوینت سازگار با Anthropic (/v1/messages) اجرا کنید؛ مرحلهبهمرحله و با عیبیابی.
·
خبرنامه
آموزشها و تغییرات جدید را بهموقع بگیرید
فقط مطالب مفید دربارهی API هوش مصنوعی؛ بدون هرزنامه.
streamText
import { streamText } from 'ai';
const result = streamText({
model: pico('claude-haiku-5-5'),
prompt: 'پنج نکته دربارهی امنیت API بنویس.',
});
for await (const chunk of result.textStream) {
process.stdout.write(chunk);
}
Route Handler در Next.js (App Router)
// app/api/chat/route.ts
import { streamText, convertToModelMessages, type UIMessage } from 'ai';
import { pico } from '@/lib/pico';
export const maxDuration = 60;
export async function POST(req: Request) {
const { messages }: { messages: UIMessage[] } = await req.json();
const result = streamText({
model: pico('claude-sonnet-5-5'),
system: 'تو دستیار فنی مودب هستی.',
messages: convertToModelMessages(messages), // نسخهی ۵ (در نسخهی ۶ ممکن است async باشد؛ با await هم بیضرر است)
});
return result.toUIMessageStreamResponse(); // نسخهی ۴: toDataStreamResponse() و messages بدون تبدیل
}
در کلاینت میتوانید از هوک useChat در بستهی @ai-sdk/react استفاده کنید. نام متدهای پاسخ و هوک بین نسخهها متفاوت است (مستند مهاجرت v5: toDataStreamResponse به toUIMessageStreamResponse و CoreMessage به ModelMessage تغییر کرد)؛ نسخهی نصبشده را بررسی کنید.
ابزار (Tool)
import { generateText, tool, stepCountIs } from 'ai';
import { z } from 'zod';
const { text } = await generateText({
model: pico('gpt-6-sol'),
tools: {
celsiusToF: tool({
description: 'تبدیل سانتیگراد به فارنهایت',
inputSchema: z.object({ c: z.number() }), // نسخهی ۴: parameters
execute: async ({ c }) => c * 9 / 5 + 32,
}),
},
stopWhen: stepCountIs(3), // نسخهی ۴: maxSteps: 3 ؛ در مستندات جدیدتر نام این تابع isStepCount ثبت شده
prompt: 'سی درجهی سانتیگراد چند فارنهایت است؟',
});
اجرای ابزار بر پایهی function calling مدل است؛ اصول پروتکل در راهنمای Function Calling آمده است. پشتیبانی هر مدل از ابزار را آزمایش کنید.
نکات تولید
سقف خروجی را همیشه تنظیم کنید.
خطاها:APICallError شامل statusCode و در صورت وجود responseHeaders است؛ برای 429 و 503 از maxRetries (پیشفرض ۲) و تأخیر استفاده کنید. جزئیات: کدهای خطا و Retry.
Edge: Route Handler روی Edge هم کار میکند، اما برای پاسخ طولانی maxDuration را تنظیم کنید.
احراز هویت و نرخ: مسیر /api/chat عمومی هزینهی شما را میسوزاند؛ محدودیت نرخ و ورود کاربر بگذارید.
تابع embed و embedMany در SDK برای مدلهای embedding است. پیکو هوش اندپوینت embeddings ندارد، پس این توابع را به آن وصل نکنید.
عیبیابی
علامت
علت
راهحل
401
PICO_API_KEY تعریف نشده
.env.local و ریاستارت dev
404
baseURL بدون /v1
اصلاح
خطای تایپ maxOutputTokens
نسخهی SDK
maxTokens یا بالعکس
استریم یکجا میآید
بافر در Nginx/Cloudflare
بافر را خاموش کنید
ابزار اجرا نمیشود
مدل از tools ضعیف است
مدل دیگر
429
درخواست زیاد
retry با backoff
خروجی ساختیافته با generateObject
برای دریافت خروجی با schema مشخص:
import { generateObject } from 'ai';
import { z } from 'zod';
const { object } = await generateObject({
model: pico('gpt-6-sol'),
schema: z.object({
title: z.string(),
tags: z.array(z.string()).max(5),
}),
prompt: 'برای مقالهای دربارهی کش HTTP عنوان و برچسب پیشنهاد بده.',
});
console.log(object);
در مستندات جدید، روش پیشنهادی generateText با output: Output.object({ schema }) (import از ai) و خواندن output از نتیجه است؛ generateObject در نسخههای ۴ و ۵ وجود دارد، اما برای نسخهی جدید مستندات خود را ببینید. پشتیبانی از حالت JSON/ابزار در openai-compatible ممکن است نیاز به گزینهی supportsStructuredOutputs داشته باشد؛ در صورت خطا، آن را تنظیم یا مدل دیگری امتحان کنید.
این قطعه برای نسخهی ۵ است: در v5 مقادیر input، handleInputChange و handleSubmit حذف شدهاند، state ورودی را خودتان نگه میدارید، sendMessage جایگزین append شده و محتوای پیام در message.parts است. در نسخهی ۴ همان input/handleSubmit/m.content درست است.
امنیت مسیر چت
مسیر /api/chat را بدون محدودیت منتشر نکنید. حداقل: احراز هویت کاربر، محدودیت نرخ بر اساس کاربر یا IP، سقف طول پیام و سقف maxOutputTokens. این کنترلها جلوی مصرف ناخواستهی موجودی شما را میگیرند. همچنین تعداد پیامهای تاریخچه را در سرور کوتاه کنید تا هزینهی هر درخواست از کنترل خارج نشود.
سوالات متداول
آیا بستهی @ai-sdk/openai هم کار میکند؟
بله، با createOpenAI({ baseURL, apiKey }). اما openai-compatible برای سرویسهای غیر رسمی سازگارتر است.