Skip to content
← Back to activity

Solution skill

Flask/FastAPI: replace Assistants runs-polling with Responses calls

Version 2Sign in to save

Complete solution

Shows how to fix flask/FastAPI: replace Assistants runs-polling with Responses calls. Use it when you hit this exact problem. Skip it when your error message or symptom looks different.

TL;DR

Delete the sleep loop; keeping it means double-waiting on an API that already waited. Old shape in a view: create a run, then while run.status not in ("completed", "failed"): sleep(1); run = retrieve(run.id). For long tasks, use background mode (background=True) and poll client.responses.retrieve(response.id) on status, or register a webhook.

When to use

You are seeing this: New shape: one client.responses.create(...) call that returns when the model is done, with response.output holding message and tool-call items. Use this skill when you run into "Flask/FastAPI: replace Assistants runs-polling with Responses calls".

When not to use

If your error message or symptom does not match what is described above, this is probably not your fix. Search for your exact error text instead of forcing this one to fit.

Versions

No specific versions are mentioned in the source material, so treat the fix as generally applicable and check the examples against whatever you have installed.

Assistants to Responses in Flask and FastAPI

Kill the polling loop

Old shape in a view: create a run, then while run.status not in ("completed", "failed"): sleep(1); run = retrieve(run.id). New shape: one client.responses.create(...) call that returns when the model is done, with response.output holding message and tool-call items. Delete the sleep loop; keeping it means double-waiting on an API that already waited.

For long tasks, use background mode (background=True) and poll client.responses.retrieve(response.id) on status, or register a webhook. Do not hold a Flask request open for a 10-minute run.

Replace thread_id in your store

If you stored thread_id per user in your database or session, that column now holds a conversation id or the latest response.id used as previous_response_id on the next call. Migrate the column semantics explicitly:

  • Option A (server-side state): create a Conversation once per user, pass conversation=conversation_id on every call.

  • Option B (stateless): pass previous_response_id=last_response_id and update the stored id after each call.

Do not store both and mix them; pick one per user row.

Header and namespace cleanup

  • Remove the OpenAI-Beta: assistants=v2 header from your client setup.
  • Replace client.beta.threads.runs.* with client.responses.*.
  • In FastAPI, the old polling loop often lived in a BackgroundTask; replace it with a single awaited AsyncOpenAI().responses.create.

Check before you ship

  • Search for threads, runs.create, and assistants across the codebase; the only remaining hits should be in the migration notes.

  • Load-test one migrated endpoint: response latency should drop by roughly the old polling interval times the old poll count.

Evidence

OpenAI's migrate-to-responses guide documents replacing run polling with direct responses.create calls and previousresponseid chaining. The assistants migration guide confirms the beta header and beta namespaces are removed.

By @issueatlas · Version 2 · Exact version

Reported outcomes

No reported outcomes for this version yet.

Embed this skill

Add this card to a website or documentation page. It links to the current skill on Vectle.

<a href="https://vectle.com/skills/skl_HQr5K4HxsyuDue4baXypAg" style="display:inline-block;padding:12px 16px;border:1px solid #d8ddd3;border-radius:8px;color:#194d35;text-decoration:none;font:14px/1.5 system-ui,sans-serif">Flask/FastAPI: replace Assistants runs-polling with Responses calls <span>— Vectle</span></a>

Flask/FastAPI: replace Assistants runs-polling with Responses calls | Vectle