{"version":3,"sources":["../src/utils/openai.ts"],"sourcesContent":["import { Message, Function } from \"@copilotkit/shared\";\n\nexport function limitOpenAIMessagesToTokenCount(\n  messages: Message[],\n  functions: Function[],\n  maxTokens: number,\n): Message[] {\n  const result: Message[] = [];\n  const functionsNumTokens = countFunctionsTokens(functions);\n  if (functionsNumTokens > maxTokens) {\n    throw new Error(\n      `Too many tokens in function definitions: ${functionsNumTokens} > ${maxTokens}`,\n    );\n  }\n  maxTokens -= functionsNumTokens;\n\n  for (const message of messages) {\n    if (message.role === \"system\") {\n      const numTokens = countMessageTokens(message);\n      maxTokens -= numTokens;\n\n      if (maxTokens < 0) {\n        throw new Error(\"Not enough tokens for system message.\");\n      }\n    }\n  }\n\n  let cutoff: boolean = false;\n\n  const reversedMessages = [...messages].reverse();\n  for (const message of reversedMessages) {\n    if (message.role === \"system\") {\n      result.unshift(message);\n      continue;\n    } else if (cutoff) {\n      continue;\n    }\n    let numTokens = countMessageTokens(message);\n    if (maxTokens < numTokens) {\n      cutoff = true;\n      continue;\n    }\n    result.unshift(message);\n    maxTokens -= numTokens;\n  }\n\n  return result;\n}\n\nexport function maxTokensForOpenAIModel(model: string): number {\n  return maxTokensByModel[model] || DEFAULT_MAX_TOKENS;\n}\n\nconst DEFAULT_MAX_TOKENS = 8192;\n\nconst maxTokensByModel: { [key: string]: number } = {\n  \"gpt-3.5-turbo\": 4097,\n  \"gpt-3.5-turbo-16k\": 16385,\n  \"gpt-4\": 8192,\n  \"gpt-4-1106-preview\": 8192,\n  \"gpt-4-32k\": 32768,\n  \"gpt-3.5-turbo-0301\": 4097,\n  \"gpt-4-0314\": 8192,\n  \"gpt-4-32k-0314\": 32768,\n  \"gpt-3.5-turbo-0613\": 4097,\n  \"gpt-4-0613\": 8192,\n  \"gpt-4-32k-0613\": 32768,\n  \"gpt-3.5-turbo-16k-0613\": 16385,\n};\n\nfunction countFunctionsTokens(functions: Function[]): number {\n  if (functions.length === 0) {\n    return 0;\n  }\n  const json = JSON.stringify(functions);\n  return countTokens(json);\n}\n\nfunction countMessageTokens(message: Message): number {\n  if (message.content) {\n    return countTokens(message.content);\n  } else if (message.function_call) {\n    return countTokens(JSON.stringify(message.function_call));\n  }\n  return 0;\n}\n\nfunction countTokens(text: string): number {\n  return text.length / 3;\n}\n"],"mappings":";AAEO,SAAS,gCACd,UACA,WACA,WACW;AACX,QAAM,SAAoB,CAAC;AAC3B,QAAM,qBAAqB,qBAAqB,SAAS;AACzD,MAAI,qBAAqB,WAAW;AAClC,UAAM,IAAI;AAAA,MACR,4CAA4C,wBAAwB;AAAA,IACtE;AAAA,EACF;AACA,eAAa;AAEb,aAAW,WAAW,UAAU;AAC9B,QAAI,QAAQ,SAAS,UAAU;AAC7B,YAAM,YAAY,mBAAmB,OAAO;AAC5C,mBAAa;AAEb,UAAI,YAAY,GAAG;AACjB,cAAM,IAAI,MAAM,uCAAuC;AAAA,MACzD;AAAA,IACF;AAAA,EACF;AAEA,MAAI,SAAkB;AAEtB,QAAM,mBAAmB,CAAC,GAAG,QAAQ,EAAE,QAAQ;AAC/C,aAAW,WAAW,kBAAkB;AACtC,QAAI,QAAQ,SAAS,UAAU;AAC7B,aAAO,QAAQ,OAAO;AACtB;AAAA,IACF,WAAW,QAAQ;AACjB;AAAA,IACF;AACA,QAAI,YAAY,mBAAmB,OAAO;AAC1C,QAAI,YAAY,WAAW;AACzB,eAAS;AACT;AAAA,IACF;AACA,WAAO,QAAQ,OAAO;AACtB,iBAAa;AAAA,EACf;AAEA,SAAO;AACT;AAEO,SAAS,wBAAwB,OAAuB;AAC7D,SAAO,iBAAiB,KAAK,KAAK;AACpC;AAEA,IAAM,qBAAqB;AAE3B,IAAM,mBAA8C;AAAA,EAClD,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,SAAS;AAAA,EACT,sBAAsB;AAAA,EACtB,aAAa;AAAA,EACb,sBAAsB;AAAA,EACtB,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,sBAAsB;AAAA,EACtB,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,0BAA0B;AAC5B;AAEA,SAAS,qBAAqB,WAA+B;AAC3D,MAAI,UAAU,WAAW,GAAG;AAC1B,WAAO;AAAA,EACT;AACA,QAAM,OAAO,KAAK,UAAU,SAAS;AACrC,SAAO,YAAY,IAAI;AACzB;AAEA,SAAS,mBAAmB,SAA0B;AACpD,MAAI,QAAQ,SAAS;AACnB,WAAO,YAAY,QAAQ,OAAO;AAAA,EACpC,WAAW,QAAQ,eAAe;AAChC,WAAO,YAAY,KAAK,UAAU,QAAQ,aAAa,CAAC;AAAA,EAC1D;AACA,SAAO;AACT;AAEA,SAAS,YAAY,MAAsB;AACzC,SAAO,KAAK,SAAS;AACvB;","names":[]}