# Build with Hyphen

<img
  src="/brand/banner-b-01.webp"
  alt=""
  loading="lazy"
  width="1280"
  height="549"
  className="brand-band"
/>

These pages are for developers writing their own applications, not for people
wiring up a coding agent. If you want the latter, start at
[Connect your coding agent](/agents/claude-code).

## Two values, every time

Almost every Python and TypeScript LLM framework is built on top of the
official OpenAI SDK, or on a client that copies its interface. That means
pointing them at Hyphen is the same two-line change:

```
Base URL   https://api.hyphen-solution.com/v1
API key    sk-...
```

Set those, put a real model ID in the model field, and the rest of the
framework carries on as if it were talking to OpenAI. There is no shim to
install and no fork to maintain.

The framework pages below are setup guides built from each framework's official
documentation. They have not been run end to end against the gateway.

```python
# The shape underneath all of it
from openai import OpenAI

client = OpenAI(
    base_url="https://api.hyphen-solution.com/v1",
    api_key="sk-...",
)
```

## The cap is the point

Here is the part that matters for this audience specifically.

Every Hyphen key carries a **hard monthly budget**. When it is spent, requests
return HTTP 429. They do not run over and bill you. There is no overage line,
no burst pricing, no surprise invoice on the first of the month.

An unattended agent loop cannot run up a bill. A retry storm in production
cannot run up a bill. A `while True` you forgot to break out of cannot run up a
bill. The worst case is a 429 and a phone call from a user, not a five-figure
statement.

That is a different risk profile from metered frontier APIs, and it is why
building on a flat-rate gateway is worth the config change. See
[Rate limits & caps](/rate-limits) for how the budget works, and
[Handling the 429 cap](/recipes/handling-429) for detecting it in code.

## Pick your framework

**Python**

- [LangChain & LangGraph](/build/langchain): the biggest ecosystem, and graph-based agents.
- [LlamaIndex](/build/llamaindex): retrieval and document workflows.
- [Pydantic AI](/build/pydantic-ai): typed agents with validated outputs.
- [CrewAI](/build/crewai): multi-agent crews with roles and tasks.
- [Instructor](/build/instructor): structured output from a Pydantic model.
- [DSPy](/build/dspy): programmatic prompting and optimisation.

**TypeScript**

- [Vercel AI SDK](/build/vercel-ai-sdk): the standard for React and Next.js apps.
- [Mastra](/build/mastra): agents, workflows and memory on top of the AI SDK.
- [OpenAI Node SDK](/build/openai-sdk): no framework at all.

## Three things that apply to all of them

**Use a real model ID.** `minimax-m3` for the hard work, `minimax-m2.5` for
cheap and fast, `minimax-text-01` for very large documents. There are no
aliases. Anything else returns an error. See
[Choosing a model](/choosing-a-model).

**Give it output headroom.** The M-series are reasoning models. They spend
tokens thinking before they answer, out of the same `max_tokens` budget. Set it
to 2000 or more for chat and 4000 or more for tool calling, or you will get
empty strings back and wonder why. Every framework exposes this under a
slightly different name, and the pages below point at the right one.

**Do not use `response_format`.** JSON mode and strict JSON schema are not
supported on the M-series. Tool calling is, and it constrains output properly.
Frameworks that default to `response_format` for structured output need to be
switched to their tool-calling mode. See
[Structured JSON output](/recipes/structured-output).

## Not supported

The catalog is text in, text out. No embedding models, no image models, no
audio models. If your pipeline needs embeddings for a vector store, generate
them elsewhere and send the text results here.
