Merge pull request #448 from hchen2020/master

Fix translator.
This commit is contained in:
C. Oceania 2024-05-09 16:00:34 -05:00 committed by GitHub
commit 6bcb0ae7a6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 52 additions and 23 deletions

View file

@ -5,6 +5,7 @@ public class AgentSettings
public string DataDir { get; set; } = string.Empty;
public string TemplateFormat { get; set; } = "liquid";
public string HostAgentId { get; set; } = string.Empty;
public bool EnableTranslator { get; set; } = false;
/// <summary>
/// This is the default LLM config for agent

View file

@ -0,0 +1,13 @@
namespace BotSharp.Abstraction.Translation.Models;
public class TranslationOutput
{
[JsonPropertyName("input_lang")]
public string InputLanguage { get; set; } = null!;
[JsonPropertyName("output_lang")]
public string OutputLanguage { get; set; } = LanguageType.ENGLISH;
[JsonPropertyName("texts")]
public string[] Texts { get; set; } = Array.Empty<string>();
}

View file

@ -28,10 +28,7 @@ public class RouteToAgentRoutingHandler : RoutingHandlerBase, IRoutingHandler
required: true),
new ParameterPropertyDef("is_new_task",
"whether the user is requesting a new task that is different from the previous topic.",
type: "boolean"),
new ParameterPropertyDef("language",
"User preferred language, considering the whole conversation. Language could be English, Spanish or Chinese.",
required: true)
type: "boolean")
};
public RouteToAgentRoutingHandler(IServiceProvider services, ILogger<RouteToAgentRoutingHandler> logger, RoutingSettings settings)

View file

@ -16,7 +16,7 @@ public partial class RoutingService
role = agent.Name;
}
conversation += $"{role}: {dialog.Payload ?? dialog.SecondaryContent ?? dialog.Content}\r\n";
conversation += $"{role}: {dialog.Payload ?? dialog.Content}\r\n";
}
return conversation;

View file

@ -82,26 +82,29 @@ public partial class RoutingService : IRoutingService
_context.Push(_router.Id);
// Handle multi-language for input
var agentSettings = _services.GetRequiredService<AgentSettings>();
if (agentSettings.EnableTranslator)
{
var translator = _services.GetRequiredService<ITranslationService>();
var language = states.GetState("language", LanguageType.UNKNOWN);
if (language != LanguageType.ENGLISH)
{
message.SecondaryContent = message.Content;
message.Content = await translator.Translate(_router, message.MessageId, message.Content,
language: LanguageType.ENGLISH,
clone: false);
}
}
dialogs.Add(message);
storage.Append(convService.ConversationId, message);
// Get first instruction
_router.TemplateDict["conversation"] = await GetConversationContent(dialogs);
var inst = await planner.GetNextInstruction(_router, message.MessageId, dialogs);
// Handle multi-language for input
var translator = _services.GetRequiredService<ITranslationService>();
var language = states.GetState("language", inst.Language);
if (language != LanguageType.UNKNOWN && language != LanguageType.ENGLISH)
{
message.SecondaryContent = message.Content;
message.Content = await translator.Translate(_router, message.MessageId, message.Content,
language: LanguageType.ENGLISH,
clone: false);
}
storage.Append(convService.ConversationId, message);
int loopCount = 1;
while (true)
{

View file

@ -21,6 +21,12 @@ namespace BotSharp.Logger.Hooks
}
public override async Task OnResponseGenerated(RoleDialogModel message)
{
var agentSettings = _services.GetRequiredService<AgentSettings>();
if (!agentSettings.EnableTranslator)
{
return;
}
// Handle multi-language for output
var agentService = _services.GetRequiredService<IAgentService>();
var router = await agentService.LoadAgent(AIAssistant);

View file

@ -1,6 +1,8 @@
using BotSharp.Abstraction.Infrastructures.Enums;
using BotSharp.Abstraction.MLTasks;
using BotSharp.Abstraction.Options;
using BotSharp.Abstraction.Templating;
using BotSharp.Abstraction.Translation.Models;
using System.Collections;
using System.Reflection;
@ -57,7 +59,13 @@ public class TranslationService : ITranslationService
try
{
var translatedTexts = translatedStringList.JsonArrayContent<string>();
// Override language if it's Unknown, it's used to output the corresponding language.
var states = _services.GetRequiredService<IConversationStateService>();
var inputLanguage = string.IsNullOrEmpty(translatedStringList.InputLanguage) ? LanguageType.ENGLISH : translatedStringList.InputLanguage;
var languageState = states.GetState("language", inputLanguage);
states.SetState("language", languageState, activeRounds: 1);
var translatedTexts = translatedStringList.Texts;
var map = new Dictionary<string, string>();
for (var i = 0; i < texts.Length; i++)
@ -283,7 +291,7 @@ public class TranslationService : ITranslationService
/// <param name="list"></param>
/// <param name="language"></param>
/// <returns></returns>
private async Task<string> InnerTranslate(string texts, string language, string template)
private async Task<TranslationOutput> InnerTranslate(string texts, string language, string template)
{
var translator = new Agent
{
@ -308,7 +316,7 @@ public class TranslationService : ITranslationService
}
};
var response = await _completion.GetChatCompletions(translator, translationDialogs);
return response.Content;
return response.Content.JsonContent<TranslationOutput>();
}
#region Type methods

View file

@ -1,4 +1,5 @@
{{ text_list }}
=====
Translate the above sentences in the list into {{ language }}, output the translated text in JSON array [""].
Translate the above sentences in the list into {{ language }}.
Output the translated text in JSON {"input_lang":"", "output_lang":"{{ language }}", "texts":[""]}, input_lang is based on the original sentences.