jambonz-python-sdk 0.3.0__tar.gz → 0.3.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/PKG-INFO +1 -1
  2. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/pyproject.toml +1 -1
  3. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/callbacks/call-status.schema.json +6 -1
  4. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/components/llm-base.schema.json +1 -1
  5. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/components/recognizer-assemblyAiOptions.schema.json +3 -3
  6. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/components/recognizer-deepgramOptions.schema.json +5 -0
  7. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/components/recognizer-googleOptions.schema.json +4 -0
  8. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/components/recognizer-houndifyOptions.schema.json +3 -1
  9. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/verbs/agent.schema.json +169 -2
  10. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/verbs/dub.schema.json +1 -1
  11. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/verbs/transcribe.schema.json +2 -1
  12. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/websocket/session.py +38 -6
  13. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/.gitignore +0 -0
  14. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/README.md +0 -0
  15. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/__init__.py +0 -0
  16. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/_signature.py +0 -0
  17. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/client/__init__.py +0 -0
  18. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/client/api.py +0 -0
  19. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/callbacks/agent-turn.schema.json +0 -0
  20. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/callbacks/amd.schema.json +0 -0
  21. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/callbacks/base.schema.json +0 -0
  22. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/callbacks/conference-status.schema.json +0 -0
  23. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/callbacks/conference-wait.schema.json +0 -0
  24. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/callbacks/conference.schema.json +0 -0
  25. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/callbacks/dequeue.schema.json +0 -0
  26. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/callbacks/dial-dtmf.schema.json +0 -0
  27. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/callbacks/dial-hold.schema.json +0 -0
  28. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/callbacks/dial-refer.schema.json +0 -0
  29. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/callbacks/dial.schema.json +0 -0
  30. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/callbacks/enqueue-wait.schema.json +0 -0
  31. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/callbacks/enqueue.schema.json +0 -0
  32. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/callbacks/gather-partial.schema.json +0 -0
  33. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/callbacks/gather.schema.json +0 -0
  34. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/callbacks/listen.schema.json +0 -0
  35. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/callbacks/llm.schema.json +0 -0
  36. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/callbacks/message.schema.json +0 -0
  37. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/callbacks/play.schema.json +0 -0
  38. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/callbacks/session-new.schema.json +0 -0
  39. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/callbacks/session-reconnect.schema.json +0 -0
  40. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/callbacks/session-redirect.schema.json +0 -0
  41. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/callbacks/sip-refer-event.schema.json +0 -0
  42. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/callbacks/sip-refer.schema.json +0 -0
  43. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/callbacks/sip-request.schema.json +0 -0
  44. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/callbacks/transcribe-translation.schema.json +0 -0
  45. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/callbacks/transcribe.schema.json +0 -0
  46. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/callbacks/tts-streaming-event.schema.json +0 -0
  47. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/callbacks/verb-status.schema.json +0 -0
  48. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/components/actionHook.schema.json +0 -0
  49. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/components/actionHookDelayAction.schema.json +0 -0
  50. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/components/amd.schema.json +0 -0
  51. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/components/auth.schema.json +0 -0
  52. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/components/bidirectionalAudio.schema.json +0 -0
  53. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/components/fillerNoise.schema.json +0 -0
  54. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/components/recognizer-awsOptions.schema.json +0 -0
  55. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/components/recognizer-azureOptions.schema.json +0 -0
  56. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/components/recognizer-cobaltOptions.schema.json +0 -0
  57. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/components/recognizer-customOptions.schema.json +0 -0
  58. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/components/recognizer-elevenlabsOptions.schema.json +0 -0
  59. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/components/recognizer-gladiaOptions.schema.json +0 -0
  60. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/components/recognizer-ibmOptions.schema.json +0 -0
  61. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/components/recognizer-nuanceOptions.schema.json +0 -0
  62. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/components/recognizer-nvidiaOptions.schema.json +0 -0
  63. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/components/recognizer-openaiOptions.schema.json +0 -0
  64. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/components/recognizer-sonioxOptions.schema.json +0 -0
  65. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/components/recognizer-speechmaticsOptions.schema.json +0 -0
  66. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/components/recognizer-verbioOptions.schema.json +0 -0
  67. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/components/recognizer.schema.json +0 -0
  68. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/components/synthesizer.schema.json +0 -0
  69. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/components/target.schema.json +0 -0
  70. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/components/vad.schema.json +0 -0
  71. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/jambonz-app.schema.json +0 -0
  72. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/verbs/alert.schema.json +0 -0
  73. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/verbs/answer.schema.json +0 -0
  74. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/verbs/conference.schema.json +0 -0
  75. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/verbs/config.schema.json +0 -0
  76. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/verbs/deepgram_s2s.schema.json +0 -0
  77. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/verbs/dequeue.schema.json +0 -0
  78. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/verbs/dial.schema.json +0 -0
  79. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/verbs/dialogflow.schema.json +0 -0
  80. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/verbs/dtmf.schema.json +0 -0
  81. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/verbs/elevenlabs_s2s.schema.json +0 -0
  82. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/verbs/enqueue.schema.json +0 -0
  83. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/verbs/gather.schema.json +0 -0
  84. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/verbs/google_s2s.schema.json +0 -0
  85. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/verbs/hangup.schema.json +0 -0
  86. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/verbs/leave.schema.json +0 -0
  87. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/verbs/listen.schema.json +0 -0
  88. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/verbs/llm.schema.json +0 -0
  89. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/verbs/message.schema.json +0 -0
  90. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/verbs/openai_s2s.schema.json +0 -0
  91. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/verbs/pause.schema.json +0 -0
  92. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/verbs/play.schema.json +0 -0
  93. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/verbs/redirect.schema.json +0 -0
  94. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/verbs/rest_dial.schema.json +0 -0
  95. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/verbs/s2s.schema.json +0 -0
  96. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/verbs/say.schema.json +0 -0
  97. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/verbs/sip-decline.schema.json +0 -0
  98. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/verbs/sip-refer.schema.json +0 -0
  99. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/verbs/sip-request.schema.json +0 -0
  100. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/verbs/stream.schema.json +0 -0
  101. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/verbs/tag.schema.json +0 -0
  102. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/schema/verbs/ultravox_s2s.schema.json +0 -0
  103. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/types/__init__.py +0 -0
  104. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/types/components.py +0 -0
  105. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/types/rest.py +0 -0
  106. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/types/session.py +0 -0
  107. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/types/verbs.py +0 -0
  108. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/validator.py +0 -0
  109. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/verb_builder.py +0 -0
  110. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/verb_builder.pyi +0 -0
  111. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/verb_registry.py +0 -0
  112. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/webhook/__init__.py +0 -0
  113. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/webhook/middleware.py +0 -0
  114. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/webhook/response.py +0 -0
  115. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/websocket/__init__.py +0 -0
  116. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/websocket/audio_client.py +0 -0
  117. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/websocket/audio_stream.py +0 -0
  118. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/websocket/client.py +0 -0
  119. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/websocket/endpoint.py +0 -0
  120. {jambonz_python_sdk-0.3.0 → jambonz_python_sdk-0.3.2}/src/jambonz_sdk/websocket/router.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jambonz-python-sdk
