Migration guidesFrom Helicone
Moving off Helicone, without pretending it is simple
Helicone has been acquired by Mintlify and its services are in maintenance mode. If you are deciding where to go, this page is the concept-by-concept map: what your code has to become, what INFRO does that Helicone did not, the four things INFRO simply does not have — and the section most of these pages leave out, which is when somebody else is the better answer.
INFRO is in private early access. The catalog, the docs, and the API contract are public today, and the gateway is deployed. The console opens with an early-access account, billing opens in stages, and anything beyond v1 is marked Later. Early access details
Where things stand
What was announced
Helicone has been acquired by Mintlify. Helicone's own post says its services “will remain live for the foreseeable future in maintenance mode”, with security updates, new models, and bug and performance fixes still shipping. Mintlify's post says the same and adds that they will “work closely with every customer to support a smooth migration to another platform”.
What was not announced
Neither post gives a shutdown date, a data-retention commitment, or a plan for the open-source repository. Read that as it is written: maintenance mode is not an outage, and nothing here needs doing this week. It is a reason to decide deliberately rather than to hurry.
Why this page exists at all
Because the honest answer depends on what you were using Helicone for, and most of the pages you will find on this search are not going to tell you that. If you were there for tracing, evaluations, and prompt management, the next section names a better destination than us.
This section is above the differences on purpose. A large share of the people reading this were using Helicone as an observability and evaluation platform, and for that job there is a product built squarely around it.
Langfuse describes itself as an open-source AI engineering platform for agent evaluation and observability: hierarchical tracing across LLM calls, tool invocations and retrieval steps, LLM-as-a-judge and heuristic evaluators, prompt management with deployment and rollback, datasets and experiments, human annotation, and a playground. It is MIT-licensed with self-hosting on Docker Compose, Kubernetes and Terraform, and it was acquired by ClickHouse in January 2026 — which, on ClickHouse's own account, leaves it open source and self-hostable with the cloud service running as before.
The reason to look at INFRO is a different problem wearing similar clothes. If what you actually have is several provider accounts across several teams, spend nobody can attribute until the invoice lands, retries and fallbacks written differently in each codebase, and no approval step for which model a service may call — that is a control-plane problem, not an observability one, and it is the problem this product is built around. Plenty of teams need both, and running INFRO as the gateway with tracing exported to a collector of your choice is a reasonable shape.
Choose Langfuse when
- You were at Helicone primarily for observability. Langfuse is that product, built deliberately and at depth, and it is the closest thing to a like-for-like destination that exists.
- You need prompt management or evaluators. INFRO has neither, and no date for either. Langfuse has both, and evaluation is one of the two things it leads with.
- You trace agents, not just model calls. Langfuse models a trace tree spanning tool calls and retrieval steps. INFRO records one request at a time; a span tree is something you assemble in your own collector.
- You want to self-host without a sales conversation, or keep that option open. Langfuse is MIT-licensed and anyone can run it. INFRO's plans are hosted; it runs in your own infrastructure only under an enterprise agreement.
- You want it working today with a credit card. Langfuse cloud is self-serve; INFRO's self-serve sign-up is not open yet.
Langfuse is not a partner, a reseller, or an affiliate of INFRO. We link it because it is the honest answer to a question this page would otherwise be answering dishonestly.
Helicone's objects against ours, read from their public documentation on 20 September 2026 and checked against what the gateway actually implements. Four rows say we have nothing; those are the ones worth reading first.
| Helicone | What it does there | In INFRO |
|---|---|---|
| Gateway integrationsame shape | Point an OpenAI-compatible client at Helicone's AI gateway base URL and pass your Helicone key. | The same shape: base URL https://api.infro.io/v1, key in Authorization: Bearer. Two lines, one per service. |
| Async logging, off the request pathnothing | An OpenLLMetry-based logger wraps your provider SDK so Helicone is not in your application's critical path. | Nothing equivalent. INFRO is a gateway, so it is always on the path — that is what lets it route, fail over, and refuse a request against a budget, and it is a real trade you are making. |
| Whose provider account serves the requestdifferent | The gateway can supply model access, and Helicone also supports bringing your own provider keys. | Only your own. You connect provider accounts you already hold, your providers invoice you directly at your own rates, and INFRO takes 0% of model spend. |
| Custom propertiesdifferent | Arbitrary tags sent as Helicone-Property-<Name> request headers, used for filtering and cost analysis. | A metadata object in the request body, filterable on the request log as tag.<key>. Same idea, different place — a header becomes a body field, which is the largest single edit in the port. |
| End-user trackingdifferent | Helicone-User-Id identifies an end user, with per-user engagement, retention and satisfaction analytics built on it. | metadata.user_id is recorded on every request and filters the request log and usage grouping, so cost per end user is answerable. There is no per-user behavioural analytics screen — no session length, return rate, or satisfaction scoring. |
| Sessions and trace treesdifferent | Helicone-Session-Id, -Path and -Name group related calls into one view, including non-LLM steps such as vector queries and tool calls, with parent/child structure from the path. | metadata.session_id groups requests in the log, and spans can be pushed to your own OpenTelemetry collector from the request path. What INFRO does not have is a session view with a trace tree in it: it records model calls, not the steps between them. |
| Response cachingdifferent | Helicone-Cache-Enabled caches complete responses at the edge, with a bucket size and a cache seed. | An exact-match response cache for chat completions, off by default and turned on per organization or project. An identical request inside the time-to-live is answered from the cache and never reaches your provider, so your provider does not bill it. Control is a cache body field or X-INFRO-Cache headers; a cache seed becomes X-INFRO-Cache-Namespace. There is no bucket of several stored answers and no semantic (similar-prompt) matching. The docs page is /docs/features/caching. |
| Custom rate limitsdifferent | Helicone-RateLimit-Policy sets a quota per window, in requests or in cost, segmented globally, per user, or per custom property. | Per-key request-rate tiers reported as X-RateLimit-Limit, plus budgets at the organization, project, member and key that refuse traffic at the ceiling with 402 budget_exceeded. Cost ceilings map well; a limit segmented by end user or by an arbitrary property does not. |
| Prompt managementnothing | Prompts managed outside the codebase, with versions compared against production traffic. | Nothing, and nothing planned that we will name. Prompts stay in your repository, or in a tool that does this properly — Langfuse does. |
| Evaluators and experimentsnothing | LLM-as-a-judge and custom evaluators scoring output quality, with side-by-side prompt comparison. Helicone's docs carry a deprecation notice on the Experiments feature. | Nothing. INFRO does not score model output and has no opinion about whether an answer was good. |
| Webhooksdifferent | Signed webhooks fire on request completion, carrying request and response bodies, cost, tokens and latency. | Signed webhooks, but for async media jobs only — job.succeeded, job.failed, job.canceled. There is no per-request completion hook; the request log and GET /v1/requests are how you read finished traffic. |
| Cost per requestdifferent | Cost computed per request and rolled up by property, user and model. | An estimate of what your provider will bill, on the response as usage.cost, with usage.price_source saying whether it came from your negotiated rate, your rate for that model, or the vendor's list rate — and absent rather than guessed when no rate is known. |
| Fallbacks and multi-provider routingsame shape | Provider fallback through the gateway. | Named routes with priority or weighted targets over your own connections. A target that times out or 5xxs before the response starts is retried elsewhere; once bytes are flowing the error surfaces rather than being re-routed. |
| Model policydifferent | Not a documented Helicone concept in the pages we read; the nearest control is a rate limit. | An allowlist at the organization, project or key. The narrowest scope wins and anything outside it is refused before it costs anything. |
| Historical datanothing | Requests, properties, sessions and scores already in Helicone. | No importer, and none planned. Nothing you logged there appears here. Export it from Helicone and keep it somewhere you control before you stop sending. |
| Open source and self-hostingdifferent | Helicone's platform is open source and can be run yourself. | The gateway is not open source. Its plans are hosted; a self-hosted or hybrid deployment comes only with an enterprise agreement. If you need to run it yourself without one, stop here.Enterprise — Available on an enterprise agreement rather than self-serve. |
Our reading of Helicone’s published documentation, not a trial or a benchmark. Their docs moved during the transition and some feature pages no longer resolve where they used to; where we could not confirm something, the row says so rather than guessing. Every source and the date we opened it is listed at the foot of this page.
Two lines for the connection. The work is in the annotations: Helicone carries them as request headers, INFRO carries them in the request body, so anywhere you set a header there is an edit.
Before · Helicone gateway
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://ai-gateway.helicone.ai",
apiKey: process.env.HELICONE_API_KEY,
defaultHeaders: {
"Helicone-User-Id": "user_8f21",
"Helicone-Session-Id": sessionId,
"Helicone-Property-Feature": "summarizer",
},
});
const completion = await client.chat.completions.create({
model: "claude-opus-5",
messages,
});After · INFRO
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.infro.io/v1",
apiKey: process.env.INFRO_API_KEY,
});
const completion = await client.chat.completions.create({
model: "anthropic/claude-opus-5",
messages,
// Annotations move from headers into the body. Recorded on the request,
// never forwarded upstream, and ignored by any OpenAI-compatible backend
// that does not know the field — so the same call still runs elsewhere.
metadata: {
user_id: "user_8f21",
session_id: sessionId,
},
});The base URL and the key
https://api.infro.io/v1, with the key in the standard Authorization: Bearer header — so it is the baseURL and apiKey arguments your client already has. If your code still points at Helicone's older per-provider proxy host and carries a separate Helicone-Auth header, that header comes out entirely; INFRO does not use one.
The model id
Models are addressed as vendor/model, for example anthropic/claude-opus-5. GET /v1/models lists what your key can actually call, which is whatever your own connected provider accounts serve — a model no connection covers returns 503 no_provider_connected naming the provider to connect.
The annotations
Helicone-User-Id becomes metadata.user_id, Helicone-Session-Id becomes metadata.session_id, and every Helicone-Property-X becomes a key under metadata.tags, filtered on the request log as tag.x. In TypeScript, OpenAI's own metadata type is a flat string map, so the nested tags object needs a cast; Python's extra_body takes it as written.
One thing worth trying before you commit: Helicone's async integration wraps your provider client rather than sitting on the network path, so in principle it keeps logging while the base URL points here. We have not tested that combination and cannot promise it — run it on one service first, and read GET /v1/requests on this side to check both agree about what happened.
Four things, all of which follow from being a gateway that runs on your own provider accounts rather than a logger that watches them.
- The account that served the request is yours, and it is named
- Every response carries
provider— the provider kind whose account ran it — andconnection, the id of the connection it used, alongsiderouteandroute_namewhen a route resolved it. There is no pool behind the gateway and no margin on the traffic: your provider invoices you at your own rates, and INFRO charges a subscription for the layer. - Cost is an estimate that says where it came from
usage.costis an estimate of your provider's bill for that request, andusage.price_sourcesays how it was reached —custom_providerfor your negotiated rate on the provider that served it,customfor your rate for that model,listfor the vendor's published rate. When no rate is known the request is recorded unpriced rather than as zero, because a zero in a cost column is a claim and an absence is a fact.- A budget can refuse a request
- Ceilings at the organization, project, member and key, with alert thresholds you set. At the cap the gateway returns
402 budget_exceededrather than emailing you about the overspend afterwards — which is the difference between a budget and a report. - The estimates are checked against the provider's own billing
- A daily pass reads OpenAI's and Anthropic's cost APIs with a separate admin credential and stores the reported figure beside what INFRO estimated, so what you see is a variance rather than a number to take on trust. Only those two providers have an adapter; a provider without one shows no variance rather than a variance of zero, and Bedrock, Vertex and Azure keep their cost in the surrounding cloud's billing system.
What does not come across
There is no importer. Nothing you logged in Helicone appears in INFRO, and nothing here will reach back for it. Export what you need while their service is still up.
- Your request history. There is no importer, and no plan for one. Export what you need from Helicone first; nothing in INFRO will reach back for it.
- Custom properties, sessions and user ids already recorded. Annotations start from the first request you send here.
- Cached responses. Entries in another product's cache do not move; INFRO's cache starts empty and fills from your own traffic, and it matches exact requests only, never similar ones.
- Prompts and evaluator scores. There is nowhere for them to land.
- A Helicone deployment you were running yourself. INFRO's plans are hosted; running INFRO in your own infrastructure is an enterprise agreement, not a migration step.
If the control plane is the part you want
Read the API contract first — it is published in full, including the parts that do not exist yet, so you can decide before writing anything. Then tell us what you are running and we will tell you honestly whether this is a move worth making.
Sources
Every statement on this page about Helicone or Langfuse comes from one of these, with the date we read it. Nothing is inferred from a trial, a benchmark, or a conversation.
- Helicone — “Helicone is joining Mintlify”read 2026-09-20
- Mintlify — “Mintlify acquires Helicone”read 2026-09-20
- Helicone docs — Quickstartread 2026-09-20
- Helicone docs — Async logging (OpenLLMetry)read 2026-09-20
- Helicone docs — Custom propertiesread 2026-09-20
- Helicone docs — Sessionsread 2026-09-20
- Helicone docs — User metricsread 2026-09-20
- Helicone docs — Cachingread 2026-09-20
- Helicone docs — Custom rate limitsread 2026-09-20
- Helicone docs — Webhooksread 2026-09-20
- Helicone docs — Experiments (deprecation notice)read 2026-09-20
- Langfuse — product overviewread 2026-09-20
- ClickHouse — “ClickHouse welcomes Langfuse”read 2026-09-20