From d1118d375e26417cdcc8bba2b56bf6ba37768133 Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Mon, 20 Mar 2023 10:49:20 -0700 Subject: [PATCH] allow api_key assignment to occur after imports --- pyproject.toml | 5 +---- requirements.txt | 3 --- simple_conversation.py | 11 ++++------- simple_outbound_call.py | 9 +++++---- vocode/__init__.py | 2 +- vocode/conversation.py | 20 +++++++++----------- vocode/telephony/inbound_call_server.py | 18 +++++++----------- vocode/telephony/outbound_call.py | 21 +++++++++------------ vocode/telephony/zoom_dial_in.py | 14 +++++++------- 9 files changed, 43 insertions(+), 60 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index da08e8e..213969d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "vocode" -version = "0.1.45" +version = "0.1.48" description = "The all-in-one voice SDK" authors = ["Ajay Raj "] license = "MIT License" @@ -31,8 +31,6 @@ sounddevice = { version = "0.4.6", optional = true } starlette = "0.25.0" urllib3 = "1.26.14" uvicorn = "0.20.0" -black = "23.1.0" -flake8 = "6.0.0" mccabe = "0.7.0" mypy-extensions = "1.0.0" packaging = "23.0" @@ -45,7 +43,6 @@ pyjwt = "2.6.0" python-multipart = "0.0.6" pytz = "2022.7.1" tomli = "2.0.1" -twilio = "7.16.5" [tool.poetry.extras] io = ["pyaudio", "sounddevice"] diff --git a/requirements.txt b/requirements.txt index e0ef495..743e385 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,12 +1,10 @@ anyio==3.6.2 -black==23.1.0 certifi==2022.12.7 cffi==1.15.1 charset-normalizer==3.0.1 click==8.1.3 decorator==5.1.1 fastapi==0.92.0 -flake8==6.0.0 h11==0.14.0 idna==3.4 mccabe==0.7.0 @@ -31,7 +29,6 @@ sniffio==1.3.0 sounddevice==0.4.6 starlette==0.25.0 tomli==2.0.1 -twilio==7.16.5 typing_extensions>=3.10.0.2 urllib3==1.26.14 uvicorn==0.20.0 diff --git a/simple_conversation.py b/simple_conversation.py index 118a6f0..63feef6 100644 --- a/simple_conversation.py +++ b/simple_conversation.py @@ -3,13 +3,6 @@ import logging import signal from dotenv import load_dotenv import os - -load_dotenv() - -import vocode - -vocode.api_key = os.getenv("VOCODE_API_KEY") - from vocode.conversation import Conversation from vocode.helpers import create_microphone_input_and_speaker_output from vocode.models.transcriber import ( @@ -30,6 +23,10 @@ from vocode.models.agent import ( from vocode.models.message import BaseMessage from vocode.models.synthesizer import AzureSynthesizerConfig from vocode.user_implemented_agent.restful_agent import RESTfulAgent +import vocode + +load_dotenv() +vocode.api_key = os.getenv("VOCODE_API_KEY") logging.basicConfig() logging.root.setLevel(logging.INFO) diff --git a/simple_outbound_call.py b/simple_outbound_call.py index f818502..c8fa80a 100644 --- a/simple_outbound_call.py +++ b/simple_outbound_call.py @@ -12,18 +12,19 @@ from vocode.telephony.zoom_dial_in import ZoomDialIn if __name__ == "__main__": call = ZoomDialIn( - recipient=CallEntity(phone_number=""), + recipient=CallEntity(phone_number=""), caller=CallEntity( - phone_number="", + phone_number="", ), - zoom_meeting_id="", - zoom_meeting_password="", + zoom_meeting_id="", + zoom_meeting_password="", agent_config=ChatGPTAgentConfig( initial_message=BaseMessage(text="the quick fox jumped over the lazy dog "), prompt_preamble="respond two sentences at a time", generate_responses=True, end_conversation_on_goodbye=True, send_filler_audio=True, + allowed_idle_time_seconds=30 ), synthesizer_config=AzureSynthesizerConfig.from_output_device( output_device=TelephoneOutput(), voice_name="en-US-JennyNeural" diff --git a/vocode/__init__.py b/vocode/__init__.py index 9ce073d..cffada6 100644 --- a/vocode/__init__.py +++ b/vocode/__init__.py @@ -4,4 +4,4 @@ from dotenv import load_dotenv load_dotenv() api_key = os.getenv("VOCODE_API_KEY") -BASE_URL = os.getenv("VOCODE_BASE_URL", "api.vocode.dev") \ No newline at end of file +base_url = os.getenv("VOCODE_BASE_URL", "api.vocode.dev") \ No newline at end of file diff --git a/vocode/conversation.py b/vocode/conversation.py index 89ace0a..6c4fb50 100644 --- a/vocode/conversation.py +++ b/vocode/conversation.py @@ -7,19 +7,16 @@ import os import logging import threading import queue +import vocode +from vocode.input_device.base_input_device import BaseInputDevice +from vocode.output_device.base_output_device import BaseOutputDevice +from vocode.models.transcriber import TranscriberConfig +from vocode.models.agent import AgentConfig +from vocode.models.synthesizer import SynthesizerConfig +from vocode.models.websocket import ReadyMessage, AudioMessage, StartMessage, StopMessage load_dotenv() -from .input_device.base_input_device import BaseInputDevice -from .output_device.base_output_device import BaseOutputDevice -from .models.transcriber import TranscriberConfig -from .models.agent import AgentConfig -from .models.synthesizer import SynthesizerConfig -from .models.websocket import ReadyMessage, AudioMessage, StartMessage, StopMessage -from . import api_key, BASE_URL - -VOCODE_WEBSOCKET_URL = f"wss://{BASE_URL}/conversation" - class Conversation: def __init__( self, @@ -41,6 +38,7 @@ class Conversation: self.active = True self.output_loop = asyncio.new_event_loop() self.output_audio_queue = queue.Queue() + self.vocode_websocket_url = f"wss://{vocode.base_url}/conversation" async def wait_for_ready(self): while not self.receiver_ready: @@ -63,7 +61,7 @@ class Conversation: loop.run_until_complete(run()) async def start(self): - async with websockets.connect(f"{VOCODE_WEBSOCKET_URL}?key={api_key}") as ws: + async with websockets.connect(f"{self.vocode_websocket_url}?key={vocode.api_key}") as ws: async def sender(ws: WebSocketClientProtocol): start_message = StartMessage( diff --git a/vocode/telephony/inbound_call_server.py b/vocode/telephony/inbound_call_server.py index 64c1d01..4b637e0 100644 --- a/vocode/telephony/inbound_call_server.py +++ b/vocode/telephony/inbound_call_server.py @@ -2,17 +2,12 @@ from fastapi import FastAPI, Response, Form from typing import Optional import requests import uvicorn -from vocode.models.synthesizer import SynthesizerConfig -from twilio.jwt.access_token.grants import VoiceGrant +import vocode from vocode.models.transcriber import TranscriberConfig -from .. import api_key, BASE_URL - -from ..models.agent import AgentConfig -from ..models.telephony import CreateInboundCall, TwilioConfig, TwilioConfig - -VOCODE_INBOUND_CALL_URL = f"https://{BASE_URL}/create_inbound_call" - +from vocode.models.synthesizer import SynthesizerConfig +from vocode.models.agent import AgentConfig +from vocode.models.telephony import CreateInboundCall, TwilioConfig, TwilioConfig class InboundCallServer: def __init__( @@ -33,11 +28,12 @@ class InboundCallServer: or "The line is really busy right now, check back later!" ) self.twilio_config = twilio_config + self.vocode_inbound_call_url = f"https://{vocode.base_url}/create_inbound_call" async def handle_call(self, twilio_sid: str = Form(alias="CallSid")): response = requests.post( - VOCODE_INBOUND_CALL_URL, - headers={"Authorization": f"Bearer {api_key}"}, + self.vocode_inbound_call_url, + headers={"Authorization": f"Bearer {vocode.api_key}"}, json=CreateInboundCall( agent_config=self.agent_config, twilio_sid=twilio_sid, diff --git a/vocode/telephony/outbound_call.py b/vocode/telephony/outbound_call.py index 0eb864d..e3d765d 100644 --- a/vocode/telephony/outbound_call.py +++ b/vocode/telephony/outbound_call.py @@ -1,4 +1,7 @@ from typing import Optional +import requests + +import vocode from vocode.models.agent import AgentConfig from vocode.models.synthesizer import SynthesizerConfig from vocode.models.transcriber import TranscriberConfig @@ -8,14 +11,6 @@ from ..models.telephony import ( EndOutboundCall, TwilioConfig, ) -import requests -from .. import api_key, BASE_URL - -from twilio.jwt.access_token.grants import VoiceGrant - - -VOCODE_CREATE_OUTBOUND_CALL_URL = f"https://{BASE_URL}/create_outbound_call" -VOCODE_END_OUTBOUND_CALL_URL = f"https://{BASE_URL}/end_outbound_call" class OutboundCall: @@ -36,11 +31,13 @@ class OutboundCall: self.synthesizer_config = synthesizer_config self.conversation_id = conversation_id self.twilio_config = twilio_config + self.vocode_create_outbound_call_url = f"https://{vocode.base_url}/create_outbound_call" + self.vocode_end_outbound_call_url = f"https://{vocode.base_url}/end_outbound_call" def start(self) -> str: response = requests.post( - VOCODE_CREATE_OUTBOUND_CALL_URL, - headers={"Authorization": f"Bearer {api_key}"}, + self.vocode_create_outbound_call_url, + headers={"Authorization": f"Bearer {vocode.api_key}"}, json=CreateOutboundCall( recipient=self.recipient, caller=self.caller, @@ -57,8 +54,8 @@ class OutboundCall: def end(self) -> str: response = requests.post( - VOCODE_END_OUTBOUND_CALL_URL, - headers={"Authorization": f"Bearer {api_key}"}, + self.vocode_end_outbound_call_url, + headers={"Authorization": f"Bearer {vocode.api_key}"}, json=EndOutboundCall( call_id=self.conversation_id, twilio_config=self.twilio_config, diff --git a/vocode/telephony/zoom_dial_in.py b/vocode/telephony/zoom_dial_in.py index 55b3583..6062b3d 100644 --- a/vocode/telephony/zoom_dial_in.py +++ b/vocode/telephony/zoom_dial_in.py @@ -1,17 +1,16 @@ from typing import Optional +import requests + +import vocode from vocode.models.agent import AgentConfig from vocode.models.synthesizer import SynthesizerConfig from vocode.models.transcriber import TranscriberConfig from vocode.telephony.outbound_call import OutboundCall -from ..models.telephony import ( +from vocode.models.telephony import ( CallEntity, DialIntoZoomCall, TwilioConfig, ) -import requests -from .. import api_key, BASE_URL - -VOCODE_ZOOM_DIAL_IN_URL = f"https://{BASE_URL}/dial_into_zoom_call" class ZoomDialIn(OutboundCall): @@ -38,11 +37,12 @@ class ZoomDialIn(OutboundCall): ) self.zoom_meeting_id = zoom_meeting_id self.zoom_meeting_password = zoom_meeting_password + self.vocode_zoom_dial_in_url = f"https://{vocode.base_url}/dial_into_zoom_call" def start(self) -> str: response = requests.post( - VOCODE_ZOOM_DIAL_IN_URL, - headers={"Authorization": f"Bearer {api_key}"}, + self.vocode_zoom_dial_in_url, + headers={"Authorization": f"Bearer {vocode.api_key}"}, json=DialIntoZoomCall( recipient=self.recipient, caller=self.caller,