Skip to main content

model-compose

Deploy production-ready AI services in minutes.

One YAML file. Any model. Any protocol. Any runtime. Build chat APIs, RAG pipelines, autonomous agents, and MCP servers without writing application code — then deploy the same file anywhere, like docker-compose.

AI systems should not be locked into a single provider, runtime, or cloud. model-compose is built on four principles:

  • Composable — Models, agents, workflows, tools, memory, and protocols are interchangeable building blocks.
  • Portable — Define your AI system once, deploy anywhere without re-engineering.
  • Hybrid-First — Bridge cloud APIs and local models on your own terms.
  • Stream-Native — Data flows through workflows as it arrives — tokens, audio, frames, and events as first-class values.

Quick Start

Install with pip:

pip install model-compose

Or with uv:

uv pip install model-compose

Create model-compose.yml:

controller:
  adapter:
    type: http-server
    port: 8080
  webui:
    port: 8081

workflow:
  job:
    component: chatgpt
    input:
      prompt: ${input.prompt}

component:
  id: chatgpt
  type: http-client
  base_url: https://api.openai.com/v1
  action:
    path: /chat/completions
    method: POST
    headers:
      Authorization: Bearer ${env.OPENAI_API_KEY}
    body:
      model: gpt-4o
      messages:
        - role: user
          content: ${input.prompt}

Run it:

export OPENAI_API_KEY=your-key
model-compose up

That's it. You're serving GPT-4o at http://localhost:8080 with a web UI at http://localhost:8081. No application code. No framework boilerplate. Same file runs locally, in Docker, or in production.


What You Can Build

Here's what a single YAML file can serve today — just a few examples.

🤖 Autonomous Agents

Build a ReAct agent that plans, uses tools, and completes multi-step tasks — declaratively.

component:
  id: research-agent
  type: agent
  tools: [search-web, fetch-page]
  max_iteration_count: 10
  action:
    model:
      component: chatgpt
    system_prompt: You are a web research assistant.
    user_prompt: ${input.question}

See simple agents like a code reviewer, a RAG assistant, and a web researcher in agents/.

🔍 RAG Pipelines

Compose embedding, vector search, and generation into a single workflow — no glue code.

workflow:
  jobs:
    - id: embed
      component: embedder
      input: { text: ${input.query} }

    - id: retrieve
      component: knowledge
      action: search
      input: { vector: ${jobs.embed.output} }

    - id: answer
      component: chatgpt
      input:
        context: ${jobs.retrieve.output}
        question: ${input.query}

Native drivers ship for Chroma, Milvus, Qdrant, FAISS, Neo4j, ArangoDB, and Redis.

🌐 MCP Servers

Turn any workflow into an MCP server that Claude, ChatGPT, or Cursor can use — one line change.

controller:
  adapter:
    type: mcp-server   # ← was: http-server
    port: 8080

Full examples live in mcp-servers/, including a Slack bot MCP.

⚡ Streaming Multi-Modal Workflows

Stream tokens, audio chunks, and video frames end-to-end — first-class across every stage.

workflow:
  job:
    component: chatgpt
    output: ${output as sse-text}

component:
  id: chatgpt
  type: http-client
  action:
    body: { stream: true, ... }
    stream_format: json
    output: ${response[].choices[0].delta.content}

Real-time TTS, video-to-frames, and live chat examples live under data-streaming/ and showcase/.


From Development to Production

The same YAML that runs on your laptop scales without a rewrite.

1. Develop locally

model-compose up

Runs on your machine with a Gradio web UI at :8081 — perfect for iteration.

2. Deploy as a container

Add a runtime: block. Same file, same behavior:

controller:
  runtime:
    type: docker
    image: my-ai-service:latest
    ports: [ "8080:8080" ]

3. Scale horizontally

Add a queue. Dispatchers accept jobs, subscribers process them across N machines:

controller:
  adapter: { type: http-server, port: 8080 }
  queue:
    driver: redis
    host: redis.internal
    name: my-queue

No shared filesystem. No code changes. Just add more subscribers to scale.


Why model-compose?

