timbal 2.2.4__tar.gz → 2.2.6__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.4 → timbal-2.2.6}/PKG-INFO +1 -1
  2. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/_version.py +2 -2
  3. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/__init__.py +7 -0
  4. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/elasticsearch.py +5 -2
  5. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/elevenlabs.py +3 -2
  6. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/fal.py +9 -6
  7. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/gemini_images.py +3 -2
  8. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/google_analytics.py +8 -2
  9. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/google_docs.py +1 -1
  10. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/google_drive.py +2 -2
  11. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/higgsfield.py +5 -1
  12. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/jira.py +4 -1
  13. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/netsuite.py +71 -22
  14. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/onedrive.py +2 -2
  15. timbal-2.2.6/python/timbal/tools/parallel.py +191 -0
  16. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/pinecone.py +4 -1
  17. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/quiver_ai.py +5 -3
  18. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/replicate.py +5 -3
  19. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/sharepoint.py +2 -2
  20. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/stripe.py +4 -1
  21. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/zendesk.py +8 -2
  22. {timbal-2.2.4 → timbal-2.2.6}/.gitignore +0 -0
  23. {timbal-2.2.4 → timbal-2.2.6}/LICENSE +0 -0
  24. {timbal-2.2.4 → timbal-2.2.6}/README.md +0 -0
  25. {timbal-2.2.4 → timbal-2.2.6}/docs/api-reference/ace/chat-completions.mdx +0 -0
  26. {timbal-2.2.4 → timbal-2.2.6}/docs/api-reference/ace/create-from-workforce.mdx +0 -0
  27. {timbal-2.2.4 → timbal-2.2.6}/docs/api-reference/ace/jobs/cancel.mdx +0 -0
  28. {timbal-2.2.4 → timbal-2.2.6}/docs/api-reference/ace/jobs/get.mdx +0 -0
  29. {timbal-2.2.4 → timbal-2.2.6}/docs/api-reference/ace/jobs/list.mdx +0 -0
  30. {timbal-2.2.4 → timbal-2.2.6}/docs/api-reference/ace/jobs/retry.mdx +0 -0
  31. {timbal-2.2.4 → timbal-2.2.6}/docs/api-reference/ace/link.mdx +0 -0
  32. {timbal-2.2.4 → timbal-2.2.6}/docs/api-reference/ace/list-context-vars.mdx +0 -0
  33. {timbal-2.2.4 → timbal-2.2.6}/docs/api-reference/ace/list-policies.mdx +0 -0
  34. {timbal-2.2.4 → timbal-2.2.6}/docs/api-reference/ace/messages.mdx +0 -0
  35. {timbal-2.2.4 → timbal-2.2.6}/docs/api-reference/ace/responses.mdx +0 -0
  36. {timbal-2.2.4 → timbal-2.2.6}/docs/api-reference/ace/unlink.mdx +0 -0
  37. {timbal-2.2.4 → timbal-2.2.6}/pyproject.toml +0 -0
  38. {timbal-2.2.4 → timbal-2.2.6}/pyrightconfig.json +0 -0
  39. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/__init__.py +0 -0
  40. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/codegen/__init__.py +0 -0
  41. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/codegen/__main__.py +0 -0
  42. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/codegen/cli_utils.py +0 -0
  43. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/codegen/cst_utils.py +0 -0
  44. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/codegen/flow.py +0 -0
  45. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/codegen/format.py +0 -0
  46. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/codegen/model_discovery.py +0 -0
  47. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/codegen/test.py +0 -0
  48. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/codegen/tool_discovery.py +0 -0
  49. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/codegen/transformers/__init__.py +0 -0
  50. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/codegen/transformers/add_edge.py +0 -0
  51. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/codegen/transformers/add_step.py +0 -0
  52. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/codegen/transformers/add_tool.py +0 -0
  53. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/codegen/transformers/remove_edge.py +0 -0
  54. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/codegen/transformers/remove_step.py +0 -0
  55. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/codegen/transformers/remove_tool.py +0 -0
  56. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/codegen/transformers/set_config.py +0 -0
  57. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/codegen/transformers/set_param.py +0 -0
  58. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/codegen/transformers/set_position.py +0 -0
  59. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/collectors/__init__.py +0 -0
  60. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/collectors/base.py +0 -0
  61. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/collectors/impl/__init__.py +0 -0
  62. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/collectors/impl/anthropic.py +0 -0
  63. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/collectors/impl/default.py +0 -0
  64. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/collectors/impl/message.py +0 -0
  65. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/collectors/impl/openai.py +0 -0
  66. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/collectors/impl/string.py +0 -0
  67. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/collectors/impl/timbal.py +0 -0
  68. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/collectors/registry.py +0 -0
  69. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/core/__init__.py +0 -0
  70. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/core/agent.py +0 -0
  71. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/core/fallback_model.py +0 -0
  72. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/core/llm_router.py +0 -0
  73. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/core/mcp.py +0 -0
  74. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/core/memory_compaction.py +0 -0
  75. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/core/models.py +0 -0
  76. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/core/runnable.py +0 -0
  77. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/core/skill.py +0 -0
  78. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/core/test_model.py +0 -0
  79. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/core/tool.py +0 -0
  80. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/core/tool_set.py +0 -0
  81. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/core/workflow.py +0 -0
  82. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/errors.py +0 -0
  83. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/evals/__init__.py +0 -0
  84. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/evals/cli.py +0 -0
  85. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/evals/display.py +0 -0
  86. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/evals/fixtures/agent.py +0 -0
  87. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/evals/fixtures/eval_examples.yaml +0 -0
  88. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/evals/fixtures/eval_flow_validators.yaml +0 -0
  89. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/evals/fixtures/eval_negations.yaml +0 -0
  90. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/evals/fixtures/eval_parallel.yaml +0 -0
  91. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/evals/fixtures/eval_subagent.yaml +0 -0
  92. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/evals/fixtures/eval_transforms.yaml +0 -0
  93. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/evals/fixtures/test_invalid_validator.yaml +0 -0
  94. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/evals/models.py +0 -0
  95. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/evals/runner.py +0 -0
  96. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/evals/utils.py +0 -0
  97. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/evals/validators/__init__.py +0 -0
  98. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/evals/validators/base.py +0 -0
  99. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/evals/validators/comparison_base.py +0 -0
  100. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/evals/validators/contains.py +0 -0
  101. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/evals/validators/contains_all.py +0 -0
  102. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/evals/validators/contains_any.py +0 -0
  103. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/evals/validators/context.py +0 -0
  104. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/evals/validators/email.py +0 -0
  105. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/evals/validators/ends_with.py +0 -0
  106. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/evals/validators/eq.py +0 -0
  107. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/evals/validators/gt.py +0 -0
  108. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/evals/validators/gte.py +0 -0
  109. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/evals/validators/json.py +0 -0
  110. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/evals/validators/language.py +0 -0
  111. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/evals/validators/length.py +0 -0
  112. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/evals/validators/llm_base.py +0 -0
  113. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/evals/validators/lt.py +0 -0
  114. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/evals/validators/lte.py +0 -0
  115. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/evals/validators/max_length.py +0 -0
  116. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/evals/validators/min_length.py +0 -0
  117. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/evals/validators/not_null.py +0 -0
  118. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/evals/validators/parallel.py +0 -0
  119. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/evals/validators/pattern.py +0 -0
  120. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/evals/validators/prompt.py +0 -0
  121. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/evals/validators/semantic.py +0 -0
  122. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/evals/validators/seq.py +0 -0
  123. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/evals/validators/starts_with.py +0 -0
  124. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/evals/validators/type.py +0 -0
  125. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/logs.py +0 -0
  126. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/models.yaml +0 -0
  127. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/platform/__init__.py +0 -0
  128. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/platform/integrations.py +0 -0
  129. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/platform/knowledge_bases/__init__.py +0 -0
  130. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/platform/knowledge_bases/query.py +0 -0
  131. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/platform/tool_proxy.py +0 -0
  132. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/platform/types.py +0 -0
  133. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/platform/utils.py +0 -0
  134. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/server/__init__.py +0 -0
  135. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/server/__main__.py +0 -0
  136. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/server/http.py +0 -0
  137. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/server/jobs.py +0 -0
  138. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/server/voice.html +0 -0
  139. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/server/voice.py +0 -0
  140. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/state/__init__.py +0 -0
  141. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/state/config.py +0 -0
  142. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/state/config_loader.py +0 -0
  143. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/state/context.py +0 -0
  144. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/state/dependency_analyzer.py +0 -0
  145. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/state/tracing/__init__.py +0 -0
  146. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/state/tracing/exporters/__init__.py +0 -0
  147. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/state/tracing/exporters/otel.py +0 -0
  148. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/state/tracing/providers/__init__.py +0 -0
  149. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/state/tracing/providers/base.py +0 -0
  150. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/state/tracing/providers/in_memory.py +0 -0
  151. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/state/tracing/providers/jsonl.py +0 -0
  152. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/state/tracing/providers/platform.py +0 -0
  153. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/state/tracing/providers/sqlite.py +0 -0
  154. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/state/tracing/span.py +0 -0
  155. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/state/tracing/trace.py +0 -0
  156. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/_creds.py +0 -0
  157. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/asana.py +0 -0
  158. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/bash.py +0 -0
  159. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/cala.py +0 -0
  160. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/cloudflare.py +0 -0
  161. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/dynamics_business_central.py +0 -0
  162. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/dynamics_sales.py +0 -0
  163. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/edit.py +0 -0
  164. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/excel.py +0 -0
  165. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/fathom.py +0 -0
  166. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/firecrawl.py +0 -0
  167. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/gmail.py +0 -0
  168. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/google_business.py +0 -0
  169. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/google_calendar.py +0 -0
  170. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/google_maps.py +0 -0
  171. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/google_merchant_center.py +0 -0
  172. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/google_search_console.py +0 -0
  173. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/google_sheets.py +0 -0
  174. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/happy_scribe.py +0 -0
  175. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/hubspot.py +0 -0
  176. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/interaction.py +0 -0
  177. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/klaviyo.py +0 -0
  178. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/knowledge_base.py +0 -0
  179. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/krea.py +0 -0
  180. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/lancedb.py +0 -0
  181. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/linkedin.py +0 -0
  182. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/mongodb.py +0 -0
  183. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/outlook.py +0 -0
  184. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/powerbi.py +0 -0
  185. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/read.py +0 -0
  186. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/resend.py +0 -0
  187. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/salesforce.py +0 -0
  188. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/scraperapi.py +0 -0
  189. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/shopify.py +0 -0
  190. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/slack.py +0 -0
  191. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/tavily.py +0 -0
  192. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/web_search.py +0 -0
  193. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/write.py +0 -0
  194. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/xai.py +0 -0
  195. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/tools/zoho_crm.py +0 -0
  196. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/types/__init__.py +0 -0
  197. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/types/approval.py +0 -0
  198. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/types/content/__init__.py +0 -0
  199. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/types/content/base.py +0 -0
  200. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/types/content/custom.py +0 -0
  201. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/types/content/file.py +0 -0
  202. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/types/content/text.py +0 -0
  203. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/types/content/thinking.py +0 -0
  204. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/types/content/tool_result.py +0 -0
  205. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/types/content/tool_use.py +0 -0
  206. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/types/events/__init__.py +0 -0
  207. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/types/events/approval.py +0 -0
  208. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/types/events/base.py +0 -0
  209. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/types/events/delta.py +0 -0
  210. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/types/events/interaction.py +0 -0
  211. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/types/events/output.py +0 -0
  212. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/types/events/start.py +0 -0
  213. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/types/file.py +0 -0
  214. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/types/message.py +0 -0
  215. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/types/run_status.py +0 -0
  216. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/utils/__init__.py +0 -0
  217. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/utils/import_spec.py +0 -0
  218. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/utils/model.py +0 -0
  219. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/utils/net.py +0 -0
  220. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/utils/schema.py +0 -0
  221. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/utils/serialization.py +0 -0
  222. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/voice/__init__.py +0 -0
  223. {timbal-2.2.4 → timbal-2.2.6}/python/timbal/voice/elevenlabs.py +0 -0
  224. {timbal-2.2.4 → timbal-2.2.6}/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.4
