Add agent.py for stream agent task
This commit is contained in:
@@ -0,0 +1,97 @@
|
|||||||
|
from langchain.agents import create_agent
|
||||||
|
from langchain.tools import tool
|
||||||
|
from langchain_openai import ChatOpenAI
|
||||||
|
from langgraph.checkpoint.memory import MemorySaver
|
||||||
|
from pydantic import SecretStr
|
||||||
|
|
||||||
|
|
||||||
|
llm = ChatOpenAI(
|
||||||
|
model="local-model",
|
||||||
|
base_url="http://localhost:1234/v1",
|
||||||
|
api_key=SecretStr("fake"),
|
||||||
|
temperature=0.7,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@tool
|
||||||
|
def get_price(product: str, city: str) -> str:
|
||||||
|
"""Возвращает примерную цену продукта в указанном городе."""
|
||||||
|
|
||||||
|
price_agent = create_agent(
|
||||||
|
model=llm,
|
||||||
|
tools=[],
|
||||||
|
system_prompt=(
|
||||||
|
"Ты субагент оценки цен. Верни одну markdown-таблицу "
|
||||||
|
"с колонками: Продукт, Цена (руб.), Магазин."
|
||||||
|
),
|
||||||
|
)
|
||||||
|
answer = price_agent.invoke(
|
||||||
|
{
|
||||||
|
"messages": [
|
||||||
|
{
|
||||||
|
"role": "human",
|
||||||
|
"content": (
|
||||||
|
f"Оцени реалистичную цену продукта '{product}' "
|
||||||
|
f"в городе {city}, опираясь на исторические данные о ценах."
|
||||||
|
),
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
)
|
||||||
|
return answer["messages"][-1].content
|
||||||
|
|
||||||
|
|
||||||
|
def format_message(message) -> str:
|
||||||
|
if message.content:
|
||||||
|
return message.content
|
||||||
|
if message.tool_calls:
|
||||||
|
call = message.tool_calls[0]
|
||||||
|
return f"{call['name']}({call['args']})"
|
||||||
|
return ""
|
||||||
|
|
||||||
|
|
||||||
|
def stream_shopping_agent() -> None:
|
||||||
|
memory = MemorySaver()
|
||||||
|
agent = create_agent(
|
||||||
|
model=llm,
|
||||||
|
tools=[get_price],
|
||||||
|
system_prompt="Ты помощник по планированию покупок",
|
||||||
|
checkpointer=memory,
|
||||||
|
)
|
||||||
|
|
||||||
|
stream = agent.stream(
|
||||||
|
{
|
||||||
|
"messages": [
|
||||||
|
{
|
||||||
|
"role": "human",
|
||||||
|
"content": (
|
||||||
|
"Помоги составить список покупок: молоко, хлеб, яблоки. "
|
||||||
|
"Я нахожусь в Казани."
|
||||||
|
),
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
stream_mode=["messages", "updates"],
|
||||||
|
config={"configurable": {"thread_id": "shopping-stream-demo"}},
|
||||||
|
)
|
||||||
|
|
||||||
|
step = None
|
||||||
|
for chunk_type, chunk_data in stream:
|
||||||
|
if chunk_type == "messages":
|
||||||
|
message, meta = chunk_data
|
||||||
|
current_step = meta.get("langgraph_step")
|
||||||
|
if current_step != step:
|
||||||
|
step = current_step
|
||||||
|
print("\n --- --- --- \n")
|
||||||
|
if message.content:
|
||||||
|
print(message.content, end="", flush=True)
|
||||||
|
|
||||||
|
if chunk_type == "updates" and chunk_data.get("model"):
|
||||||
|
last_message = chunk_data["model"]["messages"][-1]
|
||||||
|
formatted = format_message(last_message)
|
||||||
|
if formatted:
|
||||||
|
print(formatted)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
stream_shopping_agent()
|
||||||
Reference in New Issue
Block a user