Flugbriefing
Lauffähige Beispiele für Pre-Flight- und En-Route-Briefings mit dem Endpoint Flugbriefing. Die API liefert eine von IBM Granite generierte Zusammenfassung zusammen mit strukturierten Abschnitten zu Wetter und NOTAMs.
| # | Frage | Verwendete Daten |
|---|---|---|
| 1 | Ein vollständiges Briefing für KJFK → KLAX erstellen und die Zusammenfassung anzeigen | Flugbriefing |
| 2 | NOTAM-Highlights aus einem Briefing für EGLL → OMDB anzeigen | Flugbriefing |
Voraussetzungen
x-api-key bei jeder Anfrage (Direktabonnement). Mehr erfahren →Installation
Die folgenden Skripte verwenden requests für API-Aufrufe und rich für die Terminalausgabe. Einmalig installieren:
pip install requests rich1. Vollständige Zusammenfassung des Flugbriefings
Frage: Erstellen Sie ein JSON-Flugbriefing für KJFK → KLAX und zeigen Sie die KI-Zusammenfassung und die Wetterbedingungen an.
Die Antwort ist strukturiertes JSON mit summary, origin_briefing und destination_briefing oder reiner Text mit einem briefing-Schlüssel — das Skript verarbeitet beides. Die Erstellung eines Briefings kann bis zu ~90 Sekunden dauern; das Skript wiederholt die Anfrage bei 503 einmal.
import os
import time
import requests
from rich.console import Console
from rich.panel import Panel
from rich.table import Table
console = Console()
HEADERS = {
"X-RapidAPI-Key": os.getenv("RAPIDAPI_KEY", "YOUR_RAPIDAPI_KEY"),
"X-RapidAPI-Host": "skylink-api.p.rapidapi.com",
}
BASE = "https://skylink-api.p.rapidapi.com"
def fetch_briefing(origin: str, destination: str) -> dict | None:
params = {
"origin": origin,
"destination": destination,
"include_weather": "true",
"include_notams": "true",
"format": "json",
}
for attempt in range(2):
try:
r = requests.get(
f"{BASE}/briefing/flight",
headers=HEADERS,
params=params,
timeout=(10, 100),
)
except requests.exceptions.Timeout:
if attempt == 0:
time.sleep(5)
continue
return None
if r.status_code == 404:
return None
if r.status_code in (502, 503, 504):
if attempt == 0:
time.sleep(8)
continue
return None
r.raise_for_status()
return r.json()
return None
def weather_snippet(airport_briefing: dict | None) -> str:
if not airport_briefing:
return "—"
wx = airport_briefing.get("weather") or {}
metar = wx.get("metar_raw")
if metar:
return metar[:72] + ("…" if len(metar) > 72 else "")
taf = wx.get("taf_raw")
if taf:
return f"TAF only: {taf[:60]}…"
return "No METAR/TAF in briefing"
def main() -> None:
data = fetch_briefing("KJFK", "KLAX")
if not data:
console.print("[yellow]No briefing returned.[/]")
return
if "briefing" in data and "summary" not in data:
console.print(Panel(data["briefing"], title="Flight Briefing (text)"))
return
summary = data.get("summary")
if summary:
console.print(Panel(summary, title="Briefing Summary (AI-generated — IBM Granite)"))
table = Table(title="Weather (METAR excerpt)")
table.add_column("Airport", style="cyan")
table.add_column("Observation")
origin = data.get("origin_briefing")
destination = data.get("destination_briefing")
table.add_row(f"Departure ({data.get('origin', 'KJFK')})", weather_snippet(origin))
table.add_row(f"Arrival ({data.get('destination', 'KLAX')})", weather_snippet(destination))
console.print(table)
restrictions = data.get("critical_restrictions") or []
if restrictions:
console.print(Panel("\n".join(f"• {x}" for x in restrictions), title="Critical restrictions"))
console.print(
"\n[dim]Briefing summary is AI-generated. Always verify critical weather "
"conditions directly against METAR and TAF before flight.[/dim]"
)
if __name__ == "__main__":
main()Ausgabe: Ein Panel mit der KI-generierten Zusammenfassung, eine Tabelle mit METAR-Auszügen für Abflug und Ankunft sowie optionale Aufzählungspunkte zu kritischen Einschränkungen. Fällt auf reinen Text zurück, wenn die API statt strukturiertem JSON einen briefing-String liefert.
2. NOTAM-Highlights aus einem Briefing
Frage: Welche NOTAMs sind an Abflug- und Ankunftsflughafen der Route EGLL → OMDB aktiv?
import os
import time
import requests
from rich.console import Console
from rich.panel import Panel
from rich.table import Table
console = Console()
HEADERS = {
"X-RapidAPI-Key": os.getenv("RAPIDAPI_KEY", "YOUR_RAPIDAPI_KEY"),
"X-RapidAPI-Host": "skylink-api.p.rapidapi.com",
}
BASE = "https://skylink-api.p.rapidapi.com"
def fetch_briefing(origin: str, destination: str) -> dict | None:
params = {
"origin": origin,
"destination": destination,
"include_weather": "false",
"include_notams": "true",
"format": "json",
}
for attempt in range(2):
try:
r = requests.get(
f"{BASE}/briefing/flight",
headers=HEADERS,
params=params,
timeout=(10, 100),
)
except requests.exceptions.Timeout:
if attempt == 0:
time.sleep(5)
continue
return None
if r.status_code == 404:
return None
if r.status_code in (502, 503, 504):
if attempt == 0:
time.sleep(8)
continue
return None
r.raise_for_status()
return r.json()
return None
def print_notam_table(label: str, notams: list[dict]) -> None:
top = notams[:3]
table = Table(title=f"NOTAMs — {label} (top {len(top)})")
table.add_column("NOTAM ID", style="cyan", min_width=12)
table.add_column("Body (truncated)")
for notam in top:
notam_id = notam.get("notam_id") or notam.get("id") or "—"
body = notam.get("body") or notam.get("raw") or "—"
body_short = body[:80] + ("…" if len(body) > 80 else "")
table.add_row(str(notam_id), body_short)
console.print(table)
def main() -> None:
data = fetch_briefing("EGLL", "OMDB")
if not data:
console.print("[yellow]No briefing returned.[/]")
return
if "briefing" in data and "origin_briefing" not in data:
console.print(Panel(data["briefing"], title="Flight Briefing (text — no structured NOTAMs)"))
return
origin = data.get("origin_briefing") or {}
destination = data.get("destination_briefing") or {}
dep_notams = origin.get("notams") or []
arr_notams = destination.get("notams") or []
if not dep_notams and not arr_notams:
console.print("[yellow]No NOTAMs embedded in briefing response.[/]")
summary = data.get("summary") or data.get("briefing")
if summary:
console.print(Panel(str(summary), title="Briefing summary"))
return
if dep_notams:
print_notam_table(f"Departure (EGLL) — {len(dep_notams)} total", dep_notams)
else:
console.print("[dim]No departure NOTAMs in briefing.[/]")
if arr_notams:
print_notam_table(f"Arrival (OMDB) — {len(arr_notams)} total", arr_notams)
else:
console.print("[dim]No arrival NOTAMs in briefing.[/]")
if __name__ == "__main__":
main()Ausgabe: Bis zu drei NOTAMs pro Flughafen aus origin_briefing.notams und destination_briefing.notams. Fällt auf das Textfeld briefing zurück, wenn kein strukturiertes JSON verfügbar ist.