Merge branch 'SciSharp:master' into master
This commit is contained in:
commit
8bdaef5cf8
|
|
@ -13,7 +13,7 @@ public interface IConversationService
|
|||
Task<PagedItems<Conversation>> GetConversations(ConversationFilter filter);
|
||||
Task<Conversation> UpdateConversationTitle(string id, string title);
|
||||
Task<List<Conversation>> GetLastConversations();
|
||||
Task<List<string>> GetIdleConversations(int batchSize, int messageLimit, int bufferHours);
|
||||
Task<List<string>> GetIdleConversations(int batchSize, int messageLimit, int bufferHours, IEnumerable<string> excludeAgentIds);
|
||||
Task<bool> DeleteConversations(IEnumerable<string> ids);
|
||||
|
||||
/// <summary>
|
||||
|
|
|
|||
|
|
@ -12,8 +12,8 @@ public class ConversationSetting
|
|||
public bool EnableContentLog { get; set; }
|
||||
public bool EnableStateLog { get; set; }
|
||||
public bool EnableTranslationMemory { get; set; }
|
||||
public CleanConversationSetting CleanSetting { get; set; } = new CleanConversationSetting();
|
||||
public RateLimitSetting RateLimit { get; set; } = new RateLimitSetting();
|
||||
public CleanConversationSetting CleanSetting { get; set; } = new();
|
||||
public RateLimitSetting RateLimit { get; set; } = new();
|
||||
}
|
||||
|
||||
public class CleanConversationSetting
|
||||
|
|
@ -22,5 +22,5 @@ public class CleanConversationSetting
|
|||
public int BatchSize { get; set; }
|
||||
public int MessageLimit { get; set; }
|
||||
public int BufferHours { get; set; }
|
||||
|
||||
public IEnumerable<string> ExcludeAgentIds { get; set; } = new List<string>();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -68,7 +68,7 @@ public interface IBotSharpRepository
|
|||
void UpdateConversationBreakpoint(string conversationId, ConversationBreakpoint breakpoint);
|
||||
ConversationBreakpoint? GetConversationBreakpoint(string conversationId);
|
||||
List<Conversation> GetLastConversations();
|
||||
List<string> GetIdleConversations(int batchSize, int messageLimit, int bufferHours);
|
||||
List<string> GetIdleConversations(int batchSize, int messageLimit, int bufferHours, IEnumerable<string> excludeAgentIds);
|
||||
IEnumerable<string> TruncateConversation(string conversationId, string messageId, bool cleanLog = false);
|
||||
#endregion
|
||||
|
||||
|
|
|
|||
|
|
@ -70,10 +70,10 @@ public partial class ConversationService : IConversationService
|
|||
return db.GetLastConversations();
|
||||
}
|
||||
|
||||
public async Task<List<string>> GetIdleConversations(int batchSize, int messageLimit, int bufferHours)
|
||||
public async Task<List<string>> GetIdleConversations(int batchSize, int messageLimit, int bufferHours, IEnumerable<string> excludeAgentIds)
|
||||
{
|
||||
var db = _services.GetRequiredService<IBotSharpRepository>();
|
||||
return db.GetIdleConversations(batchSize, messageLimit, bufferHours);
|
||||
return db.GetIdleConversations(batchSize, messageLimit, bufferHours, excludeAgentIds ?? new List<string>());
|
||||
}
|
||||
|
||||
public async Task<Conversation> NewConversation(Conversation sess)
|
||||
|
|
|
|||
|
|
@ -145,7 +145,7 @@ public class BotSharpDbContext : Database, IBotSharpRepository
|
|||
public List<Conversation> GetLastConversations()
|
||||
=> throw new NotImplementedException();
|
||||
|
||||
public List<string> GetIdleConversations(int batchSize, int messageLimit, int bufferHours)
|
||||
public List<string> GetIdleConversations(int batchSize, int messageLimit, int bufferHours, IEnumerable<string> excludeAgentIds)
|
||||
=> throw new NotImplementedException();
|
||||
|
||||
public List<DialogElement> GetConversationDialogs(string conversationId)
|
||||
|
|
|
|||
|
|
@ -378,7 +378,7 @@ namespace BotSharp.Core.Repository
|
|||
.ToList();
|
||||
}
|
||||
|
||||
public List<string> GetIdleConversations(int batchSize, int messageLimit, int bufferHours)
|
||||
public List<string> GetIdleConversations(int batchSize, int messageLimit, int bufferHours, IEnumerable<string> excludeAgentIds)
|
||||
{
|
||||
var ids = new List<string>();
|
||||
var batchLimit = 100;
|
||||
|
|
@ -423,7 +423,7 @@ namespace BotSharp.Core.Repository
|
|||
continue;
|
||||
}
|
||||
|
||||
if (conv.UpdatedTime > utcNow.AddHours(-bufferHours))
|
||||
if (excludeAgentIds.Contains(conv.AgentId) || conv.UpdatedTime > utcNow.AddHours(-bufferHours))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -62,7 +62,7 @@ namespace BotSharp.OpenAPI.BackgroundServices
|
|||
if (cleanSetting == null || !cleanSetting.Enable) return;
|
||||
|
||||
var conversationService = scope.ServiceProvider.GetRequiredService<IConversationService>();
|
||||
var conversationIds = await conversationService.GetIdleConversations(cleanSetting.BatchSize, cleanSetting.MessageLimit, cleanSetting.BufferHours);
|
||||
var conversationIds = await conversationService.GetIdleConversations(cleanSetting.BatchSize, cleanSetting.MessageLimit, cleanSetting.BufferHours, cleanSetting.ExcludeAgentIds);
|
||||
|
||||
if (!conversationIds.IsNullOrEmpty())
|
||||
{
|
||||
|
|
|
|||
|
|
@ -344,7 +344,7 @@ public partial class MongoRepository
|
|||
}).ToList();
|
||||
}
|
||||
|
||||
public List<string> GetIdleConversations(int batchSize, int messageLimit, int bufferHours)
|
||||
public List<string> GetIdleConversations(int batchSize, int messageLimit, int bufferHours, IEnumerable<string> excludeAgentIds)
|
||||
{
|
||||
var page = 1;
|
||||
var batchLimit = 100;
|
||||
|
|
@ -370,7 +370,7 @@ public partial class MongoRepository
|
|||
{
|
||||
var skip = (page - 1) * batchSize;
|
||||
var candidates = _dc.Conversations.AsQueryable()
|
||||
.Where(x => x.DialogCount <= messageLimit && x.UpdatedTime <= utcNow.AddHours(-bufferHours))
|
||||
.Where(x => !excludeAgentIds.Contains(x.AgentId) && x.DialogCount <= messageLimit && x.UpdatedTime <= utcNow.AddHours(-bufferHours))
|
||||
.Skip(skip)
|
||||
.Take(batchSize)
|
||||
.Select(x => x.Id)
|
||||
|
|
|
|||
|
|
@ -184,7 +184,7 @@ public class TwilioVoiceController : TwilioController
|
|||
response = twilio.ReturnInstructions(new List<string>
|
||||
{
|
||||
$"twilio/voice/speeches/{conversationId}/{reply.SpeechFileName}"
|
||||
}, $"twilio/voice/{conversationId}/receive/{nextSeqNum}?states={states}", true);
|
||||
}, $"twilio/voice/{conversationId}/receive/{nextSeqNum}?states={states}", true, hints:reply.Hints);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -7,5 +7,6 @@ namespace BotSharp.Plugin.Twilio.Models
|
|||
public string Content { get; set; }
|
||||
public string MessageId { get; set; }
|
||||
public string SpeechFileName { get; set; }
|
||||
public string Hints { get; set; }
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -106,8 +106,27 @@ namespace BotSharp.Plugin.Twilio.Services
|
|||
var data = await completion.GenerateAudioFromTextAsync(reply.Content);
|
||||
var fileName = $"reply_{reply.MessageId}.mp3";
|
||||
fileStorage.SaveSpeechFile(message.ConversationId, fileName, data);
|
||||
|
||||
reply.SpeechFileName = fileName;
|
||||
var phrases = reply.Content.Split(',', StringSplitOptions.RemoveEmptyEntries);
|
||||
int capcity = 100;
|
||||
var hints = new List<string>(capcity);
|
||||
for (int i = phrases.Length - 1; i >= 0; i--)
|
||||
{
|
||||
var words = phrases[i].Split(' ', StringSplitOptions.RemoveEmptyEntries);
|
||||
for (int j = words.Length - 1; j >= 0; j--)
|
||||
{
|
||||
hints.Add(words[j]);
|
||||
if (hints.Count >= capcity)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (hints.Count >= capcity)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
reply.Hints = string.Join(',', hints);
|
||||
reply.Content = null;
|
||||
await sessionManager.SetAssistantReplyAsync(message.ConversationId, message.SeqNumber, reply);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -66,7 +66,7 @@ public class TwilioService
|
|||
return response;
|
||||
}
|
||||
|
||||
public VoiceResponse ReturnInstructions(List<string> speechPaths, string callbackPath, bool actionOnEmptyResult, int timeout = 3)
|
||||
public VoiceResponse ReturnInstructions(List<string> speechPaths, string callbackPath, bool actionOnEmptyResult, int timeout = 3, string hints = null)
|
||||
{
|
||||
var response = new VoiceResponse();
|
||||
var gather = new Gather()
|
||||
|
|
@ -81,7 +81,7 @@ public class TwilioService
|
|||
SpeechTimeout = "auto", // timeout > 0 ? timeout.ToString() : "3",
|
||||
Timeout = timeout > 0 ? timeout : 3,
|
||||
ActionOnEmptyResult = actionOnEmptyResult,
|
||||
Hints = "Yes, No, Correct"
|
||||
Hints = hints
|
||||
};
|
||||
|
||||
if (!speechPaths.IsNullOrEmpty())
|
||||
|
|
|
|||
Loading…
Reference in a new issue