mcpField
C
configure-sdk-options

configure-sdk-options

github.com/speakeasy-api开发1894 次安装37 周前更新
代码仓库

关于 configure-sdk-options

用于配置现有 Speakeasy SDK 的 `gen.yaml`,适合需要调整语言专属生成和运行时选项的开发者。内容覆盖七种语言、自定义 hooks 和单次调用覆盖设置,不用于创建新 SDK。

主要功能

  1. 01配置七种语言的 `gen.yaml`
  2. 02设置异步模式和 SDK hooks
  3. 03覆盖重试、超时和服务选择
  4. 04配置分页与发布选项

适用场景

  1. 01调整现有 SDK 的生成设置
  2. 02设置运行时重试或超时行为
  3. 03在运行时切换已配置的 API 服务

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/speakeasy-api/sdk-generation-skills --skill configure-sdk-options

安装后在 Claude Code 中输入/configure-sdk-options确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

content/languages/
csharp.md
go.md
java.md
php.md
python.md
ruby.md
typescript.md

详细介绍

配置 SDK 选项

为现有 Speakeasy SDK 配置 gen.yaml 选项。支持 TypeScript、Python、Go、Java、C#、PHP 和 Ruby。

对于新的 SDK 项目:请改用 start-new-sdk-project 技能。此技能用于配置现有 SDK。

语言专属指南

如需全面了解配置详情,请参阅语言专属指南:

语言指南主要功能
TypeScriptcontent/languages/typescript.mdZod 验证、React Query、独立函数、双模块格式
Pythoncontent/languages/python.mdPydantic 模型、异步模式(both/split)、uv/poetry 支持
Gocontent/languages/go.md响应格式、接口生成、K8s 集成
Javacontent/languages/java.mdBuilder 模式、Gradle 自定义、Maven Central 发布
C#content/languages/csharp.md异步/等待、取消令牌、DI 集成、NuGet
PHPcontent/languages/php.mdLaravel 集成、Guzzle 配置、Packagist 发布
Rubycontent/languages/ruby.mdSorbet 类型标注、Rails 集成、RubyGems 发布

这些指南包含详细的配置选项、代码示例、框架集成和发布说明。

适用场景

  • 为现有 SDK 配置特定语言的 gen.yaml 选项
  • 设置 SDK 钩子、异步模式或发布流程
  • 在应用代码中配置运行时行为(重试、超时、服务选择)
  • 用户说:“configure SDK”“gen.yaml options”“SDK config”“runtime override”“per-call config”
  • 用户询问:Zod、Pydantic、NuGet、PyPI、npm、Maven Central、Packagist、RubyGems

输入

输入必填描述
现有 SDK是已创建 .speakeasy/workflow.yaml 的 SDK
目标语言是TypeScript、Python、Go、Java、C#、PHP 或 Ruby

输出

输出描述
更新后的 gen.yaml特定语言的配置
钩子文件启用时生成的自定义钩子

前置条件

你必须已有一个包含 .speakeasy/workflow.yaml 的 SDK。如果没有,请运行:

speakeasy quickstart --skip-interactive --output console \
  -s openapi.yaml -t <language> -n "MySDK" -p "<package-name>"

通用配置(所有语言)

这些选项适用于 gen.yaml 中的所有 SDK 目标:

<language>:
  version: 1.0.0
  packageName: "my-sdk"

  # Method signatures
  maxMethodParams: 4              # Params before request object
  flatteningOrder: parameters-first

  # Error handling
  responseFormat: flat            # or "envelope" (Go)
  clientServerStatusCodesAsErrors: true

TypeScript 配置

typescript:
  version: 1.0.0
  packageName: "@myorg/my-sdk"
  moduleFormat: dual              # esm, commonjs, or dual
  zodVersion: v4-mini             # v3, v4, or v4-mini
  enableCustomCodeRegions: true   # For custom code
  enableReactQuery: true          # React Query hooks
功能说明
Zod 验证自动应用于所有模型
Tree-shaking使用 moduleFormat: dual 和独立函数
JSR 发布创建 jsr.json,运行 deno publish
npm 发布标准的 npm publish

用于 tree-shaking 的独立函数:

import { TodoCore } from "my-sdk/core.js";
import { todosCreate } from "my-sdk/funcs/todosCreate.js";
const sdk = new TodoCore({ apiKey: "..." });

Python 配置

python:
  version: 1.0.0
  packageName: "my-sdk"
  asyncMode: both                 # both or split
  packageManager: uv              # uv or poetry
  envVarPrefix: ""                # Prefix for env config
功能说明
Pydantic 模型自动应用于所有模型
异步模式 bothsdk.method() 和 sdk.method_async()
异步模式 splitSDK() 和 AsyncSDK() 构造函数
PyPI 发布uv publish 或 poetry publish

异步模式:

# asyncMode: both (default)
result = sdk.users.list()           # sync
result = await sdk.users.list_async() # async

# asyncMode: split
sdk = MySDK()                       # sync only
async_sdk = AsyncMySDK()            # async only

Go 配置

go:
  version: 0.1.0
  packageName: github.com/myorg/my-sdk
  maxMethodParams: 2
  methodArguments: require-security-and-request
  responseFormat: envelope
  flattenGlobalSecurity: true
功能说明
接口使用 ifacemaker 生成
Mock使用 mockery 生成
K8s 集成添加 kubebuilder 标记,运行 controller-gen

用于测试的接口生成:

go install github.com/vburenin/ifacemaker@latest
go install github.com/vektra/mockery/v2@latest
ifacemaker --file consumers.go --struct Consumers --iface ConsumersSDK --output consumers_i.go
mockery

Java 配置

java:
  version: 1.0.0
  groupID: com.myorg
  artifactID: my-sdk
  packageName: com.myorg.mysdk
  methodArguments: require-security-and-request
功能说明
Builder 模式自动应用于所有类
构建自定义使用 build-extras.gradle(会保留)
Maven Central./gradlew publishToSonatype closeAndReleaseSonatypeStagingRepository

客户端用法:

MySdk sdk = MySdk.builder()
    .security(Security.builder().apiKey("key").build())
    .build();

C# 配置

csharp:
  version: 1.0.0
  packageName: MyOrg.MySDK
  dotnetVersion: "6.0"
  baseErrorName: MySDKException
功能说明
Async/await默认所有操作均为异步
SSE 流式传输支持 EventStream<T>
NuGet 发布dotnet pack -c Release && dotnet nuget push

支持取消的异步操作:

var cts = new CancellationTokenSource(TimeSpan.FromSeconds(30));
var result = await sdk.Users.ListAsync(cancellationToken: cts.Token);

PHP 配置

php:
  version: 1.0.0
  packageName: myorg/my-sdk
  namespace: MyOrg\MySDK
功能说明
PHP 8.2+最低要求版本
GuzzleHTTP 客户端(可配置超时)
Packagist标记发布版本,并在 Packagist.org 上注册

用于刷新令牌的安全回调:

$sdk = MySDK\MySDK::builder()
    ->setSecuritySource(fn() => getTokenFromCache() ?? refreshToken())
    ->build();

Ruby 配置

ruby:
  version: 1.0.0
  packageName: my-sdk
  module: MySdk
  typingStrategy: sorbet          # sorbet or none
功能说明
Sorbet 类型检查可选,可通过 typingStrategy: sorbet 启用
FaradayHTTP 客户端
RubyGemsgem build && gem push

SDK 钩子(所有语言)

通过 enableCustomCodeRegions: true 启用自定义钩子。重新生成时会保留钩子文件。

语言钩子位置
TypeScriptsrc/hooks/
Pythonsrc/<pkg>/_hooks/
Gointernal/hooks/
Javasrc/main/java/.../hooks/
C#src/.../Hooks/
PHPsrc/Hooks/
Rubylib/.../sdk_hooks/

有关钩子实现的详细信息,请参阅 customize-sdk-hooks 技能。

运行时覆盖

可在实例化 SDK 时或针对单次调用配置运行时行为。这些设置会覆盖 gen.yaml 默认值。

服务器选择

在 OpenAPI 规范中定义服务器 ID,然后在运行时选择:

# OpenAPI spec
servers:
  - url: https://api.example.com
    x-speakeasy-server-id: production
  - url: https://sandbox.example.com
    x-speakeasy-server-id: sandbox
语言SDK 构造函数自定义 URL
TypeScriptnew SDK({ server: "sandbox" })new SDK({ serverURL: "..." })
PythonSDK(server="sandbox")SDK(server_url="...")
GoSDK.New(SDK.WithServer("sandbox"))SDK.WithServerURL("...")
重试覆盖

针对单次调用覆盖重试行为(规范默认值通过 x-speakeasy-retries 设置):

TypeScript:

const res = await sdk.payments.create({ amount: 1000 }, {
  retries: {
    strategy: "backoff",
    backoff: { initialInterval: 1000, maxInterval: 30000, maxElapsedTime: 120000, exponent: 2.0 },
    retryConnectionErrors: true,
  },
});

Python:

from sdk.utils import BackoffStrategy, RetryConfig
res = sdk.payments.create(amount=1000, retries=RetryConfig("backoff",
    backoff=BackoffStrategy(1000, 30000, 120000, 2.0), retry_connection_errors=True))

Go:

res, err := sdk.Payments.Create(ctx, req, operations.WithRetries(retry.Config{
    Strategy: "backoff", Backoff: &retry.BackoffStrategy{
        InitialInterval: 1000, MaxInterval: 30000, MaxElapsedTime: 120000, Exponent: 2.0},
    RetryConnectionErrors: true}))
超时覆盖

在 SDK 构造函数中设置全局超时,或针对单次调用设置:

语言全局单次调用
TypeScriptnew SDK({ timeoutMs: 30000 })sdk.op({}, { timeoutMs: 60000 })
PythonSDK(timeout_ms=30000)sdk.op(timeout_ms=60000)
GoSDK.WithTimeoutMs(30000)operations.WithTimeoutMs(60000)
分页用法

当规范中设置了 x-speakeasy-pagination 时,SDK 会自动生成分页辅助工具:

// Auto-iterate all pages
for await (const user of await sdk.users.list({ limit: 50 })) {
  console.log(user.name);
}

// Manual pagination
let page = await sdk.users.list({ limit: 50 });
while (page) {
  for (const user of page.data) { console.log(user.name); }
  page = await page.next();
}

决策框架

情况操作
需要摇树优化(TS)设置 moduleFormat: dual,使用独立函数
需要异步/同步(Python)设置 asyncMode: both(默认值)
需要独立的异步客户端设置 asyncMode: split(Python)
需要用于测试的接口(Go)使用 ifacemaker + mockery
需要自定义构建配置(Java)编辑 build-extras.gradle
需要在运行时覆盖重试设置在单次调用选项中传入 retries 配置
需要在运行时覆盖超时设置在构造函数或单次调用中设置 timeoutMs
需要切换服务器在规范中使用 x-speakeasy-server-id,并在运行时选择

不要做的事

  • 不要将此技能用于初始 SDK 生成——请使用 start-new-sdk-project
  • 不要编辑自定义代码区域之外的生成文件
  • 不要修改 src/ 中不在保留目录(hooks、extra)内的文件

故障排查

语言问题解决方案
TypeScript包体积过大使用独立函数
Python异步分页阻塞启用 fixFlags.asyncPaginationSep2025: true
Go未生成接口确保结构体已导出(首字母大写)
JavaGradle 同步失败运行 ./gradlew --refresh-dependencies
C#异步死锁使用 await,而不是 .Result
PHPPHP 版本错误需要 PHP 8.2+
RubySorbet 错误运行 bundle exec tapioca gems
全部重试不起作用确保 x-speakeasy-retries 位于文档根级别或操作级别
全部无法识别服务器 ID为每个服务器条目添加 x-speakeasy-server-id
全部分页 next() 未定义为列表操作添加 x-speakeasy-pagination

完成更改后

修改 gen.yaml 配置后,提示用户重新生成 SDK:

配置完成。 是否现在使用 speakeasy run 重新生成 SDK?

如果用户确认,请运行:

speakeasy run --output console

更改 gen.yaml 只有在重新生成后才会生效。

相关技能

  • start-new-sdk-project - 初始 SDK 生成
  • customize-sdk-hooks - 钩子实现详解
  • manage-openapi-overlays - 规范自定义

评论

支持 Markdown