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.
- {timbal-2.2.0 → timbal-2.2.2}/PKG-INFO +1 -1
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/_version.py +2 -2
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/codegen/flow.py +14 -2
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/platform/types.py +1 -2
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/__init__.py +44 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/gemini_images.py +51 -24
- timbal-2.2.2/python/timbal/tools/higgsfield.py +696 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/krea.py +196 -160
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/types/file.py +2 -6
- {timbal-2.2.0 → timbal-2.2.2}/.gitignore +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/LICENSE +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/README.md +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/docs/api-reference/ace/chat-completions.mdx +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/docs/api-reference/ace/create-from-workforce.mdx +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/docs/api-reference/ace/jobs/cancel.mdx +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/docs/api-reference/ace/jobs/get.mdx +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/docs/api-reference/ace/jobs/list.mdx +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/docs/api-reference/ace/jobs/retry.mdx +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/docs/api-reference/ace/link.mdx +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/docs/api-reference/ace/list-context-vars.mdx +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/docs/api-reference/ace/list-policies.mdx +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/docs/api-reference/ace/messages.mdx +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/docs/api-reference/ace/responses.mdx +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/docs/api-reference/ace/unlink.mdx +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/pyproject.toml +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/pyrightconfig.json +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/__init__.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/codegen/__init__.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/codegen/__main__.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/codegen/cli_utils.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/codegen/cst_utils.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/codegen/format.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/codegen/model_discovery.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/codegen/test.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/codegen/tool_discovery.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/codegen/transformers/__init__.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/codegen/transformers/add_edge.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/codegen/transformers/add_step.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/codegen/transformers/add_tool.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/codegen/transformers/remove_edge.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/codegen/transformers/remove_step.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/codegen/transformers/remove_tool.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/codegen/transformers/set_config.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/codegen/transformers/set_param.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/codegen/transformers/set_position.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/collectors/__init__.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/collectors/base.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/collectors/impl/__init__.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/collectors/impl/anthropic.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/collectors/impl/default.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/collectors/impl/message.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/collectors/impl/openai.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/collectors/impl/string.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/collectors/impl/timbal.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/collectors/registry.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/core/__init__.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/core/agent.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/core/fallback_model.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/core/llm_router.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/core/mcp.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/core/memory_compaction.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/core/models.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/core/runnable.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/core/skill.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/core/test_model.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/core/tool.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/core/tool_set.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/core/workflow.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/errors.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/__init__.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/cli.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/display.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/fixtures/agent.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/fixtures/eval_examples.yaml +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/fixtures/eval_flow_validators.yaml +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/fixtures/eval_negations.yaml +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/fixtures/eval_parallel.yaml +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/fixtures/eval_subagent.yaml +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/fixtures/eval_transforms.yaml +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/fixtures/test_invalid_validator.yaml +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/models.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/runner.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/utils.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/__init__.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/base.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/comparison_base.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/contains.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/contains_all.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/contains_any.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/context.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/email.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/ends_with.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/eq.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/gt.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/gte.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/json.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/language.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/length.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/llm_base.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/lt.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/lte.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/max_length.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/min_length.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/not_null.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/parallel.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/pattern.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/prompt.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/semantic.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/seq.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/starts_with.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/evals/validators/type.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/logs.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/models.yaml +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/platform/__init__.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/platform/integrations.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/platform/knowledge_bases/__init__.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/platform/knowledge_bases/query.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/platform/tool_proxy.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/platform/utils.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/server/__init__.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/server/__main__.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/server/http.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/server/jobs.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/server/voice.html +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/server/voice.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/state/__init__.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/state/config.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/state/config_loader.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/state/context.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/state/dependency_analyzer.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/state/tracing/__init__.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/state/tracing/exporters/__init__.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/state/tracing/exporters/otel.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/state/tracing/providers/__init__.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/state/tracing/providers/base.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/state/tracing/providers/in_memory.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/state/tracing/providers/jsonl.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/state/tracing/providers/platform.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/state/tracing/providers/sqlite.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/state/tracing/span.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/state/tracing/trace.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/_creds.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/asana.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/bash.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/cala.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/cloudflare.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/dynamics_business_central.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/dynamics_sales.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/edit.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/elasticsearch.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/elevenlabs.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/excel.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/fal.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/fathom.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/firecrawl.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/gmail.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/google_analytics.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/google_business.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/google_calendar.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/google_docs.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/google_drive.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/google_maps.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/google_merchant_center.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/google_search_console.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/google_sheets.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/happy_scribe.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/hubspot.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/interaction.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/jira.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/klaviyo.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/knowledge_base.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/lancedb.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/linkedin.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/mongodb.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/netsuite.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/onedrive.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/outlook.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/pinecone.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/powerbi.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/quiver_ai.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/read.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/replicate.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/resend.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/salesforce.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/scraperapi.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/sharepoint.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/shopify.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/slack.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/stripe.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/tavily.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/web_search.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/write.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/xai.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/zendesk.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/tools/zoho_crm.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/types/__init__.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/types/approval.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/types/content/__init__.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/types/content/base.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/types/content/custom.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/types/content/file.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/types/content/text.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/types/content/thinking.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/types/content/tool_result.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/types/content/tool_use.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/types/events/__init__.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/types/events/approval.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/types/events/base.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/types/events/delta.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/types/events/interaction.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/types/events/output.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/types/events/start.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/types/message.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/types/run_status.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/utils/__init__.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/utils/import_spec.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/utils/model.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/utils/net.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/utils/schema.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/utils/serialization.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/voice/__init__.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/voice/elevenlabs.py +0 -0
- {timbal-2.2.0 → timbal-2.2.2}/python/timbal/voice/session.py +0 -0
|
@@ -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.
|
|
22
|
-
__version_tuple__ = version_tuple = (2, 2,
|
|
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
|
|
75
|
-
|
|
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
|
-
#
|
|
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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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(
|
|
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(
|
|
52
|
-
|
|
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=
|
|
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(
|
|
105
|
-
|
|
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=
|
|
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(
|
|
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(
|
|
155
|
-
|
|
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=
|
|
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(
|
|
214
|
-
|
|
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=
|
|
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()
|