กลับไปที่บล็อก

API และ SDKคู่มือ

Vercel AI SDK กับ base URL แบบกำหนดเอง: CheapTokens ใน TypeScript

ชี้ Vercel AI SDK ไปที่ CheapTokens ด้วย createOpenAICompatible: ตัวอย่าง generateText และ streamText ที่ใช้งานได้, การใช้โทเค็น และวิธีแก้ข้อผิดพลาดทั่วไป

โดย CheapTokens Teamเผยแพร่เมื่อ ใช้เวลาอ่าน 5 นาที

โค้ด Vercel AI SDK กับ createOpenAICompatible และ base URL ของ CheapTokens
ในหน้านี้
  1. ติดตั้งและสร้าง provider
  2. generateText: คำตอบเดียวและจำนวนโทเค็น
  3. streamText: พิมพ์คำขณะที่มาถึง
  4. สลับโมเดลโดยไม่แตะส่วนที่เหลือ
  5. หากใช้งานไม่ได้

ในการรัน Vercel AI SDK บน CheapTokens ให้ติดตั้ง @ai-sdk/openai-compatible สร้าง provider ด้วย baseURL: 'https://api.cheaptokens.dev/v1' และคีย์ของคุณ แล้วส่ง provider('deepseek-ai/DeepSeek-V4-Flash-0731') เป็น model ส่วนอื่น ๆ ในแอปของคุณ ทั้ง generateText, streamText และพรอมป์ของคุณ ยังคงเหมือนเดิม

ดังนั้นหากคุณมี Next.js route หรือสคริปต์ Node ที่คุยกับโมเดลแบบ hosted ผ่าน AI SDK อยู่แล้ว คุณต้องเปลี่ยนสามอย่าง: base URL, คีย์ และ model id คู่มือนี้ตรวจสอบการตั้งค่ากับ หน้าผู้ให้บริการที่รองรับ OpenAI ของ AI SDK (29 ตุลาคม 2026) โดยใช้ส่วนติดต่อ Chat Completions ของ CheapTokens API ซึ่งเป็นสิ่งที่ provider นั้นใช้สื่อสาร

ติดตั้งและสร้าง provider#

สองแพ็กเกจ: แพ็กเกจหลัก ai และ provider ที่รองรับ OpenAI

bash
npm install ai @ai-sdk/openai-compatible
export CHEAPTOKENS_API_KEY=ct_your_key_here

ลำดับงานสั้น ๆ:

เรียงลำดับ

จัดลำดับการตั้งค่า

  1. เติมยอดคงเหลือและสร้าง API key
  2. ใส่คีย์ใน environment variable
  3. สร้าง provider ด้วย baseURL ของ CheapTokens
  4. ส่ง model id แบบเต็มให้ generateText

ตัว provider เองคือการเรียก createOpenAICompatible หนึ่งครั้ง:

typescript
import { createOpenAICompatible } from '@ai-sdk/openai-compatible';

export const cheaptokens = createOpenAICompatible({
  name: 'cheaptokens',
  apiKey: process.env.CHEAPTOKENS_API_KEY,
  baseURL: 'https://api.cheaptokens.dev/v1',
  includeUsage: true,
});

name เป็นเพียงป้ายกำกับสำหรับ log ของคุณเอง includeUsage: true ขอจำนวนโทเค็นใน streaming response ด้วย; หากไม่มี ค่าเริ่มต้นจะทำงานเหมือน false การเรียก cheaptokens('model-id') จะได้ chat model; cheaptokens.chatModel('model-id') และ cheaptokens.languageModel('model-id') ทำสิ่งเดียวกัน

เส้นทางของคำขอ: แอปของคุณ, createOpenAICompatible, CheapTokens API
โค้ดของคุณยังคงเรียก AI SDK; มีเพียง provider ข้างใต้ที่เปลี่ยน

model id ต้องเป็นแบบเต็ม: deepseek-ai/DeepSeek-V4-Flash-0731 ชื่อสั้นอย่าง deepseek-v4-flash-0731 คือสิ่งที่คุณเห็นในตารางราคา และ API จะไม่ยอมรับ หากคุณไม่แน่ใจว่าจะพิมพ์อะไร ให้ แสดงรายการโมเดลด้วย GET /v1/models แล้วคัดลอก id จากที่นั่น

generateText: คำตอบเดียวและจำนวนโทเค็น#

นี่คือสคริปต์ที่สมบูรณ์ มันขอคำตอบสั้น ๆ และพิมพ์ทั้งข้อความและออบเจกต์ usage

typescript
import { generateText } from 'ai';
import { cheaptokens } from './provider';

const result = await generateText({
  model: cheaptokens('deepseek-ai/DeepSeek-V4-Flash-0731'),
  prompt: 'Explain in two sentences what a base URL is.',
});

console.log(result.text);
console.log(result.usage);

รันด้วย npx tsx index.ts คุณจะได้คำตอบเป็นสตริงใน result.text และ result.usage เก็บจำนวนโทเค็นอินพุตและเอาต์พุตสำหรับการเรียกนั้น เราพิมพ์ออบเจกต์ทั้งหมดเพื่อให้คุณเห็นทุกอย่างในนั้น ใน เอกสารอ้างอิง AI SDK สำหรับ streamText (ตรวจสอบเมื่อ 29 ตุลาคม 2026) usage มี inputTokens, outputTokens และ totalTokens; ตรวจสอบชนิดข้อมูลของเวอร์ชันที่คุณติดตั้งก่อนนำไปต่อกับแดชบอร์ด

