Kode
OpenAI Agents SDK
Agents SDK berjalan di nokeep lewat chat completions. Berikan AsyncOpenAI klien dengan base URL nokeep dan bungkus model dengan OpenAIChatCompletionsModel.
Diperiksa 29 Oktober 2026
Pasang dan hubungkan
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 memanggil Responses API (/v1/responses) kecuali diatur lain, dan nokeep hanya punya chat completions. Membungkus model dengan OpenAIChatCompletionsModel yang membuatnya berfungsi.
Atau atur sekali untuk semua agen
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")Setelah itu agen menerima id model sebagai string biasa. Handoff antaragen bekerja dengan cara yang sama.
Tools
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 mengirim tiap tool dengan strict: true dan menjalankan loop-nya: model meminta sebuah tool, SDK menjalankannya dan mengirim hasilnya kembali sampai model menjawab. Lihat Pemanggilan tool.
Streaming dan penggunaan
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 meminta usage pada streaming, jadi context_wrapper.usage memuat jumlah token untuk seluruh run, semua panggilan model dijumlahkan.
Reasoning effort dan pengaturan lain
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
),
)Thinking dihitung ke max_tokens, jadi beri agen yang berpikir ruang yang cukup. Lihat Thinking.
Jebakan
- `reasoning_effort` hanya menerima nilai milik model.
deepseek-v4.1-flash-uncensoredmenerimanone,low,high,max;glm-5.3-flash-uncensoredmenerimalow,high. Nilaiminimal,mediumdanxhighdari aplikasi lain dijalankan pada level terdekat model (mediumsebagaihigh,xhighsebagaimaxjika model punya), nilai lain apa pun mendapat400 invalid_reasoning_effort. Lihat Thinking. - GLM memilih tool-nya sendiri.
glm-5.3-flash-uncensoredhanya menerimatool_choiceautoataunone. Memaksa sebuah tool (required, atau menyebut nama fungsi) mendapat400 unsupported_tool_choice. Pakai DeepSeek jika perlu memaksa satu tool. Di SDK ituModelSettings(tool_choice="required"), atau nama tool. - Field yang tidak bisa diterima sebuah model dibuang, bukan ditolak. Panggilan tetap dijawab, dan header respons
x-nokeep-ignoredmenyebut apa yang dibuang. GLM hanya menerimatools,tool_choicedanreasoning_effort, jaditemperaturedanresponse_format-nya dibuang. Lihat field apa yang diterima tiap model. - Hanya chat completions. Tidak ada
/v1/responsesdan tidak ada/v1/embeddings; framework yang default-nya memakai salah satunya harus diarahkan ke chat completions, dan embedding perlu penyedia lain.
Hosted tools, seperti pencarian web, pencarian file dan code interpreter, berjalan di server OpenAI sendiri lewat Responses API. Semuanya tidak berfungsi dengan API lain, termasuk nokeep. Tulis sebagai function tools.
Pertanyaan
Apakah saya juga butuh kunci OpenAI?
Tidak. Setiap panggilan model pergi ke nokeep dengan kunci nokeep kamu. Tracing diunggah ke dasbor OpenAI; dengan tracing menyala dan tanpa kunci OpenAI, SDK mencetak OPENAI_API_KEY is not set, skipping trace export dan agen tetap berjalan. set_tracing_disabled(True) membuatnya tenang.
Model mana yang sebaiknya dipakai agen?
deepseek-v4.1-flash-uncensored: bisa diarahkan untuk memanggil tool, membaca gambar, dan menerima semua pengaturan. glm-5.3-flash-uncensored lebih murah dan cocok untuk agen yang membiarkan model memilih tool-nya.