DSPy 3.4.0 released
Public OpenAI-style lm(messages=[...]) calls, including SDK message objects. Use explicit requests as above.; Custom BaseLM.forward() and aforward() integrations. Implement the engine interface.; LegacyEngine, AsyncLegacyEngine, and custom completelegacy()…
What changed
- Public OpenAI-style lm(messages=[...]) calls, including SDK message objects. Use explicit requests as above.
- Custom BaseLM.forward() and aforward() integrations. Implement the engine interface.
- LegacyEngine, AsyncLegacyEngine, and custom completelegacy() shortcuts. These are transition tools, not permanent escape hatches.
- Native n answers use separate sequential requests, potentially billing input tokens more than once. Use engine="litellm" for that backend's native n behavior.
- Custom engine objects own their connection. Put apikey, apibase, timeout, and related client settings on the engine itself; DSPy rejects them on LM construction, copying, and calls with custom…
- Custom engines need importable classes and JSON-compatible dumpstate()/loadstate() implementations to save and restore. Restoring them requires allowunsafelmstate=True; only enable it for trusted…
- Native timeouts bound individual transport waits, not total generation time. An httpx.Timeout component set to None selects LiteLLM under auto or raises under forced lm15, rather than silently…
- A stream is not retried after emitting a chunk. Incomplete responses are not cached as successful results. Rate-limit errors preserve retry hints, request IDs, and rate-limit headers when available.
Generated from AgentGid's daily data on public sources. How we collect it.