From 6ec48b8469aea718c6e933f19b1c0d200fe1885c Mon Sep 17 00:00:00 2001 From: swetha1095 <swetha.lakshmana.murthy@iais.fraunhofer.de> Date: Wed, 4 Jun 2025 22:36:26 +0200 Subject: [PATCH] Restructure: agentic workflow code --- .../chatbot/DOCKER_TAG | 0 .../chatbot/Dockerfile | 2 +- .../chatbot/app.py | 41 ++- .../chatbot/build_and_deploy.sh | 0 .../chatbot/chatbot.proto | 0 .../chatbot/chatbot_pb2.py | 0 .../chatbot/chatbot_pb2_grpc.py | 0 .../chatbot/client.py | 0 .../chatbot/requirements.txt | 6 + .../chatbot/server.py | 0 .../chatbot/templates/chat.html | 312 ++++++++++++++++++ .../food_rec_agent/DOCKER_TAG | 0 .../food_rec_agent/Dockerfile | 2 +- .../food_rec_agent/agent.proto | 0 .../food_rec_agent/build_and_deploy.sh | 0 .../food_rec_agent/client.py | 0 .../food_rec_agent/requirements.txt | 7 + .../food_rec_agent/server.py | 0 .../food_rec_agent/tool_calling/llm_client.py | 0 .../food_rec_agent/tool_calling/tools.py | 0 .../places_agent/DOCKER_TAG | 0 .../places_agent/Dockerfile | 2 +- .../places_agent/agent.proto | 1 - .../places_agent/agent_pb2.py | 0 .../places_agent/agent_pb2_grpc.py | 0 .../places_agent/build_and_deploy.sh | 0 .../places_agent/client.py | 0 .../places_agent/requirements.txt | 6 +- .../places_agent/server.py | 0 .../places_agent/tool_calling/llm_client.py | 0 .../places_agent/tool_calling/tools.py | 0 .../planner/DOCKER_TAG | 0 .../planner/Dockerfile | 2 +- .../planner/build_and_deploy.sh | 0 .../planner/client.py | 0 .../planner/planner.proto | 1 - .../planner/requirements.txt | 10 + .../planner/server.py | 100 ++++++ .../weather_agent/DOCKER_TAG | 0 .../weather_agent/Dockerfile | 2 +- .../weather_agent/agent.proto | 1 - .../weather_agent/build_and_deploy.sh | 0 .../weather_agent/client.py | 0 .../weather_agent/requirements.txt | 6 +- .../weather_agent/server.py | 0 .../weather_agent/tool_calling/llm_client.py | 0 .../weather_agent/tool_calling/tools.py | 0 .../chatbot/requirements.txt | 6 - .../chatbot/templates/chat.html | 181 ---------- .../food_rec_agent/requirements.txt | 7 - .../planner/requirements.txt | 9 - .../planner/server.py | 84 ----- 52 files changed, 486 insertions(+), 302 deletions(-) rename {multi-agentic-travel-advisor => agentic-workflows/multi-agentic-travel-advisor}/chatbot/DOCKER_TAG (100%) rename {multi-agentic-travel-advisor => agentic-workflows/multi-agentic-travel-advisor}/chatbot/Dockerfile (97%) rename {multi-agentic-travel-advisor => agentic-workflows/multi-agentic-travel-advisor}/chatbot/app.py (51%) rename {multi-agentic-travel-advisor => agentic-workflows/multi-agentic-travel-advisor}/chatbot/build_and_deploy.sh (100%) rename {multi-agentic-travel-advisor => agentic-workflows/multi-agentic-travel-advisor}/chatbot/chatbot.proto (100%) rename {multi-agentic-travel-advisor => agentic-workflows/multi-agentic-travel-advisor}/chatbot/chatbot_pb2.py (100%) rename {multi-agentic-travel-advisor => agentic-workflows/multi-agentic-travel-advisor}/chatbot/chatbot_pb2_grpc.py (100%) rename {multi-agentic-travel-advisor => agentic-workflows/multi-agentic-travel-advisor}/chatbot/client.py (100%) create mode 100644 agentic-workflows/multi-agentic-travel-advisor/chatbot/requirements.txt rename {multi-agentic-travel-advisor => agentic-workflows/multi-agentic-travel-advisor}/chatbot/server.py (100%) create mode 100644 agentic-workflows/multi-agentic-travel-advisor/chatbot/templates/chat.html rename {multi-agentic-travel-advisor => agentic-workflows/multi-agentic-travel-advisor}/food_rec_agent/DOCKER_TAG (100%) rename {multi-agentic-travel-advisor => agentic-workflows/multi-agentic-travel-advisor}/food_rec_agent/Dockerfile (97%) rename {multi-agentic-travel-advisor => agentic-workflows/multi-agentic-travel-advisor}/food_rec_agent/agent.proto (100%) rename {multi-agentic-travel-advisor => agentic-workflows/multi-agentic-travel-advisor}/food_rec_agent/build_and_deploy.sh (100%) rename {multi-agentic-travel-advisor => agentic-workflows/multi-agentic-travel-advisor}/food_rec_agent/client.py (100%) create mode 100644 agentic-workflows/multi-agentic-travel-advisor/food_rec_agent/requirements.txt rename {multi-agentic-travel-advisor => agentic-workflows/multi-agentic-travel-advisor}/food_rec_agent/server.py (100%) rename {multi-agentic-travel-advisor => agentic-workflows/multi-agentic-travel-advisor}/food_rec_agent/tool_calling/llm_client.py (100%) rename {multi-agentic-travel-advisor => agentic-workflows/multi-agentic-travel-advisor}/food_rec_agent/tool_calling/tools.py (100%) rename {multi-agentic-travel-advisor => agentic-workflows/multi-agentic-travel-advisor}/places_agent/DOCKER_TAG (100%) rename {multi-agentic-travel-advisor => agentic-workflows/multi-agentic-travel-advisor}/places_agent/Dockerfile (97%) rename {multi-agentic-travel-advisor => agentic-workflows/multi-agentic-travel-advisor}/places_agent/agent.proto (96%) rename {multi-agentic-travel-advisor => agentic-workflows/multi-agentic-travel-advisor}/places_agent/agent_pb2.py (100%) rename {multi-agentic-travel-advisor => agentic-workflows/multi-agentic-travel-advisor}/places_agent/agent_pb2_grpc.py (100%) rename {multi-agentic-travel-advisor => agentic-workflows/multi-agentic-travel-advisor}/places_agent/build_and_deploy.sh (100%) rename {multi-agentic-travel-advisor => agentic-workflows/multi-agentic-travel-advisor}/places_agent/client.py (100%) rename {multi-agentic-travel-advisor => agentic-workflows/multi-agentic-travel-advisor}/places_agent/requirements.txt (50%) rename {multi-agentic-travel-advisor => agentic-workflows/multi-agentic-travel-advisor}/places_agent/server.py (100%) rename {multi-agentic-travel-advisor => agentic-workflows/multi-agentic-travel-advisor}/places_agent/tool_calling/llm_client.py (100%) rename {multi-agentic-travel-advisor => agentic-workflows/multi-agentic-travel-advisor}/places_agent/tool_calling/tools.py (100%) rename {multi-agentic-travel-advisor => agentic-workflows/multi-agentic-travel-advisor}/planner/DOCKER_TAG (100%) rename {multi-agentic-travel-advisor => agentic-workflows/multi-agentic-travel-advisor}/planner/Dockerfile (97%) rename {multi-agentic-travel-advisor => agentic-workflows/multi-agentic-travel-advisor}/planner/build_and_deploy.sh (100%) rename {multi-agentic-travel-advisor => agentic-workflows/multi-agentic-travel-advisor}/planner/client.py (100%) rename {multi-agentic-travel-advisor => agentic-workflows/multi-agentic-travel-advisor}/planner/planner.proto (97%) create mode 100644 agentic-workflows/multi-agentic-travel-advisor/planner/requirements.txt create mode 100644 agentic-workflows/multi-agentic-travel-advisor/planner/server.py rename {multi-agentic-travel-advisor => agentic-workflows/multi-agentic-travel-advisor}/weather_agent/DOCKER_TAG (100%) rename {multi-agentic-travel-advisor => agentic-workflows/multi-agentic-travel-advisor}/weather_agent/Dockerfile (97%) rename {multi-agentic-travel-advisor => agentic-workflows/multi-agentic-travel-advisor}/weather_agent/agent.proto (96%) rename {multi-agentic-travel-advisor => agentic-workflows/multi-agentic-travel-advisor}/weather_agent/build_and_deploy.sh (100%) rename {multi-agentic-travel-advisor => agentic-workflows/multi-agentic-travel-advisor}/weather_agent/client.py (100%) rename {multi-agentic-travel-advisor => agentic-workflows/multi-agentic-travel-advisor}/weather_agent/requirements.txt (57%) rename {multi-agentic-travel-advisor => agentic-workflows/multi-agentic-travel-advisor}/weather_agent/server.py (100%) rename {multi-agentic-travel-advisor => agentic-workflows/multi-agentic-travel-advisor}/weather_agent/tool_calling/llm_client.py (100%) rename {multi-agentic-travel-advisor => agentic-workflows/multi-agentic-travel-advisor}/weather_agent/tool_calling/tools.py (100%) delete mode 100644 multi-agentic-travel-advisor/chatbot/requirements.txt delete mode 100644 multi-agentic-travel-advisor/chatbot/templates/chat.html delete mode 100644 multi-agentic-travel-advisor/food_rec_agent/requirements.txt delete mode 100644 multi-agentic-travel-advisor/planner/requirements.txt delete mode 100644 multi-agentic-travel-advisor/planner/server.py diff --git a/multi-agentic-travel-advisor/chatbot/DOCKER_TAG b/agentic-workflows/multi-agentic-travel-advisor/chatbot/DOCKER_TAG similarity index 100% rename from multi-agentic-travel-advisor/chatbot/DOCKER_TAG rename to agentic-workflows/multi-agentic-travel-advisor/chatbot/DOCKER_TAG diff --git a/multi-agentic-travel-advisor/chatbot/Dockerfile b/agentic-workflows/multi-agentic-travel-advisor/chatbot/Dockerfile similarity index 97% rename from multi-agentic-travel-advisor/chatbot/Dockerfile rename to agentic-workflows/multi-agentic-travel-advisor/chatbot/Dockerfile index 0d93661..d44c5ea 100644 --- a/multi-agentic-travel-advisor/chatbot/Dockerfile +++ b/agentic-workflows/multi-agentic-travel-advisor/chatbot/Dockerfile @@ -1,5 +1,5 @@ # Use a slim Python base image -FROM python:3.10-slim +FROM python:3.12-slim ENV PYTHONUNBUFFERED=1 diff --git a/multi-agentic-travel-advisor/chatbot/app.py b/agentic-workflows/multi-agentic-travel-advisor/chatbot/app.py similarity index 51% rename from multi-agentic-travel-advisor/chatbot/app.py rename to agentic-workflows/multi-agentic-travel-advisor/chatbot/app.py index 718fe52..8d41823 100644 --- a/multi-agentic-travel-advisor/chatbot/app.py +++ b/agentic-workflows/multi-agentic-travel-advisor/chatbot/app.py @@ -1,4 +1,4 @@ -from flask import Flask, render_template, request, redirect, url_for, session +from flask import Flask, render_template, request, redirect, url_for, session, jsonify, render_template_string import logging # Initialize Flask app @@ -45,3 +45,42 @@ def chat(): chat_history = ["No conversation history yet."] return render_template("chat.html", chat_history=chat_history) + +@app.route("/ask", methods=["POST"]) +def ask(): + data = request.get_json() + user_query = data.get("user_query", "") + if user_query: + logger.info(f"User query received via AJAX: {user_query}") + parameters.clear() + parameters.append(user_query) + + try: + app.chatbot_instance.receive_new_query(user_query) + except Exception as e: + logger.error("Error with chatbot_instance: %s", e) + return jsonify({"success": False, "error": str(e)}), 500 + + return jsonify({"success": True}) + + +@app.route("/chat_history", methods=["GET"]) +def chat_history(): + try: + with open("chat_log.txt", "r", encoding="utf-8") as log_file: + lines = log_file.readlines() + chat_history = [line.strip() for line in lines if line.strip()] + except FileNotFoundError: + chat_history = ["No conversation history yet."] + + html = render_template_string(''' + <h2><i class="fas fa-comments"></i> Chat History</h2> + {% for line in chat_history %} + <p class="chat-line {{ 'user' if 'User:' in line else 'bot' }}"> + <i class="fas {{ 'fa-user' if 'User:' in line else 'fa-robot' }}"></i> + {{ line|safe }} + </p> + {% endfor %} + ''', chat_history=chat_history) + + return html \ No newline at end of file diff --git a/multi-agentic-travel-advisor/chatbot/build_and_deploy.sh b/agentic-workflows/multi-agentic-travel-advisor/chatbot/build_and_deploy.sh similarity index 100% rename from multi-agentic-travel-advisor/chatbot/build_and_deploy.sh rename to agentic-workflows/multi-agentic-travel-advisor/chatbot/build_and_deploy.sh diff --git a/multi-agentic-travel-advisor/chatbot/chatbot.proto b/agentic-workflows/multi-agentic-travel-advisor/chatbot/chatbot.proto similarity index 100% rename from multi-agentic-travel-advisor/chatbot/chatbot.proto rename to agentic-workflows/multi-agentic-travel-advisor/chatbot/chatbot.proto diff --git a/multi-agentic-travel-advisor/chatbot/chatbot_pb2.py b/agentic-workflows/multi-agentic-travel-advisor/chatbot/chatbot_pb2.py similarity index 100% rename from multi-agentic-travel-advisor/chatbot/chatbot_pb2.py rename to agentic-workflows/multi-agentic-travel-advisor/chatbot/chatbot_pb2.py diff --git a/multi-agentic-travel-advisor/chatbot/chatbot_pb2_grpc.py b/agentic-workflows/multi-agentic-travel-advisor/chatbot/chatbot_pb2_grpc.py similarity index 100% rename from multi-agentic-travel-advisor/chatbot/chatbot_pb2_grpc.py rename to agentic-workflows/multi-agentic-travel-advisor/chatbot/chatbot_pb2_grpc.py diff --git a/multi-agentic-travel-advisor/chatbot/client.py b/agentic-workflows/multi-agentic-travel-advisor/chatbot/client.py similarity index 100% rename from multi-agentic-travel-advisor/chatbot/client.py rename to agentic-workflows/multi-agentic-travel-advisor/chatbot/client.py diff --git a/agentic-workflows/multi-agentic-travel-advisor/chatbot/requirements.txt b/agentic-workflows/multi-agentic-travel-advisor/chatbot/requirements.txt new file mode 100644 index 0000000..4852bc4 --- /dev/null +++ b/agentic-workflows/multi-agentic-travel-advisor/chatbot/requirements.txt @@ -0,0 +1,6 @@ +grpcio +grpcio-tools +grpc-interceptor +protobuf +multithreading +Flask \ No newline at end of file diff --git a/multi-agentic-travel-advisor/chatbot/server.py b/agentic-workflows/multi-agentic-travel-advisor/chatbot/server.py similarity index 100% rename from multi-agentic-travel-advisor/chatbot/server.py rename to agentic-workflows/multi-agentic-travel-advisor/chatbot/server.py diff --git a/agentic-workflows/multi-agentic-travel-advisor/chatbot/templates/chat.html b/agentic-workflows/multi-agentic-travel-advisor/chatbot/templates/chat.html new file mode 100644 index 0000000..6f685f7 --- /dev/null +++ b/agentic-workflows/multi-agentic-travel-advisor/chatbot/templates/chat.html @@ -0,0 +1,312 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>Travel Advisor</title> + + <!-- Leaflet.js CSS --> + <link rel="stylesheet" href="https://unpkg.com/leaflet@1.7.1/dist/leaflet.css" /> + + <!-- Font Awesome for icons --> + <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.0/css/all.min.css"> + + <!-- Google Fonts --> + <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap" rel="stylesheet"> + <link href="https://fonts.googleapis.com/css2?family=Playfair+Display:wght@700&display=swap" rel="stylesheet"> + + <style> + body, html { + height: 100%; + margin: 0; + font-family: 'Inter', sans-serif; + } + + #map { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: -1; + } + + .overlay { + background: rgba(228, 216, 216, 0.6); + backdrop-filter: blur(6px); + -webkit-backdrop-filter: blur(6px); + min-height: 100vh; + padding: 40px 20px; + display: flex; + flex-direction: column; + align-items: center; + z-index: 1; + } + + h1 { + font-family: 'Playfair Display', serif; + font-size: 2.8em; + color: #2c3e50; + margin-bottom: 20px; + letter-spacing: 0.5px; + } + + + form { + display: flex; + background: #ffffff; + padding: 15px 20px; + border-radius: 12px; + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.15); + width: 100%; + max-width: 600px; + margin-bottom: 30px; + gap: 10px; + animation: fadeIn 0.7s ease-in-out; + } + + input[type="text"] { + flex: 1; + padding: 12px; + font-size: 16px; + border: 1px solid #ccc; + border-radius: 6px; + } + + button { + background-color: #3498db; + color: white; + border: none; + border-radius: 6px; + padding: 12px 20px; + font-size: 16px; + cursor: pointer; + transition: background-color 0.3s ease, transform 0.2s ease; + } + + button:hover { + background-color: #2980b9; + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2); + } + + .chat-box { + background: white; + overflow-y: auto; + padding: 15px; + border-radius: 12px; + width: 100%; + max-width: 600px; + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); + font-size: 14px; + word-wrap: break-word; + display: flex; + flex-direction: column; + gap: 10px; + animation: fadeIn 0.8s ease-in-out; + } + + .chat-line { + position: relative; + padding: 12px 16px; + border-radius: 16px; + max-width: 80%; + line-height: 1.5; + word-wrap: break-word; + overflow-wrap: break-word; + word-break: break-word; + } + + .user { + align-self: flex-end; + background-color: #3498db; + color: white; + } + + .bot { + align-self: flex-start; + background-color: #f1f1f1; + color: #333; + } + + .user::after { + content: ""; + position: absolute; + right: -8px; + top: 50%; + border: 8px solid transparent; + border-left-color: #3498db; + transform: translateY(-50%); + } + + .bot::before { + content: ""; + position: absolute; + left: -8px; + top: 50%; + border: 8px solid transparent; + border-right-color: #f1f1f1; + transform: translateY(-50%); + } + + @keyframes fadeIn { + from { + opacity: 0; + transform: translateY(10px); + } + to { + opacity: 1; + transform: translateY(0); + } + } + + #typing-indicator { + display: none; + margin-top: 10px; + font-style: italic; + color: #999; + } + + @keyframes typingDots { + 0% { content: ""; } + 33% { content: "."; } + 66% { content: ".."; } + 100% { content: "..."; } + } + + #typing-indicator .dots::after { + content: "..."; + animation: typingDots 1s steps(3, end) infinite; + } + + @media (max-width: 600px) { + form { + flex-direction: column; + gap: 8px; + } + + input[type="text"], + button { + width: 100%; + } + + .chat-box { + font-size: 12px; + } + + h1 { + font-size: 1.8em; + } + } + </style> +</head> +<body> + <div id="map"></div> + + <div class="overlay"> + <h1><i class="fas fa-plane-departure"></i> Travel Advisor</h1> + + <form id="chat-form"> + <input type="text" id="user_query" name="user_query" placeholder="Ask right away!..." required> + <button type="submit"><i class="fas fa-paper-plane"></i></button> + </form> + <div id="typing-indicator"> + <i class="fas fa-robot"></i> Bot is typing<span class="dots">...</span> + </div> + + <div class="chat-box"> + {% for line in chat_history %} + <div class="chat-line {{ 'user' if 'User:' in line else 'bot' }}"> + {{ line|safe }} + </div> + {% endfor %} + </div> + + <div id="typing-indicator"> + <i class="fas fa-robot"></i> Bot is typing... + </div> + </div> + + <!-- Leaflet JS --> + <script src="https://unpkg.com/leaflet@1.7.1/dist/leaflet.js"></script> + <script> + var map = L.map('map').setView([51.505, -0.09], 2); + + L.tileLayer('https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}{r}.png', { + attribution: '© OpenStreetMap contributors & CartoDB' + }).addTo(map); + + L.marker([51.505, -0.09]).addTo(map) + .bindPopup("<b>Welcome!</b><br>Ask me about your next trip.") + .openPopup(); + </script> + + <!-- Auto scroll to latest chat --> + <script> + window.onload = function () { + const chatBox = document.querySelector('.chat-box'); + chatBox.scrollTop = chatBox.scrollHeight; + }; + </script> + + <!-- Chat Submit and Polling --> + <script> + document.getElementById('chat-form').addEventListener('submit', function (e) { + e.preventDefault(); + const userInput = document.getElementById('user_query').value.trim(); + if (!userInput) return; + + // Add user's message to chat box immediately + const chatBox = document.querySelector('.chat-box'); + const userLine = document.createElement('div'); + userLine.className = 'chat-line user'; + userLine.textContent = userInput; + chatBox.appendChild(userLine); + chatBox.scrollTop = chatBox.scrollHeight; + + // Clear input and show typing indicator + document.getElementById('user_query').value = ''; + document.getElementById('typing-indicator').style.display = 'block'; + + fetch('/ask', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ user_query: userInput }) + }) + .then(response => response.json()) + .then(data => { + if (data.success) { + // Simulate typing delay to make indicator visible + setTimeout(() => { + updateChat(); + }, 1500); // Show typing indicator for 1.5 seconds + } else { + console.error('Chatbot error:', data.error); + document.getElementById('typing-indicator').style.display = 'none'; + } + }) + .catch(error => { + console.error('Network error:', error); + document.getElementById('typing-indicator').style.display = 'none'; + }); + }); + + function updateChat() { + fetch('/chat_history') + .then(response => response.text()) + .then(html => { + document.querySelector('.chat-box').innerHTML = html; + const chatBox = document.querySelector('.chat-box'); + chatBox.scrollTop = chatBox.scrollHeight; + document.getElementById('typing-indicator').style.display = 'none'; + }); + } + + setInterval(updateChat, 1000); // Adjust polling frequency to reduce spam + updateChat(); + </script> + +</body> +</html> \ No newline at end of file diff --git a/multi-agentic-travel-advisor/food_rec_agent/DOCKER_TAG b/agentic-workflows/multi-agentic-travel-advisor/food_rec_agent/DOCKER_TAG similarity index 100% rename from multi-agentic-travel-advisor/food_rec_agent/DOCKER_TAG rename to agentic-workflows/multi-agentic-travel-advisor/food_rec_agent/DOCKER_TAG diff --git a/multi-agentic-travel-advisor/food_rec_agent/Dockerfile b/agentic-workflows/multi-agentic-travel-advisor/food_rec_agent/Dockerfile similarity index 97% rename from multi-agentic-travel-advisor/food_rec_agent/Dockerfile rename to agentic-workflows/multi-agentic-travel-advisor/food_rec_agent/Dockerfile index c1d8bdf..dea9a6a 100644 --- a/multi-agentic-travel-advisor/food_rec_agent/Dockerfile +++ b/agentic-workflows/multi-agentic-travel-advisor/food_rec_agent/Dockerfile @@ -1,5 +1,5 @@ # Use a slim Python base image -FROM python:3.10-slim +FROM python:3.12-slim ENV PYTHONUNBUFFERED=1 diff --git a/multi-agentic-travel-advisor/food_rec_agent/agent.proto b/agentic-workflows/multi-agentic-travel-advisor/food_rec_agent/agent.proto similarity index 100% rename from multi-agentic-travel-advisor/food_rec_agent/agent.proto rename to agentic-workflows/multi-agentic-travel-advisor/food_rec_agent/agent.proto diff --git a/multi-agentic-travel-advisor/food_rec_agent/build_and_deploy.sh b/agentic-workflows/multi-agentic-travel-advisor/food_rec_agent/build_and_deploy.sh similarity index 100% rename from multi-agentic-travel-advisor/food_rec_agent/build_and_deploy.sh rename to agentic-workflows/multi-agentic-travel-advisor/food_rec_agent/build_and_deploy.sh diff --git a/multi-agentic-travel-advisor/food_rec_agent/client.py b/agentic-workflows/multi-agentic-travel-advisor/food_rec_agent/client.py similarity index 100% rename from multi-agentic-travel-advisor/food_rec_agent/client.py rename to agentic-workflows/multi-agentic-travel-advisor/food_rec_agent/client.py diff --git a/agentic-workflows/multi-agentic-travel-advisor/food_rec_agent/requirements.txt b/agentic-workflows/multi-agentic-travel-advisor/food_rec_agent/requirements.txt new file mode 100644 index 0000000..c36c7ed --- /dev/null +++ b/agentic-workflows/multi-agentic-travel-advisor/food_rec_agent/requirements.txt @@ -0,0 +1,7 @@ +grpcio +grpcio-tools +grpc-interceptor +protobuf +multithreading +openai +requests \ No newline at end of file diff --git a/multi-agentic-travel-advisor/food_rec_agent/server.py b/agentic-workflows/multi-agentic-travel-advisor/food_rec_agent/server.py similarity index 100% rename from multi-agentic-travel-advisor/food_rec_agent/server.py rename to agentic-workflows/multi-agentic-travel-advisor/food_rec_agent/server.py diff --git a/multi-agentic-travel-advisor/food_rec_agent/tool_calling/llm_client.py b/agentic-workflows/multi-agentic-travel-advisor/food_rec_agent/tool_calling/llm_client.py similarity index 100% rename from multi-agentic-travel-advisor/food_rec_agent/tool_calling/llm_client.py rename to agentic-workflows/multi-agentic-travel-advisor/food_rec_agent/tool_calling/llm_client.py diff --git a/multi-agentic-travel-advisor/food_rec_agent/tool_calling/tools.py b/agentic-workflows/multi-agentic-travel-advisor/food_rec_agent/tool_calling/tools.py similarity index 100% rename from multi-agentic-travel-advisor/food_rec_agent/tool_calling/tools.py rename to agentic-workflows/multi-agentic-travel-advisor/food_rec_agent/tool_calling/tools.py diff --git a/multi-agentic-travel-advisor/places_agent/DOCKER_TAG b/agentic-workflows/multi-agentic-travel-advisor/places_agent/DOCKER_TAG similarity index 100% rename from multi-agentic-travel-advisor/places_agent/DOCKER_TAG rename to agentic-workflows/multi-agentic-travel-advisor/places_agent/DOCKER_TAG diff --git a/multi-agentic-travel-advisor/places_agent/Dockerfile b/agentic-workflows/multi-agentic-travel-advisor/places_agent/Dockerfile similarity index 97% rename from multi-agentic-travel-advisor/places_agent/Dockerfile rename to agentic-workflows/multi-agentic-travel-advisor/places_agent/Dockerfile index be59e34..cf47266 100644 --- a/multi-agentic-travel-advisor/places_agent/Dockerfile +++ b/agentic-workflows/multi-agentic-travel-advisor/places_agent/Dockerfile @@ -1,5 +1,5 @@ # Use a slim Python base image -FROM python:3.10-slim +FROM python:3.12-slim ENV PYTHONUNBUFFERED=1 diff --git a/multi-agentic-travel-advisor/places_agent/agent.proto b/agentic-workflows/multi-agentic-travel-advisor/places_agent/agent.proto similarity index 96% rename from multi-agentic-travel-advisor/places_agent/agent.proto rename to agentic-workflows/multi-agentic-travel-advisor/places_agent/agent.proto index 92378c2..cf19c08 100644 --- a/multi-agentic-travel-advisor/places_agent/agent.proto +++ b/agentic-workflows/multi-agentic-travel-advisor/places_agent/agent.proto @@ -18,7 +18,6 @@ enum AgentType { WEATHER = 1; PLACES = 2; FOOD = 3; - MAP = 4; } message AgentResponse { diff --git a/multi-agentic-travel-advisor/places_agent/agent_pb2.py b/agentic-workflows/multi-agentic-travel-advisor/places_agent/agent_pb2.py similarity index 100% rename from multi-agentic-travel-advisor/places_agent/agent_pb2.py rename to agentic-workflows/multi-agentic-travel-advisor/places_agent/agent_pb2.py diff --git a/multi-agentic-travel-advisor/places_agent/agent_pb2_grpc.py b/agentic-workflows/multi-agentic-travel-advisor/places_agent/agent_pb2_grpc.py similarity index 100% rename from multi-agentic-travel-advisor/places_agent/agent_pb2_grpc.py rename to agentic-workflows/multi-agentic-travel-advisor/places_agent/agent_pb2_grpc.py diff --git a/multi-agentic-travel-advisor/places_agent/build_and_deploy.sh b/agentic-workflows/multi-agentic-travel-advisor/places_agent/build_and_deploy.sh similarity index 100% rename from multi-agentic-travel-advisor/places_agent/build_and_deploy.sh rename to agentic-workflows/multi-agentic-travel-advisor/places_agent/build_and_deploy.sh diff --git a/multi-agentic-travel-advisor/places_agent/client.py b/agentic-workflows/multi-agentic-travel-advisor/places_agent/client.py similarity index 100% rename from multi-agentic-travel-advisor/places_agent/client.py rename to agentic-workflows/multi-agentic-travel-advisor/places_agent/client.py diff --git a/multi-agentic-travel-advisor/places_agent/requirements.txt b/agentic-workflows/multi-agentic-travel-advisor/places_agent/requirements.txt similarity index 50% rename from multi-agentic-travel-advisor/places_agent/requirements.txt rename to agentic-workflows/multi-agentic-travel-advisor/places_agent/requirements.txt index 390e8a4..bad96f0 100644 --- a/multi-agentic-travel-advisor/places_agent/requirements.txt +++ b/agentic-workflows/multi-agentic-travel-advisor/places_agent/requirements.txt @@ -1,7 +1,7 @@ -grpcio==1.38.0 -grpcio-tools==1.38.0 +grpcio +grpcio-tools grpc-interceptor -protobuf==3.16.0 +protobuf multithreading openai requests diff --git a/multi-agentic-travel-advisor/places_agent/server.py b/agentic-workflows/multi-agentic-travel-advisor/places_agent/server.py similarity index 100% rename from multi-agentic-travel-advisor/places_agent/server.py rename to agentic-workflows/multi-agentic-travel-advisor/places_agent/server.py diff --git a/multi-agentic-travel-advisor/places_agent/tool_calling/llm_client.py b/agentic-workflows/multi-agentic-travel-advisor/places_agent/tool_calling/llm_client.py similarity index 100% rename from multi-agentic-travel-advisor/places_agent/tool_calling/llm_client.py rename to agentic-workflows/multi-agentic-travel-advisor/places_agent/tool_calling/llm_client.py diff --git a/multi-agentic-travel-advisor/places_agent/tool_calling/tools.py b/agentic-workflows/multi-agentic-travel-advisor/places_agent/tool_calling/tools.py similarity index 100% rename from multi-agentic-travel-advisor/places_agent/tool_calling/tools.py rename to agentic-workflows/multi-agentic-travel-advisor/places_agent/tool_calling/tools.py diff --git a/multi-agentic-travel-advisor/planner/DOCKER_TAG b/agentic-workflows/multi-agentic-travel-advisor/planner/DOCKER_TAG similarity index 100% rename from multi-agentic-travel-advisor/planner/DOCKER_TAG rename to agentic-workflows/multi-agentic-travel-advisor/planner/DOCKER_TAG diff --git a/multi-agentic-travel-advisor/planner/Dockerfile b/agentic-workflows/multi-agentic-travel-advisor/planner/Dockerfile similarity index 97% rename from multi-agentic-travel-advisor/planner/Dockerfile rename to agentic-workflows/multi-agentic-travel-advisor/planner/Dockerfile index f2760fb..0c602cc 100644 --- a/multi-agentic-travel-advisor/planner/Dockerfile +++ b/agentic-workflows/multi-agentic-travel-advisor/planner/Dockerfile @@ -1,5 +1,5 @@ # Use a slim Python base image -FROM python:3.10-slim +FROM python:3.12-slim ENV PYTHONUNBUFFERED=1 diff --git a/multi-agentic-travel-advisor/planner/build_and_deploy.sh b/agentic-workflows/multi-agentic-travel-advisor/planner/build_and_deploy.sh similarity index 100% rename from multi-agentic-travel-advisor/planner/build_and_deploy.sh rename to agentic-workflows/multi-agentic-travel-advisor/planner/build_and_deploy.sh diff --git a/multi-agentic-travel-advisor/planner/client.py b/agentic-workflows/multi-agentic-travel-advisor/planner/client.py similarity index 100% rename from multi-agentic-travel-advisor/planner/client.py rename to agentic-workflows/multi-agentic-travel-advisor/planner/client.py diff --git a/multi-agentic-travel-advisor/planner/planner.proto b/agentic-workflows/multi-agentic-travel-advisor/planner/planner.proto similarity index 97% rename from multi-agentic-travel-advisor/planner/planner.proto rename to agentic-workflows/multi-agentic-travel-advisor/planner/planner.proto index 1a8fe43..d9befa4 100644 --- a/multi-agentic-travel-advisor/planner/planner.proto +++ b/agentic-workflows/multi-agentic-travel-advisor/planner/planner.proto @@ -18,7 +18,6 @@ enum AgentType { WEATHER = 1; PLACES = 2; FOOD = 3; - MAP = 4; } message AgentResponse { diff --git a/agentic-workflows/multi-agentic-travel-advisor/planner/requirements.txt b/agentic-workflows/multi-agentic-travel-advisor/planner/requirements.txt new file mode 100644 index 0000000..dded117 --- /dev/null +++ b/agentic-workflows/multi-agentic-travel-advisor/planner/requirements.txt @@ -0,0 +1,10 @@ +grpcio +grpcio-tools +grpc-interceptor +protobuf +multithreading +Flask + +torch +transformers +hf_xet \ No newline at end of file diff --git a/agentic-workflows/multi-agentic-travel-advisor/planner/server.py b/agentic-workflows/multi-agentic-travel-advisor/planner/server.py new file mode 100644 index 0000000..afdca30 --- /dev/null +++ b/agentic-workflows/multi-agentic-travel-advisor/planner/server.py @@ -0,0 +1,100 @@ +import grpc +from concurrent import futures +import logging +import time + +import planner_pb2 +import planner_pb2_grpc +from transformers import pipeline + + +# ------------------ Logger Setup ------------------ +def setup_logger(): + logger = logging.getLogger("PlannerService") + logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s") + return logger + + +logger = setup_logger() + +# ------------------ Classifier Setup ------------------ +def initialize_classifier(): + return pipeline( + "zero-shot-classification", + model="facebook/bart-large-mnli", + revision="d7645e1" + ) + + +AGENT_LABELS = ["weather", "places", "food", "map"] +LABEL_TO_AGENT_TYPE = { + "weather": planner_pb2.WEATHER, + "places": planner_pb2.PLACES, + "food": planner_pb2.FOOD +} + + +def match_agent(text): + try: + result = classifier(text, AGENT_LABELS) + label = result["labels"][0] + logger.info(f"Classifier result: {label}") + return LABEL_TO_AGENT_TYPE.get(label, planner_pb2.UNKNOWN) + except Exception as e: + logger.error(f"Classifier error: {e}") + return planner_pb2.UNKNOWN + +# ------------------ gRPC Service Implementation ------------------ +class PlannerService(planner_pb2_grpc.PlannerServicer): + def __init__(self): + logger.info("PlannerService initialized.") + self.agent_type_stored = None + + def evaluateUserQueriesFromChatbot(self, request_iterator, context): + logger.info("Evaluating user queries from chatbot...") + for user_query in request_iterator: + logger.info(f"User query: {user_query.text}") + agent_type = match_agent(user_query.text) + + response = planner_pb2.AgentRequest( + text=user_query.text, + agent_type=agent_type + ) + + # Store agent type as a readable string + self.agent_type_stored = planner_pb2.AgentType.Name(agent_type) + logger.info(f"Matched agent type: {self.agent_type_stored}") + + # Handle unknown queries + if agent_type == planner_pb2.UNKNOWN: + response.text = "Sorry, I couldn't understand the query." + + yield response + + def processAgentResponsesFromAgent(self, request_iterator, context): + logger.info("Processing responses from agent...") + for response in request_iterator: + logger.info(f"Agent response: {response.text}") + + formatted_response = planner_pb2.AgentResponse( + text=f"[**Answering from {self.agent_type_stored} Agent**] \n{response.text}" + ) + yield formatted_response + + logger.info("Finished processing all agent responses.") + + +# ------------------ Server Setup ------------------ +def serve(): + server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) + planner_pb2_grpc.add_PlannerServicer_to_server(PlannerService(), server) + port = 8061 + server.add_insecure_port(f"[::]:{port}") + server.start() + logger.info(f"Planner Service is running on port {port}") + server.wait_for_termination() + + +if __name__ == "__main__": + classifier = initialize_classifier() + serve() diff --git a/multi-agentic-travel-advisor/weather_agent/DOCKER_TAG b/agentic-workflows/multi-agentic-travel-advisor/weather_agent/DOCKER_TAG similarity index 100% rename from multi-agentic-travel-advisor/weather_agent/DOCKER_TAG rename to agentic-workflows/multi-agentic-travel-advisor/weather_agent/DOCKER_TAG diff --git a/multi-agentic-travel-advisor/weather_agent/Dockerfile b/agentic-workflows/multi-agentic-travel-advisor/weather_agent/Dockerfile similarity index 97% rename from multi-agentic-travel-advisor/weather_agent/Dockerfile rename to agentic-workflows/multi-agentic-travel-advisor/weather_agent/Dockerfile index 9ff3b86..23db504 100644 --- a/multi-agentic-travel-advisor/weather_agent/Dockerfile +++ b/agentic-workflows/multi-agentic-travel-advisor/weather_agent/Dockerfile @@ -1,5 +1,5 @@ # Use a slim Python base image -FROM python:3.10-slim +FROM python:3.12-slim ENV PYTHONUNBUFFERED=1 diff --git a/multi-agentic-travel-advisor/weather_agent/agent.proto b/agentic-workflows/multi-agentic-travel-advisor/weather_agent/agent.proto similarity index 96% rename from multi-agentic-travel-advisor/weather_agent/agent.proto rename to agentic-workflows/multi-agentic-travel-advisor/weather_agent/agent.proto index 92378c2..cf19c08 100644 --- a/multi-agentic-travel-advisor/weather_agent/agent.proto +++ b/agentic-workflows/multi-agentic-travel-advisor/weather_agent/agent.proto @@ -18,7 +18,6 @@ enum AgentType { WEATHER = 1; PLACES = 2; FOOD = 3; - MAP = 4; } message AgentResponse { diff --git a/multi-agentic-travel-advisor/weather_agent/build_and_deploy.sh b/agentic-workflows/multi-agentic-travel-advisor/weather_agent/build_and_deploy.sh similarity index 100% rename from multi-agentic-travel-advisor/weather_agent/build_and_deploy.sh rename to agentic-workflows/multi-agentic-travel-advisor/weather_agent/build_and_deploy.sh diff --git a/multi-agentic-travel-advisor/weather_agent/client.py b/agentic-workflows/multi-agentic-travel-advisor/weather_agent/client.py similarity index 100% rename from multi-agentic-travel-advisor/weather_agent/client.py rename to agentic-workflows/multi-agentic-travel-advisor/weather_agent/client.py diff --git a/multi-agentic-travel-advisor/weather_agent/requirements.txt b/agentic-workflows/multi-agentic-travel-advisor/weather_agent/requirements.txt similarity index 57% rename from multi-agentic-travel-advisor/weather_agent/requirements.txt rename to agentic-workflows/multi-agentic-travel-advisor/weather_agent/requirements.txt index 445cba9..28e7e19 100644 --- a/multi-agentic-travel-advisor/weather_agent/requirements.txt +++ b/agentic-workflows/multi-agentic-travel-advisor/weather_agent/requirements.txt @@ -1,7 +1,7 @@ -grpcio==1.38.0 -grpcio-tools==1.38.0 +grpcio +grpcio-tools grpc-interceptor -protobuf==3.16.0 +protobuf multithreading openai requests diff --git a/multi-agentic-travel-advisor/weather_agent/server.py b/agentic-workflows/multi-agentic-travel-advisor/weather_agent/server.py similarity index 100% rename from multi-agentic-travel-advisor/weather_agent/server.py rename to agentic-workflows/multi-agentic-travel-advisor/weather_agent/server.py diff --git a/multi-agentic-travel-advisor/weather_agent/tool_calling/llm_client.py b/agentic-workflows/multi-agentic-travel-advisor/weather_agent/tool_calling/llm_client.py similarity index 100% rename from multi-agentic-travel-advisor/weather_agent/tool_calling/llm_client.py rename to agentic-workflows/multi-agentic-travel-advisor/weather_agent/tool_calling/llm_client.py diff --git a/multi-agentic-travel-advisor/weather_agent/tool_calling/tools.py b/agentic-workflows/multi-agentic-travel-advisor/weather_agent/tool_calling/tools.py similarity index 100% rename from multi-agentic-travel-advisor/weather_agent/tool_calling/tools.py rename to agentic-workflows/multi-agentic-travel-advisor/weather_agent/tool_calling/tools.py diff --git a/multi-agentic-travel-advisor/chatbot/requirements.txt b/multi-agentic-travel-advisor/chatbot/requirements.txt deleted file mode 100644 index 52b2ced..0000000 --- a/multi-agentic-travel-advisor/chatbot/requirements.txt +++ /dev/null @@ -1,6 +0,0 @@ -grpcio==1.38.0 -grpcio-tools==1.38.0 -grpc-interceptor -protobuf==3.16.0 -multithreading -Flask \ No newline at end of file diff --git a/multi-agentic-travel-advisor/chatbot/templates/chat.html b/multi-agentic-travel-advisor/chatbot/templates/chat.html deleted file mode 100644 index 391b401..0000000 --- a/multi-agentic-travel-advisor/chatbot/templates/chat.html +++ /dev/null @@ -1,181 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <meta charset="UTF-8"> - <meta name="viewport" content="width=device-width, initial-scale=1.0"> - <title>Travel Advisor</title> - - <!-- Leaflet.js CSS --> - <link rel="stylesheet" href="https://unpkg.com/leaflet@1.7.1/dist/leaflet.css" /> - - <!-- Font Awesome for icons --> - <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.0/css/all.min.css"> - - <style> - body, html { - height: 100%; - margin: 0; - font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; - } - - /* Create the map container to be the background */ - #map { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - z-index: -1; /* Ensure the map is behind everything else */ - } - - .overlay { - background: rgba(255, 255, 255, 0.85); - min-height: 100vh; - padding: 40px 20px; - display: flex; - flex-direction: column; - align-items: center; - z-index: 1; - } - - h1 { - font-size: 2.5em; - margin-bottom: 10px; - color: #2c3e50; - } - - form { - display: flex; - background: #fff; - padding: 15px 20px; - border-radius: 10px; - box-shadow: 0 2px 10px rgba(0, 0, 0, 0.15); - width: 100%; - max-width: 600px; - margin-bottom: 30px; - gap: 10px; - } - - input[type="text"] { - flex: 1; - padding: 12px; - font-size: 16px; - border: 1px solid #ccc; - border-radius: 6px; - } - - button { - background-color: #3498db; - color: white; - border: none; - border-radius: 6px; - padding: 12px 20px; - font-size: 16px; - cursor: pointer; - transition: background-color 0.3s ease; - } - - button:hover { - background-color: #2980b9; - } - - .chat-box { - background: white; - overflow-y: auto; - padding: 15px; - border-radius: 8px; - width: 100%; - max-width: 600px; - box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); - font-size: 14px; /* Reduced font size for better readability */ - word-wrap: break-word; /* Ensures words break appropriately */ - } - - .chat-line { - padding: 8px 12px; /* Reduced padding */ - margin: 8px 0; /* Added margin for separation between lines */ - border-radius: 8px; - display: flex; - flex-direction: column; /* Ensure messages are stacked vertically */ - align-items: flex-start; /* Align text to the left */ - gap: 8px; /* Reduced gap between text and icon */ - white-space: pre-wrap; /* Ensures line breaks are respected */ - max-width: 100%; /* Ensures lines don’t break out of the container */ - word-wrap: break-word; /* Allow words to wrap within the container */ - overflow-wrap: break-word; /* Forces long words to break and wrap */ - word-break: break-all; /* Breaks long words at any point */ - } - - .user { - text-align: right; - background-color: #d0f0fd; - align-self: flex-end; - } - - .bot { - text-align: left; - background-color: #fef1e6; - align-self: flex-start; - } - - .chat-line i { - margin-right: 8px; /* Reduced icon margin */ - color: #555; - } - - /* Smaller font size for mobile screens */ - @media (max-width: 600px) { - .chat-box { - font-size: 12px; /* Even smaller text on smaller screens */ - } - } - - </style> - -</head> -<body> - <div id="map"></div> <!-- Map container for interactive background --> - - <div class="overlay"> - <h1><i class="fas fa-plane-departure"></i> Travel Advisor</h1> - - <form method="POST"> - <input type="text" id="user_query" name="user_query" placeholder="Ask right away!..." required> - <button type="submit"><i class="fas fa-paper-plane"></i></button> - </form> - - <div class="chat-box"> - <h2><i class="fas fa-comments"></i> Chat History</h2> - {% for line in chat_history %} - <p class="chat-line {{ 'user' if 'User:' in line else 'bot' }}"> - <i class="fas {{ 'fa-user' if 'User:' in line else 'fa-robot' }}"></i> - <!-- Using the |safe filter to render HTML content --> - {{ line|safe }} - </p> - {% endfor %} - </div> - - </div> - - <script src="https://unpkg.com/leaflet@1.7.1/dist/leaflet.js"></script> - <script> - var map = L.map('map').setView([51.505, -0.09], 2); - - L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { - attribution: '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors' - }).addTo(map); - - L.marker([51.505, -0.09]).addTo(map) - .bindPopup("<b>Welcome!</b><br>Ask me about your next trip.") - .openPopup(); - </script> - - <script> - window.onload = function() { - const chatBox = document.querySelector('.chat-box'); - chatBox.scrollTop = chatBox.scrollHeight; - }; - </script> - -</body> -</html> diff --git a/multi-agentic-travel-advisor/food_rec_agent/requirements.txt b/multi-agentic-travel-advisor/food_rec_agent/requirements.txt deleted file mode 100644 index 014cced..0000000 --- a/multi-agentic-travel-advisor/food_rec_agent/requirements.txt +++ /dev/null @@ -1,7 +0,0 @@ -grpcio==1.38.0 -grpcio-tools==1.38.0 -grpc-interceptor -protobuf==3.16.0 -multithreading -openai -requests \ No newline at end of file diff --git a/multi-agentic-travel-advisor/planner/requirements.txt b/multi-agentic-travel-advisor/planner/requirements.txt deleted file mode 100644 index 14e36e3..0000000 --- a/multi-agentic-travel-advisor/planner/requirements.txt +++ /dev/null @@ -1,9 +0,0 @@ -grpcio==1.38.0 -grpcio-tools==1.38.0 -grpc-interceptor -protobuf==3.16.0 -multithreading -Flask - -torch -transformers \ No newline at end of file diff --git a/multi-agentic-travel-advisor/planner/server.py b/multi-agentic-travel-advisor/planner/server.py deleted file mode 100644 index ad1e388..0000000 --- a/multi-agentic-travel-advisor/planner/server.py +++ /dev/null @@ -1,84 +0,0 @@ -import grpc -from concurrent import futures -import planner_pb2 -import planner_pb2_grpc -from transformers import pipeline -import logging -import time - -logger = logging.getLogger(__name__) -logging.basicConfig(level=logging.INFO) - -# Zero-shot classifier -classifier = pipeline("zero-shot-classification") - - -def match_agent(text): - candidate_labels = ["weather", "places", "food", "map"] - result = classifier(text, candidate_labels) - label = result["labels"][0] - - if label == "weather": - return planner_pb2.WEATHER - elif label == "places": - return planner_pb2.PLACES - elif label == "food": - return planner_pb2.FOOD - elif label == "map": - return planner_pb2.MAP - else: - return planner_pb2.UNKNOWN - - -class PlannerService(planner_pb2_grpc.PlannerServicer): - def __init__(self): - logger.info("PlannerService initialized.") - - def evaluateUserQueriesFromChatbot(self, request_iterator, context): - print("evaluateUserQueriesFromChatbot..............................") - for user_query in request_iterator: - logger.info(f"Received user query: {user_query.text}") - agent_type = match_agent(user_query.text) - logger.info(f"Matched agent type: {agent_type}") - - agent_response = planner_pb2.AgentRequest() - agent_response.text = user_query.text - agent_response.agent_type = agent_type - - if agent_type == planner_pb2.AgentType.WEATHER: - logger.info("Handling WEATHER agent.") - elif agent_type == planner_pb2.AgentType.PLACES: - logger.info("Handling PLACES agent.") - elif agent_type == planner_pb2.AgentType.FOOD: - logger.info("Handling FOOD agent.") - elif agent_type == planner_pb2.AgentType.MAP: - logger.info("Handling MAP agent.") - else: - agent_response.text = "Sorry, I couldn't understand the query." - - yield agent_response - - def processAgentResponsesFromAgent(self, request_iterator, context): - logger.info("Receiving AgentResponses from agent...") - - for response in request_iterator: - logger.info(f"Received AgentResponse: {response.text}") - res = planner_pb2.AgentResponse() - res.text = response.text - print(res) - yield res - - logger.info("Finished processing AgentResponses.") - - -def serve(): - server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) - planner_pb2_grpc.add_PlannerServicer_to_server(PlannerService(), server) - server.add_insecure_port("[::]:8061") - server.start() - logger.info("Planner Service running on port 8061") - server.wait_for_termination() - - -if __name__ == "__main__": - serve() -- GitLab