Upgrade if you call flush() while a trace is open — you were losing those traces entirely.
flush() no longer orphans an in-flight trace
Calling flush() mid-trace sent the buffered child spans and cleared the root, so they arrived referencing a parent that had not been sent. Langfuse accepts orphaned children with a 200 and then discards the whole trace rather than render a tree with a missing root — silently, with nothing logged.
The symptom is distinctive and easy to misread: the local ledger records every call perfectly while Langfuse shows nothing at all.
flush() now leaves a trace alone while its root is open, and sends only traces that have already ended — including late events arriving from LiteLLM's callback thread after end_trace, which do have a parent on the server to attach to.