3
- Version: 0.3.0
3
+ Version: 0.3.2
4
4
  Summary: Python SDK for jambonz CPaaS platform
5
5
  Project-URL: Homepage, https://github.com/jambonz/jambonz-python-sdk
6
6
  Project-URL: Repository, https://github.com/jambonz/jambonz-python-sdk
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "jambonz-python-sdk"
7
- version = "0.3.0"
7
+ version = "0.3.2"
8
8
  description = "Python SDK for jambonz CPaaS platform"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -2,12 +2,17 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://jambonz.org/schema/callbacks/call-status",
4
4
  "title": "Call Status Webhook Payload",
5
- "description": "Payload sent to the call status webhook URL whenever the call state changes (e.g. trying, in-progress, completed). The status webhook is configured at the application level in jambonz. Multiple status events are sent over the life of a call. The final event (completed or failed) includes additional fields like duration and termination cause.",
5
+ "description": "Payload sent to the call status webhook URL whenever the call state changes (e.g. trying, in-progress, completed). The status webhook is configured at the application level in jambonz. Multiple status events are sent over the life of a call. The final event (completed or failed) includes additional fields like duration and termination cause.\n\n**Capturing B-leg call_sid:** When using the dial verb to bridge calls, status events are sent for both legs. The A-leg (original inbound call) has `direction: 'inbound'`. The B-leg (outbound dialed call) has `direction: 'outbound'`. To capture the B-leg's call_sid for later use (e.g., injecting commands to the B-leg), listen for status events where `direction === 'outbound'` and extract the `call_sid` field.",
6
6
  "allOf": [
7
7
  { "$ref": "base" }
8
8
  ],
