{"version":3,"file":"ai-usage.mjs","names":["mediaFormatter","formatter"],"sources":["../../../src/libs/formatters/ai-usage.ts"],"sourcesContent":["import type { AiUsage } from \"../../types/response.js\";\nimport { getNumber, getObject } from \"../../utils/helpers/index.js\";\nimport type { Translator } from \"../i18n/types.js\";\nimport formatter from \"./index.js\";\nimport mediaFormatter, { type MediaPosterPropsT } from \"./media.js\";\n\nexport interface AiUsagePropT {\n\tid: number;\n\trequest_id: string;\n\tprovider_request_id: string | null;\n\tfeature_key: string;\n\tfeature_version: string;\n\tuser_id: number | null;\n\ttarget_type: string;\n\ttarget: Record<string, unknown>;\n\tusage: Record<string, unknown> | null;\n\tmodel: string | null;\n\tcost_currency: string | null;\n\tcost_total_minor: number | null;\n\tduration_ms: number | null;\n\tstatus: \"failed\" | \"pending\" | \"success\";\n\terror_message: string | null;\n\tcreated_at: Date | string | null;\n\temail: string | null;\n\tusername: string | null;\n\tfirst_name: string | null;\n\tlast_name: string | null;\n\tprofile_picture?: MediaPosterPropsT[];\n}\n\nconst formatTokens = (\n\tusage: Record<string, unknown> | null,\n): AiUsage[\"tokens\"] => {\n\tconst usageObject = getObject(usage);\n\tconst tokens = getObject(usageObject?.tokens);\n\tconst input = getObject(tokens?.input);\n\tconst output = getObject(tokens?.output);\n\n\tconst inputTotal = getNumber(input?.total);\n\tconst outputTotal = getNumber(output?.total);\n\tconst total = getNumber(tokens?.total);\n\n\tif (inputTotal === null || outputTotal === null || total === null) {\n\t\treturn null;\n\t}\n\n\treturn {\n\t\tinput: inputTotal,\n\t\toutput: outputTotal,\n\t\ttotal,\n\t};\n};\n\nconst formatDurationMs = (usage: AiUsagePropT) => {\n\tif (usage.duration_ms === 0) return null;\n\treturn usage.duration_ms;\n};\n\nexport const formatAiUsageFeatureLabel = (props: {\n\tfeatureKey: string;\n\ttranslate: Translator;\n}) => {\n\tconst fallback = props.featureKey;\n\n\tswitch (props.featureKey) {\n\t\tcase \"custom-field.input.generate\":\n\t\t\treturn props.translate(\n\t\t\t\t\"server:core.ai.usage.features.custom.field.input.generate\",\n\t\t\t\t{\n\t\t\t\t\tdefaultMessage: \"Field Generation\",\n\t\t\t\t},\n\t\t\t);\n\t\tcase \"media.alt.generate\":\n\t\t\treturn props.translate(\n\t\t\t\t\"server:core.ai.usage.features.media.alt.generate\",\n\t\t\t\t{\n\t\t\t\t\tdefaultMessage: \"Alt Text\",\n\t\t\t\t},\n\t\t\t);\n\t\tcase \"media.image.generate\":\n\t\t\treturn props.translate(\n\t\t\t\t\"server:core.ai.usage.features.media.image.generate\",\n\t\t\t\t{\n\t\t\t\t\tdefaultMessage: \"Image Generation\",\n\t\t\t\t},\n\t\t\t);\n\t\tdefault:\n\t\t\treturn fallback;\n\t}\n};\n\nconst formatMultiple = (props: {\n\taiUsage: AiUsagePropT[];\n\thost: string;\n\ttranslate: Translator;\n}): AiUsage[] => {\n\treturn props.aiUsage.map((usage) =>\n\t\tformatSingle({\n\t\t\taiUsage: usage,\n\t\t\thost: props.host,\n\t\t\ttranslate: props.translate,\n\t\t}),\n\t);\n};\n\nconst formatSingle = (props: {\n\taiUsage: AiUsagePropT;\n\thost: string;\n\ttranslate: Translator;\n}): AiUsage => {\n\tconst user =\n\t\tprops.aiUsage.user_id && props.aiUsage.email && props.aiUsage.username\n\t\t\t? {\n\t\t\t\t\tid: props.aiUsage.user_id,\n\t\t\t\t\tusername: props.aiUsage.username,\n\t\t\t\t\temail: props.aiUsage.email,\n\t\t\t\t\tfirstName: props.aiUsage.first_name,\n\t\t\t\t\tlastName: props.aiUsage.last_name,\n\t\t\t\t\tprofilePicture: mediaFormatter.formatProfilePicture({\n\t\t\t\t\t\tposter: props.aiUsage.profile_picture?.[0],\n\t\t\t\t\t\thost: props.host,\n\t\t\t\t\t}),\n\t\t\t\t}\n\t\t\t: null;\n\n\treturn {\n\t\tid: props.aiUsage.id,\n\t\trequestId: props.aiUsage.request_id,\n\t\tproviderRequestId: props.aiUsage.provider_request_id,\n\t\tfeature: {\n\t\t\tkey: props.aiUsage.feature_key,\n\t\t\tlabel: formatAiUsageFeatureLabel({\n\t\t\t\tfeatureKey: props.aiUsage.feature_key,\n\t\t\t\ttranslate: props.translate,\n\t\t\t}),\n\t\t\tversion: props.aiUsage.feature_version,\n\t\t},\n\t\tstatus: props.aiUsage.status,\n\t\tmodel: props.aiUsage.model,\n\t\tcreatedAt: formatter.formatDate(props.aiUsage.created_at),\n\t\tdurationMs: formatDurationMs(props.aiUsage),\n\t\terrorMessage: props.aiUsage.error_message,\n\t\ttokens: formatTokens(props.aiUsage.usage),\n\t\tcost:\n\t\t\tprops.aiUsage.cost_currency && props.aiUsage.cost_total_minor !== null\n\t\t\t\t? {\n\t\t\t\t\t\tcurrency: props.aiUsage.cost_currency,\n\t\t\t\t\t\ttotalCostMinor: props.aiUsage.cost_total_minor,\n\t\t\t\t\t}\n\t\t\t\t: null,\n\t\ttarget: {\n\t\t\ttype: props.aiUsage.target_type,\n\t\t\tdata: getObject(props.aiUsage.target) ?? {},\n\t\t},\n\t\tuser,\n\t};\n};\n\nexport default {\n\tformatMultiple,\n\tformatSingle,\n};\n"],"mappings":"yIA8BA,MAAM,EACL,GACuB,CAEvB,IAAM,EAAS,EADK,EAAU,CACK,CAAC,EAAE,MAAM,EACtC,EAAQ,EAAU,GAAQ,KAAK,EAC/B,EAAS,EAAU,GAAQ,MAAM,EAEjC,EAAa,EAAU,GAAO,KAAK,EACnC,EAAc,EAAU,GAAQ,KAAK,EACrC,EAAQ,EAAU,GAAQ,KAAK,EAMrC,OAJI,IAAe,MAAQ,IAAgB,MAAQ,IAAU,KACrD,KAGD,CACN,MAAO,EACP,OAAQ,EACR,OACD,CACD,EAEM,EAAoB,GACrB,EAAM,cAAgB,EAAU,KAC7B,EAAM,YAGD,EAA6B,GAGpC,CACL,IAAM,EAAW,EAAM,WAEvB,OAAQ,EAAM,WAAd,CACC,IAAK,8BACJ,OAAO,EAAM,UACZ,4DACA,CACC,eAAgB,kBACjB,CACD,EACD,IAAK,qBACJ,OAAO,EAAM,UACZ,mDACA,CACC,eAAgB,UACjB,CACD,EACD,IAAK,uBACJ,OAAO,EAAM,UACZ,qDACA,CACC,eAAgB,kBACjB,CACD,EACD,QACC,OAAO,CACT,CACD,EAEM,EAAkB,GAKhB,EAAM,QAAQ,IAAK,GACzB,EAAa,CACZ,QAAS,EACT,KAAM,EAAM,KACZ,UAAW,EAAM,SAClB,CAAC,CACF,EAGK,EAAgB,GAIP,CACd,IAAM,EACL,EAAM,QAAQ,SAAW,EAAM,QAAQ,OAAS,EAAM,QAAQ,SAC3D,CACA,GAAI,EAAM,QAAQ,QAClB,SAAU,EAAM,QAAQ,SACxB,MAAO,EAAM,QAAQ,MACrB,UAAW,EAAM,QAAQ,WACzB,SAAU,EAAM,QAAQ,UACxB,eAAgBA,EAAe,qBAAqB,CACnD,OAAQ,EAAM,QAAQ,kBAAkB,GACxC,KAAM,EAAM,IACb,CAAC,CACF,EACC,KAEJ,MAAO,CACN,GAAI,EAAM,QAAQ,GAClB,UAAW,EAAM,QAAQ,WACzB,kBAAmB,EAAM,QAAQ,oBACjC,QAAS,CACR,IAAK,EAAM,QAAQ,YACnB,MAAO,EAA0B,CAChC,WAAY,EAAM,QAAQ,YAC1B,UAAW,EAAM,SAClB,CAAC,EACD,QAAS,EAAM,QAAQ,eACxB,EACA,OAAQ,EAAM,QAAQ,OACtB,MAAO,EAAM,QAAQ,MACrB,UAAWC,EAAU,WAAW,EAAM,QAAQ,UAAU,EACxD,WAAY,EAAiB,EAAM,OAAO,EAC1C,aAAc,EAAM,QAAQ,cAC5B,OAAQ,EAAa,EAAM,QAAQ,KAAK,EACxC,KACC,EAAM,QAAQ,eAAiB,EAAM,QAAQ,mBAAqB,KAC/D,CACA,SAAU,EAAM,QAAQ,cACxB,eAAgB,EAAM,QAAQ,gBAC/B,EACC,KACJ,OAAQ,CACP,KAAM,EAAM,QAAQ,YACpB,KAAM,EAAU,EAAM,QAAQ,MAAM,GAAK,CAAC,CAC3C,EACA,MACD,CACD,EAEA,IAAA,EAAe,CACd,iBACA,cACD"}