in src/WebJobs.Extensions.OpenAI/Assistants/AssistantService.cs [135:177]
public async Task<AssistantState> GetStateAsync(AssistantQueryAttribute assistantQuery, CancellationToken cancellationToken)
{
string id = assistantQuery.Id;
string timestampString = Uri.UnescapeDataString(assistantQuery.TimestampUtc);
if (!DateTime.TryParse(timestampString, out DateTime timestamp))
{
throw new ArgumentException($"Invalid timestamp '{assistantQuery.TimestampUtc}'");
}
DateTime afterUtc = timestamp.ToUniversalTime();
this.logger.LogInformation(
"Reading state for assistant entity '{Id}' and getting chat messages after {Timestamp}",
id,
afterUtc.ToString("o"));
TableClient tableClient = this.GetOrCreateTableClient(assistantQuery.ChatStorageConnectionSetting, assistantQuery.CollectionName);
InternalChatState? chatState = await this.LoadChatStateAsync(id, tableClient, cancellationToken);
if (chatState is null)
{
this.logger.LogWarning("No assistant exists with ID = '{Id}'", id);
return new AssistantState(id, false, default, default, 0, 0, Array.Empty<AssistantMessage>());
}
List<ChatMessageTableEntity> filteredChatMessages = chatState.Messages
.Where(msg => msg.CreatedAt > afterUtc)
.ToList();
this.logger.LogInformation(
"Returning {Count}/{Total} chat messages from entity '{Id}'",
filteredChatMessages.Count,
chatState.Metadata.TotalMessages, id);
AssistantState state = new(
id,
true,
chatState.Metadata.CreatedAt,
chatState.Metadata.LastUpdatedAt,
chatState.Metadata.TotalMessages,
chatState.Metadata.TotalTokens,
filteredChatMessages.Select(msg => new AssistantMessage(msg.Content, msg.Role, msg.ToolCallsString)).ToList());
return state;
}