From 9f914f8d479d58d7ccc045784fe614dfea9a1219 Mon Sep 17 00:00:00 2001 From: Navan Chauhan Date: Fri, 13 Oct 2023 23:50:10 -0600 Subject: langchain --- tools/contacts.py | 19 +++++++++++++++++ tools/vocode.py | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 tools/contacts.py create mode 100644 tools/vocode.py (limited to 'tools') diff --git a/tools/contacts.py b/tools/contacts.py new file mode 100644 index 0000000..4f4a3be --- /dev/null +++ b/tools/contacts.py @@ -0,0 +1,19 @@ +from typing import List +from langchain.agents import tool + +from dotenv import load_dotenv +load_dotenv() + +import os + +CONTACTS = [ + { + "name": "Greg", + "phone" : os.getenv("TEST_PHONE_NUMBER") + } +] + +@tool("get_all_contacts") +def get_all_contacts(placeholder: str) -> List[dict]: + """Returns all contacts in the user's phone book.""" + return CONTACTS \ No newline at end of file diff --git a/tools/vocode.py b/tools/vocode.py new file mode 100644 index 0000000..f752eff --- /dev/null +++ b/tools/vocode.py @@ -0,0 +1,64 @@ +import logging +import asyncio +import os +from langchain.agents import tool +from dotenv import load_dotenv + +from vocode.streaming.models.message import BaseMessage +from vocode.streaming.models.synthesizer import ElevenLabsSynthesizerConfig +from vocode.streaming.models.transcriber import DeepgramTranscriberConfig, PunctuationEndpointingConfig + + +load_dotenv() + +from call_transcript_utils import delete_transcript, get_transcript + +from vocode.streaming.telephony.conversation.outbound_call import OutboundCall +from vocode.streaming.telephony.config_manager.redis_config_manager import ( + RedisConfigManager, +) +from vocode.streaming.models.agent import ChatGPTAgentConfig +import time + +LOOP = asyncio.new_event_loop() +asyncio.set_event_loop(LOOP) + +@tool("call phone number") +def call_phone_number(input: str) -> str: + """calls a phone number as a bot and returns a transcript of the conversation. + the input to this tool is a pipe separated list of a phone number, a prompt, and the first thing the bot should say. + The prompt should instruct the bot with what to do on the call and be in the 3rd person, + like 'the assistant is performing this task' instead of 'perform this task'. + + should only use this tool once it has found an adequate phone number to call. + + for example, `+15555555555|the assistant is explaining the meaning of life|i'm going to tell you the meaning of life` will call +15555555555, say 'i'm going to tell you the meaning of life', and instruct the assistant to tell the human what the meaning of life is. + """ + phone_number, prompt, initial_message = input.split("|",2) + call = OutboundCall( + base_url=os.environ["BASE_URL"], + to_phone=phone_number, + from_phone=os.environ['TWILIO_PHONE'], + config_manager=RedisConfigManager(), + agent_config=ChatGPTAgentConfig( + initial_message=BaseMessage(text=initial_message), + prompt_preamble=prompt, + generate_responses=True, + ), + synthesizer_config=ElevenLabsSynthesizerConfig.from_telephone_output_device( + api_key=os.getenv("ELEVENLABS_API_KEY"), + voice_id=os.getenv("ELEVENLABS_VOICE_ID") + ), + transcriber_config=DeepgramTranscriberConfig.from_telephone_input_device( + endpointing_config=PunctuationEndpointingConfig() + ), + logger=logging.Logger("OutboundCall") + ) + LOOP.run_until_complete(call.start()) + while True: + maybe_transcript = get_transcript(call.conversation_id) + if maybe_transcript: + delete_transcript(call.conversation_id) + return maybe_transcript + else: + time.sleep(1) \ No newline at end of file -- cgit v1.2.3