Stream Claude/OpenAI JSON responses into a PHP stream resource

$context = stream_context_create([
    'http' => [
        'method' => 'POST',
        'header' => "Authorization: Bearer {$apiKey}
Content-Type: application/json
",
        'content' => json_encode(['model' => 'claude-3-5-sonnet', 'stream' => true, 'messages' => $messages])
    ]
]);

$stream = fopen('https://api.anthropic.com/v1/messages', 'r', false, $context);
while (!feof($stream)) {
    $line = fgets($stream);
    if (str_starts_with($line, 'data: ')) {
        echo substr($line, 6);
        ob_flush(); flush();
    }
}
fclose($stream);