You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

LLamaSharpChatCompletion.cs 3.5 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. using LLama;
  2. using Microsoft.SemanticKernel.AI;
  3. using Microsoft.SemanticKernel.AI.ChatCompletion;
  4. using System.Runtime.CompilerServices;
  5. namespace LLamaSharp.SemanticKernel.ChatCompletion;
  6. /// <summary>
  7. /// LLamaSharp ChatCompletion
  8. /// </summary>
  9. public sealed class LLamaSharpChatCompletion : IChatCompletion
  10. {
  11. private const string UserRole = "user:";
  12. private const string AssistantRole = "assistant:";
  13. private ChatSession session;
  14. private ChatRequestSettings defaultRequestSettings;
  15. private readonly Dictionary<string, string> _attributes = new();
  16. public IReadOnlyDictionary<string, string> Attributes => this._attributes;
  17. static ChatRequestSettings GetDefaultSettings()
  18. {
  19. return new ChatRequestSettings
  20. {
  21. MaxTokens = 256,
  22. Temperature = 0,
  23. TopP = 0,
  24. StopSequences = new List<string>()
  25. };
  26. }
  27. public LLamaSharpChatCompletion(InteractiveExecutor model, ChatRequestSettings? defaultRequestSettings = default)
  28. {
  29. this.session = new ChatSession(model)
  30. .WithHistoryTransform(new HistoryTransform())
  31. .WithOutputTransform(new LLamaTransforms.KeywordTextOutputStreamTransform(new string[] { UserRole, AssistantRole }));
  32. this.defaultRequestSettings = defaultRequestSettings ??= GetDefaultSettings();
  33. }
  34. public LLamaSharpChatCompletion(ChatSession session, ChatRequestSettings? defaultRequestSettings = default)
  35. {
  36. this.session = session;
  37. this.defaultRequestSettings = defaultRequestSettings ??= GetDefaultSettings();
  38. }
  39. /// <inheritdoc/>
  40. public ChatHistory CreateNewChat(string? instructions = "")
  41. {
  42. var history = new ChatHistory();
  43. if (instructions != null && !string.IsNullOrEmpty(instructions))
  44. {
  45. history.AddSystemMessage(instructions);
  46. }
  47. return history;
  48. }
  49. /// <inheritdoc/>
  50. public Task<IReadOnlyList<IChatResult>> GetChatCompletionsAsync(ChatHistory chat, AIRequestSettings? requestSettings = null, CancellationToken cancellationToken = default)
  51. {
  52. var settings = requestSettings != null
  53. ? ChatRequestSettings.FromRequestSettings(requestSettings)
  54. : defaultRequestSettings;
  55. // This call is not awaited because LLamaSharpChatResult accepts an IAsyncEnumerable.
  56. var result = this.session.ChatAsync(chat.ToLLamaSharpChatHistory(), settings.ToLLamaSharpInferenceParams(), cancellationToken);
  57. return Task.FromResult<IReadOnlyList<IChatResult>>(new List<IChatResult> { new LLamaSharpChatResult(result) }.AsReadOnly());
  58. }
  59. /// <inheritdoc/>
  60. #pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously.
  61. public async IAsyncEnumerable<IChatStreamingResult> GetStreamingChatCompletionsAsync(ChatHistory chat, AIRequestSettings? requestSettings = null, [EnumeratorCancellation] CancellationToken cancellationToken = default)
  62. #pragma warning restore CS1998
  63. {
  64. var settings = requestSettings != null
  65. ? ChatRequestSettings.FromRequestSettings(requestSettings)
  66. : defaultRequestSettings;
  67. // This call is not awaited because LLamaSharpChatResult accepts an IAsyncEnumerable.
  68. var result = this.session.ChatAsync(chat.ToLLamaSharpChatHistory(), settings.ToLLamaSharpInferenceParams(), cancellationToken);
  69. yield return new LLamaSharpChatResult(result);
  70. }
  71. }