{"version":3,"file":"index.cjs","sources":["../src/AIComplete.ts"],"sourcesContent":["import { Configuration, OpenAIApi } from 'openai'\nimport { globbySync, Options } from 'globby'\nimport { readFileSync } from 'fs'\nimport {\n  CreateCompletionRequest,\n  CreateCompletionResponse\n} from 'openai/api.js'\nimport { ConfigurationParameters } from 'openai/configuration.js'\n\nexport interface InputItem {\n  type: 'filepath' | 'text'\n  value: string\n}\n\nexport interface AICompleteOptions {\n  openAI: {\n    config: ConfigurationParameters\n  }\n}\n\nexport interface RequestArgs {\n  globby?: {\n    options?: Options\n    patterns: string | readonly string[]\n  }\n  input: (args: {\n    args: RequestArgs\n    filePath: string\n    text: string\n  }) => Promise<{\n    content?: string\n    createCompletionRequest?: Partial<CreateCompletionRequest>\n    maxTokens?: number\n    prompt: string\n  }>\n  inputList?: InputItem[]\n  output: (args: {\n    args: RequestArgs\n    content: string\n    createCompletionRequest: Partial<CreateCompletionRequest>\n    data: CreateCompletionResponse\n    filePath: string\n    maxTokens?: number\n    prompt: string\n  }) => Promise<{\n    choice: any\n  }>\n}\n\nexport const defaultCreateCompletionRequest = {\n  temperature: 0.7,\n  top_p: 1,\n  frequency_penalty: 0,\n  presence_penalty: 0\n}\n\nexport class AIComplete {\n  private readonly openai: OpenAIApi\n  private readonly options: AICompleteOptions\n  private static MAX_TOKENS = 4000\n  private static DEFAULT_MODEL = 'text-davinci-003'\n\n  constructor(options: AICompleteOptions) {\n    const configuration = new Configuration(options.openAI.config)\n    this.openai = new OpenAIApi(configuration)\n    this.options = options\n  }\n\n  private async request(args: RequestArgs & {}, fn: any) {\n    const inputList = []\n\n    const addGlobbyInput = (\n      patterns: string | readonly string[],\n      options?: Options\n    ) => {\n      inputList.push(\n        ...globbySync(patterns, options).map((filePath) => ({\n          type: 'filepath',\n          value: filePath\n        }))\n      )\n    }\n\n    const addFileInput = (filePath: string) => {\n      inputList.push({\n        type: 'filepath',\n        value: filePath\n      })\n    }\n\n    const addTextInput = (text: string) => {\n      inputList.push({\n        type: 'text',\n        value: text\n      })\n    }\n\n    if (args.globby) {\n      addGlobbyInput(args.globby.patterns, args.globby.options)\n    }\n\n    if (args.inputList) {\n      for (const inputItem of args.inputList) {\n        if (inputItem.type === 'filepath') {\n          addFileInput(inputItem.value)\n        }\n        if (inputItem.type === 'text') {\n          addTextInput(inputItem.value)\n        }\n      }\n    }\n    const getContent = (inputItem): string => {\n      let content: string\n      if (inputItem.type === 'filepath') {\n        content = readFileSync(inputItem.value, 'utf8')\n      }\n      if (inputItem.type === 'text') {\n        content = inputItem.value\n      }\n      return content\n    }\n\n    const res = []\n\n    for (const inputItem of inputList) {\n      try {\n        res.push(\n          await fn(\n            args,\n            getContent(inputItem),\n            inputItem.type === 'filepath' ? inputItem.value : undefined\n          )\n        )\n      } catch (error) {\n        console.error(error)\n        res.push(null)\n      }\n    }\n\n    return res\n  }\n\n  public async createCompletion(args: RequestArgs) {\n    return this.request(args, this.createCompletionFromText.bind(this))\n  }\n\n  public async createCompletionFromText(\n    args: RequestArgs,\n    text: string,\n    filePath?: string\n  ) {\n    const input = await args.input({\n      args,\n      text,\n      filePath\n    })\n\n    const prompt = `${input.prompt} ${input.content || text}`.trim()\n\n    // count alphanumeric characters in prompt\n    const promptLength = prompt.replace(/[^a-z0-9]/gi, '').length\n\n    const maxTokens =\n      input.maxTokens || Math.min(promptLength, AIComplete.MAX_TOKENS)\n\n    if (maxTokens > AIComplete.MAX_TOKENS) {\n      throw new Error(\n        `maxTokens must be less than ${AIComplete.MAX_TOKENS}. Try breaking the input into smaller chunks.`\n      )\n    }\n\n    const request: CreateCompletionRequest = {\n      model: AIComplete.DEFAULT_MODEL,\n      prompt,\n      max_tokens: maxTokens,\n      ...defaultCreateCompletionRequest,\n      ...input.createCompletionRequest\n    }\n\n    const response = await this.openai.createCompletion(request)\n    const data = response.data\n\n    const output = await args.output({\n      data,\n      createCompletionRequest: request,\n      maxTokens,\n      prompt,\n      args,\n      content: text,\n      filePath\n    })\n\n    return {\n      data,\n      input,\n      request,\n      output,\n      args,\n      filePath\n    }\n  }\n}\n"],"names":["defaultCreateCompletionRequest","temperature","top_p","frequency_penalty","presence_penalty","AIComplete","constructor","options","openai","configuration","Configuration","openAI","config","OpenAIApi","request","args","fn","inputList","addGlobbyInput","patterns","push","globbySync","map","filePath","type","value","addFileInput","addTextInput","text","globby","inputItem","getContent","content","readFileSync","res","undefined","error","console","createCompletion","createCompletionFromText","bind","input","prompt","trim","promptLength","replace","length","maxTokens","Math","min","MAX_TOKENS","Error","model","DEFAULT_MODEL","max_tokens","createCompletionRequest","response","data","output"],"mappings":"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"}