الكود
OpenAI Agents SDK
يعمل Agents SDK على nokeep عبر chat completions. أعطِه عميل AsyncOpenAI مع الرابط الأساسي الخاص بـ nokeep، ولفّ النموذج في OpenAIChatCompletionsModel.
تم التحقق في 29 أكتوبر 2026
التثبيت والاتصال
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 (/v1/responses) ما لم يُطلب غير ذلك، وليس لدى nokeep سوى chat completions. لفّ النموذج في 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القيمةautoأوnoneفقط فيtool_choice. فرض أداة (requiredأو تسمية دالة) يُرجع400 unsupported_tool_choice. استخدم DeepSeek حين تحتاج إلى فرض أداة. وفي SDK يكون ذلكModelSettings(tool_choice="required")، أو اسم الأداة. - الحقول التي لا يقبلها النموذج تُسقَط ولا تُرفض. يُجيب الطلب مع ذلك، وترويسة الاستجابة
x-nokeep-ignoredتسمّي ما استُبعد. يقبل GLM الحقولtoolsوtool_choiceوreasoning_effortفقط، لذا تُسقَطtemperatureوresponse_formatعنده. اطلع على الحقول التي يقبلها كل نموذج. - chat completions فقط. لا يوجد
/v1/responsesولا/v1/embeddings؛ أي إطار يفترض أحدهما يجب توجيهه إلى chat completions، وتحتاج التضمينات إلى مزوّد آخر.
الأدوات المستضافة، مثل البحث على الويب والبحث في الملفات ومفسّر الشيفرة، تعمل على خوادم OpenAI نفسها عبر واجهة Responses. ولا تعمل مع أي واجهة أخرى، ومنها nokeep. اكتبها كأدوات من نوع function.
أسئلة
هل أحتاج إلى مفتاح OpenAI أيضًا؟
لا. يذهب كل استدعاء للنموذج إلى 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 أقل كلفة، ويعمل للوكلاء الذين يتركون للنموذج اختيار أدواته.