Files
stream-rezhim-ai-agenta/client.py
T

71 lines
3.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# client.py
"""
Интерактивный CLI для LangChain‑агента, работающего в режиме stream.
"""
from langchain.agents import create_agent # обязательный стек
from langchain.tools import tool # обязательный стек
from rich import print as rprint # обязательный стек
# ------------------------------------------------------------------
# Определяем простейший инструмент (для демонстрации)
# ------------------------------------------------------------------
@tool("echo")
def echo_tool(input: str) -> str:
"""
Возвращает введённую строку без изменений.
"""
return input
# ------------------------------------------------------------------
# Создаём агента с одним инструментом
# ------------------------------------------------------------------
agent = create_agent(
tools=[echo_tool], # список доступных инструментов
verbose=True, # включаем вывод логов (необязательно)
)
# ------------------------------------------------------------------
# Основной цикл CLI
# ------------------------------------------------------------------
def main() -> None:
"""
Запускает бесконечный цикл чтения пользовательского ввода и
передаёт его агенту в режиме stream. Ответы печатаются токен за токеном.
"""
rprint("[bold green]LangChain StreamAgent CLI[/bold green]")
rprint("Введите сообщение (Ctrl+C для выхода):")
try:
while True:
# Читаем ввод пользователя
user_input = input("> ").strip()
if not user_input:
continue
# Формируем запрос к агенту
stream = agent.stream(
{"messages": [{"role": "human", "content": user_input}]},
stream_mode=["messages", "updates"],
)
# Перебираем события из потока и выводим их
for event in stream:
# Событие может быть либо токеном сообщения, либо обновлением состояния
if isinstance(event, dict) and "type" in event:
# Обновление (например, вызов инструмента)
rprint(f"[yellow]Update: {event}[/yellow]")
else:
# Токен текста
rprint(event, end="", flush=True)
# После завершения потока выводим перевод строки
rprint("\n")
except KeyboardInterrupt:
rprint("\n[bold red]Выход из программы.[/bold red]")
if __name__ == "__main__":
main()