v0.105.0 — Batch 4: providers, chat/completions, coercion
Absorbed upstream PRs
- prism-php#835 Azure OpenAI provider (text, structured, streaming, embeddings, image generation) — fork fix: arch-conformant visibility
- prism-php#898 Qwen (Alibaba DashScope) provider — fork fix: null-safe image source resolution
- prism-php#757 Replicate provider (text, structured, streaming, images, audio, embeddings) — fork fixes: Step signature drift, HTTP response typing
- prism-php#907 (includes prism-php#902) OpenAI chat/completions api_format with streaming citations — answers upstream prism-php#900 for vLLM / LiteLLM / OpenAI-compatible backends
- prism-php#920 cost tracking on Usage (populated by OpenRouter, aggregated across steps and streams)
- prism-php#810 async speech-to-text interface (asTextProviderId / asTextAsync)
Skipped with rationale
- prism-php#888 (container-resolved broadcast classes) — routes every stream event through the container on the hot path; extensibility belongs in a config map
- prism-php#772 (ProviderOption value object) — 8-months-stale rewrite of the most-used core trait, conflicts with the batch subsystem; per-provider option scoping tracked for fork-side design
Fork-authored
- Tool argument coercion: string arguments are coerced to the handler's declared int/float/bool types and converted to BackedEnum instances (closes upstream prism-php#1016, coercion half of prism-php#1007) — Llama-on-Groq stringified arguments now just work
- Anthropic per-request beta features: withProviderOptions(['anthropic_beta' => …]) merges with config-level flags (upstream prism-php#953)
- Groq function-name-splitting heuristic now covered end-to-end (issue #3 backfill)
Suite: 1823 passing, PHPStan clean.