0Pricing
AI Agents · Lekcja

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 complete

print() 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_response

Zbieranie 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_reason

Kolory 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') — yellow

Biblioteka 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_text

Strumieniowanie 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=True lub sys.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 rich dla 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_reason w ostatnim fragmencie, aby wykryć obcięcie odpowiedzi
  • Użyć async for wraz z AsyncOpenAI w 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

  1. Tworzenie interfejsów agentów wiersza poleceń
  2. Agenci interaktywni w stylu REPL
  3. Parsowanie argumentów i tekst pomocy
  4. Strumieniowanie wyników w agentach CLI
← Powrót do AI Agents