Model
placeholder-medium
placeholder-medium is its own market on OpenFill. A request names placeholder-medium, sets a max price, and pays the level the market is clearing at when it runs.
Datasheet
| Field | Value |
|---|---|
| Model id | placeholder-medium |
| Also answers to | No other id |
| Context length | 262,144 tokens |
| Max output | 128,000 tokens |
| Pricing ratio | 1:8:16 |
The ratio weights a cache-hit, a cache-miss and an output token in the price. max_tokens above the max output is clamped down to it.
The market now
The clearing level, the price of each token kind at that level, and the quote a locked request bids.
Clearing level · placeholder-medium · polling
90% of requests priced above the lock started in time, over the last 10 minutes.
Only requests priced above the lock are counted. At or below it a request bids its own ceiling, so the locked price never sets what it pays.
Set max_price above the lock if you want those odds. Under it, the lock has no bearing on whether the request starts.
Per 1M tokens: $0.0357 cache-hit · $0.2859 cache-miss · $0.5717 output
A price_lock request pays at most the locked price, and cancels with no charge if it has not started within 10 seconds.
The basis is the margin over the level, and a ceiling rather than a charge. See how the lock works.
Uptime, last 24 hours
Each check is a chat completion through the public API, run the way the models board describes.
Uptime
100%
Checks
289
Failures
0
Latency
259ms
Queue wait
958ms
289 of 289 checks passed in the last 24h.
The first call
Set OPENFILL_API_KEY to a key from API keys before running an example. A key starts with of_live_ and is shown once.
import osfrom openai import OpenAI client = OpenAI( base_url="https://api.openfill.ai/v1", api_key=os.environ["OPENFILL_API_KEY"],) r = client.chat.completions.create( model="placeholder-medium", messages=[ {"role": "user", "content": "hi"} ], extra_body={"max_price": 0.10},)print(r.choices[0].message.content)print(r.usage)import OpenAI from "openai"; const client = new OpenAI({ baseURL: "https://api.openfill.ai/v1", apiKey: process.env.OPENFILL_API_KEY,}); const r = await client.chat.completions.create( { model: "placeholder-medium", messages: [{ role: "user", content: "hi" }], }, { headers: { "X-Max-Price": "0.10" } },);console.log(r.choices[0].message.content);console.log(r.usage);curl https://api.openfill.ai/v1/chat/completions \ -H "Authorization: Bearer $OPENFILL_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "placeholder-medium", "messages": [ {"role": "user", "content": "hi"} ], "max_price": 0.10 }'# A key from API keys, shown once when madeexport OPENFILL_API_KEY="of_live_..." # Any tool that reads the OpenAI variablesexport OPENAI_BASE_URL="https://api.openfill.ai/v1"export OPENAI_API_KEY="$OPENFILL_API_KEY" # The max price comes from the key or the# account default, set on Bidding.curl -s "$OPENAI_BASE_URL/models" \ -H "Authorization: Bearer $OPENAI_API_KEY"# The base URL without /v1; Claude Code appends /v1/messagesexport ANTHROPIC_BASE_URL="https://api.openfill.ai"export ANTHROPIC_AUTH_TOKEN="$OPENFILL_API_KEY"export ANTHROPIC_API_KEY="" # Every model slot by hand: discovery keeps only ids that name Claudeexport ANTHROPIC_MODEL="placeholder-medium"export ANTHROPIC_DEFAULT_SONNET_MODEL="placeholder-medium"export ANTHROPIC_DEFAULT_HAIKU_MODEL="placeholder-medium"export CLAUDE_CODE_SUBAGENT_MODEL="placeholder-medium" # The max price and the wait, merged into every request bodyexport CLAUDE_CODE_EXTRA_BODY='{"max_price": 0.10, "max_wait": 600}'export CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1claude# ~/.codex/config.tomlmodel_provider = "openfill"model = "placeholder-medium"model_context_window = <context_length from GET /v1/models>web_search = "disabled"show_raw_agent_reasoning = true [model_providers.openfill]name = "OpenFill"base_url = "https://api.openfill.ai/v1"env_key = "OPENFILL_API_KEY"wire_api = "responses"http_headers = { "X-Max-Price" = "0.10" }import { createOpenAICompatible } from "@ai-sdk/openai-compatible";import { generateText } from "ai"; const openfill = createOpenAICompatible({ name: "openfill", baseURL: "https://api.openfill.ai/v1", apiKey: process.env.OPENFILL_API_KEY, headers: { "X-Max-Price": "0.10" },}); const { text } = await generateText({ model: openfill.chatModel("placeholder-medium"), prompt: "hi",});console.log(text);import osfrom langchain_openai import ChatOpenAI llm = ChatOpenAI( model="placeholder-medium", base_url="https://api.openfill.ai/v1", api_key=os.environ["OPENFILL_API_KEY"], default_headers={"X-Max-Price": "0.10"},)print(llm.invoke("hi").content)import osfrom litellm import completion r = completion( model="openai/placeholder-medium", api_base="https://api.openfill.ai/v1", api_key=os.environ["OPENFILL_API_KEY"], messages=[ {"role": "user", "content": "hi"} ], extra_headers={"X-Max-Price": "0.10"},)print(r.choices[0].message.content)import osfrom openai import AsyncOpenAIfrom agents import ( Agent, Runner, set_default_openai_api, set_default_openai_client, set_tracing_disabled,) set_default_openai_client(AsyncOpenAI( base_url="https://api.openfill.ai/v1", api_key=os.environ["OPENFILL_API_KEY"], default_headers={"X-Max-Price": "0.10"},))set_default_openai_api("chat_completions")set_tracing_disabled(True) agent = Agent(name="assistant", model="placeholder-medium")print(Runner.run_sync(agent, "hi").final_output)// opencode.json{ "$schema": "https://opencode.ai/config.json", "provider": { "openfill": { "npm": "@ai-sdk/openai-compatible", "name": "OpenFill", "options": { "baseURL": "https://api.openfill.ai/v1", "apiKey": "{env:OPENFILL_API_KEY}", "headers": { "X-Max-Price": "0.10" } }, "models": { "placeholder-medium": { "name": "placeholder-medium" } } } }}# Cline, Roo Code and Kilo Code# Settings > API Provider: OpenAI Compatible Base URL https://api.openfill.ai/v1API Key (your OPENFILL_API_KEY)Model ID placeholder-medium # These tools send no max price of their# own. Set one on the key, on Bidding.Questions
What does placeholder-medium cost on OpenFill?
The clearing level when the request runs, up to the max price you set, shared across the three token kinds by the ratio 1:8:16.
What happens while the level is above my max price?
The request waits in the book while capacity is short and runs when there is room, for up to max_wait (10 seconds to 30 days). Past that it expires with 408 and no charge.
How do I know the price before I send?
With price_lock: true the request bids the published quote, or your max price if lower, and starts within 10 seconds or cancels with 429 and no charge.
What are the limits?
1,200 inference requests a minute per key, 2,000 queued orders per account, and a request body of up to 8 MB. Every limit is on GET /v1/limits.
What is stored?
Storage is off by default: a prompt and its response exist only while the request runs. With it on, results are kept up to 30 days; store: false keeps less.