Diese Seite gilt für Apigee und Apigee Hybrid.
Apigee Edge-Dokumentation aufrufen
Apigee unterstützt das kontinuierliche Streaming von Antworten von SSE-Endpunkten (Server-Sent Events) an Clients in Echtzeit. Die Apigee-SSE-Funktion ist nützlich für die Verarbeitung von LLM-APIs (Large Language Model), die am effektivsten funktionieren, wenn ihre Antworten an den Client gestreamt werden. Durch SSE-Streaming wird die Latenz reduziert und Clients können Antwortdaten empfangen, sobald sie von einem LLM generiert werden. Diese Funktion unterstützt die Verwendung von KI-Agents, die in Echtzeitumgebungen arbeiten, z. B. Kundenservice-Bots oder Workflow-Orchestratoren.
Wenn Sie SSE mit Apigee verwenden möchten, verweisen Sie einfach einen API-Proxy auf einen SSE-fähigen Zielendpunkt. Für eine detailliertere Steuerung der SSE-Antwort bietet Apigee einen speziellen Zielendpunkt-Flow namens EventFlow
. Im Kontext eines EventFlow
können Sie eine begrenzte Anzahl von Richtlinien hinzufügen, um Vorgänge für die SSE-Antwort auszuführen, z. B. Filtern, Ändern oder Behandeln von Fehlern. Weitere Informationen zu Proxy-Abläufen finden Sie unter API-Proxys mit Abläufen steuern.
API-Proxy für SSE erstellen
Die Apigee-Benutzeroberfläche bietet eine Vorlage zum Erstellen eines neuen Proxys, der eine EventFlow
enthält.
So erstellen Sie einen API-Proxy mit der Vorlage EventFlow
über die Apigee-UI:
- Öffnen Sie die Apigee-UI in der Cloud Console in einem Browser.
- Klicken Sie im linken Navigationsbereich auf Proxy-Entwicklung > API-Proxys.
- Klicken Sie im Bereich API-Proxys auf + Erstellen.
- Wählen Sie im Bereich Proxy erstellen unter Proxy-Vorlage die Option Proxy mit Server-Sent Events (SSE) aus.
- Geben Sie unter Proxydetails Folgendes ein:
- Proxyname: Geben Sie einen Namen für den Proxy ein, z. B.
myproxy
. - Basispfad: Wird automatisch auf den Wert festgelegt, den Sie für
Proxy name
eingeben. Der Basispfad ist Teil der URL, die zum Senden von Anfragen an Ihre API verwendet wird. Apigee verwendet die URL, um eingehende Anfragen zuzuordnen und an den richtigen API-Proxy weiterzuleiten. - Beschreibung (Optional): Geben Sie eine Beschreibung für den neuen API-Proxy ein, z. B. „Apigee mit einem einfachen Proxy testen“.
- Ziel (vorhandene API): Geben Sie die SSE-Ziel-URL für den API-Proxy ein. Beispiel:
https://mocktarget.apigee.net/sse-events/5
- Klicken Sie auf Weiter.
- Proxyname: Geben Sie einen Namen für den Proxy ein, z. B.
- Bereitstellen (optional):
- Bereitstellungsumgebungen: Optional. Wählen Sie durch die Kästchen eine oder mehrere Umgebungen aus, in denen Sie Ihren Proxy bereitstellen möchten. Wenn Sie den Proxy zu diesem Zeitpunkt nicht bereitstellen möchten, lassen Sie das Feld Bereitstellungsumgebungen leer. Sie können den Proxy später jederzeit bereitstellen.
- Dienstkonto: (optional) Ein Dienstkonto für den Proxy. Das Dienstkonto stellt die Identität des bereitgestellten Proxys dar und bestimmt, welche Berechtigungen er hat. Dies ist eine erweiterte Funktion, die Sie für diese Anleitung ignorieren können.
API-Proxys, die mit einer
EventFlow
-Konfiguration bereitgestellt werden, werden als erweiterbar abgerechnet. - Klicken Sie auf Erstellen.
EventFlow konfigurieren
Für eine detailliertere Steuerung der SSE-Antwort bietet Apigee einen speziellen Zielendpunkt-Flow namens EventFlow
. Im Kontext eines EventFlow
können Sie eine begrenzte Anzahl von Richtlinien hinzufügen, die unten aufgeführt sind, um die SSE-Antwort zu ändern, bevor sie an den Client zurückgestreamt wird. Weitere Informationen zu Proxy-Abläufen finden Sie unter API-Proxys mit Abläufen steuern.
Ein EventFlow
muss in der TargetEndpoint
-Definition platziert werden, wie im folgenden Codebeispiel gezeigt:
<TargetEndpoint name="default"> <Description/> <FaultRules/> <PreFlow name="PreFlow"> <Request/> <Response/> </PreFlow> <PostFlow name="PostFlow"> <Request/> <Response/> </PostFlow> <Flows/> <EventFlow name="EventFlow" content-type="text/event-stream"> <Response/> </EventFlow> <HTTPTargetConnection> <Properties/> <URL>https://httpbun.org/sse</URL> </HTTPTargetConnection> </TargetEndpoint>
EventFlow
hat zwei Attribute:
name
: Ein Name zur Identifizierung des Ablaufs.content-type
: Der Wert dieses Attributs musstext/event-stream
sein.
Weitere Informationen finden Sie unter Ablaufkonfigurationsreferenz.
Sie können dem Response
-Element der EventFlow
bis zu vier Richtlinien hinzufügen. Wie bei allen Abläufen werden Richtlinien in der Reihenfolge ausgeführt, in der sie hinzugefügt werden. Sie können bedingte Schritte hinzufügen, um die Ausführung zu steuern.
Die Richtlinientypen, die Sie einem EventFlow
hinzufügen können, sind auf die folgenden beschränkt.
In einem EventFlow
sind keine anderen Richtlinientypen zulässig:
Weitere Informationen finden Sie unter Richtlinien in der Benutzeroberfläche anhängen und konfigurieren und Richtlinien in XML-Dateien anhängen und konfigurieren.
Das folgende Beispiel zeigt ein EventFlow
mit einem bedingten RaiseFault-Richtlinienschritt:
<TargetEndpoint name="default"> <EventFlow content-type="text/event-stream"> <Response> <Step> <Name>Raise-Fault-Cred-Invalid</Name> <Condition>fault.name equals "invalid_access_token"</Condition> </Step> </Response> </EventFlow> <HTTPTargetConnection> </TargetEndpoint></pre>
Weitere EventFlow
-Codebeispiele finden Sie im Abschnitt EventFlow-Anwendungsfälle und -Beispiele.
Ablaufvariablen
Durch EventFlow
werden zwei Ablaufvariablen für Antworten ausgefüllt. Diese Variablen können nur im Rahmen des aktuellen Ereignisses verwendet werden, das in EventFlow
verarbeitet wird.
Der Zugriff auf diese Variablen oder das Festlegen dieser Variablen außerhalb des EventFlow
-Bereichs hat keine Auswirkungen. Sie sind nur im Kontext der EventFlow
sinnvoll.
response.event.current.content
: Ein String mit der vollständigen Antwort des aktuellen Ereignisses. Apigee parst den String nicht. Sie enthält die gesamte Antwort unverändert, einschließlich aller Datenfelder.response.event.current.count
: Zählt die Anzahl der gesendeten Antwort-Ereignisse inkrementell. Dieser Wert wird für jedes empfangene Ereignis aktualisiert. Die Anzahl ist 1 für das erste Ereignis und wird für nachfolgende Ereignisse erhöht.
Weitere Informationen finden Sie unter Referenz zu Ablaufvariablen.
EventFlow-Anwendungsfälle und ‑Beispiele
Die folgenden Beispiele zeigen, wie Sie gängige Anwendungsfälle für SSE-Proxys implementieren:
- SSE-Antwort ändern
- SSE-Antwort filtern
- SSE-Ereignis an ein externes System senden
- Apigee Model Armor-Richtlinie in EventFlows verwenden
- Fehlerbehandlung im EventFlow
- Fehlermeldungen in einem EventFlow weiterleiten
SSE-Antwort ändern
In diesem Beispiel wird gezeigt, wie Daten aus einer SSE-EventFlow
-Antwort entfernt werden, bevor sie an den Client zurückgegeben werden.
Der Inhalt der SSE-Antwort wird in einer Ablaufvariablen namens response.event.current.content
gespeichert.
In diesem Fall verwenden wir eine JavaScript-Richtlinie, um den Wert der Ablaufvariablen abzurufen, zu parsen und zu ändern. Siehe auch Ablaufvariablen.
- Erstellen Sie einen neuen Proxy mit der SSE-Proxyvorlage. Weitere Informationen finden Sie unter API-Proxy mit vom Server gesendeten Ereignissen (SSE) erstellen.
- Öffnen Sie den Proxy im Apigee-Proxy-Editor und klicken Sie auf den Tab Entwickeln.
- Erstellen Sie eine neue JavaScript-Richtlinie mit der folgenden Definition. In diesem Beispiel ist der JavaScript-Code direkt in der Richtlinie enthalten.
Eine weitere Möglichkeit zum Konfigurieren der Richtlinie besteht darin, den JavaScript-Code in eine Ressourcendatei einzufügen.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Javascript continueOnError="false" enabled="true" timeLimit="200" name="js-update-resp"> <DisplayName>js-update-resp</DisplayName> <Properties/> <Source> var event = JSON.parse(context.getVariable("response.event.current.content")); event.modelVersion = null; context.setVariable("response.event.current.content",JSON.stringify(event)); </Source> </Javascript>
- Fügen Sie die JavaScript-Richtlinie dem
EventFlow
des Proxys hinzu. DieEventFlow
ist an die Standard-TargetEndpoint
angehängt. In diesem Beispiel wird die Gemini API in Vertex AI verwendet, um Inhalte zu generieren.<TargetEndpoint name="default"> <EventFlow content-type="text/event-stream"> <Response> <Step> <Name>js-update-resp</Name> </Step> </Response> </EventFlow> <HTTPTargetConnection> <URL>https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:streamGenerateContent?key=GEMINI_API_KEY&alt=sse</URL> </HTTPTargetConnection> </TargetEndpoint>
- Speichern Sie den Proxy und stellen Sie ihn bereit.
- Bereitgestellten Proxy aufrufen:
curl -X POST -H 'Content-Type: application/json' \ "https://YOUR_APIGEE_ENVIRONMENT_GROUP_HOSTNAME/YOUR_API_PATH" \ -d '{ "contents":[{"parts":[{"text": "Write a story about a magic pen."}]}]}'
Beispielantwort anzeigen
Dies ist eine Beispielantwort ohne Filterung. Beachten Sie, dass die Antwort ein
modelVersion": "gemini-2.5-flash"
-Attribut enthält.data: { "candidates": [ { "content": { "parts": [ { "text": "ara found the pen tucked away in a dusty antique shop, nestled amongst chipped tea" } ], "role": "model" } } ], "usageMetadata": { "promptTokenCount": 8, "totalTokenCount": 8 }, "modelVersion": "gemini-2.5-flash" }
Dies ist eine weitere Beispielantwort, in der die JavaScript-Richtlinie angewendet wurde. Das Attribut „
modelVersion
“ wurde entfernt.data: { "candidates": [ { "content": { "parts": [ { "text": " the fantastical creatures of her imagination. The quiet beauty of a simple life was a magic all its own.\n" } ], "role": "model" }, "finishReason": "STOP" } ], "usageMetadata": { "promptTokenCount": 8, "candidatesTokenCount": 601, "totalTokenCount": 609, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 8 } ], "candidatesTokensDetails": [ { "modality": "TEXT", "tokenCount": 601 } ] } }
SSE-Antwort filtern
In diesem Beispiel wird gezeigt, wie Sie Daten aus einer SSE-Antwort filtern, bevor Sie sie an den Client zurückgeben. In diesem Fall filtern wir Ereignisdaten aus der Antwort mithilfe einer JavaScript-Richtlinie. Die Richtlinie parst die Ereignisantwort in JSON, ändert das JSON, um die Ereignisdaten zu entfernen, und sendet die geänderten Antwortdaten dann zurück an den Client.
Wie im vorherigen Beispiel wird in diesem Beispiel der Wert der Ablaufvariablen response.event.current.content
abgerufen und in JSON geparst. Anschließend wird die Logik angewendet, um die gewünschte Filterung zu implementieren.
- Erstellen Sie einen neuen Proxy mit der SSE-Proxyvorlage. Weitere Informationen finden Sie unter API-Proxy mit vom Server gesendeten Ereignissen (SSE) erstellen.
- Öffnen Sie den Proxy im Apigee-Proxy-Editor und klicken Sie auf den Tab Entwickeln.
- Erstellen Sie eine neue JavaScript-Richtlinie mit der folgenden Definition. In diesem Beispiel ist der JavaScript-Code direkt in der Richtlinie enthalten.
Eine weitere Möglichkeit zum Konfigurieren der Richtlinie besteht darin, den JavaScript-Code in eine Ressourcendatei einzufügen.
<Javascript continueOnError="false" enabled="true" timeLimit="200" name="js-filter-resp"> <DisplayName>js-filter-resp</DisplayName> <Properties/> <Source> var event = JSON.parse(context.getVariable("response.event.current.content")); if("error" in event){ // Do not send event to customer context.setVariable("response.event.current.content", ""); } </Source> </Javascript>
- Fügen Sie die JavaScript-Richtlinie dem
EventFlow
des Proxys hinzu. DieEventFlow
ist an die Standard-TargetEndpoint
angehängt. In diesem Beispiel wird die Gemini API in Vertex AI verwendet, um Inhalte zu generieren.<TargetEndpoint name="default"> <EventFlow content-type="text/event-stream"> <Response> <Step> <Name>js-filter-resp</Name> </Step> </Response> </EventFlow> <HTTPTargetConnection> <URL>https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:streamGenerateContent?key=GEMINI_API_KEY&alt=sse </URL> </HTTPTargetConnection> </TargetEndpoint>
- Speichern Sie den Proxy und stellen Sie ihn bereit.
- Bereitgestellten Proxy aufrufen:
curl -X POST -H 'Content-Type: application/json' \ "https://YOUR_APIGEE_ENVIRONMENT_GROUP_HOSTNAME/YOUR_API_PATH" \ -d '{ "contents":[{"parts":[{"text": "Write a story about a magic pen."}]}]}'
Beispielantwort anzeigen
Hier sehen Sie ein Beispiel dafür, wie die Antwort ohne Filterung aussehen könnte. Beachten Sie, dass sie Fehlerdaten enthält:
data: { "candidates": [ { "content": { "parts": [ { "text": "El" } ], "role": "model" } } ], "usageMetadata": { "promptTokenCount": 8, "totalTokenCount": 8 }, "modelVersion": "gemini-2.5-flash" } data: { "error": "Service temporarily unavailable. We are experiencing high traffic.", "modelVersion": "gemini-2.5-flash" }
Hier sehen Sie ein weiteres Beispiel für eine Antwort nach der Filterung, wobei die Fehlermeldung entfernt wurde.
data: { "candidates": [ { "content": { "parts": [ { "text": "El" } ], "role": "model" } } ], "usageMetadata": { "promptTokenCount": 8, "totalTokenCount": 8 }, "modelVersion": "gemini-2.5-flash" } data: { "candidates": [ { "content": { "parts": [ { "text": "ara found the pen tucked away in a dusty antique shop, nestled amongst chipped tea" } ], "role": "model" } } ], "usageMetadata": { "promptTokenCount": 8, "totalTokenCount": 8 }, "modelVersion": "gemini-2.5-flash" }
SSE-Ereignis an ein externes System senden
In diesem Beispiel hängen wir die Apigee PublishMessage-Richtlinie an EventFlow
an, um ein SSE-Ereignis an ein Pub/Sub-Thema zu senden.
- Erstellen Sie einen neuen Proxy mit der SSE-Proxyvorlage. Weitere Informationen finden Sie unter API-Proxy mit vom Server gesendeten Ereignissen (SSE) erstellen.
- Öffnen Sie den Proxy im Apigee-Proxy-Editor und klicken Sie auf den Tab Entwickeln.
- Erstellen Sie eine neue PublishMessage-Richtlinie mit der folgenden Definition:
<PublishMessage continueOnError="false" enabled="true" name="PM-record-event"> <DisplayName>PM-record-event</DisplayName> <Source>{response.event.current.content}</Source> <CloudPubSub> <Topic>projects/<customer_project>/topics/<topic_name></Topic> </CloudPubSub> </PublishMessage>
- Fügen Sie die PublishMessage-Richtlinie als Schritt in den
EventFlow
des API-Proxy ein.<TargetEndpoint name="default"> <EventFlow content-type="text/event-stream"> <Response> <Step> <Name>PM-record-event</Name> </Step> </Response> </EventFlow> <HTTPTargetConnection> </TargetEndpoint>
- Stellen Sie den API-Proxy bereit und testen Sie ihn.
- Nachdem Sie dem Pub/Sub-Thema generierte Inhalte hinzugefügt haben, können Sie beispielsweise eine Cloud Run-Funktion erstellen, um Nachrichten aus dem Thema zu verarbeiten.
Apigee Model Armor-Richtlinie in einem EventFlow verwenden
Mit der SanitizeModelResponse-Richtlinie können Sie eingehende Server-Sent Events in einem EventFlow
bereinigen.
Diese Richtlinie schützt Ihre KI-Anwendungen, indem Antworten von Large Language Models (LLMs) bereinigt werden. Informationen zu Model Armor finden Sie in der Übersicht zu Model Armor. Informationen zu den Apigee Model Armor-Richtlinien finden Sie unter Erste Schritte mit Apigee Model Armor-Richtlinien.
- Erstellen Sie einen neuen Proxy mit der SSE-Proxyvorlage. Weitere Informationen finden Sie unter API-Proxy mit vom Server gesendeten Ereignissen (SSE) erstellen.
- Öffnen Sie den Proxy im Apigee-Proxy-Editor und klicken Sie auf den Tab Entwickeln.
- Erstellen Sie eine neue SanitizeModelResponse-Richtlinie mit der folgenden Definition:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <SanitizeModelResponse async="false" continueOnError="false" enabled="true" name="SMR-modelresponse"> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <DisplayName>SMR-modelresponse</DisplayName> <ModelArmor> <TemplateName>projects/{project}/locations/{location}/templates/{template-name}</TemplateName> </ModelArmor> <LLMResponseSource>{response_partial}</LLMResponseSource> <!-- Use the below settings if you want to call a Model Armor policy on every event --> <LLMResponseSource>{response.event.current.content}</LLMResponseSource> </SanitizeModelResponse>
- Optional: Fügen Sie eine JavaScript-Richtlinie hinzu, um Ereignisse zu gruppieren, bevor sie an die Apigee Model Armor-Richtlinie gesendet werden.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Javascript continueOnError="false" enabled="true" timeLimit="200" name="JS-combine-resp"> <DisplayName>JS-combine-events</DisplayName> <Properties/> <Source> var eventText = JSON.parse(context.getVariable("response.event.current.content").substring(5)).candidates[0].content.parts[0].text; var finishReason = JSON.parse(context.getVariable("response.event.current.content").substring(5)).candidates[0].finishReason; var idx = context.getVariable("response.event.current.count"); if(idx%5==0 || finishReason=="STOP") { context.setVariable("response_partial", context.getVariable("tmp_buffer_pre")); context.setVariable("buff_ready", true); context.setVariable("tmp_buffer_pre", ""); } else { context.setVariable("buff_ready", false); context.setVariable("response_partial", ""); var previousBufferVal = context.getVariable("tmp_buffer_pre"); if(previousBufferVal) { context.setVariable("tmp_buffer_pre", previousBufferVal+eventText); } else { context.setVariable("tmp_buffer_pre", eventText); } } </Source> </Javascript>
- Fügen Sie die JavaScript- und ModelArmor-Richtlinien einem Schritt im
EventFlow
des Proxys hinzu:<EventFlow name="EventFlow" content-type="text/event-stream"> <Request/> <Response> <Step> <Name>JS-combine-resp</Name> </Step> <Step> <!-- Remove below Condition if you want to call model armor policy on every event --> <Condition> buff_ready = true </Condition> <Name>SMR-modelresponse</Name> </Step> </Response> </EventFlow>
- Stellen Sie den API-Proxy bereit und testen Sie ihn.
Fehlerbehandlung im EventFlow
Standardmäßig wird der Ereignisstream beendet, wenn ein Fehler auftritt. Wenn Sie jedoch zusätzliche Fehlerbehebung durchführen möchten, können Sie Fehlerinformationen wie in diesem Beispiel an Cloud Logging senden.
- Erstellen Sie einen neuen Proxy mit der SSE-Proxyvorlage. Weitere Informationen finden Sie unter API-Proxy mit vom Server gesendeten Ereignissen (SSE) erstellen.
- Öffnen Sie den Proxy im Apigee-Proxy-Editor und klicken Sie auf den Tab Entwickeln.
- Erstellen Sie eine neue RaiseFault-Richtlinie mit der folgenden Definition:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <RaiseFault continueOnError="false" enabled="true" name="RF-Empty-Event"> <DisplayName>RF-Empty-Event</DisplayName> <Properties/> <FaultResponse> <AssignVariable> <Name>faultReason</Name> <Value>empty-event</Value> </AssignVariable> </FaultResponse> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> </RaiseFault>
- Hängen Sie die RaiseFault-Richtlinie an
EventFlow
des SSE-Proxys an:<EventFlow content-type="text/event-stream"> <Response> <Step> <Name>RF-Empty-Event</Name> <Condition>response.event.current.content ~ "data: "</Condition> </Step> </Response> </EventFlow>
- Erstellen Sie eine MessageLogging-Richtlinie, um Fehler zu protokollieren. Beispiel:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <MessageLogging continueOnError="false" enabled="true" name="ML-log-error"> <DisplayName>ML-log-error</DisplayName> <CloudLogging> <LogName>projects/{organization.name}/logs/apigee_errors</LogName> <Message contentType="text/plain">Request failed due to {faultReason}.</Message> <ResourceType>api</ResourceType> </CloudLogging> <logLevel>ALERT</logLevel> </MessageLogging>
- Fügen Sie die MessageLogging-Richtlinie den FaultRules des Zielendpunkts hinzu:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <TargetEndpoint name="TargetEndpoint-1"> <Description/> <FaultRules> <FaultRule name="default-fault"> <Step> <Name>ML-log-error</Name> </Step> </FaultRule> </FaultRules> ... </TargetEndpoint>
- Stellen Sie den API-Proxy bereit und testen Sie ihn.
Fehler in einem EventFlow weiterleiten
In diesem Beispiel wird gezeigt, wie Sie mit einem EventFlow
Fehler an den Client weitergeben.
Der Prozess benachrichtigt den Client sofort während der Richtlinienausführung über Fehler.
- Erstellen Sie einen neuen Proxy mit der SSE-Proxyvorlage. Weitere Informationen finden Sie unter API-Proxy mit vom Server gesendeten Ereignissen (SSE) erstellen.
- Öffnen Sie den Proxy im Apigee-Proxy-Editor und klicken Sie auf den Tab Entwickeln.
- Erstellen Sie eine neue JavaScript-Richtlinie mit der folgenden Definition:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Javascript continueOnError="false" enabled="true" timeLimit="200" name="js-error"> <DisplayName>js-error</DisplayName> <Properties/> <Source> if(context.getVariable("response.event.current.count")=="2") { throw new Error("Internal Error"); } context.setVariable("response.event.current.content", context.getVariable("response.event.current.content")); </Source> </Javascript>
Diese Richtlinie ist so konzipiert, dass ein Fehler ausgegeben wird, wenn eine bestimmte Bedingung erfüllt ist.
- Hängen Sie die JavaScript-Richtlinie an
EventFlow
des SSE-Proxys in derTargetEndpoint
-Konfiguration an. Mit diesem Schritt wird sichergestellt, dass der EventFlow die Richtlinie während der Antwortverarbeitung verarbeitet:<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <TargetEndpoint name="default"> <EventFlow content-type="text/event-stream"> <Response> <Step> <Name>js-error</Name> </Step> </Response> </EventFlow> <HTTPTargetConnection> <URL>https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:streamGenerateContent</URL> </HTTPTargetConnection> </TargetEndpoint>
- Stellen Sie den API-Proxy bereit.
- Testen Sie das Proxyverhalten mit dem folgenden
curl
-Befehl:curl -X POST -H 'Content-Type: application/json' "https://ENVIRONMENT_GROUP_NAME/llm-api" -d '{ "contents":[{"parts":[{"text": "Write a story about a magic pen."}]}]}'
Ersetzen Sie ENVIRONMENT_GROUP_NAME durch den Namen Ihrer Umgebungsgruppe.
Die Ausgabe sollte in etwa so aussehen:
data: {"candidates": [{"content": {"parts": [{"text": "El"}],"role": "model"}}],"usageMetadata": {"promptTokenCount": 8,"totalTokenCount": 8},"modelVersion": "gemini-2.5-flash"} data: {"fault":{"faultstring":"Execution of JS-error failed with error: Exception thrown from JavaScript : Error: Internal Error (Resource_1_js#2)","detail":{"errorcode":"steps.javascript.ScriptExecutionFailed"}}}
In der Ausgabe wird der ursprüngliche Datenstream gefolgt von der Meldung
fault
angezeigt. Im Fehlerfall erfasst Apigee die Fehlerinformationen und sendet sie als Ereignis an den Client.
Weitere Informationen zur Fehlerbehandlung in Apigee finden Sie unter Umgang mit Fehlern.
SSE-Daten in Apigee Analytics ansehen
Daten für SSE-Proxys werden wie für jeden API-Proxy in Apigee Analytics angezeigt. Rufen Sie in der Cloud Console Analysen > API-Messwerte auf.
SSE-Proxys debuggen
Verwenden Sie das Apigee-Debugging-Tool, um SSE-Proxys zu debuggen.
Debug-Daten werden für EventFlow
genauso erfasst wie für die anderen Ablaufarten.
Fehlerbehebung
Bei Problemen mit Echtzeitverkehrsdaten können Sie die Ursache in den Apigee-Zugriffsprotokollen ermitteln.
Beschränkungen
Für SSE-Proxys gelten die folgenden Einschränkungen:
- Da Analysedaten erst nach dem Schließen der SSE-Sitzung erfasst werden, kann es zu einer gewissen Verzögerung bei der Berichterstellung kommen.
- Fehler in einem EventFlow führen dazu, dass der Stream sofort beendet wird und ein Fehler ausgegeben wird. Informationen zum manuellen Protokollieren dieser Arten von Fehlern oder zum Senden an den Client finden Sie unter EventFlow-Anwendungsfälle und -Beispiele.
- Ein Client, der gestreamte SSE-Antworten empfängt, erhält die
HTTP
-Header, einschließlich aller Statuscodes, am Anfang des Ereignisstreams. Wenn der Ereignisstream in einen Fehlerstatus wechselt, spiegelt der ursprünglich empfangene Statuscode den Fehlerstatus nicht wider.Diese Einschränkung ist beim Aufrufen einer Fehlerbehebungssitzung zu sehen. In der Sitzung sehen Sie möglicherweise, dass sich der Statuscode
HTTP
für Streams, die in den Fehlerstatus wechseln, von den Statuscodes unterscheidet, die an den Client gesendet werden. Das kann passieren, weil der Debug-Sitzungseintrag erst generiert wird, nachdem die gesamte Anfrage verarbeitet wurde, und nicht am Anfang des Ereignisstreams. In der Debugging-Sitzung wird möglicherweise der vom Fehler generierte Fehlercode angezeigt, während der Client anfangs nur den in den Headern empfangenen 2xx-Status sieht.