Swift
Swift
AI: Simple Stateless Streaming Response
See more AI Examples
Shows a simple stateless query and receives the response in streaming mode.Chilkat Swift Downloads
func chilkatTest() {
var success: Bool = false
// This example assumes the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.
let ai = CkoAi()!
// The provider can be "openai", "google", "claude", "deepseek", "xai", or "perplexity".
// Support for additional providers will be added in future versions of Chilkat.
ai.provider = "openai"
// Use your provider's API key.
ai.apiKey = "MY_API_KEY"
// Choose a model.
ai.model = "gpt-4o"
// Indicate streaming mode is to be used.
ai.streaming = true
// Add a text input.
ai.inputAddText(text: "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 = ai.ask(outputType: "text")
if success == false {
print("\(ai.lastErrorText!)")
return
}
let sbEventName = CkoStringBuilder()!
let sbDelta = CkoStringBuilder()!
let sbFullResponse = CkoStringBuilder()!
var finished: Bool = false
var abortFlag: Bool = false
var maxWaitMs: Int = 5000
while finished == false {
var result: Int = ai.poll(abort: abortFlag).intValue
if result == 1 {
// We have output waiting. It should be instantly available. The maxWaitMs is just-in-case.
success = ai.nextEvent(maxWaitMs: maxWaitMs, sbName: sbEventName, sbDelta: sbDelta)
if success == false {
print("\(ai.lastErrorText!)")
return
}
// Some AI providers send many "empty" events. Just ignore them.
if sbEventName.contentsEqual(str: "empty", caseSensitive: true) == false {
// Log the non-empty events.
print("\(sbEventName.getAsString()!)")
// The delta contains the new output. This could be emitted to a display or the terminal
// as real-time output.
if sbEventName.contentsEqual(str: "delta", caseSensitive: true) == true {
print("\(sbDelta.getAsString()!)")
// Accumulate the delta's so we can show the full response later.
sbFullResponse.appendSb(sb: sbDelta)
}
else {
// A streaming AI response is always terminated by a single "null_terminator" event.
finished = sbEventName.contentsEqual(str: "null_terminator", caseSensitive: true)
}
}
}
else {
if result == 0 {
// Nothing is immediately available. Sleep for 1/10 of a second before polling again.
ai.sleepMs(millisec: 100)
}
else {
// Something failed..
print("\(ai.lastErrorText!)")
finished = true
}
}
}
// Show the accumulated (full) response.
print("----")
print("\(sbFullResponse.getAsString()!)")
// -------------------------------------------------------------
// The response is in markdown format.
// Also see Markdown to HTML Conversion Examples.
// -------------------------------------------------------------
}