Migrate from Chat Completions to Responses API
Production guide: Migrate from Chat Completions to Responses API. It includes a deterministic artifact, failure boundaries, rollout checks, and source-qualified limitations.
Production guide: Migrate from Chat Completions to Responses API. It includes a deterministic artifact, failure boundaries, rollout checks, and source-qualified limitations.
Decision first
Migrate from Chat Completions to Responses API is an explicit production contract, not an isolated code change. Define the success signal, terminal failure state, and rollback condition before moving traffic. The artifact below separates evidence from assumption and keeps every attempt attributable.
Start with endpoint, prove request_body under a deterministic case, and make rollback a release gate rather than a follow-up task.
The reusable artifact
Use this table as the review record. A row passes only when its evidence comes from the same request, test window, or configuration snapshot.
| Checkpoint | Evidence to capture | Pass condition |
|---|---|---|
endpoint |
/v1/chat/completions->/v1/responses |
The value is exact, preserved, and compared at the wire boundary. |
request_body |
messages[]->input;response_format->text.format |
The value is exact, preserved, and compared at the wire boundary. |
tool_result |
tool_call_id->call_id;role:_tool->function_call_output |
The record joins to one logical request and one concrete attempt. |
zero_values |
temperature:_0,stream:_false,empty_arrays |
The value is exact, preserved, and compared at the wire boundary. |
state |
previous_response_id_and_repeated_top-level_instructions |
The owner, source, checked date, and known limitation are recorded. |
rollback |
old_endpoint_remains_selectable_during_bounded_rollout |
The limit is explicit and the request fails closed when it is exceeded. |
Worked example
The example is synthetic and deterministic. Replace identifiers and thresholds with reviewed values from your own workload; never paste production secrets or customer prompts into a test fixture.
# Chat Completions
curl -sS https://modelflare.dev/v1/chat/completions \
-H "Authorization: Bearer $MODELFLARE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"'"$MODEL_ID"'","messages":[{"role":"user","content":"Return OK"}],"stream":false}'
# Responses
curl -sS https://modelflare.dev/v1/responses \
-H "Authorization: Bearer $MODELFLARE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"'"$MODEL_ID"'","input":"Return OK","stream":false}'
Implementation procedure
- Freeze the current request, response, configuration, and observable baseline before changing behavior.
- Run one deterministic positive case and retain the complete client-visible result.
- Run the paired negative or limit case so failure behavior is proved rather than inferred.
- Join every attempt to one logical request ID, then record timing, terminal state, and usage without sensitive content.
- Roll out through a bounded cohort with explicit stop conditions; do not widen traffic merely because the happy path passed.
- Re-read the durable state and public behavior after the change, and execute the prepared rollback if any invariant fails.
Failure modes
The following failures invalidate the result even when the outer HTTP request appears successful:
- A zero or
falsevalue disappears during parsing or re-serialization, changing the caller's explicit intent. - The next request assumes hidden provider state that the selected route does not store or cannot retrieve.
- The integration reads one convenience field and silently drops typed output items, tool calls, refusals, or partial results.
- A single text response is treated as proof of protocol compatibility across streaming, tools, schema, usage, and errors.
Modelflare boundary
Modelflare can centralize OpenAI-compatible routing, keys, groups, usage records, and failure handling, but a configured route is not proof that every upstream supports every optional field. Verify the selected model and channel with the native protocol path. Keep provider prices in the current pricing source, preserve explicit zero values, and treat the final durable settlement—not an estimate—as billing truth.
Use the parent guide for the broader decision boundary and the setup documents for current client configuration.
Publication checklist
- The main question is answered before background material.
- Every request field, status, metric, and formula has one named owner.
- Examples use synthetic identifiers and contain no credential or customer data.
- All supported locales preserve the same headings, tables, code, limits, and caveats.
- Volatile API contracts, model support, and prices are rechecked at T-1 day; an invalidated claim moves the publication date.
- Before the scheduled time, the public API, localized routes, and sitemap still exclude the article.
Sources and verification date
Sources were checked on 2026-08-07. They establish the external contract or operating principle; they do not prove support on an untested provider route.