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

94 lines
2.4 KiB

  1. import { TextCompletionModel } from '../models';
  2. import {
  3. ConsumeStream,
  4. DataEventId,
  5. DoFetch,
  6. FinishableChoiceBase,
  7. PlatformError,
  8. PlatformResponse,
  9. UsageMetadata,
  10. } from '../common';
  11. export enum DataEventObjectType {
  12. TEXT_COMPLETION = 'text_completion',
  13. }
  14. export interface CreateTextCompletionParams {
  15. model: TextCompletionModel;
  16. prompt: string;
  17. temperature?: number;
  18. topP?: number;
  19. n?: number;
  20. stop?: string | string[];
  21. maxTokens?: number;
  22. logprobs?: number;
  23. echo?: boolean;
  24. bestOf?: number;
  25. logitBias?: Record<string, number>;
  26. user?: string;
  27. presencePenalty?: number;
  28. frequencyPenalty?: number;
  29. }
  30. export interface TextCompletionChoice extends FinishableChoiceBase {
  31. text: string;
  32. logprobs?: number;
  33. }
  34. export interface CreateTextCompletionDataEvent<
  35. C extends Partial<FinishableChoiceBase>
  36. > extends PlatformResponse {
  37. id: DataEventId;
  38. object: DataEventObjectType;
  39. model: TextCompletionModel;
  40. choices: C[];
  41. }
  42. export interface TextCompletion
  43. extends CreateTextCompletionDataEvent<Partial<TextCompletionChoice>>, UsageMetadata {}
  44. export type TextCompletionChunkDataEvent = CreateTextCompletionDataEvent<TextCompletionChoice>;
  45. export function createTextCompletion(
  46. this: NodeJS.EventEmitter,
  47. doFetch: DoFetch,
  48. consumeStream: ConsumeStream,
  49. params: CreateTextCompletionParams,
  50. ) {
  51. doFetch('POST', '/completions', {
  52. model: params.model ?? TextCompletionModel.TEXT_DAVINCI_003,
  53. prompt: params.prompt,
  54. temperature: params.temperature ?? 1,
  55. top_p: params.topP ?? 1,
  56. n: params.n ?? 1,
  57. stop: params.stop ?? null,
  58. stream: true,
  59. max_tokens: params.maxTokens,
  60. logprobs: params.logprobs,
  61. echo: params.echo,
  62. best_of: params.bestOf,
  63. logit_bias: params.logitBias,
  64. user: params.user,
  65. presence_penalty: params.presencePenalty,
  66. frequency_penalty: params.frequencyPenalty,
  67. })
  68. .then(async (response) => {
  69. if (!response.ok) {
  70. this.emit('error', new PlatformError(
  71. // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
  72. `Create text completion returned with status: ${response.status}`,
  73. response,
  74. ));
  75. this.emit('end');
  76. return;
  77. }
  78. await consumeStream(response);
  79. this.emit('end');
  80. })
  81. .catch((err) => {
  82. this.emit('error', err as Error);
  83. this.emit('end');
  84. });
  85. }