timbal 2.2.0__tar.gz → 2.2.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 (223) hide show
  1. {timbal-2.2.0 → timbal-2.2.2}/PKG-INFO +1 -1
  2. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/_version.py +2 -2
  3. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/codegen/flow.py +14 -2
  4. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/platform/types.py +1 -2
  5. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/__init__.py +44 -0
  6. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/gemini_images.py +51 -24
  7. timbal-2.2.2/python/timbal/tools/higgsfield.py +696 -0
  8. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/krea.py +196 -160
  9. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/types/file.py +2 -6
  10. {timbal-2.2.0 → timbal-2.2.2}/.gitignore +0 -0
  11. {timbal-2.2.0 → timbal-2.2.2}/LICENSE +0 -0
  12. {timbal-2.2.0 → timbal-2.2.2}/README.md +0 -0
  13. {timbal-2.2.0 → timbal-2.2.2}/docs/api-reference/ace/chat-completions.mdx +0 -0
  14. {timbal-2.2.0 → timbal-2.2.2}/docs/api-reference/ace/create-from-workforce.mdx +0 -0
  15. {timbal-2.2.0 → timbal-2.2.2}/docs/api-reference/ace/jobs/cancel.mdx +0 -0
  16. {timbal-2.2.0 → timbal-2.2.2}/docs/api-reference/ace/jobs/get.mdx +0 -0
  17. {timbal-2.2.0 → timbal-2.2.2}/docs/api-reference/ace/jobs/list.mdx +0 -0
  18. {timbal-2.2.0 → timbal-2.2.2}/docs/api-reference/ace/jobs/retry.mdx +0 -0
  19. {timbal-2.2.0 → timbal-2.2.2}/docs/api-reference/ace/link.mdx +0 -0
  20. {timbal-2.2.0 → timbal-2.2.2}/docs/api-reference/ace/list-context-vars.mdx +0 -0
  21. {timbal-2.2.0 → timbal-2.2.2}/docs/api-reference/ace/list-policies.mdx +0 -0
  22. {timbal-2.2.0 → timbal-2.2.2}/docs/api-reference/ace/messages.mdx +0 -0
  23. {timbal-2.2.0 → timbal-2.2.2}/docs/api-reference/ace/responses.mdx +0 -0
  24. {timbal-2.2.0 → timbal-2.2.2}/docs/api-reference/ace/unlink.mdx +0 -0
  25. {timbal-2.2.0 → timbal-2.2.2}/pyproject.toml +0 -0
  26. {timbal-2.2.0 → timbal-2.2.2}/pyrightconfig.json +0 -0
  27. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/__init__.py +0 -0
  28. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/codegen/__init__.py +0 -0
  29. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/codegen/__main__.py +0 -0
  30. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/codegen/cli_utils.py +0 -0
  31. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/codegen/cst_utils.py +0 -0
  32. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/codegen/format.py +0 -0
  33. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/codegen/model_discovery.py +0 -0
  34. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/codegen/test.py +0 -0
  35. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/codegen/tool_discovery.py +0 -0
  36. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/codegen/transformers/__init__.py +0 -0
  37. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/codegen/transformers/add_edge.py +0 -0
  38. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/codegen/transformers/add_step.py +0 -0
  39. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/codegen/transformers/add_tool.py +0 -0
  40. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/codegen/transformers/remove_edge.py +0 -0
  41. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/codegen/transformers/remove_step.py +0 -0
  42. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/codegen/transformers/remove_tool.py +0 -0
  43. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/codegen/transformers/set_config.py +0 -0
  44. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/codegen/transformers/set_param.py +0 -0
  45. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/codegen/transformers/set_position.py +0 -0
  46. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/collectors/__init__.py +0 -0
  47. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/collectors/base.py +0 -0
  48. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/collectors/impl/__init__.py +0 -0
  49. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/collectors/impl/anthropic.py +0 -0
  50. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/collectors/impl/default.py +0 -0
  51. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/collectors/impl/message.py +0 -0
  52. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/collectors/impl/openai.py +0 -0
  53. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/collectors/impl/string.py +0 -0
  54. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/collectors/impl/timbal.py +0 -0
  55. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/collectors/registry.py +0 -0
  56. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/core/__init__.py +0 -0
  57. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/core/agent.py +0 -0
  58. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/core/fallback_model.py +0 -0
  59. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/core/llm_router.py +0 -0
  60. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/core/mcp.py +0 -0
  61. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/core/memory_compaction.py +0 -0
  62. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/core/models.py +0 -0
  63. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/core/runnable.py +0 -0
  64. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/core/skill.py +0 -0
  65. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/core/test_model.py +0 -0
  66. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/core/tool.py +0 -0
  67. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/core/tool_set.py +0 -0
  68. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/core/workflow.py +0 -0
  69. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/errors.py +0 -0
  70. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/__init__.py +0 -0
  71. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/cli.py +0 -0
  72. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/display.py +0 -0
  73. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/fixtures/agent.py +0 -0
  74. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/fixtures/eval_examples.yaml +0 -0
  75. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/fixtures/eval_flow_validators.yaml +0 -0
  76. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/fixtures/eval_negations.yaml +0 -0
  77. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/fixtures/eval_parallel.yaml +0 -0
  78. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/fixtures/eval_subagent.yaml +0 -0
  79. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/fixtures/eval_transforms.yaml +0 -0
  80. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/fixtures/test_invalid_validator.yaml +0 -0
  81. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/models.py +0 -0
  82. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/runner.py +0 -0
  83. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/utils.py +0 -0
  84. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/__init__.py +0 -0
  85. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/base.py +0 -0
  86. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/comparison_base.py +0 -0
  87. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/contains.py +0 -0
  88. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/contains_all.py +0 -0
  89. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/contains_any.py +0 -0
  90. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/context.py +0 -0
  91. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/email.py +0 -0
  92. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/ends_with.py +0 -0
  93. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/eq.py +0 -0
  94. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/gt.py +0 -0
  95. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/gte.py +0 -0
  96. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/json.py +0 -0
  97. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/language.py +0 -0
  98. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/length.py +0 -0
  99. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/llm_base.py +0 -0
  100. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/lt.py +0 -0
  101. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/lte.py +0 -0
  102. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/max_length.py +0 -0
  103. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/min_length.py +0 -0
  104. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/not_null.py +0 -0
  105. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/parallel.py +0 -0
  106. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/pattern.py +0 -0
  107. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/prompt.py +0 -0
  108. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/semantic.py +0 -0
  109. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/seq.py +0 -0
  110. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/starts_with.py +0 -0
  111. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/type.py +0 -0
  112. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/logs.py +0 -0
  113. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/models.yaml +0 -0
  114. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/platform/__init__.py +0 -0
  115. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/platform/integrations.py +0 -0
  116. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/platform/knowledge_bases/__init__.py +0 -0
  117. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/platform/knowledge_bases/query.py +0 -0
  118. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/platform/tool_proxy.py +0 -0
  119. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/platform/utils.py +0 -0
  120. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/server/__init__.py +0 -0
  121. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/server/__main__.py +0 -0
  122. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/server/http.py +0 -0
  123. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/server/jobs.py +0 -0
  124. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/server/voice.html +0 -0
  125. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/server/voice.py +0 -0
  126. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/state/__init__.py +0 -0
  127. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/state/config.py +0 -0
  128. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/state/config_loader.py +0 -0
  129. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/state/context.py +0 -0
  130. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/state/dependency_analyzer.py +0 -0
  131. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/state/tracing/__init__.py +0 -0
  132. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/state/tracing/exporters/__init__.py +0 -0
  133. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/state/tracing/exporters/otel.py +0 -0
  134. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/state/tracing/providers/__init__.py +0 -0
  135. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/state/tracing/providers/base.py +0 -0
  136. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/state/tracing/providers/in_memory.py +0 -0
  137. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/state/tracing/providers/jsonl.py +0 -0
  138. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/state/tracing/providers/platform.py +0 -0
  139. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/state/tracing/providers/sqlite.py +0 -0
  140. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/state/tracing/span.py +0 -0
  141. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/state/tracing/trace.py +0 -0
  142. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/_creds.py +0 -0
  143. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/asana.py +0 -0
  144. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/bash.py +0 -0
  145. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/cala.py +0 -0
  146. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/cloudflare.py +0 -0
  147. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/dynamics_business_central.py +0 -0
  148. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/dynamics_sales.py +0 -0
  149. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/edit.py +0 -0
  150. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/elasticsearch.py +0 -0
  151. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/elevenlabs.py +0 -0
  152. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/excel.py +0 -0
  153. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/fal.py +0 -0
  154. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/fathom.py +0 -0
  155. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/firecrawl.py +0 -0
  156. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/gmail.py +0 -0
  157. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/google_analytics.py +0 -0
  158. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/google_business.py +0 -0
  159. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/google_calendar.py +0 -0
  160. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/google_docs.py +0 -0
  161. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/google_drive.py +0 -0
  162. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/google_maps.py +0 -0
  163. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/google_merchant_center.py +0 -0
  164. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/google_search_console.py +0 -0
  165. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/google_sheets.py +0 -0
  166. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/happy_scribe.py +0 -0
  167. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/hubspot.py +0 -0
  168. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/interaction.py +0 -0
  169. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/jira.py +0 -0
  170. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/klaviyo.py +0 -0
  171. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/knowledge_base.py +0 -0
  172. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/lancedb.py +0 -0
  173. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/linkedin.py +0 -0
  174. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/mongodb.py +0 -0
  175. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/netsuite.py +0 -0
  176. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/onedrive.py +0 -0
  177. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/outlook.py +0 -0
  178. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/pinecone.py +0 -0
  179. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/powerbi.py +0 -0
  180. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/quiver_ai.py +0 -0
  181. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/read.py +0 -0
  182. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/replicate.py +0 -0
  183. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/resend.py +0 -0
  184. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/salesforce.py +0 -0
  185. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/scraperapi.py +0 -0
  186. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/sharepoint.py +0 -0
  187. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/shopify.py +0 -0
  188. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/slack.py +0 -0
  189. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/stripe.py +0 -0
  190. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/tavily.py +0 -0
  191. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/web_search.py +0 -0
  192. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/write.py +0 -0
  193. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/xai.py +0 -0
  194. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/zendesk.py +0 -0
  195. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/zoho_crm.py +0 -0
  196. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/types/__init__.py +0 -0
  197. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/types/approval.py +0 -0
  198. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/types/content/__init__.py +0 -0
  199. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/types/content/base.py +0 -0
  200. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/types/content/custom.py +0 -0
  201. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/types/content/file.py +0 -0
  202. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/types/content/text.py +0 -0
  203. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/types/content/thinking.py +0 -0
  204. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/types/content/tool_result.py +0 -0
  205. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/types/content/tool_use.py +0 -0
  206. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/types/events/__init__.py +0 -0
  207. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/types/events/approval.py +0 -0
  208. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/types/events/base.py +0 -0
  209. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/types/events/delta.py +0 -0
  210. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/types/events/interaction.py +0 -0
  211. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/types/events/output.py +0 -0
  212. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/types/events/start.py +0 -0
  213. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/types/message.py +0 -0
  214. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/types/run_status.py +0 -0
  215. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/utils/__init__.py +0 -0
  216. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/utils/import_spec.py +0 -0
  217. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/utils/model.py +0 -0
  218. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/utils/net.py +0 -0
  219. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/utils/schema.py +0 -0
  220. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/utils/serialization.py +0 -0
  221. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/voice/__init__.py +0 -0
  222. {timbal-2.2.0 → timbal-2.2.2}/python/timbal/voice/elevenlabs.py +0 -0
  223. {timbal-2.2.0 → timbal-2.2.2}/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.0
3
+ Version: 2.2.2
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.0'
22
- __version_tuple__ = version_tuple = (2, 2, 0)
21
+ __version__ = version = '2.2.2'
22
+ __version_tuple__ = version_tuple = (2, 2, 2)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -71,8 +71,20 @@ def _extract_key_from_lambda(fn: Any, source_step: str) -> str | None:
71
71
 
72
72
 
73
73
  def _is_model_enum(values: list) -> bool:
74
- """Return True if a list of enum values looks like LLM model IDs (provider/name)."""
75
- return len(values) > 5 and all(isinstance(v, str) and "/" in v for v in values[:5])
74
+ """Return True if an enum is the canonical LLM model ID set (provider/name).
75
+
76
+ Matches against ``timbal.core.models.Model`` rather than guessing from shape:
77
+ other registries (e.g. Krea's image/video IDs) share the ``provider/name``
78
+ form but must keep their enum inline so editors resolve the right options.
79
+ """
80
+ if len(values) <= 5 or not all(isinstance(v, str) and "/" in v for v in values[:5]):
81
+ return False
82
+ import typing
83
+
84
+ from timbal.core.models import Model
85
+
86
+ known = set(typing.get_args(Model))
87
+ return all(v in known for v in values)
76
88
 
77
89
 
78
90
  def _compact_field(field: dict) -> dict:
