timbal 2.2.2__tar.gz → 2.2.4__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 (224) hide show
  1. {timbal-2.2.2 → timbal-2.2.4}/PKG-INFO +1 -1
  2. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/_version.py +2 -2
  3. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/codegen/flow.py +63 -0
  4. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/core/workflow.py +32 -8
  5. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/platform/utils.py +6 -2
  6. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/__init__.py +33 -0
  7. timbal-2.2.4/python/timbal/tools/elevenlabs.py +1154 -0
  8. timbal-2.2.2/python/timbal/tools/elevenlabs.py +0 -534
  9. {timbal-2.2.2 → timbal-2.2.4}/.gitignore +0 -0
  10. {timbal-2.2.2 → timbal-2.2.4}/LICENSE +0 -0
  11. {timbal-2.2.2 → timbal-2.2.4}/README.md +0 -0
  12. {timbal-2.2.2 → timbal-2.2.4}/docs/api-reference/ace/chat-completions.mdx +0 -0
  13. {timbal-2.2.2 → timbal-2.2.4}/docs/api-reference/ace/create-from-workforce.mdx +0 -0
  14. {timbal-2.2.2 → timbal-2.2.4}/docs/api-reference/ace/jobs/cancel.mdx +0 -0
  15. {timbal-2.2.2 → timbal-2.2.4}/docs/api-reference/ace/jobs/get.mdx +0 -0
  16. {timbal-2.2.2 → timbal-2.2.4}/docs/api-reference/ace/jobs/list.mdx +0 -0
  17. {timbal-2.2.2 → timbal-2.2.4}/docs/api-reference/ace/jobs/retry.mdx +0 -0
  18. {timbal-2.2.2 → timbal-2.2.4}/docs/api-reference/ace/link.mdx +0 -0
  19. {timbal-2.2.2 → timbal-2.2.4}/docs/api-reference/ace/list-context-vars.mdx +0 -0
  20. {timbal-2.2.2 → timbal-2.2.4}/docs/api-reference/ace/list-policies.mdx +0 -0
  21. {timbal-2.2.2 → timbal-2.2.4}/docs/api-reference/ace/messages.mdx +0 -0
  22. {timbal-2.2.2 → timbal-2.2.4}/docs/api-reference/ace/responses.mdx +0 -0
  23. {timbal-2.2.2 → timbal-2.2.4}/docs/api-reference/ace/unlink.mdx +0 -0
  24. {timbal-2.2.2 → timbal-2.2.4}/pyproject.toml +0 -0
  25. {timbal-2.2.2 → timbal-2.2.4}/pyrightconfig.json +0 -0
  26. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/__init__.py +0 -0
  27. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/codegen/__init__.py +0 -0
  28. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/codegen/__main__.py +0 -0
  29. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/codegen/cli_utils.py +0 -0
  30. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/codegen/cst_utils.py +0 -0
  31. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/codegen/format.py +0 -0
  32. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/codegen/model_discovery.py +0 -0
  33. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/codegen/test.py +0 -0
  34. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/codegen/tool_discovery.py +0 -0
  35. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/codegen/transformers/__init__.py +0 -0
  36. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/codegen/transformers/add_edge.py +0 -0
  37. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/codegen/transformers/add_step.py +0 -0
  38. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/codegen/transformers/add_tool.py +0 -0
  39. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/codegen/transformers/remove_edge.py +0 -0
  40. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/codegen/transformers/remove_step.py +0 -0
  41. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/codegen/transformers/remove_tool.py +0 -0
  42. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/codegen/transformers/set_config.py +0 -0
  43. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/codegen/transformers/set_param.py +0 -0
  44. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/codegen/transformers/set_position.py +0 -0
  45. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/collectors/__init__.py +0 -0
  46. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/collectors/base.py +0 -0
  47. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/collectors/impl/__init__.py +0 -0
  48. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/collectors/impl/anthropic.py +0 -0
  49. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/collectors/impl/default.py +0 -0
  50. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/collectors/impl/message.py +0 -0
  51. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/collectors/impl/openai.py +0 -0
  52. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/collectors/impl/string.py +0 -0
  53. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/collectors/impl/timbal.py +0 -0
  54. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/collectors/registry.py +0 -0
  55. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/core/__init__.py +0 -0
  56. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/core/agent.py +0 -0
  57. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/core/fallback_model.py +0 -0
  58. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/core/llm_router.py +0 -0
  59. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/core/mcp.py +0 -0
  60. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/core/memory_compaction.py +0 -0
  61. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/core/models.py +0 -0
  62. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/core/runnable.py +0 -0
  63. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/core/skill.py +0 -0
  64. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/core/test_model.py +0 -0
  65. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/core/tool.py +0 -0
  66. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/core/tool_set.py +0 -0
  67. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/errors.py +0 -0
  68. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/evals/__init__.py +0 -0
  69. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/evals/cli.py +0 -0
  70. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/evals/display.py +0 -0
  71. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/evals/fixtures/agent.py +0 -0
  72. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/evals/fixtures/eval_examples.yaml +0 -0
  73. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/evals/fixtures/eval_flow_validators.yaml +0 -0
  74. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/evals/fixtures/eval_negations.yaml +0 -0
  75. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/evals/fixtures/eval_parallel.yaml +0 -0
  76. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/evals/fixtures/eval_subagent.yaml +0 -0
  77. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/evals/fixtures/eval_transforms.yaml +0 -0
  78. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/evals/fixtures/test_invalid_validator.yaml +0 -0
  79. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/evals/models.py +0 -0
  80. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/evals/runner.py +0 -0
  81. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/evals/utils.py +0 -0
  82. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/evals/validators/__init__.py +0 -0
  83. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/evals/validators/base.py +0 -0
  84. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/evals/validators/comparison_base.py +0 -0
  85. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/evals/validators/contains.py +0 -0
  86. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/evals/validators/contains_all.py +0 -0
  87. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/evals/validators/contains_any.py +0 -0
  88. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/evals/validators/context.py +0 -0
  89. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/evals/validators/email.py +0 -0
  90. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/evals/validators/ends_with.py +0 -0
  91. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/evals/validators/eq.py +0 -0
  92. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/evals/validators/gt.py +0 -0
  93. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/evals/validators/gte.py +0 -0
  94. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/evals/validators/json.py +0 -0
  95. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/evals/validators/language.py +0 -0
  96. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/evals/validators/length.py +0 -0
  97. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/evals/validators/llm_base.py +0 -0
  98. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/evals/validators/lt.py +0 -0
  99. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/evals/validators/lte.py +0 -0
  100. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/evals/validators/max_length.py +0 -0
  101. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/evals/validators/min_length.py +0 -0
  102. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/evals/validators/not_null.py +0 -0
  103. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/evals/validators/parallel.py +0 -0
  104. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/evals/validators/pattern.py +0 -0
  105. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/evals/validators/prompt.py +0 -0
  106. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/evals/validators/semantic.py +0 -0
  107. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/evals/validators/seq.py +0 -0
  108. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/evals/validators/starts_with.py +0 -0
  109. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/evals/validators/type.py +0 -0
  110. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/logs.py +0 -0
  111. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/models.yaml +0 -0
  112. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/platform/__init__.py +0 -0
  113. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/platform/integrations.py +0 -0
  114. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/platform/knowledge_bases/__init__.py +0 -0
  115. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/platform/knowledge_bases/query.py +0 -0
  116. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/platform/tool_proxy.py +0 -0
  117. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/platform/types.py +0 -0
  118. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/server/__init__.py +0 -0
  119. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/server/__main__.py +0 -0
  120. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/server/http.py +0 -0
  121. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/server/jobs.py +0 -0
  122. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/server/voice.html +0 -0
  123. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/server/voice.py +0 -0
  124. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/state/__init__.py +0 -0
  125. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/state/config.py +0 -0
  126. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/state/config_loader.py +0 -0
  127. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/state/context.py +0 -0
  128. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/state/dependency_analyzer.py +0 -0
  129. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/state/tracing/__init__.py +0 -0
  130. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/state/tracing/exporters/__init__.py +0 -0
  131. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/state/tracing/exporters/otel.py +0 -0
  132. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/state/tracing/providers/__init__.py +0 -0
  133. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/state/tracing/providers/base.py +0 -0
  134. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/state/tracing/providers/in_memory.py +0 -0
  135. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/state/tracing/providers/jsonl.py +0 -0
  136. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/state/tracing/providers/platform.py +0 -0
  137. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/state/tracing/providers/sqlite.py +0 -0
  138. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/state/tracing/span.py +0 -0
  139. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/state/tracing/trace.py +0 -0
  140. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/_creds.py +0 -0
  141. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/asana.py +0 -0
  142. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/bash.py +0 -0
  143. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/cala.py +0 -0
  144. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/cloudflare.py +0 -0
  145. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/dynamics_business_central.py +0 -0
  146. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/dynamics_sales.py +0 -0
  147. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/edit.py +0 -0
  148. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/elasticsearch.py +0 -0
  149. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/excel.py +0 -0
  150. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/fal.py +0 -0
  151. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/fathom.py +0 -0
  152. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/firecrawl.py +0 -0
  153. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/gemini_images.py +0 -0
  154. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/gmail.py +0 -0
  155. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/google_analytics.py +0 -0
  156. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/google_business.py +0 -0
  157. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/google_calendar.py +0 -0
  158. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/google_docs.py +0 -0
  159. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/google_drive.py +0 -0
  160. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/google_maps.py +0 -0
  161. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/google_merchant_center.py +0 -0
  162. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/google_search_console.py +0 -0
  163. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/google_sheets.py +0 -0
  164. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/happy_scribe.py +0 -0
  165. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/higgsfield.py +0 -0
  166. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/hubspot.py +0 -0
  167. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/interaction.py +0 -0
  168. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/jira.py +0 -0
  169. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/klaviyo.py +0 -0
  170. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/knowledge_base.py +0 -0
  171. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/krea.py +0 -0
  172. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/lancedb.py +0 -0
  173. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/linkedin.py +0 -0
  174. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/mongodb.py +0 -0
  175. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/netsuite.py +0 -0
  176. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/onedrive.py +0 -0
  177. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/outlook.py +0 -0
  178. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/pinecone.py +0 -0
  179. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/powerbi.py +0 -0
  180. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/quiver_ai.py +0 -0
  181. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/read.py +0 -0
  182. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/replicate.py +0 -0
  183. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/resend.py +0 -0
  184. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/salesforce.py +0 -0
  185. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/scraperapi.py +0 -0
  186. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/sharepoint.py +0 -0
  187. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/shopify.py +0 -0
  188. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/slack.py +0 -0
  189. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/stripe.py +0 -0
  190. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/tavily.py +0 -0
  191. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/web_search.py +0 -0
  192. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/write.py +0 -0
  193. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/xai.py +0 -0
  194. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/zendesk.py +0 -0
  195. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/tools/zoho_crm.py +0 -0
  196. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/types/__init__.py +0 -0
  197. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/types/approval.py +0 -0
  198. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/types/content/__init__.py +0 -0
  199. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/types/content/base.py +0 -0
  200. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/types/content/custom.py +0 -0
  201. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/types/content/file.py +0 -0
  202. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/types/content/text.py +0 -0
  203. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/types/content/thinking.py +0 -0
  204. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/types/content/tool_result.py +0 -0
  205. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/types/content/tool_use.py +0 -0
  206. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/types/events/__init__.py +0 -0
  207. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/types/events/approval.py +0 -0
  208. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/types/events/base.py +0 -0
  209. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/types/events/delta.py +0 -0
  210. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/types/events/interaction.py +0 -0
  211. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/types/events/output.py +0 -0
  212. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/types/events/start.py +0 -0
  213. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/types/file.py +0 -0
  214. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/types/message.py +0 -0
  215. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/types/run_status.py +0 -0
  216. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/utils/__init__.py +0 -0
  217. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/utils/import_spec.py +0 -0
  218. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/utils/model.py +0 -0
  219. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/utils/net.py +0 -0
  220. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/utils/schema.py +0 -0
  221. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/utils/serialization.py +0 -0
  222. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/voice/__init__.py +0 -0
  223. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/voice/elevenlabs.py +0 -0
  224. {timbal-2.2.2 → timbal-2.2.4}/python/timbal/voice/session.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: timbal
