ObjectStackObjectStack

Conversation schema — AI Protocol reference

Multi-turn AI conversations with token budget management. Enables context preservation, conversation history, and token optimization.

AI Conversation Memory Protocol

Multi-turn AI conversations with token budget management. Enables context preservation, conversation history, and token optimization.

Source: packages/spec/src/ai/conversation.zod.ts

TypeScript Usage

import { CodeContentSchema, ConversationAnalyticsSchema, ConversationContextSchema, ConversationMessageSchema, ConversationSessionSchema, ConversationSummarySchema, FileContentSchema, FunctionCallSchema, ImageContentSchema, MessageContentSchema, MessageContentTypeSchema, MessagePruningEventSchema, MessageRoleSchema, TextContentSchema, TokenBudgetConfigSchema, TokenBudgetStrategySchema, TokenUsageStatsSchema, ToolCallSchema } from '@objectstack/spec/ai';
import type { ConversationAnalytics, ConversationContext, ConversationMessage, ConversationSession, ConversationSummary, FileContent, FunctionCall, MessageContent, MessageContentType, MessagePruningEvent, MessageRole, TextContent, TokenBudgetConfig, TokenBudgetStrategy, TokenUsageStats, ToolCall } from '@objectstack/spec/ai';

// Validate data
const result = CodeContentSchema.parse(data);

CodeContent

Properties

PropertyTypeRequiredDescription
type'code'✅
textstring✅Code snippet
languagestringoptional (default: "text")
metadataRecord<string, any>optional

ConversationAnalytics

Properties

PropertyTypeRequiredDescription
sessionIdstring✅
totalMessagesinteger✅
userMessagesinteger✅
assistantMessagesinteger✅
systemMessagesinteger✅
totalTokensinteger✅
averageTokensPerMessagenumber✅
peakTokenUsageinteger✅
pruningEventsintegeroptional (default: 0)
summarizationEventsintegeroptional (default: 0)
tokensSavedByPruningintegeroptional (default: 0)
tokensSavedBySummarizationintegeroptional (default: 0)
durationSecondsnumberoptionalSession duration in seconds
durationneveroptional[REMOVED] ConversationAnalytics.duration was renamed to durationSeconds in @objectstack/spec 17 — the unit of a duration-shaped number lives in the key name, not only in the describe prose. Rename the key to durationSeconds; the value (seconds) is unchanged.
firstMessageAtstringoptionalISO 8601 timestamp
lastMessageAtstringoptionalISO 8601 timestamp

ConversationContext

Properties

PropertyTypeRequiredDescription
sessionIdstring✅Conversation session ID
userIdstringoptionalUser identifier
agentIdstringoptionalAI agent identifier
objectstringoptionalRelated object (e.g., "case", "project")
recordIdstringoptionalRelated record ID
scopeRecord<string, any>optionalAdditional context scope
systemMessagestringoptionalSystem prompt/instructions
metadataRecord<string, any>optional

ConversationMessage

Properties

PropertyTypeRequiredDescription
idstring✅Unique message ID
timestampstring✅ISO 8601 timestamp
roleEnum<'system' | 'user' | 'assistant' | 'function' | 'tool'>✅
content({ type: 'text'; text: string; metadata?: Record<string, any> } | { type: 'image'; imageUrl: string; detail?: Enum<'low' | 'high' | 'auto'>; metadata?: Record<string, any> } | { type: 'file'; fileUrl: string; mimeType: string; fileName?: string; … } | { type: 'code'; text: string; language?: string; metadata?: Record<string, any> })[]✅Message content (multimodal array)
functionCall{ name: string; arguments: string; result?: string }optionalLegacy function call
toolCalls{ id: string; type?: Enum<'function'>; function: object }[]optionalTool calls
toolCallIdstringoptionalTool call ID this message responds to
namestringoptionalName of the function/user
tokens{ promptTokens: integer; completionTokens: integer; totalTokens: integer }optionalToken usage for this message
costnumberoptionalCost for this message in USD
pinnedbooleanoptional (default: false)Prevent removal during pruning
importancenumberoptionalImportance score for pruning
embeddingnumber[]optionalVector embedding for semantic search
metadataRecord<string, any>optional

Nested Shape: ConversationMessage.content[number][type='text']

PropertyTypeRequiredDescription
type'text'✅
textstring✅Text content
metadataRecord<string, any>optional

Nested Shape: ConversationMessage.content[number][type='image']

PropertyTypeRequiredDescription
type'image'✅
imageUrlstring✅Image URL
detailEnum<'low' | 'high' | 'auto'>optional (default: "auto")
metadataRecord<string, any>optional

Nested Shape: ConversationMessage.content[number][type='file']

PropertyTypeRequiredDescription
type'file'✅
fileUrlstring✅File attachment URL
mimeTypestring✅MIME type
fileNamestringoptional
metadataRecord<string, any>optional

Nested Shape: ConversationMessage.content[number][type='code']

PropertyTypeRequiredDescription
type'code'✅
textstring✅Code snippet
languagestringoptional (default: "text")
metadataRecord<string, any>optional

