From b774e273047ec6d5a48adef1a0699c46886d1e3a Mon Sep 17 00:00:00 2001 From: Harrison Chase Date: Thu, 3 Oct 2024 09:30:39 -0700 Subject: [PATCH] cr --- README.md | 28 +++++++++++++++++++++++++--- server/src/server/app.py | 19 ++++--------------- server/src/server/prompt.py | 1 + server/src/server/tools.py | 17 +++++++++++++++++ static/react.png | Bin 0 -> 27970 bytes 5 files changed, 47 insertions(+), 18 deletions(-) create mode 100644 server/src/server/prompt.py create mode 100644 server/src/server/tools.py create mode 100644 static/react.png diff --git a/README.md b/README.md index fb655f5..94bac03 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,10 @@ -# Demo Voice React Agent +# 🦜🎤 Voice ReAct Agent + +This is an implementation of a [ReAct](https://arxiv.org/abs/2210.03629)-style agent that uses OpenAI's new [Realtime API](https://platform.openai.com/docs/guides/realtime). + +Specifically, we enable this model to call tools by providing it a list of [LangChain tools](https://python.langchain.com/docs/how_to/custom_tools/#creating-tools-from-functions). It is easy to write custom tools, and you can easily pass these to the model. + +![](static/react.png) ## Installation @@ -15,6 +21,8 @@ export OPENAI_API_KEY=your_openai_api_key export TAVILY_API_KEY=your_tavily_api_key ``` +Note: the Tavily API key is for the Tavily search engine, you can get an API key [here](https://app.tavily.com/). This is just an example tool, and if you do not want to use it you do not have to (see [Adding your own tools](#adding-your-own-tools)) + ## Running the project To run the project, execute the following command: @@ -28,7 +36,21 @@ uv run src/server/app.py Now you can open the browser and navigate to `http://localhost:3000` to see the project running. +### Enable microphone + +You may need to make sure that your browser can access your microphone. + +- [Chrome](http://0.0.0.0:3000/) + ## Adding your own tools -You can add your own tools by adding them to the `server/src/server/app.py` file -in the webhook handler. +You can add your own tools by adding them to the `server/src/server/tools.py` file. + +## Adding your own custom instructions + +You can add your own custom instructions by adding them to the `server/src/server/prompt.py` file. + +## Next steps + +[] Enable interrupting the AI +[] Enable changing of instructions/tools based on state diff --git a/server/src/server/app.py b/server/src/server/app.py index aa751bf..9dbee75 100644 --- a/server/src/server/app.py +++ b/server/src/server/app.py @@ -5,12 +5,12 @@ from starlette.routing import Route, WebSocketRoute from starlette.staticfiles import StaticFiles from starlette.websockets import WebSocket -from langchain_core.tools import tool from langchain_openai_voice import OpenAIVoiceReactAgent -from langchain_community.tools import TavilySearchResults from server.utils import websocket_stream +from server.prompt import INSTRUCTIONS +from server.tools import TOOLS async def websocket_endpoint(websocket: WebSocket): @@ -18,21 +18,10 @@ async def websocket_endpoint(websocket: WebSocket): browser_receive_stream = websocket_stream(websocket) - @tool - def add(a: int, b: int): - """Add two numbers. Please let the user know that you're adding the numbers BEFORE you call the tool""" - return a + b - - tavily_tool = TavilySearchResults( - max_results=5, - include_answer=True, - ) - tavily_tool.description += "\n\nLet the user know you're asking your friend Tavily for help before you call the tool." - agent = OpenAIVoiceReactAgent( model="gpt-4o-realtime-preview", - tools=[add], # no tools for now - instructions="You are a helpful assistant.", + tools=TOOLS, + instructions=INSTRUCTIONS, ) await agent.aconnect(browser_receive_stream, websocket.send_text) diff --git a/server/src/server/prompt.py b/server/src/server/prompt.py new file mode 100644 index 0000000..62d3a20 --- /dev/null +++ b/server/src/server/prompt.py @@ -0,0 +1 @@ +INSTRUCTIONS = "You are a helpful assistant." diff --git a/server/src/server/tools.py b/server/src/server/tools.py new file mode 100644 index 0000000..c2f50b8 --- /dev/null +++ b/server/src/server/tools.py @@ -0,0 +1,17 @@ +from langchain_core.tools import tool + +from langchain_community.tools import TavilySearchResults + + +@tool +def add(a: int, b: int): + """Add two numbers. Please let the user know that you're adding the numbers BEFORE you call the tool""" + return a + b + +tavily_tool = TavilySearchResults( + max_results=5, + include_answer=True, + description="This is a search tool for accessing the internet.\n\nLet the user know you're asking your friend Tavily for help before you call the tool." +) + +TOOLS = [add, tavily_tool] \ No newline at end of file diff --git a/static/react.png b/static/react.png new file mode 100644 index 0000000000000000000000000000000000000000..e107261ac21ca851b5f574b54ad9eb13efe2d71f GIT binary patch literal 27970 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 NE2$(=DP|J*e*nDdGByAJ literal 0 HcmV?d00001