v0.103.0 — Batch 2: provider correctness
Absorbs 16 more upstream community PRs (upstream prism-php/prism refs):
Gemini
- prism-php#975 structured output via
response_json_schema+ fork follow-up passing native JSON Schema through (full nullability/enum semantics, closes upstream prism-php#974) - prism-php#976 mix provider tools with custom function tools (new ToolConfigMap, closes upstream prism-php#972)
- prism-php#997 normalize array-type nullable notation for raw schemas
- prism-php#1000 Usage on StepFinishEvent
- prism-php#961 topK parameter · prism-php#1002 service_tier (Flex Inference) · prism-php#1008 rate-limit violations + retry-after extraction
DeepSeek
- prism-php#1020 preserve reasoning_content through thinking-mode tool loops
- prism-php#1021 cache-hit + reasoning token usage extraction
OpenRouter
- prism-php#954 reasoning + reasoning_details extraction, upstream provider error unwrapping (PrismException now carries httpStatus/responseBody)
- prism-php#992 cache write/read + reasoning usage tokens · prism-php#993 cacheTtl provider option
Mistral
- prism-php#965 tool calling in structured mode (tools phase → final json_schema request, closes upstream prism-php#963)
- prism-php#980 reasoning_effort option · prism-php#995 audio diarization
Z.ai
- prism-php#949 streaming support (full Stream handler + fixtures)
Skipped with rationale
- prism-php#999 superseded (prefix-based StructuredModeResolver already covers gpt-5.4 models)
- prism-php#1025 (illuminate/* component split) deferred — would blind Dependabot to laravel/framework advisories and the component list can't be verified by the current test setup; tracked in fork issue #3
Suite: 1580 passing, PHPStan clean.