Spun out of daily-failure triage #1330 (run 31093877484, 2026-08-06).
Upstream: not filed — see langflow-ai/langflow#14311 (an intentional upstream change, not a defect report)
Symptom
The @stable test that points a Basic Prompting flow at a model discovered through the OpenAI-Compatible provider hard-failed on both attempts that ran, inside the step point a Basic Prompting flow at the discovered model. The persisted node's binding polls out after 30 s reading credential: "" where the assertion expects "OPENAI_COMPATIBLE_API_KEY". The models half of the same assertion is correct (["gpt-4o-mini"]) — only the credential differs. @stable was auto-removed by the workflow (commit cb3082d).
| Spec (line) |
Waits for |
Signature |
tests/tests-automations/regression/core-functionality/model-provider/openai-compatible-provider-setup.spec.ts:620 ("a discovered model runs a flow through the OpenAI Compatible provider") |
expect.poll(persistedModelBinding) → { models: [TEST_MODEL], credential: KEY_VAR } (30 s) |
Error: expect(received).toEqual(expected) // deep equality |
Why these failures are one cause
Single spec. Kept separate from this run's other OpenAI hard failure (openai-provider.spec.ts:201) despite the dataset's provider_wide_cluster hint: that one is a run that produces no output, this one is a field on a persisted node — the flow here never had to reach the provider at all for the assertion to fail. Also not grouped with the same file's flake at line 558 (the live model catalog came back empty on attempt 0 and correct on both retries), which is a different observation with its own likely cause.
Preliminary read (descriptive — NOT a verdict)
Named lead, with dates that line up — this assertion may be asserting a binding upstream removed on purpose. Descriptive, not a verdict:
What this lead does not settle. #14311 removed the automatic binding on a build-config refresh; this spec reaches the state through an explicit provider configuration plus a model selection, which is not obviously the same path. Whether an empty credential is the intended outcome here is exactly what has to be measured, not assumed.
Investigation directive
All paths must be investigated independently, and the product is the prime suspect first — the #14311 lead above is attractive precisely because it would let the analysis close early, so it must be tested rather than adopted. Concretely: on the current nightly, drive this spec's path by hand and read GET /api/v1/flows/{id} directly; establish whether the empty credential is the contract #14311 describes, or a real persistence failure on this provider (the models half persisting correctly while credential does not is a fact that fits both readings and must be explained by whichever one is adopted). Then confirm the outcome the assertion actually exists to protect: that the run resolves this provider's key and not another's. Only after the regression hypothesis is ruled out, move to the test path (adopt #1274's approach — validate the outcome, not the storage detail), then the environment.
Deliverables (Done when)
Spun out of daily-failure triage #1330 (run 31093877484, 2026-08-06).
Upstream: not filed — see
langflow-ai/langflow#14311(an intentional upstream change, not a defect report)Symptom
The
@stabletest that points a Basic Prompting flow at a model discovered through the OpenAI-Compatible provider hard-failed on both attempts that ran, inside the steppoint a Basic Prompting flow at the discovered model. The persisted node's binding polls out after 30 s readingcredential: ""where the assertion expects"OPENAI_COMPATIBLE_API_KEY". Themodelshalf of the same assertion is correct (["gpt-4o-mini"]) — only the credential differs.@stablewas auto-removed by the workflow (commitcb3082d).tests/tests-automations/regression/core-functionality/model-provider/openai-compatible-provider-setup.spec.ts:620("a discovered model runs a flow through the OpenAI Compatible provider")expect.poll(persistedModelBinding) → { models: [TEST_MODEL], credential: KEY_VAR } (30 s)Error: expect(received).toEqual(expected) // deep equalityWhy these failures are one cause
Single spec. Kept separate from this run's other OpenAI hard failure (
openai-provider.spec.ts:201) despite the dataset'sprovider_wide_clusterhint: that one is a run that produces no output, this one is a field on a persisted node — the flow here never had to reach the provider at all for the assertion to fail. Also not grouped with the same file's flake at line 558 (the live model catalog came back empty on attempt 0 and correct on both retries), which is a different observation with its own likely cause.Preliminary read (descriptive — NOT a verdict)
Named lead, with dates that line up — this assertion may be asserting a binding upstream removed on purpose. Descriptive, not a verdict:
646bdd6b(langflow-ai/langflow#14311, "fix(models): stop automatic provider field binding") deleted the block that pre-populated a provider field'svaluewith the credential variable name. The PR states the new contract: the build-config refresh "never changesvalueorload_from_db. Empty fields use the existing provider-specific DB/environment fallback at runtime." Under that contract an emptycredentialon the persisted node is correct.release-1.12.0— the branch the nightly image is built from — on 2026-08-04 (b65e195eb1), verified by ancestry in The #751 credential-settle guard asserts a binding upstream removed on purpose (#14311) — 19 @stable specs fail by design on 1.11.2 #1274.tests/helpers/flows/agent-credential-settle.tsoff the stored-credential axis. This spec asserts the same shape inline in its own body — its comment even says "same shapeagent-credential-settle.tsreads for the Agent node" — so it did not receive that migration. Grep confirmstests/tests-automations/regression/core-functionality/model-provider/openai-compatible-provider-setup.spec.ts:691is the only remaining inlinecredential:assertion of this kind in the suite.What this lead does not settle. #14311 removed the automatic binding on a build-config refresh; this spec reaches the state through an explicit provider configuration plus a model selection, which is not obviously the same path. Whether an empty credential is the intended outcome here is exactly what has to be measured, not assumed.
Investigation directive
All paths must be investigated independently, and the product is the prime suspect first — the #14311 lead above is attractive precisely because it would let the analysis close early, so it must be tested rather than adopted. Concretely: on the current nightly, drive this spec's path by hand and read
GET /api/v1/flows/{id}directly; establish whether the emptycredentialis the contract #14311 describes, or a real persistence failure on this provider (themodelshalf persisting correctly whilecredentialdoes not is a fact that fits both readings and must be explained by whichever one is adopted). Then confirm the outcome the assertion actually exists to protect: that the run resolves this provider's key and not another's. Only after the regression hypothesis is ruled out, move to the test path (adopt #1274's approach — validate the outcome, not the storage detail), then the environment.Deliverables (Done when)
--retries=0runs), fixing waits/flow as needed.test.fixmeand restore@stable, re-validated perCONTRIBUTING.md. (Nothing to lift if nothing was quarantined.)langflowai/langflow-nightly:latest(or therelease-1.x.xbranch), is re-validated there, and@stableis restored — not on a test-side mute.credentialis #14311's intended contract on this path, with a directGET /api/v1/flows/{id}reading on the current nightly as evidence.agent-credential-settle.ts— assert the run resolves the right provider, not that the node stores a credential name — and confirm no other inline copy of the premise remains in the suite.