درس ۴ از ۱۲، بخش ۲: فراخوانی مدل‌ها

اتصال به مدل‌ها با کتابخانه‌ی OpenAI

متنی ۲۰ دقیقه به‌روز شده در ۱۱ آبان ۱۴۰۵

در این درس
  1. «سازگار با OpenAI» یعنی چه؟
  2. ارائه‌دهنده‌های واسط: GapGPT و OpenRouter
  3. اولین فراخوانی
  4. کلید را در کد ننویسید: فایل .env
  5. خلاصه

برای استفاده از یک LLM در برنامه دو راه داریم:

  1. سرویس آنلاین: مدل روی سرورهای یک ارائه‌دهنده اجرا می‌شود و ما از طریق API سؤال می‌فرستیم و جواب می‌گیریم. مدل‌های قوی تجاری مثل GPT، Claude و Gemini فقط همین‌طور در دسترس‌اند.
  2. اجرای محلی: مدل باز را روی کامپیوتر یا سرور خودمان اجرا می‌کنیم. این راه را در درس بعد با Ollama می‌بینیم.

این درس درباره‌ی راه اول است.

«سازگار با OpenAI» یعنی چه؟#

OpenAI اولین شرکتی بود که LLM را در این سطح به‌عنوان وب‌سرویس عرضه کرد. کتابخانه‌ی پایتونش (openai) آن‌قدر رایج شد که بقیه‌ی ارائه‌دهنده‌ها هم API خودشان را به همان شکل ساختند. به چنین سرویسی OpenAI-compatible می‌گویند: با همان کتابخانه‌ی openai و فقط با عوض کردن دو چیز می‌شود به آن وصل شد:

  • base_url: آدرس سرویس. اگر ندهید، کتابخانه به سرور خود OpenAI وصل می‌شود.
  • api_key: کلید اختصاصی شما در آن سرویس.

این قرارداد فقط مال پایتون نیست. همین API با curl، جاوااسکریپت، #C و هر زبان دیگری هم قابل‌استفاده است. Ollama، vLLM و خیلی از سرورهای محلی هم APIِ سازگار با OpenAI دارند.

اتصال به مدل‌ها با کتابخانه‌ی OpenAI و base_urlکد پایتون شماOpenAI(base_url, api_key)ارائه‌دهنده‌ی واسطGapGPT / OpenRouterOpenAI مستقیمapi.openai.comGPTClaudeGeminiDeepSeek / Qwenفقط base_url و کلید عوض می‌شود؛ کد همان است (OpenAI-compatible)
کد یکسان است؛ با تغییر base_url به سرویس دیگری وصل می‌شوید. ارائه‌دهنده‌های واسط درخواست را به مدل‌های شرکت‌های مختلف می‌رسانند.

ارائه‌دهنده‌های واسط: GapGPT و OpenRouter#

برای استفاده از مدل‌های چند شرکت، به‌جای خرید حساب جداگانه از هر کدام، می‌شود از یک ارائه‌دهنده‌ی واسط استفاده کرد. این سرویس‌ها مثل یک پراکسی عمل می‌کنند: درخواست شما را می‌گیرند، به مدل موردنظر (GPT، Claude، Gemini، DeepSeek، Qwen و …) می‌رسانند و هزینه را بر اساس تعداد توکن ورودی و خروجی حساب می‌کنند.

  • OpenRouter معروف‌ترین نمونه‌ی خارجی است.
  • GapGPT یک سرویس ایرانی است که با ریال شارژ می‌شود. در این دوره از همین استفاده می‌کنیم، چون شروع کار با آن ساده است و برای تست اولیه کمی اعتبار رایگان می‌دهد.

بعد از ثبت‌نام در GapGPT، در بخش پلتفرم این‌ها را می‌بینید:

  • کیف پول: شارژ بر حسب تتر انجام می‌شود. بعد از شارژ، مصرف توکن به تتر حساب می‌شود و نوسان قیمت دلار روی اعتبار شما اثری ندارد.
  • کلیدهای API: می‌توانید چند کلید با نام‌های مختلف بسازید و برای هر کدام سقف مصرف بگذارید. این کار برای وقتی که کلید را در یک برنامه یا دست یک همکار می‌گذارید مفید است.
  • فهرست مدل‌ها با قیمت هر میلیون توکن ورودی و خروجی. توکن خروجی معمولاً چند برابر توکن ورودی قیمت دارد.

آدرس‌ها عوض می‌شوند

آدرس سایت و base_url این سرویس‌ها ممکن است تغییر کند. همیشه آدرس فعلی را از مستندات خود سرویس بردارید.

