ominiverdi@minto:~/tmp/olllama_exp$ python3 stream_stop.py Press 'd' to stop the stream... The rain in Aethelgard wasn’t just rain; it was memory. It fell as a shimmering, silver mist, carrying whispers of forgotten tales and half-remembered emotions. And it always, inevitably, led to the Obsidian Library. It wasn't built, not in the way humans understood it. It simply *was*, nestled within a perpetually twilight valley, [Stopping...] ominiverdi@minto:~/tmp/olllama_exp$ cat stream_stop.py import requests import json import sys import termios import tty import threading # Flag to track if we should stop streaming stop_streaming = False # Function to handle 'd' key press def key_listener(): global stop_streaming print("Press 'd' to stop the stream...") # Set terminal to raw mode old_settings = termios.tcgetattr(sys.stdin) try: tty.setraw(sys.stdin.fileno()) while not stop_streaming: # Check for key press if sys.stdin.read(1) == 'd': stop_streaming = True print("\n[Stopping...]") break finally: termios.tcsetattr(sys.stdin, termios.TCSADRAIN, old_settings) # Start key listener thread listener = threading.Thread(target=key_listener) listener.daemon = True listener.start() # Make streaming request url = "http://localhost:11434/api/generate" payload = { "model": "gemma3", "prompt": "Write a fantasy story about a magical library", "stream": True } try: response = requests.post(url, json=payload, stream=True) for line in response.iter_lines(): if stop_streaming: break if line: chunk = json.loads(line) if "response" in chunk: print(chunk["response"], end="", flush=True) if chunk.get("done", False): break except Exception as e: print(f"\nError: {e}") finally: stop_streaming = True