nsmcp::ChatCompletionsRun method request (protected)

 <instance of nsmcp::ChatCompletionsRun[i]> request body apiKey

Defined in /usr/local/ns/tcl/nsmcp/question-chat-completions.tcl

Parameters:
body (required)
apiKey (required)

Testcases:
No testcase defined.
Source code:
:check
if {[string bytelength $body] > 2*[${:backend} cget -maxHistoryBytes]} {
    error "API request size limit reached; start a new conversation"
}
incr :requestsStarted
set :requestUsage {}
# Publish incomplete coverage before each request, retaining any usage
# from earlier rounds if this request fails or times out.
:emit [dict create type usage usage [dict merge ${:usageTotals}  [dict create scope turn source chat-completions apiRequests ${:requestsStarted}  requestsWithUsage ${:requestsWithUsage} complete false]]]
set :lineBuffer {}
set :eventData {}
set :firstLine true
set :done false
set :finish {}
set :content {}
set :reasoning {}
set :hasReasoning false
set :calls {}
set key [${:backend} streamOpen]
set request {}
set response {}
set headers [ns_set create Content-Type application/json Accept text/event-stream Authorization "Bearer $apiKey"]
try {
    set remaining [expr {max(0.001, (${:deadline}-[clock milliseconds])/1000.0)}]
    # Consume through the callback without retaining a second body.
    set discard [expr {$::tcl_platform(platform) eq "windows" ? "NUL" : "/dev/null"}]
    set request [ns_http queue -method POST -headers $headers -body $body  -outputfile $discard -spoolsize 0  -timeout $remaining -expire $remaining  -response_header_callback [list ${:backend} streamHeaders $key]  -response_data_callback [list ${:backend} streamData $key]  [${:backend} cget -apiUrl]]
    while {1} {
        :check
        :drain $key
        if {${:done}} {
            break
        }
        if {[lindex [ns_http list $request] end] ne "running"} {
            set code [catch {
                ns_http wait $request
            } reply]
            set request {}
            if {$code} {
                error "API request failed during HTTP transport"
            }
            set response $reply
            :drain $key
            break
        }
        ns_sleep 0.05
    }
    if {!${:done}} {
        error "API stream ended without its completion marker"
    }
    if {${:finish} ni {stop tool_calls}} {
        error "API completion is incomplete (finish reason: ${:finish})"
    }
    if {${:finish} eq "tool_calls" && ${:calls} eq ""} {
        error "API requested tool execution without any calls"
    }
    if {${:finish} eq "stop" && ${:calls} ne ""} {
        error "API tool calls lack a tool_calls finish reason"
    }
} finally {
    if {$request ne ""} {
        catch {
            ns_http cancel $request
        }
    }
    ${:backend} streamClose $key
    ns_set free $headers
    if {[dict exists $response headers]} {
        ns_set free [dict get $response headers]
    }
}
XQL Not present:
Generic, PostgreSQL, Oracle
[ hide source ] | [ make this the default ]
Show another procedure: