ObjectStackObjectStack

Conversation

Conversation protocol schemas

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'
textstringCode 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)
durationnumberoptionalSession duration in seconds
firstMessageAtstringoptionalISO 8601 timestamp
lastMessageAtstringoptionalISO 8601 timestamp

ConversationContext

Properties

PropertyTypeRequiredDescription
sessionIdstringConversation 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
idstringUnique message ID
timestampstringISO 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'
textstringText content
metadataRecord<string, any>optional

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

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

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

PropertyTypeRequiredDescription
type'file'
fileUrlstringFile attachment URL
mimeTypestringMIME type
fileNamestringoptional
metadataRecord<string, any>optional

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

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

Nested Shape: ConversationMessage.functionCall

PropertyTypeRequiredDescription
namestringFunction name
argumentsstringJSON string of function arguments
resultstringoptionalFunction execution result

Nested Shape: ConversationMessage.toolCalls[number]

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

Nested Shape: ConversationMessage.tokens

PropertyTypeRequiredDescription
promptTokensintegerTokens consumed by the prompt
completionTokensintegerTokens generated in the completion
totalTokensintegerTotal tokens (prompt + completion)

ConversationSession

Properties

PropertyTypeRequiredDescription
idstringUnique 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")
createdAtstringISO 8601 timestamp
updatedAtstringISO 8601 timestamp
expiresAtstringoptionalISO 8601 timestamp
metadataRecord<string, any>optional

Nested Shape: ConversationSession.context

PropertyTypeRequiredDescription
sessionIdstringConversation 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
maxTokensintegerMaximum 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
idstringUnique message ID
timestampstringISO 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
budgetPercentagenumberUsage as percentage of budget
messageCountintegeroptional (default: 0)
prunedMessageCountintegeroptional (default: 0)
summarizedMessageCountintegeroptional (default: 0)

Nested Shape: ConversationSession.totalTokens

PropertyTypeRequiredDescription
promptTokensintegerTokens consumed by the prompt
completionTokensintegerTokens generated in the completion
totalTokensintegerTotal tokens (prompt + completion)

ConversationSummary

Properties

PropertyTypeRequiredDescription
summarystringConversation summary
keyPointsstring[]optionalKey discussion points
originalTokensintegerOriginal token count
summaryTokensintegerSummary token count
tokensSavedintegerTokens saved
messageRange{ startIndex: integer; endIndex: integer }Range of messages summarized
generatedAtstringISO 8601 timestamp
modelIdstringoptionalModel used for summarization

FileContent

Properties

PropertyTypeRequiredDescription
type'file'
fileUrlstringFile attachment URL
mimeTypestringMIME type
fileNamestringoptional
metadataRecord<string, any>optional

FunctionCall

Properties

PropertyTypeRequiredDescription
namestringFunction name
argumentsstringJSON string of function arguments
resultstringoptionalFunction execution result

ImageContent

Properties

PropertyTypeRequiredDescription
type'image'
imageUrlstringImage 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'
textstringText content
metadataRecord<string, any>optional

Option 2

Type: image

Properties

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

Option 3

Type: file

Properties

PropertyTypeRequiredDescription
type'file'
fileUrlstringFile attachment URL
mimeTypestringMIME type
fileNamestringoptional
metadataRecord<string, any>optional

Option 4

Type: code

Properties

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


MessageContentType

Allowed Values

  • text
  • image
  • file
  • code
  • structured

MessagePruningEvent

Properties

PropertyTypeRequiredDescription
timestampstringEvent 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'
textstringText content
metadataRecord<string, any>optional

TokenBudgetConfig

Properties

PropertyTypeRequiredDescription
maxTokensintegerMaximum 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
budgetPercentagenumberUsage as percentage of budget
messageCountintegeroptional (default: 0)
prunedMessageCountintegeroptional (default: 0)
summarizedMessageCountintegeroptional (default: 0)

ToolCall

Properties

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

Nested Shape: ToolCall.function

PropertyTypeRequiredDescription
namestringFunction name
argumentsstringJSON string of function arguments
resultstringoptionalFunction execution result

On this page