@@ -34,7 +34,6 @@ class UploadFileResponse(BaseModel):
34
34
  created_at: datetime
35
35
  expires_at: datetime | None
36
36
  name: str
37
- # Optional: POST /files (no org scope) returns a temporary upload without an id.
38
- # POST /orgs/{org_id}/files returns a permanent upload with an id.
37
+ # POST /files (no org scope) returns a temporary upload without an id.
39
38
  id: str | int | None = None
40
39
  url: str
@@ -238,6 +238,22 @@ if TYPE_CHECKING:
238
238
  HappyScribeListTranscriptions,
239
239
  HappyScribeUploadFile,
240
240
  )
241
+ from .higgsfield import (
242
+ HiggsfieldCancelRequest,
243
+ HiggsfieldCheckStatus,
244
+ HiggsfieldExpandImage,
245
+ HiggsfieldGetResult,
246
+ HiggsfieldImageToImage,
247
+ HiggsfieldImageToVideo,
248
+ HiggsfieldLipsync,
249
+ HiggsfieldRemoveBackground,
250
+ HiggsfieldSoulGenerate,
251
+ HiggsfieldSoulTrain,
252
+ HiggsfieldSubmit,
253
+ HiggsfieldTextToImage,
254
+ HiggsfieldTextToVideo,
255
+ HiggsfieldUploadFile,
256
+ )
241
257
  from .hubspot import (
242
258
  HubSpotCreateAssociation,
243
259
  HubSpotCreateCompany,
@@ -1969,6 +1985,20 @@ __all__ = [
1969
1985
  "HappyScribeListStyleGuides",
1970
1986
  "HappyScribeListTranscriptions",
1971
1987
  "HappyScribeUploadFile",
1988
+ "HiggsfieldCancelRequest",
1989
+ "HiggsfieldCheckStatus",
1990
+ "HiggsfieldExpandImage",
1991
+ "HiggsfieldGetResult",
1992
+ "HiggsfieldImageToImage",
1993
+ "HiggsfieldImageToVideo",
1994
+ "HiggsfieldLipsync",
1995
+ "HiggsfieldRemoveBackground",
1996
+ "HiggsfieldSoulGenerate",
1997
+ "HiggsfieldSoulTrain",
1998
+ "HiggsfieldSubmit",
1999
+ "HiggsfieldTextToImage",
2000
+ "HiggsfieldTextToVideo",
2001
+ "HiggsfieldUploadFile",
1972
2002
  "ElasticsearchIngestAttachment",
1973
2003
  "ElasticsearchBulkOperations",
1974
2004
  "ElasticsearchDeleteDocument",
@@ -3014,6 +3044,20 @@ _LAZY_IMPORTS = {
3014
3044
  "HappyScribeListStyleGuides": ".happy_scribe",
3015
3045
  "HappyScribeListTranscriptions": ".happy_scribe",
3016
3046
  "HappyScribeUploadFile": ".happy_scribe",
3047
+ "HiggsfieldCancelRequest": ".higgsfield",
3048
+ "HiggsfieldCheckStatus": ".higgsfield",
3049
+ "HiggsfieldExpandImage": ".higgsfield",
3050
+ "HiggsfieldGetResult": ".higgsfield",
3051
+ "HiggsfieldImageToImage": ".higgsfield",
3052
+ "HiggsfieldImageToVideo": ".higgsfield",
3053
+ "HiggsfieldLipsync": ".higgsfield",
3054
+ "HiggsfieldRemoveBackground": ".higgsfield",
3055
+ "HiggsfieldSoulGenerate": ".higgsfield",
3056
+ "HiggsfieldSoulTrain": ".higgsfield",
3057
+ "HiggsfieldSubmit": ".higgsfield",
3058
+ "HiggsfieldTextToImage": ".higgsfield",
3059
+ "HiggsfieldTextToVideo": ".higgsfield",
3060
+ "HiggsfieldUploadFile": ".higgsfield",
3017
3061
  "ElasticsearchIngestAttachment": ".elasticsearch",
3018
3062
  "ElasticsearchBulkOperations": ".elasticsearch",
3019
3063
  "ElasticsearchDeleteDocument": ".elasticsearch",
@@ -8,9 +8,15 @@ from ._creds import resolve_api_key
8
8
 
9
9
  _GEMINI_BASE = "https://generativelanguage.googleapis.com/v1beta/models"
10
10
 
11
- _DEFAULT_EDIT_MODEL = "gemini-3.1-flash-image-preview"
12
- _DEFAULT_GENERATE_MODEL = "gemini-3.1-flash-image-preview"
13
- _DEFAULT_ANALYZE_MODEL = "gemini-3.1-flash-image-preview"
11
+ # Image generation/editing: stable GA model (listed as "Nano Banana 2" in the Gemini API).
12
+ # Preview sibling gemini-3.1-flash-image-preview still works but is not the stable default.
13
+ _DEFAULT_IMAGE_MODEL = "gemini-3.1-flash-image"
14
+ # Vision analysis: general multimodal flash — no image output modality needed.
15
+ _DEFAULT_ANALYZE_MODEL = "gemini-3.5-flash"
16
+
17
+
18
+ def _gemini_headers(api_key: str) -> dict[str, str]:
19
+ return {"x-goog-api-key": api_key, "Content-Type": "application/json"}
14
20
 
15
21
 
16
22
  def _parse_gemini_response(data: dict[str, Any]) -> dict[str, Any]:
@@ -46,10 +52,17 @@ class GeminiImagesEditImage(Tool):
46
52
 
47
53
  def __init__(self, **kwargs: Any) -> None:
48
54
  async def _edit_image(
49
- prompt: str = Field(..., description="Instruction describing the desired edit, e.g. 'remove the background'."),
55
+ prompt: str = Field(
56
+ ..., description="Instruction describing the desired edit, e.g. 'remove the background'."
57
+ ),
50
58
  image_base64: str = Field(..., description="The source image encoded as a base64 string."),
51
- image_mime_type: str = Field("image/png", description="MIME type of the input image, e.g. 'image/png', 'image/jpeg'."),
52
- model: str = Field(_DEFAULT_EDIT_MODEL, description="Gemini model to use. Defaults to gemini-2.0-flash-exp-image-generation."),
59
+ image_mime_type: str = Field(
60
+ "image/png", description="MIME type of the input image, e.g. 'image/png', 'image/jpeg'."
61
+ ),
62
+ model: str = Field(
63
+ _DEFAULT_IMAGE_MODEL,
64
+ description=f"Gemini image model. Defaults to {_DEFAULT_IMAGE_MODEL}.",
65
+ ),
53
66
  ) -> Any:
54
67
  api_key = await resolve_api_key(tool=self, provider_name="Gemini", env_var="GEMINI_API_KEY")
55
68
  import httpx
@@ -74,7 +87,7 @@ class GeminiImagesEditImage(Tool):
74
87
  async with httpx.AsyncClient(timeout=120.0) as client:
75
88
  response = await client.post(
76
89
  f"{_GEMINI_BASE}/{model}:generateContent",
77
- headers={"Authorization": f"Bearer {api_key}"},
90
+ headers=_gemini_headers(api_key),
78
91
  json=payload,
79
92
  )
80
93
  response.raise_for_status()
@@ -86,8 +99,7 @@ class GeminiImagesEditImage(Tool):
86
99
  class GeminiImagesGenerateImage(Tool):
87
100
  name: str = "gemini_generate_image"
88
101
  description: str | None = (
89
- "Generate a new image from a text prompt using Gemini. "
90
- "Returns the generated image as a base64 string."
102
+ "Generate a new image from a text prompt using Gemini. Returns the generated image as a base64 string."
91
103
  )
92
104
  integration: Annotated[str, Integration("gemini")] | None = None
93
105
  api_key: SecretStr | None = None
@@ -101,8 +113,13 @@ class GeminiImagesGenerateImage(Tool):
101
113
  def __init__(self, **kwargs: Any) -> None:
102
114
  async def _generate_image(
103
115
  prompt: str = Field(..., description="Text description of the image to generate."),
104
- negative_prompt: str | None = Field(None, description="Optional description of what to avoid in the image."),
105
- model: str = Field(_DEFAULT_GENERATE_MODEL, description="Gemini model to use. Defaults to gemini-2.0-flash-exp-image-generation."),
116
+ negative_prompt: str | None = Field(
117
+ None, description="Optional description of what to avoid in the image."
118
+ ),
119
+ model: str = Field(
120
+ _DEFAULT_IMAGE_MODEL,
121
+ description=f"Gemini image model. Defaults to {_DEFAULT_IMAGE_MODEL}.",
122
+ ),
106
123
  ) -> Any:
107
124
  api_key = await resolve_api_key(tool=self, provider_name="Gemini", env_var="GEMINI_API_KEY")
108
125
  import httpx
@@ -112,18 +129,14 @@ class GeminiImagesGenerateImage(Tool):
112
129
  text = f"{prompt}\n\nAvoid: {negative_prompt}"
113
130
 
114
131
  payload = {
115
- "contents": [
116
- {
117
- "parts": [{"text": text}]
118
- }
119
- ],
132
+ "contents": [{"parts": [{"text": text}]}],
120
133
  "generationConfig": {"responseModalities": ["IMAGE", "TEXT"]},
121
134
  }
122
135
 
123
136
  async with httpx.AsyncClient(timeout=120.0) as client:
124
137
  response = await client.post(
125
138
  f"{_GEMINI_BASE}/{model}:generateContent",
126
- headers={"Authorization": f"Bearer {api_key}"},
139
+ headers=_gemini_headers(api_key),
127
140
  json=payload,
128
141
  )
129
142
  response.raise_for_status()
@@ -149,10 +162,18 @@ class GeminiImagesAnalyzeImage(Tool):
149
162
 
150
163
  def __init__(self, **kwargs: Any) -> None:
151
164
  async def _analyze_image(
152
- prompt: str = Field(..., description="Question or instruction about the image, e.g. 'Describe this image', 'What text is visible?', 'List all objects'."),
165
+ prompt: str = Field(
166
+ ...,
167
+ description="Question or instruction about the image, e.g. 'Describe this image', 'What text is visible?', 'List all objects'.",
168
+ ),
153
169
  image_base64: str = Field(..., description="The image encoded as a base64 string."),
154
- image_mime_type: str = Field("image/png", description="MIME type of the image, e.g. 'image/png', 'image/jpeg'."),
155
- model: str = Field(_DEFAULT_ANALYZE_MODEL, description="Gemini model to use. Defaults to gemini-2.0-flash."),
170
+ image_mime_type: str = Field(
171
+ "image/png", description="MIME type of the image, e.g. 'image/png', 'image/jpeg'."
172
+ ),
173
+ model: str = Field(
174
+ _DEFAULT_ANALYZE_MODEL,
175
+ description=f"Gemini vision model. Defaults to {_DEFAULT_ANALYZE_MODEL}.",
176
+ ),
156
177
  ) -> Any:
157
178
  api_key = await resolve_api_key(tool=self, provider_name="Gemini", env_var="GEMINI_API_KEY")
158
179
  import httpx
@@ -177,7 +198,7 @@ class GeminiImagesAnalyzeImage(Tool):
177
198
  async with httpx.AsyncClient(timeout=60.0) as client:
178
199
  response = await client.post(
179
200
  f"{_GEMINI_BASE}/{model}:generateContent",
180
- headers={"Authorization": f"Bearer {api_key}"},
201
+ headers=_gemini_headers(api_key),
181
202
  json=payload,
182
203
  )
183
204
  response.raise_for_status()
@@ -210,8 +231,13 @@ class GeminiImagesGenerateImageWithReference(Tool):
210
231
  async def _generate_image_with_reference(
211
232
  prompt: str = Field(..., description="Text instruction describing the desired output image."),
212
233
  reference_images_base64: list[str] = Field(..., description="List of reference images as base64 strings."),
213
- reference_mime_types: list[str] | None = Field(None, description="MIME type per reference image. Defaults to 'image/png' for all."),
214
- model: str = Field(_DEFAULT_GENERATE_MODEL, description="Gemini model to use. Defaults to gemini-2.0-flash-exp-image-generation."),
234
+ reference_mime_types: list[str] | None = Field(
235
+ None, description="MIME type per reference image. Defaults to 'image/png' for all."
236
+ ),
237
+ model: str = Field(
238
+ _DEFAULT_IMAGE_MODEL,
239
+ description=f"Gemini image model. Defaults to {_DEFAULT_IMAGE_MODEL}.",
240
+ ),
215
241
  ) -> Any:
216
242
  api_key = await resolve_api_key(tool=self, provider_name="Gemini", env_var="GEMINI_API_KEY")
217
243
  import httpx
@@ -230,7 +256,7 @@ class GeminiImagesGenerateImageWithReference(Tool):
230
256
  async with httpx.AsyncClient(timeout=120.0) as client:
231
257
  response = await client.post(
232
258
  f"{_GEMINI_BASE}/{model}:generateContent",
233
- headers={"Authorization": f"Bearer {api_key}"},
259
+ headers=_gemini_headers(api_key),
234
260
  json=payload,
235
261
  )
236
262
  response.raise_for_status()
@@ -253,6 +279,7 @@ class GeminiImagesImageToBase64(Tool):
253
279
  import base64
254
280
 
255
281
  import httpx
282
+
256
283
  async with httpx.AsyncClient(timeout=30.0) as client:
257
284
  response = await client.get(url)
258
285
  response.raise_for_status()