decisionshared last reviewed 2026-05-21

No direct vendor SDKs โ€” route everything through the Aspire stack

Context

Before this rule, individual Aspire apps imported vendor SDKs directly: anthropic, openai, AWS SDKs, etc. This created:

The rule fixes this for the 3 most-used vendor categories: AI, storage, payments.

Detail

Decision

CategoryDirect vendor SDK?Use instead
LLM / vision / OCRโŒ NEVERAspire LLM Gateway at llm.aspiredigital.group/v1 (OpenAI-compat)
Object storageโŒ NEVERMinIO per-app via S3 SDK (works as S3-compat)
Marketplace paymentsโŒ NEVERStripe Connect Express via Aspire patterns
GitHubโŒ NEVERSelf-hosted GitLab at gitlab.dssc.co.th
Email transactionalโœ… SendGrid SDK OKSendGrid is the org-standard; just use it directly
Twilioโœ… Twilio SDK OKPer-app, paid; central registry tracks deployments

Why these specifically

Banned categories all have:

Allowed categories have:

What this prevents

Previous patternNew pattern
import Anthropic from '@anthropic-ai/sdk' in alby-studiofetch('https://llm.aspiredigital.group/v1/chat/completions', ...)
import { OpenAI } from 'openai' in zinga-pmsSame โ€” gateway
import { S3Client } from '@aws-sdk/client-s3' pointing to AWSSame SDK pointing to MinIO https://s3.<app>.aspiredigital...
Direct cloud-first.ai SaaS OCR APIKO worker-ocr through gateway

Aspire-LLM-Gateway exclusion zones (per KNOWLEDGE_OS_SPEC ยง5.3)

The following endpoints were previously in design but have been REMOVED from the engine code (2026-05-12 cleanup, engine commit ced417b):

If a future need arises (e.g., audit-grade OCR with calibrated confidence): add a new gateway alias, don't reintroduce direct client code.

Exception process

If a new vendor genuinely warrants direct SDK access, the operator must:

  1. Document why the abstraction layer doesn't apply
  2. Add the vendor + decision to this page
  3. Get reviewed in a /spec session

So far, no exceptions have been granted.

Constraints we accepted

Revisit trigger

Actions

Related

๐Ÿ”— Relationships

graph LR no_direct_vendor_sdk["no-direct-vendor-sdk"]:::self no_direct_vendor_sdk --> aspire_llm_gateway_only_egress["aspire-llm-gateway-only-egress"] no_direct_vendor_sdk --> stripe_connect_marketplace_default["stripe-connect-marketplace-default"] no_direct_vendor_sdk --> minio_storage_per_app["minio-storage-per-app"] no_direct_vendor_sdk --> gitlab_self_hosted_not_github["gitlab-self-hosted-not-github"] classDef self fill:#715EE3,color:#fff,stroke:#291F50;