أدلة SDK
Node.js
استخدم حزمة openai الرسمية على npm مع api14 بتغيير baseURL وapiKey فقط، مع أمثلة للمحادثة والبث والأدوات والمخرجات المنظمة والأخطاء.
استخدم حزمة openai الرسمية على npm مع api14. لا يتغير شيء آخر: فقط baseURL وapiKey يشيران إلى api14، ويعمل أي معرّف نموذج في model.
التثبيت
npm install openai
احفظ مفتاحك في متغير بيئة:
export API14_API_KEY="sk-api14-..."
الإعداد
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api14.com/api/v1",
apiKey: process.env.API14_API_KEY,
});
دون خيارات، يقرأ SDK المتغيرين OPENAI_BASE_URL وOPENAI_API_KEY. ضبط هذين المتغيرين ينقل تطبيقًا قائمًا إلى api14 دون تغيير الكود:
export OPENAI_BASE_URL="https://api14.com/api/v1"
export OPENAI_API_KEY="sk-api14-..."
const client = new OpenAI(); // picks up both variables
المحادثة
const result = await client.chat.completions.create({
model: "openai/gpt-5-mini",
messages: [{ role: "user", content: "Explain vector databases in two sentences." }],
});
console.log(result.choices[0].message.content);
البث
const stream = await client.chat.completions.create({
model: "anthropic/claude-sonnet-4.5",
messages: [{ role: "user", content: "Write a haiku about APIs." }],
stream: true,
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
}
راجع البث لمعرفة صيغة الأحداث.
استدعاء الأدوات
أرسل tools، ونفّذ الاستدعاءات التي يطلبها النموذج، وأضف النتائج ثم استدعِ النموذج مجددًا حتى يجيب بنص:
const tools = [{
type: "function",
function: {
name: "get_weather",
description: "Current weather for a city",
parameters: {
type: "object",
properties: { city: { type: "string" } },
required: ["city"],
},
},
}];
const messages = [{ role: "user", content: "What's the weather in Istanbul?" }];
let res = await client.chat.completions.create({ model: "openai/gpt-5-mini", messages, tools });
while (res.choices[0].finish_reason === "tool_calls") {
const msg = res.choices[0].message;
messages.push(msg);
for (const call of msg.tool_calls) {
const args = JSON.parse(call.function.arguments);
const result = await getWeather(args.city); // your function
messages.push({ role: "tool", tool_call_id: call.id, content: JSON.stringify(result) });
}
res = await client.chat.completions.create({ model: "openai/gpt-5-mini", messages, tools });
}
console.log(res.choices[0].message.content);
راجع استدعاء الأدوات.
المخرجات المنظمة
تحوّل الدالة المساعدة parse مخطط Zod إلى صيغة استجابة json_schema وتحلل الرد (npm install zod):
import { z } from "zod";
import { zodResponseFormat } from "openai/helpers/zod";
const Person = z.object({ name: z.string(), born: z.number().int(), city: z.string() });
const res = await client.chat.completions.parse({
model: "openai/gpt-5-mini",
messages: [{ role: "user", content: "Extract: Ada Lovelace, born 1815 in London." }],
response_format: zodResponseFormat(Person, "person"),
});
console.log(res.choices[0].message.parsed); // { name: "Ada Lovelace", born: 1815, city: "London" }
راجع المخرجات المنظمة.
إدخال الصور
مرّر content على شكل مصفوفة أجزاء. استخدم عنوان URL عامًا أو data URL بصيغة base64:
import { readFileSync } from "node:fs";
const image = readFileSync("photo.png").toString("base64");
const res = await client.chat.completions.create({
model: "google/gemini-2.5-flash",
messages: [{
role: "user",
content: [
{ type: "text", text: "What is in this picture?" },
{ type: "image_url", image_url: { url: `data:image/png;base64,${image}` } },
],
}],
});
راجع الرؤية والملفات لملفات PDF والصوت والفيديو.
Embeddings
const result = await client.embeddings.create({
model: "openai/text-embedding-3-small",
input: ["The quick brown fox", "Lorem ipsum"],
});
console.log(result.data.map((d) => d.embedding.length));
نقاط نهاية بلا دالة في SDK
مهام الفيديو وrerank ليست ضمن واجهة OpenAI SDK. استخدم الدالتين العامتين post / get في العميل، فهما تعيدان استخدام Base URL والمفتاح وإعادة المحاولة:
const ranked = await client.post("/rerank", {
body: {
model: "cohere/rerank-v3.5",
query: "What is the capital of France?",
documents: ["Paris is the capital of France.", "Berlin is in Germany."],
top_n: 1,
},
});
console.log(ranked.results);
الأخطاء
تصل الأخطاء بصيغة OpenAI وتُطلق بوصفها OpenAI.APIError. تفرّع بحسب status وcode:
try {
await client.chat.completions.create({ model: "openai/gpt-5-mini", messages: [{ role: "user", content: "Hi" }] });
} catch (err) {
if (err instanceof OpenAI.APIError) {
if (err.status === 402) console.error("Balance too low, add funds:", err.code); // insufficient_balance
else if (err.status === 429) console.error("Retry after", err.headers?.["retry-after"], "s:", err.code); // rate_limited
else throw err;
}
}
راجع الأخطاء لكل الرموز.
المهلات وإعادة المحاولة
يعيد SDK افتراضيًا محاولة أخطاء الاتصال والاستجابات 408 و409 و429 و5xx مرتين، مع تراجع أُسّي يحترم Retry-After. المهلة الافتراضية 10 دقائق لكل محاولة. اضبطهما على العميل، أو تجاوزهما لكل طلب:
const client = new OpenAI({
baseURL: "https://api14.com/api/v1",
apiKey: process.env.API14_API_KEY,
timeout: 60_000, // ms per attempt
maxRetries: 4,
});
await client.chat.completions.create(params, { timeout: 300_000, maxRetries: 0 });
لا تعالج إعادة المحاولة daily_limit_reached أو insufficient_balance. في مهام الدفعات الطويلة توقف عند هذين الرمزين بدل إعادة المحاولة. راجع حدود الطلبات.
كل القدرات
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api14.com/api/v1",
apiKey: process.env.API14_API_KEY,
});
const result = await client.chat.completions.create({
"model": "openai/gpt-5-mini",
"messages": [
{
"role": "user",
"content": "Explain vector databases in two sentences."
}
]
});
console.log(result.choices[0].message.content);