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: