add support for user twilio config

This commit is contained in:
Ajay Raj 2023-03-18 15:40:14 -07:00
commit a03a3634b5
5 changed files with 13 additions and 62 deletions

View file

@ -10,13 +10,6 @@ class TwilioConfig(BaseModel):
auth_token: str auth_token: str
class InternalTwilioConfig(BaseModel):
account_sid: str
api_key: str
api_secret: str
outgoing_application_sid: str
class CallEntity(BaseModel): class CallEntity(BaseModel):
phone_number: str phone_number: str
@ -31,6 +24,7 @@ class CreateInboundCall(BaseModel):
class EndOutboundCall(BaseModel): class EndOutboundCall(BaseModel):
call_id: str call_id: str
twilio_config: Optional[TwilioConfig] = None
class CreateOutboundCall(BaseModel): class CreateOutboundCall(BaseModel):

View file

@ -6,11 +6,10 @@ from vocode.models.synthesizer import SynthesizerConfig
from twilio.jwt.access_token.grants import VoiceGrant from twilio.jwt.access_token.grants import VoiceGrant
from vocode.models.transcriber import TranscriberConfig from vocode.models.transcriber import TranscriberConfig
from vocode.telephony.utils import create_access_token
from .. import api_key, BASE_URL from .. import api_key, BASE_URL
from ..models.agent import AgentConfig from ..models.agent import AgentConfig
from ..models.telephony import CreateInboundCall, InternalTwilioConfig, TwilioConfig from ..models.telephony import CreateInboundCall, TwilioConfig, TwilioConfig
VOCODE_INBOUND_CALL_URL = f"https://{BASE_URL}/create_inbound_call" VOCODE_INBOUND_CALL_URL = f"https://{BASE_URL}/create_inbound_call"
@ -22,7 +21,7 @@ class InboundCallServer:
transcriber_config: Optional[TranscriberConfig] = None, transcriber_config: Optional[TranscriberConfig] = None,
synthesizer_config: Optional[SynthesizerConfig] = None, synthesizer_config: Optional[SynthesizerConfig] = None,
response_on_rate_limit: Optional[str] = None, response_on_rate_limit: Optional[str] = None,
internal_twilio_config: Optional[InternalTwilioConfig] = None, twilio_config: Optional[TwilioConfig] = None,
): ):
self.agent_config = agent_config self.agent_config = agent_config
self.transcriber_config = transcriber_config self.transcriber_config = transcriber_config
@ -33,20 +32,7 @@ class InboundCallServer:
response_on_rate_limit response_on_rate_limit
or "The line is really busy right now, check back later!" or "The line is really busy right now, check back later!"
) )
self.internal_twilio_config = internal_twilio_config self.twilio_config = twilio_config
def create_twilio_config(self) -> TwilioConfig:
access_token = create_access_token(self.internal_twilio_config)
access_token.add_grant(
VoiceGrant(
outgoing_application_sid=self.internal_twilio_config.outgoing_application_sid,
incoming_allow=True,
)
)
return TwilioConfig(
account_sid=self.internal_twilio_config.account_sid,
access_token=access_token.to_jwt(),
)
async def handle_call(self, twilio_sid: str = Form(alias="CallSid")): async def handle_call(self, twilio_sid: str = Form(alias="CallSid")):
response = requests.post( response = requests.post(
@ -57,6 +43,7 @@ class InboundCallServer:
twilio_sid=twilio_sid, twilio_sid=twilio_sid,
transcriber_config=self.transcriber_config, transcriber_config=self.transcriber_config,
synthesizer_config=self.synthesizer_config, synthesizer_config=self.synthesizer_config,
twilio_config=self.twilio_config,
).dict(), ).dict(),
) )
if response.status_code == 429: if response.status_code == 429:

View file

