نستخدم ملفات تعريف الارتباط. تُبقيك ملفات تعريف الارتباط وتخزين المتصفح مسجّلًا للدخول وتتذكر تفضيلاتك. وبإذنك نقيس أيضًا كيفية استخدام الموقع. يمكنك في أي وقت. راجع سياسة ملفات تعريف الارتباط.

Python

أدلة SDK

Python

استخدم حزمة openai الرسمية لـ Python مع api14 بضبط base_url وapi_key، مع أمثلة للعميل المتزامن وغير المتزامن والبث والأدوات والأخطاء.

استخدم حزمة openai الرسمية لـ Python مع api14. اضبط base_url وapi_key، واستخدم أي معرّف نموذج (مثل openai/gpt-5-mini) في model.

التثبيت

pip install openai
export API14_API_KEY="sk-api14-..."

الإعداد

from openai import OpenAI
import os

client = OpenAI(
    base_url="https://api14.com/api/v1",
    api_key=os.environ["API14_API_KEY"],
)

يتوفر أيضًا عميل غير متزامن: from openai import AsyncOpenAI يقبل الوسائط نفسها. استخدمه عند تشغيل طلبات كثيرة في وقت واحد، كما في خادم ويب أو مهمة دفعية:

import asyncio
from openai import AsyncOpenAI

aclient = AsyncOpenAI(base_url="https://api14.com/api/v1", api_key=os.environ["API14_API_KEY"])

async def ask(q):
    r = await aclient.chat.completions.create(model="openai/gpt-5-mini", messages=[{"role": "user", "content": q}])
    return r.choices[0].message.content

async def main():
    return await asyncio.gather(*(ask(q) for q in ["What is RAG?", "What is a token?"]))

answers = asyncio.run(main())

أبقِ التزامن أقل من حد الطلبات في الدقيقة لخطتك. راجع دليل: المعالجة الدفعية.

دون وسائط، يقرأ OpenAI() المتغيرين OPENAI_BASE_URL وOPENAI_API_KEY، فيمكنك توجيه تطبيق قائم إلى api14 من البيئة وحدها:

export OPENAI_BASE_URL="https://api14.com/api/v1"
export OPENAI_API_KEY="sk-api14-..."

المحادثة

result = client.chat.completions.create(
    model="openai/gpt-5-mini",
    messages=[{"role": "user", "content": "Explain vector databases in two sentences."}],
)
print(result.choices[0].message.content)

البث

stream = client.chat.completions.create(
    model="anthropic/claude-sonnet-4.5",
    messages=[{"role": "user", "content": "Write a haiku about APIs."}],
    stream=True,
)
for chunk in stream:
    if chunk.choices:
        print(chunk.choices[0].delta.content or "", end="")

راجع البث.

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

import json

tools = [{
    "type": "function",
    "function": {
        "name": "get_weather",
        "description": "Current weather for a city",
        "parameters": {
            "type": "object",
            "properties": {"city": {"type": "string"}},
            "required": ["city"],
        },
    },
}]
messages = [{"role": "user", "content": "What's the weather in Istanbul?"}]

while True:
    res = client.chat.completions.create(model="openai/gpt-5-mini", messages=messages, tools=tools)
    msg = res.choices[0].message
    if not msg.tool_calls:
        break
    messages.append(msg)
    for call in msg.tool_calls:
        args = json.loads(call.function.arguments)
        result = get_weather(**args)  # your function
        messages.append({"role": "tool", "tool_call_id": call.id, "content": json.dumps(result)})

print(msg.content)

راجع استدعاء الأدوات.

المخرجات المنظمة

يحوّل client.chat.completions.parse نموذج Pydantic إلى مخطط JSON Schema صارم ويُعيد الكائن المحلَّل. يحتاج إلى إصدار حديث من openai، وفي إصدارات 1.x الأقدم يوجد باسم client.beta.chat.completions.parse. استخدم نموذجًا تتضمن supported_parameters فيه structured_outputs أو response_format:

from pydantic import BaseModel

class Person(BaseModel):
    name: str
    born: int
    city: str

res = client.chat.completions.parse(
    model="openai/gpt-5-mini",
    messages=[{"role": "user", "content": "Extract: Ada Lovelace, born 1815 in London."}],
    response_format=Person,
)
person = res.choices[0].message.parsed  # Person(name='Ada Lovelace', born=1815, city='London')

راجع المخرجات المنظمة.

إدخال الصور

import base64

image = base64.b64encode(open("photo.png", "rb").read()).decode()

res = 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": f"data:image/png;base64,{image}"}},
        ],
    }],
)

يعمل عنوان https:// عام أيضًا. راجع الرؤية والملفات.

الصور

result = client.images.generate(
    model="openai/gpt-5.4-image-2",
    prompt="A minimalist product photo of a ceramic mug on a wooden table",
    n=1,
    extra_body={"aspect_ratio": "1:1"},
)
open("image.png", "wb").write(base64.b64decode(result.data[0].b64_json))

المعاملات التي لا يعرفها SDK (aspect_ratio وprovider وmodels وreasoning) توضع في extra_body.

الكلام والتفريغ النصي

audio = client.audio.speech.create(
    model="openai/gpt-4o-mini-tts",
    input="Hello from api14!",
    voice="alloy",
)
audio.write_to_file("speech.mp3")

text = client.audio.transcriptions.create(
    model="openai/whisper-1",
    file=open("speech.mp3", "rb"),
)
print(text.text)

الأخطاء

import openai

try:
    client.chat.completions.create(
        model="openai/gpt-5-mini",
        messages=[{"role": "user", "content": "Hi"}],
    )
except openai.APIStatusError as e:
    if e.status_code == 402:
        print("Balance too low, add funds:", e.code)  # insufficient_balance
    elif e.status_code == 429:
        print("Retry after", e.response.headers.get("retry-after"), "s:", e.code)  # rate_limited
    else:
        raise

راجع الأخطاء.

المهلات وإعادة المحاولة

يعيد SDK افتراضيًا محاولة أخطاء الاتصال والاستجابات 408 و409 و429 و5xx مرتين مع تراجع أُسّي يحترم Retry-After. المهلة الافتراضية 10 دقائق. اضبطهما على العميل، أو لكل استدعاء عبر with_options:

import httpx

client = OpenAI(
    base_url="https://api14.com/api/v1",
    api_key=os.environ["API14_API_KEY"],
    timeout=httpx.Timeout(60.0, connect=5.0),
    max_retries=4,
)

client.with_options(timeout=300, max_retries=0).chat.completions.create(...)

إعادة المحاولة لا تفيد مع 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);