Nested Shape: ConversationMessage.functionCall

PropertyTypeRequiredDescription
namestring✅Function name
argumentsstring✅JSON string of function arguments
resultstringoptionalFunction execution result

Nested Shape: ConversationMessage.toolCalls[number]

PropertyTypeRequiredDescription
idstring✅Tool call ID
typeEnum<'function'>optional (default: "function")
function{ name: string; arguments: string; result?: string }✅

Nested Shape: ConversationMessage.tokens

PropertyTypeRequiredDescription
promptTokensinteger✅Tokens consumed by the prompt
completionTokensinteger✅Tokens generated in the completion
totalTokensinteger✅Total tokens (prompt + completion)

ConversationSession

Properties

PropertyTypeRequiredDescription
idstring✅Unique session ID
namestringoptionalSession name/title
context{ sessionId: string; userId?: string; agentId?: string; object?: string; … }✅
modelIdstringoptionalAI model ID
tokenBudget{ maxTokens: integer; maxPromptTokens?: integer; maxCompletionTokens?: integer; reserveTokens?: integer; … }✅
messages{ id: string; timestamp: string; role: Enum<'system' | 'user' | 'assistant' | 'function' | 'tool'>; content: (object | … +3 more)[]; … }[]optional (default: [])
tokens{ promptTokens?: integer; completionTokens?: integer; totalTokens?: integer; budgetLimit: integer; … }optional
totalTokens{ promptTokens: integer; completionTokens: integer; totalTokens: integer }optionalTotal tokens across all messages
totalCostnumberoptionalTotal cost for this session in USD
statusEnum<'active' | 'paused' | 'completed' | 'archived'>optional (default: "active")
createdAtstring✅ISO 8601 timestamp
updatedAtstring✅ISO 8601 timestamp
expiresAtstringoptionalISO 8601 timestamp
metadataRecord<string, any>optional

Nested Shape: ConversationSession.context

PropertyTypeRequiredDescription
sessionIdstring✅Conversation session ID
userIdstringoptionalUser identifier
agentIdstringoptionalAI agent identifier
objectstringoptionalRelated object (e.g., "case", "project")
recordIdstringoptionalRelated record ID
scopeRecord<string, any>optionalAdditional context scope
systemMessagestringoptionalSystem prompt/instructions
metadataRecord<string, any>optional

Nested Shape: ConversationSession.tokenBudget

PropertyTypeRequiredDescription
maxTokensinteger✅Maximum total tokens
maxPromptTokensintegeroptionalMax tokens for prompt
maxCompletionTokensintegeroptionalMax tokens for completion
reserveTokensintegeroptional (default: 500)Reserve tokens for system messages
bufferPercentagenumberoptional (default: 0.1)Buffer percentage (0.1 = 10%)
strategyEnum<'fifo' | 'importance' | 'semantic' | 'sliding_window' | 'summary'>optional (default: "sliding_window")
slidingWindowSizeintegeroptionalNumber of recent messages to keep
minImportanceScorenumberoptionalMinimum importance to keep
semanticThresholdnumberoptionalSemantic similarity threshold
enableSummarizationbooleanoptional (default: false)Enable context summarization
summarizationThresholdintegeroptionalTrigger summarization at N tokens
summaryModelstringoptionalModel ID for summarization
warnThresholdnumberoptional (default: 0.8)Warn at % of budget (0.8 = 80%)

Nested Shape: ConversationSession.messages[number]

PropertyTypeRequiredDescription
idstring✅Unique message ID
timestampstring✅ISO 8601 timestamp
roleEnum<'system' | 'user' | 'assistant' | 'function' | 'tool'>✅
content({ type: 'text'; text: string; metadata?: Record<string, any> } | { type: 'image'; imageUrl: string; detail?: Enum<'low' | 'high' | 'auto'>; metadata?: Record<string, any> } | { type: 'file'; fileUrl: string; mimeType: string; fileName?: string; … } | { type: 'code'; text: string; language?: string; metadata?: Record<string, any> })[]✅Message content (multimodal array)
functionCall{ name: string; arguments: string; result?: string }optionalLegacy function call
toolCalls{ id: string; type?: Enum<'function'>; function: object }[]optionalTool calls
toolCallIdstringoptionalTool call ID this message responds to
namestringoptionalName of the function/user
tokens{ promptTokens: integer; completionTokens: integer; totalTokens: integer }optionalToken usage for this message
costnumberoptionalCost for this message in USD
pinnedbooleanoptional (default: false)Prevent removal during pruning
importancenumberoptionalImportance score for pruning
embeddingnumber[]optionalVector embedding for semantic search
metadataRecord<string, any>optional

Nested Shape: ConversationSession.tokens

PropertyTypeRequiredDescription
promptTokensintegeroptional (default: 0)
completionTokensintegeroptional (default: 0)
totalTokensintegeroptional (default: 0)
budgetLimitinteger✅
budgetUsedintegeroptional (default: 0)
budgetRemaininginteger✅
budgetPercentagenumber✅Usage as percentage of budget
messageCountintegeroptional (default: 0)
prunedMessageCountintegeroptional (default: 0)
summarizedMessageCountintegeroptional (default: 0)

