Documentation
¶
Overview ¶
Package chat defines the serializable provider-neutral chat protocol and its minimal synchronous Model and optional Streamer capabilities.
Construct messages and requests with NewSystemMessage, NewUserMessage, and NewRequest. Leaf constructors establish protocol shape; aggregate roots and model boundaries validate the complete value. Call Validate again after mutating exported fields. System messages form a leading prefix so providers with a distinct system channel can translate a request without reordering it. Options express only per-call overrides; ToolChoice describes portable tool selection, ReasoningEffort carries model-advertised intensity without imposing one provider's closed enum, and OutputFormat describes the requested representation without adopting provider wire naming. Namespaced Extensions preserve provider data without expanding the shared protocol for every provider feature.
Response is a complete, stable output. Streamer yields ResponseDelta transport increments instead of partial Responses; ResponseAccumulator is the single promotion path between them and requires a terminal finish reason. Citations, refusals, reasoning replay state, and tool calls remain typed protocol values while exact provider-only data stays in namespaced metadata.
ToolDefinition describes wire schema only. Executable tools, registries, history, retries, middleware policy, and tool loops belong to higher-level modules. Protocol values therefore never retain callbacks, provider clients, or other runtime objects.
Example ¶
package main
import (
"fmt"
"github.com/Tangerg/scope/core/chat"
)
func main() {
request, err := chat.NewRequest(
chat.NewSystemMessage("Answer concisely."),
chat.NewUserMessage(chat.NewTextPart("What is a scope?")),
)
if err != nil {
panic(err)
}
request.Options = chat.Options{Model: "provider-model"}
fmt.Println(request.Messages[1].Text())
fmt.Println(request.Options.Model)
}
Output: What is a scope? provider-model
Index ¶
- Variables
- func SanitizeToolName(label string) string
- type CallMiddleware
- type Citation
- type CitationSource
- type CitationSourceKind
- type FinishReason
- type JSONSchemaConfig
- type Message
- type Model
- type ModelFunc
- type Options
- type Output
- type OutputFormat
- type OutputFormatType
- type OutputMetadata
- type Part
- type PartDelta
- type PartDeltaKind
- type PartKind
- type ReasoningEffort
- type Request
- type Response
- type ResponseAccumulator
- type ResponseDelta
- type ResponseMetadata
- type Role
- type StreamMiddleware
- type Streamer
- type StreamerFunc
- type ToolCall
- type ToolCallDelta
- type ToolChoice
- type ToolChoiceMode
- type ToolContent
- type ToolDefinition
- type ToolOutput
- type ToolParallelism
- type ToolResult
- type Usage
Examples ¶
Constants ¶
This section is empty.
Variables ¶
var ( ErrInvalidMessage = errors.New("chat: invalid message") ErrInvalidPart = errors.New("chat: invalid part") ErrInvalidToolCall = errors.New("chat: invalid tool call") ErrInvalidToolOutput = errors.New("chat: invalid tool output") ErrInvalidToolResult = errors.New("chat: invalid tool result") )
var ( ErrInvalidOutputFormat = errors.New("chat: invalid output format") // ErrUnsupportedOutputFormat lets a provider reject a valid portable format // that its native endpoint cannot enforce. ErrUnsupportedOutputFormat = errors.New("chat: unsupported output format") )
var ErrInvalidCitation = errors.New("chat: invalid citation")
var ErrInvalidOptions = errors.New("chat: invalid options")
var ErrInvalidRequest = errors.New("chat: invalid request")
var ErrInvalidResponse = errors.New("chat: invalid response")
var ErrInvalidToolChoice = errors.New("chat: invalid tool choice")
var ErrInvalidToolDefinition = errors.New("chat: invalid tool definition")
var ErrInvalidUsage = errors.New("chat: invalid usage")
Functions ¶
func SanitizeToolName ¶ added in v0.48.0
SanitizeToolName coerces an arbitrary label into a name ToolDefinition.Validate accepts, so callers building one from an external source need not re-encode the constraint. It may return "", which Validate rejects: sanitizing is not validation.
Types ¶
type CallMiddleware ¶
CallMiddleware composes synchronous model behavior. Concrete policy belongs to upper modules.
type Citation ¶ added in v0.13.0
type Citation struct {
Source CitationSource `json:"source"`
Title string `json:"title,omitempty"`
Quote string `json:"quote,omitempty"`
}
Citation is the portable identity and quoted evidence attached to a text part. Exact provider coordinates remain available through response metadata.
type CitationSource ¶ added in v0.13.0
type CitationSource struct {
Kind CitationSourceKind `json:"kind"`
Value string `json:"value"`
}
CitationSource identifies cited material without adopting a provider's location taxonomy. Provider-native page, block, and character coordinates remain in the preserved native response. URI sources may use any scheme, including file and urn, and may include a fragment. They require a non-empty target and contain no whitespace. Validation identifies material; it never resolves the URI or grants permission to access it.
func (CitationSource) Validate ¶ added in v0.13.0
func (c CitationSource) Validate() error
type CitationSourceKind ¶ added in v0.13.0
type CitationSourceKind string
CitationSourceKind distinguishes an absolute URI from an opaque source reference whose interpretation remains with the provider or host.
const ( CitationSourceURI CitationSourceKind = "uri" CitationSourceReference CitationSourceKind = "reference" )
func (CitationSourceKind) Valid ¶ added in v0.13.0
func (c CitationSourceKind) Valid() bool
type FinishReason ¶
type FinishReason string
FinishReason explains why generation stopped. Complete outputs require a non-empty value; ResponseDelta uses the empty value before termination.
const ( // FinishReasonStop means the model reached a natural stop condition, // including one of the caller's stop sequences. The output is complete. FinishReasonStop FinishReason = "stop" // FinishReasonLength means incomplete output that the caller may continue, // including token limits and provider pauses requiring another request. FinishReasonLength FinishReason = "length" FinishReasonToolCalls FinishReason = "tool_calls" // FinishReasonContentFilter means provider policy withheld or cut short // generated content; FinishReasonRefusal means the model declined the request. FinishReasonContentFilter FinishReason = "content_filter" FinishReasonRefusal FinishReason = "refusal" // FinishReasonOther is a terminal outcome without a portable match, such as // a malformed tool call. It must not hide truncation or policy stops. FinishReasonOther FinishReason = "other" )
Adapters classify the outcome using these reasons and preserve the native reason in OutputMetadata.Extra.
func (FinishReason) String ¶
func (f FinishReason) String() string
func (FinishReason) Valid ¶
func (f FinishReason) Valid() bool
type JSONSchemaConfig ¶ added in v0.13.0
type JSONSchemaConfig struct {
Name string
Description string
Schema json.RawMessage
}
type Message ¶
type Message struct {
Role Role `json:"role"`
Parts []Part `json:"parts"`
Metadata metadata.Map `json:"metadata,omitzero"`
}
Message is one provider-neutral conversation entry. Parts retain their order so interleaved assistant text, reasoning, and tool calls round-trip. Clone recursively owns every mutable protocol value. Text projection concatenates only text parts and deliberately ignores reasoning, media, and tool payloads.
func NewAssistantMessage ¶
NewAssistantMessage copies the parts container and borrows nested values.
func NewSystemMessage ¶
func NewToolMessage ¶
func NewToolMessage(results ...ToolResult) Message
NewToolMessage preserves one result part per call so a provider can correlate a returned batch without inspecting untyped content. Nested output is borrowed.
func NewUserMessage ¶
NewUserMessage copies the parts container and borrows nested values.
func (Message) MarshalJSON ¶
func (*Message) UnmarshalJSON ¶
type Model ¶
type Model interface {
// Call performs one complete model exchange. It must reject an invalid
// request before provider I/O, must not retain or mutate request, and
// transfers ownership of the returned response to the caller. Context
// cancellation remains identifiable through errors.Is.
Call(ctx context.Context, request *Request) (*Response, error)
}
Model performs a complete provider-neutral exchange; streaming is a separate capability.
func Wrap ¶
func Wrap(model Model, middlewares ...CallMiddleware) Model
Wrap composes call middlewares around model. The first middleware is the outermost wrapper. Nil entries are ignored so optional middleware can be supplied without a separate branch.
type Options ¶
type Options struct {
Model string `json:"model,omitempty"`
OutputFormat *OutputFormat `json:"output_format,omitzero"`
FrequencyPenalty *float64 `json:"frequency_penalty,omitzero"`
MaxOutputTokens *int64 `json:"max_output_tokens,omitzero"`
PresencePenalty *float64 `json:"presence_penalty,omitzero"`
ReasoningEffort ReasoningEffort `json:"reasoning_effort,omitempty"`
Stop []string `json:"stop,omitzero"`
Temperature *float64 `json:"temperature,omitzero"`
TopK *int64 `json:"top_k,omitzero"`
TopP *float64 `json:"top_p,omitzero"`
Extensions metadata.Extensions `json:"extensions,omitzero"`
}
Options contains per-request overrides; zero values use provider defaults. Adapters must report unsupported populated fields, never drop them.
func (Options) MarshalJSON ¶
func (Options) Resolve ¶
Resolve overlays only explicitly populated override values and returns an independently owned, validated result. Neither input is mutated.
func (*Options) UnmarshalJSON ¶
type Output ¶
type Output struct {
Message *Message `json:"message,omitzero"`
FinishReason FinishReason `json:"finish_reason,omitempty"`
Metadata *OutputMetadata `json:"metadata,omitzero"`
}
Output is the complete single provider generation produced by a chat call. Message may be nil when the provider completed without a portable content item, but FinishReason is always present.
func NewOutput ¶
func NewOutput(message *Message, finishReason FinishReason, outputMetadata *OutputMetadata) (*Output, error)
func (Output) MarshalJSON ¶
func (*Output) UnmarshalJSON ¶
type OutputFormat ¶
type OutputFormat struct {
Type OutputFormatType `json:"type"`
Name string `json:"name,omitempty"`
Description string `json:"description,omitempty"`
Schema json.RawMessage `json:"schema,omitzero"`
}
OutputFormat is the requested representation. Name, Description, and Schema belong only to OutputFormatJSONSchema. Construction and cloning snapshot Schema.
func NewJSONSchemaOutputFormat ¶
func NewJSONSchemaOutputFormat(config JSONSchemaConfig) (OutputFormat, error)
func NewOutputFormat ¶
func NewOutputFormat(formatType OutputFormatType) (OutputFormat, error)
func (*OutputFormat) Clone ¶
func (o *OutputFormat) Clone() *OutputFormat
func (OutputFormat) MarshalJSON ¶
func (o OutputFormat) MarshalJSON() ([]byte, error)
func (*OutputFormat) SchemaAs ¶
func (o *OutputFormat) SchemaAs[T any]() (T, error)
func (*OutputFormat) UnmarshalJSON ¶
func (o *OutputFormat) UnmarshalJSON(data []byte) error
func (OutputFormat) Validate ¶
func (o OutputFormat) Validate() error
type OutputFormatType ¶
type OutputFormatType string
const ( OutputFormatText OutputFormatType = "text" OutputFormatJSON OutputFormatType = "json" OutputFormatJSONSchema OutputFormatType = "json_schema" )
type OutputMetadata ¶
func (OutputMetadata) MarshalJSON ¶
func (o OutputMetadata) MarshalJSON() ([]byte, error)
func (*OutputMetadata) UnmarshalJSON ¶
func (o *OutputMetadata) UnmarshalJSON(data []byte) error
type Part ¶
type Part struct {
Kind PartKind `json:"kind"`
Text string `json:"text,omitempty"`
Media *media.Media `json:"media,omitzero"`
ReasoningState []byte `json:"reasoning_state,omitempty"`
ToolCall *ToolCall `json:"tool_call,omitzero"`
ToolResult *ToolResult `json:"tool_result,omitzero"`
Citations []Citation `json:"citations,omitempty"`
Metadata metadata.Map `json:"metadata,omitzero"`
}
Part is a tagged protocol value. Kind selects exactly one payload shape: Text, Media, reasoning Text/ReasoningState, ToolCall, or ToolResult. Citations annotate only text parts. Metadata retains JSON-safe, part-scoped provider state without weakening the common semantic payload.
func NewMediaPart ¶
NewMediaPart borrows value. Use Clone when independent ownership is needed.
func NewReasoningPart ¶
NewReasoningPart copies opaque replay state alongside visible reasoning.
func NewRefusalPart ¶ added in v0.13.0
func NewTextPart ¶
NewTextPart establishes the text payload shape; aggregate validation rejects empty text.
func NewToolCallPart ¶
func NewToolResultPart ¶
func NewToolResultPart(result ToolResult) Part
NewToolResultPart copies result and borrows its nested content.
func (Part) MarshalJSON ¶
func (*Part) UnmarshalJSON ¶
type PartDelta ¶ added in v0.13.0
type PartDelta struct {
Kind PartDeltaKind `json:"kind"`
Text string `json:"text,omitempty"`
Media *media.Media `json:"media,omitzero"`
ReasoningState []byte `json:"reasoning_state,omitempty"`
ToolCall *ToolCallDelta `json:"tool_call,omitzero"`
Citation *Citation `json:"citation,omitzero"`
Metadata metadata.Map `json:"metadata,omitzero"`
}
PartDelta is one transport increment. It is intentionally distinct from Part because incomplete tool arguments and citation attachment are not valid stable message content.
func NewCitationDelta ¶ added in v0.13.0
func NewMediaDelta ¶ added in v0.13.0
func NewReasoningDelta ¶ added in v0.13.0
NewReasoningDelta snapshots visible reasoning or opaque replay state.
func NewRefusalDelta ¶ added in v0.13.0
func NewTextDelta ¶ added in v0.13.0
func NewToolCallDelta ¶ added in v0.13.0
func NewToolCallDelta(delta ToolCallDelta) PartDelta
func (PartDelta) MarshalJSON ¶ added in v0.13.0
func (*PartDelta) UnmarshalJSON ¶ added in v0.13.0
type PartDeltaKind ¶ added in v0.13.0
type PartDeltaKind string
PartDeltaKind identifies transport increments whose lifecycle differs from a complete Part, including incomplete tool arguments and citation attachment.
const ( PartDeltaText PartDeltaKind = "text" PartDeltaMedia PartDeltaKind = "media" PartDeltaReasoning PartDeltaKind = "reasoning" PartDeltaToolCall PartDeltaKind = "tool_call" PartDeltaCitation PartDeltaKind = "citation" PartDeltaRefusal PartDeltaKind = "refusal" )
func (PartDeltaKind) Valid ¶ added in v0.13.0
func (p PartDeltaKind) Valid() bool
type ReasoningEffort ¶
type ReasoningEffort string
ReasoningEffort uses the selected model's vocabulary, not a fixed enum. Adapters must reject levels they cannot express; mapping a level to a token budget would invent caller policy. Provider-specific controls use extensions.
func (ReasoningEffort) Validate ¶
func (r ReasoningEffort) Validate() error
Validate rejects values whose identity would change under trimming. Empty is valid and asks the provider adapter to use the selected model's default.
type Request ¶
type Request struct {
Messages []Message `json:"messages"`
Tools []ToolDefinition `json:"tools,omitempty"`
ToolChoice *ToolChoice `json:"tool_choice,omitzero"`
Options Options `json:"options,omitzero"`
}
Request is the complete provider-neutral input to a chat model. NewRequest and Clone snapshot every mutable nested value before middleware or providers receive it.
func NewRequest ¶
NewRequest snapshots all nested values, then validates message structure and the leading system prefix. Cross-message call/result pairing is outside this structural contract; providers own their conversation sequencing rules.
func (Request) MarshalJSON ¶
func (*Request) UnmarshalJSON ¶
type Response ¶
type Response struct {
Output *Output `json:"output,omitzero"`
Metadata *ResponseMetadata `json:"metadata,omitzero"`
}
func NewResponse ¶
func NewResponse(output *Output, responseMetadata *ResponseMetadata) (*Response, error)
func (Response) MarshalJSON ¶
func (*Response) UnmarshalJSON ¶
type ResponseAccumulator ¶
type ResponseAccumulator struct {
// contains filtered or unexported fields
}
ResponseAccumulator is the only promotion path from transport deltas to a complete Response. Its zero value is ready to use. It must not be copied after first use and is not safe for concurrent use.
func (*ResponseAccumulator) Add ¶
func (r *ResponseAccumulator) Add(delta *ResponseDelta) error
Add validates and applies one delta atomically; a failed merge leaves the accumulated stream unchanged.
func (*ResponseAccumulator) Response ¶
func (r *ResponseAccumulator) Response() (*Response, error)
Response promotes the accumulated stream only after a terminal finish reason has been observed and returns an independently owned snapshot.
func (*ResponseAccumulator) Text ¶ added in v0.13.0
func (r *ResponseAccumulator) Text() string
Text returns the currently accumulated visible text without manufacturing a partial Response.
type ResponseDelta ¶ added in v0.13.0
type ResponseDelta struct {
Parts []PartDelta `json:"parts,omitempty"`
MessageMetadata metadata.Map `json:"message_metadata,omitzero"`
FinishReason FinishReason `json:"finish_reason,omitempty"`
OutputMetadata *OutputMetadata `json:"output_metadata,omitzero"`
Metadata *ResponseMetadata `json:"metadata,omitzero"`
}
ResponseDelta is one independently owned stream increment. Usage is a cumulative snapshot; an optional finish reason marks the terminal increment.
func (*ResponseDelta) Clone ¶ added in v0.13.0
func (r *ResponseDelta) Clone() *ResponseDelta
func (ResponseDelta) MarshalJSON ¶ added in v0.13.0
func (r ResponseDelta) MarshalJSON() ([]byte, error)
func (*ResponseDelta) Text ¶ added in v0.13.0
func (r *ResponseDelta) Text() string
func (*ResponseDelta) UnmarshalJSON ¶ added in v0.13.0
func (r *ResponseDelta) UnmarshalJSON(data []byte) error
func (*ResponseDelta) Validate ¶ added in v0.13.0
func (r *ResponseDelta) Validate() error
type ResponseMetadata ¶
type ResponseMetadata struct {
ID string `json:"id,omitempty"`
Model string `json:"model,omitempty"`
// Usage is nil when token accounting was not reported. A non-nil zero
// value records an explicitly reported zero total.
Usage *Usage `json:"usage,omitzero"`
CreatedAt time.Time `json:"created_at,omitzero"`
Extra metadata.Map `json:"extra,omitzero"`
}
func (ResponseMetadata) MarshalJSON ¶
func (r ResponseMetadata) MarshalJSON() ([]byte, error)
func (*ResponseMetadata) UnmarshalJSON ¶
func (r *ResponseMetadata) UnmarshalJSON(data []byte) error
type StreamMiddleware ¶
type Streamer ¶
type Streamer interface {
// Stream starts provider work lazily when the sequence is iterated. Each
// yielded delta is independently owned, carries a cumulative usage snapshot,
// and is accepted by ResponseAccumulator. A failure yields (nil, err) at most
// once, preserving context error identity. Stopping iteration releases
// provider resources before the iterator returns, without a cancellation
// yield or detached goroutine.
Stream(ctx context.Context, request *Request) iter.Seq2[*ResponseDelta, error]
}
Streamer is the optional streaming capability; ResponseAccumulator owns aggregation of its deltas.
func WrapStream ¶
func WrapStream(streamer Streamer, middlewares ...StreamMiddleware) Streamer
WrapStream composes stream middlewares around streamer using the same outermost-first order as Wrap.
type StreamerFunc ¶
func (StreamerFunc) Stream ¶
func (s StreamerFunc) Stream(ctx context.Context, request *Request) iter.Seq2[*ResponseDelta, error]
type ToolCall ¶
type ToolCall struct {
ID string `json:"id"`
Name string `json:"name"`
Arguments string `json:"arguments,omitempty"`
}
ToolCall is one complete, untrusted model proposal to invoke a named tool. Arguments retains the provider's JSON text so malformed final model output remains serializable. A runtime must promote the proposal through the bound Tool schema before exposing it to capabilities or execution.
type ToolCallDelta ¶
type ToolCallDelta struct {
ID string `json:"id"`
Name string `json:"name"`
Arguments string `json:"arguments,omitempty"`
}
ToolCallDelta is one streaming fragment of a ToolCall. It cannot appear in a Request; ResponseAccumulator is the only boundary that promotes fragments to a complete ToolCall.
func (ToolCallDelta) Validate ¶
func (t ToolCallDelta) Validate() error
type ToolChoice ¶ added in v0.13.0
type ToolChoice struct {
Mode ToolChoiceMode `json:"mode"`
Name string `json:"name,omitempty"`
Parallelism ToolParallelism `json:"parallelism,omitempty"`
}
func (*ToolChoice) Clone ¶ added in v0.13.0
func (t *ToolChoice) Clone() *ToolChoice
func (ToolChoice) Validate ¶ added in v0.13.0
func (t ToolChoice) Validate() error
type ToolChoiceMode ¶ added in v0.13.0
type ToolChoiceMode string
const ( ToolChoiceAuto ToolChoiceMode = "auto" ToolChoiceNone ToolChoiceMode = "none" ToolChoiceRequired ToolChoiceMode = "required" ToolChoiceNamed ToolChoiceMode = "named" )
func (ToolChoiceMode) Valid ¶ added in v0.13.0
func (t ToolChoiceMode) Valid() bool
type ToolContent ¶ added in v0.21.0
type ToolContent struct {
Kind PartKind `json:"kind"`
Text string `json:"text,omitempty"`
Media *media.Media `json:"media,omitzero"`
Citations []Citation `json:"citations,omitempty"`
Metadata metadata.Map `json:"metadata,omitzero"`
}
ToolContent is one text or media value in a ToolOutput. Kind must be PartText or PartMedia. It shares media and citation contracts with Part without admitting chat control payloads or recursively nested tool results.
func (ToolContent) Clone ¶ added in v0.21.0
func (t ToolContent) Clone() ToolContent
func (ToolContent) MarshalJSON ¶ added in v0.21.0
func (t ToolContent) MarshalJSON() ([]byte, error)
func (*ToolContent) UnmarshalJSON ¶ added in v0.21.0
func (t *ToolContent) UnmarshalJSON(data []byte) error
func (ToolContent) Validate ¶ added in v0.21.0
func (t ToolContent) Validate() error
type ToolDefinition ¶
type ToolDefinition struct {
Name string `json:"name"`
Description string `json:"description,omitempty"`
InputSchema json.RawMessage `json:"input_schema"`
}
ToolDefinition is the serializable description exposed to a model. Tool execution belongs to package tool and is deliberately absent here.
func (ToolDefinition) Clone ¶
func (t ToolDefinition) Clone() ToolDefinition
func (ToolDefinition) MarshalJSON ¶
func (t ToolDefinition) MarshalJSON() ([]byte, error)
func (*ToolDefinition) UnmarshalJSON ¶
func (t *ToolDefinition) UnmarshalJSON(data []byte) error
func (ToolDefinition) Validate ¶
func (t ToolDefinition) Validate() error
type ToolOutput ¶
type ToolOutput struct {
Content []ToolContent `json:"content,omitempty"`
Details json.RawMessage `json:"details,omitzero"`
}
ToolOutput is the provider-neutral value produced by a Tool. Content is the model-visible ordered text/media representation. Details is optional JSON for structured consumers; providers use its encoded JSON as the model-visible fallback only when Content is empty.
func NewJSONToolOutput ¶
func NewJSONToolOutput(value json.RawMessage) (ToolOutput, error)
NewJSONToolOutput returns a structured output whose exact JSON encoding is preserved. The value must be one complete RFC 7493 JSON document.
func NewTextToolOutput ¶
func NewTextToolOutput(text string) ToolOutput
NewTextToolOutput returns a text output. Empty text is represented by the valid zero ToolOutput rather than an invalid empty text Part.
func (ToolOutput) Clone ¶
func (t ToolOutput) Clone() ToolOutput
func (ToolOutput) MarshalJSON ¶ added in v0.13.0
func (t ToolOutput) MarshalJSON() ([]byte, error)
func (ToolOutput) Text ¶
func (t ToolOutput) Text() (string, bool)
Text returns the lossless text projection used by providers whose tool result protocol accepts only strings. It reports false when Content contains media so adapters cannot silently discard it. Details is encoded only when Content is empty.
func (*ToolOutput) UnmarshalJSON ¶ added in v0.13.0
func (t *ToolOutput) UnmarshalJSON(data []byte) error
func (ToolOutput) Validate ¶
func (t ToolOutput) Validate() error
type ToolParallelism ¶ added in v0.13.0
type ToolParallelism string
ToolParallelism states whether one response may request multiple calls; the zero value delegates the decision to the provider.
const ( ToolParallelismAllow ToolParallelism = "allow" ToolParallelismSingle ToolParallelism = "single" )
func (ToolParallelism) Valid ¶ added in v0.13.0
func (t ToolParallelism) Valid() bool
type ToolResult ¶
type ToolResult struct {
ID string `json:"id"`
Name string `json:"name"`
Output ToolOutput `json:"output"`
IsError bool `json:"is_error,omitzero"`
}
func (ToolResult) Clone ¶
func (t ToolResult) Clone() ToolResult
func (ToolResult) Validate ¶
func (t ToolResult) Validate() error
type Usage ¶
type Usage struct {
// InputTokens is the total processed input count. Provider cache-read and
// cache-write counts, when reported, are breakdowns included in this total.
InputTokens int64 `json:"input_tokens,omitzero"`
OutputTokens int64 `json:"output_tokens,omitzero"`
ReasoningTokens *int64 `json:"reasoning_tokens,omitzero"`
CacheReadInputTokens *int64 `json:"cache_read_input_tokens,omitzero"`
CacheWriteInputTokens *int64 `json:"cache_write_input_tokens,omitzero"`
}
Usage records provider-neutral token counts. Breakdown pointers distinguish an explicitly reported zero from an unsupported dimension.
func (Usage) Clone ¶ added in v0.47.0
Clone detaches the optional breakdown pointers so mutating the source cannot change a captured copy.
func (Usage) MarshalJSON ¶
func (Usage) TotalTokens ¶
TotalTokens returns the provider-reported input and output totals without double-counting their optional breakdowns.