Sample code for 30+ languages & platforms
PureBasic

AI: Simple Stateless Streaming Response

See more AI Examples

Shows a simple stateless query and receives the response in streaming mode.

Chilkat PureBasic Downloads

PureBasic
IncludeFile "CkAi.pb"
IncludeFile "CkStringBuilder.pb"

Procedure ChilkatExample()

    success.i = 0

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

    ai.i = CkAi::ckCreate()
    If ai.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

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

    ; Use your provider's API key.
    CkAi::setCkApiKey(ai, "MY_API_KEY")

    ; Choose a model.
    CkAi::setCkModel(ai, "gpt-4o")

    ; Indicate streaming mode is to be used.
    CkAi::setCkStreaming(ai, 1)

    ; Add a text input.
    CkAi::ckInputAddText(ai,"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.
    success = CkAi::ckAsk(ai,"text")
    If success = 0
        Debug CkAi::ckLastErrorText(ai)
        CkAi::ckDispose(ai)
        ProcedureReturn
    EndIf

    sbEventName.i = CkStringBuilder::ckCreate()
    If sbEventName.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    sbDelta.i = CkStringBuilder::ckCreate()
    If sbDelta.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    sbFullResponse.i = CkStringBuilder::ckCreate()
    If sbFullResponse.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    finished.i = 0
    abortFlag.i = 0
    maxWaitMs.i = 5000

    While finished = 0

        result.i = CkAi::ckPollAi(ai,abortFlag)
        If result = 1
            ; We have output waiting.  It should be instantly available.  The maxWaitMs is just-in-case.
            success = CkAi::ckNextAiEvent(ai,maxWaitMs,sbEventName,sbDelta)
            If success = 0
                Debug CkAi::ckLastErrorText(ai)
                CkAi::ckDispose(ai)
                CkStringBuilder::ckDispose(sbEventName)
                CkStringBuilder::ckDispose(sbDelta)
                CkStringBuilder::ckDispose(sbFullResponse)
                ProcedureReturn
            EndIf

            ; Some AI providers send many "empty" events.  Just ignore them.
            If CkStringBuilder::ckContentsEqual(sbEventName,"empty",1) = 0
                ; Log the non-empty events.
                Debug CkStringBuilder::ckGetAsString(sbEventName)

                ; The delta contains the new output.  This could be emitted to a display or the terminal
                ; as real-time output.
                If CkStringBuilder::ckContentsEqual(sbEventName,"delta",1) = 1
                    Debug CkStringBuilder::ckGetAsString(sbDelta)

                    ; Accumulate the delta's so we can show the full response later.
                    CkStringBuilder::ckAppendSb(sbFullResponse,sbDelta)
                Else
                    ; A streaming AI response is always terminated by a single "null_terminator" event.
                    finished = CkStringBuilder::ckContentsEqual(sbEventName,"null_terminator",1)
                EndIf

            EndIf

        Else
            If result = 0
                ; Nothing is immediately available. Sleep for 1/10 of a second before polling again.
                CkAi::ckSleepMs(ai,100)
            Else
                ; Something failed..
                Debug CkAi::ckLastErrorText(ai)
                finished = 1
            EndIf

        EndIf

    Wend

    ; Show the accumulated (full) response.
    Debug "----"
    Debug CkStringBuilder::ckGetAsString(sbFullResponse)

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


    CkAi::ckDispose(ai)
    CkStringBuilder::ckDispose(sbEventName)
    CkStringBuilder::ckDispose(sbDelta)
    CkStringBuilder::ckDispose(sbFullResponse)


    ProcedureReturn
EndProcedure