mirror of
https://github.com/HeyPuter/puter.git
synced 2026-09-12 08:15:58 +00:00
* fix(ai): make chat fallback reach streamed Claude calls and rank Azure explicitly - ClaudeProvider opens the upstream stream and awaits its connection before returning the populator, so an overloaded or rate-limited route throws from complete() and reaches the driver's fallback loop instead of surfacing as an error frame on a 200 - the OpenAI-compatible chat and completions routes only pin a provider when the caller sent one, so they get the same preferred healthy route puter.js callers do and unhealthy-route skipping applies to their first attempt - Azure is ranked ahead of the vendors it fronts by an explicit tier in modelRouting rather than a price tie plus registration order - drop Together's synthetic always-failing model-fallback-test-1 entry - test that a 4xx leaves a route in rotation while a 503 marks it Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * fix(ai): surface swallowed Claude stream errors, keep compat-route defaults Review follow-ups on the fallback work. - The pre-created event iterator only receives an error if a reader is already waiting on it, so a failure landing between the connect and the populator's first pull ended the stream cleanly — truncated content billed and reported as a success. Rethrow when the stream is errored. - A refused stream deleted its Anthropic uploads but left the caller's message parts pointing at those file ids, so the fallback route was handed handles it cannot resolve. processPuterPathUploads now returns a restore() that both failure paths call. - The OpenAI-compat routes keep pinning OpenAI when the caller sends no model at all, so the default model stays put instead of moving to Azure's. - Say why /openai/v1/responses and /anthropic/v1/messages stay pinned: each translates one provider's native shape by hand. - PREFERRED_PROVIDERS is unexported and its doc now states the rank is unconditional; the duplicated hidden-model list is one constant. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> * fix(ai): undo the puter_path rewrite by field instead of snapshotting the part Copying the content part kept whatever the caller sent on it — a large inline `source` or `text` alongside `puter_path` — reachable until the request ended, where overwriting the field used to make it garbage right away. The only fields this function writes are `type`/`source` on success and `type`/`text` on failure, and the fallback uploader keys off `puter_path` alone, so restore undoes those three by name. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>