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.3 kB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  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. static ChatRequestSettings GetDefaultSettings()
  16. {
  17. return new ChatRequestSettings
  18. {
  19. MaxTokens = 256,
  20. Temperature = 0,
  21. TopP = 0,
  22. StopSequences = new List<string>()
  23. };
  24. }
  25. public LLamaSharpChatCompletion(InteractiveExecutor model, ChatRequestSettings? defaultRequestSettings = default)
  26. {
  27. this.session = new ChatSession(model)
  28. .WithHistoryTransform(new HistoryTransform())
  29. .WithOutputTransform(new LLamaTransforms.KeywordTextOutputStreamTransform(new string[] { UserRole, AssistantRole }));
  30. this.defaultRequestSettings = defaultRequestSettings ??= GetDefaultSettings();
  31. }
  32. public LLamaSharpChatCompletion(ChatSession session, ChatRequestSettings? defaultRequestSettings = default)
  33. {
  34. this.session = session;
  35. this.defaultRequestSettings = defaultRequestSettings ??= GetDefaultSettings();
  36. }
  37. /// <inheritdoc/>
  38. public ChatHistory CreateNewChat(string? instructions = "")
  39. {
  40. var history = new ChatHistory();
  41. if (instructions != null && !string.IsNullOrEmpty(instructions))
  42. {
  43. history.AddSystemMessage(instructions);
  44. }
  45. return history;
  46. }
  47. /// <inheritdoc/>
  48. public Task<IReadOnlyList<IChatResult>> GetChatCompletionsAsync(ChatHistory chat, AIRequestSettings? requestSettings = null, CancellationToken cancellationToken = default)
  49. {
  50. var settings = requestSettings != null
  51. ? (ChatRequestSettings)requestSettings
  52. : defaultRequestSettings;
  53. // This call is not awaited because LLamaSharpChatResult accepts an IAsyncEnumerable.
  54. var result = this.session.ChatAsync(chat.ToLLamaSharpChatHistory(), settings.ToLLamaSharpInferenceParams(), cancellationToken);
  55. return Task.FromResult<IReadOnlyList<IChatResult>>(new List<IChatResult> { new LLamaSharpChatResult(result) }.AsReadOnly());
  56. }
  57. /// <inheritdoc/>
  58. #pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously.
  59. public async IAsyncEnumerable<IChatStreamingResult> GetStreamingChatCompletionsAsync(ChatHistory chat, AIRequestSettings? requestSettings = null, [EnumeratorCancellation] CancellationToken cancellationToken = default)
  60. #pragma warning restore CS1998
  61. {
  62. var settings = requestSettings != null
  63. ? (ChatRequestSettings)requestSettings
  64. : defaultRequestSettings;
  65. // This call is not awaited because LLamaSharpChatResult accepts an IAsyncEnumerable.
  66. var result = this.session.ChatAsync(chat.ToLLamaSharpChatHistory(), settings.ToLLamaSharpInferenceParams(), cancellationToken);
  67. yield return new LLamaSharpChatResult(result);
  68. }
  69. }