Ir al contenido
Toda la documentación

Código

Vercel AI SDK

Crea un proveedor de nokeep con createOpenAICompatible de @ai-sdk/openai-compatible. Después, generateText, streamText y las herramientas funcionan igual que con cualquier modelo del AI SDK.

Revisado el 29 de octubre de 2026

Instala y configura el proveedor

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>") te da un modelo. Los IDs son deepseek-v4.1-flash-uncensored y glm-5.3-flash-uncensored: compáralos en Modelos o léelos desde GET /v1/models. includeUsage: true pide conteos de tokens en las respuestas transmitidas; sin él, streamText no informa ninguno.

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)

En un route handler de Next.js, devuelve result.toUIMessageStreamResponse() para useChat, o result.toTextStreamResponse() para texto plano. Para detener una respuesta, cancela la solicitud (abortSignal); pagas por lo que se escribió antes de detenerte. Consulta Streaming.

Llamadas a herramientas

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)

Ambos modelos llaman herramientas. glm-5.3-flash-uncensored elige por su cuenta: toolChoice: "required" o una herramienta con nombre devuelve un 400, así que usa DeepSeek cuando una herramienta deba ejecutarse. Consulta Llamadas a herramientas.

Esfuerzo de razonamiento

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)

La clave dentro de providerOptions es el name que le diste al proveedor. Se envía como reasoning_effort, sin cambios. DeepSeek V4.1 Flash Uncensored responde de inmediato salvo que le pidas que piense: acepta none, low, high, max. La opción reasoning: "high" propia del AI SDK envía el mismo campo. Consulta Razonamiento.

Imágenes (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 lee hasta 10 imágenes por solicitud. glm-5.3-flash-uncensored solo lee texto y responde 400 unsupported_input.
  • El AI SDK envía cada imagen dentro de la solicitud, en base64. Si pasas una URL como data, primero descarga el archivo. Una solicitud puede pesar hasta 12 MB, así que reduce las fotos grandes.
  • Las imágenes son partes file con un tipo de medio image/*. La parte image antigua sigue funcionando, pero está obsoleta.
  • Otros archivos, como PDF o audio, se rechazan con 400 unsupported_input. Consulta Imágenes.

Errores frecuentes

  • `reasoning_effort` solo acepta los valores del propio modelo. deepseek-v4.1-flash-uncensored acepta none, low, high, max; glm-5.3-flash-uncensored acepta low, high. Los minimal, medium y xhigh de otras apps se ejecutan en el nivel más cercano del modelo (medium como high, xhigh como max donde el modelo lo tenga); cualquier otro valor recibe 400 invalid_reasoning_effort. Consulta Razonamiento.
  • Los campos que un modelo no admite se descartan, no se rechazan. La llamada igual responde, y el encabezado de respuesta x-nokeep-ignored nombra lo que se dejó fuera. GLM solo conserva tools, tool_choice y reasoning_effort, así que su temperature y su response_format se descartan. Consulta qué campos acepta cada modelo.
  • `n` debe ser 1. Para pedir varias respuestas, haz varias llamadas.
  • Usa `@ai-sdk/openai-compatible`, no `@ai-sdk/openai`. El proveedor de OpenAI llama a /v1/responses por defecto, y nokeep no tiene esa ruta.

Preguntas

¿Existe un paquete de proveedor de nokeep para el AI SDK?

No hace falta. @ai-sdk/openai-compatible es el paquete del propio AI SDK para APIs compatibles con OpenAI, y cada función de esta página funciona con él.

¿streamText informa el uso?

Sí, cuando el proveedor se crea con includeUsage: true. Entonces await result.usage da los conteos de tokens de la llamada.

¿Puedo probarlo sin pagar?

Sí. Usa la clave sk-nokeep-test: cada llamada responde con una línea fija y no cuesta nada, así que puedes conectar tu app primero. La clave de prueba gratuita.