SDK_PY // PYTHON 3.9+ OPENAI CLIENT

Panduan Integrasi Python SDK (openai)

Anda tidak memerlukan pustaka khusus untuk menggunakan TokenFajri di Python. Gunakan paket resmi openai >= 1.0.0 lalu arahkan parameter base_url ke https://token.fajriag.ai.id/v1.

1. Instalasi Paket & Variabel Lingkungan

pip install --upgrade openai

# Set environment variable di shell (.env)
export TOKENFAJRI_API_KEY="sk-tok-xxxxxxxxxxxxxxxxxxxxxxxx"
export TOKENFAJRI_BASE_URL="https://token.fajriag.ai.id/v1"

2. Permintaan Sinkron Standar (Chat Completions)

import os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ["TOKENFAJRI_API_KEY"],
    base_url=os.environ.get("TOKENFAJRI_BASE_URL", "https://token.fajriag.ai.id/v1"),
)

response = client.chat.completions.create(
    model="deepseek-v4.1-flash-1017",
    messages=[
        {"role": "system", "content": "Jawab dengan bahasa Indonesia yang ringkas dan teknis."},
        {"role": "user", "content": "Berikan contoh query PostgreSQL dengan indeks komposit."},
    ],
    temperature=0.2,
)

print(response.choices[0].message.content)
print("Total token terpakai:", response.usage.total_tokens)

3. Streaming Real-Time (Server-Sent Events / SSE)

Untuk respons interaktif dengan Time-To-First-Token (TTFT) rendah, aktifkan stream=True:

stream = client.chat.completions.create(
    model="deepseek-v4.1-flash-1017",
    messages=[{"role": "user", "content": "Tulis fungsi quicksort di Python beserta kompleksitasnya."}],
    stream=True,
)

for chunk in stream:
    if chunk.choices and chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="", flush=True)

4. Konkurensi Tinggi dengan AsyncOpenAI (FastAPI / Asyncio)

Pada server backend produksi berbasis FastAPI atau worker asinkron, gunakan AsyncOpenAI agar thread event loop tidak terblokir:

import asyncio
import os
from openai import AsyncOpenAI

async_client = AsyncOpenAI(
    api_key=os.environ["TOKENFAJRI_API_KEY"],
    base_url="https://token.fajriag.ai.id/v1",
    max_retries=2,
    timeout=45.0,
)

async def ask_model(prompt: str) -> str:
    res = await async_client.chat.completions.create(
        model="deepseek-v4.1-flash-1017",
        messages=[{"role": "user", "content": prompt}],
    )
    return res.choices[0].message.content or ""

if __name__ == "__main__":
    print(asyncio.run(ask_model("Apa keuntungan connection pooling di PostgreSQL?")))