Skip to content

Commit

Permalink
start adding voice api and ncco builder
Browse files Browse the repository at this point in the history
  • Loading branch information
maxkahan committed Apr 11, 2024
1 parent c45389b commit 5e7d13e
Show file tree
Hide file tree
Showing 38 changed files with 901 additions and 9 deletions.
2 changes: 1 addition & 1 deletion messages/src/vonage_messages/models/base_message.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from typing import Optional

from pydantic import BaseModel, Field
from vonage_utils.types.phone_number import PhoneNumber
from vonage_utils.types import PhoneNumber

from .enums import WebhookVersion

Expand Down
2 changes: 1 addition & 1 deletion messages/src/vonage_messages/models/mms.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from typing import Optional, Union

from pydantic import BaseModel, Field
from vonage_utils.types.phone_number import PhoneNumber
from vonage_utils.types import PhoneNumber

from .base_message import BaseMessage
from .enums import ChannelType, MessageType
Expand Down
2 changes: 1 addition & 1 deletion messages/src/vonage_messages/models/sms.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from typing import Optional, Union

from pydantic import BaseModel, Field
from vonage_utils.types.phone_number import PhoneNumber
from vonage_utils.types import PhoneNumber

from .base_message import BaseMessage
from .enums import ChannelType, EncodingType, MessageType
Expand Down
2 changes: 1 addition & 1 deletion messages/src/vonage_messages/models/whatsapp.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from typing import List, Literal, Optional, Union

from pydantic import BaseModel, ConfigDict, Field
from vonage_utils.types.phone_number import PhoneNumber
from vonage_utils.types import PhoneNumber

from .base_message import BaseMessage
from .enums import ChannelType, MessageType
Expand Down
2 changes: 1 addition & 1 deletion users/src/vonage_users/common.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from typing import List, Optional

from pydantic import BaseModel, Field, model_validator
from vonage_utils.types.phone_number import PhoneNumber
from vonage_utils.types import PhoneNumber


class Link(BaseModel):
Expand Down
2 changes: 1 addition & 1 deletion verify/src/vonage_verify/requests.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from typing import Literal, Optional

from pydantic import BaseModel, Field, model_validator
from vonage_utils.types.phone_number import PhoneNumber
from vonage_utils.types import PhoneNumber

from .language_codes import LanguageCode, Psd2LanguageCode

Expand Down
2 changes: 1 addition & 1 deletion verify_v2/src/vonage_verify_v2/requests.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from typing import List, Optional, Union

from pydantic import BaseModel, Field, field_validator, model_validator
from vonage_utils.types.phone_number import PhoneNumber
from vonage_utils.types import PhoneNumber

from .enums import ChannelType, Locale
from .errors import VerifyError
Expand Down
16 changes: 16 additions & 0 deletions voice/BUILD
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
resource(name='pyproject', source='pyproject.toml')
file(name='readme', source='README.md')

files(sources=['tests/data/*'])

python_distribution(
name='vonage-voice',
dependencies=[
':pyproject',
':readme',
'voice/src/vonage_voice',
],
provides=python_artifact(),
generate_setup=False,
repositories=['@pypi'],
)
5 changes: 5 additions & 0 deletions voice/CHANGES.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# 1.0.1
- Initial upload

# 1.0.0
- This version was skipped due to a technical issue with the package distribution. Please use version 1.0.1 or later.
9 changes: 9 additions & 0 deletions voice/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# Vonage Voice Package

