Strumieniowanie wyników w agentach CLI
Wyświetlanie strumieniowanych tokenów znak po znaku w interfejsach terminalowych.
Strumieniowanie wyników w agentach CLI to bezpłatna lekcja AI Agents na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej AI Agents, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs AI Agents zawiera 4 lekcji w sumie.
Dlaczego strumieniowanie ma znaczenie w agentach CLI
Bez strumieniowania agent CLI nie wyświetla niczego, dopóki cała odpowiedź LLM nie będzie gotowa — może to potrwać od 5 do 30 sekund. Użytkownicy patrzą na pusty terminal i zastanawiają się, czy program się nie zawiesił.
Dzięki strumieniowaniu tokeny pojawiają się w miarę ich generowania, zapewniając natychmiastową informację zwrotną i znacznie lepsze doświadczenia.
Włączanie strumieniowania w OpenAI SDK
Przekaż stream=True do chat.completions.create(). Wywołanie zwraca generator zamiast kompletnego obiektu odpowiedzi. Iteruj po nim, aby przetwarzać fragmenty w miarę ich napływania.
import openai
client = openai.OpenAI(api_key='YOUR_API_KEY')
stream = client.chat.completions.create(
model='gpt-4o-mini',
messages=[{'role': 'user', 'content': 'Explain Python generators in 3 sentences.'}],
stream=True # <-- enable streaming
)
# Each chunk arrives as it is generated
for chunk in stream:
delta = chunk.choices[0].delta
if delta.content:
print(delta.content, end='', flush=True)
print() # newline after the response is completeprint() a sys.stdout.write()
Podczas strumieniowania używaj print(text, end='', flush=True) lub sys.stdout.write(text), a następnie sys.stdout.flush(). Bez flush=True Python może buforować dane wyjściowe i wyświetlić je wszystkie naraz, niwecząc cel strumieniowania.
import sys
import openai
client = openai.OpenAI(api_key='YOUR_API_KEY')
def stream_to_terminal(messages: list):
stream = client.chat.completions.create(
model='gpt-4o-mini',
messages=messages,
stream=True
)
full_response = ''
for chunk in stream:
token = chunk.choices[0].delta.content or ''
full_response += token
# Option 1: print with flush
print(token, end='', flush=True)
# Option 2: sys.stdout.write + flush
# sys.stdout.write(token)
# sys.stdout.flush()
print() # final newline
return full_responseZbieranie pełnej odpowiedzi podczas strumieniowania
Po zakończeniu strumieniowania często potrzebny jest pełny tekst odpowiedzi — do zapisania, dalszego przetwarzania lub wyświetlenia. W miarę wyświetlania tokenów należy gromadzić je w jednym ciągu znaków.
import openai
client = openai.OpenAI(api_key='YOUR_API_KEY')
def stream_and_collect(messages: list) -> str:
full_text = ''
print('Agent: ', end='', flush=True)
stream = client.chat.completions.create(
model='gpt-4o-mini',
messages=messages,
stream=True
)
for chunk in stream:
token = chunk.choices[0].delta.content or ''
full_text += token
print(token, end='', flush=True)
print() # newline
return full_text
# The return value contains the complete response for storage
# response_text = stream_and_collect(history)
# history.append({'role': 'assistant', 'content': response_text})Asynchroniczne strumieniowanie z AsyncOpenAI
W przypadku asynchronicznych architektur agentów należy użyć AsyncOpenAI i async for, aby iterować po strumieniowanych fragmentach bez blokowania pętli zdarzeń.
import asyncio
import openai
async def async_stream_agent(query: str) -> str:
client = openai.AsyncOpenAI(api_key='YOUR_API_KEY')
stream = await client.chat.completions.create(
model='gpt-4o-mini',
messages=[{'role': 'user', 'content': query}],
stream=True
)
full_text = ''
print('Agent: ', end='', flush=True)
async for chunk in stream:
token = chunk.choices[0].delta.content or ''
full_text += token
print(token, end='', flush=True)
print()
return full_text
# asyncio.run(async_stream_agent('What is asyncio?'))Wykrywanie końca strumienia za pomocą finish_reason
Ostatni fragment strumienia ma niepustą wartość finish_reason. Należy ją sprawdzić, aby dowiedzieć się, dlaczego strumień się zakończył: 'stop' = normalne zakończenie, 'length' = obcięcie, 'tool_calls' = wymagane wywołanie funkcji.
import openai
client = openai.OpenAI(api_key='YOUR_API_KEY')
def stream_with_finish_detection(messages: list):
stream = client.chat.completions.create(
model='gpt-4o-mini',
messages=messages,
stream=True
)
finish_reason = None
for chunk in stream:
delta = chunk.choices[0].delta
if delta.content:
print(delta.content, end='', flush=True)
if chunk.choices[0].finish_reason:
finish_reason = chunk.choices[0].finish_reason
print()
if finish_reason == 'length':
print('[WARNING: Response was truncated. Try increasing max_tokens.]')
elif finish_reason == 'stop':
pass # normal completion
return finish_reasonKolory ANSI w danych wyjściowych terminala
Kody sterujące ANSI dodają kolor do danych wyjściowych terminala. Można ich użyć do wizualnego odróżnienia prefiksu agenta, monitu o dane użytkownika i ostrzeżeń. Biblioteka colorama zapewnia obsługę wielu platform, w tym systemu Windows.
# pip install colorama
from colorama import Fore, Style, init
init(autoreset=True) # reset color after each print
def print_colored_stream(messages: list, client):
# Print agent prefix in cyan
print(Fore.CYAN + 'Agent: ' + Style.RESET_ALL, end='', flush=True)
stream = client.chat.completions.create(
model='gpt-4o-mini',
messages=messages,
stream=True
)
for chunk in stream:
token = chunk.choices[0].delta.content or ''
print(token, end='', flush=True)
print()
# Also useful:
# print(Fore.GREEN + 'Success!') — green
# print(Fore.RED + 'Error!') — red
# print(Fore.YELLOW + 'Warning') — yellowBiblioteka Rich do tworzenia bogatszych danych wyjściowych terminala
Biblioteka rich zapewnia renderowanie Markdown, podświetlanie składni w blokach kodu, tabele i animacje ładowania w terminalu. Dobrze współpracuje ze strumieniowanymi danymi wyjściowymi agenta.
# pip install rich
from rich.console import Console
from rich.live import Live
from rich.markdown import Markdown
console = Console()
def stream_with_rich(messages: list, client):
full_text = ''
with Live(console=console, refresh_per_second=10) as live:
stream = client.chat.completions.create(
model='gpt-4o-mini',
messages=messages,
stream=True
)
for chunk in stream:
token = chunk.choices[0].delta.content or ''
full_text += token
# Render accumulated text as Markdown in real time
live.update(Markdown(full_text))
return full_textStrumieniowanie z wywołaniami narzędzi
Gdy strumieniowanie jest połączone z wywoływaniem funkcji, pole tool_calls również jest przesyłane we fragmentach. Należy gromadzić ciąg JSON z kolejnych fragmentów przed jego sparsowaniem.
import json
import openai
client = openai.OpenAI(api_key='YOUR_API_KEY')
def stream_with_tools(messages: list, tools: list) -> dict:
stream = client.chat.completions.create(
model='gpt-4o-mini',
messages=messages,
tools=tools,
stream=True
)
tool_call_chunks = {}
for chunk in stream:
delta = chunk.choices[0].delta
if delta.tool_calls:
for tc in delta.tool_calls:
idx = tc.index
if idx not in tool_call_chunks:
tool_call_chunks[idx] = {'name': '', 'args': ''}
if tc.function.name:
tool_call_chunks[idx]['name'] += tc.function.name
if tc.function.arguments:
tool_call_chunks[idx]['args'] += tc.function.arguments
# Parse accumulated tool calls
return {v['name']: json.loads(v['args']) for v in tool_call_chunks.values()}Wyświetlanie licznika tokenów
Podczas strumieniowania należy wyświetlać aktualny licznik tokenów, aby ułatwić użytkownikom monitorowanie wykorzystania i zrozumienie kosztów. Strumień OpenAI zawiera dane o wykorzystaniu w ostatnim fragmencie, gdy ustawiono stream_options={'include_usage': True}.
import openai
client = openai.OpenAI(api_key='YOUR_API_KEY')
def stream_with_token_count(messages: list):
stream = client.chat.completions.create(
model='gpt-4o-mini',
messages=messages,
stream=True,
stream_options={'include_usage': True}
)
for chunk in stream:
delta = chunk.choices[0].delta
if delta.content:
print(delta.content, end='', flush=True)
# Last chunk includes usage
if chunk.usage:
print(f'\n[Tokens: prompt={chunk.usage.prompt_tokens}, '
f'completion={chunk.usage.completion_tokens}, '
f'total={chunk.usage.total_tokens}]')Najlepsze praktyki strumieniowania
Podsumowanie najlepszych praktyk dotyczących strumieniowanych danych wyjściowych agentów CLI:
- Zawsze używaj
flush=Truelubsys.stdout.flush(), aby zapobiec buforowaniu - Po zakończeniu strumieniowania gromadź tokeny w jednym ciągu znaków, aby można było je zapisać
- Sprawdzaj
finish_reason, aby wykrywać obcięcie odpowiedzi - Używaj kolorów ANSI lub
richdla lepszej czytelności wizualnej - Obsługuj strumieniowanie wywołań narzędzi, gromadząc fragmenty argumentów w formacie JSON
Sprawdzenie wiedzy: strumieniowane dane wyjściowe
Sprawdź swoją wiedzę na temat strumieniowanych danych wyjściowych w agentach CLI.
Podsumowanie: strumieniowe wyjście w agentach CLI
Mogą Państwo teraz tworzyć strumieniowych agentów CLI, którzy działają responsywnie i nowocześnie:
- Przekazać
stream=True, aby włączyć strumieniowanie w OpenAI SDK - Użyć
print(token, end='', flush=True), aby natychmiast wyświetlać tokeny - Gromadzić tokeny w ciągu znaków do przetwarzania po zakończeniu strumieniowania
- Sprawdzać
finish_reasonw ostatnim fragmencie, aby wykryć obcięcie odpowiedzi - Użyć
async forwraz zAsyncOpenAIw agentach asynchronicznych - Dodać kolory ANSI lub
rich, aby zapewnić dopracowaną obsługę terminala
Często zadawane pytania
Czy lekcja „Strumieniowanie wyników w agentach CLI” jest bezpłatna?
Tak — pełny tekst „Strumieniowanie wyników w agentach CLI” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu AI Agents, przejdź na CoddyKit PRO. Kurs AI Agents zawiera 4 lekcji w sumie.
Co nauczysz się w „Strumieniowanie wyników w agentach CLI”?
Wyświetlanie strumieniowanych tokenów znak po znaku w interfejsach terminalowych. Ćwiczysz AI Agents z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć AI Agents?
Nie wymagamy żadnego doświadczenia. AI Agents w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.
Ile czasu zajmuje lekcja „Strumieniowanie wyników w agentach CLI”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji AI Agents?
Tak. Każda lekcja AI Agents zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Tworzenie interfejsów agentów wiersza poleceń
- Agenci interaktywni w stylu REPL
- Parsowanie argumentów i tekst pomocy
- Strumieniowanie wyników w agentach CLI