orchestrate-multi-target-sdks
Orchestrate Multi-Target SDKs
Generate SDKs for multiple languages or variants from a single repository using CLI commands.
When to Use
- Generating SDKs for multiple languages from the same API spec
- Creating SDK variants (Azure, GCP, regional) from different specs
- Setting up an SDK monorepo
- User says: "generate SDKs for multiple languages", "SDK for each language", "multi-target"
Quick Start: Multiple Languages
Always use CLI commands. Never create .speakeasy directories manually.
# Step 1: Initialize first target (creates .speakeasy/workflow.yaml)
speakeasy quickstart --skip-interactive --output console \
-s openapi.yaml -t typescript -n "MySDK" -p "my-sdk"
# Step 2: Add more language targets using configure
speakeasy configure targets \
--target-type python \
--source my-source \
--output ./sdks/python
speakeasy configure targets \
--target-type go \
--source my-source \
--output ./sdks/go
# Step 3: Generate all SDKs
speakeasy run --output console
CLI Reference
speakeasy configure sources
Add a new OpenAPI source to an existing workflow:
speakeasy configure sources \
--location ./openapi.yaml \
--source-name my-api
# With authentication header
speakeasy configure sources \
--location https://api.example.com/openapi.yaml \
--source-name my-api \
--auth-header "Authorization"
| Flag | Short | Description |
|---|---|---|
--location |
-l |
OpenAPI document location (file or URL) |
--source-name |
-s |
Name for the source |
--auth-header |
Authentication header name (optional) | |
--output |
-o |
Output path for compiled source (optional) |
--non-interactive |
Force non-interactive mode |
speakeasy configure targets
Add a new SDK target to an existing workflow:
speakeasy configure targets \
--target-type typescript \
--source my-api \
--output ./sdks/typescript
# With all options
speakeasy configure targets \
--target-type go \
--source my-api \
--target-name my-go-sdk \
--sdk-class-name MyAPI \
--package-name github.com/myorg/myapi-go \
--output ./sdks/go
| Flag | Short | Description |
|---|---|---|
--target-type |
-t |
Language: typescript, python, go, java, csharp, php, ruby, terraform |
--source |
-s |
Name of source to generate from |
--target-name |
Name for the target (defaults to target-type) | |
--sdk-class-name |
SDK class name (optional) | |
--package-name |
Package name (optional) | |
--base-server-url |
Base server URL (optional) | |
--output |
-o |
Output directory (optional) |
--non-interactive |
Force non-interactive mode |
Example: Multi-Language SDKs
Single OpenAPI spec → TypeScript, Python, Go SDKs:
# Initialize with first target
speakeasy quickstart --skip-interactive --output console \
-s ./openapi.yaml -t typescript -n "MySDK" -p "my-sdk" -o ./sdks/typescript
# Add Python
speakeasy configure targets \
--target-type python \
--source my-source \
--sdk-class-name MySDK \
--package-name my-sdk \
--output ./sdks/python
# Add Go
speakeasy configure targets \
--target-type go \
--source my-source \
--sdk-class-name MySDK \
--package-name github.com/myorg/my-sdk-go \
--output ./sdks/go
# Generate all
speakeasy run --output console
Example: SDK Variants (Multiple Sources)
Different OpenAPI specs → variant SDKs:
# Initialize with main API
speakeasy quickstart --skip-interactive --output console \
-s ./openapi.yaml -t typescript -n "MySDK" -p "my-sdk"
# Add Azure variant source
speakeasy configure sources \
--location ./openapi-azure.yaml \
--source-name azure-api
# Add Azure target
speakeasy configure targets \
--target-type typescript \
--source azure-api \
--target-name typescript-azure \
--sdk-class-name MySDKAzure \
--package-name "@myorg/my-sdk-azure" \
--output ./packages/azure
# Generate all
speakeasy run --output console
Repository Structure
my-api-sdks/
├── openapi.yaml # Source spec
├── .speakeasy/
│ └── workflow.yaml # Multi-target config (created by CLI)
├── sdks/
│ ├── typescript/
│ │ ├── .speakeasy/
│ │ │ └── gen.yaml # Created by configure
│ │ └── src/
│ ├── python/
│ │ ├── .speakeasy/
│ │ │ └── gen.yaml
│ │ └── src/
│ └── go/
│ ├── .speakeasy/
│ │ └── gen.yaml
│ └── go.mod
└── .github/workflows/
└── sdk_generation.yaml
Running Generation
# Generate all targets
speakeasy run --output console
# Generate specific target only
speakeasy run -t typescript --output console
speakeasy run -t python --output console
CI Workflow
# .github/workflows/sdk_generation.yaml
name: Generate SDKs
on:
push:
branches: [main]
paths: ['openapi.yaml']
workflow_dispatch:
jobs:
generate:
uses: speakeasy-api/sdk-generation-action/.github/workflows/workflow-executor.yaml@v15
with:
mode: pr
secrets:
github_access_token: ${{ secrets.GITHUB_TOKEN }}
speakeasy_api_key: ${{ secrets.SPEAKEASY_API_KEY }}
What NOT to Do
- Do NOT create
.speakeasy/directories manually - Usespeakeasy quickstartandspeakeasy configure - Do NOT write
workflow.yamlorgen.yamlfiles directly - Use CLI commands - Do NOT copy
.speakeasy/directories between projects - Each needs its own config
Incorrect
# WRONG: Do not do this
mkdir -p .speakeasy
cat > .speakeasy/workflow.yaml << 'EOF'
...
EOF
Correct
# RIGHT: Use CLI commands
speakeasy quickstart --skip-interactive --output console \
-s openapi.yaml -t typescript -n "MySDK" -p "my-sdk"
speakeasy configure targets --target-type python --source my-source
Troubleshooting
| Issue | Solution |
|---|---|
| Wrong target generated | Specify -t target-name in speakeasy run |
| Source not found | Run speakeasy configure sources to add it |
| Target not found | Run speakeasy configure targets to add it |
| Config out of sync | Run speakeasy run to regenerate |
After Making Changes
After adding sources or targets, regenerate:
speakeasy run --output console
After Making Changes
After modifying workflow.yaml or per-target gen.yaml, prompt the user to regenerate the SDK(s):
Configuration complete. Would you like to regenerate the SDK(s) now with
speakeasy run?
If the user confirms, run:
# Generate all targets
speakeasy run --output console
# Or generate a specific target
speakeasy run -t <target-name> --output console
Changes to workflow.yaml and gen.yaml only take effect after regeneration.
Related Skills
start-new-sdk-project- Initial SDK setup for single targetconfigure-sdk-options- Language-specific gen.yaml optionsmanage-openapi-overlays- Spec customization with overlaysorchestrate-multi-repo-sdks- Separate repository per language
More from speakeasy-api/skills
writing-openapi-specs
Reference guide for OpenAPI specification best practices, naming conventions, and expressing complex REST API patterns like polymorphism, enums, file uploads, and server-sent events. Use when writing or improving OpenAPI specs to ensure they follow established conventions and generate quality SDKs.
77extract-openapi-from-code
Use when extracting or generating an OpenAPI spec from existing API code. Triggers on "extract OpenAPI", "code first", "generate spec from code", "FastAPI OpenAPI", "Spring Boot OpenAPI", "NestJS swagger", "Django OpenAPI", "Flask OpenAPI", "Rails swagger", "Laravel OpenAPI", "existing API code
69speakeasy-context
Speakeasy workflow: run 'agent context' FIRST, do task, run 'agent feedback' LAST. Triggers on speakeasy, SDK, OpenAPI.
51diagnose-generation-failure
Use when SDK generation failed or seeing errors. Triggers on "generation failed", "speakeasy run failed", "SDK build error", "workflow failed", "Step Failed", "why did generation fail
50manage-openapi-overlays
Use when creating, applying, or validating overlay files including x-speakeasy extensions. Covers overlay syntax, JSONPath targeting, retries, pagination, naming, grouping, open enums, global headers, custom security. Triggers on "create overlay", "apply overlay", "overlay file", "x-speakeasy", "add extension", "configure retries", "add pagination", "overlay for retries".
49customize-sdk-hooks
|
48