Nested Shape: ConversationSession.totalTokens

PropertyTypeRequiredDescription
promptTokensinteger✅Tokens consumed by the prompt
completionTokensinteger✅Tokens generated in the completion
totalTokensinteger✅Total tokens (prompt + completion)

ConversationSummary

Properties

PropertyTypeRequiredDescription
summarystring✅Conversation summary
keyPointsstring[]optionalKey discussion points
originalTokensinteger✅Original token count
summaryTokensinteger✅Summary token count
tokensSavedinteger✅Tokens saved
messageRange{ startIndex: integer; endIndex: integer }✅Range of messages summarized
generatedAtstring✅ISO 8601 timestamp
modelIdstringoptionalModel used for summarization

FileContent

Properties

PropertyTypeRequiredDescription
type'file'✅
fileUrlstring✅File attachment URL
mimeTypestring✅MIME type
fileNamestringoptional
metadataRecord<string, any>optional

FunctionCall

Properties

PropertyTypeRequiredDescription
namestring✅Function name
argumentsstring✅JSON string of function arguments
resultstringoptionalFunction execution result

ImageContent

Properties

PropertyTypeRequiredDescription
type'image'✅
imageUrlstring✅Image URL
detailEnum<'low' | 'high' | 'auto'>optional (default: "auto")
metadataRecord<string, any>optional

MessageContent

Union Options

This schema accepts one of the following structures:

Option 1

Type: text

Properties

PropertyTypeRequiredDescription
type'text'✅
textstring✅Text content
metadataRecord<string, any>optional

Option 2

Type: image

Properties

PropertyTypeRequiredDescription
type'image'✅
imageUrlstring✅Image URL
detailEnum<'low' | 'high' | 'auto'>optional (default: "auto")
metadataRecord<string, any>optional

Option 3

Type: file

Properties

PropertyTypeRequiredDescription
type'file'✅
fileUrlstring✅File attachment URL
mimeTypestring✅MIME type
fileNamestringoptional
metadataRecord<string, any>optional

Option 4

Type: code

Properties

PropertyTypeRequiredDescription
type'code'✅
textstring✅Code snippet
languagestringoptional (default: "text")
metadataRecord<string, any>optional


MessageContentType

Allowed Values

  • text
  • image
  • file
  • code
  • structured

MessagePruningEvent

Properties

PropertyTypeRequiredDescription
timestampstring✅Event timestamp
prunedMessages{ messageId: string; role: Enum<'system' | 'user' | 'assistant' | 'function' | 'tool'>; tokens: integer; importance?: number }[]✅
tokensFreedinteger✅
messagesRemovedinteger✅
remainingTokensinteger✅
remainingMessagesinteger✅

MessageRole

Allowed Values

  • system
  • user
  • assistant
  • function
  • tool

TextContent

Properties

PropertyTypeRequiredDescription
type'text'✅
textstring✅Text content
metadataRecord<string, any>optional

TokenBudgetConfig

Properties

PropertyTypeRequiredDescription
maxTokensinteger✅Maximum total tokens
maxPromptTokensintegeroptionalMax tokens for prompt
maxCompletionTokensintegeroptionalMax tokens for completion
reserveTokensintegeroptional (default: 500)Reserve tokens for system messages
bufferPercentagenumberoptional (default: 0.1)Buffer percentage (0.1 = 10%)
strategyEnum<'fifo' | 'importance' | 'semantic' | 'sliding_window' | 'summary'>optional (default: "sliding_window")
slidingWindowSizeintegeroptionalNumber of recent messages to keep
minImportanceScorenumberoptionalMinimum importance to keep
semanticThresholdnumberoptionalSemantic similarity threshold
enableSummarizationbooleanoptional (default: false)Enable context summarization
summarizationThresholdintegeroptionalTrigger summarization at N tokens
summaryModelstringoptionalModel ID for summarization
warnThresholdnumberoptional (default: 0.8)Warn at % of budget (0.8 = 80%)

TokenBudgetStrategy

Allowed Values

  • fifo
  • importance
  • semantic
  • sliding_window
  • summary

TokenUsageStats

Properties

PropertyTypeRequiredDescription
promptTokensintegeroptional (default: 0)
completionTokensintegeroptional (default: 0)
totalTokensintegeroptional (default: 0)
budgetLimitinteger✅
budgetUsedintegeroptional (default: 0)
budgetRemaininginteger✅
budgetPercentagenumber✅Usage as percentage of budget
messageCountintegeroptional (default: 0)
prunedMessageCountintegeroptional (default: 0)
summarizedMessageCountintegeroptional (default: 0)

ToolCall

Properties

PropertyTypeRequiredDescription
idstring✅Tool call ID
typeEnum<'function'>optional (default: "function")
function{ name: string; arguments: string; result?: string }✅

Nested Shape: ToolCall.function

PropertyTypeRequiredDescription
namestring✅Function name
argumentsstring✅JSON string of function arguments
resultstringoptionalFunction execution result

On this page