انتقل إلى المحتوى
كل التوثيق

الكود

Vercel AI SDK

أنشئ مزوّد nokeep باستخدام createOpenAICompatible من @ai-sdk/openai-compatible. بعدها تعمل generateText وstreamText والأدوات كما تعمل مع أي نموذج في AI SDK.

تم التحقق في 29 أكتوبر 2026

تثبيت المزوّد وإعداده

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: قارن بينهما في النماذج، أو اقرأهما من 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، أعد result.toUIMessageStreamResponse() لـuseChat، أو result.toTextStreamResponse() للنص العادي. لإيقاف الرد، ألغِ الطلب (abortSignal)؛ تدفع مقابل ما كُتب قبل الإيقاف. انظر البث.

استدعاء الأدوات

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 عندما يجب تشغيل أداة. انظر استدعاءات الأدوات.

جهد التفكير

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. خيار AI SDK نفسه reasoning: "high" يرسل الحقل ذاته. انظر التفكير.

الصور (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 حتى 10 صور في كل طلب. يقرأ glm-5.3-flash-uncensored النص فقط ويرد بـ400 unsupported_input.
  • يرسل AI SDK كل صورة داخل الطلب بترميز base64. إذا مررت URL كقيمة data فإنه ينزّل الملف أولًا. يتسع الطلب حتى 12 ميغابايت، لذا صغّر الصور الكبيرة.
  • الصور أجزاء من نوع file بنوع وسائط image/*. جزء image القديم ما زال يعمل لكنه مهجور.
  • الملفات الأخرى، مثل PDF أو الصوت، تُرفض بـ400 unsupported_input. انظر الصور.

ملاحظات مهمة

  • `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. انظر التفكير.
  • الحقول التي لا يقبلها النموذج تُحذف ولا تُرفض. يبقى الاستدعاء قائمًا، وترويسة الرد x-nokeep-ignored تذكر ما حُذف. يحتفظ GLM بـtools وtool_choice وreasoning_effort فقط، لذلك تُحذف temperature وresponse_format منه. انظر الحقول التي يقبلها كل نموذج.
  • يجب أن يكون `n` مساويًا لـ1. لطلب عدة ردود، أرسل عدة استدعاءات.
  • استخدم `@ai-sdk/openai-compatible`، لا `@ai-sdk/openai`. مزوّد OpenAI يستدعي /v1/responses افتراضيًا، وnokeep لا يملك هذا المسار.

أسئلة

هل توجد حزمة مزوّد لـnokeep في AI SDK؟

لا تحتاجها. @ai-sdk/openai-compatible هي حزمة AI SDK الرسمية لواجهات OpenAI المتوافقة، وكل ميزة في هذه الصفحة تعمل من خلالها.

هل يُبلّغ streamText عن الاستخدام؟

نعم، عندما يُنشأ المزوّد بـincludeUsage: true. بعدها يعطيك await result.usage عدد الرموز لذلك الاستدعاء.

هل أستطيع التجربة دون دفع؟

نعم. استخدم المفتاح sk-nokeep-test: كل استدعاء يرد بسطر ثابت واحد ولا يكلّف شيئًا، فيمكنك ربط تطبيقك أولًا. مفتاح الاختبار المجاني.