Skip to main content

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

launchpad_ai-0.1.2.tar.gz (17.9 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

launchpad_ai-0.1.2-py3-none-any.whl (15.6 kB view details)

Uploaded Python 3

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

Hashes for launchpad_ai-0.1.2.tar.gz
Algorithm Hash digest
SHA256 07b0df61489dd322033c019f972453487959606f7f8f495a2730fcc52e2ccdfc
MD5 af6524ed610de8b806a2883e4c06888c
BLAKE2b-256 300a80b104a448f0607fd71a6ec37278099f6b260065dc3faec635d1c6203d98

See more details on using hashes here.

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

Hashes for launchpad_ai-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 0ec1ceb3983810c8161343e1dc0bac22cb993e55f5589009a9d67a84e5188dd8
MD5 bce091e2ae42a92b4fd787c10c6c7876
BLAKE2b-256 5cc15bf63bd0d92f054920c716fbd594cd76aaf15fc9c5bd25ce7029dcca5653

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page