3
- Version: 2.2.2
3
+ Version: 2.2.4
4
4
  Summary: Simple, performant, battle-tested framework for building reliable AI applications
5
5
  Project-URL: Source, https://github.com/timbal-ai/timbal
6
6
  Author-email: Timbal <team@timbal.ai>
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '2.2.2'
22
- __version_tuple__ = version_tuple = (2, 2, 2)
21
+ __version__ = version = '2.2.4'
22
+ __version_tuple__ = version_tuple = (2, 2, 4)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -203,6 +203,24 @@ def _build_node(runnable: Any, *, include_tools: bool = True) -> dict[str, Any]:
203
203
  return node
204
204
 
205
205
 
206
+ def _edge_kind(kinds: set[str] | None) -> str:
207
+ """Collapse a set of edge-origin kinds into a single label for JSON output.
208
+
209
+ A dependency can arise from several sources at once (e.g. an explicit
210
+ ``depends_on`` that also reads the step's output via a param map). Precedence
211
+ is ``ordering > when > param`` so explicit sequencing is never masked by
212
+ param wiring. Unknown/missing (e.g. edges from a direct ``_link``) default to
213
+ ``ordering`` — the safe choice, since ordering edges are never reduced away.
214
+ """
215
+ if not kinds:
216
+ return "ordering"
217
+ if "ordering" in kinds:
218
+ return "ordering"
219
+ if "when" in kinds:
220
+ return "when"
221
+ return "param"
222
+
223
+
206
224
  def get_flow(workspace_path: str | Path) -> dict[str, Any]:
