الكود
Vercel AI SDK
أنشئ مزوّد nokeep باستخدام createOpenAICompatible من @ai-sdk/openai-compatible. بعدها تعمل generateText وstreamText والأدوات كما تعمل مع أي نموذج في AI SDK.
تم التحقق في 29 أكتوبر 2026
تثبيت المزوّد وإعداده
npm install ai @ai-sdk/openai-compatible zod
export NOKEEP_API_KEY="sk-nokeep-test" # your own key once it connectsimport { 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
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
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)؛ تدفع مقابل ما كُتب قبل الإيقاف. انظر البث.
استدعاء الأدوات
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 عندما يجب تشغيل أداة. انظر استدعاءات الأدوات.
جهد التفكير
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)
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: كل استدعاء يرد بسطر ثابت واحد ولا يكلّف شيئًا، فيمكنك ربط تطبيقك أولًا. مفتاح الاختبار المجاني.