Code
OpenAI Agents SDK
Das Agents SDK läuft auf nokeep über Chat-Completions. Geben Sie ihm einen AsyncOpenAI-Client mit der Basis-URL von nokeep und verpacken Sie das Modell in OpenAIChatCompletionsModel.
Geprüft am 29. Oktober 2026
Installieren und verbinden
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)Das SDK ruft die Responses API (/v1/responses) auf, sofern Sie nichts anderes sagen, und nokeep hat nur Chat-Completions. Dass Sie das Modell in OpenAIChatCompletionsModel verpacken, lässt es funktionieren.
Oder einmal für alle Agenten setzen
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")Agenten nehmen dann die Modell-ID als einfache Zeichenkette. Übergaben zwischen Agenten funktionieren genauso.
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)Das SDK schickt jedes Tool mit strict: true und führt die Schleife aus: Das Modell fordert ein Tool an, das SDK führt es aus und schickt das Ergebnis zurück, bis das Modell antwortet. Siehe Tool-Aufrufe.
Streaming und Nutzung
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())Das SDK fordert die Nutzung bei einem Stream an, daher enthält context_wrapper.usage die Token-Zahlen für den ganzen Lauf, alle Modellaufrufe zusammengezählt.
Reasoning-Aufwand und andere Einstellungen
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 zählt auf max_tokens, also geben Sie einem denkenden Agenten Raum. Siehe Thinking.
Stolperfallen
- `reasoning_effort` nimmt nur die eigenen Werte des Modells.
deepseek-v4.1-flash-uncensorednimmtnone,low,high,max;glm-5.3-flash-uncensorednimmtlow,high. Dieminimal-,medium- undxhigh-Werte anderer Apps laufen auf der nächsten Stufe des Modells (mediumalshigh,xhighalsmax, wo das Modell sie hat); jeder andere Wert ergibt400 invalid_reasoning_effort. Siehe Thinking. - GLM wählt seine Tools selbst.
glm-5.3-flash-uncensorednimmttool_choicenur alsautoodernone. Ein erzwungenes Tool (requiredoder ein benannter Funktionsname) ergibt400 unsupported_tool_choice. Nehmen Sie DeepSeek, wenn Sie eines erzwingen müssen. Im SDK ist dasModelSettings(tool_choice="required")oder ein Tool-Name. - Felder, die ein Modell nicht annimmt, werden verworfen, nicht abgelehnt. Der Aufruf wird trotzdem beantwortet, und der Antwort-Header
x-nokeep-ignorednennt, was weggelassen wurde. GLM behält nurtools,tool_choiceundreasoning_effort; daher werden seinetemperatureundresponse_formatverworfen. Siehe welche Felder jedes Modell annimmt. - Nur Chat-Completions. Es gibt kein
/v1/responsesund kein/v1/embeddings; ein Framework, das standardmäßig eines davon nutzt, muss auf Chat-Completions umgestellt werden, und Embeddings brauchen einen anderen Anbieter.
Gehostete Tools wie Websuche, Dateisuche und Code-Interpreter laufen auf den eigenen Servern von OpenAI über die Responses API. Sie funktionieren mit keiner anderen API, nokeep eingeschlossen. Schreiben Sie sie als Funktions-Tools.
Fragen
Brauche ich auch einen OpenAI-Schlüssel?
Nein. Jeder Modellaufruf geht mit Ihrem nokeep-Schlüssel an nokeep. Das Tracing lädt in das Dashboard von OpenAI hoch; mit eingeschaltetem Tracing und ohne gesetzten OpenAI-Schlüssel gibt das SDK OPENAI_API_KEY is not set, skipping trace export aus, und der Agent läuft trotzdem. set_tracing_disabled(True) hält es still.
Welches Modell sollte ein Agent nutzen?
deepseek-v4.1-flash-uncensored: es lässt sich zu einem Tool-Aufruf bringen, liest Bilder und nimmt jede Einstellung an. glm-5.3-flash-uncensored kostet weniger und funktioniert für Agenten, die das Modell seine Tools selbst wählen lassen.