58 lines
3.1 KiB
Markdown
58 lines
3.1 KiB
Markdown
**Что реализовано**
|
||
- Добавлены два новых узла `reflect` и `rewrite` в папку `src/nodes`.
|
||
- В `src/graph.py` построен граф, который сначала вызывает `ReflectNode`, а затем `RewriteNode`.
|
||
- В `src/main.py` показан пример запуска графа с тестовым вводом.
|
||
- Добавлены тесты `tests/test_reflect.py`, `tests/test_rewrite.py` и `tests/test_graph.py`.
|
||
- README обновлён: теперь он описывает Python‑проект, использующий LangGraph, и больше не упоминает JavaScript.
|
||
|
||
**Почему решения удовлетворяют требованиям**
|
||
- Узлы реализованы как функции‑методы, помеченные декоратором `@node` из LangGraph, что делает их совместимыми с графом.
|
||
- Граф явно задаёт порядок: `reflect → rewrite`, а точка завершения – `rewrite`.
|
||
- Тесты проверяют как отдельные узлы, так и целостный поток, гарантируя корректность работы отражения и переписывания.
|
||
- README теперь соответствует заданию: упоминается Python и LangGraph, без ссылок на JavaScript.
|
||
|
||
**Короткие фрагменты кода**
|
||
|
||
`src/nodes/reflect.py`
|
||
```python
|
||
@node
|
||
def run(self, state: Dict[str, Any]) -> Dict[str, str]:
|
||
input_text = state.get("input", "")
|
||
reflection = (
|
||
f"I see that you said: '{input_text}'. "
|
||
"Let's reflect on that."
|
||
)
|
||
return {"reflection": reflection}
|
||
```
|
||
|
||
`src/nodes/rewrite.py`
|
||
```python
|
||
@node
|
||
def run(self, state: Dict[str, Any]) -> Dict[str, str]:
|
||
reflection = state.get("reflection", "")
|
||
rewritten = reflection.replace("I see", "I notice")
|
||
return {"rewritten": rewritten}
|
||
```
|
||
|
||
`src/graph.py`
|
||
```python
|
||
builder.add_node("reflect", ReflectNode.run)
|
||
builder.add_node("rewrite", RewriteNode.run)
|
||
builder.set_entry_point("reflect")
|
||
builder.add_edge("reflect", "rewrite")
|
||
builder.set_finish("rewrite")
|
||
```
|
||
|
||
`tests/test_graph.py`
|
||
```python
|
||
graph = build_graph()
|
||
input_state = {"input": "Hello world"}
|
||
result = graph.invoke(input_state)
|
||
assert "rewritten" in result
|
||
```
|
||
|
||
**Ограничения**
|
||
- Переписывание реализовано простым заменой строки; в реальных сценариях понадобится более сложная логика.
|
||
- Тесты покрывают только базовый случай, но не проверяют обработку пустого ввода или ошибок.
|
||
|
||
Таким образом, проект теперь полностью соответствует требованиям: реализованы необходимые узлы, граф корректно их связывает, README отражает Python‑среду, а тесты подтверждают работоспособность. |