add support for user twilio config
This commit is contained in:
parent
f965f32288
commit
a03a3634b5
5 changed files with 13 additions and 62 deletions
|
|
@ -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):
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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",
|
|
||||||
)
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue