Skip to main content Início Criadores speakeasy-api Skills extract-openapi-from-code
extract-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"
Ir para a instalação Skills Marketplace Descubra e explore skills de IA criadas pela comunidade.
Instalar com Codex ou Claude Copie este prompt, cole no Codex, Claude ou outro assistente e deixe que ele revise a página da skill e instale para você.
Copiar promptMostrar detalhes do prompt Um comando direto ignora o prompt de revisão. Verifique a origem antes de executá-lo.
npx skills add https://github.com/speakeasy-api/skills --skill extract-openapi-from-codeO comando permanece em uma só linha. Role horizontalmente para revisá-lo antes de copiar.
Prefere uma cópia local? Baixe os arquivos disponíveis atualmente no SkillsMP.
Baixar Zip Baixando... Use when CONFIGURING an existing SDK - NOT for initial generation. Covers gen.yaml configuration for all languages: TypeScript, Python, Go, Java, C#, PHP, Ruby. Also covers runtime overrides (retries, timeouts, server selection) in application code. Triggers on "configure SDK", "gen.yaml", "SDK options", "SDK config", "SDK configuration", "runtime override", "SDK client config", "override timeout", "per-call config". For NEW SDK generation, use start-new-sdk-project instead.
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".
Ocupações relacionadas SOC
Baseado na classificação ocupacional SOC
Explorador de arquivos
9 arquivos name extract-openapi-from-code description 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" license Apache-2.0
extract-openapi-from-code
Extract an OpenAPI specification from an existing API codebase. Covers eight major frameworks across Python, Java, JavaScript/TypeScript, Ruby, and PHP.
Content Guides
Each guide provides detailed setup, schema definition, Speakeasy extensions, authentication, and troubleshooting for that framework.
When to Use
User has an existing API and wants to generate an OpenAPI spec from it
User wants to create an SDK from code that has no OpenAPI spec yet
User mentions a specific framework (FastAPI, Flask, Django, Spring Boot, NestJS, Hono, Rails, Laravel)
User says: "extract OpenAPI", "code first", "generate spec from code", "existing API code"
Inputs Input Required Description Framework Yes The API framework in use (see Decision Framework) Project path Yes Root directory of the API project Output path No Where to write the spec (default: openapi.json or openapi.yaml) Target language No SDK target language, if generating an SDK after extraction
Outputs Output Description OpenAPI spec A JSON or YAML file describing the API Validation report Lint results from speakeasy lint
Prerequisites
The API project must be buildable and its dependencies installed
For runtime extraction (FastAPI, Spring Boot, NestJS, Hono), the app must be importable or startable
speakeasy CLI installed for post-extraction validation and SDK generation
Decision Framework Use this tree to determine the extraction method:
Framework Language Method Requires Running Server? FastAPI Python Built-in export No Flask (flask-smorest) Python CLI command No Django REST Framework Python drf-spectacular CLI No Spring Boot (springdoc) Java HTTP endpoint Yes NestJS TypeScript HTTP endpoint or script Yes Hono (zod-openapi) TypeScript Programmatic export No Rails (rswag) Ruby Rake task No Laravel (l5-swagger) PHP Artisan command No
Command Choose the command matching your framework below. After extraction, always validate with speakeasy lint.
Python: FastAPI FastAPI generates an OpenAPI schema at runtime. Export it without starting the server:
python -c "import json; from myapp import app; print(json.dumps(app.openapi()))" > openapi.json
Replace myapp with the module containing your FastAPI app instance. If the app uses a factory pattern:
python -c "import json; from myapp import create_app; app = create_app(); print(json.dumps(app.openapi()))" > openapi.json
You can also start the server and fetch from http://localhost:8000/openapi.json.
Python: Flask (flask-smorest) flask openapi write openapi.json
If using apispec directly, export programmatically:
import json
from myapp import create_app, spec
app = create_app()
with app.app_context():
print (json.dumps(spec.to_dict()))
Python: Django REST Framework python manage.py spectacular --file openapi.yaml
python manage.py spectacular --format openapi-json --file openapi.json
Java: Spring Boot
./mvnw spring-boot:run &
sleep 15
curl http://localhost:8080/v3/api-docs -o openapi.json
curl http://localhost:8080/v3/api-docs.yaml -o openapi.yaml
kill %1
If the server runs on a different port or context path, adjust the URL accordingly.
TypeScript: NestJS
npm run start &
sleep 10
curl http://localhost:3000/api-json -o openapi.json
kill %1
Alternatively, create a script to export without running the server:
import { NestFactory } from '@nestjs/core' ;
import { SwaggerModule , DocumentBuilder } from '@nestjs/swagger' ;
import { AppModule } from '../src/app.module' ;
import * as fs from 'fs' ;
async function bootstrap ( ) {
const app = await NestFactory .create (AppModule , { logger : false });
const config = new DocumentBuilder ().setTitle ('API' ).build ();
const doc = SwaggerModule .createDocument (app, config);
fs.writeFileSync ('openapi.json' , JSON .stringify (doc, null , 2 ));
await app.close ();
}
bootstrap ();
TypeScript: Hono (zod-openapi)
import { app } from '../src/app' ;
import * as fs from 'fs' ;
const doc = app.doc ('/doc' , {
openapi : '3.1.0' ,
info : { title : 'API' , version : '1.0.0' },
});
fs.writeFileSync ('openapi.json' , JSON .stringify (doc, null , 2 ));
npx tsx scripts/export-openapi.ts
Ruby: Rails (rswag) rails rswag:specs:swaggerize
The spec is written to swagger/v1/swagger.yaml by default (configurable in config/initializers/rswag_api.rb).
PHP: Laravel (l5-swagger) php artisan l5-swagger:generate
The spec is written to storage/api-docs/api-docs.json by default.
Post-Extraction Steps After extracting the spec, always run these steps:
1. Validate the spec speakeasy lint openapi --non-interactive -s openapi.json
2. Fix issues with overlays (if needed) If validation reveals issues, use an overlay rather than modifying the extracted spec directly:
speakeasy overlay apply -s openapi.json -o fixes.yaml
To fix validation errors, create an OpenAPI overlay file and apply it with speakeasy overlay apply -s <spec> -o <overlay>.
3. Generate an SDK speakeasy quickstart --skip-interactive --output console \
-s openapi.json \
-t <target> \
-n <name> \
-p <package>
Run speakeasy quickstart -s <spec> -t <language> to initialize a new SDK project.
Example Full workflow for a FastAPI project:
cd /path/to/my-fastapi-project
python -c "import json; from main import app; print(json.dumps(app.openapi()))" > openapi.json
speakeasy lint openapi --non-interactive -s openapi.json
speakeasy quickstart --skip-interactive --output console \
-s openapi.json \
-t typescript \
-n "MyApiSDK" \
-p "my-api-sdk"
Adding Speakeasy Extensions After extracting a spec, add Speakeasy-specific extensions for better SDK output. These can be added in framework config or via overlay.
FastAPI: Add Extensions via openapi_extra @app.get(
"/items" ,
openapi_extra={
"x-speakeasy-retries" : {
"strategy" : "backoff" ,
"backoff" : {"initialInterval" : 500 , "maxInterval" : 60000 , "exponent" : 1.5 },
"statusCodes" : ["5XX" , "429" ]
},
"x-speakeasy-group" : "items" ,
"x-speakeasy-name-override" : "list"
}
)
def list_items (): ...
Django: Add Extensions via SPECTACULAR_SETTINGS
SPECTACULAR_SETTINGS = {
'EXTENSIONS_TO_SCHEMA_FUNCTION' : lambda generator, request, public: {
'x-speakeasy-retries' : {
'strategy' : 'backoff' ,
'backoff' : {'initialInterval' : 500 , 'maxInterval' : 60000 , 'exponent' : 1.5 },
'statusCodes' : ['5XX' ]
}
}
}
Spring Boot: Add Extensions via Custom OperationCustomizer @Bean
public OperationCustomizer operationCustomizer () {
return (operation, handlerMethod) -> {
operation.addExtension("x-speakeasy-group" ,
handlerMethod.getBeanType().getSimpleName().replace("Controller" , "" ).toLowerCase());
return operation;
};
}
NestJS: Add Extensions via Decorator Options @Get ()
@ApiOperation ({
summary : 'List items' ,
operationId : 'listItems'
})
@ApiExtension ('x-speakeasy-group' , 'items' )
@ApiExtension ('x-speakeasy-name-override' , 'list' )
listItems ( ) { ... }
Via Overlay (Any Framework) If you cannot modify framework code, use an overlay:
overlay: 1.0 .0
info:
title: Speakeasy Extensions
version: 1.0 .0
actions:
- target: $.paths['/items'].get
update:
x-speakeasy-group: items
x-speakeasy-name-override: list
Common Issues After Extraction Issue Symptom Fix Missing operationIds Lint warning; SDK methods get generic names Add operationIds via overlay or use speakeasy suggest operation-ids -s openapi.json Missing descriptions Lint hints; SDK has no documentation Add descriptions to endpoints and schemas in source code or via overlay Overly permissive schemas Schemas use additionalProperties: true or lack type constraints Tighten schemas in source code; use stricter validation decorators No response schemas Lint errors; SDK return types are any/object Add explicit response models to your framework endpoints Duplicate operationIds Lint errors; generation fails Ensure each endpoint has a unique operationId Missing authentication No security schemes in spec Add security metadata to your framework config or via overlay
What NOT to Do
Do NOT hand-write an OpenAPI spec when the framework can generate one -- always extract first
Do NOT edit the extracted spec directly -- use overlays for fixes so re-extraction does not lose changes
Do NOT skip validation -- extracted specs often have issues that block SDK generation
Do NOT assume the extracted spec is complete -- frameworks may omit auth, error responses, or headers
Do NOT start the server in production mode for extraction -- use development or test configuration
Troubleshooting Error Cause Solution ModuleNotFoundError (Python)App dependencies not installed Run pip install -r requirements.txt or pip install -e . Connection refused (Spring Boot, NestJS) Server not fully started Increase sleep time or poll for readiness Empty or minimal spec Routes not registered at import time Ensure all route modules are imported; check lazy loading YAML parse error Extracted file has invalid syntax Re-extract; check for print statements polluting stdout Cannot find module (Node.js)Dependencies not installed Run npm install or yarn install No /v3/api-docs endpoint (Spring Boot) springdoc not configured Add springdoc-openapi-starter-webmvc-ui to dependencies No /api-json endpoint (NestJS) Swagger module not set up Configure SwaggerModule.setup(app, ...) in main.ts
Related Skills
manage-openapi-overlays - Add x-speakeasy-* extensions via overlay
start-new-sdk-project - Generate SDK after extraction