autoair 0.1.0__py3-none-any.whl
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.
- autoair/__init__.py +3 -0
- autoair/_compat.py +96 -0
- autoair/_fs.py +46 -0
- autoair/_subprocess.py +50 -0
- autoair/admin.py +238 -0
- autoair/ai/__init__.py +99 -0
- autoair/ai/access.py +261 -0
- autoair/ai/agent.py +451 -0
- autoair/ai/assist.py +599 -0
- autoair/ai/assistants/__init__.py +11 -0
- autoair/ai/assistants/admin_tools.py +582 -0
- autoair/ai/assistants/airflow_actions.py +584 -0
- autoair/ai/assistants/chat.py +372 -0
- autoair/ai/assistants/compaction.py +203 -0
- autoair/ai/assistants/deploy_message.py +157 -0
- autoair/ai/assistants/dev_tools.py +280 -0
- autoair/ai/assistants/fs_sandbox.py +242 -0
- autoair/ai/assistants/mcp_client.py +455 -0
- autoair/ai/assistants/project_rules.py +154 -0
- autoair/ai/assistants/sources.py +147 -0
- autoair/ai/assistants/threads.py +301 -0
- autoair/ai/assistants/troubleshoot.py +1034 -0
- autoair/ai/assistants/upgrade.py +213 -0
- autoair/ai/audit_log.py +286 -0
- autoair/ai/availability.py +28 -0
- autoair/ai/chunking.py +170 -0
- autoair/ai/config.py +1058 -0
- autoair/ai/corpus.py +205 -0
- autoair/ai/events.py +332 -0
- autoair/ai/findings.py +274 -0
- autoair/ai/generator.py +396 -0
- autoair/ai/guardrails.py +593 -0
- autoair/ai/knowledge/airflow3-best-practices.md +65 -0
- autoair/ai/knowledge/dagspec-authoring.md +51 -0
- autoair/ai/knowledge.py +342 -0
- autoair/ai/llm.py +690 -0
- autoair/ai/memory.py +270 -0
- autoair/ai/models.py +501 -0
- autoair/ai/net.py +270 -0
- autoair/ai/problems.py +154 -0
- autoair/ai/prompts.py +620 -0
- autoair/ai/proxy.py +179 -0
- autoair/ai/query.py +106 -0
- autoair/ai/rag.py +802 -0
- autoair/ai/rerank.py +212 -0
- autoair/ai/research/__init__.py +13 -0
- autoair/ai/research/local.py +495 -0
- autoair/ai/research/online.py +279 -0
- autoair/ai/research/tools.py +346 -0
- autoair/ai/rules.py +984 -0
- autoair/ai/service.py +184 -0
- autoair/ai/testing.py +209 -0
- autoair/ai/toolbox.py +308 -0
- autoair/ai/tools.py +59 -0
- autoair/ai/tuning.py +307 -0
- autoair/ai/usage.py +127 -0
- autoair/ai/user_llm.py +395 -0
- autoair/ai/writers.py +889 -0
- autoair/api/app.py +678 -0
- autoair/api/deps.py +46 -0
- autoair/api/errors.py +18 -0
- autoair/api/features.py +43 -0
- autoair/api/git_token.py +115 -0
- autoair/api/platform.py +320 -0
- autoair/api/routers/__init__.py +0 -0
- autoair/api/routers/admin.py +602 -0
- autoair/api/routers/admin_ai.py +116 -0
- autoair/api/routers/admin_features.py +182 -0
- autoair/api/routers/ai.py +1301 -0
- autoair/api/routers/ai_assistants.py +1249 -0
- autoair/api/routers/ai_mount.py +126 -0
- autoair/api/routers/airflow.py +594 -0
- autoair/api/routers/catalog.py +167 -0
- autoair/api/routers/collab.py +27 -0
- autoair/api/routers/config.py +84 -0
- autoair/api/routers/deploy_target.py +273 -0
- autoair/api/routers/icons.py +124 -0
- autoair/api/routers/interchange.py +266 -0
- autoair/api/routers/kb.py +259 -0
- autoair/api/routers/lsp.py +64 -0
- autoair/api/routers/lsp_ws.py +125 -0
- autoair/api/routers/marketplace.py +43 -0
- autoair/api/routers/meta.py +279 -0
- autoair/api/routers/ops.py +115 -0
- autoair/api/routers/review.py +56 -0
- autoair/api/routers/runs.py +163 -0
- autoair/api/routers/specs.py +1328 -0
- autoair/api/routers/templates.py +195 -0
- autoair/api/routers/tools.py +105 -0
- autoair/api/routers/vcs.py +315 -0
- autoair/audit.py +218 -0
- autoair/auth.py +287 -0
- autoair/catalog/__init__.py +51 -0
- autoair/catalog/discovery.py +590 -0
- autoair/catalog/importer.py +148 -0
- autoair/catalog/introspection.py +311 -0
- autoair/catalog/metadata.py +595 -0
- autoair/catalog/models.py +225 -0
- autoair/catalog/providers.py +137 -0
- autoair/catalog/schema_check.py +108 -0
- autoair/catalog/service.py +1606 -0
- autoair/catalog/static.py +1138 -0
- autoair/cli.py +774 -0
- autoair/codegen/__init__.py +53 -0
- autoair/codegen/body.py +46 -0
- autoair/codegen/builder.py +780 -0
- autoair/codegen/context.py +552 -0
- autoair/codegen/dagfactory.py +168 -0
- autoair/codegen/features.py +63 -0
- autoair/codegen/format.py +57 -0
- autoair/codegen/timedeltas.py +44 -0
- autoair/codegen/yaml_dag.py +527 -0
- autoair/collab.py +289 -0
- autoair/collab_sync.py +594 -0
- autoair/config_reference.py +284 -0
- autoair/config_sources.py +581 -0
- autoair/deploy_setup.py +384 -0
- autoair/feature_overrides.py +142 -0
- autoair/gateway/__init__.py +783 -0
- autoair/governance.py +356 -0
- autoair/iam/__init__.py +15 -0
- autoair/iam/config.py +196 -0
- autoair/iam/deps.py +317 -0
- autoair/iam/fab.py +65 -0
- autoair/iam/login.py +270 -0
- autoair/iam/model.py +280 -0
- autoair/iam/proposals.py +252 -0
- autoair/iam/resolver.py +249 -0
- autoair/iam/sso.py +363 -0
- autoair/icons.py +575 -0
- autoair/importer/__init__.py +0 -0
- autoair/importer/bulk.py +280 -0
- autoair/importer/code_sync.py +247 -0
- autoair/importer/python_dag.py +783 -0
- autoair/kb/__init__.py +14 -0
- autoair/kb/bundle.py +319 -0
- autoair/kb/chunk.py +76 -0
- autoair/kb/cli.py +266 -0
- autoair/kb/components.py +209 -0
- autoair/kb/config.py +495 -0
- autoair/kb/fetch.py +397 -0
- autoair/kb/ingest.py +598 -0
- autoair/kb/mcp.py +114 -0
- autoair/kb/models.py +260 -0
- autoair/kb/parse.py +530 -0
- autoair/kb/scheduler.py +84 -0
- autoair/kb/service.py +571 -0
- autoair/kb/sources.py +756 -0
- autoair/kb/state.py +171 -0
- autoair/kb/stores/__init__.py +106 -0
- autoair/kb/stores/base.py +142 -0
- autoair/kb/stores/elasticsearch.py +575 -0
- autoair/kb/stores/local.py +522 -0
- autoair/kb/stores/pgvector.py +395 -0
- autoair/loader/__init__.py +66 -0
- autoair/logging_setup.py +87 -0
- autoair/lsp/__init__.py +284 -0
- autoair/lsp/airflow_context.py +81 -0
- autoair/lsp/config.py +73 -0
- autoair/lsp/proxy.py +747 -0
- autoair/lsp/shell.py +128 -0
- autoair/lsp/validate.py +558 -0
- autoair/marketplace.py +329 -0
- autoair/mcp/__init__.py +41 -0
- autoair/mcp/availability.py +40 -0
- autoair/mcp/git_token.py +92 -0
- autoair/mcp/http.py +121 -0
- autoair/mcp/iam.py +297 -0
- autoair/mcp/models.py +175 -0
- autoair/mcp/server.py +1782 -0
- autoair/mcp/store.py +84 -0
- autoair/merge.py +330 -0
- autoair/net/__init__.py +1 -0
- autoair/net/tls.py +284 -0
- autoair/persistence/__init__.py +59 -0
- autoair/persistence/config.py +115 -0
- autoair/persistence/db.py +336 -0
- autoair/persistence/documents.py +227 -0
- autoair/persistence/migrations.py +139 -0
- autoair/persistence/protocols.py +102 -0
- autoair/persistence/schema.py +191 -0
- autoair/persistence/sql.py +829 -0
- autoair/plugin.py +86 -0
- autoair/policy_rules.py +312 -0
- autoair/py.typed +0 -0
- autoair/registry/__init__.py +171 -0
- autoair/rendering.py +27 -0
- autoair/resources/__init__.py +0 -0
- autoair/resources/airflow-dag-yaml-2026-10-30.schema.json +417 -0
- autoair/resources/logos/airbyte.png +0 -0
- autoair/resources/logos/alibabacloud-oss.png +0 -0
- autoair/resources/logos/amazon-appflow-light.png +0 -0
- autoair/resources/logos/amazon-athena-light-bg-4x.png +0 -0
- autoair/resources/logos/amazon-bedrock-light-bg-4x.png +0 -0
- autoair/resources/logos/amazon-chime-light-bg.png +0 -0
- autoair/resources/logos/amazon-cloudwatch-light-bg-4x.png +0 -0
- autoair/resources/logos/amazon-comprehend-light-bg-4x.png +0 -0
- autoair/resources/logos/amazon-dynamodb-light-bg-4x.png +0 -0
- autoair/resources/logos/amazon-ec2-light-bg-4x.png +0 -0
- autoair/resources/logos/amazon-elastic-container-registry-light-bg-4x.png +0 -0
- autoair/resources/logos/amazon-elastic-container-service-light-bg-4x.png +0 -0
- autoair/resources/logos/amazon-elastic-kubernetes-service-light-bg-4x.png +0 -0
- autoair/resources/logos/amazon-elasticache-light-bg-4x.png +0 -0
- autoair/resources/logos/amazon-emr-light-bg-4x.png +0 -0
- autoair/resources/logos/amazon-eventbridge-64.png +0 -0
- autoair/resources/logos/amazon-kinesis-analytics-light-bg-4x.png +0 -0
- autoair/resources/logos/amazon-kinesis-data-firehose-light-bg-4x.png +0 -0
- autoair/resources/logos/amazon-mwaa.png +0 -0
- autoair/resources/logos/amazon-neptune-64.png +0 -0
- autoair/resources/logos/amazon-opensearch-light-bg-4x.png +0 -0
- autoair/resources/logos/amazon-quicksight-light-bg-4x.png +0 -0
- autoair/resources/logos/amazon-rds-light-bg-4x.png +0 -0
- autoair/resources/logos/amazon-redshift-light-bg-4x.png +0 -0
- autoair/resources/logos/amazon-s3-glacier-light-bg-4x.png +0 -0
- autoair/resources/logos/amazon-sagemaker-light-bg-4x.png +0 -0
- autoair/resources/logos/amazon-simple-email-service-ses-light-bg-4x.png +0 -0
- autoair/resources/logos/amazon-simple-notification-service-sns-light-bg-4x.png +0 -0
- autoair/resources/logos/amazon-simple-queue-service-sqs-light-bg-4x.png +0 -0
- autoair/resources/logos/amazon-simple-storage-service-s3-light-bg-4x.png +0 -0
- autoair/resources/logos/amazon-verified-permissions.png +0 -0
- autoair/resources/logos/apache-beam.png +0 -0
- autoair/resources/logos/apache-impala.png +0 -0
- autoair/resources/logos/apache-tinkerpop.png +0 -0
- autoair/resources/logos/arangodb.svg +1 -0
- autoair/resources/logos/asana.svg +1 -0
- autoair/resources/logos/aws-batch-light-bg-4x.png +0 -0
- autoair/resources/logos/aws-cloud-alt-light-bg-4x.png +0 -0
- autoair/resources/logos/aws-cloudformation-light-bg-4x.png +0 -0
- autoair/resources/logos/aws-database-migration-service-64-5x.png +0 -0
- autoair/resources/logos/aws-datasync-light-bg-4x.png +0 -0
- autoair/resources/logos/aws-glue-databrew-64.png +0 -0
- autoair/resources/logos/aws-glue-light-bg-4x.png +0 -0
- autoair/resources/logos/aws-lambda-light-bg-4x.png +0 -0
- autoair/resources/logos/aws-secrets-manager-light-bg-4x.png +0 -0
- autoair/resources/logos/aws-step-functions-light-bg-4x.png +0 -0
- autoair/resources/logos/aws-sts-light-bg-4x.png +0 -0
- autoair/resources/logos/aws-systems-manager-light-bg-4x.png +0 -0
- autoair/resources/logos/azure-cosmos-db.svg +11 -0
- autoair/resources/logos/azure-data-factory.svg +1 -0
- autoair/resources/logos/azure-files.svg +8 -0
- autoair/resources/logos/bash.svg +1 -0
- autoair/resources/logos/bigquery.png +0 -0
- autoair/resources/logos/blob-storage.svg +9 -0
- autoair/resources/logos/cassandra-3.png +0 -0
- autoair/resources/logos/celery.png +0 -0
- autoair/resources/logos/clickhouse.png +0 -0
- autoair/resources/logos/cloud-bigtable.png +0 -0
- autoair/resources/logos/cloud-build.png +0 -0
- autoair/resources/logos/cloud-dataflow.png +0 -0
- autoair/resources/logos/cloud-dataproc.png +0 -0
- autoair/resources/logos/cloud-datastore.png +0 -0
- autoair/resources/logos/cloud-functions.png +0 -0
- autoair/resources/logos/cloud-logging-sink.png +0 -0
- autoair/resources/logos/cloud-looker.png +0 -0
- autoair/resources/logos/cloud-memorystore.png +0 -0
- autoair/resources/logos/cloud-nlp.png +0 -0
- autoair/resources/logos/cloud-pubsub.png +0 -0
- autoair/resources/logos/cloud-spanner.png +0 -0
- autoair/resources/logos/cloud-speech-to-text.png +0 -0
- autoair/resources/logos/cloud-sql.png +0 -0
- autoair/resources/logos/cloud-storage.png +0 -0
- autoair/resources/logos/cloud-tasks.png +0 -0
- autoair/resources/logos/cloud-text-to-speech.png +0 -0
- autoair/resources/logos/cloud-translation-api.png +0 -0
- autoair/resources/logos/cloud-video-intelligence-api.png +0 -0
- autoair/resources/logos/cloud-vision-api.png +0 -0
- autoair/resources/logos/cloudant.png +0 -0
- autoair/resources/logos/compute-engine.png +0 -0
- autoair/resources/logos/container-instances.svg +9 -0
- autoair/resources/logos/data-lake-storage.svg +37 -0
- autoair/resources/logos/databricks.png +0 -0
- autoair/resources/logos/datadog.png +0 -0
- autoair/resources/logos/dbt.png +0 -0
- autoair/resources/logos/dingding.png +0 -0
- autoair/resources/logos/discord.png +0 -0
- autoair/resources/logos/docker-swarm.png +0 -0
- autoair/resources/logos/docker.png +0 -0
- autoair/resources/logos/drill.png +0 -0
- autoair/resources/logos/druid-1.png +0 -0
- autoair/resources/logos/elasticsearch.png +0 -0
- autoair/resources/logos/exasol.png +0 -0
- autoair/resources/logos/facebook-ads.png +0 -0
- autoair/resources/logos/flinkonk8s.png +0 -0
- autoair/resources/logos/ftp.png +0 -0
- autoair/resources/logos/git.svg +1 -0
- autoair/resources/logos/github.svg +3 -0
- autoair/resources/logos/gitlab.svg +1 -0
- autoair/resources/logos/glyph-agent.svg +1 -0
- autoair/resources/logos/glyph-branch.svg +1 -0
- autoair/resources/logos/glyph-calendar.svg +1 -0
- autoair/resources/logos/glyph-clock.svg +1 -0
- autoair/resources/logos/glyph-document.svg +1 -0
- autoair/resources/logos/glyph-embedding.svg +1 -0
- autoair/resources/logos/glyph-empty.svg +1 -0
- autoair/resources/logos/glyph-hourglass.svg +1 -0
- autoair/resources/logos/glyph-human.svg +1 -0
- autoair/resources/logos/glyph-latest.svg +1 -0
- autoair/resources/logos/glyph-link.svg +1 -0
- autoair/resources/logos/glyph-llm.svg +1 -0
- autoair/resources/logos/glyph-quality.svg +1 -0
- autoair/resources/logos/glyph-rerank.svg +1 -0
- autoair/resources/logos/glyph-retrieval.svg +1 -0
- autoair/resources/logos/glyph-schema-compare.svg +1 -0
- autoair/resources/logos/glyph-smooth.svg +1 -0
- autoair/resources/logos/glyph-sql-ai.svg +1 -0
- autoair/resources/logos/glyph-sync.svg +1 -0
- autoair/resources/logos/glyph-terminal.svg +1 -0
- autoair/resources/logos/glyph-transfer.svg +1 -0
- autoair/resources/logos/glyph-trigger.svg +1 -0
- autoair/resources/logos/google-ads.png +0 -0
- autoair/resources/logos/google-analytics.png +0 -0
- autoair/resources/logos/google-api-python-client.png +0 -0
- autoair/resources/logos/google-calendar.png +0 -0
- autoair/resources/logos/google-campaign-manager.png +0 -0
- autoair/resources/logos/google-cloud-generic.png +0 -0
- autoair/resources/logos/google-cloud-secret-manager.png +0 -0
- autoair/resources/logos/google-cloud.png +0 -0
- autoair/resources/logos/google-data-fusion.png +0 -0
- autoair/resources/logos/google-data-loss-prevention.png +0 -0
- autoair/resources/logos/google-dataprep.png +0 -0
- autoair/resources/logos/google-deployment-manager.png +0 -0
- autoair/resources/logos/google-display-and-video-360.png +0 -0
- autoair/resources/logos/google-drive.png +0 -0
- autoair/resources/logos/google-firestore.png +0 -0
- autoair/resources/logos/google-search-ads360.png +0 -0
- autoair/resources/logos/google-spreadsheet.png +0 -0
- autoair/resources/logos/google.png +0 -0
- autoair/resources/logos/grpc.png +0 -0
- autoair/resources/logos/hadoop.png +0 -0
- autoair/resources/logos/hashicorp-vault.png +0 -0
- autoair/resources/logos/hive.png +0 -0
- autoair/resources/logos/http.png +0 -0
- autoair/resources/logos/iceberg.png +0 -0
- autoair/resources/logos/imap.png +0 -0
- autoair/resources/logos/influxdb.svg +1 -0
- autoair/resources/logos/informatica.png +0 -0
- autoair/resources/logos/jdbc.png +0 -0
- autoair/resources/logos/jenkins.png +0 -0
- autoair/resources/logos/jira.png +0 -0
- autoair/resources/logos/kafka.svg +22 -0
- autoair/resources/logos/key-management-service.png +0 -0
- autoair/resources/logos/keycloak.svg +1 -0
- autoair/resources/logos/kubernetes-engine.png +0 -0
- autoair/resources/logos/kubernetes.png +0 -0
- autoair/resources/logos/kylin.png +0 -0
- autoair/resources/logos/livy.png +0 -0
- autoair/resources/logos/manifest.json +329 -0
- autoair/resources/logos/microsoft-azure-batch.png +0 -0
- autoair/resources/logos/microsoft-azure-data-explorer.png +0 -0
- autoair/resources/logos/microsoft-azure-fileshare.png +0 -0
- autoair/resources/logos/microsoft-azure.png +0 -0
- autoair/resources/logos/microsoft-graph-api.png +0 -0
- autoair/resources/logos/microsoft-sql-server.png +0 -0
- autoair/resources/logos/mongodb.png +0 -0
- autoair/resources/logos/mysql.png +0 -0
- autoair/resources/logos/neo4j.svg +1 -0
- autoair/resources/logos/odbc.png +0 -0
- autoair/resources/logos/openai.png +0 -0
- autoair/resources/logos/openfaas.png +0 -0
- autoair/resources/logos/openlineage.svg +47 -0
- autoair/resources/logos/opensearch.png +0 -0
- autoair/resources/logos/opsgenie.png +0 -0
- autoair/resources/logos/oracle.png +0 -0
- autoair/resources/logos/pagerduty.png +0 -0
- autoair/resources/logos/papermill.png +0 -0
- autoair/resources/logos/pig.png +0 -0
- autoair/resources/logos/pinecone.png +0 -0
- autoair/resources/logos/pinot.png +0 -0
- autoair/resources/logos/postgres.png +0 -0
- autoair/resources/logos/prestodb.png +0 -0
- autoair/resources/logos/python.svg +1 -0
- autoair/resources/logos/qdrant.svg +45 -0
- autoair/resources/logos/redis.png +0 -0
- autoair/resources/logos/salesforce.png +0 -0
- autoair/resources/logos/samba.png +0 -0
- autoair/resources/logos/segment.png +0 -0
- autoair/resources/logos/service-bus.svg +1 -0
- autoair/resources/logos/sftp.png +0 -0
- autoair/resources/logos/singularity.png +0 -0
- autoair/resources/logos/slack.png +0 -0
- autoair/resources/logos/smtp.png +0 -0
- autoair/resources/logos/snowflake.png +0 -0
- autoair/resources/logos/spark-on-kubernetes.png +0 -0
- autoair/resources/logos/spark.png +0 -0
- autoair/resources/logos/sql.png +0 -0
- autoair/resources/logos/sqlite.png +0 -0
- autoair/resources/logos/ssh.png +0 -0
- autoair/resources/logos/tableau.png +0 -0
- autoair/resources/logos/telegram.png +0 -0
- autoair/resources/logos/teradata.png +0 -0
- autoair/resources/logos/trino-og.png +0 -0
- autoair/resources/logos/vertica.png +0 -0
- autoair/resources/logos/vespa.svg +1 -0
- autoair/resources/logos/weaviate.png +0 -0
- autoair/resources/logos/winrm.png +0 -0
- autoair/resources/logos/yandex-cloud.png +0 -0
- autoair/resources/logos/ydb.png +0 -0
- autoair/resources/logos/zendesk.png +0 -0
- autoair/runner/__init__.py +244 -0
- autoair/runner/_child.py +415 -0
- autoair/scaffold/__init__.py +83 -0
- autoair/scaffold/custom-node/cookiecutter.json +10 -0
- autoair/scaffold/custom-node/{{cookiecutter.project_slug}}/README.md +48 -0
- autoair/scaffold/custom-node/{{cookiecutter.project_slug}}/pyproject.toml +25 -0
- autoair/scaffold/custom-node/{{cookiecutter.project_slug}}/src/{{cookiecutter.package_name}}/__init__.py +5 -0
- autoair/scaffold/custom-node/{{cookiecutter.project_slug}}/src/{{cookiecutter.package_name}}/handler.py +72 -0
- autoair/scaffold/custom-node/{{cookiecutter.project_slug}}/tests/test_handler.py +63 -0
- autoair/secret_mask.py +116 -0
- autoair/sections.py +1313 -0
- autoair/server.py +243 -0
- autoair/settings.py +662 -0
- autoair/spec/__init__.py +113 -0
- autoair/spec/env_mapping.py +146 -0
- autoair/spec/migrations.py +42 -0
- autoair/spec/models.py +962 -0
- autoair/static/plugin/AdminPanel-DkTNOG-N.js +3348 -0
- autoair/static/plugin/AiAssistDialogs-DaXfKsmn.js +435 -0
- autoair/static/plugin/AiCodeEditor-CaALp60X.js +15 -0
- autoair/static/plugin/AiCodeEditorImpl-ioqYzJXB.js +51 -0
- autoair/static/plugin/AiDialogs-DKcg_jPN.js +304 -0
- autoair/static/plugin/AiFindings-QMOlgWLO.js +260 -0
- autoair/static/plugin/AiFindingsDialog-B_p7fGXp.js +292 -0
- autoair/static/plugin/AiKnowledgeDialog-DakN1XqN.js +350 -0
- autoair/static/plugin/AiModelDialog-DFOSsgvS.js +305 -0
- autoair/static/plugin/AiStream-Bg5_fjGS.js +386 -0
- autoair/static/plugin/AiWriterDialog-8LOAmIWj.js +331 -0
- autoair/static/plugin/AirflowPickers-BDtRZzPc.js +171 -0
- autoair/static/plugin/AirflowTab-CgyrHICC.js +407 -0
- autoair/static/plugin/AnalyzeButton-B1F_O8x5.js +30 -0
- autoair/static/plugin/AuditTab-CRj__33M.js +75 -0
- autoair/static/plugin/Autocomplete-B_F7RRQ0.js +110 -0
- autoair/static/plugin/BackfillDialog-Dsw7Qvxy.js +217 -0
- autoair/static/plugin/BulkImportDialog-BXnOYQuV.js +441 -0
- autoair/static/plugin/ChatMessageView-Da9ponIE.js +722 -0
- autoair/static/plugin/ChatPanel-DxOFbbMF.js +547 -0
- autoair/static/plugin/ClearRunDialog-CWqTsV7H.js +149 -0
- autoair/static/plugin/CodeEditor-Bt4qBEqe.js +2624 -0
- autoair/static/plugin/CodeModeView-DAW5PYyu.js +460 -0
- autoair/static/plugin/CodeTab-ClhTK8cr.js +424 -0
- autoair/static/plugin/CodeView-Ctzcu166.js +89 -0
- autoair/static/plugin/ConfigDialog-Z1IM_mFp.js +266 -0
- autoair/static/plugin/ConflictDialog-jyOcYxXc.js +416 -0
- autoair/static/plugin/DeleteDagDialog-DdrEaPpq.js +79 -0
- autoair/static/plugin/DeployDialog-Btws3gWE.js +449 -0
- autoair/static/plugin/DialogShell-A9nq4Mub.js +44 -0
- autoair/static/plugin/DiffSummary-tHfNtXUV.js +156 -0
- autoair/static/plugin/DiffView-Hmv9hnOT.js +907 -0
- autoair/static/plugin/DuplicateDialog-DuOaL-u-.js +58 -0
- autoair/static/plugin/ExecutionTab-DtnHDHO7.js +269 -0
- autoair/static/plugin/GitTokenField-DZaMLiDX.js +100 -0
- autoair/static/plugin/IconPicker-BWLxAWnS.js +483 -0
- autoair/static/plugin/ImportDialog-BandLZS1.js +385 -0
- autoair/static/plugin/JsonBlock-DmsQhoaC.js +28 -0
- autoair/static/plugin/LatestVersionSelect-D_xvgQ20.js +74 -0
- autoair/static/plugin/Markdown-DvpQsfRf.js +7898 -0
- autoair/static/plugin/NewConnectionDialog-Buf7Ao30.js +380 -0
- autoair/static/plugin/OpenDialog-BVEf8PTb.js +197 -0
- autoair/static/plugin/OperatorParams-BH4AQBYr.js +3497 -0
- autoair/static/plugin/OperatorTemplateEditor-BNs0UtYx.js +1112 -0
- autoair/static/plugin/OperatorTemplateInputsDialog-C_UpCLc7.js +199 -0
- autoair/static/plugin/PromoteDialog-B4U-UfsV.js +164 -0
- autoair/static/plugin/RawCodeView-WcMnekRh.js +461 -0
- autoair/static/plugin/RunsTab-CXteAqeT.js +201 -0
- autoair/static/plugin/SaveOperatorTemplateDialog-DCvtCReh.js +240 -0
- autoair/static/plugin/SaveTemplateDialog-Dd0SEGw2.js +113 -0
- autoair/static/plugin/SchemaForm-IQwjq7WV.js +19 -0
- autoair/static/plugin/SchemaFormImpl-UYTxiUZZ.js +17196 -0
- autoair/static/plugin/SpecDiffReview-CLwxKrWC.js +120 -0
- autoair/static/plugin/StateBadge-C23Kcrqm.js +13 -0
- autoair/static/plugin/StorageDialog-Syiy1ds0.js +383 -0
- autoair/static/plugin/THIRD_PARTY_LICENSES.md +5276 -0
- autoair/static/plugin/TaskTab-D5OOtt9m.js +277 -0
- autoair/static/plugin/TemplatesDialog-KyCx2Lbs.js +638 -0
- autoair/static/plugin/TestTaskDialog-CMHpak9t.js +413 -0
- autoair/static/plugin/Tip-BV6tQO7D.js +25 -0
- autoair/static/plugin/TriggerDialog-CVfbb15L.js +177 -0
- autoair/static/plugin/TroubleshootDialog-BR3zKfci.js +1046 -0
- autoair/static/plugin/UnmanagedDialog-BMa8F2hP.js +126 -0
- autoair/static/plugin/UpgradeDialog-DTI7lyK8.js +247 -0
- autoair/static/plugin/VersionsTab-D00PBdzY.js +546 -0
- autoair/static/plugin/access-BYFVFh6C.js +19 -0
- autoair/static/plugin/actions-BSzclKY-.js +4364 -0
- autoair/static/plugin/actions-DOu-JDEn.js +529 -0
- autoair/static/plugin/ai-C2Qbmkyi.js +200 -0
- autoair/static/plugin/assets/layout.worker-DW7MC31Q.js +22 -0
- autoair/static/plugin/builder-sja5r6wu.js +8963 -0
- autoair/static/plugin/canonical-Bh_uW3MF.js +21 -0
- autoair/static/plugin/capabilities-M652otPM.js +22 -0
- autoair/static/plugin/code-C_OnDrz4.js +730 -0
- autoair/static/plugin/dates-DoB8lXtr.js +15 -0
- autoair/static/plugin/dist-B9vMWY4f.js +292 -0
- autoair/static/plugin/dist-BYiD08Lh.js +469 -0
- autoair/static/plugin/dist-D7fwIwda.js +14090 -0
- autoair/static/plugin/elk-api-DWiB7VoS.js +198 -0
- autoair/static/plugin/factories-BkHO63YE.js +62 -0
- autoair/static/plugin/fields-Bb1ft4N_.js +480 -0
- autoair/static/plugin/formSchema-CyhpMmtJ.js +216 -0
- autoair/static/plugin/gitToken-UHJSMULO.js +30 -0
- autoair/static/plugin/hooks-DMiMZMal.js +28 -0
- autoair/static/plugin/i18n-0FawidLE.js +7728 -0
- autoair/static/plugin/i18nInstance-CZahk5l_.js +47 -0
- autoair/static/plugin/icon.svg +1 -0
- autoair/static/plugin/icons-Cguzgt0W.js +51 -0
- autoair/static/plugin/insertables-BkOYGjXW.js +231 -0
- autoair/static/plugin/jinja-BQHzM2Lo.js +976 -0
- autoair/static/plugin/layout-CSet5pC4.js +122 -0
- autoair/static/plugin/lazy-BI37_zIU.js +24 -0
- autoair/static/plugin/lspClient-DDyn5PQg.js +2669 -0
- autoair/static/plugin/lu-Dqbh7tTF.js +5693 -0
- autoair/static/plugin/main.js +14149 -0
- autoair/static/plugin/markdown-BIEso4Rr.js +12 -0
- autoair/static/plugin/nodes-DkZYxwBr.js +806 -0
- autoair/static/plugin/operatorTemplateEditor-CoAfT66u.js +205 -0
- autoair/static/plugin/operatorTemplates-BMgJ1yxU.js +127 -0
- autoair/static/plugin/params-CbDYxai1.js +71 -0
- autoair/static/plugin/problemMessages-BXpQzZRH.js +240 -0
- autoair/static/plugin/react-jsx-runtime-Cai7-eku.js +11 -0
- autoair/static/plugin/react-query.gen-3vmdtzZa.js +1267 -0
- autoair/static/plugin/rolldown-runtime-CEFd7nDs.js +30 -0
- autoair/static/plugin/runOverlay-DnylM9km.js +75 -0
- autoair/static/plugin/runState-CPs3Px8Z.js +223 -0
- autoair/static/plugin/sdk.gen-R6qA-95C.js +1225 -0
- autoair/static/plugin/setup-Bc69nXao.js +50 -0
- autoair/static/plugin/shallow-qr53gA9I.js +30 -0
- autoair/static/plugin/shell-DvIl0hZL.js +4142 -0
- autoair/static/plugin/store-C65x8y4g.js +96 -0
- autoair/static/plugin/store-CUj0Iblx.js +29 -0
- autoair/static/plugin/store-D-qOX0Ro.js +206 -0
- autoair/static/plugin/toaster-DVl7jXAF.js +34 -0
- autoair/static/plugin/useIsDark-csNHztsa.js +2926 -0
- autoair/static/plugin/useMutation-BeWnS0xv.js +292 -0
- autoair/static/plugin/useQuery-BaLDBBtv.js +647 -0
- autoair/static/plugin/useRunOverlaySync-QcIzHjJF.js +36 -0
- autoair/static/plugin/useTranslation-BklDu29n.js +153 -0
- autoair/static/standalone/THIRD_PARTY_LICENSES.md +7260 -0
- autoair/static/standalone/assets/AdminPanel-DMyBDxqU.js +1 -0
- autoair/static/standalone/assets/AiAssistDialogs-eYCvacx1.js +1 -0
- autoair/static/standalone/assets/AiCodeEditor-TMNsnvCM.js +2 -0
- autoair/static/standalone/assets/AiCodeEditorImpl-BDN-4cTi.js +1 -0
- autoair/static/standalone/assets/AiDialogs-B4Rvt95n.js +1 -0
- autoair/static/standalone/assets/AiFindings-Dqie-srv.js +1 -0
- autoair/static/standalone/assets/AiFindingsDialog-6VByiWza.js +1 -0
- autoair/static/standalone/assets/AiKnowledgeDialog-VsIhSeow.js +1 -0
- autoair/static/standalone/assets/AiModelDialog-XCeTU6Xi.js +1 -0
- autoair/static/standalone/assets/AiStream-B-YqipiU.js +11 -0
- autoair/static/standalone/assets/AiWriterDialog-BJFfPO_D.js +2 -0
- autoair/static/standalone/assets/AirflowPickers-BDgK95W4.js +2 -0
- autoair/static/standalone/assets/AirflowTab-DGZA3-hP.js +7 -0
- autoair/static/standalone/assets/AnalyzeButton-zNw48hoj.js +1 -0
- autoair/static/standalone/assets/AuditTab-9jdf3LeB.js +1 -0
- autoair/static/standalone/assets/Autocomplete-JnxGF0Pa.js +1 -0
- autoair/static/standalone/assets/BackfillDialog-aZ77WztH.js +1 -0
- autoair/static/standalone/assets/BulkImportDialog-B6zNzpve.js +3 -0
- autoair/static/standalone/assets/ChatMessageView-FGhfBXlP.js +5 -0
- autoair/static/standalone/assets/ChatPanel-BEMNgOAE.js +1 -0
- autoair/static/standalone/assets/ClearRunDialog-K0CrdR8I.js +1 -0
- autoair/static/standalone/assets/CodeEditor-NlGY3iKd.js +33 -0
- autoair/static/standalone/assets/CodeTab-yDNvy1I2.js +3 -0
- autoair/static/standalone/assets/CodeView-BihhWpbO.js +1 -0
- autoair/static/standalone/assets/ConfigDialog-BElXSWRP.js +1 -0
- autoair/static/standalone/assets/ConflictDialog-BcJrkr0d.js +1 -0
- autoair/static/standalone/assets/DeleteDagDialog-34M_-VDs.js +1 -0
- autoair/static/standalone/assets/DeployDialog-Bmxlp79L.js +1 -0
- autoair/static/standalone/assets/DialogShell-C5r6WtvG.js +1 -0
- autoair/static/standalone/assets/DiffSummary-Zr39j8nA.js +1 -0
- autoair/static/standalone/assets/DiffView-CP_QhU9M.js +1 -0
- autoair/static/standalone/assets/DuplicateDialog-BO_phlbI.js +1 -0
- autoair/static/standalone/assets/GitTokenField-Bru3t4Tf.js +1 -0
- autoair/static/standalone/assets/ImportDialog-DkfJwld0.js +2 -0
- autoair/static/standalone/assets/JsonBlock-SiTWUrMM.js +1 -0
- autoair/static/standalone/assets/LatestVersionSelect-kFrIaZ3a.js +1 -0
- autoair/static/standalone/assets/Markdown-BK2CS7tZ.js +32 -0
- autoair/static/standalone/assets/NewConnectionDialog-B-6ruvWB.js +1 -0
- autoair/static/standalone/assets/OpenDialog-BO3haTDj.js +1 -0
- autoair/static/standalone/assets/OperatorParams-DX2f9vNw.js +10 -0
- autoair/static/standalone/assets/OperatorTemplateEditor-BWZYgyZu.js +1 -0
- autoair/static/standalone/assets/OperatorTemplateInputsDialog-M4zEDHzt.js +1 -0
- autoair/static/standalone/assets/PromoteDialog-D-cTrCf7.js +1 -0
- autoair/static/standalone/assets/RunsTab-DxGoFXRL.js +1 -0
- autoair/static/standalone/assets/SaveOperatorTemplateDialog-BNf4XRQ-.js +1 -0
- autoair/static/standalone/assets/SaveTemplateDialog-C8JI9s3R.js +1 -0
- autoair/static/standalone/assets/SchemaForm-B7wfZc-P.js +2 -0
- autoair/static/standalone/assets/SchemaFormImpl-B23l5mdo.js +64 -0
- autoair/static/standalone/assets/SpecDiffReview-BLSHJmaf.js +1 -0
- autoair/static/standalone/assets/StateBadge-CvctBkY8.js +1 -0
- autoair/static/standalone/assets/StorageDialog-Xj4UQ74B.js +1 -0
- autoair/static/standalone/assets/TaskTab-Cnij22Ss.js +2 -0
- autoair/static/standalone/assets/TemplatesDialog-B9Hf9mJf.js +3 -0
- autoair/static/standalone/assets/TestTaskDialog-PTkninKV.js +1 -0
- autoair/static/standalone/assets/TriggerDialog-BGFOiZN6.js +1 -0
- autoair/static/standalone/assets/TroubleshootDialog-Cd8xoBkI.js +1 -0
- autoair/static/standalone/assets/UnmanagedDialog-Dd_1OQTI.js +1 -0
- autoair/static/standalone/assets/UpgradeDialog-C4fclcyt.js +1 -0
- autoair/static/standalone/assets/VersionsTab-Dl0rLLuG.js +1 -0
- autoair/static/standalone/assets/access-BvpiRteA.js +1 -0
- autoair/static/standalone/assets/actions-B_vLX9xD.js +21 -0
- autoair/static/standalone/assets/actions-Cqvs60Hb.js +4 -0
- autoair/static/standalone/assets/ai-BCD4blVb.js +1 -0
- autoair/static/standalone/assets/alert-Boq3W9Fi.js +1 -0
- autoair/static/standalone/assets/badge--je1KJr6.js +1 -0
- autoair/static/standalone/assets/box-BpnnstkW.js +1 -0
- autoair/static/standalone/assets/builder-Bn6CtTVl.js +7 -0
- autoair/static/standalone/assets/checkbox-IkAfgwI8.js +1 -0
- autoair/static/standalone/assets/close-button-D8lsZ7QE.js +1 -0
- autoair/static/standalone/assets/code-BDeW6XpG.js +1 -0
- autoair/static/standalone/assets/code-T5thzruT.js +21 -0
- autoair/static/standalone/assets/collapsible-73Gu0IlX.js +1 -0
- autoair/static/standalone/assets/collapsible.anatomy-QQ8IWoFw.js +1 -0
- autoair/static/standalone/assets/config-DYB7bQuD.js +1 -0
- autoair/static/standalone/assets/create-slot-recipe-context-CxwVeayd.js +1 -0
- autoair/static/standalone/assets/dates-DBqwDcgn.js +1 -0
- autoair/static/standalone/assets/dialog-CyKdt4em.js +1 -0
- autoair/static/standalone/assets/dist-B474Y4vK.js +1 -0
- autoair/static/standalone/assets/dist-Bgv7KlII.js +2 -0
- autoair/static/standalone/assets/dist-CyCIcyrd.js +22 -0
- autoair/static/standalone/assets/dist-Dth53M4h.js +1 -0
- autoair/static/standalone/assets/elk-api-Z7C9yahg.js +1 -0
- autoair/static/standalone/assets/equal-D9QoywGU.js +1 -0
- autoair/static/standalone/assets/factories-BzDuz5AM.js +12 -0
- autoair/static/standalone/assets/factory-BXGO0l9w.js +1 -0
- autoair/static/standalone/assets/field-C7PgRyDv.js +1 -0
- autoair/static/standalone/assets/field-DNEZExv2.js +1 -0
- autoair/static/standalone/assets/fields-C2BsJi9Z.js +1 -0
- autoair/static/standalone/assets/flex-XuFAO4Ld.js +1 -0
- autoair/static/standalone/assets/for-D1p-wqCI.js +1 -0
- autoair/static/standalone/assets/form-DpMFg957.js +1 -0
- autoair/static/standalone/assets/formSchema-BVrFgQOe.js +9 -0
- autoair/static/standalone/assets/get-styles-CJc5zX7t.js +1 -0
- autoair/static/standalone/assets/gitToken-DQDKcdbD.js +1 -0
- autoair/static/standalone/assets/grid-CGi9dkBZ.js +1 -0
- autoair/static/standalone/assets/group-DZriCpkQ.js +1 -0
- autoair/static/standalone/assets/h-stack-i12rBci4.js +1 -0
- autoair/static/standalone/assets/heading-b6kMcEi8.js +1 -0
- autoair/static/standalone/assets/hooks-CS0jhiGr.js +1 -0
- autoair/static/standalone/assets/i18n-Beg4GSgz.js +3 -0
- autoair/static/standalone/assets/i18nInstance-DuAUdJZQ.js +1 -0
- autoair/static/standalone/assets/icons-TFnRbPpO.js +1 -0
- autoair/static/standalone/assets/index-DLioOiRN.css +1 -0
- autoair/static/standalone/assets/index-DaMECbok.js +60 -0
- autoair/static/standalone/assets/input-BWtzB-ze.js +1 -0
- autoair/static/standalone/assets/input-group-BqDpLxpu.js +1 -0
- autoair/static/standalone/assets/jinja-Cr9Vy0eN.js +2 -0
- autoair/static/standalone/assets/layout-DTftl6J2.js +2 -0
- autoair/static/standalone/assets/layout.worker-DnS1sQOV.js +22 -0
- autoair/static/standalone/assets/lazy-5XqlXuj6.js +2 -0
- autoair/static/standalone/assets/link-L09BNSez.js +1 -0
- autoair/static/standalone/assets/lspClient-CDN3BzWl.js +57 -0
- autoair/static/standalone/assets/lu-CWw9TCTb.js +1 -0
- autoair/static/standalone/assets/markdown-DMf2gzhr.js +2 -0
- autoair/static/standalone/assets/memo-XmL7YvR1.js +1 -0
- autoair/static/standalone/assets/native-select-BthkwD_X.js +1 -0
- autoair/static/standalone/assets/navigate-Bzz39k5L.js +1 -0
- autoair/static/standalone/assets/number-CPyQBOKo.js +1 -0
- autoair/static/standalone/assets/operatorTemplateEditor-BINV8RNh.js +1 -0
- autoair/static/standalone/assets/operatorTemplates-DMyo3BNi.js +1 -0
- autoair/static/standalone/assets/params-CerEUOtF.js +1 -0
- autoair/static/standalone/assets/popover.anatomy-DVci8hMb.js +1 -0
- autoair/static/standalone/assets/preload-helper-CRzLMJPS.js +1 -0
- autoair/static/standalone/assets/press-CSEQog_o.js +1 -0
- autoair/static/standalone/assets/problemMessages-Co0NoWxc.js +1 -0
- autoair/static/standalone/assets/progress-DoXzIeqs.js +1 -0
- autoair/static/standalone/assets/radio-group-RbfXJZB3.js +1 -0
- autoair/static/standalone/assets/radio-group.machine-DFjBiYjF.js +1 -0
- autoair/static/standalone/assets/react-query.gen-Dq5qsG96.js +1 -0
- autoair/static/standalone/assets/render-strategy-BOALSe0p.js +1 -0
- autoair/static/standalone/assets/resize-observer-ytL3XWdn.js +1 -0
- autoair/static/standalone/assets/rolldown-runtime-C0FnF6B9.js +1 -0
- autoair/static/standalone/assets/runOverlay-D4x1nfUg.js +1 -0
- autoair/static/standalone/assets/runState-DIKBRGrv.js +1 -0
- autoair/static/standalone/assets/sdk.gen-Gw52B__2.js +6 -0
- autoair/static/standalone/assets/segment-group-DPnmqhjf.js +1 -0
- autoair/static/standalone/assets/segment-group.anatomy-jUinQ1jW.js +1 -0
- autoair/static/standalone/assets/separator-B9IZTHNG.js +1 -0
- autoair/static/standalone/assets/setup-CENVi_oI.js +1 -0
- autoair/static/standalone/assets/shallow-CDRXdFb2.js +1 -0
- autoair/static/standalone/assets/shell-CKFBo7tG.js +28 -0
- autoair/static/standalone/assets/simple-grid-Bb5WfO1x.js +1 -0
- autoair/static/standalone/assets/stack-Td53-syC.js +1 -0
- autoair/static/standalone/assets/store-D8dgj_pf.js +1 -0
- autoair/static/standalone/assets/switch-aDL_eQZK.js +1 -0
- autoair/static/standalone/assets/table-DNamAymJ.js +1 -0
- autoair/static/standalone/assets/text-CIyPfXsM.js +1 -0
- autoair/static/standalone/assets/textarea-DX87rZvx.js +1 -0
- autoair/static/standalone/assets/toaster-CFjXuhko.js +1 -0
- autoair/static/standalone/assets/use-field-context-B5Yr58zQ.js +1 -0
- autoair/static/standalone/assets/useIsDark-CRFU48KL.js +2 -0
- autoair/static/standalone/assets/useMutation-B8Wgn5DU.js +1 -0
- autoair/static/standalone/assets/useQuery-2ixmv-7W.js +1 -0
- autoair/static/standalone/assets/useTranslation-Dzok3Gzo.js +1 -0
- autoair/static/standalone/assets/visually-hidden-D7cnxjj8.js +1 -0
- autoair/static/standalone/assets/wrap-4VaFdUeF.js +1 -0
- autoair/static/standalone/icon.svg +1 -0
- autoair/static/standalone/index.html +103 -0
- autoair/storage/__init__.py +56 -0
- autoair/storage/base.py +327 -0
- autoair/storage/config.py +797 -0
- autoair/storage/credentials.py +170 -0
- autoair/storage/files.py +321 -0
- autoair/storage/git/__init__.py +24 -0
- autoair/storage/git/azure.py +314 -0
- autoair/storage/git/bitbucket.py +271 -0
- autoair/storage/git/config.py +114 -0
- autoair/storage/git/gitea.py +195 -0
- autoair/storage/git/github.py +410 -0
- autoair/storage/git/gitlab.py +296 -0
- autoair/storage/git/local_git.py +381 -0
- autoair/storage/git/provider.py +125 -0
- autoair/storage/git/target.py +786 -0
- autoair/storage/local.py +205 -0
- autoair/storage/object.py +115 -0
- autoair/storage/render.py +65 -0
- autoair/storage/request_token.py +356 -0
- autoair/telemetry.py +76 -0
- autoair/templates/__init__.py +541 -0
- autoair/templates/builtin.py +434 -0
- autoair/validation/__init__.py +1494 -0
- autoair/validation/dagbag_check.py +87 -0
- autoair/validation/jinja.py +187 -0
- autoair/validation/llm.py +66 -0
- autoair/validation/opa.py +170 -0
- autoair/validation/policy_rules.py +297 -0
- autoair/validation/pool.py +423 -0
- autoair/validation/pylint.py +98 -0
- autoair/validation/raw.py +350 -0
- autoair/validation/shell.py +127 -0
- autoair-0.1.0.dist-info/METADATA +287 -0
- autoair-0.1.0.dist-info/RECORD +731 -0
- autoair-0.1.0.dist-info/WHEEL +4 -0
- autoair-0.1.0.dist-info/entry_points.txt +6 -0
- autoair-0.1.0.dist-info/licenses/LICENSE +202 -0
- autoair-0.1.0.dist-info/licenses/NOTICE +20 -0
autoair/__init__.py
ADDED
autoair/_compat.py
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"""Airflow version detection and import shims (Airflow >= 3.0)."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from functools import lru_cache
|
|
6
|
+
from typing import Any
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@lru_cache(maxsize=1)
|
|
10
|
+
def airflow_version() -> tuple[int, int, int] | None:
|
|
11
|
+
"""Installed Airflow version, or ``None`` when Airflow is not importable."""
|
|
12
|
+
try:
|
|
13
|
+
from importlib.metadata import version
|
|
14
|
+
|
|
15
|
+
raw = version("apache-airflow-core")
|
|
16
|
+
except Exception:
|
|
17
|
+
try:
|
|
18
|
+
from importlib.metadata import version
|
|
19
|
+
|
|
20
|
+
raw = version("apache-airflow")
|
|
21
|
+
except Exception:
|
|
22
|
+
return None
|
|
23
|
+
parts: list[int] = []
|
|
24
|
+
for piece in raw.split(".")[:3]:
|
|
25
|
+
digits = "".join(ch for ch in piece if ch.isdigit())
|
|
26
|
+
parts.append(int(digits or 0))
|
|
27
|
+
while len(parts) < 3:
|
|
28
|
+
parts.append(0)
|
|
29
|
+
return parts[0], parts[1], parts[2]
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def airflow_version_str() -> str | None:
|
|
33
|
+
v = airflow_version()
|
|
34
|
+
return ".".join(map(str, v)) if v else None
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def supports_react_apps() -> bool:
|
|
38
|
+
"""``react_apps`` / ``external_views`` plugin attributes were added in Airflow 3.1."""
|
|
39
|
+
v = airflow_version()
|
|
40
|
+
return v is not None and v >= (3, 1, 0)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def dagbag_class() -> Any:
|
|
44
|
+
"""``DagBag`` moved to ``airflow.dag_processing.dagbag`` in Airflow 3.2."""
|
|
45
|
+
try:
|
|
46
|
+
from airflow.dag_processing.dagbag import DagBag
|
|
47
|
+
except ImportError:
|
|
48
|
+
from airflow.models.dagbag import DagBag
|
|
49
|
+
return DagBag
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def base_operator_classes() -> tuple[type, ...]:
|
|
53
|
+
"""Operator base classes (in Airflow 3 every operator derives from the Task SDK one)."""
|
|
54
|
+
try:
|
|
55
|
+
from airflow.sdk import BaseOperator
|
|
56
|
+
except ImportError:
|
|
57
|
+
return ()
|
|
58
|
+
return (BaseOperator,)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
# Where Task SDK symbols live per Airflow version. Timetables moved into ``airflow.sdk``
|
|
62
|
+
# in 3.2; deadline classes appeared in 3.1 under ``airflow.sdk.definitions.deadline``.
|
|
63
|
+
# Entries: symbol -> [(min_version, module)], newest first.
|
|
64
|
+
_SYMBOL_LOCATIONS: dict[str, list[tuple[tuple[int, int, int], str]]] = {
|
|
65
|
+
**{
|
|
66
|
+
name: [((3, 2, 0), "airflow.sdk"), ((3, 0, 0), module)]
|
|
67
|
+
for name, module in {
|
|
68
|
+
"CronTriggerTimetable": "airflow.timetables.trigger",
|
|
69
|
+
"DeltaTriggerTimetable": "airflow.timetables.trigger",
|
|
70
|
+
"MultipleCronTriggerTimetable": "airflow.timetables.trigger",
|
|
71
|
+
"CronDataIntervalTimetable": "airflow.timetables.interval",
|
|
72
|
+
"DeltaDataIntervalTimetable": "airflow.timetables.interval",
|
|
73
|
+
"EventsTimetable": "airflow.timetables.events",
|
|
74
|
+
"AssetOrTimeSchedule": "airflow.timetables.assets",
|
|
75
|
+
}.items()
|
|
76
|
+
},
|
|
77
|
+
**{
|
|
78
|
+
name: [((3, 2, 0), "airflow.sdk"), ((3, 1, 0), "airflow.sdk.definitions.deadline")]
|
|
79
|
+
for name in ("DeadlineAlert", "DeadlineReference", "AsyncCallback")
|
|
80
|
+
},
|
|
81
|
+
"AssetTriggeredTimetable": [
|
|
82
|
+
((3, 4, 0), "airflow.sdk"),
|
|
83
|
+
((3, 0, 0), "airflow.timetables.simple"),
|
|
84
|
+
],
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
LATEST_KNOWN: tuple[int, int, int] = (3, 4, 0)
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def sdk_symbol_module(name: str, version: tuple[int, int, int] | None = None) -> str:
|
|
91
|
+
"""Module to import an authoring symbol from for the given (or installed) Airflow."""
|
|
92
|
+
version = version or airflow_version() or LATEST_KNOWN
|
|
93
|
+
for min_version, module in _SYMBOL_LOCATIONS.get(name, []):
|
|
94
|
+
if version >= min_version:
|
|
95
|
+
return module
|
|
96
|
+
return "airflow.sdk"
|
autoair/_fs.py
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"""Small filesystem helpers shared by the state stores (templates, icons, settings)."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import contextlib
|
|
6
|
+
import os
|
|
7
|
+
import tempfile
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def atomic_write_bytes(path: Path, data: bytes) -> None:
|
|
13
|
+
"""Write ``path`` so readers see the old or the new content, never a torn file
|
|
14
|
+
(temp file in the same folder + ``os.replace``)."""
|
|
15
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
|
16
|
+
fd, tmp = tempfile.mkstemp(dir=path.parent, prefix=f".{path.name}.", suffix=".tmp")
|
|
17
|
+
try:
|
|
18
|
+
with os.fdopen(fd, "wb") as fh:
|
|
19
|
+
fh.write(data)
|
|
20
|
+
os.replace(tmp, path)
|
|
21
|
+
except BaseException:
|
|
22
|
+
with contextlib.suppress(OSError):
|
|
23
|
+
os.unlink(tmp)
|
|
24
|
+
raise
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def atomic_write_text(path: Path, text: str) -> None:
|
|
28
|
+
atomic_write_bytes(path, text.encode("utf-8"))
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def _is_local(fs: Any) -> bool:
|
|
32
|
+
protocol = fs.protocol if isinstance(fs.protocol, (tuple, list)) else (fs.protocol,)
|
|
33
|
+
return "file" in protocol or "local" in protocol
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def fs_write_bytes(fs: Any, path: str, data: bytes) -> None:
|
|
37
|
+
"""Write through an fsspec filesystem: atomically on local disks (object stores
|
|
38
|
+
replace objects atomically on their own)."""
|
|
39
|
+
if _is_local(fs):
|
|
40
|
+
atomic_write_bytes(Path(path), data)
|
|
41
|
+
return
|
|
42
|
+
fs.makedirs(path.rsplit("/", 1)[0], exist_ok=True)
|
|
43
|
+
fs.pipe_file(path, data)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
__all__ = ["atomic_write_bytes", "atomic_write_text", "fs_write_bytes"]
|
autoair/_subprocess.py
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"""Environment for child processes that execute user-authored DAG code.
|
|
2
|
+
|
|
3
|
+
Import checks, Python DAG imports and test runs execute code written in the builder (or
|
|
4
|
+
uploaded) on the AutoAir host. Those processes need Airflow's configuration, but never
|
|
5
|
+
AutoAir's own credentials (git tokens, LLM API keys, the collaboration HMAC key...),
|
|
6
|
+
which DAG authors must not be able to read from ``os.environ``.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import os
|
|
12
|
+
import re
|
|
13
|
+
from collections.abc import Mapping
|
|
14
|
+
from functools import lru_cache
|
|
15
|
+
|
|
16
|
+
from autoair.sections import SandboxSettings, active
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@lru_cache(maxsize=8)
|
|
20
|
+
def _secret_names(
|
|
21
|
+
patterns: tuple[str, ...], exact: frozenset[str]
|
|
22
|
+
) -> tuple[tuple[re.Pattern[str], ...], frozenset[str]]:
|
|
23
|
+
return tuple(re.compile(p, re.I) for p in patterns if p), exact
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def is_secret_name(name: str) -> bool:
|
|
27
|
+
"""``AUTOAIR_*`` settings holding secrets (nested ones included, e.g.
|
|
28
|
+
``AUTOAIR_STORAGE__GIT__TOKEN``; ``AUTOAIR_SANDBOX__SECRET_ENV_PATTERN``) and provider
|
|
29
|
+
keys read by SDKs directly (``AUTOAIR_SANDBOX__SCRUB_ENV``)."""
|
|
30
|
+
cfg = active(SandboxSettings)
|
|
31
|
+
patterns, exact = _secret_names(
|
|
32
|
+
(cfg.secret_env_pattern, *cfg.secret_env_patterns_extra),
|
|
33
|
+
frozenset(n.upper() for n in (*cfg.scrub_env, *cfg.scrub_env_extra)),
|
|
34
|
+
)
|
|
35
|
+
upper = name.upper()
|
|
36
|
+
return upper in exact or (
|
|
37
|
+
upper.startswith("AUTOAIR_") and any(p.search(upper) for p in patterns)
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def user_code_env(
|
|
42
|
+
extra: Mapping[str, str] | None = None, base: Mapping[str, str] | None = None
|
|
43
|
+
) -> dict[str, str]:
|
|
44
|
+
"""``base`` (default ``os.environ``) without AutoAir secrets, plus ``extra``."""
|
|
45
|
+
env = {k: v for k, v in (os.environ if base is None else base).items() if not is_secret_name(k)}
|
|
46
|
+
env.update(extra or {})
|
|
47
|
+
return env
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
__all__ = ["is_secret_name", "user_code_env"]
|
autoair/admin.py
ADDED
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
"""Admin panel back end: users seen, AI usage, pending proposals, cache and database status.
|
|
2
|
+
|
|
3
|
+
The routes live in :mod:`autoair.api.routers.admin`; this module holds the logic so it is
|
|
4
|
+
shared by the API and tests, and works on both state backends (files / SQL database).
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import contextlib
|
|
10
|
+
import csv
|
|
11
|
+
import datetime
|
|
12
|
+
import hashlib
|
|
13
|
+
import io
|
|
14
|
+
import json
|
|
15
|
+
import logging
|
|
16
|
+
import threading
|
|
17
|
+
import time
|
|
18
|
+
from collections.abc import Iterable
|
|
19
|
+
from typing import Any
|
|
20
|
+
|
|
21
|
+
from pydantic import BaseModel, Field
|
|
22
|
+
|
|
23
|
+
from autoair.audit import AuditRecord
|
|
24
|
+
from autoair.persistence import document_store
|
|
25
|
+
from autoair.persistence.documents import DocumentStore
|
|
26
|
+
|
|
27
|
+
log = logging.getLogger("autoair.admin")
|
|
28
|
+
|
|
29
|
+
USER_SEEN_INTERVAL = 300.0 # seconds between two "seen" writes for one user and process
|
|
30
|
+
USAGE_SCAN_LIMIT = 20000 # AI audit records aggregated on the file backend
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class SeenUser(BaseModel):
|
|
34
|
+
user: str
|
|
35
|
+
roles: list[str] = Field(default_factory=list, description="AutoAir roles when last seen.")
|
|
36
|
+
permissions: int = Field(default=0, description="Number of AutoAir permissions held.")
|
|
37
|
+
auth: str | None = None
|
|
38
|
+
last_seen: str | None = None
|
|
39
|
+
actions: int = Field(default=0, description="Audit records (recent window).")
|
|
40
|
+
last_action: str | None = None
|
|
41
|
+
last_action_at: str | None = None
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class UsageRow(BaseModel):
|
|
45
|
+
user: str | None
|
|
46
|
+
provider: str | None = None
|
|
47
|
+
model: str | None = None
|
|
48
|
+
requests: int = 0
|
|
49
|
+
input_tokens: int = 0
|
|
50
|
+
output_tokens: int = 0
|
|
51
|
+
cost_usd: float | None = None
|
|
52
|
+
errors: int = 0
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
# --------------------------------------------------------------------------- users seen
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def users_store(settings: Any) -> DocumentStore:
|
|
59
|
+
return document_store(settings, "users_seen", file_url=str(settings.state_dir / "users"))
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def _user_key(user: str) -> str:
|
|
63
|
+
return hashlib.sha256(user.encode()).hexdigest()[:40]
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
class SeenUsers:
|
|
67
|
+
"""Remembers who used AutoAir and with which roles (throttled per user and process)."""
|
|
68
|
+
|
|
69
|
+
def __init__(self, store: DocumentStore, interval: float = USER_SEEN_INTERVAL) -> None:
|
|
70
|
+
self.store = store
|
|
71
|
+
self.interval = interval
|
|
72
|
+
self._last: dict[str, float] = {}
|
|
73
|
+
self._lock = threading.Lock()
|
|
74
|
+
|
|
75
|
+
def due(self, user: str, now: float | None = None) -> bool:
|
|
76
|
+
now = time.monotonic() if now is None else now
|
|
77
|
+
with self._lock:
|
|
78
|
+
if now - self._last.get(user, -1e18) < self.interval:
|
|
79
|
+
return False
|
|
80
|
+
self._last[user] = now
|
|
81
|
+
if len(self._last) > 10_000:
|
|
82
|
+
self._last.clear()
|
|
83
|
+
return True
|
|
84
|
+
|
|
85
|
+
def record(self, user: str, *, roles: Iterable[str], permissions: int, auth: str) -> None:
|
|
86
|
+
payload = {
|
|
87
|
+
"user": user,
|
|
88
|
+
"roles": sorted(set(roles)),
|
|
89
|
+
"permissions": permissions,
|
|
90
|
+
"auth": auth,
|
|
91
|
+
"last_seen": datetime.datetime.now(datetime.timezone.utc).isoformat(),
|
|
92
|
+
}
|
|
93
|
+
self.store.put(_user_key(user), json.dumps(payload).encode())
|
|
94
|
+
|
|
95
|
+
def all(self) -> list[SeenUser]:
|
|
96
|
+
out: list[SeenUser] = []
|
|
97
|
+
for key in self.store.keys(): # noqa: SIM118 - a DocumentStore, not a dict
|
|
98
|
+
found = self.store.get(key)
|
|
99
|
+
if found is None:
|
|
100
|
+
continue
|
|
101
|
+
try:
|
|
102
|
+
out.append(SeenUser.model_validate_json(found.data))
|
|
103
|
+
except ValueError:
|
|
104
|
+
continue
|
|
105
|
+
return out
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def seen_users_for(services: Any) -> SeenUsers:
|
|
109
|
+
existing = getattr(services, "_autoair_seen_users", None)
|
|
110
|
+
if isinstance(existing, SeenUsers):
|
|
111
|
+
return existing
|
|
112
|
+
created = SeenUsers(users_store(services.settings))
|
|
113
|
+
with contextlib.suppress(AttributeError, TypeError):
|
|
114
|
+
services._autoair_seen_users = created
|
|
115
|
+
return created
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def users_overview(seen: list[SeenUser], audit: list[AuditRecord]) -> list[SeenUser]:
|
|
119
|
+
"""Users seen by the API merged with the users found in ``audit`` (newest first)."""
|
|
120
|
+
by_user: dict[str, SeenUser] = {u.user: u.model_copy() for u in seen}
|
|
121
|
+
for rec in audit:
|
|
122
|
+
if not rec.user:
|
|
123
|
+
continue
|
|
124
|
+
item = by_user.setdefault(rec.user, SeenUser(user=rec.user))
|
|
125
|
+
item.actions += 1
|
|
126
|
+
if item.last_action_at is None or rec.timestamp > item.last_action_at:
|
|
127
|
+
item.last_action_at = rec.timestamp
|
|
128
|
+
item.last_action = rec.action
|
|
129
|
+
return sorted(
|
|
130
|
+
by_user.values(),
|
|
131
|
+
key=lambda u: max(u.last_seen or "", u.last_action_at or ""),
|
|
132
|
+
reverse=True,
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
# --------------------------------------------------------------------------- audit export
|
|
137
|
+
|
|
138
|
+
CSV_FIELDS = ("timestamp", "action", "user", "dag_id", "details")
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def audit_csv(records: Iterable[AuditRecord]) -> str:
|
|
142
|
+
buf = io.StringIO()
|
|
143
|
+
writer = csv.writer(buf)
|
|
144
|
+
writer.writerow(CSV_FIELDS)
|
|
145
|
+
for rec in records:
|
|
146
|
+
writer.writerow(
|
|
147
|
+
[
|
|
148
|
+
rec.timestamp,
|
|
149
|
+
_cell(rec.action),
|
|
150
|
+
_cell(rec.user or ""),
|
|
151
|
+
_cell(rec.dag_id or ""),
|
|
152
|
+
_cell(json.dumps(rec.details, sort_keys=True, default=str)),
|
|
153
|
+
]
|
|
154
|
+
)
|
|
155
|
+
return buf.getvalue()
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
def _cell(text: str) -> str:
|
|
159
|
+
"""Neutralise spreadsheet formulas (CSV injection): a leading = + - @ becomes text."""
|
|
160
|
+
return f"'{text}" if text[:1] in ("=", "+", "-", "@", "\t", "\r") else text
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
# --------------------------------------------------------------------------- AI usage
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
def aggregate_usage(records: Iterable[Any]) -> list[UsageRow]:
|
|
167
|
+
"""Requests, tokens and cost per (user, provider, model) of AI audit records."""
|
|
168
|
+
rows: dict[tuple[str | None, str | None, str | None], UsageRow] = {}
|
|
169
|
+
for rec in records:
|
|
170
|
+
key = (rec.user, rec.provider, rec.model)
|
|
171
|
+
row = rows.setdefault(key, UsageRow(user=rec.user, provider=rec.provider, model=rec.model))
|
|
172
|
+
usage = rec.usage
|
|
173
|
+
row.requests += 1
|
|
174
|
+
row.input_tokens += usage.input_tokens + usage.cache_read_tokens + usage.cache_write_tokens
|
|
175
|
+
row.output_tokens += usage.output_tokens
|
|
176
|
+
if usage.cost_usd is not None:
|
|
177
|
+
row.cost_usd = round((row.cost_usd or 0.0) + usage.cost_usd, 8)
|
|
178
|
+
if rec.outcome != "ok":
|
|
179
|
+
row.errors += 1
|
|
180
|
+
return sorted(rows.values(), key=lambda r: (-(r.cost_usd or 0), -r.requests))
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
def usage_rows(raw: Iterable[dict[str, Any]]) -> list[UsageRow]:
|
|
184
|
+
out = [
|
|
185
|
+
UsageRow(
|
|
186
|
+
user=r.get("user"),
|
|
187
|
+
provider=r.get("provider"),
|
|
188
|
+
model=r.get("model"),
|
|
189
|
+
requests=int(r.get("requests") or 0),
|
|
190
|
+
input_tokens=int(r.get("input_tokens") or 0),
|
|
191
|
+
output_tokens=int(r.get("output_tokens") or 0),
|
|
192
|
+
cost_usd=float(r["cost_usd"]) if r.get("cost_usd") is not None else None,
|
|
193
|
+
errors=int(r.get("errors") or 0),
|
|
194
|
+
)
|
|
195
|
+
for r in raw
|
|
196
|
+
]
|
|
197
|
+
return sorted(out, key=lambda r: (-(r.cost_usd or 0), -r.requests))
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
# --------------------------------------------------------------------------- proposals
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
def all_pending_proposals(store: Any) -> list[Any]:
|
|
204
|
+
"""Pending proposals of every DAG (SQL store: one query; file store: a scan)."""
|
|
205
|
+
if store is None:
|
|
206
|
+
return []
|
|
207
|
+
listing = getattr(store, "all_pending", None)
|
|
208
|
+
if callable(listing):
|
|
209
|
+
return list(listing())
|
|
210
|
+
fs = getattr(store, "fs", None)
|
|
211
|
+
root = getattr(store, "root", None)
|
|
212
|
+
if fs is None or root is None:
|
|
213
|
+
return []
|
|
214
|
+
try:
|
|
215
|
+
dirs = fs.ls(root, detail=False)
|
|
216
|
+
except (FileNotFoundError, OSError):
|
|
217
|
+
return []
|
|
218
|
+
out: list[Any] = []
|
|
219
|
+
for path in dirs:
|
|
220
|
+
dag_id = str(path).rstrip("/").rsplit("/", 1)[-1]
|
|
221
|
+
try:
|
|
222
|
+
out.extend(store.pending(dag_id))
|
|
223
|
+
except Exception:
|
|
224
|
+
log.debug("skipping proposals of %s", dag_id, exc_info=True)
|
|
225
|
+
return sorted(out, key=lambda p: p.timestamp, reverse=True)
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
__all__ = [
|
|
229
|
+
"SeenUser",
|
|
230
|
+
"SeenUsers",
|
|
231
|
+
"UsageRow",
|
|
232
|
+
"aggregate_usage",
|
|
233
|
+
"all_pending_proposals",
|
|
234
|
+
"audit_csv",
|
|
235
|
+
"seen_users_for",
|
|
236
|
+
"usage_rows",
|
|
237
|
+
"users_overview",
|
|
238
|
+
]
|
autoair/ai/__init__.py
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"""AutoAir AI: DAG generation, review / leak scan / optimise / fix features, retrieval
|
|
2
|
+
(RAG), research, writers, guardrails, memory and tool-using agents on pydantic-ai.
|
|
3
|
+
|
|
4
|
+
Everything is imported lazily (PEP 562): ``autoair.settings`` imports
|
|
5
|
+
:mod:`autoair.ai.config` at start-up, and the plugin / server must start without the
|
|
6
|
+
optional ``autoair[ai]`` extra (pydantic-ai).
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import importlib
|
|
12
|
+
from typing import TYPE_CHECKING, Any
|
|
13
|
+
|
|
14
|
+
if TYPE_CHECKING:
|
|
15
|
+
from autoair.ai.findings import Finding, FindingsReport, PatchOp, apply_findings, apply_patch
|
|
16
|
+
from autoair.ai.generator import (
|
|
17
|
+
GenerationResult,
|
|
18
|
+
describe_dag,
|
|
19
|
+
explain_problems,
|
|
20
|
+
generate_spec,
|
|
21
|
+
rank_operators,
|
|
22
|
+
select_operators,
|
|
23
|
+
)
|
|
24
|
+
from autoair.ai.llm import (
|
|
25
|
+
DEFAULT_MODEL,
|
|
26
|
+
LLM,
|
|
27
|
+
ChatMessage,
|
|
28
|
+
LLMError,
|
|
29
|
+
ModelConfig,
|
|
30
|
+
build_embedder,
|
|
31
|
+
build_llm,
|
|
32
|
+
provider_config,
|
|
33
|
+
)
|
|
34
|
+
from autoair.ai.problems import SpecCheck, SpecProblem, check_spec
|
|
35
|
+
from autoair.ai.usage import Usage, track_usage
|
|
36
|
+
|
|
37
|
+
_EXPORTS: dict[str, str] = {
|
|
38
|
+
"Finding": "autoair.ai.findings",
|
|
39
|
+
"FindingsReport": "autoair.ai.findings",
|
|
40
|
+
"PatchOp": "autoair.ai.findings",
|
|
41
|
+
"apply_findings": "autoair.ai.findings",
|
|
42
|
+
"apply_patch": "autoair.ai.findings",
|
|
43
|
+
"GenerationResult": "autoair.ai.generator",
|
|
44
|
+
"describe_dag": "autoair.ai.generator",
|
|
45
|
+
"explain_problems": "autoair.ai.generator",
|
|
46
|
+
"generate_spec": "autoair.ai.generator",
|
|
47
|
+
"rank_operators": "autoair.ai.generator",
|
|
48
|
+
"select_operators": "autoair.ai.generator",
|
|
49
|
+
"DEFAULT_MODEL": "autoair.ai.llm",
|
|
50
|
+
"LLM": "autoair.ai.llm",
|
|
51
|
+
"ChatMessage": "autoair.ai.llm",
|
|
52
|
+
"LLMError": "autoair.ai.llm",
|
|
53
|
+
"ModelConfig": "autoair.ai.llm",
|
|
54
|
+
"build_embedder": "autoair.ai.llm",
|
|
55
|
+
"build_llm": "autoair.ai.llm",
|
|
56
|
+
"provider_config": "autoair.ai.llm",
|
|
57
|
+
"SpecCheck": "autoair.ai.problems",
|
|
58
|
+
"SpecProblem": "autoair.ai.problems",
|
|
59
|
+
"check_spec": "autoair.ai.problems",
|
|
60
|
+
"Usage": "autoair.ai.usage",
|
|
61
|
+
"track_usage": "autoair.ai.usage",
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def __getattr__(name: str) -> Any:
|
|
66
|
+
module = _EXPORTS.get(name)
|
|
67
|
+
if module is None:
|
|
68
|
+
raise AttributeError(f"module 'autoair.ai' has no attribute {name!r}")
|
|
69
|
+
value = getattr(importlib.import_module(module), name)
|
|
70
|
+
globals()[name] = value
|
|
71
|
+
return value
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
__all__ = [
|
|
75
|
+
"DEFAULT_MODEL",
|
|
76
|
+
"LLM",
|
|
77
|
+
"ChatMessage",
|
|
78
|
+
"Finding",
|
|
79
|
+
"FindingsReport",
|
|
80
|
+
"GenerationResult",
|
|
81
|
+
"LLMError",
|
|
82
|
+
"ModelConfig",
|
|
83
|
+
"PatchOp",
|
|
84
|
+
"SpecCheck",
|
|
85
|
+
"SpecProblem",
|
|
86
|
+
"Usage",
|
|
87
|
+
"apply_findings",
|
|
88
|
+
"apply_patch",
|
|
89
|
+
"build_embedder",
|
|
90
|
+
"build_llm",
|
|
91
|
+
"check_spec",
|
|
92
|
+
"describe_dag",
|
|
93
|
+
"explain_problems",
|
|
94
|
+
"generate_spec",
|
|
95
|
+
"provider_config",
|
|
96
|
+
"rank_operators",
|
|
97
|
+
"select_operators",
|
|
98
|
+
"track_usage",
|
|
99
|
+
]
|