3
+ Version: 2.2.6
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.4'
22
- __version_tuple__ = version_tuple = (2, 2, 4)
21
+ __version__ = version = '2.2.6'
22
+ __version_tuple__ = version_tuple = (2, 2, 6)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -493,6 +493,7 @@ if TYPE_CHECKING:
493
493
  OutlookTrash,
494
494
  OutlookUpdateEmail,
495
495
  )
496
+ from .parallel import ParallelExtract, ParallelSearch, ParallelTaskRun
496
497
  from .pinecone import (
497
498
  PineconeCreateIndex,
498
499
  PineconeDeleteVectors,
@@ -1330,6 +1331,9 @@ __all__ = [
1330
1331
  "TavilyExtract",
1331
1332
  "TavilyMap",
1332
1333
  "TavilySearch",
1334
+ "ParallelSearch",
1335
+ "ParallelExtract",
1336
+ "ParallelTaskRun",
1333
1337
  "WebSearch",
1334
1338
  "Write",
1335
1339
  "XSearch",
@@ -2400,6 +2404,9 @@ _LAZY_IMPORTS = {
2400
2404
  "TavilyExtract": ".tavily",
2401
2405
  "TavilyMap": ".tavily",
2402
2406
  "TavilySearch": ".tavily",
2407
+ "ParallelSearch": ".parallel",
2408
+ "ParallelExtract": ".parallel",
2409
+ "ParallelTaskRun": ".parallel",
2403
2410
  "WebSearch": ".web_search",
2404
2411
  "Write": ".write",
2405
2412
  "XSearch": ".xai",
@@ -33,8 +33,11 @@ async def _resolve_credentials(tool: Any) -> tuple[str, str | None]:
33
33
  class ElasticsearchIngestAttachment(Tool):
34
34
  name: str = "elasticsearch_ingest_attachment"
35
35
  description: str | None = (
36
- "Ingest a base64-encoded file attachment into an Elasticsearch index "
37
- "using the ingest-attachment pipeline to extract text content."
36
+ "Ingest and parse a file attachment PDF, Word DOCX, PowerPoint PPTX, "
37
+ "Excel, HTML, RTF, or plain text document — into searchable full text in "
38
+ "an Elasticsearch index using the ingest-attachment (Apache Tika) pipeline. "
39
+ "Extract text and metadata from a base64-encoded document or file for "
40
+ "full-text search."
38
41
  )
39
42
  integration: Annotated[str, Integration("elasticsearch")] | None = None
40
43
  api_key: SecretStr | None = None
@@ -13,8 +13,9 @@ _ELEVENLABS_BASE = "https://api.elevenlabs.io/v1"
13
13
  class ElevenLabsTextToSpeech(Tool):
14
14
  name: str = "elevenlabs_text_to_speech"
15
15
  description: str | None = (
16
- "Convert text to speech using a specified ElevenLabs voice. "
17
- "Returns the audio encoded as a base64 string."
16
+ "Generate a voiceover or narration from text: text-to-speech (TTS) that "
17
+ "produces natural spoken audio in a chosen ElevenLabs voice. Returns the "
18
+ "audio as a base64 string."
18
19
  )
19
20
  integration: Annotated[str, Integration("elevenlabs")] | None = None
20
21
  api_key: SecretStr | None = None
@@ -37,12 +37,15 @@ def _queue_model_path_from_submit_response(data: dict[str, Any]) -> str | None:
37
37
  class FalQueueSubmit(Tool):
38
38
  name: str = "fal_queue_submit"
39
39
  description: str | None = (
40
- "Submit an async inference job to fal's queue for a model (e.g. fal-ai/flux/schnell). "
41
- "Returns request_id, status_url, response_url, cancel_url, and queue_model_path (canonical path for "
42
- "follow-up calls). Important: fal may rewrite the route—e.g. you submit fal-ai/flux/schnell but URLs use "
43
- "fal-ai/flux. For fal_queue_status, fal_queue_result, and fal_queue_cancel always pass model_id="
44
- "queue_model_path from this response (or the path segment from status_url before /requests/), not the "
45
- "original submit string, or status polling can return HTTP 405."
40
+ "Run an AI model on fal (e.g. FLUX) to generate images, video, or audio — "
41
+ "submits an async inference/generation job to fal's queue. General-purpose "
42
+ "model runner. Returns request_id, status_url, response_url, cancel_url, and "
43
+ "queue_model_path (canonical path for follow-up calls). Important: fal may "
44
+ "rewrite the route—e.g. you submit fal-ai/flux/schnell but URLs use fal-ai/flux. "
45
+ "For fal_queue_status, fal_queue_result, and fal_queue_cancel always pass "
46
+ "model_id=queue_model_path from this response (or the path segment from "
47
+ "status_url before /requests/), not the original submit string, or status "
48
+ "polling can return HTTP 405."
46
49
  )
47
50
  integration: Annotated[str, Integration("fal")] | None = None
48
51
  api_key: SecretStr | None = None
@@ -148,8 +148,9 @@ class GeminiImagesGenerateImage(Tool):
148
148
  class GeminiImagesAnalyzeImage(Tool):
149
149
  name: str = "gemini_analyze_image"
150
150
  description: str | None = (
151
- "Analyze, describe, or extract information from an image using Gemini vision. "
152
- "Returns a text response based on your question or instruction."
151
+ "Analyze an image with the Gemini vision model: describe a picture, photo, "
152
+ "or screenshot, answer questions about its contents, and OCR — read, "
153
+ "extract, and transcribe text from an image."
153
154
  )
154
155
  integration: Annotated[str, Integration("gemini")] | None = None
155
156
  api_key: SecretStr | None = None
@@ -74,7 +74,10 @@ class GoogleAnalyticsListAccountSummaries(Tool):
74
74
 
75
75
  class GoogleAnalyticsRunReport(Tool):
76
76
  name: str = "google_analytics_run_report"
77
- description: str | None = "Run a standard GA4 report with dimensions, metrics, and date ranges."
77
+ description: str | None = (
78
+ "Run a standard GA4 analytics report — website traffic, visitors, sessions, "
79
+ "pageviews, and conversions — with dimensions, metrics, and date ranges."
80
+ )
78
81
  integration: Annotated[str, Integration("google_analytics")] | None = None
79
82
  token: SecretStr | None = None
80
83
  default_property_id: str | None = None
@@ -131,7 +134,10 @@ class GoogleAnalyticsRunReport(Tool):
131
134
 
132
135
  class GoogleAnalyticsRunRealtimeReport(Tool):
133
136
  name: str = "google_analytics_run_realtime_report"
134
- description: str | None = "Run a GA4 realtime report for active users and events."
137
+ description: str | None = (
138
+ "Run a GA4 realtime report: active users and visitors on your site right "
139
+ "now — live website traffic and events."
140
+ )
135
141
  integration: Annotated[str, Integration("google_analytics")] | None = None
136
142
  token: SecretStr | None = None
137
143
  default_property_id: str | None = None
@@ -505,7 +505,7 @@ class GoogleDocsGetTabContent(Tool):
505
505
  class GoogleDocsGetDocument(Tool):
506
506
  name: str = "google_docs_get_document"
507
507
  description: str | None = (
508
- "Get the contents of the latest version of a Google Doc. "
508
+ "Read and return the text contents of a Google Docs document. "
509
509
  "Set include_tabs_content=true for multi-tab documents."
510
510
  )
511
511
  integration: Annotated[str, Integration("google_docs")] | None = None
@@ -143,7 +143,7 @@ class GoogleDriveGetDownloadLink(Tool):
143
143
 
144
144
  class GoogleDriveGetFile(Tool):
145
145
  name: str = "google_drive_get_file"
146
- description: str | None = "Download and return content of a Google Drive file."
146
+ description: str | None = "Download and return the content of a Google Drive file or document (PDF, Word, etc.) by id."
147
147
  integration: Annotated[str, Integration("google_drive")] | None = None
148
148
  token: SecretStr | None = None
149
149
 
@@ -308,7 +308,7 @@ class GoogleDriveSearchFolders(Tool):
308
308
 
309
309
  class GoogleDriveSearchFiles(Tool):
310
310
  name: str = "google_drive_search_files"
311
- description: str | None = "Search for files in Google Drive with optional query. Supports pagination, filtering by folder, name, and trashed status."
311
+ description: str | None = "Search Google Drive to find a file, document, or folder by name or query. Locate documents in Drive. Supports pagination, filtering by folder, name, and trashed status."
312
312
  integration: Annotated[str, Integration("google_drive")] | None = None
313
313
  token: SecretStr | None = None
314
314
 
@@ -653,7 +653,11 @@ class HiggsfieldSoulTrain(_HiggsfieldTool):
653
653
 
654
654
  class HiggsfieldSoulGenerate(_HiggsfieldTool):
655
655
  name: str = "higgsfield_soul_generate"
656
- description: str | None = "Generate image or video using a trained Soul character."
656
+ description: str | None = (
657
+ "Generate photorealistic images of a person or character with Higgsfield "
658
+ "Soul — UGC-style content, avatars, and character image generation from a "
659
+ "prompt, using a trained Soul character."
660
+ )
657
661
 
658
662
  def __init__(self, **kwargs: Any) -> None:
659
663
  async def _soul_generate(
@@ -495,7 +495,10 @@ class JiraGetIssueTypesForProject(Tool):
495
495
 
496
496
  class JiraCreateIssue(Tool):
497
497
  name: str = "jira_create_issue"
498
- description: str | None = "Create an issue with a Jira fields payload (project, issuetype, summary, etc.)."
498
+ description: str | None = (
499
+ "Create a Jira issue — a bug, task, story, or ticket — from a fields "
500
+ "payload (project, issuetype, summary, etc.)."
501
+ )
499
502
  integration: Annotated[str, Integration("jira")] | None = None
500
503
  token: SecretStr | None = None
501
504
 
@@ -29,6 +29,8 @@ def _netsuite_auth_header(
29
29
  consumer_secret: str,
30
30
  token_id: str,
31
31
  token_secret: str,
32
+ query_params: dict[str, Any] | None = None,
33
+ body: str | None = None,
32
34
  ) -> str:
33
35
  """Generate OAuth 1.0a Token-Based Authentication (TBA) header for NetSuite."""
34
36
  import base64
@@ -41,7 +43,7 @@ def _netsuite_auth_header(
41
43
  nonce = uuid.uuid4().hex
42
44
  timestamp = str(int(time.time()))
43
45
 
44
- params: dict[str, str] = {
46
+ oauth_params: dict[str, str] = {
45
47
  "oauth_consumer_key": consumer_key,
46
48
  "oauth_nonce": nonce,
47
49
  "oauth_signature_method": "HMAC-SHA256",
@@ -49,10 +51,21 @@ def _netsuite_auth_header(
49
51
  "oauth_token": token_id,
50
52
  "oauth_version": "1.0",
51
53
  }
54
+ if body is not None:
55
+ # NetSuite requires oauth_body_hash for non-form POST/PATCH/PUT bodies.
56
+ oauth_params["oauth_body_hash"] = base64.b64encode(
57
+ hashlib.sha1(body.encode(), usedforsecurity=False).digest()
58
+ ).decode()
59
+
60
+ signature_params = dict(oauth_params)
61
+ if query_params:
62
+ for key, value in query_params.items():
63
+ if value is not None:
64
+ signature_params[str(key)] = str(value)
52
65
 
53
66
  sorted_params = "&".join(
54
67
  f"{urllib.parse.quote(k, safe='')}={urllib.parse.quote(v, safe='')}"
55
- for k, v in sorted(params.items())
68
+ for k, v in sorted(signature_params.items())
56
69
  )
57
70
  base_string = (
58
71
  f"{method.upper()}&"
@@ -64,11 +77,11 @@ def _netsuite_auth_header(
64
77
  hmac.new(signing_key.encode(), base_string.encode(), hashlib.sha256).digest()
65
78
  ).decode()
66
79
 
67
- params["oauth_signature"] = signature
80
+ oauth_params["oauth_signature"] = signature
68
81
  realm = account_id.strip().upper()
69
82
 
70
83
  header_parts = [f'realm="{urllib.parse.quote(realm, safe="")}"'] + [
71
- f'{k}="{urllib.parse.quote(v, safe="")}"' for k, v in sorted(params.items())
84
+ f'{k}="{urllib.parse.quote(v, safe="")}"' for k, v in sorted(oauth_params.items())
72
85
  ]
73
86
  return "OAuth " + ", ".join(header_parts)
74
87
 
@@ -273,7 +286,9 @@ class NetSuiteGetAccount(Tool):
273
286
  if fields:
274
287
  params["fields"] = fields
275
288
 
276
- auth = _netsuite_auth_header("GET", url, account_id, consumer_key, consumer_secret, token_id, token_secret)
289
+ auth = _netsuite_auth_header(
290
+ "GET", url, account_id, consumer_key, consumer_secret, token_id, token_secret, query_params=params
291
+ )
277
292
  async with httpx.AsyncClient(timeout=httpx.Timeout(30.0, connect=10.0)) as client:
278
293
  response = await client.get(
279
294
  url,
@@ -328,7 +343,9 @@ class NetSuiteListAccounts(Tool):
328
343
  if query:
329
344
  params["q"] = query
330
345
 
331
- auth = _netsuite_auth_header("GET", url, account_id, consumer_key, consumer_secret, token_id, token_secret)
346
+ auth = _netsuite_auth_header(
347
+ "GET", url, account_id, consumer_key, consumer_secret, token_id, token_secret, query_params=params
348
+ )
332
349
  async with httpx.AsyncClient(timeout=httpx.Timeout(30.0, connect=10.0)) as client:
333
350
  response = await client.get(url, headers={"Authorization": auth, "Content-Type": "application/json"}, params=params)
334
351
  response.raise_for_status()
@@ -492,7 +509,9 @@ class NetSuiteGetAssemblyBuild(Tool):
492
509
  if fields:
493
510
  params["fields"] = fields
494
511
 
495
- auth = _netsuite_auth_header("GET", url, account_id, consumer_key, consumer_secret, token_id, token_secret)
512
+ auth = _netsuite_auth_header(
513
+ "GET", url, account_id, consumer_key, consumer_secret, token_id, token_secret, query_params=params
514
+ )
496
515
  async with httpx.AsyncClient(timeout=httpx.Timeout(30.0, connect=10.0)) as client:
497
516
  response = await client.get(
498
517
  url,
@@ -547,7 +566,9 @@ class NetSuiteListAssemblyBuilds(Tool):
547
566
  if query:
548
567
  params["q"] = query
549
568
 
550
- auth = _netsuite_auth_header("GET", url, account_id, consumer_key, consumer_secret, token_id, token_secret)
569
+ auth = _netsuite_auth_header(
570
+ "GET", url, account_id, consumer_key, consumer_secret, token_id, token_secret, query_params=params
571
+ )
551
572
  async with httpx.AsyncClient(timeout=httpx.Timeout(30.0, connect=10.0)) as client:
552
573
  response = await client.get(url, headers={"Authorization": auth, "Content-Type": "application/json"}, params=params)
553
574
  response.raise_for_status()
@@ -952,7 +973,9 @@ class NetSuiteGetAssemblyItem(Tool):
952
973
  if fields:
953
974
  params["fields"] = fields
954
975
 
955
- auth = _netsuite_auth_header("GET", url, account_id, consumer_key, consumer_secret, token_id, token_secret)
976
+ auth = _netsuite_auth_header(
977
+ "GET", url, account_id, consumer_key, consumer_secret, token_id, token_secret, query_params=params
978
+ )
956
979
  async with httpx.AsyncClient(timeout=httpx.Timeout(30.0, connect=10.0)) as client:
957
980
  response = await client.get(
958
981
  url,
@@ -1007,7 +1030,9 @@ class NetSuiteListAssemblyItems(Tool):
1007
1030
  if query:
1008
1031
  params["q"] = query
1009
1032
 
1010
- auth = _netsuite_auth_header("GET", url, account_id, consumer_key, consumer_secret, token_id, token_secret)
1033
+ auth = _netsuite_auth_header(
1034
+ "GET", url, account_id, consumer_key, consumer_secret, token_id, token_secret, query_params=params
1035
+ )
1011
1036
  async with httpx.AsyncClient(timeout=httpx.Timeout(30.0, connect=10.0)) as client:
1012
1037
  response = await client.get(url, headers={"Authorization": auth, "Content-Type": "application/json"}, params=params)
1013
1038
  response.raise_for_status()
@@ -1108,7 +1133,9 @@ class NetSuiteSuiteQL(Tool):
1108
1133
 
1109
1134
  payload = {"q": query}
1110
1135
  params = {"limit": min(limit, 1000), "offset": offset}
1111
- auth = _netsuite_auth_header("POST", url, account_id, consumer_key, consumer_secret, token_id, token_secret)
1136
+ auth = _netsuite_auth_header(
1137
+ "POST", url, account_id, consumer_key, consumer_secret, token_id, token_secret, query_params=params
1138
+ )
1112
1139
 
1113
1140
  async with httpx.AsyncClient(timeout=httpx.Timeout(30.0, connect=10.0)) as client:
1114
1141
  response = await client.post(
@@ -1284,7 +1311,9 @@ class NetSuiteGetBillingAccount(Tool):
1284
1311
  if fields:
1285
1312
  params["fields"] = fields
1286
1313
 
1287
- auth = _netsuite_auth_header("GET", url, account_id, consumer_key, consumer_secret, token_id, token_secret)
1314
+ auth = _netsuite_auth_header(
1315
+ "GET", url, account_id, consumer_key, consumer_secret, token_id, token_secret, query_params=params
1316
+ )
1288
1317
  async with httpx.AsyncClient(timeout=httpx.Timeout(30.0, connect=10.0)) as client:
1289
1318
  response = await client.get(
1290
1319
  url,
@@ -1339,7 +1368,9 @@ class NetSuiteListBillingAccounts(Tool):
1339
1368
  if query:
1340
1369
  params["q"] = query
1341
1370
 
1342
- auth = _netsuite_auth_header("GET", url, account_id, consumer_key, consumer_secret, token_id, token_secret)
1371
+ auth = _netsuite_auth_header(
1372
+ "GET", url, account_id, consumer_key, consumer_secret, token_id, token_secret, query_params=params
1373
+ )
1343
1374
  async with httpx.AsyncClient(timeout=httpx.Timeout(30.0, connect=10.0)) as client:
1344
1375
  response = await client.get(url, headers={"Authorization": auth, "Content-Type": "application/json"}, params=params)
1345
1376
  response.raise_for_status()
@@ -1552,7 +1583,9 @@ class NetSuiteGetBillingSchedule(Tool):
1552
1583
  if fields:
1553
1584
  params["fields"] = fields
1554
1585
 
1555
- auth = _netsuite_auth_header("GET", url, account_id, consumer_key, consumer_secret, token_id, token_secret)
1586
+ auth = _netsuite_auth_header(
1587
+ "GET", url, account_id, consumer_key, consumer_secret, token_id, token_secret, query_params=params
1588
+ )
1556
1589
  async with httpx.AsyncClient(timeout=httpx.Timeout(30.0, connect=10.0)) as client:
1557
1590
  response = await client.get(
1558
1591
  url,
@@ -1607,7 +1640,9 @@ class NetSuiteListBillingSchedules(Tool):
1607
1640
  if query:
1608
1641
  params["q"] = query
1609
1642
 
1610
- auth = _netsuite_auth_header("GET", url, account_id, consumer_key, consumer_secret, token_id, token_secret)
1643
+ auth = _netsuite_auth_header(
1644
+ "GET", url, account_id, consumer_key, consumer_secret, token_id, token_secret, query_params=params
1645
+ )
1611
1646
  async with httpx.AsyncClient(timeout=httpx.Timeout(30.0, connect=10.0)) as client:
1612
1647
  response = await client.get(url, headers={"Authorization": auth, "Content-Type": "application/json"}, params=params)
1613
1648
  response.raise_for_status()
@@ -1916,7 +1951,9 @@ class NetSuiteGetCalendarEvent(Tool):
1916
1951
  if fields:
1917
1952
  params["fields"] = fields
1918
1953
 
1919
- auth = _netsuite_auth_header("GET", url, account_id, consumer_key, consumer_secret, token_id, token_secret)
1954
+ auth = _netsuite_auth_header(
1955
+ "GET", url, account_id, consumer_key, consumer_secret, token_id, token_secret, query_params=params
1956
+ )
1920
1957
  async with httpx.AsyncClient(timeout=httpx.Timeout(30.0, connect=10.0)) as client:
1921
1958
  response = await client.get(
1922
1959
  url,
@@ -1971,7 +2008,9 @@ class NetSuiteListCalendarEvents(Tool):
1971
2008
  if query:
1972
2009
  params["q"] = query
1973
2010
 
1974
- auth = _netsuite_auth_header("GET", url, account_id, consumer_key, consumer_secret, token_id, token_secret)
2011
+ auth = _netsuite_auth_header(
2012
+ "GET", url, account_id, consumer_key, consumer_secret, token_id, token_secret, query_params=params
2013
+ )
1975
2014
  async with httpx.AsyncClient(timeout=httpx.Timeout(30.0, connect=10.0)) as client:
1976
2015
  response = await client.get(url, headers={"Authorization": auth, "Content-Type": "application/json"}, params=params)
1977
2016
  response.raise_for_status()
@@ -2118,7 +2157,9 @@ class NetSuiteCustomSuiteQL(Tool):
2118
2157
 
2119
2158
  payload = {"q": query}
2120
2159
  params = {"limit": min(limit, 1000), "offset": offset}
2121
- auth = _netsuite_auth_header("POST", url, account_id, consumer_key, consumer_secret, token_id, token_secret)
2160
+ auth = _netsuite_auth_header(
2161
+ "POST", url, account_id, consumer_key, consumer_secret, token_id, token_secret, query_params=params
2162
+ )
2122
2163
 
2123
2164
  async with httpx.AsyncClient(timeout=httpx.Timeout(30.0, connect=10.0)) as client:
2124
2165
  response = await client.post(
@@ -2287,7 +2328,9 @@ class NetSuiteGetIntercompanyJournalEntry(Tool):
2287
2328
  if fields:
2288
2329
  params["fields"] = fields
2289
2330
 
2290
- auth = _netsuite_auth_header("GET", url, account_id, consumer_key, consumer_secret, token_id, token_secret)
2331
+ auth = _netsuite_auth_header(
2332
+ "GET", url, account_id, consumer_key, consumer_secret, token_id, token_secret, query_params=params
2333
+ )
2291
2334
  async with httpx.AsyncClient(timeout=httpx.Timeout(30.0, connect=10.0)) as client:
2292
2335
  response = await client.get(
2293
2336
  url,
@@ -2342,7 +2385,9 @@ class NetSuiteListIntercompanyJournalEntries(Tool):
2342
2385
  if query:
2343
2386
  params["q"] = query
2344
2387
 
2345
- auth = _netsuite_auth_header("GET", url, account_id, consumer_key, consumer_secret, token_id, token_secret)
2388
+ auth = _netsuite_auth_header(
2389
+ "GET", url, account_id, consumer_key, consumer_secret, token_id, token_secret, query_params=params
2390
+ )
2346
2391
  async with httpx.AsyncClient(timeout=httpx.Timeout(30.0, connect=10.0)) as client:
2347
2392
  response = await client.get(url, headers={"Authorization": auth, "Content-Type": "application/json"}, params=params)
2348
2393
  response.raise_for_status()
@@ -2557,7 +2602,9 @@ class NetSuiteGetBinTransfer(Tool):
2557
2602
  if fields:
2558
2603
  params["fields"] = fields
2559
2604
 
2560
- auth = _netsuite_auth_header("GET", url, account_id, consumer_key, consumer_secret, token_id, token_secret)
2605
+ auth = _netsuite_auth_header(
2606
+ "GET", url, account_id, consumer_key, consumer_secret, token_id, token_secret, query_params=params
2607
+ )
2561
2608
  async with httpx.AsyncClient(timeout=httpx.Timeout(30.0, connect=10.0)) as client:
2562
2609
  response = await client.get(
2563
2610
  url,
@@ -2612,7 +2659,9 @@ class NetSuiteListBinTransfers(Tool):
2612
2659
  if query:
2613
2660
  params["q"] = query
2614
2661
 
2615
- auth = _netsuite_auth_header("GET", url, account_id, consumer_key, consumer_secret, token_id, token_secret)
2662
+ auth = _netsuite_auth_header(
2663
+ "GET", url, account_id, consumer_key, consumer_secret, token_id, token_secret, query_params=params
2664
+ )
2616
2665
  async with httpx.AsyncClient(timeout=httpx.Timeout(30.0, connect=10.0)) as client:
2617
2666
  response = await client.get(url, headers={"Authorization": auth, "Content-Type": "application/json"}, params=params)
2618
2667
  response.raise_for_status()
@@ -127,7 +127,7 @@ class OneDriveListFiles(Tool):
127
127
 
128
128
  class OneDriveGetFile(Tool):
129
129
  name: str = "onedrive_get_file"
130
- description: str | None = "Get file metadata and content by file ID from OneDrive."
130
+ description: str | None = "Get the content and metadata of a OneDrive file or document by id."
131
131
  integration: Annotated[str, Integration("onedrive")] | None = None
132
132
 
133
133
  def get_config(self) -> dict[str, Any]:
@@ -210,7 +210,7 @@ class OneDriveFindFile(Tool):
210
210
 
211
211
  class OneDriveDownloadFile(Tool):
212
212
  name: str = "onedrive_download_file"
213
- description: str | None = "Download a file from OneDrive by file ID."
213
+ description: str | None = "Download a OneDrive file or document (Word, Excel, PDF, etc.) by id."
214
214
  integration: Annotated[str, Integration("onedrive")] | None = None
215
215
 
216
216
  def get_config(self) -> dict[str, Any]: