telnyx examples: temp Call Control App leaks when the process is killed; no --log-level flag

Author: a692570Created Sep 16, 2026Updated Sep 16, 2026

Two DX issues found while testing the telnyx examples locally (2026-09-16, main at ba2fbf1d).

1. Temp Call Control App leaks when the process is killed

The examples' --setup-telnyx flow creates a temporary Call Control App, routes the phone number to it, and restores the original routing in a finally cleanup. That cleanup runs on Ctrl-C (KeyboardInterrupt unwinds through finally) but not on SIGTERM, because default SIGTERM handling terminates the process without unwinding. pkill sends SIGTERM by default, so the common developer flow of restarting with pkill leaks resources every time:

  • The temp Call Control App stays in the account.
  • The phone number stays routed to the temp app's webhook, which now points at a dead tunnel, so inbound calls ring and die.

Verified during testing: two leaked apps (vision-agents-example-*) had to be deleted via the API and the number's connection restored manually.

Suggestion: install a SIGTERM handler in the examples' main() so cleanup runs on kill <pid>, and document the behavior in plugins/telnyx/examples/README.md. SIGKILL cannot be caught, so the README warning matters for that case.

2. Telnyx examples hardcode INFO logging and ignore the --log-level flag

voice_agent_call.py, inbound_call.py, and outbound_call.py call logging.basicConfig(level=logging.INFO) and their argparse does not accept --log-level. The Runner-based examples (for example examples/01_simple_agent_example) expose --log-level and --debug.

This matters because the telnyx STT plugin only logs received WebSocket messages at DEBUG (stt.py gates "Telnyx STT message: ..." behind logger.isEnabledFor(logging.DEBUG)). Debugging transcript issues without the flag requires wrapping the module in a runpy script that calls basicConfig(level=DEBUG) before running it.

Suggestion: accept --log-level in the three telnyx examples (or read an env var), matching the Runner examples.

Both are small. Happy to PR either if that is useful.