Sample code for 30+ languages & platforms
Visual FoxPro

Conversation with Streaming Responses

See more AI Examples

Demonstrates an AI conversation with receiving streaming responses.

Chilkat Visual FoxPro Downloads

Visual FoxPro
LOCAL lnSuccess
LOCAL loAi
LOCAL lcSystemMsg
LOCAL lcDeveloperMsg
LOCAL lcConversationName
LOCAL loSbEventName
LOCAL loSbDelta
LOCAL loSbFullResponse
LOCAL lnFinished
LOCAL lnAbortFlag
LOCAL lnMaxWaitMs
LOCAL lnResult
LOCAL lnResult

lnSuccess = 0

* This example assumes the Chilkat API to have been previously unlocked.
* See Global Unlock Sample for sample code.

loAi = CreateObject('Chilkat.Ai')

* The provider can be "openai", "google", "claude", "deepseek", "xai", or "perplexity".
* Support for additional providers will be added in future versions of Chilkat.
loAi.Provider = "google"

* Use your provider's API key.
loAi.ApiKey = "MY_API_KEY"

* Choose a model.
loAi.Model = "gemini-2.5-flash"

* Indicate streaming mode is to be used.
loAi.Streaming = 1

* Create a new conversation to be maintained locally in memory.
* If the conversation is the first to be created, it is also automatically selected.
lcSystemMsg = "You are a creative storyteller"
lcDeveloperMsg = ""
lcConversationName = "test_conversation"
loAi.NewConvo(lcConversationName,lcSystemMsg,lcDeveloperMsg)

* Add a text input.
loAi.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.
lnSuccess = loAi.Ask("text")
IF (lnSuccess = 0) THEN
    ? loAi.LastErrorText
    RELEASE loAi
    CANCEL
ENDIF

loSbEventName = CreateObject('Chilkat.StringBuilder')
loSbDelta = CreateObject('Chilkat.StringBuilder')
loSbFullResponse = CreateObject('Chilkat.StringBuilder')
lnFinished = 0
lnAbortFlag = 0
lnMaxWaitMs = 5000

DO WHILE NOT lnFinished

    lnResult = loAi.PollAi(lnAbortFlag)
    IF (lnResult = 1) THEN
        * We have output waiting.  It should be instantly available.  The maxWaitMs is just-in-case.
        lnSuccess = loAi.NextAiEvent(lnMaxWaitMs,loSbEventName,loSbDelta)
        IF (lnSuccess = 0) THEN
            ? loAi.LastErrorText
            RELEASE loAi
            RELEASE loSbEventName
            RELEASE loSbDelta
            RELEASE loSbFullResponse
            CANCEL
        ENDIF

        * Some AI providers send many "empty" events.  Just ignore them.
        IF (NOT loSbEventName.ContentsEqual("empty",1)) THEN

            * The delta contains the new output.  This could be emitted to a display or the terminal
            * as real-time output.
            IF (loSbEventName.ContentsEqual("delta",1)) THEN
                * This example will emit each delta to its own line.
                ? loSbDelta.GetAsString()

                * Accumulate the delta's so we can show the full response later.
                loSbFullResponse.AppendSb(loSbDelta)
            ELSE
                * A streaming AI response is always terminated by a single "null_terminator" event.
                lnFinished = loSbEventName.ContentsEqual("null_terminator",1)
            ENDIF

        ENDIF

    ELSE
        IF (lnResult = 0) THEN
            * Nothing is immediately available. Sleep for 1/10 of a second before polling again.
            loAi.SleepMs(100)
        ELSE
            * Something failed..
            ? loAi.LastErrorText
            lnFinished = 1
        ENDIF

    ENDIF

ENDDO

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

* Show the accumulated (full) response.
? "----"
? loSbFullResponse.GetAsString()
? "----"

* ----------------------------------------------------------------------------------------------------------
* For the 2nd request in this conversation, ask for a shorter version of the story.
loAi.InputAddText("Rewrite the story, but this time make it shorter, about one third as long.")
lnSuccess = loAi.Ask("text")
IF (lnSuccess = 0) THEN
    ? loAi.LastErrorText
    RELEASE loAi
    RELEASE loSbEventName
    RELEASE loSbDelta
    RELEASE loSbFullResponse
    CANCEL
ENDIF

loSbFullResponse.Clear()
lnFinished = 0

DO WHILE NOT lnFinished

    lnResult = loAi.PollAi(lnAbortFlag)
    IF (lnResult = 1) THEN
        * We have output waiting.  It should be instantly available.  The maxWaitMs is just-in-case.
        lnSuccess = loAi.NextAiEvent(lnMaxWaitMs,loSbEventName,loSbDelta)
        IF (lnSuccess = 0) THEN
            ? loAi.LastErrorText
            RELEASE loAi
            RELEASE loSbEventName
            RELEASE loSbDelta
            RELEASE loSbFullResponse
            CANCEL
        ENDIF

        * Some AI providers send many "empty" events.  Just ignore them.
        IF (NOT loSbEventName.ContentsEqual("empty",1)) THEN

            * The delta contains the new output.  This could be emitted to a display or the terminal
            * as real-time output.
            IF (loSbEventName.ContentsEqual("delta",1)) THEN
                * This example will emit each delta to its own line.
                ? loSbDelta.GetAsString()

                * Accumulate the delta's so we can show the full response later.
                loSbFullResponse.AppendSb(loSbDelta)
            ELSE
                * A streaming AI response is always terminated by a single "null_terminator" event.
                lnFinished = loSbEventName.ContentsEqual("null_terminator",1)
            ENDIF

        ENDIF

    ELSE
        IF (lnResult = 0) THEN
            * Nothing is immediately available. Sleep for 1/10 of a second before polling again.
            loAi.SleepMs(100)
        ELSE
            * Something failed..
            ? loAi.LastErrorText
            lnFinished = 1
        ENDIF

    ENDIF

ENDDO

? "----"
? loSbFullResponse.GetAsString()

RELEASE loAi
RELEASE loSbEventName
RELEASE loSbDelta
RELEASE loSbFullResponse