Skip to main content

SignalWire SWAIG

SignalWire SWAIG is a Python package that provides an interface for AI Agents to interact with SignalWire services. This package is designed to simplify the integration of AI capabilities with SignalWire's robust communication platform.

Features

  • Easy integration with SignalWire services
  • Designed for AI Agents
  • Lightweight and efficient

Installation

To install SignalWire SWAIG, use pip:

pip install signalwire-swaig

Usage

Basic Setup

  1. Initialize SWAIG with a Flask app:

    from flask import Flask
    from signalwire.swaig import SWAIG
    
    app = Flask(__name__)
    swaig = SWAIG(app)
    
  2. Define an Endpoint:

    Use the @swaig.endpoint decorator to define an API endpoint.

    from signalwire.swaig import Parameter
    
    @swaig.endpoint("Check insurance eligibility",
                    member_id=Parameter("string", "Member ID number", required=True),
                    provider=Parameter("string", "Insurance provider name", required=True))
    def check_insurance(member_id, provider, meta_data=None, meta_data_toke=None):
        return f"Checking insurance for {member_id} with {provider}"
    
  3. Run the Flask App:

    if __name__ == '__main__':
        app.run()
    

Advanced Parameter Usage

You can define parameters with additional attributes like required, enum, and default.

from signalwire.swaig import Parameter

@swaig.endpoint("Get user details",
                user_id=Parameter("string", "User ID", required=True),
                role=Parameter("string", "User role", enum=["admin", "user", "guest"]),
                status=Parameter("string", "Account status", default="active"))
def get_user_details(user_id, role="user", status="active", meta_data=None, meta_data_toke=None):
    return f"User {user_id} is a {role} with status {status}"
  • required: Indicates if the parameter is mandatory. If not provided, the request will be rejected.
  • enum: Specifies a list of acceptable values for the parameter. If the provided value is not in the list, the request will be rejected.
  • default: Provides a default value for the parameter if it is not supplied in the request.

SWAIGArgument, SWAIGArgumentItems & SWAIGFunctionProperties

SWAIGArgument and SWAIGArgumentItems are used to define complex argument structures for your endpoints.

  • SWAIGArgument: Represents a single argument with a specific type and description.
  • SWAIGArgumentItems: Represents a collection of SWAIGArgument objects, allowing you to define nested or grouped parameters.
  • SWAIGFunctionProperties: Represents the top level properties for the SWAIG function.

Example usage:

from signalwire.swaig import SWAIGArgument, SWAIGArgumentItems