اولین فراخوانی#

pip install openai
from openai import OpenAI

client = OpenAI(
    api_key="sk-...",                       # کلیدی که از GapGPT گرفتید
    base_url="https://api.gapgpt.app/v1",   # بدون این خط، مستقیم به OpenAI وصل می‌شود
)

response = client.responses.create(
    model="gpt-5.2",
    input="پایتخت ایران کجاست؟",
)
print(response.output_text)
پایتخت ایران **تهران** است.

برای سؤال از مدل شرکت دیگر، فقط نام مدل عوض می‌شود. اتصال و کد همان است، چون واسط همه را با یک رابط سرو می‌کند:

response = client.responses.create(model="claude-sonnet-4-6", input="پایتخت ایران کجاست؟")
print(response.output_text)
پایتخت ایران **تهران** است. تهران بزرگ‌ترین شهر ایران و مرکز سیاسی، اقتصادی و فرهنگی کشور محسوب می‌شود. …

لحن دو مدل هم فرق دارد. Claude معمولاً توضیح بیشتری می‌دهد. اگر چند بار اجرا کنید، به خاطر نمونه‌برداری‌ای که در درس قبل دیدیم جواب‌ها کمی فرق می‌کنند.

responses.create رابط جدیدتر OpenAI است. رابط قدیمی‌تر و رایج‌تر chat.completions.create است که لیستی از پیام‌ها می‌گیرد. بیشتر سرویس‌های سازگار با OpenAI این یکی را پشتیبانی می‌کنند و در درس‌های بعد همین قالب پیام‌ها را زیاد می‌بینیم:

completion = client.chat.completions.create(
    model="gpt-5.2",
    messages=[{"role": "user", "content": "پایتخت ایران کجاست؟"}],
)
print(completion.choices[0].message.content)

علامت‌های ** در خروجی Markdown هستند؛ یعنی مدل «تهران» را پررنگ کرده است. در نوت‌بوک می‌توانید خروجی را با IPython.display.Markdown نمایش بدهید تا قالب‌بندی‌اش دیده شود.

کلید را در کد ننویسید: فایل .env#

نوشتن کلید در کد دو مشکل دارد. اول اینکه اگر کد را در گیت‌هاب بگذارید یا برای کسی بفرستید، کلید لو می‌رود و هر کسی می‌تواند با اعتبار شما مدل صدا بزند. دوم اینکه اگر فردا بخواهید از GapGPT به OpenAI یا به حساب سازمانی دیگری بروید، باید همه‌ی فایل‌ها را بگردید و عوضشان کنید.

راه‌حل، متغیرهای محیطی است. کنار کدها یک فایل به نام .env بسازید:

# .env
OPENAI_API_KEY=sk-...
OPENAI_BASE_URL=https://api.gapgpt.app/v1   # برای کتابخانه‌ی openai
OPENAI_API_BASE=https://api.gapgpt.app/v1   # برای LiteLLM (درس ۶)

با کتابخانه‌ی python-dotenv این فایل را بخوانید:

import dotenv
dotenv.load_dotenv()          # متغیرهای .env را در محیط سیستم‌عامل قرار می‌دهد

from openai import OpenAI
client = OpenAI()             # کلید و آدرس را خودش از OPENAI_API_KEY و OPENAI_BASE_URL می‌خواند

response = client.responses.create(model="gpt-5.2", input="پایتخت ایران کجاست؟")
print(response.output_text)

نام‌ها باید دقیقاً همین باشند و با حروف بزرگ نوشته شوند، چون کتابخانه دنبال همین نام‌ها می‌گردد. حالا برای عوض کردن ارائه‌دهنده فقط فایل .env را ویرایش می‌کنید.

.gitignore#

اگر پروژه را با git مدیریت می‌کنید، در فایل .gitignore بنویسید که .env هرگز به مخزن فرستاده نشود:

.env

به‌جایش یک فایل .env.example با مقادیر خالی در مخزن بگذارید تا بقیه بدانند چه متغیرهایی لازم است.

خلاصه#

  • کتابخانه‌ی openai به هر سرویس OpenAI-compatible وصل می‌شود؛ فقط base_url و api_key عوض می‌شوند.
  • ارائه‌دهنده‌های واسط مثل GapGPT و OpenRouter مدل‌های شرکت‌های مختلف را با یک کلید و یک رابط در اختیارتان می‌گذارند.
  • کلید را در .env نگه دارید، با load_dotenv() بخوانید و .env را در .gitignore بگذارید.