model-compose Managed APIs (OpenAI, etc.) Code Frameworks (LangChain, etc.)
Time to first API Minutes (one YAML) Hours (SDK + server code) Days (framework + integration)
Provider Coupling Multi-provider via config Single provider per SDK Multi-provider via abstractions
Code Coupling Declarative YAML — no application code Application code required Framework-specific code required
Infrastructure Control Full Sovereignty Provider-controlled Heavy Abstraction
Runtime Flexibility Hybrid-First (Local + Cloud) Cloud Only Complex to customize
Protocol Support HTTP / WebSocket / MCP Provider-specific Limited
Data Streaming First-class across all stages Response-only (SSE tokens) Framework-wrapped generators
Deployment Docker / Native / Virtualenv / Process Provider-managed Manual integration

Highlights

  • Any model, anywhere — HuggingFace, vLLM, llama.cpp locally, or OpenAI/Anthropic/Google/xAI via HTTP
  • Agents in YAML — ReAct loops, tool use, multi-step reasoning — no code
  • Human-in-the-loop — pause workflows for approval, resume from CLI/UI/API
  • 20+ components — models, agents, HTTP/WebSocket clients, vector/graph stores, shell, browsers, and more
  • Any protocol — HTTP REST, WebSocket, or MCP with one line
  • Any runtime — Docker, native, virtualenv, process, embedded — switch in one line
  • Distributed — Redis queue dispatch for horizontal scaling
  • Instant Web UI — Gradio-powered UI in 2 lines of YAML
  • Streaming everywhere — SSE, WebSocket, and inter-job streams as first-class values

Examples

Browse examples by category:

Category What's inside
agents/ Code reviewer, RAG assistant, Web researcher, Web page analyzer, ...
showcase/ End-to-end pipelines: disk analysis, face-based scene search, real-time TTS
model-providers/ OpenAI, Anthropic, xAI, Google, ElevenLabs, vLLM
model-tasks/ Local chat, embedding, TTS, VLM, face embedding, ...
mcp-servers/ Build MCP servers exposed to Claude, Cursor, ChatGPT
workflow-queue/ Redis-backed distributed dispatch (streaming + non-streaming)
data-streaming/ Video-to-frames, YouTube live chat, streaming inputs
integrations/ Vector/graph/KV stores, search engines, channels, tunnels

Browse the full catalog in examples/README.md.


Architecture

Protocol adapters → Composition engine → Runtime executors

Architecture Diagram


Contributing

We welcome all contributions — bug fixes, docs improvements, new examples.

git clone https://github.com/hanyeol/model-compose.git
cd model-compose
pip install -e .

See CONTRIBUTING if available, or open a PR directly.


License

MIT License © 2025-2026 Hanyeol Cho.


Contact

Have questions, ideas, or feedback? Open an issue or start a discussion on GitHub Discussions.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

model_compose-0.4.93.tar.gz (721.4 kB view details)

Uploaded Source

Built Distribution

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

model_compose-0.4.93-py3-none-any.whl (1.3 MB view details)

Uploaded Python 3

File details

Details for the file model_compose-0.4.93.tar.gz.

File metadata

  • Download URL: model_compose-0.4.93.tar.gz
  • Upload date:
  • Size: 721.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.11.4

File hashes

Hashes for model_compose-0.4.93.tar.gz
Algorithm Hash digest
SHA256 132442e48887860b2a9a7526c7b8865921093b5dd57bcbd0430c3fab62eac201
MD5 4505e8c08e701013d6731921f55965c3
BLAKE2b-256 1e84720f74314656a742bb590795950094a3016e3730fad8ae570ded1a824310

See more details on using hashes here.

File details

Details for the file model_compose-0.4.93-py3-none-any.whl.

File metadata

  • Download URL: model_compose-0.4.93-py3-none-any.whl
  • Upload date:
  • Size: 1.3 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.11.4

File hashes

Hashes for model_compose-0.4.93-py3-none-any.whl
Algorithm Hash digest
SHA256 feebe5660514ac2bce074ce1a75728798d8aadc778c02ff083cf5752b4a8a65a
MD5 560dae9ef94d885a24b430e3738c2209
BLAKE2b-256 49325681a5ab3c4fbb90cf4a79683cbec3f3a6e2575286be8c57fbd9b8d5467f

