کد
OpenAI Agents SDK
Agents SDK از طریق چت کامپلیشنها روی nokeep اجرا میشود. یک کلاینت AsyncOpenAI با آدرس پایهٔ nokeep بده و مدل را در OpenAIChatCompletionsModel بپیچ.
بررسیشده در ۷ آبان ۱۴۰۵
نصب و اتصال
pip install openai-agents
export NOKEEP_API_KEY="sk-nokeep-test" # your own key once it connectsimport 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 است که آن را کار میاندازد.
یا یکبار برای همهٔ عاملها تنظیم کن
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")بعد عاملها شناسهٔ مدل را بهصورت رشتهٔ ساده میگیرند. انتقال بین عاملها هم به همین شکل کار میکند.
ابزارها
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 آن را اجرا میکند و نتیجه را برمیگرداند تا مدل جواب بدهد. ببین فراخوانی ابزار.
استریم و مصرف
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 شمار توکنهای کل اجرا را دارد، جمع همهٔ فراخوانیهای مدل.
میزان تفکر و تنظیمات دیگر
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 ارزانتر است و برای عاملهایی که اجازه میدهند مدل ابزارهایش را خودش انتخاب کند، کار میکند.