From a9fb48b0850d7d8a1f6f3837bf400ffe06fa6e90 Mon Sep 17 00:00:00 2001 From: sarveshpatil-plivo Date: Sat, 4 Jul 2026 03:15:26 +0530 Subject: [PATCH 1/4] feat: add Plivo SMS provider Adds Plivo as an SMS notification provider, mirroring twilio_provider: sends alert SMS via the Plivo Messages API (RestClient.messages.create). Scope validated with a read (Plivo sends are billed). Auto-registers via ProvidersFactory. Includes provider docs + icon. Co-Authored-By: Claude Opus 4.8 (1M context) --- docs/mint.json | 1 + .../documentation/plivo-provider.mdx | 17 ++ .../providers/plivo-snippet-autogenerated.mdx | 34 ++++ keep-ui/public/icons/plivo-icon.png | Bin 0 -> 26462 bytes .../plivo_provider/plivo_provider.py | 165 ++++++++++++++++++ pyproject.toml | 1 + 6 files changed, 218 insertions(+) create mode 100644 docs/providers/documentation/plivo-provider.mdx create mode 100644 docs/snippets/providers/plivo-snippet-autogenerated.mdx create mode 100644 keep-ui/public/icons/plivo-icon.png create mode 100644 keep/providers/plivo_provider/plivo_provider.py diff --git a/docs/mint.json b/docs/mint.json index 7672da965b..323d64dc93 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -229,6 +229,7 @@ "providers/documentation/pingdom-provider", "providers/documentation/posthog-provider", "providers/documentation/planner-provider", + "providers/documentation/plivo-provider", "providers/documentation/postgresql-provider", "providers/documentation/prometheus-provider", "providers/documentation/pushover-provider", diff --git a/docs/providers/documentation/plivo-provider.mdx b/docs/providers/documentation/plivo-provider.mdx new file mode 100644 index 0000000000..ace112fcdd --- /dev/null +++ b/docs/providers/documentation/plivo-provider.mdx @@ -0,0 +1,17 @@ +--- +title: "Plivo Provider" +description: "Plivo Provider is a provider that allows to notify alerts via SMS using Plivo." +--- +import AutoGeneratedSnippet from '/snippets/providers/plivo-snippet-autogenerated.mdx'; + + + +## Connecting with the Provider + +To use the Plivo Provider you'll need your Plivo Auth ID and Auth Token from the Plivo console. +How to find your Plivo Auth ID and Auth Token - https://cx.plivo.com + +## Useful Links + +- Plivo console - https://cx.plivo.com +- Plivo Messages API - https://www.plivo.com/docs/messaging/api/messages diff --git a/docs/snippets/providers/plivo-snippet-autogenerated.mdx b/docs/snippets/providers/plivo-snippet-autogenerated.mdx new file mode 100644 index 0000000000..e3a7ebd148 --- /dev/null +++ b/docs/snippets/providers/plivo-snippet-autogenerated.mdx @@ -0,0 +1,34 @@ +{/* This snippet is automatically generated using scripts/docs_render_provider_snippets.py +Do not edit it manually, as it will be overwritten */} + +## Authentication +This provider requires authentication. +- **auth_id**: Plivo Auth ID (required: True, sensitive: False) +- **auth_token**: Plivo Auth Token (required: True, sensitive: True) +- **from_phone_number**: Plivo source number or sender ID (required: True, sensitive: False) + +Certain scopes may be required to perform specific actions or queries via the provider. Below is a summary of relevant scopes and their use cases: +- **send_sms**: The credentials can send SMS via the Plivo Messages API (mandatory) + + + +## In workflows + +This provider can be used in workflows. + + + +As "action" to make changes or update data, example: +```yaml +actions: + - name: Query plivo + provider: plivo + config: "{{ provider.my_provider_name }}" + with: + message_body: {value} # The content of the SMS message to be sent. Defaults to "". + to_phone_number: {value} # The recipient's phone number. Defaults to "". +``` + + + +If you need workflow examples with this provider, please raise a [GitHub issue](https://github.com/keephq/keep/issues). diff --git a/keep-ui/public/icons/plivo-icon.png b/keep-ui/public/icons/plivo-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3b9ef36b49ac8327c4f8dc5dac911b97f3ef440c GIT binary patch literal 26462 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 OrzEHLuuRq>^nU>L;+K8^ literal 0 HcmV?d00001 diff --git a/keep/providers/plivo_provider/plivo_provider.py b/keep/providers/plivo_provider/plivo_provider.py new file mode 100644 index 0000000000..44f1a28381 --- /dev/null +++ b/keep/providers/plivo_provider/plivo_provider.py @@ -0,0 +1,165 @@ +""" +PlivoProvider is a class that implements the BaseProvider interface for Plivo SMS. +""" + +import dataclasses + +import plivo +import pydantic + +from keep.contextmanager.contextmanager import ContextManager +from keep.exceptions.provider_exception import ProviderException +from keep.providers.base.base_provider import BaseProvider +from keep.providers.models.provider_config import ProviderConfig, ProviderScope + + +@pydantic.dataclasses.dataclass +class PlivoProviderAuthConfig: + """Plivo authentication configuration.""" + + auth_id: str = dataclasses.field( + metadata={ + "required": True, + "description": "Plivo Auth ID", + "sensitive": False, + "documentation_url": "https://www.plivo.com/docs/messaging/quickstart/python/", + } + ) + + auth_token: str = dataclasses.field( + metadata={ + "required": True, + "description": "Plivo Auth Token", + "sensitive": True, + "documentation_url": "https://www.plivo.com/docs/messaging/quickstart/python/", + } + ) + + from_phone_number: str = dataclasses.field( + metadata={ + "required": True, + "description": "Plivo source number or sender ID", + "sensitive": False, + "documentation_url": "https://www.plivo.com/docs/messaging/concepts/sms/", + } + ) + + +class PlivoProvider(BaseProvider): + """Send SMS via Plivo.""" + + PROVIDER_DISPLAY_NAME = "Plivo" + PROVIDER_CATEGORY = ["Collaboration"] + PROVIDER_SCOPES = [ + ProviderScope( + name="send_sms", + description="The credentials can send SMS via the Plivo Messages API", + mandatory=True, + alias="Send SMS", + ) + ] + + def __init__( + self, context_manager: ContextManager, provider_id: str, config: ProviderConfig + ): + super().__init__(context_manager, provider_id, config) + + def validate_scopes(self) -> dict[str, bool | str]: + # A Plivo send is billed and not idempotent (unlike Twilio's magic test + # number), so validate the credentials with a read instead of a test send. + validated_scopes = {} + try: + client = plivo.RestClient( + self.authentication_config.auth_id, + self.authentication_config.auth_token, + ) + client.messages.list(limit=1) + validated_scopes["send_sms"] = True + except Exception as e: + self.logger.warning( + "Failed to validate scope send_sms", + extra={"reason": str(e)}, + ) + validated_scopes["send_sms"] = str(e) + + return validated_scopes + + def validate_config(self): + self.authentication_config = PlivoProviderAuthConfig( + **self.config.authentication + ) + + def dispose(self): + """ + No need to dispose of anything, so just do nothing. + """ + pass + + def _notify( + self, message_body: str = "", to_phone_number: str = "", **kwargs: dict + ): + """ + Send an SMS notification using the Plivo Messages API. + Args: + message_body (str, optional): The content of the SMS message to be sent. Defaults to "". + to_phone_number (str, optional): The recipient's phone number. Defaults to "". + """ + self.logger.debug("Notifying alert SMS via Plivo") + + if not to_phone_number: + raise ProviderException( + f"{self.__class__.__name__} failed to notify alert SMS via Plivo: to_phone_number is required" + ) + client = plivo.RestClient( + self.authentication_config.auth_id, + self.authentication_config.auth_token, + ) + try: + self.logger.debug("Sending SMS via Plivo") + client.messages.create( + src=self.authentication_config.from_phone_number, + dst=to_phone_number, + text=message_body, + ) + self.logger.debug("SMS sent via Plivo") + except Exception as e: + self.logger.warning( + "Failed to send SMS via Plivo", extra={"reason": str(e)} + ) + raise ProviderException( + f"{self.__class__.__name__} failed to notify alert SMS via Plivo: {e}" + ) + + +if __name__ == "__main__": + # Output debug messages + import logging + + logging.basicConfig(level=logging.DEBUG, handlers=[logging.StreamHandler()]) + context_manager = ContextManager( + tenant_id="singletenant", + workflow_id="test", + ) + # Load environment variables + import os + + plivo_auth_id = os.environ.get("PLIVO_AUTH_ID") + plivo_auth_token = os.environ.get("PLIVO_AUTH_TOKEN") + plivo_from_phone_number = os.environ.get("PLIVO_FROM_PHONE_NUMBER") + plivo_to_phone_number = os.environ.get("PLIVO_TO_PHONE_NUMBER") + # Initialize the provider and provider config + config = ProviderConfig( + description="Plivo Input Provider", + authentication={ + "auth_id": plivo_auth_id, + "auth_token": plivo_auth_token, + "from_phone_number": plivo_from_phone_number, + }, + ) + provider = PlivoProvider(context_manager, provider_id="plivo", config=config) + provider.validate_scopes() + # Send SMS + provider.notify( + message_body="Keep Alert", + to_phone_number=plivo_to_phone_number, + ) diff --git a/pyproject.toml b/pyproject.toml index 7188003d6c..c2cb2baf59 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -59,6 +59,7 @@ prettytable = "^3.9.0" kafka-python = "^2.0.2" opentelemetry-exporter-otlp-proto-http = "^1.20.0" twilio = "^8.10.0" +plivo = "^4.61.0" azure-identity = "^1.16.1" azure-mgmt-containerservice = "^27.0.0" opentelemetry-exporter-gcp-trace = "^1.6.0" From 028bc6d06331b5cbe9ff8ce7b1db48125eb38d3a Mon Sep 17 00:00:00 2001 From: sarveshpatil-plivo Date: Fri, 10 Jul 2026 03:11:35 +0530 Subject: [PATCH 2/4] Update Plivo provider icon to the current brand logo --- keep-ui/public/icons/plivo-icon.png | Bin 26462 -> 6538 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/keep-ui/public/icons/plivo-icon.png b/keep-ui/public/icons/plivo-icon.png index 3b9ef36b49ac8327c4f8dc5dac911b97f3ef440c..64b7b62ca67563f214a0ada36a4c4cd6c91d9abd 100644 GIT binary patch literal 6538 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 Of`I33&Xt~Zz59PPWpLmC literal 26462 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 OrzEHLuuRq>^nU>L;+K8^ From 99e295cf350b23d22278f575863301e83cae0bbd Mon Sep 17 00:00:00 2001 From: sarveshpatil-plivo Date: Fri, 10 Jul 2026 03:40:31 +0530 Subject: [PATCH 3/4] Add plivo to poetry.lock --- poetry.lock | 171 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 170 insertions(+), 1 deletion(-) diff --git a/poetry.lock b/poetry.lock index 00198e7ff3..66381d5a64 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2885,6 +2885,156 @@ files = [ {file = "logmine-0.4.1-py3-none-any.whl", hash = "sha256:bc70a7cdc65f73ac16ccc1a012b5c5b3d3972540f32463eeda5c94c45a4a7fc2"}, ] +[[package]] +name = "lxml" +version = "6.1.1" +description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "lxml-6.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:09dd5b7075dc2f7709654a46543ba1ea3c2e217b2ed8fbd413a8a945a0f40f60"}, + {file = "lxml-6.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f6ac4ef4d82dff54670227a69c67782ae0b811b5cf6b17954f1e8f7502fc0d1d"}, + {file = "lxml-6.1.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:556e94a63c9b04716f8e4de2abb65775061f846e89331b6c5be79183a24f98ea"}, + {file = "lxml-6.1.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5c6bf403fbb3b3e348a561a5f4f0b9961835657981c802a1df03653eef8a9074"}, + {file = "lxml-6.1.1-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1dde6131244bba38a17c745836ba190bc753fd73c9291666287fd0a3fa3dcf30"}, + {file = "lxml-6.1.1-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:98fc784c2c1440667aeedf8465bdfe10208acf0ead656a2c68627299f546b315"}, + {file = "lxml-6.1.1-cp310-cp310-manylinux_2_28_i686.whl", hash = "sha256:add8cf6ddf9a65116119a28ece0f7886e30af27ba724a7594305f1d1b58a92a1"}, + {file = "lxml-6.1.1-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:cf9d57306d848218f3601fee7601fab1a327c942d56e2e97610583cb4dd74206"}, + {file = "lxml-6.1.1-cp310-cp310-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:88136950da4d13c318bde414ce10219931937851327f44328f2df4d2c4614067"}, + {file = "lxml-6.1.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cecdd5dfdc87b1fd87dbf81d4b037a544f47f4c744200a67013771682d67686a"}, + {file = "lxml-6.1.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:cd312b9692e831d2ffcad61eab31d91d4b4655a962e61de8fb410472cbcd37aa"}, + {file = "lxml-6.1.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:5b7328b46d49fc9477d91ae8f6d55340347d827b7734ba3ea33faae0efef1383"}, + {file = "lxml-6.1.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:37a58976370f36d9329d118ad0b953c5aeb9119ac9c6a4e258942a225d0573a1"}, + {file = "lxml-6.1.1-cp310-cp310-win32.whl", hash = "sha256:cea3f4c1af79af13cdb2da0c028111d8f8522d4f22a000c82385535f24e5cf3a"}, + {file = "lxml-6.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:3abf332af33a74288675d936fe861fd4344da0dd6622193fbc4f2bfbb35536b5"}, + {file = "lxml-6.1.1-cp310-cp310-win_arm64.whl", hash = "sha256:8dadbe5b217ff35b6a8d16610dd710219b59b76d13f0e3f0d9f36786206e4485"}, + {file = "lxml-6.1.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:53b7d2b7a10b1c35c0a5e21e9224accf60c1bbfba523990732e521b2b73adef2"}, + {file = "lxml-6.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ff3f333630ab480244a1bff72043e511a91eb22e7595dead8653ee5612dd8f3d"}, + {file = "lxml-6.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a4bbea04c97f6d78a48e3fbc1cb9116d2780b1b39e03a23f6eb9b603fd61f510"}, + {file = "lxml-6.1.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:db1d75f6617a49c1c01bc7023713e0ff59ab32c9579ae62a7674c0e34f3b0b0a"}, + {file = "lxml-6.1.1-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a12689be69a28ddaa0ab99a5a1137da2afd5f8f16df7b5680b66f616d3eda1d"}, + {file = "lxml-6.1.1-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18b73c339ae29b90fd2d06e58ebd555a751bde9cd6bbd36cc0281b9a2c94e9d8"}, + {file = "lxml-6.1.1-cp311-cp311-manylinux_2_28_i686.whl", hash = "sha256:752d3bbfe874715ccd0aec7f88d7fc623c0f1fd7aa7b3238a084e017bad2a009"}, + {file = "lxml-6.1.1-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:6b1761fbf9ec984e2e9d9c589ef5f5fd684b7c19f92aadd567a26c5224958db6"}, + {file = "lxml-6.1.1-cp311-cp311-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d680fbcb768404c601ecb43519ecd8461f6954cb11c06a78962f666832ccfca8"}, + {file = "lxml-6.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:162af1091cd785f2f27e62d3547ae9bc58ec5c86dd314d67021fd02463708d83"}, + {file = "lxml-6.1.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:e9308ff8241c532df3f3e570f9a5aeed6c853f888512ba4b75638d7c11c95ef6"}, + {file = "lxml-6.1.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:5f6994074ebae6ffb04447268e37dc16edc304f9859cf91acb86e0af6c1b395c"}, + {file = "lxml-6.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:80c2dfadb855da477cf73373ad29a333535dedb9b12bad02c9814c8e2b43bf08"}, + {file = "lxml-6.1.1-cp311-cp311-win32.whl", hash = "sha256:30a89d3ac8faec007453fb541f3f46807eeec88edd5826f6e3fe001752a2c621"}, + {file = "lxml-6.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:abbefa31eee84842140f67acef1c828e28bba8bbf0c3bc6e5492a9af88152c28"}, + {file = "lxml-6.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:dcb292aa7fe485ceff7af4f92e46c5af397daec5dff64871a528f0fc47a3cc5b"}, + {file = "lxml-6.1.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:104c09bda8d2a562824c0e319d0768ce26a779b7601e0931d33b09b53c392ef7"}, + {file = "lxml-6.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:25c6997a9a534e016695a0ba06b2f07945de682731ff01065b6d5a4474179da1"}, + {file = "lxml-6.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c921ba5c51e4e9f63b8b00267d06566e1f63407408a0496da2d1d0bfc819c7fc"}, + {file = "lxml-6.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:54a7f95e4de5fb94e2f9f4b9055c6ba33bf3d628fd77a1d647c5923caa2cdcdc"}, + {file = "lxml-6.1.1-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96f2ec43df44b1f76249ee0a615334f9b5b060e1c8bd90e706dad2d14d02f383"}, + {file = "lxml-6.1.1-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:70ef8a7e102a1508f8121aae5b0867abd663f72c14f0a9c937e6554cb4587b7b"}, + {file = "lxml-6.1.1-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ebe6af670449830d6d9b752c256a983291c766a1365ba5d5460048f9e33a7818"}, + {file = "lxml-6.1.1-cp312-cp312-manylinux_2_28_i686.whl", hash = "sha256:27acc820660aaffa4f7c087f29120e12980f7779d56d8492d263170111284740"}, + {file = "lxml-6.1.1-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:1db753c9115ec7100d073b744d17e25e88a8f90f5c39b2f5dd878149af59671f"}, + {file = "lxml-6.1.1-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c4f469aebd783bb741c2ecb2a681008fd26bfe5c16a9a72ed5467f834e810df2"}, + {file = "lxml-6.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:766b010012d59470072c1816b5b6c69f1d243e5db36ea5968e94accf430a4635"}, + {file = "lxml-6.1.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:b8d812c6011c08b8111a15e54dd990b8923692d80adf35488bee34026c35accf"}, + {file = "lxml-6.1.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:fe0306bd29505a9177aac19f1877174b0e7422c222a59f70b2cd41633448c3dc"}, + {file = "lxml-6.1.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:5ba186ad207446c65d3bb3d3e0412b032b1d9f595e59861e2354798c5703d955"}, + {file = "lxml-6.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aa366a1e55b8ebfe8ca8ddc3cfe75c8ebade181aeb0f661d0cb05986b647f72a"}, + {file = "lxml-6.1.1-cp312-cp312-win32.whl", hash = "sha256:126c93f7f56f0eda92f6d8c619edc463a4f23d9252f1c9d0405a76f25fa9f11a"}, + {file = "lxml-6.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:26e6eda8d38c1fcab1090dd196ee87cbd13788e531937610e2589085de074e77"}, + {file = "lxml-6.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:6540377fbd53fe1b629172288c464fb18db11ce1fa7dc15891da10aa9dcc3e7f"}, + {file = "lxml-6.1.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:68a9198d0fc122d14bb76837de9aa80cf84caed990b5b237f532ed87d3706736"}, + {file = "lxml-6.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7d47866cb32fb503450b6edc9df355d10dc49836af2e89901bd6ac6b0896d9d9"}, + {file = "lxml-6.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb7c9811bfaa8b1ed5ed319f5d370dfbcaa59d52ea64be2a5a85e18195930354"}, + {file = "lxml-6.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:762ff394d5bd56da0cf034a23dcce4e13923f15321a2adfa2ac00201dc6d3fca"}, + {file = "lxml-6.1.1-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a088f287f7d8275a33c07f2cac6c50b9319309a0200a39e7e75d80c707723099"}, + {file = "lxml-6.1.1-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e902da4b04e6b52e5893900d4b8ab46068f75f3561f01bf1080957f9fd932ed6"}, + {file = "lxml-6.1.1-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1d4962d4c66bf830a7e59ed6cfc17d148149898a3aefa8ec6e59763e6e3ed085"}, + {file = "lxml-6.1.1-cp313-cp313-manylinux_2_28_i686.whl", hash = "sha256:581d4c8ae690a6609e64862dd6b7c2489635c2d13907fc2b20f2bc200ff1d21e"}, + {file = "lxml-6.1.1-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:876e1ff5930ed8bf295ec5ef9a8155e9b6b1876bbf1deed8b3a8069311875a8f"}, + {file = "lxml-6.1.1-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9eb9b5a968f6e0f6d640092a567e14529ff8cea2e29d00da6f78a79fa49f013c"}, + {file = "lxml-6.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:aa49e06d94aba782c6a02eecb7e507969e7e7a41b267f1b359bb35585f295d5b"}, + {file = "lxml-6.1.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:70cdfd80589d59e43e18005dd7244e8895e93db8ab6a620b7e23df5445a4e3d2"}, + {file = "lxml-6.1.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:aad9aa39483ed8ec44d6d2e59e5b98a0d80676ef0d92f44bfc374836111f62f5"}, + {file = "lxml-6.1.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:d49514be2f28d895c38cf9d2b72d7b9a07d00314519f456c0b50b53cfcf4c785"}, + {file = "lxml-6.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:47402e62c52ff5988c1e8c6c63177f5708bccf48e366dea4e3dcf1e645e04947"}, + {file = "lxml-6.1.1-cp313-cp313-win32.whl", hash = "sha256:3483644525531e1d5762b0c44a8e18b6efba321b6dcf8a8952de10b037618bca"}, + {file = "lxml-6.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:a10bd2fd62e8ce916ececb342f348f190724a098c1faa056fdfb2a22ad5e8660"}, + {file = "lxml-6.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:424aa57aca0897eb922aef34395bd1289b3b6f04e6bae20ea123c0c7e333cffc"}, + {file = "lxml-6.1.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:19b7ab10b210b0b3ad7985d9ac4eb66ab09a90b20fe6e2f7ba55d01a234345d0"}, + {file = "lxml-6.1.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c08e5c694306507275f2290073350c4f32e383db15213b2c69e7ff39c1193840"}, + {file = "lxml-6.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:74a9717fd0d82effef5c2854f0d917231d5324b5a3eb7275c43ac9fa32f97a14"}, + {file = "lxml-6.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:efe0374196335f93b53269acd811b944f2e6bdc88e8894f214bd636455484909"}, + {file = "lxml-6.1.1-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ac931cdc9442c1763b8a8f6cd62c0c938737eafc5be75eff88df55fc73bc0d00"}, + {file = "lxml-6.1.1-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:aee395f5d0927f947758b4ec119fd5fc8ec71f07a1c5c52077b30b04c0fa6955"}, + {file = "lxml-6.1.1-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9395002973c827b3ed67db77e6ec09f092919a587022174554096a269378fb13"}, + {file = "lxml-6.1.1-cp314-cp314-manylinux_2_28_i686.whl", hash = "sha256:73bc2086f141224ebddb7fc5c6a36ca58b31b94b561e1dfe8e073e3270fad1e7"}, + {file = "lxml-6.1.1-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:3779def59032b81e44a5f70096ef6bf2082f8d901937dca354474ba09782e245"}, + {file = "lxml-6.1.1-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:86c89b9d55ebf820ad7c90bc533410f0d098054f293351f10603c0c46ff598f5"}, + {file = "lxml-6.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:19607c6bbff2a44cf3fe8250abccd20942d3462473e0a721d01d379ed017e462"}, + {file = "lxml-6.1.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:c6ed5141a5c7507cf3ee76bd363b0d6f801e3321adc35b5d825a23115faa5465"}, + {file = "lxml-6.1.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:62aeb7e85b5d60320b9d77eef2e773994e2c0ce10121b277e0a19804e1654a5a"}, + {file = "lxml-6.1.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:b1b963fd8f5caa68e99dfae060d54de1fe9cba899b8718b44a00cdca53c3e590"}, + {file = "lxml-6.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:63876be28efefa04a1df615b46770e82042cce445cfdce55160522f57b231ccb"}, + {file = "lxml-6.1.1-cp314-cp314-win32.whl", hash = "sha256:7f7a92e8583f06b1fd49d01158143b8461cfcd135dcb10ec807270a3051bd603"}, + {file = "lxml-6.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:b2d444f2e66624d68e9c6b211e28a76e22fff5fcabcfff4deac18b529b7d4137"}, + {file = "lxml-6.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:3fd9728a2735fda14f4e8235830c86b539e9661e849665bf926d3f867943b4bf"}, + {file = "lxml-6.1.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:787b2496d0dbe8cd180984e8d29e3a6f76e7ea34db781cb3bd55e4ba1ef8b4ee"}, + {file = "lxml-6.1.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:2c8daa471358dc2d6fcf02165e80ec68f77871a286df95bc5cc3816153b0fd2c"}, + {file = "lxml-6.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:acd7d70b64c0aae0c7922cca83d288a16f5f6da523637697872253415269baef"}, + {file = "lxml-6.1.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4f0dd2f01f9f8a89f565d000e03abcf0a13d692a346c8d22f628d49af098777a"}, + {file = "lxml-6.1.1-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b7e8a14c8634bf6f7a568634cb395305a6d964aeb5b7ee32248094bed3a7e2c"}, + {file = "lxml-6.1.1-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:86281fbdd6a8162756f8d603f37e3435bfa38043adb79c6dc6a2dfee065e7525"}, + {file = "lxml-6.1.1-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c5d7152ec39ca7c402d8fb9bad86140a15b9503bd0c54484e3f1bbe3dd37ceca"}, + {file = "lxml-6.1.1-cp314-cp314t-manylinux_2_28_i686.whl", hash = "sha256:88d8cb75b9d82858497a5393e3c63cfbf03035225e4b35a49ed7ccb151e4dc0e"}, + {file = "lxml-6.1.1-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:f64ec5397ea6a41fc1b4af0380d79b44a755b5531dcaccd9940fb260dca93038"}, + {file = "lxml-6.1.1-cp314-cp314t-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d34bbf07dbc7ca5970671b1512e928991fb5e9d95365636c9b2d8b4f53af405e"}, + {file = "lxml-6.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:17e0e18d4ad8adbd0399291bc44845b69d9dd68439a3cdebdf35ff902ec05072"}, + {file = "lxml-6.1.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:3ab541146f1f6968c462d6c2ac495148e8cdba2f8347700b2141b6ec5a75bf52"}, + {file = "lxml-6.1.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:2a0217714657e023ef4293500f65aa20fce6164c8fd6b08fa5bd4a859fb14b9b"}, + {file = "lxml-6.1.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:05a82eb6e1530a64f26225b55cbd178113bd0b5af1c2b625f25e5296742c26d2"}, + {file = "lxml-6.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9e36f163528fc50cbef305f02a5fd66d404edf7049cdaff211dbc2cba5a7013e"}, + {file = "lxml-6.1.1-cp314-cp314t-win32.whl", hash = "sha256:649dda677cf3bd6ac9ae14007ba0c824ded8ce5808b53fc7431d9140399118c1"}, + {file = "lxml-6.1.1-cp314-cp314t-win_amd64.whl", hash = "sha256:793033d6c5cdf33a573f910d9bea14ef8f5771820411d118da8e1182edb53d5e"}, + {file = "lxml-6.1.1-cp314-cp314t-win_arm64.whl", hash = "sha256:58bb955caba94e467d2a96da17660d2d704e0675894cba21ab8a775b8621fd1c"}, + {file = "lxml-6.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6689e828a94eee4f139408c337bb198e014724bb8a8c26d3cfac49d119ed69a6"}, + {file = "lxml-6.1.1-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bdebcc8a75d38c7598dfb2c9ed852d7a9eb4a10d6e2d0764b919b802bf32ac88"}, + {file = "lxml-6.1.1-cp38-cp38-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8be8ad51249698103d24b0571df35a10990fbe93dd043b6c024172189485f5e3"}, + {file = "lxml-6.1.1-cp38-cp38-manylinux_2_28_i686.whl", hash = "sha256:76447f65250ed2501ead1a1552f5ce8edff159a86f308348e6a9c4acb5e1f1b4"}, + {file = "lxml-6.1.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:ffecec8eb889b58ba9be5b95fb1cc78e22ea8eedea38e8736a1568fe1979250e"}, + {file = "lxml-6.1.1-cp38-cp38-win32.whl", hash = "sha256:c674693f055fa2495de12292cb45e9944199d8eaef5a2dec45175c7c61cb73e3"}, + {file = "lxml-6.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:55b03549819867ea141c0202242c4816c82e52ec36e7e648db9d8da5a3dc3ed6"}, + {file = "lxml-6.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c9f79d5325907f13e1be0b3e4dacc1049d1dffc4aeee3c995284bea5fe0fab7d"}, + {file = "lxml-6.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:83b6b30eb131da7a75b601f28c5d6971e6ed3e887919bf6b6a1ad3c2df289080"}, + {file = "lxml-6.1.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:441dd227fa0690eb9fc81edabc63cdcefc212bba99b906dcf6e32cc1a9d3e533"}, + {file = "lxml-6.1.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e07c65f443c887bbcf31cc1771d932ecc192a5273943589b3c7572b749f1ffb2"}, + {file = "lxml-6.1.1-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5bec7d03d78d853597d6107854c2310ce3f761fd218fe9fe91d5101fcf6c2efe"}, + {file = "lxml-6.1.1-cp39-cp39-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9f76acfb5f68ba982635a53fd985a8044be98a35b43232c2a1ee235ffab3e1dd"}, + {file = "lxml-6.1.1-cp39-cp39-manylinux_2_28_i686.whl", hash = "sha256:8d43ca737b20e106e4aebc42b2f3ae19f00ba63d7eb731698ee083d72d15646f"}, + {file = "lxml-6.1.1-cp39-cp39-manylinux_2_31_armv7l.whl", hash = "sha256:32ab449a5486f6c758e849bb86710d0e45edc24a04e250c01555f8f5653958f8"}, + {file = "lxml-6.1.1-cp39-cp39-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:53c909b62a0532183542fed00c5a7218258c56292d409bc789886fe1cb04c438"}, + {file = "lxml-6.1.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:640f97d43d867bcb9c75b3af013b64850756b746cb6bce8ace83b70da3abba9d"}, + {file = "lxml-6.1.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:469e3618338bd7ab5beb412d2439825479fcf0dab99e394ca563dbc4eaf6c834"}, + {file = "lxml-6.1.1-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:aae97dfdb60715c164419ac2532a76d013c3918a665eb6cb7288098b5f349aaf"}, + {file = "lxml-6.1.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c9a4b821dc7055bf9e05ff5719e18ec501f75c0f0bbfabd573b277559780833d"}, + {file = "lxml-6.1.1-cp39-cp39-win32.whl", hash = "sha256:639f6c857d91d9be29bd7502348d6736dab168b54b5158cd899abf11684dc186"}, + {file = "lxml-6.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:34c2d737beabfe35baada43941ed519251e9a12e779031496bcd5d539fcfd730"}, + {file = "lxml-6.1.1-cp39-cp39-win_arm64.whl", hash = "sha256:07a4a68e286ee7a1ed7dfb8af83e615757c0ccfe9f18c6b4ea6771388d9ba8c9"}, + {file = "lxml-6.1.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:31033dc34636ea6b7d5cc11b1ddbda78a14de858ba9d3e1ed4b69a3085bc521e"}, + {file = "lxml-6.1.1-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3893c14c4b6ac5b2d54ba8cf03e99fe5104e592de491f19bd6b82756c09f8004"}, + {file = "lxml-6.1.1-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c07da4cebf6889f03ebac8d238f62318e29f495de0aa18a51ea14e61ae907e2e"}, + {file = "lxml-6.1.1-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f6f0ce10945fab9c4c06ce14e22af9059d1a87493a9af4501a5b0b9187e21cf2"}, + {file = "lxml-6.1.1-pp311-pypy311_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f8844cd288697c6425c9beba919302241e3278871dc6519515e72b04e987abcf"}, + {file = "lxml-6.1.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:ed21202aec73cda4d55d1ce57b389aadb90ffb044e6cd1080b8347efe1b1ec84"}, + {file = "lxml-6.1.1.tar.gz", hash = "sha256:ba96ae44888e0185281e937633a743ea90d5a196c6000f82565ebb0580012d40"}, +] + +[package.extras] +cssselect = ["cssselect (>=0.7)"] +html-clean = ["lxml_html_clean"] +html5 = ["html5lib"] +htmlsoup = ["BeautifulSoup4"] + [[package]] name = "mako" version = "1.3.8" @@ -3692,6 +3842,25 @@ files = [ greenlet = "3.1.1" pyee = "12.0.0" +[[package]] +name = "plivo" +version = "4.61.0" +description = "A Python SDK to make voice calls & send SMS using Plivo and to generate Plivo XML" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "plivo-4.61.0-py2.py3-none-any.whl", hash = "sha256:5ec6e3de3b8e594b608398d1f366851a9ff636c12be7366749333bd864588e32"}, + {file = "plivo-4.61.0.tar.gz", hash = "sha256:4fcbc0fdef855c53029f6240424a6c92c78df588f618b168ccbd796a5cf70853"}, +] + +[package.dependencies] +decorator = ">=5" +lxml = ">=3" +PyJWT = "*" +requests = ">=2,<3" +six = ">=1,<2" + [[package]] name = "pluggy" version = "1.5.0" @@ -6156,4 +6325,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.1" python-versions = ">=3.11,<3.14" -content-hash = "824ecd671f3022b7d2e54af04d744f5aaa3ede100d810e5b9fdcb4980c4f7592" +content-hash = "ac0d7baa418437911c41666adcc93de5637e1e2ec8f3616f2005ef62f21e581f" From 23b5d9b1f57e0737d09024b95a3c07e8a6523635 Mon Sep 17 00:00:00 2001 From: sarveshpatil-plivo Date: Wed, 22 Jul 2026 13:15:21 +0530 Subject: [PATCH 4/4] docs: embed the Plivo signup link on console references Co-Authored-By: Claude Opus 4.8 (1M context) --- docs/providers/documentation/plivo-provider.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/providers/documentation/plivo-provider.mdx b/docs/providers/documentation/plivo-provider.mdx index ace112fcdd..5cfbcccc83 100644 --- a/docs/providers/documentation/plivo-provider.mdx +++ b/docs/providers/documentation/plivo-provider.mdx @@ -9,9 +9,9 @@ import AutoGeneratedSnippet from '/snippets/providers/plivo-snippet-autogenerate ## Connecting with the Provider To use the Plivo Provider you'll need your Plivo Auth ID and Auth Token from the Plivo console. -How to find your Plivo Auth ID and Auth Token - https://cx.plivo.com +How to find your Plivo Auth ID and Auth Token - [cx.plivo.com](https://cx.plivo.com/?utm_source=github&utm_medium=oss&utm_campaign=keep) ## Useful Links -- Plivo console - https://cx.plivo.com +- Plivo console - [cx.plivo.com](https://cx.plivo.com/?utm_source=github&utm_medium=oss&utm_campaign=keep) - Plivo Messages API - https://www.plivo.com/docs/messaging/api/messages