9
9
  "type": "object",
10
10
  "properties": {
11
+ "direction": {
12
+ "type": "string",
13
+ "enum": ["inbound", "outbound"],
14
+ "description": "Call direction. 'inbound' = A-leg (original incoming call to the application). 'outbound' = B-leg (call placed by the dial verb). Use this field to identify which leg generated the status event, especially when capturing the B-leg's call_sid for mid-call control."
15
+ },
11
16
  "call_termination_by": {
12
17
  "type": "string",
13
18
  "enum": ["caller", "jambonz"],
@@ -12,7 +12,7 @@
12
12
  "vendor": {
13
13
  "type": "string",
14
14
  "description": "The LLM vendor to use.",
15
- "examples": ["openai", "anthropic", "google", "groq", "deepseek", "deepgram", "ultravox", "custom"]
15
+ "examples": ["openai", "anthropic", "google", "groq", "deepseek", "baseten", "deepgram", "ultravox", "custom"]
16
16
  },
17
17
  "model": {
18
18
  "type": "string",
@@ -28,15 +28,15 @@
28
28
  },
29
29
  "minEndOfTurnSilenceWhenConfident": {
30
30
  "type": "number",
31
- "description": "Minimum silence duration (seconds) to trigger end-of-turn when confidence is met."
31
+ "description": "Minimum silence duration (milliseconds) to trigger end-of-turn when confidence is met. Default: 400."
32
32
  },
33
33
  "maxTurnSilence": {
34
34
  "type": "number",
35
- "description": "Maximum silence duration (seconds) before forcing end-of-turn."
35
+ "description": "Maximum silence duration (milliseconds) before forcing end-of-turn. Default: 1280."
36
36
  },
37
37
  "minTurnSilence": {
38
38
  "type": "number",
39
- "description": "Minimum silence duration (seconds) before allowing end-of-turn."
39
+ "description": "Minimum silence duration (milliseconds) before allowing end-of-turn."
40
40
  },
41
41
  "keyterms": {
42
42
  "type": "array",
@@ -141,6 +141,11 @@
141
141
  "eagerEotThreshold": {
142
142
  "type": "number",
143
143
  "description": "Eager end-of-turn threshold for faster response."
144
+ },
145
+ "languageHints": {
146
+ "type": "array",
147
+ "items": { "type": "string" },
148
+ "description": "Language hints for Deepgram Flux Multilingual. BCP-47 codes (e.g. 'en', 'es', 'fr'). Biases transcription toward specified languages."
144
149
  }
145
150
  },
146
151
  "additionalProperties": false
@@ -14,6 +14,10 @@
14
14
  "type": "string",
15
15
  "description": "ID of a Google Speech recognizer resource (v2 only)."
16
16
  },
17
+ "parentPath": {
18
+ "type": "string",
19
+ "description": "Parent resource path for the Google Speech recognizer (v2 only), e.g. 'projects/{project}/locations/{location}'."
20
+ },
17
21
  "speechStartTimeoutMs": {
18
22
  "type": "number",
19
23
  "description": "Timeout in milliseconds to wait for speech to start."
@@ -47,7 +47,9 @@
47
47
  "description": "Custom vocabulary terms."
48
48
  },
49
49
  "languageModel": { "type": "string", "description": "Language model to use." },
50
- "audioQueryAbsoluteTimeout": { "type": "number", "description": "Absolute timeout for audio queries." }
50
+ "audioQueryAbsoluteTimeout": { "type": "number", "description": "Absolute timeout for audio queries." },
51
+ "eoqThreshold": { "type": "number", "minimum": 0, "maximum": 1, "description": "End-of-query likelihood threshold (0.0-1.0) to trigger end of speech when segmentation is disabled. Default 0.8, set to 0 to disable." },
52
+ "vadStopThreshold": { "type": "number", "minimum": 0, "maximum": 1, "description": "VAD probability threshold to trigger end of speech when segmentation is disabled. When VAD drops below this value after speech is detected, streaming stops. Default 0.05, set to 0 to disable." }
51
53
  },
