Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Agent Hooks to najwyższej klasy funkcja platformy Agent Framework do stosowania kontroli ładu i środowiska uruchomieniowego w dobrze zdefiniowanych punktach wykonywania agenta. Implementuje ona kontrakt AGENT-HOOKS-0.1 neutralny pod względem struktury, dzięki czemu aparaty zasad, bramy zatwierdzania, strażniki budżetu, filtry zawartości i ruch wychodzący mogą być przeznaczone dla jednej wspólnej powierzchni sterowania.
Ważna
Agent Hooks to płaszczyzna sterowania, a nie płaszczyzna telemetrii. Każdy przechwytujący zwraca werdykt. W enforce trybie struktura działa na tym werdykcie; w evaluate_only trybie rejestruje werdykt bez zmiany wykonania. Użyj możliwości obserwowania w przypadku śledzenia pasywnego, metryk i dzienników.
Agent Hooks nie jest jeszcze dostępny dla .NET. Użyj oprogramowania pośredniczącego agenta, zatwierdzania narzędzi i bezpieczeństwa agenta, aby dodać kontrolki środowiska uruchomieniowego do agentów .NET.
Agent Hooks jest eksperymentalny w Python. Fabryka emituje ExperimentalWarning element po pierwszym użyciu, a jego interfejs API może ulec zmianie przed ogólną dostępnością.
Kiedy używać punktów zaczepienia agenta
Użyj elementów Agent Hooks, gdy niezależnie opracowane kontrolki wymagają jednego współużytkowanego, możliwego do wymuszenia kontraktu między danymi wejściowymi agenta, wywołaniami modelu, wywołaniami narzędzi i końcowymi danymi wyjściowymi.
| Zdolność | Użyj go do |
|---|---|
| Haki agentów | Ustandaryzowane decyzje dotyczące zasad, przekształcenia, zatwierdzenia, budżety i elementy kontroli ruchu wychodzącego w całym cyklu życia agenta. |
| Oprogramowanie pośredniczące agenta | Zachowanie krzyżowe specyficzne dla aplikacji, które nie wymaga kontraktu punktów zaczepienia agenta ani jego podstawowych gwarancji środowiska uruchomieniowego. |
| Zabezpieczenia dla agenta z FIDES | Deterministyczne etykiety i zasady przepływu informacji dla niezaufanej lub poufnej zawartości. |
| Zatwierdzanie narzędzi | Ludzkie potwierdzenie poszczególnych wywołań narzędzi funkcji. |
| Obserwowalność | Pasywne ślady, metryki i dzienniki, które nie kontrolują wykonywania. |
Co wymusza struktura agentów
Po dodaniu punktów zaczepienia agenta do agenta platforma Agent Framework stosuje skoordynowaną granicę wymuszania między przebiegami agentów, wywołaniami modelu i wywołaniami narzędzi. Środowisko uruchomieniowe zapewnia następujące gwarancje:
- Niepowodzenie zamknięte: Odmowa blokuje chronioną akcję. Nieprawidłowe konteksty, nieprawidłowe werdykty, błędy przechwytywania i błędy wymuszania nie pomijają dyskretnie kontrolek.
- Przekształć zapis zwrotny: Przekształcenie zmienia komunikaty natywne, argumenty narzędzi, wyniki narzędzia lub ostateczną odpowiedź, która rzeczywiście używa wykonania. Jeśli nie można zastosować przekształcenia, uruchomienie zakończy się niepowodzeniem.
- Przesyłanie strumieniowe buforowane: Żadna aktualizacja odpowiedzi nie dociera do elementu wywołującego, dopóki kompletna odpowiedź modelu i końcowe dane wyjściowe przejdą punkty przechwytywania.
-
Trwałość z bramą werdyktu: Trwałość czeka na werdykt, który go obejmuje. Standardowe oczekiwanie na
outputtrwałość po uruchomieniu ; trwałość historii wywołań dla poszczególnych usług czeka na każdypost_model_callelement . - Kompletna instalacja pakietu: Części agenta, czatu i funkcji są instalowane jako jedna jednostka, więc niekompletna granica wymuszania nie może zostać przypadkowo skonfigurowana.
Umowa jest spółdzielnią, a nie granicą izolacji procesów. Przechwytniki są uruchamiane w procesie hosta i odbierają zawartość wymaganą do podejmowania decyzji. Rejestruj tylko przechwytniki, którym ufasz.
Instalowanie punktów zaczepienia agenta
Zainstaluj opcjonalny agent-hooks dodatkowy pakiet podstawowy:
pip install "agent-framework-core[agent-hooks]"
Jeśli używasz uv:
uv add "agent-framework-core[agent-hooks]"
Zależność agent-hooks-sdk jest importowana z opóźnieniem. Importowanie agent_framework nie powoduje załadowania zestawu SDK, chyba że tworzysz pakiet oprogramowania pośredniczącego Agent Hooks.
Note
Dodatek agent-hooks nie jest celowo uwzględniony w pliku agent-framework-core[all]. Zainstaluj ją jawnie, gdy chcesz włączyć tę eksperymentalną powierzchnię sterowania.
Dodawanie przechwytywania
Przechwytujący odbiera agent_hooks.AgentContext (mapowanie kontekstu specyfikacji, a nie agent_framework.AgentContext używane przez oprogramowanie pośredniczące agenta) i zwraca werdykt. Następujące dane wyjściowe przechwytywania blokują końcowe dane wyjściowe zawierające wyraz secret. W tym przykładzie przyjęto założenie, że client jest już skonfigurowanym klientem czatu platformy Agent Framework.
from agent_framework import Agent, create_agent_hooks_middleware
from agent_hooks import ALLOW, AgentContext, InterceptionBlocked, Verdict
class SecretEgressGuard:
def intercept(self, context: AgentContext) -> Verdict:
if (
context["interception_point"] == "output"
and "secret" in str(context["target"]).lower()
):
return Verdict.deny(
reason="secret_in_output",
message="The final response contains restricted content.",
)
return ALLOW
hooks = create_agent_hooks_middleware(
{"secret-egress": SecretEgressGuard()},
)
agent = Agent(
client=client,
instructions="You are a helpful assistant.",
middleware=[hooks],
)
try:
response = await agent.run("Summarize the account details.")
except InterceptionBlocked as exc:
print(f"Blocked: {exc.result.verdict.reason}")
Przekaż pakiet jako jeden element listy agenta middleware . Zainstaluj dokładnie jeden pakiet punktów zaczepienia agenta na każdym agencie.
Punkty przechwytywania
Struktura agenta automatycznie emituje odpowiednie punkty przechwytywania:
| Punkt przechwytywania | Kiedy jest emitowany | Przekształć element docelowy |
|---|---|---|
agent_startup |
Przed pierwszym wejściem w sesji punktów zaczepienia agenta | Nie można przekształcić |
input |
Gdy żądanie zewnętrzne wprowadza agenta | Zawartość wejściowa i rola |
pre_model_call |
Przed każdym żądaniem modelu | Komunikaty wysyłane do modelu |
post_model_call |
Po każdej pełnej odpowiedzi modelu | Zawartość odpowiedzi, wywołania narzędzi wykonywane przez platformę i przyczyna zakończenia |
pre_tool_call |
Przed wywołaniem każdego narzędzia wykonanego przez platformę | Argumenty narzędzia |
post_tool_call |
Po pomyślnym wykonaniu lub niepodaniu narzędzia | Wynik narzędzia |
output |
Zanim ostateczna odpowiedź osiągnie obiekt wywołujący | Końcowa zawartość odpowiedzi |
agent_shutdown |
Gdy sesja punktów zaczepienia agenta zakończy się niepowodzeniem lub zostanie anulowana | Nie można przekształcić |
Uruchomienie, które wywołuje narzędzie, zwykle emituje:
agent_startup
input → → post_tool_callpre_tool_callpost_model_callpre_model_callpre_model_call → → → → → post_model_call → → outputagent_shutdown
Werdykty
Umowa ma trzy decyzje: allow, denyi transform. Zestaw SDK Python udostępnia również pomocników dla ostrzeżeń i odmowy zniesienia.
| Result | Interfejs programistyczny Python | Behavior |
|---|---|---|
| Allow |
ALLOW lub Verdict(decision=Decision.ALLOW) |
Kontynuuj pracę z obiektem docelowym bez zmian. |
| Zezwalaj z ostrzeżeniem | Verdict.warn(...) |
Kontynuuj i uwzględnij ostrzeżenie w rekordzie przechwytywania. |
| Deny | Verdict.deny(...) |
Blokuj chronioną akcję. |
| Odmów oczekujące na zatwierdzenie | Verdict.escalate(...) |
Blokuj, chyba że skonfigurowany program rozpoznawania zatwierdzenia zwraca werdykt zezwolenia. |
| Przekształć | Verdict(decision=Decision.TRANSFORM, transform=Transform(...)) |
Ponownie zapisz wartość w obszarze $target, a następnie kontynuuj odpisaną wartość. |
Błędy InterceptionBlocked na poziomie uruchamiania i na poziomie modelu uniemożliwiają uzyskanie chronionego wyniku do obiektu wywołującego lub następnego etapu. Na szwach narzędzia odmowa zasad uniemożliwia działanie narzędzia lub odrzuca jego wynik i zwraca błąd kontroli zawierający przyczynę zasad bez odmowy ładunku docelowego do modelu. Umożliwia to kontynuowanie pętli agenta. Host lub niepowodzenie wymuszania zatrzymuje przebieg.
Stosowanie przekształcenia
Ścieżka przekształcenia musi zaczynać się od $target. Na przykład przechwytujący może zastąpić końcową zawartość odpowiedzi:
from agent_hooks import ALLOW, AgentContext, Decision, Transform, Verdict
class OutputRedactor:
def intercept(self, context: AgentContext) -> Verdict:
if context["interception_point"] != "output":
return ALLOW
return Verdict(
decision=Decision.TRANSFORM,
reason="redacted_output",
transform=Transform(
path="$target.content",
value="[Response removed by policy]",
),
)
Przekształcenia są stosowane do wartości struktury Content agentów, zachowując obsługiwaną zawartość sformatowaną, a nie zmniejszając każdą wartość do zwykłego tekstu. Źle sformułowana ścieżka lub niezgodne zastąpienie kończy się niepowodzeniem zamiast kontynuować oryginalną wartość.
Zatwierdzanie narzędzi i przekształcenia argumentów
Zatwierdzanie narzędzia Agent Framework i szew zatwierdzania zapinania agentów są oddzielnymi mechanizmami. W przypadku narzędzia funkcji z approval_mode="always_require"programem , program Agent Framework tworzy żądanie zatwierdzenia przez człowieka przed uruchomieniem oprogramowania pośredniczącego funkcji. W pre_tool_call związku z tym przekształcenie może zmieniać argumenty po zatwierdzeniu przez użytkownika oryginalnych wartości.
Warning
Nie przekształcaj argumentów dla pre_tool_call narzędzi korzystających z polecenia approval_mode="always_require". Przekształć wywołanie narzędzia, post_model_call aby żądanie zatwierdzenia platformy zawiera przekształcone wartości lub zwróciło Verdict.escalate(...) się do pre_tool_call i rozwiązało zatwierdzenie za pośrednictwem punktów zaczepienia agenta resolver.
Przesyłanie strumieniowe i trwałość
Punkty zaczepienia agenta utrzymują interfejs API przesyłania strumieniowego, ale używają semantyki buforowanych danych wyjściowych. Struktura agenta tworzy kompletną odpowiedź modelu, emituje post_model_call, tworzy ostateczną odpowiedź agenta i emituje output przed wydaniem aktualizacji. Jeśli którykolwiek z punktów odmówi odpowiedzi, obiekt wywołujący nie otrzyma żadnych częściowych aktualizacji.
To zachowanie powoduje wymianę opóźnienia tokenu po tokenie w przypadku wymuszania danych wyjściowych zamkniętych w trybie fail-closed. Przekształcenie danych wyjściowych zostanie również odzwierciedlone w aktualizacjach ostatecznie wydanych do obiektu wywołującego.
Trwałość jest bramowana przez punkt przechwytywania, który obejmuje operację trwałości:
- Domyślnie historia i inne działania dostawcy po uruchomieniu czekają na werdykt
output. Odrzucone dane wyjściowe nie są utrwalane, a transformacja wyjściowa jest utrwalana po przekształceniu. - Po ustawieniu
require_per_service_call_history_persistence=TruekonstruktoraAgentlubclient.as_agent(...)każda wymiana modelu jest utrwalana popost_model_calljego werdykcie zezwala. Późniejszaoutputodmowa nie cofa, że już dozwolona historia. - W przypadku domyślnej trwałości po uruchomieniu próby ponawiania próby pozostają za ostateczną
outputdecyzją. Zamiast tego tryb wywołania poszczególnych usług utrwala każdą odpowiedź modelu, która przekazujepost_model_callwartość .
Ważna
Jeśli zawartość modelu nie może stać się trwała, wymuś te zasady w momencie post_model_call , gdy require_per_service_call_history_persistence=True. Zasady ruchu wychodzącego tylko do danych wyjściowych chronią, co dociera do obiektu wywołującego, ale nie powoduje retroaktywnego usuwania wymiany modeli, które są już dozwolone i utrwalane w obiekcie post_model_call.
Sesje i rekordy inspekcji
Domyślnie każdy przebieg agenta tworzy jedną sesję punktów zaczepienia agenta.
agent_startup i agent_shutdown nawiasy przebiegu, a rekordy otrzymują jeden identyfikator sesji z monotonicznie rosnącą sekwencją.
Użyj record_sink polecenia , aby odebrać każdy InterceptionRecordz nich:
records = []
hooks = create_agent_hooks_middleware(
{"secret-egress": SecretEgressGuard()},
record_sink=records.append,
)
Przechwycenie rekordów przechwytuje decyzję, przyczynę, podsumowanie przechwytywania, tryb, tożsamość i sekwencję bez kopiowania przechwyconego ładunku do rekordu inspekcji. Sam przechwytywanie nadal otrzymuje pełny kontekst.
Obejmuje wiele uruchomień z jedną sesją
Użyj create_agent_hooks_middleware_from_emitter() , gdy aplikacja jest właścicielem dłuższej sesji Agent Hooks, takiej jak konwersacja z jednym rejestrem zatwierdzania:
from agent_framework import Agent, create_agent_hooks_middleware_from_emitter
from agent_hooks import AgentContextBuilder, InterceptionEmitter
emitter = InterceptionEmitter().register(SecretEgressGuard())
builder = AgentContextBuilder(
agent_id="support-agent",
framework="agent-framework",
session_id="conversation-42",
)
hooks = create_agent_hooks_middleware_from_emitter(emitter, builder)
agent = Agent(client=client, middleware=[hooks])
await emitter.emit(builder.agent_startup(tools_registered=[]))
await agent.run("First turn")
await agent.run("Second turn")
await emitter.emit(builder.agent_shutdown(reason="completed"))
W tym formularzu aplikacja konfiguruje emiter i jest właścicielem uruchamiania, zamykania i oczyszczania błędów. Oprogramowanie pośredniczące emituje punkty na przebieg od input do .output
Konfigurowanie wymuszania
create_agent_hooks_middleware() akceptuje następujące kontrolki:
| Parametr | Purpose |
|---|---|
interceptors |
Sekwencja przechwytywania lub mapowania przechwytywania nazw na przechwyt. Wymagany jest co najmniej jeden. |
resolver |
Rozwiązuje problemy z odmową zniesienia za pośrednictwem kanału zatwierdzania. Bez rozwiązania odmowa pozostaje w mocy. |
mode |
"enforce" stosuje werdykty.
"evaluate_only" rejestruje, co się stanie, ale zezwala na każdą akcję. |
composition |
Wybiera sposób łączenia wielu werdyktów przechwytywania. |
identity_provider |
Tworzy tożsamości kontekstowe powiązane z zawartością. Wartość domyślna to "jcs-sha256". |
timeout |
Limit czasu per-interceptor i resolver dla oczekujących wywołań. Wartość domyślna to pięć sekund. Synchroniczny przechwytywanie lub rozpoznawanie, które blokuje pętlę zdarzeń, nie może zostać wywłaszczone przez ten limit czasu. |
record_sink |
Odbiera każdy rekord przechwytywania bez ładunku. |
Domyślna kompozycja jest sekwencyjny first_deny z zatwierdzeniem skonfigurowanym do zatrzymania składania. W związku z tym kolejność przechwytywania ma znaczenie: należy umieścić kontrolki, które muszą być zawsze uruchamiane przed kontrolkami, które mogą żądać zatwierdzenia. Przed wybraniem innego profilu kompozycji zobacz listę kontrolną produkcji Agent Hooks.
Wdrażanie w trybie tylko do oceny
Użyj evaluate_only polecenia , aby zmierzyć zachowanie zasad przed wymuszaniem:
hooks = create_agent_hooks_middleware(
{"secret-egress": SecretEgressGuard()},
mode="evaluate_only",
record_sink=records.append,
)
W tym trybie przechwytywanie uruchamiane i rekordy obejmują ich werdykty, ale żadna akcja nie jest blokowana ani przekształcana. Nie opisywaj wdrożenia jako wymuszonego evaluate_only ładu.
Reguły kompozycji
Umieść pakiet najpierw na liście oprogramowania pośredniczącego agenta, aby stanowił najbardziej zewnętrzną granicę wymuszania:
agent = Agent(
client=client,
middleware=[
create_agent_hooks_middleware([SecretEgressGuard()]),
application_middleware,
],
)
Postępuj zgodnie z następującymi regułami:
- Zainstaluj dokładnie jeden pakiet punktów zaczepienia agenta na agenta. Skumulowane pakiety są odrzucane.
- Zachowaj nienaruszony pakiet. Nie można zainstalować oddzielnie agenta, czatu i oprogramowania pośredniczącego funkcji.
- Zainstaluj pakiet w programie
Agent, a nie bezpośrednio na kliencie czatu lub za pośrednictwem dostawcy kontekstu. - Oprogramowanie pośredniczące umieszczone przed pakietem znajduje się poza granicą wymuszania. Traktuj pozycję zewnętrzną jako zaufanie zewnętrzne.
- Nadaj każdemu zagnieżdżonemu agentowi własny pakiet, gdy jego wewnętrzny model i działanie narzędzia również wymaga przechwycenia.
Bieżące ograniczenia
- Python tylko: w .NET lub zestawach SDK języka Go nie zaimplementowano jeszcze punktów zaczepienia agenta.
- Eksperymentalny interfejs API: Podpisy i zachowanie fabryki mogą ulec zmianie przed ogólną dostępnością.
- Przesyłanie strumieniowe buforowane: Aktualizacje nie są zwalniane tokenem przez token, ponieważ dane wyjściowe muszą zostać ukończone przed zamknięciem werdyktu zakończonego niepowodzeniem.
-
Narzędzia hostowane: Narzędzia wykonywane przez dostawcę modelu nie przechodzą przez szew wywołania funkcji programu Agent Framework. Ich wywołania i dane wyjściowe są udostępniane w systemie
post_model_call,post_tool_callalepre_tool_callnie mogą blokować wykonywania po stronie serwera dostawcy. - Granica współpracy: Agent Hooks nie przechwytuje piaskownicy ani nie chroni przed wrogim hostem. Ścieżki kodu pomijające chroniony potok agenta nie są omówione.
- Dostępność przechwytywania wpływa na dostępność agenta: W trybie wymuszania awaria przechwytywania lub przekroczenie limitu czasu blokuje chronioną akcję zgodnie z projektem.
Aby uzyskać informacje o wdrożeniu produkcyjnym, przyczynach awarii i wskazówkach dotyczących alertów, zobacz element Runbook operacji punktów zaczepienia agenta.
Agent Hooks nie jest jeszcze dostępny dla języka Go. Użyj oprogramowania pośredniczącego agenta, zatwierdzania narzędzi i bezpieczeństwa agenta , aby dodać kontrolki środowiska uruchomieniowego do agentów języka Go.