پرش به محتوا
همه مستندات

کد

Vercel AI SDK

یک ارائه‌دهندهٔ nokeep با createOpenAICompatible از @ai-sdk/openai-compatible بساز. بعد generateText، streamText و ابزارها مثل هر مدل AI SDK کار می‌کنند.

بررسی‌شده در ۷ آبان ۱۴۰۵

نصب و راه‌اندازی ارائه‌دهنده

Shell
npm install ai @ai-sdk/openai-compatible zod
export NOKEEP_API_KEY="sk-nokeep-test"  # your own key once it connects
nokeep.js
import { createOpenAICompatible } from "@ai-sdk/openai-compatible"

export const nokeep = createOpenAICompatible({
  name: "nokeep",
  apiKey: process.env.NOKEEP_API_KEY,
  baseURL: "https://nokeep.ai/v1",
  includeUsage: true, // token counts on streamed replies too
})

nokeep("<model id>") یک مدل به تو می‌دهد. شناسه‌ها deepseek-v4.1-flash-uncensored و glm-5.3-flash-uncensored هستند: آن‌ها را در Models مقایسه کن، یا از GET /v1/models بخوان. includeUsage: true شمارش توکن‌ها را برای پاسخ‌های استریم‌شده هم می‌خواهد؛ بدون آن، streamText هیچ شمارشی گزارش نمی‌کند.

generateText

JavaScript
import { generateText } from "ai"
import { nokeep } from "./nokeep.js"

const { text, usage } = await generateText({
  model: nokeep("deepseek-v4.1-flash-uncensored"),
  system: "You are a blunt editor.",
  prompt: "Cut this opening line to ten words: ...",
})
console.log(text)
console.log(usage.inputTokens, usage.outputTokens)

streamText

JavaScript
import { streamText } from "ai"
import { nokeep } from "./nokeep.js"

const result = streamText({
  model: nokeep("deepseek-v4.1-flash-uncensored"),
  prompt: "Tell me a story in three lines.",
})
for await (const text of result.textStream) process.stdout.write(text)

// With includeUsage on, the counts arrive once the stream ends.
console.log(await result.usage)

در یک route handler در Next.js، برای useChat مقدار result.toUIMessageStreamResponse() را برگردان، یا برای متن ساده result.toTextStreamResponse(). پاسخ را با لغو درخواست (abortSignal) متوقف کن؛ برای آنچه تا لحظهٔ توقف نوشته شده هزینه می‌پردازی. بخش Streaming را ببین.

فراخوانی ابزار

JavaScript
import { generateText, stepCountIs, tool } from "ai"
import { z } from "zod"
import { nokeep } from "./nokeep.js"

const { text } = await generateText({
  model: nokeep("deepseek-v4.1-flash-uncensored"),
  tools: {
    weather: tool({
      description: "Get the weather in a city",
      inputSchema: z.object({ city: z.string() }),
      execute: async ({ city }) => ({ city, celsius: 18 }),
    }),
  },
  stopWhen: stepCountIs(5), // let the model call the tool, read the result and answer
  prompt: "What's the weather in Lisbon?",
})
console.log(text)

هر دو مدل ابزار را صدا می‌زنند. glm-5.3-flash-uncensored خودش انتخاب می‌کند: toolChoice: "required" یا نام یک ابزار خطای 400 می‌دهد، پس وقتی ابزار باید اجرا شود از DeepSeek استفاده کن. بخش Tool calls را ببین.

میزان استدلال

JavaScript
import { generateText } from "ai"
import { nokeep } from "./nokeep.js"

const { text, reasoningText } = await generateText({
  model: nokeep("deepseek-v4.1-flash-uncensored"),
  prompt: "Plan a three-act heist story in five bullet points.",
  maxOutputTokens: 4000, // thinking counts toward the limit
  providerOptions: { nokeep: { reasoningEffort: "high" } },
})
console.log(reasoningText) // the thinking, apart from the answer
console.log(text)