52
54
  "additionalProperties": false
53
55
  }
@@ -21,6 +21,28 @@
21
21
  "$ref": "../components/synthesizer",
22
22
  "description": "Text-to-speech configuration for the agent."
23
23
  },
24
+ "autoLockLanguage": {
25
+ "oneOf": [
26
+ { "type": "boolean" },
27
+ { "type": "string", "enum": ["always"] }
28
+ ],
29
+ "description": "When using Deepgram Flux Multilingual, automatically adjust STT language hints and switch TTS voice based on detected language. Values: false (disabled), true (lock on first utterance), 'always' (continuously adapt on every turn). Default: false.",
30
+ "default": false
31
+ },
32
+ "languageConfig": {
33
+ "type": "object",
34
+ "description": "Per-language overrides for TTS. Keys are BCP-47 language codes. When autoLockLanguage detects a language switch, the agent uses the corresponding config.",
35
+ "additionalProperties": {
36
+ "type": "object",
37
+ "properties": {
38
+ "tts": {
39
+ "$ref": "../components/synthesizer",
40
+ "description": "TTS config override for this language. Merged with default tts."
41
+ }
42
+ },
43
+ "additionalProperties": false
44
+ }
45
+ },
24
46
  "turnDetection": {
25
47
  "oneOf": [
26
48
  {
@@ -86,8 +108,93 @@
86
108
  },
87
109
  "llm": {
88
110
  "type": "object",
89
- "description": "LLM configuration for the agent. See the 'llm' verb schema for details.",
90
- "additionalProperties": true
111
+ "description": "LLM configuration for the agent.",
112
+ "required": ["vendor", "model"],
113
+ "properties": {
114
+ "vendor": {
115
+ "type": "string",
116
+ "enum": [
117
+ "openai",
118
+ "anthropic",
119
+ "google",
120
+ "vertex-gemini",
121
+ "vertex-openai",
122
+ "bedrock",
123
+ "deepseek",
124
+ "baseten",
125
+ "azure-openai",
126
+ "groq",
127
+ "huggingface"
128
+ ],
129
+ "description": "LLM vendor id. Must match a `@jambonz/llm` registered adapter."
130
+ },
131
+ "model": {
132
+ "type": "string",
133
+ "description": "Vendor-specific model id (e.g. 'gpt-4o', 'claude-sonnet-4-5-20250929')."
134
+ },
135
+ "label": {
136
+ "type": "string",
137
+ "description": "Optional label to disambiguate when the account has multiple credentials for the same vendor."
138
+ },
139
+ "auth": {
140
+ "type": "object",
141
+ "description": "Optional inline credentials. When omitted, feature-server looks up credentials by (vendor, label) from the database.",
142
+ "properties": {
143
+ "apiKey": { "type": "string" }
144
+ },
145
+ "additionalProperties": true
146
+ },
147
+ "connectOptions": {
148
+ "type": "object",
149
+ "description": "SDK-level client options.",
150
+ "properties": {
151
+ "timeout": { "type": "number", "minimum": 0 },
152
+ "maxRetries": { "type": "integer", "minimum": 0 },
153
+ "endpoint": { "type": "string" },
154
+ "baseURL": { "type": "string" }
155
+ },
156
+ "additionalProperties": false
157
+ },
158
+ "llmOptions": {
159
+ "type": "object",
160
+ "description": "Per-call LLM configuration.",
161
+ "properties": {
162
+ "systemPrompt": {
163
+ "type": "string",
164
+ "description": "System prompt for the model. Placed vendor-appropriately (top-level for Anthropic/Bedrock, config.systemInstruction for Gemini, role:'system' for OpenAI-compatibles)."
165
+ },
166
+ "messages": {
167
+ "type": "array",
168
+ "description": "Seed conversation history. A role:'system' entry is extracted into systemPrompt internally.",
169
+ "items": { "$ref": "#/$defs/llmMessage" }
170
+ },
171
+ "initialMessages": {
172
+ "type": "array",
173
+ "description": "Alias of 'messages' (historical).",
174
+ "items": { "$ref": "#/$defs/llmMessage" }
175
+ },
176
+ "maxTokens": {
177
+ "type": "integer",
178
+ "minimum": 1,
179
+ "description": "Maximum tokens the model may generate per turn."
180
+ },
181
+ "temperature": {
182
+ "type": "number",
183
+ "minimum": 0,
184
+ "description": "Sampling temperature."
185
+ },
186
+ "tools": {
187
+ "type": "array",
188
+ "description": "Tool / function definitions available to the model. The MCP-flat shape `{name, description, parameters}` is canonical; the OpenAI-wrapped form `{type:'function', function:{...}}` is also accepted.",
189
+ "items": {
190
+ "type": "object"
191
+ }
192
+ }
193
+ },
194
+ "additionalProperties": false
195
+ }
196
+ },
197
+ "additionalProperties": false
91
198
  },
92
199
  "actionHook": {
93
200
  "$ref": "../components/actionHook",
@@ -172,11 +279,71 @@
172
279
  "required": ["url"]
173
280
  },
174
281
  "description": "External MCP servers that provide tools to the LLM. The agent connects at startup via SSE, discovers available tools, and makes them callable by the LLM."
282
+ },
283
+ "toolFiller": {
284
+ "oneOf": [
285
+ { "type": "boolean", "const": false },
286
+ { "$ref": "#/$defs/toolFillerConfig" }
287
+ ],
288
+ "description": "Configuration for playing filler audio while tool calls are in progress. Prevents silence during long-running tool executions."
175
289
  }
176
290
  },
