From b82a2102591240e3b92b9fe7ed9caadce0f67136 Mon Sep 17 00:00:00 2001 From: Daniel Sparing Date: Tue, 4 Feb 2025 15:04:33 +0100 Subject: [PATCH 1/3] add bike advies --- agent/agent.py | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/agent/agent.py b/agent/agent.py index 2a1297a..cd85ea6 100644 --- a/agent/agent.py +++ b/agent/agent.py @@ -20,19 +20,30 @@ Je bent een behulpzame assistent die helpt navigeren in het openbaar vervoer. Je geeft beknopt maar vriendelijk antwoord. Beƫindig het gesprek niet vroegtijdig. + Je geeft reisadvies, of met de trein of met de fiets, afhankelijk van de beschikbare tools. + Hou het kort zonder vragen en opmerkingen. + Als het laatste bericht van de LLM is, dan zoek het laatste bericht van de klant op en beantwoord dat in plaats van het bericht van de LLM. """ -) - +) @tool -def get_departure_times(origin: str, destination: str): - """Retrieve departure times for a specified journey.""" +def get_departure_times(origin: str, destination: str): + """Retrieve train departure times for a specified journey.""" if not origin or not destination: raise ValueError("Both origin and destination are required.") # Simulated response (In a real application, integrate with an API) return f"De vertrektijden vanaf {origin} met bestemming {destination} zijn om 10:00, 10:30 en 11:00." +@tool +def get_bicycle_route(origin: str, destination: str): + """Retrieve bicycle route for a specified journey.""" + if not origin or not destination: + raise ValueError("Both origin and destination are required.") + + # Simulated response (In a real application, integrate with an API) + return f"De fietsroute vanaf {origin} met bestemming {destination} loopt door de Parallelweg en via de Afsluitdijk." + class Executor: def __init__( @@ -45,7 +56,7 @@ def __init__( ): """Initialize the executor with a language model-powered agent.""" self.model = model or ChatOpenAI(model="gpt-4o-mini", temperature=0.2) - self.tools = tools or [get_departure_times] + self.tools = tools or [get_departure_times, get_bicycle_route] self.config = config or { "configurable": { "thread_id": str(uuid.uuid4()), From 2142cfabc6eee252b8ba49265bd669c0e3cd3200 Mon Sep 17 00:00:00 2001 From: Daniel Sparing Date: Tue, 4 Feb 2025 15:16:51 +0100 Subject: [PATCH 2/3] use prompt to switch modes --- agent/agent.py | 1 + 1 file changed, 1 insertion(+) diff --git a/agent/agent.py b/agent/agent.py index cd85ea6..24f1454 100644 --- a/agent/agent.py +++ b/agent/agent.py @@ -23,6 +23,7 @@ Je geeft reisadvies, of met de trein of met de fiets, afhankelijk van de beschikbare tools. Hou het kort zonder vragen en opmerkingen. Als het laatste bericht van de LLM is, dan zoek het laatste bericht van de klant op en beantwoord dat in plaats van het bericht van de LLM. + Geef treinadvies als dat nog niet eerdere is gegeven, anders geef fietsadvies. """ ) From e3940120d0df370118f033d881b46cd8ecf07e3c Mon Sep 17 00:00:00 2001 From: Daniel Sparing Date: Tue, 4 Feb 2025 15:21:19 +0100 Subject: [PATCH 3/3] double answer --- agent/app.py | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/agent/app.py b/agent/app.py index 2c8fbf7..3281238 100644 --- a/agent/app.py +++ b/agent/app.py @@ -9,7 +9,8 @@ async def on_message(msg: cl.Message): config = {"configurable": {"thread_id": cl.context.session.id}} cb = cl.LangchainCallbackHandler() - final_answer = cl.Message(content="") + + answer1 = cl.Message(content="") executor = Executor(config=config) async with executor.agent_context() as graph: message_stream = graph.astream( @@ -19,6 +20,19 @@ async def on_message(msg: cl.Message): ) async for msg, metadata in message_stream: if msg.content and isinstance(msg, AIMessage): - await final_answer.stream_token(msg.content) + await answer1.stream_token(msg.content) - await final_answer.send() + answer2 = cl.Message(content="") + executor = Executor(config=config) + async with executor.agent_context() as graph: + message_stream = graph.astream( + {"messages": [HumanMessage(content=msg.content)]}, + stream_mode="messages", + config=RunnableConfig(callbacks=[cb], **config) + ) + async for msg, metadata in message_stream: + if msg.content and isinstance(msg, AIMessage): + await answer2.stream_token(msg.content) + + await answer1.send() + await answer2.send()