@ -2,12 +2,10 @@ from typing import Optional
from vocode.models.agent import AgentConfig from vocode.models.agent import AgentConfig
from vocode.models.synthesizer import SynthesizerConfig from vocode.models.synthesizer import SynthesizerConfig
from vocode.models.transcriber import TranscriberConfig from vocode.models.transcriber import TranscriberConfig
from vocode.telephony.utils import create_access_token
from ..models.telephony import ( from ..models.telephony import (
CallEntity, CallEntity,
CreateOutboundCall, CreateOutboundCall,
EndOutboundCall, EndOutboundCall,
InternalTwilioConfig,
TwilioConfig, TwilioConfig,
) )
import requests import requests
@ -29,7 +27,7 @@ class OutboundCall:
transcriber_config: Optional[TranscriberConfig] = None, transcriber_config: Optional[TranscriberConfig] = None,
synthesizer_config: Optional[SynthesizerConfig] = None, synthesizer_config: Optional[SynthesizerConfig] = None,
conversation_id: Optional[str] = None, conversation_id: Optional[str] = None,
internal_twilio_config: Optional[InternalTwilioConfig] = None, twilio_config: Optional[TwilioConfig] = None,
): ):
self.recipient = recipient self.recipient = recipient
self.caller = caller self.caller = caller
@ -37,19 +35,7 @@ class OutboundCall:
self.transcriber_config = transcriber_config self.transcriber_config = transcriber_config
self.synthesizer_config = synthesizer_config self.synthesizer_config = synthesizer_config
self.conversation_id = conversation_id self.conversation_id = conversation_id
self.internal_twilio_config = internal_twilio_config self.twilio_config = twilio_config
def create_twilio_config(self) -> TwilioConfig:
access_token = create_access_token(self.internal_twilio_config)
access_token.add_grant(
VoiceGrant(
outgoing_application_sid=self.internal_twilio_config.outgoing_application_sid
)
)
return TwilioConfig(
account_sid=self.internal_twilio_config.account_sid,
access_token=access_token.to_jwt(),
)
def start(self) -> str: def start(self) -> str:
response = requests.post( response = requests.post(
@ -62,9 +48,7 @@ class OutboundCall:
transcriber_config=self.transcriber_config, transcriber_config=self.transcriber_config,
synthesizer_config=self.synthesizer_config, synthesizer_config=self.synthesizer_config,
conversation_id=self.conversation_id, conversation_id=self.conversation_id,
twilio_config=self.create_twilio_config() twilio_config=self.twilio_config,
if self.internal_twilio_config
else None,
).dict(), ).dict(),
) )
assert response.ok, response.text assert response.ok, response.text
@ -77,6 +61,7 @@ class OutboundCall:
headers={"Authorization": f"Bearer {api_key}"}, headers={"Authorization": f"Bearer {api_key}"},
json=EndOutboundCall( json=EndOutboundCall(
call_id=self.conversation_id, call_id=self.conversation_id,
twilio_config=self.twilio_config,
).dict(), ).dict(),
) )
assert response.ok, response.text assert response.ok or response.status_code == 404, response.text

View file

@ -1,12 +0,0 @@
from twilio.jwt.access_token import AccessToken
from vocode.models.telephony import InternalTwilioConfig
def create_access_token(twilio_config: InternalTwilioConfig):
return AccessToken(
twilio_config.account_sid,
twilio_config.api_key,
twilio_config.api_secret,
identity="user",
)

View file

@ -6,7 +6,6 @@ from vocode.telephony.outbound_call import OutboundCall
from ..models.telephony import ( from ..models.telephony import (
CallEntity, CallEntity,
DialIntoZoomCall, DialIntoZoomCall,
InternalTwilioConfig,
TwilioConfig, TwilioConfig,
) )
import requests import requests
@ -26,7 +25,7 @@ class ZoomDialIn(OutboundCall):
transcriber_config: Optional[TranscriberConfig] = None, transcriber_config: Optional[TranscriberConfig] = None,
synthesizer_config: Optional[SynthesizerConfig] = None, synthesizer_config: Optional[SynthesizerConfig] = None,
conversation_id: Optional[str] = None, conversation_id: Optional[str] = None,
internal_twilio_config: Optional[InternalTwilioConfig] = None, twilio_config: Optional[TwilioConfig] = None,
): ):
super().__init__( super().__init__(
recipient=recipient, recipient=recipient,
@ -35,7 +34,7 @@ class ZoomDialIn(OutboundCall):
transcriber_config=transcriber_config, transcriber_config=transcriber_config,
synthesizer_config=synthesizer_config, synthesizer_config=synthesizer_config,
conversation_id=conversation_id, conversation_id=conversation_id,
internal_twilio_config=internal_twilio_config, twilio_config=twilio_config,
) )
self.zoom_meeting_id = zoom_meeting_id self.zoom_meeting_id = zoom_meeting_id
self.zoom_meeting_password = zoom_meeting_password self.zoom_meeting_password = zoom_meeting_password
@ -53,9 +52,7 @@ class ZoomDialIn(OutboundCall):
transcriber_config=self.transcriber_config, transcriber_config=self.transcriber_config,
synthesizer_config=self.synthesizer_config, synthesizer_config=self.synthesizer_config,
conversation_id=self.conversation_id, conversation_id=self.conversation_id,
twilio_config=self.create_twilio_config() twilio_config=self.twilio_config,
if self.internal_twilio_config
else None,
).dict(), ).dict(),
) )
assert response.ok, response.text assert response.ok, response.text