Skip to main content

concinno-skills-mobile-ext

Extended enterprise-messaging agent skills for Concinno. Complements the sibling concinno-skills-mobile (Twilio SMS / Voice / WhatsApp) by adding three channels Twilio does not natively cover: Microsoft Teams, WhatsApp Business Cloud API (direct Meta, no Twilio), and WeCom (企业微信).

All three tools are thin httpx REST wrappers — zero new runtime dependencies beyond Concinno itself.

Status

MVP (0.1.0) — three one-shot tools:

Tool class Platform Transport Licence
TeamsSend MS Teams Microsoft Graph v1.0 Apache-2.0
WhatsAppOfficial WhatsApp (Meta) Graph v21.0 Cloud API Apache-2.0
WeComSend WeCom / 企业微信 qyapi.weixin.qq.com Apache-2.0

Install

pip install concinno-skills-mobile-ext

Credentials

Each platform's credentials live under well-known keys in the Concinno CredentialStore, which reads (in order):

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

Microsoft Teams

Key Env var
teams_access_token CONCINNO_CRED_TEAMS_ACCESS_TOKEN

Bring your own Azure AD OAuth Bearer token (e.g. produced via msal or a manual consent flow). This package never opens a browser.

WhatsApp Business Cloud API (Meta)

Key Env var
whatsapp_access_token CONCINNO_CRED_WHATSAPP_ACCESS_TOKEN
whatsapp_phone_number_id CONCINNO_CRED_WHATSAPP_PHONE_NUMBER_ID

Both values come from the Meta Business Suite / App dashboard.

WeCom (企业微信)

Two supported shapes — group-bot webhook (simplest) is tried first:

Key Env var
wecom_webhook_url CONCINNO_CRED_WECOM_WEBHOOK_URL

…or app-mode credentials:

Key Env var
wecom_corp_id CONCINNO_CRED_WECOM_CORP_ID
wecom_corp_secret CONCINNO_CRED_WECOM_CORP_SECRET
wecom_agent_id CONCINNO_CRED_WECOM_AGENT_ID

Example ~/.concinno/credentials.json:

{
  "teams_access_token": "eyJ0eXAiOi…",
  "whatsapp_access_token": "EAAB…",
  "whatsapp_phone_number_id": "1234567890",
  "wecom_webhook_url": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=abcd-1234"
}

If a required token is missing the tool returns {"error": "no <service> credentials — set via CredentialStore / env"} rather than crashing.

Usage via Concinno ToolRegistry

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

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

from concinno.tools.registry import get_default_registry

reg = get_default_registry()
assert {"TeamsSend", "WhatsAppOfficial", "WeComSend"} <= set(
    reg.list_deferred()
)

teams = reg.get("TeamsSend")
teams.call(
    action="send",
    chat_id="19:2da4c29f6d7041eca70b638b43d45437@thread.v2",
    content="Deploy succeeded",
    content_type="text",
)

Direct Python usage

from concinno_skills_mobile_ext import (
    TeamsSend,
    WhatsAppOfficial,
    WeComSend,
)

TeamsSend().call(
    action="send",
    chat_id="19:abc@thread.v2",
    content="<b>Deploy</b> succeeded",
    content_type="html",
)

WhatsAppOfficial().call(
    action="send",
    to="+15551234567",
    body="Your verification code is 123456",
)

WeComSend().call(
    action="send_webhook",
    content="CI pipeline green on main",
    mentioned_list=["@all"],
)

WeComSend().call(
    action="send_app",
    content="Private alert",
    user_ids=["alice", "bob"],
)

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

Concurrency

All three tools set is_concurrency_safe = False:

  • Teams — per-app/user Graph throttling and conversational ordering.
  • WhatsApp — per-phone-number Meta rate limits + 24-hour conversation window semantics.
  • WeCom — shared access-token cache in app mode; per-bot rate limits in webhook mode.

The Concinno scheduler honours this automatically.

Safety caps

  • Teams content28 000 chars (text or HTML).
  • WhatsApp body4 096 chars (Meta text message cap).
  • WeCom content2 048 bytes UTF-8 (WeCom cap; CJK text is counted at 3 bytes/char).

API pins

  • Microsoft Graph: v1.0 (POST /chats/{id}/messages).
  • Meta WhatsApp Cloud API: v21.0 (POST /{ver}/{phone_number_id}/messages).
  • WeCom:
    • App — POST /cgi-bin/message/send?access_token=… (access token obtained via GET /cgi-bin/gettoken, cached 7200 s with a 60 s refresh slack).
    • Webhook — POST /cgi-bin/webhook/send?key=….

Any version bump must call out the full regression-test matrix in RELEASE_COORDINATION.md.

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_ext-0.1.0.tar.gz (43.1 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_ext-0.1.0-py3-none-any.whl (17.4 kB view details)

Uploaded Python 3

File details

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

File metadata

File hashes

Hashes for concinno_skills_mobile_ext-0.1.0.tar.gz
Algorithm Hash digest
SHA256 85e7f2606567bd1e77e1fa54ca485a2fea2d36fd2f9a54013196c4e5070cbf89
MD5 00b0364f594429a7915ae74ec0edc335
BLAKE2b-256 f6f0a7714034611dc8868af1d12b20dbf0486a5ecb55be1b3d67414f744ee3f8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for concinno_skills_mobile_ext-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 342e9da73c54d13beefa7e9c53900f449ae92209459542481d1157eb6d0c2399
MD5 fb5ccfe0cd4a69430a3523391a6d4a31
BLAKE2b-256 f6c7527cbb792fab5b61a5c3b66e7feab80f746218f4f7913bf2cccce1da5d03

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