@swaig.endpoint("Process order",
                order=Parameter("object", "Order details", required=True, items=SWAIGArgumentItems(
                    SWAIGArgument("product_id", "string", "Product ID", required=True),
                    SWAIGArgument("quantity", "integer", "Quantity of the product", required=True),
                    SWAIGArgument("color", "array", "Color of the product", required=True, items=SWAIGArgumentItems(
                        SWAIGArgument("type", "string", "Type of the product", enum=["shirt", "pants", "shoes"])
                    )
                )))
def process_order(order, meta_data=None, meta_data_toke=None):
    return f"Processing order for product {order['product_id']} with quantity {order['quantity']} at {order['price']} each"
  • SWAIGArgument: Define each argument with its type, description, and whether it is required.
  • SWAIGArgumentItems: Use this to group multiple SWAIGArgument objects together for complex parameter structures.

Authentication

To enable basic authentication, provide a tuple of (username, password) when initializing SWAIG:

swaig = SWAIG(app, auth=("username", "password"))

Endpoint Details

  • Description: A brief description of what the endpoint does.
  • Parameters: Define the parameters with their type, description, and whether they are required.

Handling Requests

  • Get Signature: Send a POST request to /swaig with {"action": "get_signature"} to retrieve the API signature.
  • Function Call: Send a POST request to /swaig with {"function": "function_name", "argument": {"parsed": [{"param1": "value1", ...}]}} to call a registered function.

Supported Argument Types and Examples

Below are examples of each argument type you can define using SWAIGArgument and SWAIGArgumentItems:

String

@swaig.endpoint(
    "String Example",
    string_example=SWAIGArgument(
        type="string",
        description="A simple string value",
        required=True
    )
)
def string_example(string_example, meta_data=None, meta_data_toke=None):
    return f"String: {string_example}", {}

Integer

@swaig.endpoint(
    "Integer Example",
    integer_example=SWAIGArgument(
        type="integer",
        description="An integer value",
        required=True
    )
)
def integer_example(integer_example, meta_data=None, meta_data_toke=None):
    return f"Integer: {integer_example}", {}

Number (float)

@swaig.endpoint(
    "Number Example",
    number_example=SWAIGArgument(
        type="number",
        description="A floating point number"
    )
)
def number_example(number_example=None, meta_data=None, meta_data_toke=None):
    return f"Number: {number_example}", {}

Boolean

@swaig.endpoint(
    "Boolean Example",
    boolean_example=SWAIGArgument(
        type="boolean",
        description="A true/false boolean value",
        required=True
    )
)
def boolean_example(boolean_example, meta_data=None, meta_data_toke=None):
    return f"Boolean: {boolean_example}", {}

Enum (constrained string)

@swaig.endpoint(
    "Enum Example",
    enum_example=SWAIGArgument(
        type="string",
        description="A value constrained to a specific set of strings",
        enum=["option1", "option2", "option3"]
    )
)
def enum_example(enum_example=None, meta_data=None, meta_data_toke=None):
    return f"Enum: {enum_example}", {}

Array of Strings

@swaig.endpoint(
    "Array Example",
    array_example=SWAIGArgument(
        type="array",
        description="An array of strings",
        items=SWAIGArgumentItems(type="string")
    )
)
def array_example(array_example=None, meta_data=None, meta_data_toke=None):
    return f"Array: {array_example}", {}

Object (with nested fields)

@swaig.endpoint(
    "Object Example",
    object_example=SWAIGArgument(
        type="object",
        description="A nested object with internal fields",
        items=SWAIGArgumentItems(
            type="object",
            properties={
                "nested_string": SWAIGArgument(
                    type="string",
                    description="A nested string",
                    required=True
                ),
                "nested_number": SWAIGArgument(
                    type="number",
                    description="A nested number"
                )
            },
            required=["nested_string"]
        )
    )
)
def object_example(object_example=None, meta_data=None, meta_data_toke=None):
    return f"Object: {object_example}", {}

Array of Objects

@swaig.endpoint(
    "Array of Objects Example",
    array_of_objects=SWAIGArgument(
        type="array",
        description="An array of structured objects",
        items=SWAIGArgumentItems(
            type="object",
            properties={
                "name": SWAIGArgument(
                    type="string",
                    description="Name of the item",
                    required=True
                ),
                "value": SWAIGArgument(
                    type="integer",
                    description="Numeric value of the item",
                    required=True
                )
            },
            required=["name", "value"]
        )
    )
)
def array_of_objects(array_of_objects=None, meta_data=None, meta_data_toke=None):
    return f"Array of Objects: {array_of_objects}", {}

License

This project is licensed under the MIT License.

Contributing

Contributions are welcome! Please submit a pull request or open an issue for any improvements or bug fixes.

Contact

For any questions or support, please contact brian@signalwire.com.

Metadata

Release files for signalwire-swaig 2.7.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for signalwire-swaig 2.7.2
File Size Uploaded Provenance
signalwire_swaig-2.7.2.tar.gz 12.6 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for signalwire-swaig 2.7.2
File Interpreter ABI Platform
signalwire_swaig-2.7.2-py3-none-any.whl Python 3 none any Details

Total release size: 23.9 kB

Release files / signalwire_swaig-2.7.2.tar.gz

Download URL signalwire_swaig-2.7.2.tar.gz
Size 12.6 kB
Tags Source
SHA-256 checksum
How to use checksums
26aa251d1f1abb76c0132a96b3bbf2015ed7eb8c2c49f817fb9d62b8e7f095cf
BLAKE2b-256 checksum
How to use checksums
38b40a9b62db591db94344c7167e785d0b80a73fb495a9a8cf69c44b09fdc8d6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.11.2

Release files / signalwire_swaig-2.7.2-py3-none-any.whl

Download URL signalwire_swaig-2.7.2-py3-none-any.whl
Size 11.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
aa9c0ed5b1949d8f86e5180a6b61acdad2663f158a3790c49345742a7e0bd09b
BLAKE2b-256 checksum
How to use checksums
ccf2e07aaa8fe4e6eb178c8c47782c31629a96cf91a0995b5828ce141495a27c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.11.2

Security for signalwire-swaig 2.7.2

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page