207
225
  """Return a ReactFlow-compatible graph for the workspace entry point.
208
226
 
@@ -239,12 +257,14 @@ def get_flow(workspace_path: str | Path) -> dict[str, Any]:
239
257
 
240
258
  for _step_name, step in runnable._steps.items():
241
259
  when_source = _get_when_source(step) if step.when else None
260
+ kinds_map = getattr(step, "previous_steps_kinds", None) or {}
242
261
  for prev_name in step.previous_steps:
243
262
  prev_step = runnable._steps[prev_name]
244
263
  edge: dict[str, Any] = {
245
264
  "id": f"{prev_step._path}->{step._path}",
246
265
  "source": prev_step._path,
247
266
  "target": step._path,
267
+ "kind": _edge_kind(kinds_map.get(prev_name)),
248
268
  }
249
269
  if when_source is not None:
250
270
  edge["when"] = when_source
@@ -390,6 +410,48 @@ def _fmt_node_lines(node: dict, indent: str) -> list[str]:
390
410
  return lines
391
411
 
392
412
 
413
+ def _reduce_param_edges(edges: list[dict]) -> list[dict]:
414
+ """Drop param-induced edges that are transitively implied by another path.
415
+
416
+ A param dependency ``A → C`` (the handler/agent on C reads A's output) is a
417
+ real await-gate at runtime, but for an execution-order view it is redundant
418
+ when A already reaches C through some other path (e.g. ``A → B → C``). Left
419
+ in, such edges turn a linear pipeline into a misleading fan-out from the
420
+ first step.
421
+
422
+ Only edges whose single ``kind`` is ``param`` are eligible for removal —
423
+ explicit ordering (``depends_on`` / hooks) and ``when`` edges are always
424
+ kept so user-added structure never silently disappears from the compact
425
+ view. The full edge set (including these) is retained in the JSON output.
426
+ """
427
+ adj: dict[str, list[str]] = defaultdict(list)
428
+ for e in edges:
429
+ adj[e["source"]].append(e["target"])
430
+
431
+ def _reaches(start: str, goal: str, skip: tuple[str, str]) -> bool:
432
+ """True if ``goal`` is reachable from ``start`` without using the direct ``skip`` edge."""
433
+ stack = [start]
434
+ seen = {start}
435
+ while stack:
436
+ node = stack.pop()
437
+ for nxt in adj.get(node, []):
438
+ if (node, nxt) == skip:
439
+ continue
440
+ if nxt == goal:
441
+ return True
442
+ if nxt not in seen:
443
+ seen.add(nxt)
444
+ stack.append(nxt)
445
+ return False
446
+
447
+ kept: list[dict] = []
448
+ for e in edges:
449
+ if e.get("kind") == "param" and _reaches(e["source"], e["target"], (e["source"], e["target"])):
450
+ continue
451
+ kept.append(e)
452
+ return kept
453
+
454
+
393
455
  def _build_edge_lines(edges: list[dict]) -> list[str]:
394
456
  """Render edges grouped by source, one line per source node."""
395
457
  targets_of: dict[str, list[tuple[str, str | None]]] = defaultdict(list)
@@ -472,6 +534,7 @@ def format_compact(flow: dict) -> str:
472
534
  for line in _fmt_node_lines(node, indent=" "):
473
535
  lines.append(line)
474
536
 
537
+ edges = _reduce_param_edges(edges)
475
538
  if edges:
476
539
  lines.append("")
477
540
  lines.append("EDGES")
@@ -142,29 +142,53 @@ class Workflow(Runnable):
142
142
  self._steps[runnable.name] = runnable
143
143
  runnable.previous_steps = set()
144
144
  runnable.next_steps = set()
145
+ # Per-source edge kinds: maps a previous step name -> set of kinds
146
+ # ("ordering" | "when" | "param"). Used by introspection (get_flow) to
147
+ # distinguish explicit sequencing from param/when-induced dependencies.
148
+ # Runtime sequencing only ever looks at ``previous_steps``.
149
+ runnable.previous_steps_kinds = {}
145
150
  runnable.when = None
146
151
 
147
152
  # Explicit dependencies
148
153
  if depends_on and not isinstance(depends_on, list):
149
154
  raise ValueError("depends_on must be a list of step names")
150
- depends_on = set(depends_on or []) # Deduplicate here to avoid duplicate _is_dag calls
151
155
 
152
- depends_on.update(runnable._dependencies)
153
- depends_on.update(runnable._pre_hook_dependencies)
154
- depends_on.update(runnable._post_hook_dependencies)
156
+ # Track dependency origins so introspection can tell explicit ordering
157
+ # (depends_on / hooks) apart from param- and when-induced wiring. These
158
+ # all merge into ``previous_steps`` for execution, but the distinction is
159
+ # lossy once merged (a step can be both an explicit dep and a param dep),
160
+ # so we record it here while the sources are still separate.
161
+ ordering_deps = set(depends_on or [])
162
+ # Hooks read sibling outputs via step_span(); treat as ordering so they
163
+ # are never silently collapsed in compact views.
164
+ ordering_deps.update(runnable._pre_hook_dependencies)
165
+ ordering_deps.update(runnable._post_hook_dependencies)
166
+ # Handler-body step_span() references are data wiring, not explicit ordering.
167
+ param_deps = set(runnable._dependencies)
168
+ when_deps: set[str] = set()
155
169
 
156
170
  # Optional handler to determine whether to execute the step, and inspect it to automatically link steps
157
171
  if when:
158
172
  inspect_result = runnable._inspect_callable(when)
159
173
  runnable.when = {"callable": when, **inspect_result}
160
- depends_on.update(inspect_result["dependencies"])
174
+ when_deps.update(inspect_result["dependencies"])
161
175
 
162
176
  # Use kwargs as default params for the runnable, and inspect callables to automatically link steps
163
177
  runnable._prepare_default_params(kwargs)
164
178
  for v in runnable._default_runtime_params.values():
165
- depends_on.update(v["dependencies"])
166
-
167
- for dep in depends_on:
179
+ param_deps.update(v["dependencies"])
180
+
181
+ edge_kinds: dict[str, set[str]] = {}
182
+ for dep in ordering_deps:
183
+ edge_kinds.setdefault(dep, set()).add("ordering")
184
+ for dep in when_deps:
185
+ edge_kinds.setdefault(dep, set()).add("when")
186
+ for dep in param_deps:
187
+ edge_kinds.setdefault(dep, set()).add("param")
188
+ runnable.previous_steps_kinds = edge_kinds
189
+
190
+ # Deduplicate (set union) to avoid duplicate _is_dag calls per shared dep.
191
+ for dep in edge_kinds:
168
192
  logger.info("Linking steps", previous_step=dep, next_step=runnable.name)
169
193
  self._link(dep, runnable.name)
170
194
 
@@ -104,7 +104,9 @@ async def _request(
104
104
  """Utility function for making HTTP requests."""
105
105
  url, headers = _resolve_url_and_headers(service, path, headers)
106
106
  payload_kwargs = {}
107
- if json:
107
+ # `is not None` so an empty dict still sends a JSON body + Content-Type
108
+ # (parameterless POSTs would otherwise 415 Unsupported Media Type).
109
+ if json is not None:
108
110
  payload_kwargs["json"] = json
109
111
  elif content:
110
112
  payload_kwargs["content"] = content
@@ -194,7 +196,9 @@ async def _stream(
194
196
  "Cache-Control": "no-cache",
195
197
  }
196
198
  payload_kwargs = {}
197
- if json:
199
+ # `is not None` so an empty dict still sends a JSON body + Content-Type
200
+ # (parameterless POSTs would otherwise 415 Unsupported Media Type).
201
+ if json is not None:
198
202
  payload_kwargs["json"] = json
199
203
  elif content:
200
204
  payload_kwargs["content"] = content
@@ -58,15 +58,26 @@ if TYPE_CHECKING:
58
58
  )
59
59
  from .elevenlabs import (
60
60
  ElevenLabsAddVoice,
61
+ ElevenLabsAudioIsolation,
61
62
  ElevenLabsCreateAgent,
63
+ ElevenLabsCreateDubbing,
64
+ ElevenLabsCreateVoiceFromPreview,
65
+ ElevenLabsCreateVoicePreviews,
66
+ ElevenLabsDeleteVoice,
62
67
  ElevenLabsDownloadHistoryItems,
63
68
  ElevenLabsGetAudioFromHistoryItem,
69
+ ElevenLabsGetDubbedAudio,
70
+ ElevenLabsGetDubbing,
64
71
  ElevenLabsGetModels,
65
72
  ElevenLabsGetVoicesWithDescriptions,
66
73
  ElevenLabsListAgents,
74
+ ElevenLabsListDubbings,
67
75
  ElevenLabsListHistory,
68
76
  ElevenLabsListPhoneNumbers,
69
77
  ElevenLabsMakeOutboundCall,
78
+ ElevenLabsSoundGeneration,
79
+ ElevenLabsSpeechToSpeech,
80
+ ElevenLabsSpeechToText,
70
81
  ElevenLabsTextToSpeech,
71
82
  )
72
83
  from .excel import (
@@ -1453,6 +1464,10 @@ __all__ = [
1453
1464
  "HubSpotGetAssociationTypes",
1454
1465
  "HubSpotGetUsers",
1455
1466
  "ElevenLabsTextToSpeech",
1467
+ "ElevenLabsSpeechToText",
1468
+ "ElevenLabsSpeechToSpeech",
1469
+ "ElevenLabsSoundGeneration",
1470
+ "ElevenLabsAudioIsolation",
1456
1471
  "ElevenLabsListPhoneNumbers",
1457
1472
  "ElevenLabsMakeOutboundCall",
1458
1473
  "ElevenLabsListAgents",
@@ -1463,6 +1478,13 @@ __all__ = [
1463
1478
  "ElevenLabsDownloadHistoryItems",
1464
1479
  "ElevenLabsCreateAgent",
1465
1480
  "ElevenLabsAddVoice",
1481
+ "ElevenLabsDeleteVoice",
1482
+ "ElevenLabsCreateVoicePreviews",
1483
+ "ElevenLabsCreateVoiceFromPreview",
1484
+ "ElevenLabsCreateDubbing",
1485
+ "ElevenLabsGetDubbing",
1486
+ "ElevenLabsListDubbings",
1487
+ "ElevenLabsGetDubbedAudio",
1466
1488
  "CloudflareCrawlStart",
1467
1489
  "CloudflareCrawlGet",
1468
1490
  "CloudflareCrawlCancel",
@@ -2512,6 +2534,10 @@ _LAZY_IMPORTS = {
2512
2534
  "HubSpotGetAssociationTypes": ".hubspot",
2513
2535
  "HubSpotGetUsers": ".hubspot",
2514
2536
  "ElevenLabsTextToSpeech": ".elevenlabs",
2537
+ "ElevenLabsSpeechToText": ".elevenlabs",
2538
+ "ElevenLabsSpeechToSpeech": ".elevenlabs",
2539
+ "ElevenLabsSoundGeneration": ".elevenlabs",
2540
+ "ElevenLabsAudioIsolation": ".elevenlabs",
2515
2541
  "ElevenLabsListPhoneNumbers": ".elevenlabs",
2516
2542
  "ElevenLabsMakeOutboundCall": ".elevenlabs",
2517
2543
  "ElevenLabsListAgents": ".elevenlabs",
@@ -2522,6 +2548,13 @@ _LAZY_IMPORTS = {
2522
2548
  "ElevenLabsDownloadHistoryItems": ".elevenlabs",
2523
2549
  "ElevenLabsCreateAgent": ".elevenlabs",
2524
2550
  "ElevenLabsAddVoice": ".elevenlabs",
2551
+ "ElevenLabsDeleteVoice": ".elevenlabs",
2552
+ "ElevenLabsCreateVoicePreviews": ".elevenlabs",
2553
+ "ElevenLabsCreateVoiceFromPreview": ".elevenlabs",
2554
+ "ElevenLabsCreateDubbing": ".elevenlabs",
2555
+ "ElevenLabsGetDubbing": ".elevenlabs",
2556
+ "ElevenLabsListDubbings": ".elevenlabs",
2557
+ "ElevenLabsGetDubbedAudio": ".elevenlabs",
2525
2558
  "CloudflareCrawlStart": ".cloudflare",
2526
2559
  "CloudflareCrawlGet": ".cloudflare",
2527
2560
  "CloudflareCrawlCancel": ".cloudflare",