ทำไมต้องอ่าน usage เลย? เพราะนั่นคือตัวเลขที่คุณจ่าย สมมติว่าแอปของคุณส่งพรอมป์ 1,500 โทเค็นและได้คำตอบ 600 โทเค็น คำขอนั้นมีค่าใช้จ่าย $0.000083 ตามราคาปัจจุบัน และหนึ่งพันคำขอมีลักษณะเช่นนี้:

โมเดล ต่อคำขอ 1,000 คำขอ OpenRouter, 1,000 คำขอ
GLM-5.3-Flash $0.000054 $0.054 $0.107
DeepSeek-V4-Flash $0.000083 $0.0825 $0.165
MiniMax-M2.7 $0.00017 $0.165 $1.17

1,500 โทเค็นอินพุตและ 600 โทเค็นเอาต์พุตต่อคำขอ ราคาต่อ 1M โทเค็นเป็นราคาปัจจุบันและเปลี่ยนแปลงไปพร้อมกับอัตราค่าบริการของเรา คอลัมน์ OpenRouter แสดงราคาอ้างอิงสำหรับปริมาณงานเดียวกัน

คอลัมน์ CheapTokens เป็นยอดรวม ทั้งอินพุตและเอาต์พุต รวมกัน ถูกกว่า OpenRouter สำหรับทุกโมเดลในตาราง หากคุณต้องการเปลี่ยน usage เป็นงบประมาณที่หมุนเวียน การติดตามต้นทุนโทเค็นของเอเจนต์ แสดงแนวคิดใน Python; การคำนวณเหมือนกันใน TypeScript

streamText: พิมพ์คำขณะที่มาถึง#

สำหรับ UI แชท คุณต้องการให้ข้อความปรากฏขณะที่โมเดลยังเขียนอยู่ streamText ให้ async iterable ของชิ้นข้อความ

typescript
import { streamText } from 'ai';
import { cheaptokens } from './provider';

const result = streamText({
  model: cheaptokens('deepseek-ai/DeepSeek-V4-Flash-0731'),
  prompt: 'Write a 100-word product description for a pocket notebook.',
});

for await (const chunk of result.textStream) {
  process.stdout.write(chunk);
}

console.log('\n', await result.usage);

สังเกตว่าไม่มี await นำหน้า streamText(...): มันคืนค่าทันทีและคุณบริโภคสตรีม usage เป็น promise ที่จะ settle เมื่อสตรีมสิ้นสุด ดังนั้นคุณ await หลังจากลูป ใน route handler ของ Next.js คุณจะส่งสตรีมกลับไปยังเบราว์เซอร์แทนการเขียนไปยัง stdout; ส่วน provider เหมือนกันทุกประการ หากคุณต้องการสิ่งเดียวกันด้วย OpenAI SDK ธรรมดา ดู การสตรีมคำตอบแชทใน Node.js

คำตอบยาว ๆ ก็ใช้ได้ที่นี่: DeepSeek-V4-Flash บน CheapTokens เขียนได้สูงสุด 32,768 โทเค็นในคำตอบเดียว มีหน้าต่างบริบท 380K และราคาเดียวทุกชั่วโมง หน้าโมเดลอยู่ที่ /en/cheap-deepseek/ และราคาปัจจุบันอยู่บน หน้าราคา

สลับโมเดลโดยไม่แตะส่วนที่เหลือ#

เนื่องจากมีเพียง model id ที่เปลี่ยน การลองโมเดลอื่นจึงเป็นการแก้ไขหนึ่งบรรทัด GLM-5.3-Flash มีหน้าต่างบริบท 390K และตอบได้สูงสุด 8,192 โทเค็น; ตามราคาปัจจุบันมีค่าใช้จ่าย $0.02 ต่อ 1M โทเค็นอินพุต และ $0.04 ต่อ 1M โทเค็นเอาต์พุต

ลองด้วยตัวเองลองดู: คุณเปลี่ยนบรรทัดใดเพื่อรันสคริปต์เดียวกันบน GLM-5.3-Flash?แสดงคำตอบ

เฉพาะ model id: cheaptokens('zai-org/GLM-5.3-Flash') provider, คีย์, baseURL และส่วนที่เหลือของสคริปต์ยังคงเหมือนเดิม

รูปแบบที่มีประโยชน์คือเก็บ id ไว้ใน environment variable (process.env.MODEL_ID) เพื่อให้คุณเปรียบเทียบสองโมเดลบนพรอมป์เดียวกันได้โดยไม่ต้อง rebuild การเปรียบเทียบ DeepSeek vs GLM vs MiniMax ช่วยเลือกว่าตัวไหนน่าลอง

หากใช้งานไม่ได้#

ความล้มเหลวส่วนใหญ่เป็นหนึ่งในสามอย่าง: คีย์, URL หรือ model id

  • 401 หมายถึงคีย์หายหรือผิด ตรวจสอบว่า CHEAPTOKENS_API_KEY ถูกตั้งค่าในเชลล์ที่รันสคริปต์ (เซิร์ฟเวอร์ Next.js ต้องการใน .env.local และรีสตาร์ท)
  • 404 มักหมายถึง baseURL สูญเสีย /v1 หรือ model id เป็นชื่อสั้น ใช้ https://api.cheaptokens.dev/v1 และ id แบบเต็ม
  • คำตอบหยุดกลางประโยค โมเดลชนขีดจำกัดเอาต์พุต; วิธีแก้ finish_reason "length" อธิบายไว้

คำอธิบายที่ยาวกว่าของสองข้อแรกอยู่ใน API 401 หรือ 404: คีย์, base URL หรือ model id ผิด

เช็กลิสต์

ก่อนรันสคริปต์

สำหรับการเชื่อมต่อเครื่องมืออื่นและการส่งคำขอแรกด้วยมือ เริ่มจาก เอกสาร CheapTokens