177
291
  "required": [
178
292
  "llm"
179
293
  ],
294
+ "$defs": {
295
+ "llmMessage": {
296
+ "type": "object",
297
+ "description": "A conversation-history message. The library normalizes content to a string; adapters may carry vendor-native shapes internally.",
298
+ "required": ["role", "content"],
299
+ "properties": {
300
+ "role": {
301
+ "type": "string",
302
+ "enum": ["system", "user", "assistant", "tool"]
303
+ },
304
+ "content": {}
305
+ },
306
+ "additionalProperties": true
307
+ },
308
+ "toolFillerConfig": {
309
+ "type": "object",
310
+ "required": ["type"],
311
+ "properties": {
312
+ "type": {
313
+ "type": "string",
314
+ "enum": ["audio", "backchannel"],
315
+ "description": "Filler mode. 'audio' plays a looping audio file (killed immediately when tool returns). 'backchannel' uses TTS to speak short phrases like 'one moment...' or 'checking that...' (allowed to complete before next action)."
316
+ },
317
+ "startDelaySecs": {
318
+ "type": "number",
319
+ "minimum": 0,
320
+ "description": "Seconds to wait after tool invocation before playing filler. Prevents filler on fast tools. Default: 2",
321
+ "default": 2
322
+ },
323
+ "url": {
324
+ "type": "string",
325
+ "format": "uri",
326
+ "description": "Audio file URL (for type='audio'). Should be loopable. Playback stops immediately when tool returns."
327
+ },
328
+ "style": {
329
+ "type": "string",
330
+ "description": "Free-form style hint for LLM-generated phrases (for type='backchannel'). Examples: 'casual', 'professional', 'friendly and patient'. The LLM interprets this when generating filler phrases at call start."
331
+ },
332
+ "escalationSecs": {
333
+ "type": "number",
334
+ "minimum": 0,
335
+ "description": "Seconds from tool invocation before generating a longer explanatory response (for type='backchannel'). Useful for tools that may take 10+ seconds. Default: 10",
336
+ "default": 10
337
+ }
338
+ },
339
+ "allOf": [
340
+ {
341
+ "if": { "properties": { "type": { "const": "audio" } } },
342
+ "then": { "required": ["url"] }
343
+ }
344
+ ]
345
+ }
346
+ },
180
347
  "examples": [
181
348
  {
182
349
  "verb": "agent",
@@ -3,7 +3,7 @@
3
3
  "$id": "https://jambonz.org/schema/verbs/dub",
4
4
  "minVersion": "0.9.6",
5
5
  "title": "Dub",
6
- "description": "Manages audio dubbing tracks on a call. Allows adding, removing, and controlling auxiliary audio tracks that are mixed into the call audio. Used for background music, coaching whispers, or injecting audio from external sources.",
6
+ "description": "Manages audio dubbing tracks on a call. Allows adding, removing, and controlling auxiliary audio tracks that are mixed into the call audio. Used for background music, coaching whispers, or injecting audio from external sources.\n\n**Track Routing:** Tracks are heard by the party on whose call leg they are created. A dub verb in the main verb stack (A-leg) creates tracks heard by the caller. A dub verb nested in the dial verb's `dub` array creates tracks heard by the callee. When using injectCommand to play/say on a track from a different call leg, pass the target call's `call_sid` as the third argument to `session.injectCommand()` to route the command to the correct leg.",
7
7
  "type": "object",
8
8
  "properties": {
9
9
  "verb": {
@@ -37,7 +37,8 @@
37
37
  },
38
38
  "channel": {
39
39
  "type": "number",
40
- "description": "Specific audio channel to transcribe."
40
+ "enum": [1, 2],
41
+ "description": "Specific audio channel to transcribe. Channel 1 = near-end (local party's audio, i.e. caller on A-leg or callee on B-leg). Channel 2 = far-end (remote party's audio). When transcribe is nested in the dial verb, omitting channel captures both legs mixed; specifying channel: 2 isolates the B-leg's inbound audio."
41
42
  }
42
43
  },
43
44
  "examples": [
@@ -229,19 +229,30 @@ class Session(VerbBuilder):
229
229
  async def tool_output(self, tool_call_id: str, result: Any) -> Session:
230
230
  """Return a tool call result to the agent LLM.
231
231
 
232
+ Canonical wire shape (validated by ``@jambonz/schema``)::
233
+
234
+ {"type": "command", "command": "llm:tool-output",
235
+ "tool_call_id": "...", "data": {"result": ...}}
236
+
237
+ The ``result`` argument becomes ``data.result`` when it is not a dict,
238
+ matching the Node SDK's convenience wrapping. Passing a dict sends it
239
+ as-is so callers can include richer structured output (feature-server
240
+ JSON-stringifies the full ``data`` object on the way to the LLM).
241
+
232
242
  Args:
233
243
  tool_call_id: The tool_call_id from the llm:tool-call event.
234
- result: The tool result (will be JSON-serialized).
244
+ result: The tool result. A non-dict value is wrapped as
245
+ ``{"result": result}``; a dict is sent as-is.
235
246
 
236
247
  Returns:
237
248
  self for chaining with .reply().
238
249
  """
250
+ payload = result if isinstance(result, dict) else {"result": result}
239
251
  msg = {
240
- "type": "llm:tool-output",
241
- "data": {
242
- "tool_call_id": tool_call_id,
243
- "output": result,
244
- },
252
+ "type": "command",
253
+ "command": "llm:tool-output",
254
+ "tool_call_id": tool_call_id,
255
+ "data": payload,
245
256
  }
246
257
  await self._ws.send(json.dumps(msg))
247
258
  return self
@@ -257,3 +268,24 @@ class Session(VerbBuilder):
257
268
  """
258
269
  msg = {"type": "agent:update", "data": data}
259
270
  await self._ws.send(json.dumps(msg))
271
+
272
+ async def inject_stt_reconfigure(
273
+ self,
274
+ language_hints: list[str] | None = None,
275
+ opts: dict[str, Any] | None = None
276
+ ) -> None:
277
+ """Reconfigure STT (speech-to-text) settings mid-call.
278
+
279
+ Currently supports updating language hints for Deepgram Flux Multilingual.
280
+
281
+ Args:
282
+ language_hints: List of BCP-47 language codes (e.g., ['en', 'es']).
283
+ Pass empty list [] to clear hints and enable auto-detection.
284
+ opts: Additional STT reconfiguration options.
285
+ """
286
+ data: dict[str, Any] = {}
287
+ if language_hints is not None:
288
+ data["languageHints"] = language_hints
289
+ if opts:
290
+ data.update(opts)
291
+ await self.inject_command("stt:reconfigure", data)