# Assignment Description (English)

## Goal

Upgrade the agent from the previous assignment: replace the single `.invoke()` call with streaming output via `.stream()`, so that the response appears in the console token‑by‑token instead of after the entire generation.

---

## Background

In the previous assignment the agent was invoked with `.invoke()`, which returned the result only after the agent finished all its work. For long answers or when the agent calls several tools this can look like a hang.

**Stream mode** allows receiving the answer token by token in real time, just like ChatGPT or any other chat interface.

---

## What to do

1. **Replace `.invoke()` with `.stream()`**
   ```python
   # before
   answer = agent.invoke({"messages": [{"role": "human", "content": "..."}]})
   # after
   stream = agent.stream({"messages": [{"role": "human", "content": "..."}]}, stream_mode=["messages", "updates"])
   ```
   `stream_mode` is a list of modes. You can pass one or both:
   * `'messages'` – each token of the text as it is generated.
   * `'updates'` – events about state changes (tool calls, step finishes).

2. **Iterate over the chunks**
   ```python
   for chunk in stream:
       chunk_type, chunk_data = chunk
       if chunk_type == 'messages':
           # token stream
       elif chunk_type == 'updates':
           # state update
   ```

3. **Handle `'messages'` chunks**
   ```python
   message, meta = chunk_data
   if meta['langgraph_step'] != step:
       step = meta['langgraph_step']
       print('\n---\n')
   if message.content:
       print(message.content, end='', flush=True)
   ```

4. **Handle `'updates'` chunks**
   ```python
   if chunk_type == 'updates' and chunk_data.get('model'):
       last_message = chunk_data['model']['messages'][-1]
       print(format_message(last_message))
   ```
   The helper `format_message` is the same as used for `.invoke()`.

---

## Final script structure

```python
# import LLM and tools
# define the tool
# create the agent
# run the stream
# iterate over chunks and print
# finally print the full result
```

---

## Expected output

The console should show the text gradually, with each new agent step separated by a divider. For example:
```
---
get_price({'product': 'milk', 'city': 'Kazan'})
---
Milk in Kazan: 89 rub.
---
```