Sample code for 30+ languages & platforms
Java Requires Chilkat v11.2.0+

Conversation with Streaming Responses

See more AI Examples

Demonstrates an AI conversation with receiving streaming responses.

Chilkat Java Downloads

Chilkat2 Java
import com.chilkatsoft.chilkat2.Ai;
import com.chilkatsoft.chilkat2.ChilkatException;
import com.chilkatsoft.chilkat2.StringBuilder;

public class ChilkatExample {

    public static void main(String[] args) {
        // This example assumes the Chilkat API to have been previously unlocked.
        // See Global Unlock Sample for sample code.

        Ai ai = new Ai();

        // The provider can be "openai", "google", "claude", "deepseek", "xai", or "perplexity".
        // Support for additional providers will be added in future versions of Chilkat.
        ai.setProvider("google");

        // Use your provider's API key.
        ai.setApiKey("MY_API_KEY");

        // Choose a model.
        ai.setModel("gemini-3.6-flash");

        // Indicate streaming mode is to be used.
        ai.setStreaming(true);

        // Create a new conversation to be maintained locally in memory.
        // If the conversation is the first to be created, it is also automatically selected.
        String systemMsg = "You are a creative storyteller";
        String developerMsg = "";
        String conversationName = "test_conversation";
        ai.newConvo(conversationName, systemMsg, developerMsg);

        // Add a text input.
        ai.inputAddText("Write a detailed story about a turtle who decides to run a bakery.  Describe the setting, the kinds of pastries, how the turtle feels, and include at least three paragraphs.");

        // Ask the AI for text output.
        try {
            ai.ask("text");
        } catch (ChilkatException e) {
            System.out.println(e.getLastErrorText());
            return;
        }

        StringBuilder sbEventName = new StringBuilder();
        StringBuilder sbDelta = new StringBuilder();
        StringBuilder sbFullResponse = new StringBuilder();
        boolean finished = false;
        boolean abortFlag = false;
        int maxWaitMs = 5000;

        while (!finished) {
            int result = ai.pollAi(abortFlag);
            if (result == 1) {
                // We have output waiting.  It should be instantly available.  The maxWaitMs is just-in-case.
                try {
                    ai.nextAiEvent(maxWaitMs, sbEventName, sbDelta);
                } catch (ChilkatException e) {
                    System.out.println(e.getLastErrorText());
                    return;
                }

                // Some AI providers send many "empty" events.  Just ignore them.
                if (!sbEventName.contentsEqual("empty", true)) {
                    // The delta contains the new output.  This could be emitted to a display or the terminal
                    // as real-time output.
                    if (sbEventName.contentsEqual("delta", true)) {
                        // This example will emit each delta to its own line.
                        System.out.println(sbDelta.getAsString());

                        // Accumulate the delta's so we can show the full response later.
                        sbFullResponse.appendSb(sbDelta);
                    } else {
                        // A streaming AI response is always terminated by a single "null_terminator" event.
                        finished = sbEventName.contentsEqual("null_terminator", true);
                    }
                }
            } else {
                if (result == 0) {
                    // Nothing is immediately available. Sleep for 1/10 of a second before polling again.
                    ai.sleepMs(100);
                } else {
                    // Something failed..
                    System.out.println(ai.getLastErrorText());
                    finished = true;
                }
            }
        }

        // -------------------------------------------------------------
        // The response is in markdown format.
        // Also see Markdown to HTML Conversion Examples.
        // -------------------------------------------------------------

        // Show the accumulated (full) response.
        System.out.println("----");
        System.out.println(sbFullResponse.getAsString());
        System.out.println("----");

        // ----------------------------------------------------------------------------------------------------------
        // For the 2nd request in this conversation, ask for a shorter version of the story.
        ai.inputAddText("Rewrite the story, but this time make it shorter, about one third as long.");
        try {
            ai.ask("text");
        } catch (ChilkatException e) {
            System.out.println(e.getLastErrorText());
            return;
        }

        sbFullResponse.clear();
        finished = false;

        while (!finished) {
            int result = ai.pollAi(abortFlag);
            if (result == 1) {
                // We have output waiting.  It should be instantly available.  The maxWaitMs is just-in-case.
                try {
                    ai.nextAiEvent(maxWaitMs, sbEventName, sbDelta);
                } catch (ChilkatException e) {
                    System.out.println(e.getLastErrorText());
                    return;
                }

                // Some AI providers send many "empty" events.  Just ignore them.
                if (!sbEventName.contentsEqual("empty", true)) {
                    // The delta contains the new output.  This could be emitted to a display or the terminal
                    // as real-time output.
                    if (sbEventName.contentsEqual("delta", true)) {
                        // This example will emit each delta to its own line.
                        System.out.println(sbDelta.getAsString());

                        // Accumulate the delta's so we can show the full response later.
                        sbFullResponse.appendSb(sbDelta);
                    } else {
                        // A streaming AI response is always terminated by a single "null_terminator" event.
                        finished = sbEventName.contentsEqual("null_terminator", true);
                    }
                }
            } else {
                if (result == 0) {
                    // Nothing is immediately available. Sleep for 1/10 of a second before polling again.
                    ai.sleepMs(100);
                } else {
                    // Something failed..
                    System.out.println(ai.getLastErrorText());
                    finished = true;
                }
            }
        }

        System.out.println("----");
        System.out.println(sbFullResponse.getAsString());
    }
}