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