71 lines
2.9 KiB
Python
71 lines
2.9 KiB
Python
# client.py
|
||
|
||
"""
|
||
Интерактивный CLI для взаимодействия с LangChain‑агентом.
|
||
Агент использует потоковый вывод через .stream(), чтобы ответы
|
||
появлялись в консоли по мере генерации.
|
||
|
||
Требуемый стек:
|
||
- langchain.agents.create_agent
|
||
- @tool из langchain.tools
|
||
- rich.print (переименовано как rprint)
|
||
"""
|
||
|
||
from langchain.agents import create_agent
|
||
from langchain.tools import tool
|
||
from rich import print as rprint
|
||
|
||
# ------------------------------------------------------------------
|
||
# Определяем инструмент. В реальном проекте здесь может быть любой
|
||
# полезный код, например запрос к API или обработка данных.
|
||
# Для демонстрации будем просто возвращать строку с аргументом.
|
||
# ------------------------------------------------------------------
|
||
@tool("echo")
|
||
def echo_tool(message: str) -> str:
|
||
"""
|
||
Инструмент «echo» – повторяет переданное сообщение.
|
||
|
||
Args:
|
||
message (str): Текст, который нужно вернуть.
|
||
|
||
Returns:
|
||
str: Тот же текст, но обёрнутый в строку.
|
||
"""
|
||
return f"Echo: {message}"
|
||
|
||
# ------------------------------------------------------------------
|
||
# Создаём агент. В качестве LLM будем использовать встроенный
|
||
# LangChain‑LLM (например, OpenAI). Поскольку в условии не указано,
|
||
# что именно использовать, оставляем стандартный вариант.
|
||
# ------------------------------------------------------------------
|
||
agent = create_agent(
|
||
tools=[echo_tool],
|
||
verbose=True # включаем логирование для отладки
|
||
)
|
||
|
||
def main() -> None:
|
||
"""
|
||
Основной цикл CLI. Пользователь вводит запросы,
|
||
агент обрабатывает их и выводит ответ токен за токеном.
|
||
"""
|
||
rprint("[bold green]LangChain Stream Agent[/bold green]")
|
||
rprint("Введите ваш запрос (Ctrl+C для выхода):")
|
||
|
||
try:
|
||
while True:
|
||
user_input = input("> ")
|
||
if not user_input.strip():
|
||
continue
|
||
|
||
# Запускаем потоковый вывод
|
||
stream = agent.stream(user_input)
|
||
|
||
# Итерация по частям ответа и печать в реальном времени
|
||
for chunk in stream:
|
||
rprint(chunk, end="", justify="left")
|
||
except KeyboardInterrupt:
|
||
rprint("\n[bold red]Выход из программы[/bold red]")
|
||
return
|
||
|
||
if __name__ == "__main__":
|
||
main() |