Frontend'de "Streaming" Yanıt Özelliği

Kullanıcıların yapay zekadan uzun yanıtlar alırken dakikalarca beklemesi yerine, yanıtın üretildiği anda ekrana "akmasını" sağlamak modern bir standarttır. Bunu sağlamak için genellikle Server-Sent Events (SSE) veya ReadableStream kullanılır.

SSE Nedir?

SSE, sunucunun istemciye (browser) tek yönlü olarak veri parçacıkları (chunks) göndermesine olanak tanıyan bir HTTP standardıdır. WebSocket'in aksine daha basit ve verimlidir.

React ile Uygulama Örneği

Aşağıdaki örnekte fetch API'sinin stream özelliğini kullanarak veriyi parçalı olarak alıyoruz.

const [response, setResponse] = useState("");

const handleAskAI = async () => {
    const res = await fetch("/api/generate", {
        method: "POST",
        body: JSON.stringify({ prompt: "Merhaba!" })
    });

    const reader = res.body.getReader();
    const decoder = new TextDecoder();

    while (true) {
        const { done, value } = await reader.read();
        if (done) break;
        
        const chunk = decoder.decode(value);
        setResponse((prev) => prev + chunk);
    }
};

Vue 3 (Composition API) Örneği

Vue tarafında ref kullanarak gelen veri parçalarını anlık olarak DOM'a yansıtabiliriz.

<script setup>
import { ref } from 'vue';

const aiText = ref("");

async function fetchStream() {
  const response = await fetch('/api/ai-stream');
  const reader = response.body.getReader();
  const decoder = new TextDecoder();

  while (true) {
    const { done, value } = await reader.read();
    if (done) break;
    aiText.value += decoder.decode(value, { stream: true });
  }
}
</script>
Mimari İpucu

Streaming kullanırken backend tarafında (Node.js, PHP veya Python) yanıtın Content-Type: text/event-stream başlığıyla gönderilmesi ve buffer mekanizmasının temizlenmesi (flush) gerekir.