Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 38 additions & 7 deletions agent/agent.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
from contextlib import contextmanager, asynccontextmanager
from typing import Optional, List, Any

from concurrent import futures
import grpc
from dotenv import load_dotenv
from langchain_core.language_models import BaseChatModel
from langchain_core.messages import SystemMessage
Expand All @@ -14,6 +16,9 @@
from langgraph.checkpoint.sqlite.aio import AsyncSqliteSaver
from langgraph.prebuilt import create_react_agent, ToolNode

import mainService_pb2
import mainService_pb2_grpc

# System message defining the chatbot's role and behavior
SYSTEM_PROMPT = SystemMessage(
"""
Expand Down Expand Up @@ -91,18 +96,44 @@ async def run(self):

async def query_agent(self, message: str):
"""Sends user input to the chatbot and processes its responses."""
response = ""
async with self.agent_context() as agent:
async for event in agent.astream_events(
{"messages": [message]},
config=self.config,
version="v2",
{"messages": [message]},
config=self.config,
version="v2",
):
await self.handle_event(event)
if event["event"] == "on_chat_model_stream":
chunk = event["data"].get("chunk")
if chunk:
response += chunk.content

return response

class RouteGuideServicer(mainService_pb2_grpc.TravelChatServiceServicer):
def __init__(self):
self.executor = Executor()

async def getFeedback(self, request, context):
return mainService_pb2.FeedbackResponse(message="Feedback received")

return await agent.aget_state(self.config)
async def sendInput(self, request, context):
user_input = request.stringInput.value
response = self.executor.query_agent(user_input)

# Assuming your proto file has a SendInputResponse message with a 'response' field
return mainService_pb2.SendInputResponse(response=response)


if __name__ == "__main__":

load_dotenv()
executor = Executor()
asyncio.run(executor.run())
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
mainService_pb2_grpc.add_TravelChatServiceServicer_to_server(RouteGuideServicer(), server)
server.add_insecure_port("[::]:50051")
server.start()
server.wait_for_termination()

# load_dotenv()
# executor = Executor()
# asyncio.run(executor.run())
25 changes: 25 additions & 0 deletions agent/client.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import grpc
import mainService_pb2
import mainService_pb2_grpc
import userInput_pb2

def run():
# Connect to the gRPC server
channel = grpc.insecure_channel("localhost:50051")
stub = mainService_pb2_grpc.TravelChatServiceStub(channel)

while True:
user_input = input("You: ")
if user_input.lower() in {"exit", "quit"}:
break

# Create request object
request = userInput_pb2.UserInput(stringInput=userInput_pb2.StringInput(value=user_input))

# Call the gRPC method
response = stub.sendInput(request)

print(f"Assistant: {response}")

if __name__ == "__main__":
run()
42 changes: 42 additions & 0 deletions agent/feedback_pb2.py

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

24 changes: 24 additions & 0 deletions agent/feedback_pb2_grpc.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
"""Client and server classes corresponding to protobuf-defined services."""
import grpc
import warnings


GRPC_GENERATED_VERSION = '1.70.0'
GRPC_VERSION = grpc.__version__
_version_not_supported = False

try:
from grpc._utilities import first_version_is_lower
_version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION)
except ImportError:
_version_not_supported = True

if _version_not_supported:
raise RuntimeError(
f'The grpc package installed is at version {GRPC_VERSION},'
+ f' but the generated code in feedback_pb2_grpc.py depends on'
+ f' grpcio>={GRPC_GENERATED_VERSION}.'
+ f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}'
+ f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.'
)
39 changes: 39 additions & 0 deletions agent/mainService_pb2.py

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

142 changes: 142 additions & 0 deletions agent/mainService_pb2_grpc.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
"""Client and server classes corresponding to protobuf-defined services."""
import grpc
import warnings

import feedback_pb2 as feedback__pb2
from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
import userInput_pb2 as userInput__pb2

GRPC_GENERATED_VERSION = '1.70.0'
GRPC_VERSION = grpc.__version__
_version_not_supported = False

try:
from grpc._utilities import first_version_is_lower
_version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION)
except ImportError:
_version_not_supported = True

if _version_not_supported:
raise RuntimeError(
f'The grpc package installed is at version {GRPC_VERSION},'
+ f' but the generated code in mainService_pb2_grpc.py depends on'
+ f' grpcio>={GRPC_GENERATED_VERSION}.'
+ f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}'
+ f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.'
)


class TravelChatServiceStub(object):
"""Missing associated documentation comment in .proto file."""

def __init__(self, channel):
"""Constructor.

Args:
channel: A grpc.Channel.
"""
self.sendInput = channel.unary_unary(
'/TravelChatService/sendInput',
request_serializer=userInput__pb2.UserInput.SerializeToString,
response_deserializer=userInput__pb2.UserInputResponse.FromString,
_registered_method=True)
self.getFeedback = channel.unary_stream(
'/TravelChatService/getFeedback',
request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
response_deserializer=feedback__pb2.Feedback.FromString,
_registered_method=True)


class TravelChatServiceServicer(object):
"""Missing associated documentation comment in .proto file."""

def sendInput(self, request, context):
"""Missing associated documentation comment in .proto file."""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')

def getFeedback(self, request, context):
"""Missing associated documentation comment in .proto file."""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')


def add_TravelChatServiceServicer_to_server(servicer, server):
rpc_method_handlers = {
'sendInput': grpc.unary_unary_rpc_method_handler(
servicer.sendInput,
request_deserializer=userInput__pb2.UserInput.FromString,
response_serializer=userInput__pb2.UserInputResponse.SerializeToString,
),
'getFeedback': grpc.unary_stream_rpc_method_handler(
servicer.getFeedback,
request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
response_serializer=feedback__pb2.Feedback.SerializeToString,
),
}
generic_handler = grpc.method_handlers_generic_handler(
'TravelChatService', rpc_method_handlers)
server.add_generic_rpc_handlers((generic_handler,))
server.add_registered_method_handlers('TravelChatService', rpc_method_handlers)


# This class is part of an EXPERIMENTAL API.
class TravelChatService(object):
"""Missing associated documentation comment in .proto file."""

@staticmethod
def sendInput(request,
target,
options=(),
channel_credentials=None,
call_credentials=None,
insecure=False,
compression=None,
wait_for_ready=None,
timeout=None,
metadata=None):
return grpc.experimental.unary_unary(
request,
target,
'/TravelChatService/sendInput',
userInput__pb2.UserInput.SerializeToString,
userInput__pb2.UserInputResponse.FromString,
options,
channel_credentials,
insecure,
call_credentials,
compression,
wait_for_ready,
timeout,
metadata,
_registered_method=True)

@staticmethod
def getFeedback(request,
target,
options=(),
channel_credentials=None,
call_credentials=None,
insecure=False,
compression=None,
wait_for_ready=None,
timeout=None,
metadata=None):
return grpc.experimental.unary_stream(
request,
target,
'/TravelChatService/getFeedback',
google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
feedback__pb2.Feedback.FromString,
options,
channel_credentials,
insecure,
call_credentials,
compression,
wait_for_ready,
timeout,
metadata,
_registered_method=True)
42 changes: 42 additions & 0 deletions agent/userInput_pb2.py

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading