Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file modified .well-known/agent-skills/didww-connect.tar.gz
Binary file not shown.
Binary file modified .well-known/agent-skills/didww-to-vogent.tar.gz
Binary file not shown.
10 changes: 5 additions & 5 deletions .well-known/agent-skills/index.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@
"type": "archive",
"description": "Connect a DIDWW phone number to ANY AI voice platform: helps choose the platform, then wires the SIP trunk pair and number. Use whenever the user wants a voice AI agent on a DIDWW number and has not committed to a platform, asks which AI platform to use with DIDWW, or names a platform that has no dedicated didww-to-X skill installed. Covers ElevenLabs, Vapi, Retell, Ultravox, Vogent, OpenAI Realtime, xAI, LiveKit and the enterprise-gated platforms.",
"url": "didww-connect.tar.gz",
"digest": "sha256:50a913c53d738eeb409f565143d176998a04edd8008dcbdbf0777a056a52a9f5",
"version": "1.0.2",
"digest": "sha256:625aba79d3bfbface58b6897546596fe84ca768568755668af946789adf2f56f",
"version": "1.0.3",
"documentation": "https://github.com/didww/ai/blob/main/docs/didww-connect.md",
"install": "npx didww-connect"
},
Expand Down Expand Up @@ -78,10 +78,10 @@
{
"name": "didww-to-vogent",
"type": "archive",
"description": "Connect a DIDWW phone number to a Vogent voice agent over SIP import. Use whenever the user wants a Vogent agent on a real phone number via DIDWW, mentions pairing DIDWW with Vogent, sip_import numbers, sip.vogent.ai, or debugging calls between the two.",
"description": "Connect a DIDWW phone number to a Vogent voice agent over SIP import. Use whenever the user wants a Vogent agent on a real phone number via DIDWW, mentions pairing DIDWW with Vogent, sip_import numbers, sip.vogent.ai, warm transfers from a Vogent agent to a live person, or debugging calls between the two.",
"url": "didww-to-vogent.tar.gz",
"digest": "sha256:1c2227a36a7909cc0fd6c7ebe496c275070b466086a9e0c18614bd05b4df31bd",
"version": "1.0.2",
"digest": "sha256:2e757a041ae71ff66e4cd119c0b5c02bd41519218d0e68bc21411d3e4955b380",
"version": "1.0.3",
"documentation": "https://github.com/didww/ai/blob/main/docs/didww-to-vogent.md",
"install": "npx didww-to-vogent"
},
Expand Down
13 changes: 13 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,19 @@

All notable changes to the skills in this repository. Each skill is versioned independently in its `package.json`.

## didww-to-vogent 1.0.3, didww-connect 1.0.3 (2026-11-03)

Found while connecting a DIDWW number to a Vogent agent with the skill, verified on real calls, and aligned with DIDWW's [Vogent integration guide](https://doc.didww.com/integrations/vogent/index.html): the skill and its docs page now follow the guide's three sections (Route Incoming Calls, Enable Outbound Calling, Connect DIDWW SIP Trunks in Vogent), its terms and its troubleshooting.

- **Transfers work only as Warm Transfer.** Cold Transfer (SIP REFER, target built from the phone number, no SIP URI setting) is marked `TRANSFERRED` in Vogent, but DIDWW never places the call: no outbound CDR, also with `0.0.0.0/0` open. Warm Transfer makes Vogent dial the destination itself through the number's `terminationUri`, the DIDWW outbound trunk, from Vogent's servers. New "Live-agent transfers" section following the guide's Step 4: the Call Transfer function (`POST /api/functions`, `allowedNumbers`, never a number linked to the agent), the Transfer Type, which only the dashboard sets (new functions default to Cold; Prompted needs a prompt, which switching to Cold and back clears), adding it to the agent (`PUT /api/agents/{id}` with `linkedFunctionDefinitionInputs`) and the prompt line.
- **The outbound trunk is required even for inbound-only**, because Vogent imports a number only with an outbound trunk's host and credentials (the docs said "needed only for calls the agent places").
- **Outbound trunk Allowed SIP IPs** as in the guide: Vogent's enterprise ranges plus DIDWW's seven inbound signaling IPs; without enterprise ranges, DIDWW support; `0.0.0.0/0` only for temporary testing at the user's own risk; `0.0.0.0/32` matches nothing.
- **Inbound trunk:** UDP 5060, User Part of R-URI `{DID}` (Vogent also accepts `+{DID}`), and Authorization with the outbound trunk's username and password instead of an invented digest pair.
- **Linking the number to the agent is not dashboard-only.** `PUT /api/phone_numbers/{id}` with `{"agentId"}` works. New `connect.py --agent` links right after the import, and `--phone-id ID --agent ID` links a number imported earlier; the "MANUAL STEP" print is gone.
- **Opening line:** without one the agent waits for the caller and the call sounds silent. Standard agents: Opening Line, Inbound calls Only; flow agents: `flowDefinition.openingLineType` `INBOUND_ONLY`.
- **Testing** as in the guide's Step 5, including `POST /api/dials` for an outbound call and Dial History's Transferred status with the `transfer_call` function.
- **Failure map** from the guide's troubleshooting: 401/403/407 on outbound calls or transfers, 484 Address Incomplete, rejection after authentication, the caller shown with an extra `+1` (cosmetic; `cli_prefix` `+` is a likely fix, marked untested), and the API key's secret versus its ID.
- `didww-connect`: Vogent's row, ingress notes and allowed-IP notes follow the guide.
## Agent Skills discovery index (2026-10-30)

- New `.well-known/agent-skills/index.json` in the [Agent Skills discovery](https://github.com/cloudflare/agent-skills-discovery-rfc) format v0.2.0, the same format Telnyx serves at `telnyx.com/.well-known/agent-skills/index.json`. Every skill is a `type: "archive"` entry: a `.tar.gz` with `SKILL.md`, `scripts/`, `references/` and `LICENSE` at the root, and its sha256 `digest`. Extra fields (`version`, `documentation`, `install`) are ignored by clients that do not know them.
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ Open-source tools from [DIDWW](https://www.didww.com/) for building AI voice age
| [didww-to-vapi](skills/didww-to-vapi) | Vapi | [![npm](https://img.shields.io/npm/v/didww-to-vapi?label=)](https://www.npmjs.com/package/didww-to-vapi) | BYO SIP trunk credential, number and assistant binding |
| [didww-to-retell](skills/didww-to-retell) | Retell AI | [![npm](https://img.shields.io/npm/v/didww-to-retell?label=)](https://www.npmjs.com/package/didww-to-retell) | Fully MCP-driven: agent, number import and binding in one call |
| [didww-to-ultravox](skills/didww-to-ultravox) | Ultravox | [![npm](https://img.shields.io/npm/v/didww-to-ultravox?label=)](https://www.npmjs.com/package/didww-to-ultravox) | Address-based routing and account SIP settings |
| [didww-to-vogent](skills/didww-to-vogent) | Vogent | [![npm](https://img.shields.io/npm/v/didww-to-vogent?label=)](https://www.npmjs.com/package/didww-to-vogent) | SIP import plus one documented dashboard step |
| [didww-to-vogent](skills/didww-to-vogent) | Vogent | [![npm](https://img.shields.io/npm/v/didww-to-vogent?label=)](https://www.npmjs.com/package/didww-to-vogent) | SIP import and agent linking; warm transfer type is one dashboard setting |
| [didww-to-openai-realtime](skills/didww-to-openai-realtime) | OpenAI Realtime | [![npm](https://img.shields.io/npm/v/didww-to-openai-realtime?label=)](https://www.npmjs.com/package/didww-to-openai-realtime) | Direct SIP to the Realtime API with a generated webhook backend |
| [didww-to-xai](skills/didww-to-xai) | xAI Grok | [![npm](https://img.shields.io/npm/v/didww-to-xai?label=)](https://www.npmjs.com/package/didww-to-xai) | Number registration with digest auth, per-call session control |
| [didww-to-livekit](skills/didww-to-livekit) | LiveKit | [![npm](https://img.shields.io/npm/v/didww-to-livekit?label=)](https://www.npmjs.com/package/didww-to-livekit) | Inbound trunk, dispatch rule and optional outbound trunk for a LiveKit worker |
Expand Down
6 changes: 3 additions & 3 deletions docs/didww-connect.md
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ The skill asks one question, maps the answer to a platform, and tells you the au
| API-first, EU region, bring your own model keys | Vapi | REST script; Vapi's MCP is read-only for numbers |
| Maximum MCP automation, one-call setup | Retell | Retell's MCP imports numbers and creates agents |
| Richest call transfers, own speech model | Ultravox | REST; address-based routing, no number import |
| Small and simple | Vogent | REST import; agent binding is one dashboard click |
| Small and simple | Vogent | REST import and agent linking; the warm transfer type is one dashboard setting |
| You own the agent code, minimal stack | OpenAI Realtime or xAI Grok | A webhook backend is required; not no-code |
| Any STT, LLM and TTS combination, open source | LiveKit | REST script creates trunk and dispatch rule; the worker is your code |
| Data control, own servers | LiveKit self-hosted | Same skill; you run the SIP service |
Expand All @@ -81,7 +81,7 @@ The skill asks one question, maps the answer to a platform, and tells you the au
The number and the inbound trunk are configured through the DIDWW MCP under your own account permissions. Claude Code asks for confirmation before each tool call unless you have allowed that tool. The outbound trunk is created by you in the DIDWW User Panel, because the MCP has no outbound trunk tools.

- **Inbound SIP trunk.** Host and port are the chosen platform's SIP ingress (see the table below), digest authentication is preferred over IP filtering, and media encryption matches the platform's setting. The DID is assigned to this trunk.
- **Outbound SIP trunk.** Needed only for calls the agent places. You create it in the DIDWW User Panel under **Voice**, **Outbound Trunks**, **Create New**, because the DIDWW MCP has no outbound trunk tools. If that page shows **Get Access**, the account is not approved for outbound calling yet: the application needs a business account with a company name and VAT/TAX ID, and DIDWW replies within 48 business hours. The inbound side can go live meanwhile. Choose the **Credentials & IP-Based** authentication method. It needs at least one **Allowed SIP IP address**: the platform's SIP source addresses, listed on each platform's page. Where a platform publishes none, contact DIDWW support (support@didww.com). Do not enter `0.0.0.0/0`; DIDWW advises against open ranges. Set **Media encryption mode** to match the platform side. DIDWW generates the username and password; give them to the agent in a file or environment variables rather than pasting them into the chat, and it passes them to the platform side. Enable the trunk if it shows **Disabled**. The host is the one nearest to the platform's region: `nyc.us.out.didww.com`, `lac.us.out.didww.com`, `mia.us.out.didww.com`, `fra.eu.out.didww.com`, `ams.eu.out.didww.com`, `sg.out.didww.com` or `hk.out.didww.com`.
- **Outbound SIP trunk.** Needed for calls the agent places and for transfers, and for Vogent always, because its number import needs the trunk's credentials. You create it in the DIDWW User Panel under **Voice**, **Outbound Trunks**, **Create New**, because the DIDWW MCP has no outbound trunk tools. If that page shows **Get Access**, the account is not approved for outbound calling yet: the application needs a business account with a company name and VAT/TAX ID, and DIDWW replies within 48 business hours. The inbound side can go live meanwhile. Choose the **Credentials & IP-Based** authentication method. It needs at least one **Allowed SIP IP address**: the platform's SIP source addresses, listed on each platform's page. Where a platform publishes none, contact DIDWW support (support@didww.com). Do not enter `0.0.0.0/0`; DIDWW advises against open ranges. For Vogent, whose warm transfers dial from its own servers, the [Vogent integration guide](https://doc.didww.com/integrations/vogent/index.html) allows `0.0.0.0/0` only for temporary testing, at your own risk: see [DIDWW to Vogent](didww-to-vogent.md). Set **Media encryption mode** to match the platform side. DIDWW generates the username and password; give them to the agent in a file or environment variables rather than pasting them into the chat, and it passes them to the platform side. Enable the trunk if it shows **Disabled**. The host is the one nearest to the platform's region: `nyc.us.out.didww.com`, `lac.us.out.didww.com`, `mia.us.out.didww.com`, `fra.eu.out.didww.com`, `ams.eu.out.didww.com`, `sg.out.didww.com` or `hk.out.didww.com`.
- **Spend controls.** On the outbound trunk, under **Termination**: **24 Hour Limit (USD)** at its minimum of 50 (the default is 3000, and DIDWW disables the trunk when the limit is reached), **Capacity limit** matching the expected concurrency, and the usage limit notification on. Under **CLI Settings**, allow only the connected number as caller ID; under **Destination Dialing Settings**, reject all destinations except the countries the agent calls. On the inbound trunk the skill sets a capacity limit through the MCP.
- **Number.** An existing DID is confirmed, or one is bought. For registration-required countries the skill says so before promising a date.

Expand All @@ -93,7 +93,7 @@ The number and the inbound trunk are configured through the DIDWW MCP under your
| Vapi | `sip.vapi.ai` (EU: `sip.eu.vapi.ai`) | Vapi's inbound credential lists DIDWW's seven signaling IPs; Max transfers 1 for transfers |
| Retell | `sip.retellai.com` | TCP |
| Ultravox | The account's own SIP domain from `GET /api/sip` | Address-based routing to `agent_<id>@<domain>` |
| Vogent | `sip.vogent.ai` | Digest auth |
| Vogent | `sip.vogent.ai`, port 5060, UDP | User Part of R-URI `{DID}` or `+{DID}`; Authorization with the outbound trunk's credentials; transfers only as Warm Transfer |
| OpenAI Realtime | `sip:{project_id}@sip.api.openai.com;transport=tls` | TLS and SRTP mandatory; EU host `sip-eu.api.openai.com` |
| xAI Grok | `sip:{number}@sip.voice.x.ai;transport=tls` | Digest auth set when the number is registered with xAI |
| LiveKit | `sip:{sip_subdomain}.sip.livekit.cloud` (copy the SIP URI from Project settings) | 5060 TCP/UDP or 5061 TLS; region-pinned `{sip_subdomain}.{eu|us|uk|india|japan|aus|canada|sa}.sip.livekit.cloud`; numbers carry the `+` |
Expand Down
Loading