کلید زیر providerOptions همان name است که به ارائه‌دهنده داده‌ای. بدون تغییر به‌صورت reasoning_effort فرستاده می‌شود. DeepSeek V4.1 Flash Uncensored بی‌درنگ جواب می‌دهد، مگر اینکه از آن بخواهی فکر کند: مقادیر none، low، high و max را می‌پذیرد. گزینهٔ reasoning: "high" خود AI SDK همان فیلد را می‌فرستد. بخش Thinking را ببین.

تصویرها (DeepSeek)

JavaScript
import { readFile } from "node:fs/promises"
import { generateText } from "ai"
import { nokeep } from "./nokeep.js"

const { text } = await generateText({
  model: nokeep("deepseek-v4.1-flash-uncensored"),
  messages: [{
    role: "user",
    content: [
      { type: "text", text: "What is in this picture?" },
      { type: "file", mediaType: "image/jpeg", data: await readFile("photo.jpg") },
    ],
  }],
})
console.log(text)
  • deepseek-v4.1-flash-uncensored در هر درخواست تا ۱۰ تصویر می‌خواند. glm-5.3-flash-uncensored فقط متن می‌خواند و 400 unsupported_input می‌دهد.
  • AI SDK هر تصویر را داخل درخواست و به‌صورت base64 می‌فرستد. اگر URL را به‌عنوان data بده، ابتدا فایل را دانلود می‌کند. هر درخواست می‌تواند تا ۱۲ مگابایت باشد، پس عکس‌های بزرگ را کوچک کن.
  • تصویرها به‌صورت بخش‌های file با نوع رسانهٔ image/* فرستاده می‌شوند. بخش قدیمی‌تر image هنوز کار می‌کند ولی منسوخ شده است.
  • فایل‌های دیگر، مثل PDF یا صوت، با 400 unsupported_input رد می‌شوند. بخش Pictures را ببین.

نکات و دام‌ها

  • `reasoning_effort` فقط مقادیر خود مدل را می‌پذیرد. deepseek-v4.1-flash-uncensored مقادیر none، low، high و max را می‌گیرد؛ glm-5.3-flash-uncensored مقادیر low و high را. مقادیر minimal، medium و xhigh از برنامه‌های دیگر، در نزدیک‌ترین سطح مدل اجرا می‌شوند (medium به‌صورت high، و xhigh به‌صورت max در جایی که مدل آن را دارد)؛ هر مقدار دیگری 400 invalid_reasoning_effort می‌گیرد. بخش Thinking را ببین.
  • فیلدهایی که مدل نمی‌پذیرد رد نمی‌شوند، حذف می‌شوند. تماس همچنان جواب می‌دهد و هدر پاسخ x-nokeep-ignored نام آنچه حذف شده را می‌گوید. GLM فقط tools، tool_choice و reasoning_effort را نگه می‌دارد، پس temperature و response_format آن حذف می‌شوند. بخش هر مدل کدام فیلدها را می‌پذیرد را ببین.
  • `n` باید ۱ باشد. برای چند پاسخ، چند تماس جدا بفرست.
  • از `@ai-sdk/openai-compatible` استفاده کن، نه `@ai-sdk/openai`. ارائه‌دهندهٔ OpenAI به‌طور پیش‌فرض /v1/responses را صدا می‌زند و nokeep آن را ندارد.

پرسش‌ها

آیا برای AI SDK بستهٔ ارائه‌دهندهٔ nokeep وجود دارد؟

لازم نیست. @ai-sdk/openai-compatible بستهٔ خود AI SDK برای APIهای سازگار با OpenAI است و هر قابلیتی که در این صفحه آمده از طریق آن کار می‌کند.

آیا streamText مصرف را گزارش می‌دهد؟

بله، وقتی ارائه‌دهنده با includeUsage: true ساخته شده باشد. با await result.usage شمارش توکن‌های آن تماس را می‌گیری.

می‌شود بدون پرداخت امتحان کرد؟

بله. از کلید sk-nokeep-test استفاده کن: هر تماس یک خط ثابت برمی‌گرداند و هزینه‌ای ندارد، پس می‌توانی اول برنامه‌ات را وصل کن. کلید آزمایشی رایگان.