Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Körningskontext ger mellanprogram åtkomst till information om den aktuella körningsmiljön och begäran. Detta möjliggör mönster som konfiguration per session, användarspecifikt beteende och dynamiskt mellanprogramsbeteende baserat på körningsvillkor.
I C# skickas körningskontext vanligtvis via AgentRunOptions eller anpassat sessionstillstånd. Mellanprogram kan komma åt sessionsegenskaper och körningsalternativ för att fatta körningsbeslut.
Tips/Råd
Mer information om hur mellanprogramsomfånget påverkar åtkomsten till körningskontext finns på sidan Agent kontra Körningsomfång .
Python-körningskontexten delas upp på tre offentliga ytor:
-
session=för konversationstillstånd och historik. -
function_invocation_kwargs=för värden som endast verktyg eller funktionsmellanprogram ska se. -
client_kwargs=för konfiguration av chattklientspecifika data eller klientmellanprogram.
Använd den minsta ytan som passar data. Detta håller verktygsindata explicita och undviker att läcka enbart klientmetadata till verktygskörning.
Tips/Råd
Behandla function_invocation_kwargs som ersättning för det gamla mönstret för att skicka godtyckliga offentliga **kwargs till agent.run() eller get_response().
Välj rätt körningshink
| Användningsfall | API-yta | Nås från |
|---|---|---|
| Dela konversationstillstånd, tjänstsessions-ID eller historik | session= |
ctx.session, AgentContext.session |
| Endast verktyg eller funktionsmellanprogram behöver passera körningsvärden | function_invocation_kwargs= |
FunctionInvocationContext.kwargs |
| Skicka klientspecifika körningsvärden eller konfiguration av mellanprogram för klienten | client_kwargs= |
anpassade get_response(..., client_kwargs=...) implementeringar |
Skicka körningsvärden endast för verktyg
from typing import Annotated
from agent_framework import FunctionInvocationContext, tool
from agent_framework.openai import OpenAIResponsesClient
@tool(approval_mode="never_require")
def send_email(
address: Annotated[str, "Recipient email address."],
ctx: FunctionInvocationContext,
) -> str:
user_id = ctx.kwargs["user_id"]
tenant = ctx.kwargs.get("tenant", "default")
return f"Queued email for {address} from {user_id} ({tenant})"
agent = OpenAIResponsesClient().as_agent(
name="Notifier",
instructions="Send email updates.",
tools=[send_email],
)
response = await agent.run(
"Email the launch update to finance@example.com",
function_invocation_kwargs={
"user_id": "user-123",
"tenant": "contoso",
},
)
print(response.text)
Använd ctx.kwargs inuti verktyget i stället för att deklarera filten **kwargs på verktyget som kan anropas. Äldre **kwargs verktyg fungerar fortfarande för kompatibilitet, men tas bort före ga.
Alla parametrar som kommenteras som FunctionInvocationContext behandlas som den inmatade körningskontextparametern, oavsett namn, och den exponeras inte i JSON-schemat som visas för modellen. Om du anger en explicit schema-/indatamodell identifieras även en oannoterad parameter med namnet ctx som den inmatade kontextparametern.
Om värdet är ett långvarigt verktygstillstånd eller ett beroende i stället för data per anrop behåller du det på en verktygsklassinstans i stället för att skicka det via function_invocation_kwargs. Det här mönstret finns i Skapa en klass med flera funktionsverktyg.
Funktionens mellanprogram tar emot samma kontext
Funktionens mellanprogram använder samma FunctionInvocationContext objekt som verktygen tar emot. Det innebär att mellanprogram kan inspektera context.arguments, context.kwargs, context.sessionoch context.result.
from collections.abc import Awaitable, Callable
from agent_framework import FunctionInvocationContext
from agent_framework.openai import OpenAIResponsesClient
async def enrich_tool_runtime_context(
context: FunctionInvocationContext,
call_next: Callable[[], Awaitable[None]],
) -> None:
context.kwargs.setdefault("tenant", "contoso")
context.kwargs.setdefault("request_source", "middleware")
await call_next()
agent = OpenAIResponsesClient().as_agent(
name="Notifier",
instructions="Send email updates.",
tools=[send_email],
middleware=[enrich_tool_runtime_context],
)
Mellanprogramskontraktet använder call_next() utan argument. Mutera context.kwargs innan du anropar det, och det valda verktyget ser dessa värden genom dess inmatade FunctionInvocationContext.
Använd session= för tillstånd för delad körning
from typing import Annotated
from agent_framework import FunctionInvocationContext, tool
from agent_framework.openai import OpenAIResponsesClient
@tool(approval_mode="never_require")
def remember_topic(
topic: Annotated[str, "Topic to remember."],
ctx: FunctionInvocationContext,
) -> str:
if ctx.session is None:
return "No session available."
ctx.session.state["topic"] = topic
return f"Stored {topic!r} in session state."
agent = OpenAIResponsesClient().as_agent(
name="MemoryAgent",
instructions="Remember important topics.",
tools=[remember_topic],
)
session = agent.create_session()
await agent.run("Remember that the budget review is on Friday.", session=session)
print(session.state["topic"])
Skicka sessionen explicit med session= och läs den från ctx.session. Sessionsåtkomst behöver inte längre färdas via runtime kwargs.
Dela sessionstillstånd med delegerade agenter
När en agent exponeras som ett verktyg via as_tool()flödar runtime-funktionen kwargs redan genom ctx.kwargs. Lägg bara till propagate_session=True när underagenten ska dela anroparens AgentSession.
from agent_framework import FunctionInvocationContext, tool
from agent_framework.openai import OpenAIResponsesClient
@tool(description="Store findings for later steps.")
def store_findings(findings: str, ctx: FunctionInvocationContext) -> None:
if ctx.session is not None:
ctx.session.state["findings"] = findings
client = OpenAIResponsesClient()
research_agent = client.as_agent(
name="ResearchAgent",
instructions="Research the topic and store findings.",
tools=[store_findings],
)
research_tool = research_agent.as_tool(
name="research",
description="Research a topic and store findings.",
arg_name="query",
propagate_session=True,
)
Med propagate_session=Trueser den delegerade agenten samma ctx.session tillstånd som anroparen. Låt den False isolera den underordnade agenten i sin egen session.
Anpassade chattklienter och agenter
Om du implementerar anpassade offentliga run() eller get_response() metoder lägger du till explicita körnings bucketar i signaturen.
from collections.abc import Mapping, Sequence
from typing import Any
from agent_framework import ChatOptions, Message
async def get_response(
self,
messages: Sequence[Message],
*,
options: ChatOptions[Any] | None = None,
function_invocation_kwargs: Mapping[str, Any] | None = None,
client_kwargs: Mapping[str, Any] | None = None,
**kwargs: Any,
):
...
Används function_invocation_kwargs för verktygsanropsflöden och client_kwargs för klientspecifikt beteende. Att skicka klientspecifika värden direkt via offentlig **kwargs är bara en kompatibilitetssökväg och bör behandlas som inaktuell. På samma sätt är definitionen av nya verktyg med **kwargs kompatibilitet endast för migrering – förbruka körningsdata via det inmatade kontextobjektet i stället.