::nsmcp::ChatCompletionsBackend ::nsmcp::ChatCompletionsBackend describe init run streamClose streamData streamDrain streamHeaders streamOpen ::nsmcp::QuestionBackend ::nsmcp::QuestionBackend → reportingInstructions canonicalResult describe run ::nsmcp::ChatCompletionsBackend->::nsmcp::QuestionBackend ::nsmcp::CodexQuestionBackend ::nsmcp::CodexQuestionBackend describe run ::nsmcp::CodexQuestionBackend->::nsmcp::QuestionBackend ::nx::Object ::nx::Object ::nsmcp::QuestionBackend->::nx::Object

Class ::nsmcp::ChatCompletionsBackend

::nsmcp::ChatCompletionsBackend[i] create ... \
           [ -apiKeyFile:required apiKeyFile:required ] \
           [ -apiOptions (default "{} object {}") ] \
           [ -apiUrl:required apiUrl:required ] \
           [ -authenticator (default "::nsmcp::auth") ] \
           [ -authorizer (default "::nsmcp::authorization") ] \
           [ -maxApiRequests (default "16") ] \
           [ -maxHistoryBytes (default "1048576") ] \
           [ -maxOutputTokens (default "4096") ] \
           [ -maxResponseBytes (default "8388608") ] \
           [ -maxResultBytes (default "131072") ] \
           [ -maxToolCalls (default "32") ] \
           [ -model:required model:required ] \
           [ -mutex mutex ] \
           [ -registry (default "::nsmcp::tools") ] \
           [ -streamStore (default "") ] \
           [ -timeout (default "180") ] \
           [ -tokenFile:required tokenFile:required ]

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

Class Relations

  • class: ::nx::Class[i]
  • superclass: ::nsmcp::QuestionBackend[i]
::nx::Class create ::nsmcp::ChatCompletionsBackend \
     -superclass ::nsmcp::QuestionBackend

Methods (to be applied on instances)

  • describe (scripted, public)

     <instance of nsmcp::ChatCompletionsBackend[i]> describe

    Testcases:
    No testcase defined.
    return [dict create backend chat-completions model ${:model} apiUrl ${:apiUrl}  streaming true timeout ${:timeout} maxOutputTokens ${:maxOutputTokens}  maxToolCalls ${:maxToolCalls} maxApiRequests ${:maxApiRequests}]
  • run (scripted, public)

     <instance of nsmcp::ChatCompletionsBackend[i]> run question state \
        emit
    Parameters:
    question (required)
    state (required)
    emit (required)

    Testcases:
    No testcase defined.
    set runner [::nsmcp::ChatCompletionsRun new -backend [self] -emit $emit]
    try {
        return [$runner run $question $state]
    } finally {
        $runner destroy
    }
  • streamClose (scripted, public)

     <instance of nsmcp::ChatCompletionsBackend[i]> streamClose key
    Parameters:
    key (required)

    Testcases:
    No testcase defined.
    ns_mutex lock ${:mutex}
    try {nsv_unset -nocomplain ${:streamStore} $key} finally {ns_mutex unlock ${:mutex}}
  • streamData (scripted, public)

     <instance of nsmcp::ChatCompletionsBackend[i]> streamData key \
        fields
    Parameters:
    key (required)
    fields (required)

    Testcases:
    No testcase defined.
    ns_mutex lock ${:mutex}
    try {
        if {[nsv_get ${:streamStore} $key record]} {
            set data [dict get $fields data]
            dict incr record total [string bytelength $data]
            if {[dict get $record total] > ${:maxResponseBytes}
                || [string bytelength [dict get $record data]] + [string bytelength $data] > 1048576} {
                dict set record error "API response exceeded its buffer or response size limit"
            } elseif {[dict get $record error] eq ""} {
                dict append record data $data
            }
            nsv_set ${:streamStore} $key $record
        }
    } finally {ns_mutex unlock ${:mutex}}
    # The request discards its normal output. Returning TCL_OK also works
    # with cores whose queued callback evaluator does not propagate BREAK.
    return
  • streamDrain (scripted, public)

     <instance of nsmcp::ChatCompletionsBackend[i]> streamDrain key
    Parameters:
    key (required)

    Testcases:
    No testcase defined.
    ns_mutex lock ${:mutex}
    try {
        set record [nsv_get ${:streamStore} $key]
        set next $record
        dict set next data {}
        nsv_set ${:streamStore} $key $next
        return $record
    } finally {ns_mutex unlock ${:mutex}}
  • streamHeaders (scripted, public)

     <instance of nsmcp::ChatCompletionsBackend[i]> streamHeaders key \
        fields
    Parameters:
    key (required)
    fields (required)

    Testcases:
    No testcase defined.
    ns_mutex lock ${:mutex}
    try {
        if {[nsv_get ${:streamStore} $key record]} {
            dict set record status [dict get $fields status]
            dict set record contentType [ns_set iget [dict get $fields headers] content-type]
            nsv_set ${:streamStore} $key $record
        }
    } finally {ns_mutex unlock ${:mutex}}
  • streamOpen (scripted, public)

     <instance of nsmcp::ChatCompletionsBackend[i]> streamOpen

    Testcases:
    No testcase defined.
    set key [ns_crypto::randombytes -encoding hex 16]
    nsv_set ${:streamStore} $key {data {} total 0 status 0 contentType {} error {}}
    return $key