Protected_Protected property to store additional provider-specific settings
When true and the script is down to its final outcome, that outcome keeps repeating for every subsequent call instead of falling back to the default outcome ("advance through the script, then repeat the last entry").
ProtectedthinkingState tracking for streaming thinking extraction Providers should initialize this if they support thinking models
Get the current additional settings
ProtectedapiOnly sub-classes can access the API key
Number of ChatCompletion calls received.
ChatParams.model (the API name handed to the driver) of every call, in order.
The real ChatParams of every ChatCompletion call, in order.
Number of scripted outcomes not yet consumed.
Whether this LLM provider supports assistant prefill (pre-seeding the start of the model's response). Providers that support prefill should override this to return true. This is used as a code-level default when database metadata (AIModelType/AIModel/AIModelVendor.SupportsPrefill) is null. Database values of true/false override this getter.
Check if this provider supports streaming
true if streaming is supported, false otherwise
Whether this driver implements native tool/function calling — i.e. whether it maps
ChatParams.tools onto its SDK and normalizes tool calls back into
ChatCompletionMessage.toolCalls.
This is a CODE-level capability ("has the mapping been written for this driver?"), distinct
from the METADATA-level capability ModelConfiguration.LLM.SupportsNativeToolCalling
("does this model, on this vendor, support tools at all?"). Both must hold for native mode.
A driver returning false ignores any tools passed to it and records the fact in the
result's modelSpecificResponseDetails — the prompt runner's gate should keep that from
happening, but the layer is safe standalone.
ProtectedaddAdd thinking content to a chat completion message
OptionalthinkingContent: stringProcess a chat completion request. If streaming is enabled and supported, this will route to the streaming implementation.
Process multiple chat completion requests in parallel. This is useful for:
Array of chat completion parameter objects
Optionalcallbacks: ParallelChatCompletionsCallbacksOptional callbacks for progress and individual completions
Promise resolving to an array of ChatResults in the same order as the input params
Clear all additional settings This is useful for resetting the state of the provider or when switching between different configurations.
ProtectedcreateCreate a provider-specific streaming request
Chat parameters
A stream object that can be iterated with for await
ProtectedextractExtract thinking content from non-streaming content This method handles case-insensitive extraction of thinking blocks
ProtectedfinalizeCreate the final response object from streaming results
The complete content accumulated from all chunks
The last chunk received from the stream
The usage information (tokens, etc.)
A complete ChatResult object
ProtectedflushReturns (and clears) any user-visible content the thinking-tag stripper is still holding back at
the end of a stream. Mid-stream, processStreamChunkWithThinking holds back a trailing
fragment that could be the start of a <think>/</think> tag so a split tag never leaks as
partial text; once the stream ends, such a fragment is real content and must be emitted (bug A5).
Only flushes when NOT inside a thinking block: an unterminated <think> block's buffered text is
reasoning, not answer, and is left held back (never surfaced as visible content). Returns ''
when thinking extraction isn't active (no state) or there's nothing to flush.
Returns the native file input capabilities of this LLM driver, or null if the driver does not support file attachments. Subclasses that accept files (PDFs, images, etc.) should override this method.
ProtectedgetGet the thinking tag format for this provider Providers can override this to customize the thinking tag format
ProtectedhandleTemplate method for handling streaming chat completion This implements the common pattern across providers while delegating provider-specific logic to abstract methods.
ProtectedinitializeInitialize thinking stream state for streaming extraction
ProtectednonImplementation for non-streaming chat completion
ProtectedprocessProcess streaming chunk with thinking extraction This method handles case-insensitive extraction across chunk boundaries
ProtectedprocessProcess a streaming chunk from the provider
The raw chunk from the provider
Processed content and metadata
Clears the script, recorded calls, and all configuration back to initial state.
ProtectedresetHook invoked at the start AND end (in finally) of every streaming chat
completion to reset per-request streaming state. Default is a no-op;
providers that maintain instance-level streaming state (e.g., Anthropic /
OpenAI thinking-block accumulators) MUST override this. See audit R2-C5
for context — without this, state from a prior request bleeds into the
next one and accumulated buffers grow unbounded across the singleton's
lifetime.
ProtectedresetReset thinking stream state
Replaces the outcome queue with outcomes (consumed one per call, in order).
Set additional provider-specific settings Subclasses should override this method to validate required settings
Provider-specific settings
Sets the outcome used whenever the script is exhausted (default: succeed with 'test response').
Sets the native file-input capabilities this driver reports (null = none).
Sets the code-level prefill default this driver reports.
Enables/disables the real BaseLLM streaming path for this driver.
ProtectedsupportsCheck if the provider supports thinking models Providers should override this to return true if they support thinking extraction
Scriptable, call-recording LLM driver extending the real
BaseLLM.Scripted outcomes are consumed one per
ChatCompletioncall, in order. When the script is exhausted the default outcome is used (or, with RepeatLastOutcome, the final scripted outcome repeats). Every call's realChatParamsis recorded on Calls.