stackos-connectors 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.
- stackos_connectors/__init__.py +99 -0
- stackos_connectors/catalog/index.json +54 -0
- stackos_connectors/catalog/schema.json +80 -0
- stackos_connectors/catalog.py +160 -0
- stackos_connectors/connectors/__init__.py +1 -0
- stackos_connectors/connectors/ahrefs/__init__.py +1 -0
- stackos_connectors/connectors/ahrefs/actions.py +107 -0
- stackos_connectors/connectors/ahrefs/assets/icon.png +0 -0
- stackos_connectors/connectors/ahrefs/catalog.json +186 -0
- stackos_connectors/connectors/ahrefs/integration.py +184 -0
- stackos_connectors/connectors/aignc/__init__.py +1 -0
- stackos_connectors/connectors/aignc/actions.py +82 -0
- stackos_connectors/connectors/aignc/catalog.json +662 -0
- stackos_connectors/connectors/aignc/contract.py +31 -0
- stackos_connectors/connectors/aignc/docs/aignc.md +33 -0
- stackos_connectors/connectors/aignc/integration.py +572 -0
- stackos_connectors/connectors/alibaba_wan/__init__.py +1 -0
- stackos_connectors/connectors/alibaba_wan/actions.py +85 -0
- stackos_connectors/connectors/alibaba_wan/assets/icon.png +0 -0
- stackos_connectors/connectors/alibaba_wan/catalog.json +221 -0
- stackos_connectors/connectors/alibaba_wan/integration.py +392 -0
- stackos_connectors/connectors/apollo/__init__.py +1 -0
- stackos_connectors/connectors/apollo/actions.py +213 -0
- stackos_connectors/connectors/apollo/assets/icon.png +0 -0
- stackos_connectors/connectors/apollo/catalog.json +313 -0
- stackos_connectors/connectors/apollo/docs/protocol.md +19 -0
- stackos_connectors/connectors/aws_s3/__init__.py +1 -0
- stackos_connectors/connectors/aws_s3/actions.py +3082 -0
- stackos_connectors/connectors/aws_s3/assets/icon.png +0 -0
- stackos_connectors/connectors/aws_s3/catalog.json +1048 -0
- stackos_connectors/connectors/aws_s3/contract.py +89 -0
- stackos_connectors/connectors/aws_s3/docs/s3.md +49 -0
- stackos_connectors/connectors/aws_s3/integration.py +369 -0
- stackos_connectors/connectors/byteplus_seedance/__init__.py +1 -0
- stackos_connectors/connectors/byteplus_seedance/actions.py +85 -0
- stackos_connectors/connectors/byteplus_seedance/catalog.json +246 -0
- stackos_connectors/connectors/byteplus_seedream/__init__.py +1 -0
- stackos_connectors/connectors/byteplus_seedream/actions.py +88 -0
- stackos_connectors/connectors/byteplus_seedream/catalog.json +292 -0
- stackos_connectors/connectors/clay/__init__.py +1 -0
- stackos_connectors/connectors/clay/actions.py +100 -0
- stackos_connectors/connectors/clay/assets/icon.png +0 -0
- stackos_connectors/connectors/clay/catalog.json +139 -0
- stackos_connectors/connectors/clay/docs/protocol.md +16 -0
- stackos_connectors/connectors/cloudflare/__init__.py +1 -0
- stackos_connectors/connectors/cloudflare/actions.py +705 -0
- stackos_connectors/connectors/cloudflare/assets/icon.png +0 -0
- stackos_connectors/connectors/cloudflare/catalog.json +6381 -0
- stackos_connectors/connectors/cloudflare/docs/cloudflare-dns.md +37 -0
- stackos_connectors/connectors/cloudflare/integration.py +397 -0
- stackos_connectors/connectors/dataforseo/__init__.py +1 -0
- stackos_connectors/connectors/dataforseo/actions.py +147 -0
- stackos_connectors/connectors/dataforseo/assets/icon.jpeg +0 -0
- stackos_connectors/connectors/dataforseo/catalog.json +1275 -0
- stackos_connectors/connectors/dataforseo/integration.py +252 -0
- stackos_connectors/connectors/firecrawl/__init__.py +1 -0
- stackos_connectors/connectors/firecrawl/actions.py +100 -0
- stackos_connectors/connectors/firecrawl/assets/icon.png +0 -0
- stackos_connectors/connectors/firecrawl/catalog.json +189 -0
- stackos_connectors/connectors/firecrawl/integration.py +168 -0
- stackos_connectors/connectors/ftp/__init__.py +1 -0
- stackos_connectors/connectors/ftp/actions.py +1190 -0
- stackos_connectors/connectors/ftp/assets/icon.svg +7 -0
- stackos_connectors/connectors/ftp/catalog.json +1091 -0
- stackos_connectors/connectors/ftp/docs/ftp.md +40 -0
- stackos_connectors/connectors/ftp/integration.py +271 -0
- stackos_connectors/connectors/ftp/remote_tree.py +342 -0
- stackos_connectors/connectors/ghost/__init__.py +1 -0
- stackos_connectors/connectors/ghost/actions.py +80 -0
- stackos_connectors/connectors/ghost/assets/icon.png +0 -0
- stackos_connectors/connectors/ghost/catalog.json +214 -0
- stackos_connectors/connectors/ghost/integration.py +159 -0
- stackos_connectors/connectors/google_ads/__init__.py +1 -0
- stackos_connectors/connectors/google_ads/actions.py +279 -0
- stackos_connectors/connectors/google_ads/assets/icon.png +0 -0
- stackos_connectors/connectors/google_ads/catalog.json +797 -0
- stackos_connectors/connectors/google_ads/docs/protocol.md +22 -0
- stackos_connectors/connectors/google_analytics/__init__.py +1 -0
- stackos_connectors/connectors/google_analytics/actions.py +224 -0
- stackos_connectors/connectors/google_analytics/assets/icon.png +0 -0
- stackos_connectors/connectors/google_analytics/catalog.json +442 -0
- stackos_connectors/connectors/google_analytics/integration.py +112 -0
- stackos_connectors/connectors/google_gemini_image/__init__.py +1 -0
- stackos_connectors/connectors/google_gemini_image/actions.py +90 -0
- stackos_connectors/connectors/google_gemini_image/assets/icon.webp +0 -0
- stackos_connectors/connectors/google_gemini_image/catalog.json +275 -0
- stackos_connectors/connectors/google_gemini_image/integration.py +420 -0
- stackos_connectors/connectors/google_indexing/__init__.py +1 -0
- stackos_connectors/connectors/google_indexing/actions.py +148 -0
- stackos_connectors/connectors/google_indexing/catalog.json +224 -0
- stackos_connectors/connectors/google_indexing/docs/google-indexing.md +38 -0
- stackos_connectors/connectors/google_indexing/integration.py +261 -0
- stackos_connectors/connectors/google_search_console/__init__.py +1 -0
- stackos_connectors/connectors/google_search_console/actions.py +486 -0
- stackos_connectors/connectors/google_search_console/assets/icon.png +0 -0
- stackos_connectors/connectors/google_search_console/catalog.json +714 -0
- stackos_connectors/connectors/google_search_console/docs/google-search-console.md +37 -0
- stackos_connectors/connectors/google_search_console/integration.py +367 -0
- stackos_connectors/connectors/google_tag_manager/__init__.py +1 -0
- stackos_connectors/connectors/google_tag_manager/actions.py +241 -0
- stackos_connectors/connectors/google_tag_manager/assets/icon.png +0 -0
- stackos_connectors/connectors/google_tag_manager/catalog.json +477 -0
- stackos_connectors/connectors/google_tag_manager/integration.py +133 -0
- stackos_connectors/connectors/google_veo/__init__.py +1 -0
- stackos_connectors/connectors/google_veo/actions.py +85 -0
- stackos_connectors/connectors/google_veo/assets/icon.png +0 -0
- stackos_connectors/connectors/google_veo/catalog.json +211 -0
- stackos_connectors/connectors/google_veo/integration.py +337 -0
- stackos_connectors/connectors/google_workspace/__init__.py +1 -0
- stackos_connectors/connectors/google_workspace/actions.py +148 -0
- stackos_connectors/connectors/google_workspace/assets/icon.png +0 -0
- stackos_connectors/connectors/google_workspace/catalog.json +302 -0
- stackos_connectors/connectors/google_workspace/docs/protocol.md +19 -0
- stackos_connectors/connectors/http/__init__.py +1 -0
- stackos_connectors/connectors/http/actions.py +280 -0
- stackos_connectors/connectors/http/catalog.json +100 -0
- stackos_connectors/connectors/hubspot/__init__.py +1 -0
- stackos_connectors/connectors/hubspot/actions.py +144 -0
- stackos_connectors/connectors/hubspot/assets/icon.png +0 -0
- stackos_connectors/connectors/hubspot/catalog.json +4959 -0
- stackos_connectors/connectors/hubspot/contract.py +534 -0
- stackos_connectors/connectors/hubspot/docs/hubspot.md +41 -0
- stackos_connectors/connectors/hubspot/integration.py +209 -0
- stackos_connectors/connectors/ideogram/__init__.py +1 -0
- stackos_connectors/connectors/ideogram/actions.py +88 -0
- stackos_connectors/connectors/ideogram/assets/icon.png +0 -0
- stackos_connectors/connectors/ideogram/catalog.json +282 -0
- stackos_connectors/connectors/ideogram/integration.py +310 -0
- stackos_connectors/connectors/imap/__init__.py +1 -0
- stackos_connectors/connectors/imap/actions.py +1186 -0
- stackos_connectors/connectors/imap/assets/icon.svg +7 -0
- stackos_connectors/connectors/imap/catalog.json +520 -0
- stackos_connectors/connectors/imap/docs/protocol.md +19 -0
- stackos_connectors/connectors/imap/integration.py +300 -0
- stackos_connectors/connectors/jina/__init__.py +1 -0
- stackos_connectors/connectors/jina/actions.py +57 -0
- stackos_connectors/connectors/jina/assets/icon.png +0 -0
- stackos_connectors/connectors/jina/catalog.json +102 -0
- stackos_connectors/connectors/jina/integration.py +63 -0
- stackos_connectors/connectors/kling_video/__init__.py +1 -0
- stackos_connectors/connectors/kling_video/actions.py +86 -0
- stackos_connectors/connectors/kling_video/assets/icon.png +0 -0
- stackos_connectors/connectors/kling_video/catalog.json +232 -0
- stackos_connectors/connectors/kling_video/integration.py +413 -0
- stackos_connectors/connectors/linear/__init__.py +1 -0
- stackos_connectors/connectors/linear/actions.py +103 -0
- stackos_connectors/connectors/linear/assets/graphql/auth/viewer-organization.graphql +10 -0
- stackos_connectors/connectors/linear/assets/graphql/comments/create.graphql +25 -0
- stackos_connectors/connectors/linear/assets/graphql/comments/delete.graphql +6 -0
- stackos_connectors/connectors/linear/assets/graphql/comments/get.graphql +25 -0
- stackos_connectors/connectors/linear/assets/graphql/comments/list.graphql +45 -0
- stackos_connectors/connectors/linear/assets/graphql/comments/resolve.graphql +11 -0
- stackos_connectors/connectors/linear/assets/graphql/comments/unresolve.graphql +11 -0
- stackos_connectors/connectors/linear/assets/graphql/comments/update.graphql +14 -0
- stackos_connectors/connectors/linear/assets/graphql/cycles/get.graphql +17 -0
- stackos_connectors/connectors/linear/assets/graphql/cycles/list.graphql +37 -0
- stackos_connectors/connectors/linear/assets/graphql/issue-labels/get.graphql +15 -0
- stackos_connectors/connectors/linear/assets/graphql/issue-labels/list.graphql +35 -0
- stackos_connectors/connectors/linear/assets/graphql/issue-relations/create.graphql +21 -0
- stackos_connectors/connectors/linear/assets/graphql/issue-relations/delete.graphql +6 -0
- stackos_connectors/connectors/linear/assets/graphql/issue-relations/get.graphql +19 -0
- stackos_connectors/connectors/linear/assets/graphql/issue-relations/list.graphql +42 -0
- stackos_connectors/connectors/linear/assets/graphql/issue-relations/update.graphql +21 -0
- stackos_connectors/connectors/linear/assets/graphql/issues/add-label.graphql +17 -0
- stackos_connectors/connectors/linear/assets/graphql/issues/archive.graphql +11 -0
- stackos_connectors/connectors/linear/assets/graphql/issues/create.graphql +27 -0
- stackos_connectors/connectors/linear/assets/graphql/issues/get.graphql +51 -0
- stackos_connectors/connectors/linear/assets/graphql/issues/list.graphql +71 -0
- stackos_connectors/connectors/linear/assets/graphql/issues/remove-label.graphql +17 -0
- stackos_connectors/connectors/linear/assets/graphql/issues/search.graphql +62 -0
- stackos_connectors/connectors/linear/assets/graphql/issues/unarchive.graphql +11 -0
- stackos_connectors/connectors/linear/assets/graphql/issues/update.graphql +23 -0
- stackos_connectors/connectors/linear/assets/graphql/projects/get.graphql +18 -0
- stackos_connectors/connectors/linear/assets/graphql/projects/list.graphql +38 -0
- stackos_connectors/connectors/linear/assets/graphql/teams/get.graphql +12 -0
- stackos_connectors/connectors/linear/assets/graphql/teams/list.graphql +30 -0
- stackos_connectors/connectors/linear/assets/graphql/users/get.graphql +10 -0
- stackos_connectors/connectors/linear/assets/graphql/users/list.graphql +30 -0
- stackos_connectors/connectors/linear/assets/graphql/viewer/get.graphql +14 -0
- stackos_connectors/connectors/linear/assets/graphql/workflow-states/get.graphql +16 -0
- stackos_connectors/connectors/linear/assets/graphql/workflow-states/list.graphql +36 -0
- stackos_connectors/connectors/linear/assets/icon.png +0 -0
- stackos_connectors/connectors/linear/catalog.json +2794 -0
- stackos_connectors/connectors/linear/contract.py +101 -0
- stackos_connectors/connectors/linear/docs/linear.md +35 -0
- stackos_connectors/connectors/linear/integration.py +518 -0
- stackos_connectors/connectors/linear/schemas/introspection-2026-07-23.json +1 -0
- stackos_connectors/connectors/linear/schemas/introspection-2026-07-23.metadata.json +18 -0
- stackos_connectors/connectors/linear/schemas/root-policy-2026-07-23.json +552 -0
- stackos_connectors/connectors/meta_ads/__init__.py +1 -0
- stackos_connectors/connectors/meta_ads/actions.py +357 -0
- stackos_connectors/connectors/meta_ads/assets/icon.png +0 -0
- stackos_connectors/connectors/meta_ads/catalog.json +977 -0
- stackos_connectors/connectors/microsoft_365/__init__.py +1 -0
- stackos_connectors/connectors/microsoft_365/actions.py +121 -0
- stackos_connectors/connectors/microsoft_365/assets/icon.png +0 -0
- stackos_connectors/connectors/microsoft_365/catalog.json +261 -0
- stackos_connectors/connectors/microsoft_365/docs/protocol.md +17 -0
- stackos_connectors/connectors/openai_images/__init__.py +1 -0
- stackos_connectors/connectors/openai_images/actions.py +85 -0
- stackos_connectors/connectors/openai_images/assets/icon.webp +0 -0
- stackos_connectors/connectors/openai_images/catalog.json +282 -0
- stackos_connectors/connectors/openai_images/integration.py +327 -0
- stackos_connectors/connectors/openrouter/__init__.py +1 -0
- stackos_connectors/connectors/openrouter/assets/icon.png +0 -0
- stackos_connectors/connectors/openrouter/catalog.json +114 -0
- stackos_connectors/connectors/openrouter/integration.py +69 -0
- stackos_connectors/connectors/outreach/__init__.py +1 -0
- stackos_connectors/connectors/outreach/actions.py +107 -0
- stackos_connectors/connectors/outreach/assets/icon.png +0 -0
- stackos_connectors/connectors/outreach/catalog.json +197 -0
- stackos_connectors/connectors/outreach/docs/protocol.md +18 -0
- stackos_connectors/connectors/pipedrive/__init__.py +1 -0
- stackos_connectors/connectors/pipedrive/actions.py +173 -0
- stackos_connectors/connectors/pipedrive/assets/icon.png +0 -0
- stackos_connectors/connectors/pipedrive/catalog.json +449 -0
- stackos_connectors/connectors/pipedrive/docs/protocol.md +22 -0
- stackos_connectors/connectors/pipedrive/integration.py +160 -0
- stackos_connectors/connectors/reddit/__init__.py +1 -0
- stackos_connectors/connectors/reddit/actions.py +85 -0
- stackos_connectors/connectors/reddit/assets/icon.png +0 -0
- stackos_connectors/connectors/reddit/catalog.json +173 -0
- stackos_connectors/connectors/reddit/integration.py +117 -0
- stackos_connectors/connectors/reve/__init__.py +1 -0
- stackos_connectors/connectors/reve/actions.py +89 -0
- stackos_connectors/connectors/reve/assets/icon.png +0 -0
- stackos_connectors/connectors/reve/catalog.json +354 -0
- stackos_connectors/connectors/reve/integration.py +463 -0
- stackos_connectors/connectors/salesforce/__init__.py +1 -0
- stackos_connectors/connectors/salesforce/actions.py +173 -0
- stackos_connectors/connectors/salesforce/assets/icon.png +0 -0
- stackos_connectors/connectors/salesforce/catalog.json +490 -0
- stackos_connectors/connectors/salesforce/docs/protocol.md +17 -0
- stackos_connectors/connectors/salesloft/__init__.py +1 -0
- stackos_connectors/connectors/salesloft/actions.py +96 -0
- stackos_connectors/connectors/salesloft/assets/icon.jpeg +0 -0
- stackos_connectors/connectors/salesloft/catalog.json +239 -0
- stackos_connectors/connectors/salesloft/docs/protocol.md +17 -0
- stackos_connectors/connectors/salesloft/integration.py +119 -0
- stackos_connectors/connectors/serper/__init__.py +1 -0
- stackos_connectors/connectors/serper/actions.py +71 -0
- stackos_connectors/connectors/serper/assets/icon.svg +6 -0
- stackos_connectors/connectors/serper/catalog.json +124 -0
- stackos_connectors/connectors/serper/integration.py +83 -0
- stackos_connectors/connectors/shopify/__init__.py +1 -0
- stackos_connectors/connectors/shopify/actions.py +430 -0
- stackos_connectors/connectors/shopify/assets/graphql/customers/add-customer-tag.graphql +11 -0
- stackos_connectors/connectors/shopify/assets/graphql/customers/create-customer.graphql +24 -0
- stackos_connectors/connectors/shopify/assets/graphql/customers/get-customer-lifetime-value.graphql +30 -0
- stackos_connectors/connectors/shopify/assets/graphql/customers/get-customer-orders.graphql +27 -0
- stackos_connectors/connectors/shopify/assets/graphql/customers/get-customer.graphql +45 -0
- stackos_connectors/connectors/shopify/assets/graphql/customers/list-customers.graphql +29 -0
- stackos_connectors/connectors/shopify/assets/graphql/customers/remove-customer-tag.graphql +11 -0
- stackos_connectors/connectors/shopify/assets/graphql/customers/search-customers.graphql +29 -0
- stackos_connectors/connectors/shopify/assets/graphql/customers/update-customer.graphql +24 -0
- stackos_connectors/connectors/shopify/assets/graphql/inventory/adjust-inventory.graphql +25 -0
- stackos_connectors/connectors/shopify/assets/graphql/inventory/get-inventory-by-sku.graphql +28 -0
- stackos_connectors/connectors/shopify/assets/graphql/inventory/get-inventory-item.graphql +26 -0
- stackos_connectors/connectors/shopify/assets/graphql/inventory/get-location-inventory.graphql +26 -0
- stackos_connectors/connectors/shopify/assets/graphql/inventory/list-inventory-item-availability.graphql +40 -0
- stackos_connectors/connectors/shopify/assets/graphql/inventory/list-inventory-levels.graphql +30 -0
- stackos_connectors/connectors/shopify/assets/graphql/inventory/list-product-variant-inventory.graphql +20 -0
- stackos_connectors/connectors/shopify/assets/graphql/inventory/set-inventory-level.graphql +25 -0
- stackos_connectors/connectors/shopify/assets/graphql/orders/add-order-note.graphql +13 -0
- stackos_connectors/connectors/shopify/assets/graphql/orders/add-order-tag.graphql +11 -0
- stackos_connectors/connectors/shopify/assets/graphql/orders/create-draft-order.graphql +67 -0
- stackos_connectors/connectors/shopify/assets/graphql/orders/get-order-by-name.graphql +91 -0
- stackos_connectors/connectors/shopify/assets/graphql/orders/get-order-fulfillment-status.graphql +17 -0
- stackos_connectors/connectors/shopify/assets/graphql/orders/get-order-timeline.graphql +15 -0
- stackos_connectors/connectors/shopify/assets/graphql/orders/get-order.graphql +87 -0
- stackos_connectors/connectors/shopify/assets/graphql/orders/list-order-variant-quantities.graphql +18 -0
- stackos_connectors/connectors/shopify/assets/graphql/orders/list-orders.graphql +54 -0
- stackos_connectors/connectors/shopify/assets/graphql/orders/mark-order-paid.graphql +13 -0
- stackos_connectors/connectors/shopify/assets/graphql/orders/search-orders.graphql +54 -0
- stackos_connectors/connectors/shopify/assets/graphql/orders/update-order-note.graphql +13 -0
- stackos_connectors/connectors/shopify/assets/graphql/orders/update-order-tags.graphql +13 -0
- stackos_connectors/connectors/shopify/assets/graphql/products/create-collection.graphql +17 -0
- stackos_connectors/connectors/shopify/assets/graphql/products/create-product-variant.graphql +20 -0
- stackos_connectors/connectors/shopify/assets/graphql/products/create-product.graphql +29 -0
- stackos_connectors/connectors/shopify/assets/graphql/products/get-collection.graphql +41 -0
- stackos_connectors/connectors/shopify/assets/graphql/products/get-product-by-handle.graphql +61 -0
- stackos_connectors/connectors/shopify/assets/graphql/products/get-product-variant.graphql +31 -0
- stackos_connectors/connectors/shopify/assets/graphql/products/get-product.graphql +61 -0
- stackos_connectors/connectors/shopify/assets/graphql/products/list-collections.graphql +24 -0
- stackos_connectors/connectors/shopify/assets/graphql/products/list-product-variants.graphql +27 -0
- stackos_connectors/connectors/shopify/assets/graphql/products/list-products.graphql +38 -0
- stackos_connectors/connectors/shopify/assets/graphql/products/search-products.graphql +38 -0
- stackos_connectors/connectors/shopify/assets/graphql/products/update-product-status.graphql +14 -0
- stackos_connectors/connectors/shopify/assets/graphql/products/update-product-variant.graphql +20 -0
- stackos_connectors/connectors/shopify/assets/graphql/products/update-product.graphql +19 -0
- stackos_connectors/connectors/shopify/assets/graphql/shopifyql.graphql +13 -0
- stackos_connectors/connectors/shopify/assets/icon.png +0 -0
- stackos_connectors/connectors/shopify/catalog.json +3178 -0
- stackos_connectors/connectors/shopify/docs/shopify.md +51 -0
- stackos_connectors/connectors/shopify/integration.py +228 -0
- stackos_connectors/connectors/shopify/payloads.py +592 -0
- stackos_connectors/connectors/sitemap/__init__.py +1 -0
- stackos_connectors/connectors/sitemap/actions.py +88 -0
- stackos_connectors/connectors/sitemap/catalog.json +72 -0
- stackos_connectors/connectors/sitemap/integration.py +324 -0
- stackos_connectors/connectors/slack_bot/__init__.py +1 -0
- stackos_connectors/connectors/slack_bot/actions.py +47 -0
- stackos_connectors/connectors/slack_bot/assets/icon.png +0 -0
- stackos_connectors/connectors/slack_bot/catalog.json +557 -0
- stackos_connectors/connectors/slack_bot/constants.py +14 -0
- stackos_connectors/connectors/slack_bot/docs/protocol.md +20 -0
- stackos_connectors/connectors/slack_bot/files.py +111 -0
- stackos_connectors/connectors/slack_bot/http.py +163 -0
- stackos_connectors/connectors/slack_bot/integration.py +87 -0
- stackos_connectors/connectors/slack_bot/payloads.py +38 -0
- stackos_connectors/connectors/slack_bot/results.py +30 -0
- stackos_connectors/connectors/slack_bot/validation.py +145 -0
- stackos_connectors/connectors/smtp/__init__.py +1 -0
- stackos_connectors/connectors/smtp/actions.py +324 -0
- stackos_connectors/connectors/smtp/assets/icon.svg +7 -0
- stackos_connectors/connectors/smtp/catalog.json +238 -0
- stackos_connectors/connectors/smtp/docs/protocol.md +13 -0
- stackos_connectors/connectors/smtp/integration.py +104 -0
- stackos_connectors/connectors/stripe/__init__.py +1 -0
- stackos_connectors/connectors/stripe/actions.py +265 -0
- stackos_connectors/connectors/stripe/assets/icon.jpeg +0 -0
- stackos_connectors/connectors/stripe/catalog.json +2315 -0
- stackos_connectors/connectors/stripe/contract.py +92 -0
- stackos_connectors/connectors/stripe/docs/stripe.md +58 -0
- stackos_connectors/connectors/stripe/integration.py +668 -0
- stackos_connectors/connectors/taboola/__init__.py +1 -0
- stackos_connectors/connectors/taboola/actions.py +286 -0
- stackos_connectors/connectors/taboola/assets/icon.svg +18 -0
- stackos_connectors/connectors/taboola/catalog.json +593 -0
- stackos_connectors/connectors/telegram/__init__.py +1 -0
- stackos_connectors/connectors/telegram/actions.py +291 -0
- stackos_connectors/connectors/telegram/assets/icon.png +0 -0
- stackos_connectors/connectors/telegram/catalog.json +2121 -0
- stackos_connectors/connectors/telegram/docs/protocol.md +20 -0
- stackos_connectors/connectors/telegram/payloads.py +278 -0
- stackos_connectors/connectors/telegram/schema.py +35 -0
- stackos_connectors/connectors/telegram/tdlib/__init__.py +1 -0
- stackos_connectors/connectors/telegram/tdlib/native.py +513 -0
- stackos_connectors/connectors/telegram/tdlib/proxy.py +347 -0
- stackos_connectors/connectors/telegram/tdlib/sessions.py +256 -0
- stackos_connectors/connectors/trackbooth/__init__.py +5 -0
- stackos_connectors/connectors/trackbooth/actions.py +220 -0
- stackos_connectors/connectors/trackbooth/assets/agent-api/catalog.json +53858 -0
- stackos_connectors/connectors/trackbooth/assets/agent-api/openapi.json +25942 -0
- stackos_connectors/connectors/trackbooth/assets/agent-api/stackos-tools.json +17122 -0
- stackos_connectors/connectors/trackbooth/assets/icon.png +0 -0
- stackos_connectors/connectors/trackbooth/assets.py +279 -0
- stackos_connectors/connectors/trackbooth/catalog.json +168 -0
- stackos_connectors/connectors/trackbooth/contract.py +8 -0
- stackos_connectors/connectors/trackbooth/docs/agent-api/README.md +17 -0
- stackos_connectors/connectors/trackbooth/docs/trackbooth.md +33 -0
- stackos_connectors/connectors/trackbooth/integration.py +202 -0
- stackos_connectors/connectors/trackbooth/schema.py +78 -0
- stackos_connectors/connectors/trackbooth/transport.py +107 -0
- stackos_connectors/connectors/wordpress/__init__.py +1 -0
- stackos_connectors/connectors/wordpress/actions.py +69 -0
- stackos_connectors/connectors/wordpress/assets/icon.png +0 -0
- stackos_connectors/connectors/wordpress/catalog.json +183 -0
- stackos_connectors/connectors/wordpress/integration.py +121 -0
- stackos_connectors/connectors/xai_imagine/__init__.py +1 -0
- stackos_connectors/connectors/xai_imagine/actions.py +89 -0
- stackos_connectors/connectors/xai_imagine/assets/icon.png +0 -0
- stackos_connectors/connectors/xai_imagine/catalog.json +402 -0
- stackos_connectors/connectors/xai_imagine/integration.py +420 -0
- stackos_connectors/contracts.py +177 -0
- stackos_connectors/errors.py +63 -0
- stackos_connectors/probe.py +26 -0
- stackos_connectors/py.typed +0 -0
- stackos_connectors/redaction.py +140 -0
- stackos_connectors/registry.py +419 -0
- stackos_connectors/shared/__init__.py +1 -0
- stackos_connectors/shared/base.py +380 -0
- stackos_connectors/shared/byteplus/__init__.py +1 -0
- stackos_connectors/shared/byteplus/ark.py +794 -0
- stackos_connectors/shared/byteplus/media.py +178 -0
- stackos_connectors/shared/google/__init__.py +1 -0
- stackos_connectors/shared/google/batch.py +219 -0
- stackos_connectors/shared/google/oauth.py +51 -0
- stackos_connectors/shared/icons/integration.svg +8 -0
- stackos_connectors/shared/media.py +263 -0
- stackos_connectors/shared/provider_utils.py +350 -0
- stackos_connectors/shared/rate_limit.py +72 -0
- stackos_connectors/shared/vendor_utils.py +182 -0
- stackos_connectors/validation.py +25 -0
- stackos_connectors-0.1.0.dist-info/METADATA +160 -0
- stackos_connectors-0.1.0.dist-info/RECORD +388 -0
- stackos_connectors-0.1.0.dist-info/WHEEL +4 -0
- stackos_connectors-0.1.0.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema_version": "stackos.connector.v1",
|
|
3
|
+
"connector": "ahrefs",
|
|
4
|
+
"name": "Ahrefs",
|
|
5
|
+
"description": "Organic keyword and backlink research provider; requires eligible API access and API units.",
|
|
6
|
+
"auth_methods": [
|
|
7
|
+
{
|
|
8
|
+
"key": "api_key",
|
|
9
|
+
"description": "Supply the Ahrefs API key for bearer authentication.",
|
|
10
|
+
"fields_schema": {
|
|
11
|
+
"type": "object",
|
|
12
|
+
"properties": {
|
|
13
|
+
"api_key": {
|
|
14
|
+
"description": "API Key",
|
|
15
|
+
"type": "string",
|
|
16
|
+
"minLength": 1
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"required": [
|
|
20
|
+
"api_key"
|
|
21
|
+
]
|
|
22
|
+
},
|
|
23
|
+
"config_schema": {
|
|
24
|
+
"type": "object",
|
|
25
|
+
"properties": {},
|
|
26
|
+
"required": []
|
|
27
|
+
},
|
|
28
|
+
"payload_format": "raw",
|
|
29
|
+
"payload_field": "api_key",
|
|
30
|
+
"setup": {
|
|
31
|
+
"label": "API key",
|
|
32
|
+
"description": "Ahrefs API v3 calls consume API units and require eligible Direct API access. Obtain an API key in the Ahrefs app. The limits_and_usage action reads subscription information, including plan and key limits and remaining units.",
|
|
33
|
+
"fields": [
|
|
34
|
+
{
|
|
35
|
+
"description": null,
|
|
36
|
+
"key": "api_key",
|
|
37
|
+
"label": "API Key",
|
|
38
|
+
"options": null,
|
|
39
|
+
"placeholder": null,
|
|
40
|
+
"required": true,
|
|
41
|
+
"secret": true,
|
|
42
|
+
"type": "secret"
|
|
43
|
+
}
|
|
44
|
+
]
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
],
|
|
48
|
+
"actions": [
|
|
49
|
+
{
|
|
50
|
+
"key": "competitor.keywords",
|
|
51
|
+
"operation": "competitor.keywords",
|
|
52
|
+
"input_schema": {
|
|
53
|
+
"additionalProperties": false,
|
|
54
|
+
"properties": {
|
|
55
|
+
"country": {
|
|
56
|
+
"type": "string"
|
|
57
|
+
},
|
|
58
|
+
"date": {
|
|
59
|
+
"type": "string"
|
|
60
|
+
},
|
|
61
|
+
"limit": {
|
|
62
|
+
"description": "Positive number of rows requested from Ahrefs. Defaults to 100; provider plan restrictions are returned by Ahrefs.",
|
|
63
|
+
"minimum": 1,
|
|
64
|
+
"type": "integer"
|
|
65
|
+
},
|
|
66
|
+
"target": {
|
|
67
|
+
"type": "string"
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
"required": [
|
|
71
|
+
"target"
|
|
72
|
+
],
|
|
73
|
+
"type": "object"
|
|
74
|
+
},
|
|
75
|
+
"output_schema": {
|
|
76
|
+
"additionalProperties": true,
|
|
77
|
+
"type": "object"
|
|
78
|
+
},
|
|
79
|
+
"auth_methods": [
|
|
80
|
+
"api_key"
|
|
81
|
+
],
|
|
82
|
+
"auth_optional": false,
|
|
83
|
+
"config": {},
|
|
84
|
+
"description": "Fetch organic keywords for a target. Returns provider data and API-unit response headers. Does not make an implicit limits request.",
|
|
85
|
+
"metadata": {
|
|
86
|
+
"capability": "seo-research",
|
|
87
|
+
"name": "Competitor Keywords",
|
|
88
|
+
"risk_level": "cost"
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
"key": "backlink.research",
|
|
93
|
+
"operation": "backlink.research",
|
|
94
|
+
"input_schema": {
|
|
95
|
+
"additionalProperties": false,
|
|
96
|
+
"properties": {
|
|
97
|
+
"limit": {
|
|
98
|
+
"description": "Positive number of rows requested from Ahrefs. Defaults to 100; provider plan restrictions are returned by Ahrefs.",
|
|
99
|
+
"minimum": 1,
|
|
100
|
+
"type": "integer"
|
|
101
|
+
},
|
|
102
|
+
"mode": {
|
|
103
|
+
"enum": [
|
|
104
|
+
"exact",
|
|
105
|
+
"prefix",
|
|
106
|
+
"domain",
|
|
107
|
+
"subdomains"
|
|
108
|
+
],
|
|
109
|
+
"type": "string"
|
|
110
|
+
},
|
|
111
|
+
"target": {
|
|
112
|
+
"type": "string"
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
"required": [
|
|
116
|
+
"target"
|
|
117
|
+
],
|
|
118
|
+
"type": "object"
|
|
119
|
+
},
|
|
120
|
+
"output_schema": {
|
|
121
|
+
"additionalProperties": true,
|
|
122
|
+
"type": "object"
|
|
123
|
+
},
|
|
124
|
+
"auth_methods": [
|
|
125
|
+
"api_key"
|
|
126
|
+
],
|
|
127
|
+
"auth_optional": false,
|
|
128
|
+
"config": {},
|
|
129
|
+
"description": "Fetch backlinks for a target. Returns provider data and API-unit response headers. Does not make an implicit limits request.",
|
|
130
|
+
"metadata": {
|
|
131
|
+
"capability": "seo-research",
|
|
132
|
+
"name": "Backlink Research",
|
|
133
|
+
"risk_level": "cost"
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
"key": "limits_and_usage",
|
|
138
|
+
"operation": "limits_and_usage",
|
|
139
|
+
"input_schema": {
|
|
140
|
+
"type": "object",
|
|
141
|
+
"properties": {},
|
|
142
|
+
"additionalProperties": false
|
|
143
|
+
},
|
|
144
|
+
"output_schema": {
|
|
145
|
+
"type": "object",
|
|
146
|
+
"additionalProperties": true
|
|
147
|
+
},
|
|
148
|
+
"auth_methods": [
|
|
149
|
+
"api_key"
|
|
150
|
+
],
|
|
151
|
+
"config": {},
|
|
152
|
+
"description": "Fetch subscription limits and usage with GET /v3/subscription-info/limits-and-usage. Returns provider facts without enforcing caller admission policy.",
|
|
153
|
+
"metadata": {
|
|
154
|
+
"name": "Limits and usage",
|
|
155
|
+
"risk_level": "read"
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
],
|
|
159
|
+
"setup": {
|
|
160
|
+
"billing_url": "https://app.ahrefs.com/account/subscription",
|
|
161
|
+
"console_url": "https://app.ahrefs.com/",
|
|
162
|
+
"credential_label": "Ahrefs API key",
|
|
163
|
+
"credential_url": "https://app.ahrefs.com/api",
|
|
164
|
+
"docs_url": "https://docs.ahrefs.com/",
|
|
165
|
+
"fallback_reason": "API access is plan/account gated; official API docs and Ahrefs app are the nearest setup path.",
|
|
166
|
+
"fallback_url": "https://docs.ahrefs.com/",
|
|
167
|
+
"homepage_url": "https://ahrefs.com/",
|
|
168
|
+
"setup_note": "Ahrefs API v3 calls consume API units and require eligible Direct API access. Obtain an API key in the Ahrefs app. The limits_and_usage action reads subscription information, including plan and key limits and remaining units.",
|
|
169
|
+
"signup_url": "https://app.ahrefs.com/user/sign-up",
|
|
170
|
+
"docs": [
|
|
171
|
+
"https://docs.ahrefs.com/en/api/docs/introduction",
|
|
172
|
+
"https://docs.ahrefs.com/en/api/docs/api-keys-creation-and-management",
|
|
173
|
+
"https://docs.ahrefs.com/en/api/docs/limits-consumption",
|
|
174
|
+
"https://docs.ahrefs.com/en/api/reference/subscription-info/get-limits-and-usage",
|
|
175
|
+
"https://docs.ahrefs.com/en/api/reference/site-explorer",
|
|
176
|
+
"https://docs.ahrefs.com/en/api/reference/site-explorer/get-organic-keywords",
|
|
177
|
+
"https://docs.ahrefs.com/en/api/reference/site-explorer/get-all-backlinks"
|
|
178
|
+
]
|
|
179
|
+
},
|
|
180
|
+
"implementation": "stackos_connectors.connectors.ahrefs.actions:AhrefsActionConnector",
|
|
181
|
+
"icon": {
|
|
182
|
+
"media_type": "image/png",
|
|
183
|
+
"kind": "icon",
|
|
184
|
+
"path": "connectors/ahrefs/assets/icon.png"
|
|
185
|
+
}
|
|
186
|
+
}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
"""Ahrefs integration wrapper (PLAN.md L1047).
|
|
2
|
+
|
|
3
|
+
Authentication: Bearer ``Authorization: Bearer <api_key>``. Ahrefs only
|
|
4
|
+
serves this wrapper when the operator has a paid plan/API units that
|
|
5
|
+
allow direct API v3 calls; for solo/SMB operators DataForSEO covers most
|
|
6
|
+
of the same surface area.
|
|
7
|
+
|
|
8
|
+
Operations:
|
|
9
|
+
|
|
10
|
+
- ``keywords_for_site(target, country)`` — keyword inventory.
|
|
11
|
+
- ``top_backlinks(target, mode, limit)`` — top inbound links.
|
|
12
|
+
|
|
13
|
+
Graceful degrade: if no credential payload is present,
|
|
14
|
+
``test_credentials`` raises ``IntegrationDownError`` with a documented
|
|
15
|
+
fallback hint. Wrapper construction itself does NOT raise — the skill code
|
|
16
|
+
checks ``test_credentials`` before issuing the first real op.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
from __future__ import annotations
|
|
20
|
+
|
|
21
|
+
from datetime import date, timedelta
|
|
22
|
+
from typing import Any
|
|
23
|
+
|
|
24
|
+
from stackos_connectors.errors import IntegrationDownError
|
|
25
|
+
from stackos_connectors.shared.base import BaseIntegration, IntegrationCallResult
|
|
26
|
+
|
|
27
|
+
_AHREFS_UNIT_HEADERS = {
|
|
28
|
+
"x-api-rows": "rows",
|
|
29
|
+
"x-api-units-cost-row": "cost_row",
|
|
30
|
+
"x-api-units-cost-total": "cost_total",
|
|
31
|
+
"x-api-units-cost-total-actual": "cost_total_actual",
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class AhrefsIntegration(BaseIntegration):
|
|
36
|
+
"""Wrapper for ``https://api.ahrefs.com/v3``."""
|
|
37
|
+
|
|
38
|
+
kind = "ahrefs"
|
|
39
|
+
vendor = "ahrefs"
|
|
40
|
+
# Official refs: https://docs.ahrefs.com/en/api/docs/introduction and
|
|
41
|
+
# https://docs.ahrefs.com/en/api/docs/limits-consumption. Ahrefs bills in
|
|
42
|
+
# API units; unit headers are metadata until StackOS models unit budgets.
|
|
43
|
+
default_qps = 1.0
|
|
44
|
+
|
|
45
|
+
BASE_URL = "https://api.ahrefs.com/v3"
|
|
46
|
+
|
|
47
|
+
def __init__(self, **kwargs: Any) -> None:
|
|
48
|
+
super().__init__(**kwargs)
|
|
49
|
+
self._api_key = self.payload.decode("utf-8").strip() if self.payload else ""
|
|
50
|
+
|
|
51
|
+
def _require_key(self) -> str:
|
|
52
|
+
if not self._api_key:
|
|
53
|
+
raise IntegrationDownError(
|
|
54
|
+
"Ahrefs API key is not configured.",
|
|
55
|
+
data={
|
|
56
|
+
"vendor": "ahrefs",
|
|
57
|
+
"hint": "Pass a non-empty API key using the api_key authentication method.",
|
|
58
|
+
},
|
|
59
|
+
)
|
|
60
|
+
return self._api_key
|
|
61
|
+
|
|
62
|
+
def _auth_headers(self) -> dict[str, str]:
|
|
63
|
+
return {
|
|
64
|
+
"Authorization": f"Bearer {self._require_key()}",
|
|
65
|
+
"Accept": "application/json",
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
@staticmethod
|
|
69
|
+
def _default_report_date() -> str:
|
|
70
|
+
"""Use yesterday: Ahrefs reports are date-bound and may lag today."""
|
|
71
|
+
return (date.today() - timedelta(days=1)).isoformat()
|
|
72
|
+
|
|
73
|
+
@staticmethod
|
|
74
|
+
def _parse_int(value: str | None) -> int | None:
|
|
75
|
+
if value is None:
|
|
76
|
+
return None
|
|
77
|
+
try:
|
|
78
|
+
return int(value)
|
|
79
|
+
except ValueError:
|
|
80
|
+
return None
|
|
81
|
+
|
|
82
|
+
def _extract_response_metadata(
|
|
83
|
+
self,
|
|
84
|
+
op: str,
|
|
85
|
+
*,
|
|
86
|
+
request: Any,
|
|
87
|
+
response: Any,
|
|
88
|
+
http_response: Any,
|
|
89
|
+
) -> dict[str, Any] | None:
|
|
90
|
+
"""Capture Ahrefs unit-accounting headers documented for API v3."""
|
|
91
|
+
del op, request, response
|
|
92
|
+
api_units: dict[str, Any] = {}
|
|
93
|
+
for header, key in _AHREFS_UNIT_HEADERS.items():
|
|
94
|
+
parsed = self._parse_int(http_response.headers.get(header))
|
|
95
|
+
if parsed is not None:
|
|
96
|
+
api_units[key] = parsed
|
|
97
|
+
cache_header = http_response.headers.get("x-api-cache")
|
|
98
|
+
if cache_header:
|
|
99
|
+
api_units["cache"] = cache_header
|
|
100
|
+
if not api_units:
|
|
101
|
+
return None
|
|
102
|
+
metadata: dict[str, Any] = {"api_units": api_units}
|
|
103
|
+
if isinstance(cache_header, str) and cache_header.lower() == "hit":
|
|
104
|
+
metadata["cached"] = True
|
|
105
|
+
return metadata
|
|
106
|
+
|
|
107
|
+
async def limits_and_usage(self) -> IntegrationCallResult:
|
|
108
|
+
"""Read the free subscription/usage endpoint before paid row calls."""
|
|
109
|
+
return await self.call(
|
|
110
|
+
op="limits_and_usage",
|
|
111
|
+
method="GET",
|
|
112
|
+
url=f"{self.BASE_URL}/subscription-info/limits-and-usage",
|
|
113
|
+
headers=self._auth_headers(),
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
async def keywords_for_site(
|
|
117
|
+
self,
|
|
118
|
+
*,
|
|
119
|
+
target: str,
|
|
120
|
+
country: str = "us",
|
|
121
|
+
limit: int = 100,
|
|
122
|
+
date_: str | None = None,
|
|
123
|
+
) -> IntegrationCallResult:
|
|
124
|
+
"""Keyword inventory for the target domain."""
|
|
125
|
+
# Endpoint ref:
|
|
126
|
+
# https://docs.ahrefs.com/en/api/reference/site-explorer/get-organic-keywords
|
|
127
|
+
params = {
|
|
128
|
+
"target": target,
|
|
129
|
+
"country": country,
|
|
130
|
+
"limit": str(limit),
|
|
131
|
+
"date": date_ or self._default_report_date(),
|
|
132
|
+
"select": "keyword,volume,cpc,best_position,keyword_difficulty",
|
|
133
|
+
}
|
|
134
|
+
return await self.call(
|
|
135
|
+
op="keywords_for_site",
|
|
136
|
+
method="GET",
|
|
137
|
+
url=f"{self.BASE_URL}/site-explorer/organic-keywords",
|
|
138
|
+
params=params,
|
|
139
|
+
headers=self._auth_headers(),
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
async def top_backlinks(
|
|
143
|
+
self,
|
|
144
|
+
*,
|
|
145
|
+
target: str,
|
|
146
|
+
mode: str = "domain",
|
|
147
|
+
limit: int = 100,
|
|
148
|
+
) -> IntegrationCallResult:
|
|
149
|
+
"""Top inbound backlinks; ``mode`` is ``domain`` or ``exact``."""
|
|
150
|
+
# Endpoint ref:
|
|
151
|
+
# https://docs.ahrefs.com/en/api/reference/site-explorer/get-all-backlinks
|
|
152
|
+
params = {
|
|
153
|
+
"target": target,
|
|
154
|
+
"mode": mode,
|
|
155
|
+
"limit": str(limit),
|
|
156
|
+
"select": "url_from,url_to,domain_rating_source,first_seen",
|
|
157
|
+
}
|
|
158
|
+
return await self.call(
|
|
159
|
+
op="top_backlinks",
|
|
160
|
+
method="GET",
|
|
161
|
+
url=f"{self.BASE_URL}/site-explorer/all-backlinks",
|
|
162
|
+
params=params,
|
|
163
|
+
headers=self._auth_headers(),
|
|
164
|
+
)
|
|
165
|
+
|
|
166
|
+
async def test_credentials(self) -> dict[str, Any]:
|
|
167
|
+
"""Cheap auth probe — call a free ``domain-rating`` query.
|
|
168
|
+
|
|
169
|
+
Raises ``IntegrationDownError`` with the Ahrefs setup hint when no
|
|
170
|
+
key is configured (graceful degrade — the keyword-discovery skill
|
|
171
|
+
picks this up and falls back to DataForSEO).
|
|
172
|
+
"""
|
|
173
|
+
self._require_key()
|
|
174
|
+
result = await self.call(
|
|
175
|
+
op="test",
|
|
176
|
+
method="GET",
|
|
177
|
+
url=f"{self.BASE_URL}/site-explorer/domain-rating",
|
|
178
|
+
params={"target": "wordcount.com", "date": self._default_report_date()},
|
|
179
|
+
headers=self._auth_headers(),
|
|
180
|
+
)
|
|
181
|
+
return {"ok": True, "vendor": "ahrefs", "data": result.data}
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
__all__ = ["AhrefsIntegration"]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""AIGNC native protocol connector."""
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"""Named AIGNC requests with caller-owned files and resolved bearer credentials."""
|
|
2
|
+
|
|
3
|
+
from contextlib import nullcontext
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
|
|
6
|
+
import httpx
|
|
7
|
+
|
|
8
|
+
from stackos_connectors.connectors.aignc.integration import AigncIntegration
|
|
9
|
+
from stackos_connectors.contracts import ConnectorRequest, ConnectorResult, ValidationIssue
|
|
10
|
+
from stackos_connectors.shared.provider_utils import credential_value, issue
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class AigncActionConnector:
|
|
14
|
+
key = "aignc"
|
|
15
|
+
|
|
16
|
+
def validate(self, request: ConnectorRequest) -> list[ValidationIssue]:
|
|
17
|
+
issues = []
|
|
18
|
+
if request.operation == "image.generate" and request.options.output_dir is None:
|
|
19
|
+
issues.append(
|
|
20
|
+
issue("$.options.output_dir", "output_dir is required for generated media")
|
|
21
|
+
)
|
|
22
|
+
for name in ("max_response_bytes", "max_image_bytes", "max_audio_bytes"):
|
|
23
|
+
value = request.options.provider_context.get(name)
|
|
24
|
+
if value is not None and (type(value) is not int or value <= 0):
|
|
25
|
+
issues.append(
|
|
26
|
+
issue(
|
|
27
|
+
f"$.options.provider_context.{name}", f"{name} must be a positive integer"
|
|
28
|
+
)
|
|
29
|
+
)
|
|
30
|
+
return issues
|
|
31
|
+
|
|
32
|
+
def estimate_cost_cents(self, _request: ConnectorRequest) -> int:
|
|
33
|
+
return 0
|
|
34
|
+
|
|
35
|
+
async def execute(self, request: ConnectorRequest) -> ConnectorResult:
|
|
36
|
+
data = request.input_json
|
|
37
|
+
async with (
|
|
38
|
+
nullcontext(request.options.http)
|
|
39
|
+
if request.options.http is not None
|
|
40
|
+
else httpx.AsyncClient()
|
|
41
|
+
) as http:
|
|
42
|
+
client = AigncIntegration(
|
|
43
|
+
payload=credential_value(request, "api_key").encode(),
|
|
44
|
+
http=http,
|
|
45
|
+
timeout=request.options.timeout,
|
|
46
|
+
rate_limiter=request.options.rate_limiter,
|
|
47
|
+
output_dir=request.options.output_dir,
|
|
48
|
+
**{
|
|
49
|
+
name: request.options.provider_context.get(name)
|
|
50
|
+
for name in ("max_response_bytes", "max_image_bytes", "max_audio_bytes")
|
|
51
|
+
},
|
|
52
|
+
)
|
|
53
|
+
if request.operation == "models.list":
|
|
54
|
+
result = await client.models()
|
|
55
|
+
elif request.operation == "chat.complete":
|
|
56
|
+
result = await client.chat_complete(
|
|
57
|
+
model=data["model"],
|
|
58
|
+
messages=data["messages"],
|
|
59
|
+
max_tokens=data["max_tokens"],
|
|
60
|
+
google_search=data.get("google_search", False),
|
|
61
|
+
)
|
|
62
|
+
elif request.operation == "image.generate":
|
|
63
|
+
result = await client.generate_image(
|
|
64
|
+
prompt=data["prompt"], max_tokens=data["max_tokens"]
|
|
65
|
+
)
|
|
66
|
+
elif request.operation == "audio.analyze":
|
|
67
|
+
result = await client.analyze_audio(
|
|
68
|
+
model=data["model"],
|
|
69
|
+
instruction=data["instruction"],
|
|
70
|
+
audio_path=Path(data["audio_path"]),
|
|
71
|
+
format=data["format"],
|
|
72
|
+
max_tokens=data["max_tokens"],
|
|
73
|
+
)
|
|
74
|
+
else:
|
|
75
|
+
from stackos_connectors.errors import ValidationError
|
|
76
|
+
|
|
77
|
+
raise ValidationError("unsupported AIGNC operation")
|
|
78
|
+
return ConnectorResult(
|
|
79
|
+
output_json=result.data,
|
|
80
|
+
metadata_json={"vendor": "aignc", **(result.metadata or {})},
|
|
81
|
+
files=client.files,
|
|
82
|
+
)
|