See more details on using hashes here.

Release history Release notifications | RSS feed

0.4.94

2 files

This release

0.4.93 This release

2 files

0.4.92

2 files

0.4.91

2 files

0.4.90

2 files

0.4.89

2 files

0.4.88

2 files

0.4.87

2 files

0.4.86

2 files

0.4.85

2 files

0.4.84

2 files

0.4.83

2 files

0.4.82

2 files

0.4.81

2 files

0.4.80

2 files

0.4.79

2 files

0.4.78

2 files

0.4.77

2 files

0.4.76

2 files

0.4.75

2 files

0.4.74

2 files

0.4.73

2 files

0.4.72

2 files

0.4.71

2 files

0.4.70

2 files

0.4.69

2 files

0.4.68

2 files

0.4.67

2 files

0.4.66

2 files

0.4.65

2 files

0.4.64

2 files

0.4.63

2 files

0.4.62

2 files

0.4.61

2 files

0.4.60

2 files

0.4.59

2 files

0.4.58

2 files

0.4.57

2 files

0.4.56

2 files

0.4.55

2 files

0.4.54

2 files

0.4.53

2 files

0.4.52

2 files

0.4.51

2 files

0.4.50

2 files

0.4.49

2 files

0.4.48

2 files

0.4.47

2 files

0.4.46

2 files

0.4.45

2 files

0.4.44

2 files

0.4.43

2 files

0.4.42

2 files

0.4.41

2 files

0.4.40

2 files

0.4.39

2 files

0.4.38

2 files

0.4.37

2 files

0.4.36

2 files

0.4.35

2 files

0.4.34

2 files

0.4.33

2 files

0.4.32

2 files

0.4.31

2 files

0.4.30

2 files

0.4.29

2 files

0.4.28

2 files

0.4.27

2 files

0.4.26

2 files

0.4.25

2 files

0.4.24

2 files

0.4.23

2 files

0.4.22

2 files

0.4.21

2 files

0.4.20

2 files

0.4.19

2 files

0.4.18

2 files

0.4.17

2 files

0.4.16

2 files

0.4.15

2 files

0.4.14

2 files

0.4.13

2 files

0.4.12

2 files

0.4.11

2 files

0.4.10

2 files

0.4.9

2 files

0.4.8

2 files

0.4.7

2 files

0.4.6

2 files

0.4.5

2 files

0.4.4

2 files

0.4.3

2 files

0.4.2

2 files

0.4.1

2 files

0.4.0

2 files

0.3.18

2 files

0.3.17

2 files

0.3.16

2 files

0.3.15

2 files

0.3.14

2 files

0.3.13

2 files

0.3.12

2 files

0.3.11

2 files

0.3.10

2 files

0.3.9

2 files

0.3.8

2 files

0.3.7

2 files

0.3.6

2 files

0.3.5

2 files

0.3.4

2 files

0.3.3

2 files

0.3.2

2 files

0.3.1

2 files

0.3.0

2 files

0.2.12

2 files

0.2.11

2 files

0.2.10

2 files

0.2.9

2 files

0.2.8

2 files

0.2.7

2 files

0.2.6

2 files

0.2.5

2 files

0.2.4

2 files

0.2.3

2 files

0.2.2

2 files

0.2.1

2 files

0.2.0

2 files

0.1.13

2 files

0.1.12

2 files

0.1.11

2 files

0.1.10

2 files

0.1.9

2 files

0.1.8

2 files

0.1.7

2 files

0.1.6

2 files

0.1.5

2 files

0.1.4

2 files

0.1.3

2 files

0.1.2

2 files

0.1.1

2 files

0.1.0

2 files

0.0.17

2 files

0.0.16

2 files

0.0.15

2 files

0.0.14

2 files

0.0.13

2 files

0.0.12

2 files

0.0.11

2 files

0.0.10

2 files

0.0.9

2 files

0.0.8

2 files

0.0.7

2 files

0.0.6

2 files

0.0.5

2 files

0.0.4

2 files

0.0.3

2 files

0.0.2

2 files

0.0.1

2 files

Supported by

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