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.

ModelSession.cs 2.5 kB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. using LLama.Abstractions;
  2. namespace LLama.Web.Models
  3. {
  4. public class ModelSession : IDisposable
  5. {
  6. private bool _isFirstInteraction = true;
  7. private ModelOptions _modelOptions;
  8. private PromptOptions _promptOptions;
  9. private ParameterOptions _inferenceOptions;
  10. private ITextStreamTransform _outputTransform;
  11. private InteractiveExecutor _interactiveExecutor;
  12. private CancellationTokenSource _cancellationTokenSource;
  13. public ModelSession(string connectionId, ModelOptions modelOptions, PromptOptions promptOptions, ParameterOptions parameterOptions)
  14. {
  15. ConnectionId = connectionId;
  16. _modelOptions = modelOptions;
  17. _promptOptions = promptOptions;
  18. _inferenceOptions = parameterOptions;
  19. _interactiveExecutor = new InteractiveExecutor(new LLamaModel(_modelOptions));
  20. _inferenceOptions.AntiPrompts = _promptOptions.AntiPrompt?.Concat(_inferenceOptions.AntiPrompts ?? Enumerable.Empty<string>()).Distinct() ?? _inferenceOptions.AntiPrompts;
  21. if (_promptOptions.OutputFilter?.Count > 0)
  22. _outputTransform = new LLamaTransforms.KeywordTextOutputStreamTransform(_promptOptions.OutputFilter, redundancyLength: 5);
  23. }
  24. public string ConnectionId { get; }
  25. public string ResponseId { get; set; }
  26. public IAsyncEnumerable<string> InferAsync(string message, CancellationTokenSource cancellationTokenSource)
  27. {
  28. _cancellationTokenSource = cancellationTokenSource;
  29. if (_isFirstInteraction)
  30. {
  31. _isFirstInteraction = false;
  32. message = _promptOptions.Prompt + message;
  33. }
  34. if (_outputTransform is not null)
  35. return _outputTransform.TransformAsync(_interactiveExecutor.InferAsync(message, _inferenceOptions, _cancellationTokenSource.Token));
  36. return _interactiveExecutor.InferAsync(message, _inferenceOptions, _cancellationTokenSource.Token);
  37. }
  38. public void CancelInfer()
  39. {
  40. _cancellationTokenSource?.Cancel();
  41. }
  42. public bool IsInferCanceled()
  43. {
  44. return _cancellationTokenSource.IsCancellationRequested;
  45. }
  46. public void Dispose()
  47. {
  48. _inferenceOptions = null;
  49. _outputTransform = null;
  50. _interactiveExecutor.Model?.Dispose();
  51. _interactiveExecutor = null;
  52. }
  53. }
  54. }