{"version":3,"file":"utils.cjs","names":[],"sources":["../../../src/service-adapters/anthropic/utils.ts"],"sourcesContent":["import { Anthropic } from \"@anthropic-ai/sdk\";\nimport { ActionInput } from \"../../graphql/inputs/action.input\";\nimport { Message } from \"../../graphql/types/converted\";\n\nexport function limitMessagesToTokenCount(\n  messages: any[],\n  tools: any[],\n  model: string,\n  maxTokens?: number,\n): any[] {\n  maxTokens ||= MAX_TOKENS;\n\n  const result: any[] = [];\n  const toolsNumTokens = countToolsTokens(model, tools);\n  if (toolsNumTokens > maxTokens) {\n    throw new Error(\n      `Too many tokens in function definitions: ${toolsNumTokens} > ${maxTokens}`,\n    );\n  }\n  maxTokens -= toolsNumTokens;\n\n  for (const message of messages) {\n    if (message.role === \"system\") {\n      const numTokens = countMessageTokens(model, 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].toReversed();\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(model, 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\nconst MAX_TOKENS = 128000;\n\nfunction countToolsTokens(model: string, tools: any[]): number {\n  if (tools.length === 0) {\n    return 0;\n  }\n  const json = JSON.stringify(tools);\n  return countTokens(model, json);\n}\n\nfunction countMessageTokens(model: string, message: any): number {\n  return countTokens(model, JSON.stringify(message.content) || \"\");\n}\n\nfunction countTokens(model: string, text: string): number {\n  return text.length / 3;\n}\n\nexport function convertActionInputToAnthropicTool(\n  action: ActionInput,\n): Anthropic.Messages.Tool {\n  return {\n    name: action.name,\n    description: action.description,\n    input_schema: JSON.parse(action.jsonSchema),\n  };\n}\n\nexport function convertMessageToAnthropicMessage(\n  message: Message,\n): Anthropic.Messages.MessageParam {\n  if (message.isTextMessage()) {\n    if (message.role === \"system\") {\n      return {\n        role: \"assistant\",\n        content: [\n          {\n            type: \"text\",\n            text:\n              \"THE FOLLOWING MESSAGE IS A SYSTEM MESSAGE: \" + message.content,\n          },\n        ],\n      };\n    } else {\n      return {\n        role: message.role === \"user\" ? \"user\" : \"assistant\",\n        content: [{ type: \"text\", text: message.content }],\n      };\n    }\n  } else if (message.isImageMessage()) {\n    let mediaType: \"image/jpeg\" | \"image/png\" | \"image/webp\" | \"image/gif\";\n    switch (message.format) {\n      case \"jpeg\":\n        mediaType = \"image/jpeg\";\n        break;\n      case \"png\":\n        mediaType = \"image/png\";\n        break;\n      case \"webp\":\n        mediaType = \"image/webp\";\n        break;\n      case \"gif\":\n        mediaType = \"image/gif\";\n        break;\n      default:\n        throw new Error(`Unsupported image format: ${message.format}`);\n    }\n\n    return {\n      role: \"user\",\n      content: [\n        {\n          type: \"image\",\n          source: {\n            type: \"base64\",\n            media_type: mediaType,\n            data: message.bytes,\n          },\n        },\n      ],\n    };\n  } else if (message.isActionExecutionMessage()) {\n    return {\n      role: \"assistant\",\n      content: [\n        {\n          id: message.id,\n          type: \"tool_use\",\n          input: message.arguments,\n          name: message.name,\n        },\n      ],\n    };\n  } else if (message.isResultMessage()) {\n    return {\n      role: \"user\",\n      content: [\n        {\n          type: \"tool_result\",\n          content: message.result || \"Action completed successfully\",\n          tool_use_id: message.actionExecutionId,\n        },\n      ],\n    };\n  }\n}\n"],"mappings":";;;AAIA,SAAgB,0BACd,UACA,OACA,OACA,WACO;AACP,eAAc;CAEd,MAAM,SAAgB,EAAE;CACxB,MAAM,iBAAiB,iBAAiB,OAAO,MAAM;AACrD,KAAI,iBAAiB,UACnB,OAAM,IAAI,MACR,4CAA4C,eAAe,KAAK,YACjE;AAEH,cAAa;AAEb,MAAK,MAAM,WAAW,SACpB,KAAI,QAAQ,SAAS,UAAU;EAC7B,MAAM,YAAY,mBAAmB,OAAO,QAAQ;AACpD,eAAa;AAEb,MAAI,YAAY,EACd,OAAM,IAAI,MAAM,wCAAwC;;CAK9D,IAAI,SAAkB;CAEtB,MAAM,mBAAmB,CAAC,GAAG,SAAS,CAAC,YAAY;AACnD,MAAK,MAAM,WAAW,kBAAkB;AACtC,MAAI,QAAQ,SAAS,UAAU;AAC7B,UAAO,QAAQ,QAAQ;AACvB;aACS,OACT;EAEF,IAAI,YAAY,mBAAmB,OAAO,QAAQ;AAClD,MAAI,YAAY,WAAW;AACzB,YAAS;AACT;;AAEF,SAAO,QAAQ,QAAQ;AACvB,eAAa;;AAGf,QAAO;;AAGT,MAAM,aAAa;AAEnB,SAAS,iBAAiB,OAAe,OAAsB;AAC7D,KAAI,MAAM,WAAW,EACnB,QAAO;AAGT,QAAO,YAAY,OADN,KAAK,UAAU,MAAM,CACH;;AAGjC,SAAS,mBAAmB,OAAe,SAAsB;AAC/D,QAAO,YAAY,OAAO,KAAK,UAAU,QAAQ,QAAQ,IAAI,GAAG;;AAGlE,SAAS,YAAY,OAAe,MAAsB;AACxD,QAAO,KAAK,SAAS;;AAGvB,SAAgB,kCACd,QACyB;AACzB,QAAO;EACL,MAAM,OAAO;EACb,aAAa,OAAO;EACpB,cAAc,KAAK,MAAM,OAAO,WAAW;EAC5C;;AAGH,SAAgB,iCACd,SACiC;AACjC,KAAI,QAAQ,eAAe,CACzB,KAAI,QAAQ,SAAS,SACnB,QAAO;EACL,MAAM;EACN,SAAS,CACP;GACE,MAAM;GACN,MACE,gDAAgD,QAAQ;GAC3D,CACF;EACF;KAED,QAAO;EACL,MAAM,QAAQ,SAAS,SAAS,SAAS;EACzC,SAAS,CAAC;GAAE,MAAM;GAAQ,MAAM,QAAQ;GAAS,CAAC;EACnD;UAEM,QAAQ,gBAAgB,EAAE;EACnC,IAAI;AACJ,UAAQ,QAAQ,QAAhB;GACE,KAAK;AACH,gBAAY;AACZ;GACF,KAAK;AACH,gBAAY;AACZ;GACF,KAAK;AACH,gBAAY;AACZ;GACF,KAAK;AACH,gBAAY;AACZ;GACF,QACE,OAAM,IAAI,MAAM,6BAA6B,QAAQ,SAAS;;AAGlE,SAAO;GACL,MAAM;GACN,SAAS,CACP;IACE,MAAM;IACN,QAAQ;KACN,MAAM;KACN,YAAY;KACZ,MAAM,QAAQ;KACf;IACF,CACF;GACF;YACQ,QAAQ,0BAA0B,CAC3C,QAAO;EACL,MAAM;EACN,SAAS,CACP;GACE,IAAI,QAAQ;GACZ,MAAM;GACN,OAAO,QAAQ;GACf,MAAM,QAAQ;GACf,CACF;EACF;UACQ,QAAQ,iBAAiB,CAClC,QAAO;EACL,MAAM;EACN,SAAS,CACP;GACE,MAAM;GACN,SAAS,QAAQ,UAAU;GAC3B,aAAa,QAAQ;GACtB,CACF;EACF"}