Add assignment description in English
This commit is contained in:
@@ -0,0 +1,82 @@
|
||||
# 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.
|
||||
---
|
||||
```
|
||||
Reference in New Issue
Block a user