feat: saving token data to sessions
This commit is contained in:
@@ -8,6 +8,11 @@ internal sealed class ChatSession
|
||||
private readonly IChatClient _agent;
|
||||
public ContextCompactor Compactor { get; }
|
||||
public List<ChatMessage> History { get; }
|
||||
|
||||
// Token tracking state persisted across sessions
|
||||
public long SessionInputTokens { get; set; }
|
||||
public long SessionOutputTokens { get; set; }
|
||||
public int RequestCount { get; set; }
|
||||
|
||||
public ChatSession(IChatClient innerClient)
|
||||
{
|
||||
@@ -84,6 +89,18 @@ internal sealed class ChatSession
|
||||
};
|
||||
|
||||
var json = JsonSerializer.Serialize(messagesToSave, AppJsonContext.Default.ListChatMessage);
|
||||
|
||||
// Save token stats to a separate metadata file
|
||||
var metadataPath = Path.ChangeExtension(filePath, ".metadata.json");
|
||||
var metadata = new TokenMetadata
|
||||
{
|
||||
SessionInputTokens = SessionInputTokens,
|
||||
SessionOutputTokens = SessionOutputTokens,
|
||||
RequestCount = RequestCount
|
||||
};
|
||||
var metadataJson = JsonSerializer.Serialize(metadata, AppJsonContext.Default.TokenMetadata);
|
||||
await File.WriteAllTextAsync(metadataPath, metadataJson, cancellationToken);
|
||||
|
||||
await File.WriteAllTextAsync(filePath, json, cancellationToken);
|
||||
}
|
||||
|
||||
@@ -104,5 +121,33 @@ internal sealed class ChatSession
|
||||
History.Clear();
|
||||
History.Add(systemMessage);
|
||||
History.AddRange(messages);
|
||||
|
||||
// Load token stats from metadata file if it exists
|
||||
var metadataPath = Path.ChangeExtension(filePath, ".metadata.json");
|
||||
if (File.Exists(metadataPath))
|
||||
{
|
||||
try
|
||||
{
|
||||
var metadataJson = await File.ReadAllTextAsync(metadataPath, cancellationToken);
|
||||
var metadata = JsonSerializer.Deserialize<TokenMetadata>(metadataJson, AppJsonContext.Default.TokenMetadata);
|
||||
if (metadata != null)
|
||||
{
|
||||
SessionInputTokens = metadata.SessionInputTokens;
|
||||
SessionOutputTokens = metadata.SessionOutputTokens;
|
||||
RequestCount = metadata.RequestCount;
|
||||
}
|
||||
}
|
||||
catch { /* Ignore metadata load errors */ }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Token tracking metadata serialized with the session.
|
||||
/// </summary>
|
||||
internal sealed class TokenMetadata
|
||||
{
|
||||
public long SessionInputTokens { get; set; }
|
||||
public long SessionOutputTokens { get; set; }
|
||||
public int RequestCount { get; set; }
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user