Launchpad
Launchpad provides a standardized way to turn AI/ML research implementations into reusable, production-ready capabilities. Define your capability once with typed Pydantic contracts — Launchpad handles how it gets delivered.
Why Launchpad?
AI teams repeatedly solve the same problems: wrapping a model call in retry logic, exposing a capability as an API, logging inputs/outputs for evaluation, versioning prompts. Launchpad makes this a one-time effort.
You implement a capability once. Launchpad handles:
- Multiple delivery mechanisms — REST API, MCP tool, gRPC, CLI, async queue
- Typed contracts — Pydantic models as first-class input/output schemas, validated at every boundary
- Manifest-driven configuration — adapters configured via
launchpad.yml, not hardcoded kwargs - Observability — structured logging and eval hooks out of the box
- Reliability — retries, fallbacks, circuit breakers (coming soon)
Core Concepts
| Concept | Description |
|---|---|
| Capability | A typed, self-contained AI function: Capability[InputModel, OutputModel] |
| Adapter | A delivery mechanism that exposes a capability (HTTP, MCP, gRPC, etc.) |
| Manifest | A launchpad.yml file that configures how a capability is exposed |
Quick Start
pip install launchpad-ai
pip install 'launchpad-ai[http]' # HTTP adapter
pip install 'launchpad-ai[mcp]' # MCP adapter
Define your contracts as Pydantic models, then implement the capability:
from pydantic import BaseModel
from launchpad import Capability, capability
class SummarizeInput(BaseModel):
text: str
max_length: int = 200
class SummarizeOutput(BaseModel):
summary: str
@capability(name="summarize", version="1.0")
class Summarize(Capability[SummarizeInput, SummarizeOutput]):
def run(self, input: SummarizeInput) -> SummarizeOutput:
# your implementation here
...
Use it directly:
result = Summarize().run(SummarizeInput(text="..."))
print(result.summary)
Serve over HTTP
from launchpad.adapters.http import HttpAdapter
HttpAdapter(Summarize).serve()
# POST /summarize → { "text": "...", "max_length": 200 }
# GET /health
# GET /docs (OpenAPI)
Expose as an MCP tool
from launchpad.adapters.mcp import McpAdapter
McpAdapter.from_manifest(Summarize, "launchpad.yml").serve()
# Any MCP client (Claude Desktop, Claude Code) can now call "summarize" as a native tool
Configure via manifest
# launchpad.yml
metadata:
version: "1.0"
spec:
interfaces:
http:
enabled: true
host: 0.0.0.0
port: 8080
route_prefix: /v1
cors:
origins: ["*"]
mcp:
enabled: true
transport: stdio # or sse, streamable-http
HttpAdapter.from_manifest(Summarize, "launchpad.yml").serve()
McpAdapter.from_manifest(Summarize, "launchpad.yml").serve()
Structured logging
Logging is automatic — every capability call emits structured log events with no extra code:
capability.run.start — capability, version, input
capability.run.success — + duration_ms, output
capability.run.error — + duration_ms, error, error_type
To get JSON output:
import logging
from launchpad import JsonFormatter
handler = logging.StreamHandler()
handler.setFormatter(JsonFormatter())
logging.getLogger("launchpad.capability").addHandler(handler)
Set log_io = False on a capability to suppress payload logging for sensitive data.
Eval hooks
Plug in evaluation logic that runs after every successful capability call:
from launchpad import EvalHook, EvalContext
class MyEvalHook(EvalHook):
def on_run(self, ctx: EvalContext) -> None:
print(ctx.capability, ctx.duration_ms, ctx.output)
Summarize.eval_hooks.append(MyEvalHook())
Project Structure
launchpad/
├── src/launchpad/
│ ├── core/ # Capability[I,O] base class and @capability decorator
│ ├── adapters/ # http/, mcp/ — one folder per adapter
│ ├── config/ # ManifestConfig and per-adapter interface configs
│ ├── observability/ # Structured logging, JsonFormatter, EvalHook
│ └── pipeline/ # Capability composition (coming soon)
├── examples/ # Self-contained runnable examples
└── tests/
Documentation
See AGENTS.md for conventions used when building capabilities and adapters in this repo.
License
Apache 2.0
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file launchpad_ai-0.1.2.tar.gz.
File metadata
- Download URL: launchpad_ai-0.1.2.tar.gz
- Upload date:
- Size: 17.9 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/7.0.0 CPython/3.10.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
07b0df61489dd322033c019f972453487959606f7f8f495a2730fcc52e2ccdfc
|
|
| MD5 |
af6524ed610de8b806a2883e4c06888c
|
|
| BLAKE2b-256 |
300a80b104a448f0607fd71a6ec37278099f6b260065dc3faec635d1c6203d98
|
File details
Details for the file launchpad_ai-0.1.2-py3-none-any.whl.
File metadata
- Download URL: launchpad_ai-0.1.2-py3-none-any.whl
- Upload date:
- Size: 15.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/7.0.0 CPython/3.10.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0ec1ceb3983810c8161343e1dc0bac22cb993e55f5589009a9d67a84e5188dd8
|
|
| MD5 |
bce091e2ae42a92b4fd787c10c6c7876
|
|
| BLAKE2b-256 |
5cc15bf63bd0d92f054920c716fbd594cd76aaf15fc9c5bd25ce7029dcca5653
|