This package contains the code to use [Vonage's Voice API](https://developer.vonage.com/en/voice/voice-api/overview) in Python. This package includes methods for working with the Voice API. It also contains an NCCO (Call Control Object) builder to help you to control call flow.

## Usage

It is recommended to use this as part of the main `vonage` package. The examples below assume you've created an instance of the `vonage.Vonage` class called `vonage_client`.

### Create a Call
29 changes: 29 additions & 0 deletions voice/pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
[project]
name = 'vonage-voice'
version = '1.0.0'
description = 'Vonage voice package'
readme = "README.md"
authors = [{ name = "Vonage", email = "devrel@vonage.com" }]
requires-python = ">=3.8"
dependencies = [
"vonage-http-client>=1.2.1",
"vonage-utils>=1.0.1",
"pydantic>=2.6.1",
]
classifiers = [
"Programming Language :: Python",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.8",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"License :: OSI Approved :: Apache Software License",
]

[project.urls]
homepage = "https://github.com/Vonage/vonage-python-sdk"

[build-system]
requires = ["setuptools>=61.0", "wheel"]
build-backend = "setuptools.build_meta"
File renamed without changes.
3 changes: 3 additions & 0 deletions voice/src/vonage_voice/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from .voice import Voice

__all__ = ['Voice']
9 changes: 9 additions & 0 deletions voice/src/vonage_voice/errors.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from vonage_utils.errors import VonageError


class VoiceError(VonageError):
"""Indicates an error when using the Vonage Voice API."""


class NccoActionError(VoiceError):
"""Indicates an error when using an NCCO action."""
9 changes: 9 additions & 0 deletions voice/src/vonage_voice/models/common.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from typing import Literal, Optional

from pydantic import BaseModel, Field


class AdvancedMachineDetection(BaseModel):
behavior: Optional[Literal['continue', 'hangup']] = None
mode: Optional[Literal['default', 'detect', 'detect_beep']] = 'detect'
beep_timeout: Optional[int] = Field(None, ge=45, le=120)
48 changes: 48 additions & 0 deletions voice/src/vonage_voice/models/connect_endpoints.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
from pydantic import BaseModel, AnyUrl, Field
from typing import Optional
from typing_extensions import Literal

from .enums import ConnectEndpointType

from vonage_utils.types import Dtmf, PhoneNumber, SipUri


class BaseEndpoint(BaseModel):
"""Base Endpoint model for use with the NCCO Connect action."""


class OnAnswer(BaseModel):
url: AnyUrl
ringbackTone: Optional[AnyUrl] = None


class PhoneEndpoint(BaseEndpoint):
number: PhoneNumber
dtmfAnswer: Optional[Dtmf] = None
onAnswer: Optional[OnAnswer] = None
type: ConnectEndpointType = ConnectEndpointType.PHONE


class AppEndpoint(BaseEndpoint):
user: str
type: ConnectEndpointType = ConnectEndpointType.APP


class WebsocketEndpoint(BaseEndpoint):
uri: AnyUrl
contentType: Literal['audio/l16;rate=16000', 'audio/l16;rate=8000'] = Field(
'audio/l16;rate=16000', serialization_alias='content-type'
)
headers: Optional[dict] = {}
type: ConnectEndpointType = ConnectEndpointType.WEBSOCKET


class SipEndpoint(BaseEndpoint):
uri: SipUri
headers: Optional[dict] = {}
type: ConnectEndpointType = ConnectEndpointType.SIP


class VbcEndpoint(BaseEndpoint):
extension: str
type: ConnectEndpointType = ConnectEndpointType.VBC
26 changes: 26 additions & 0 deletions voice/src/vonage_voice/models/enums.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
from enum import Enum


class Channel(Enum, str):
PHONE = 'phone'
SIP = 'sip'
WEBSOCKET = 'websocket'
VBC = 'vbc'


class NccoActionType(Enum, str):
RECORD = 'record'
CONVERSATION = 'conversation'
CONNECT = 'connect'
TALK = 'talk'
STREAM = 'stream'
INPUT = 'input'
NOTIFY = 'notify'


class ConnectEndpointType(Enum, str):
PHONE = 'phone'
APP = 'app'
WEBSOCKET = 'websocket'
SIP = 'sip'
VBC = 'vbc'
26 changes: 26 additions & 0 deletions voice/src/vonage_voice/models/input_types.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
from pydantic import BaseModel, confloat, conint
from typing import Optional, List


class InputTypes:
class Dtmf(BaseModel):
timeOut: Optional[conint(ge=0, le=10)]
maxDigits: Optional[conint(ge=1, le=20)]
submitOnHash: Optional[bool]

class Speech(BaseModel):
uuid: Optional[str]
endOnSilence: Optional[confloat(ge=0.4, le=10.0)]
language: Optional[str]
context: Optional[List[str]]
startTimeout: Optional[conint(ge=1, le=60)]
maxDuration: Optional[conint(ge=1, le=60)]
saveAudio: Optional[bool]

@classmethod
def create_dtmf_model(cls, dict) -> Dtmf:
return cls.Dtmf.parse_obj(dict)

@classmethod
def create_speech_model(cls, dict) -> Speech:
return cls.Speech.parse_obj(dict)
Loading

0 comments on commit 5e7d13e

Please sign in to comment.