پرش به محتوا
همه مستندات

کد

OpenAI Agents SDK

Agents SDK از طریق چت کامپلیشن‌ها روی nokeep اجرا می‌شود. یک کلاینت AsyncOpenAI با آدرس پایهٔ nokeep بده و مدل را در OpenAIChatCompletionsModel بپیچ.

بررسی‌شده در ۷ آبان ۱۴۰۵

نصب و اتصال

Shell
pip install openai-agents
export NOKEEP_API_KEY="sk-nokeep-test"  # your own key once it connects
agent.py
import os
from openai import AsyncOpenAI
from agents import Agent, OpenAIChatCompletionsModel, set_tracing_disabled

client = AsyncOpenAI(
    base_url="https://nokeep.ai/v1",
    api_key=os.environ["NOKEEP_API_KEY"],
)
set_tracing_disabled(True)  # traces go to OpenAI's dashboard, which a nokeep key can't reach

model = OpenAIChatCompletionsModel(model="deepseek-v4.1-flash-uncensored", openai_client=client)

from agents import Runner

agent = Agent(name="Editor", instructions="You are a blunt editor.", model=model)
result = Runner.run_sync(agent, "Cut this opening line to ten words: ...")
print(result.final_output)

SDK اگر چیز دیگری گفته نشود به Responses API (/v1/responses) می‌زند، و nokeep فقط چت کامپلیشن دارد. پیچیدن مدل در OpenAIChatCompletionsModel است که آن را کار می‌اندازد.

یا یک‌بار برای همهٔ عامل‌ها تنظیم کن

Python
import os
from openai import AsyncOpenAI
from agents import Agent, set_default_openai_api, set_default_openai_client, set_tracing_disabled

set_default_openai_client(AsyncOpenAI(base_url="https://nokeep.ai/v1", api_key=os.environ["NOKEEP_API_KEY"]), use_for_tracing=False)
set_default_openai_api("chat_completions")
set_tracing_disabled(True)

agent = Agent(name="Editor", instructions="You are a blunt editor.", model="deepseek-v4.1-flash-uncensored")

بعد عامل‌ها شناسهٔ مدل را به‌صورت رشتهٔ ساده می‌گیرند. انتقال بین عامل‌ها هم به همین شکل کار می‌کند.

ابزارها

Python
from agents import Agent, Runner, function_tool

@function_tool
def get_weather(city: str) -> str:
    """Get the weather in a city."""
    return f"18°C and clear in {city}"

agent = Agent(
    name="Weather",
    instructions="Answer questions about the weather.",
    model=model,
    tools=[get_weather],
)
print(Runner.run_sync(agent, "What's the weather in Lisbon?").final_output)

SDK هر ابزار را با strict: true می‌فرستد و حلقه را اجرا می‌کند: مدل ابزار می‌خواهد، SDK آن را اجرا می‌کند و نتیجه را برمی‌گرداند تا مدل جواب بدهد. ببین فراخوانی ابزار.

استریم و مصرف

Python
import asyncio
from agents import Runner
from openai.types.responses import ResponseTextDeltaEvent

async def main():
    result = Runner.run_streamed(agent, "Tell me a story in three lines.")
    async for event in result.stream_events():
        if event.type == "raw_response_event" and isinstance(event.data, ResponseTextDeltaEvent):
            print(event.data.delta, end="", flush=True)
    print("\n", result.context_wrapper.usage)

asyncio.run(main())

SDK مصرف را روی استریم درخواست می‌کند، پس context_wrapper.usage شمار توکن‌های کل اجرا را دارد، جمع همهٔ فراخوانی‌های مدل.

میزان تفکر و تنظیمات دیگر

Python
from agents import Agent, ModelSettings
from openai.types.shared import Reasoning

planner = Agent(
    name="Planner",
    instructions="Plan before you answer.",
    model=model,
    model_settings=ModelSettings(
        reasoning=Reasoning(effort="high"),  # sent as reasoning_effort
        max_tokens=4000,
        extra_body={"min_p": 0.05},  # fields ModelSettings has no argument for
    ),
)

تفکر جزو max_tokens حساب می‌شود، پس به عاملی که فکر می‌کند جا بده. ببین تفکر.

نکات مهم

  • `reasoning_effort` فقط مقادیر خود مدل را می‌پذیرد. deepseek-v4.1-flash-uncensored مقادیر none، low، high و max را می‌گیرد؛ glm-5.3-flash-uncensored مقادیر low و high را. مقادیر minimal، medium و xhigh اپ‌های دیگر در نزدیک‌ترین سطح مدل اجرا می‌شوند (medium مثل high، و xhigh مثل max در جایی که مدل داشته باشد)؛ هر مقدار دیگری 400 invalid_reasoning_effort می‌گیرد. ببین تفکر.
  • GLM ابزارهایش را خودش انتخاب می‌کند. glm-5.3-flash-uncensored فقط tool_choice با مقدار auto یا none را می‌گیرد. اجبار به یک ابزار (required یا نام بردن از یک تابع) 400 unsupported_tool_choice می‌گیرد. اگر لازم داری ابزاری اجباری شود، از DeepSeek استفاده کن. در SDK این کار با ModelSettings(tool_choice="required") یا با نام ابزار انجام می‌شود.
  • فیلدهایی که یک مدل نمی‌پذیرد حذف می‌شوند، رد نمی‌شوند. درخواست همچنان جواب می‌گیرد و هدر پاسخ x-nokeep-ignored نام آنچه کنار گذاشته شده را می‌آورد. GLM فقط tools، tool_choice و reasoning_effort را نگه می‌دارد، پس temperature و response_format آن حذف می‌شوند. ببین هر مدل کدام فیلدها را می‌پذیرد.
  • فقط چت کامپلیشن‌ها. /v1/responses و /v1/embeddings وجود ندارد؛ چارچوبی که به یکی از آن‌ها پیش‌فرض دارد باید روی چت کامپلیشن‌ها تنظیم شود، و embedding از ارائه‌دهندهٔ دیگری گرفته شود.

ابزارهای میزبانی‌شده، مثل جست‌وجوی وب، جست‌وجوی فایل و مفسر کد، روی سرورهای خود OpenAI و از طریق Responses API اجرا می‌شوند. با هیچ API دیگری کار نمی‌کنند، nokeep هم جزوشان است. آن‌ها را به‌صورت ابزار تابعی بنویس.

پرسش‌ها

کلید OpenAI هم لازم دارم؟

نه. هر فراخوانی مدل با کلید nokeep خودت به nokeep می‌رود. ردیابی به داشبورد OpenAI بارگذاری می‌شود؛ اگر ردیابی روشن باشد و کلید OpenAI تنظیم نشده باشد، SDK پیام OPENAI_API_KEY is not set, skipping trace export را چاپ می‌کند و عامل همچنان اجرا می‌شود. set_tracing_disabled(True) آن را ساکت نگه می‌دارد.

عامل کدام مدل را استفاده کند؟

deepseek-v4.1-flash-uncensored: می‌توان آن را وادار به فراخوانی ابزار کرد، تصویر می‌خواند و همهٔ تنظیمات را می‌پذیرد. glm-5.3-flash-uncensored ارزان‌تر است و برای عامل‌هایی که اجازه می‌دهند مدل ابزارهایش را خودش انتخاب کند، کار می‌کند.