Skip to main content

concinno-skills-mobile

Mobile / telephony agent skills for Concinno. Unified on the MIT-licensed Twilio Python SDK — the most mature programmatic-telephony provider for SMS, voice, and WhatsApp Business. Device-side Android / iOS shell control is intentionally out of scope; that belongs to the Sancio runtime layer.

Why this package exists

HammerBench (and adjacent benchmarks) evaluate agents on realistic telephony / SaaS workflows. Concinno can drive Twilio today over plain HTTPS — no device emulator, no OS-level hook — making this the blue-ocean entry point for mobile skills in the Concinno ecosystem.

Status

MVP (0.1.0) — three one-shot tools:

Tool class Channel Underlying API SDK licence
TwilioSms SMS Twilio Programmable Messaging MIT
TwilioWhatsApp WhatsApp Twilio WhatsApp Business (Messaging) MIT
TwilioVoiceCall Voice Twilio Programmable Voice MIT

Microsoft Teams / push-only providers (Pushover, ntfy) are deferred until they land in a dedicated sibling sub-package.

Install

pip install concinno-skills-mobile

twilio>=9.0 is a hard dependency and is pulled in automatically.

Twilio account requirements

You need a Twilio account (trial or paid). Outbound SMS / WhatsApp messages and voice calls cost money per Twilio's per-country pricing. A WARNING-level log line is emitted to stderr before every outbound call so the billing risk is visible in agent traces.

  • SMS: buy (or port) a Twilio phone number in a country you need to send to; long-code numbers are rate-limited to roughly 1 msg/sec.
  • WhatsApp: register a WhatsApp-enabled sender (Twilio Sandbox for trials or a fully-verified Business sender for production) — addresses use the whatsapp:+<digits> prefix on both to and from_.
  • Voice: any Twilio number with Voice capability works; the call behaviour is driven by either inline TwiML XML or a URL pointing at a hosted TwiML document.

Credentials

The Twilio account_sid + auth_token are read from the Concinno CredentialStore, which consults (in order):

  1. Process runtime overrides via CredentialStore.set(...).
  2. Env var CONCINNO_CRED_<UPPER_KEY>.
  3. ~/.concinno/credentials.json.
Key Env var
twilio_account_sid CONCINNO_CRED_TWILIO_ACCOUNT_SID
twilio_auth_token CONCINNO_CRED_TWILIO_AUTH_TOKEN

Example ~/.concinno/credentials.json:

{
  "twilio_account_sid": "ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "twilio_auth_token":  "your_auth_token_here"
}

If either credential is missing the tool returns {"error": "no twilio credentials — set account_sid + auth_token via CredentialStore / env"} rather than crashing.

Phone number formats

All destination / sender numbers are validated locally before the network call, both to catch typos early and to avoid burning billable round-trips on malformed input:

  • SMS / Voice: E.164 only (+<country_code><digits>, max 15 digits).
  • WhatsApp: whatsapp:+<country_code><digits>.

Both sides of every send / call are validated with the same rule.

Usage via Concinno ToolRegistry

When the consumer sets CONCINNO_LOAD_PLUGINS=1, the default registry auto-mounts every mobile tool:

import os
os.environ["CONCINNO_LOAD_PLUGINS"] = "1"

from concinno.tools.registry import get_default_registry

reg = get_default_registry()
assert {"TwilioSms", "TwilioWhatsApp", "TwilioVoiceCall"} <= set(
    reg.list_deferred()
)

sms = reg.get("TwilioSms")
sms.call(
    action="send",
    to="+14155551234",
    from_="+14155550000",
    body="Hello from Concinno",
)

Direct Python usage

from concinno_skills_mobile import (
    TwilioSms,
    TwilioWhatsApp,
    TwilioVoiceCall,
)

TwilioSms().call(
    action="send",
    to="+14155551234",
    from_="+14155550000",
    body="hi",
)

TwilioWhatsApp().call(
    action="send",
    to="whatsapp:+14155551234",
    from_="whatsapp:+14155550000",
    body="hi",
)

TwilioVoiceCall().call(
    action="create",
    to="+14155551234",
    from_="+14155550000",
    twiml="<Response><Say>Hi from Concinno</Say></Response>",
)

All tools return {"ok": True, ...} on success or {"error": "..."} on failure — same shape as other Concinno built-in tools. No exceptions escape the call() surface.

Concurrency

All three tools set is_concurrency_safe = False. Twilio rate limits (per-from-number for SMS; per-subaccount for voice; per-sender for WhatsApp) make serial dispatch the sane default; Concinno's scheduler will honour this automatically.

License

Apache-2.0. See LICENSE in the Concinno monorepo.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

concinno_skills_mobile-0.1.0.tar.gz (40.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

concinno_skills_mobile-0.1.0-py3-none-any.whl (14.9 kB view details)

Uploaded Python 3

File details

Details for the file concinno_skills_mobile-0.1.0.tar.gz.

File metadata

  • Download URL: concinno_skills_mobile-0.1.0.tar.gz
  • Upload date:
  • Size: 40.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.9

File hashes

Hashes for concinno_skills_mobile-0.1.0.tar.gz
Algorithm Hash digest
SHA256 de5b92d19482881e7b4f17c34f7c298ca69e9eb02f21e43e670ef3262b662944
MD5 c7d27cac13d53ce454fdd30ba4c852e0
BLAKE2b-256 085bc9826ee4f9516ef5af9858488bafccda1f921bc131400c3453c9ebc5ad82

See more details on using hashes here.

File details

Details for the file concinno_skills_mobile-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for concinno_skills_mobile-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 a02cec5a65822f28e367c44bc2c84d09b50f3d566087b006b3ab7b22573606bb
MD5 71d4a2a3b058601ffc0a9e3200dd4045
BLAKE2b-256 a30baa4d9b562b0beda726f7028402f0dd18b1deebd45980d045c301107b7245

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page