DataFlex
DataFlex
Conversation with Streaming Responses
See more AI Examples
Demonstrates an AI conversation with receiving streaming responses.Chilkat DataFlex Downloads
Use ChilkatAx-win32.pkg
Procedure Test
Boolean iSuccess
Handle hoAi
String sSystemMsg
String sDeveloperMsg
String sConversationName
Variant vSbEventName
Handle hoSbEventName
Variant vSbDelta
Handle hoSbDelta
Handle hoSbFullResponse
Boolean iFinished
Boolean iAbortFlag
Integer iMaxWaitMs
Integer iResult
Integer iResult
String sTemp1
Boolean bTemp1
Move False To iSuccess
// This example assumes the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.
Get Create (RefClass(cComChilkatAi)) To hoAi
If (Not(IsComObjectCreated(hoAi))) Begin
Send CreateComObject of hoAi
End
// The provider can be "openai", "google", "claude", "deepseek", "xai", or "perplexity".
// Support for additional providers will be added in future versions of Chilkat.
Set ComProvider Of hoAi To "google"
// Use your provider's API key.
Set ComApiKey Of hoAi To "MY_API_KEY"
// Choose a model.
Set ComModel Of hoAi To "gemini-2.5-flash"
// Indicate streaming mode is to be used.
Set ComStreaming Of hoAi To 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.
Move "You are a creative storyteller" To sSystemMsg
Move "" To sDeveloperMsg
Move "test_conversation" To sConversationName
Get ComNewConvo Of hoAi sConversationName sSystemMsg sDeveloperMsg To iSuccess
// Add a text input.
Get ComInputAddText Of hoAi "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." To iSuccess
// Ask the AI for text output.
Get ComAsk Of hoAi "text" To iSuccess
If (iSuccess = False) Begin
Get ComLastErrorText Of hoAi To sTemp1
Showln sTemp1
Procedure_Return
End
Get Create (RefClass(cComChilkatStringBuilder)) To hoSbEventName
If (Not(IsComObjectCreated(hoSbEventName))) Begin
Send CreateComObject of hoSbEventName
End
Get Create (RefClass(cComChilkatStringBuilder)) To hoSbDelta
If (Not(IsComObjectCreated(hoSbDelta))) Begin
Send CreateComObject of hoSbDelta
End
Get Create (RefClass(cComChilkatStringBuilder)) To hoSbFullResponse
If (Not(IsComObjectCreated(hoSbFullResponse))) Begin
Send CreateComObject of hoSbFullResponse
End
Move False To iFinished
Move False To iAbortFlag
Move 5000 To iMaxWaitMs
While (Not iFinished)
Get ComPollAi Of hoAi iAbortFlag To iResult
If (iResult = 1) Begin
// We have output waiting. It should be instantly available. The maxWaitMs is just-in-case.
Get pvComObject of hoSbEventName to vSbEventName
Get pvComObject of hoSbDelta to vSbDelta
Get ComNextAiEvent Of hoAi iMaxWaitMs vSbEventName vSbDelta To iSuccess
If (iSuccess = False) Begin
Get ComLastErrorText Of hoAi To sTemp1
Showln sTemp1
Procedure_Return
End
// Some AI providers send many "empty" events. Just ignore them.
Get ComContentsEqual Of hoSbEventName "empty" True To bTemp1
If (Not bTemp1) Begin
// The delta contains the new output. This could be emitted to a display or the terminal
// as real-time output.
Get ComContentsEqual Of hoSbEventName "delta" True To bTemp1
If (bTemp1) Begin
// This example will emit each delta to its own line.
Get ComGetAsString Of hoSbDelta To sTemp1
Showln sTemp1
// Accumulate the delta's so we can show the full response later.
Get pvComObject of hoSbDelta to vSbDelta
Get ComAppendSb Of hoSbFullResponse vSbDelta To iSuccess
End
Else Begin
// A streaming AI response is always terminated by a single "null_terminator" event.
Get ComContentsEqual Of hoSbEventName "null_terminator" True To iFinished
End
End
End
Else Begin
If (iResult = 0) Begin
// Nothing is immediately available. Sleep for 1/10 of a second before polling again.
Send ComSleepMs To hoAi 100
End
Else Begin
// Something failed..
Get ComLastErrorText Of hoAi To sTemp1
Showln sTemp1
Move True To iFinished
End
End
Loop
// -------------------------------------------------------------
// The response is in markdown format.
// Also see Markdown to HTML Conversion Examples.
// -------------------------------------------------------------
// Show the accumulated (full) response.
Showln "----"
Get ComGetAsString Of hoSbFullResponse To sTemp1
Showln sTemp1
Showln "----"
// ----------------------------------------------------------------------------------------------------------
// For the 2nd request in this conversation, ask for a shorter version of the story.
Get ComInputAddText Of hoAi "Rewrite the story, but this time make it shorter, about one third as long." To iSuccess
Get ComAsk Of hoAi "text" To iSuccess
If (iSuccess = False) Begin
Get ComLastErrorText Of hoAi To sTemp1
Showln sTemp1
Procedure_Return
End
Send ComClear To hoSbFullResponse
Move False To iFinished
While (Not iFinished)
Get ComPollAi Of hoAi iAbortFlag To iResult
If (iResult = 1) Begin
// We have output waiting. It should be instantly available. The maxWaitMs is just-in-case.
Get pvComObject of hoSbEventName to vSbEventName
Get pvComObject of hoSbDelta to vSbDelta
Get ComNextAiEvent Of hoAi iMaxWaitMs vSbEventName vSbDelta To iSuccess
If (iSuccess = False) Begin
Get ComLastErrorText Of hoAi To sTemp1
Showln sTemp1
Procedure_Return
End
// Some AI providers send many "empty" events. Just ignore them.
Get ComContentsEqual Of hoSbEventName "empty" True To bTemp1
If (Not bTemp1) Begin
// The delta contains the new output. This could be emitted to a display or the terminal
// as real-time output.
Get ComContentsEqual Of hoSbEventName "delta" True To bTemp1
If (bTemp1) Begin
// This example will emit each delta to its own line.
Get ComGetAsString Of hoSbDelta To sTemp1
Showln sTemp1
// Accumulate the delta's so we can show the full response later.
Get pvComObject of hoSbDelta to vSbDelta
Get ComAppendSb Of hoSbFullResponse vSbDelta To iSuccess
End
Else Begin
// A streaming AI response is always terminated by a single "null_terminator" event.
Get ComContentsEqual Of hoSbEventName "null_terminator" True To iFinished
End
End
End
Else Begin
If (iResult = 0) Begin
// Nothing is immediately available. Sleep for 1/10 of a second before polling again.
Send ComSleepMs To hoAi 100
End
Else Begin
// Something failed..
Get ComLastErrorText Of hoAi To sTemp1
Showln sTemp1
Move True To iFinished
End
End
Loop
Showln "----"
Get ComGetAsString Of hoSbFullResponse To sTemp1
Showln sTemp1
End_Procedure