UNPKG

lunary

Version:

Lunary is an open-source platform for AI developers.

290 lines (275 loc) 10.4 kB
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; } var _class; var _chunkFDQWQVEPcjs = require('./chunk-FDQWQVEP.cjs'); var _chunkJ2LQ25K6cjs = require('./chunk-J2LQ25K6.cjs'); require('./chunk-ICOI2EVK.cjs'); var _chunkNLT4IVE6cjs = require('./chunk-NLT4IVE6.cjs'); var _chunkEC6JY3PVcjs = require('./chunk-EC6JY3PV.cjs'); // src/langchain.ts var parseRole = /* @__PURE__ */ _chunkEC6JY3PVcjs.__name.call(void 0, (ids) => { const roleHint = ids[ids.length - 1]; if (roleHint.includes("Human")) return "user"; if (roleHint.includes("System")) return "system"; if (roleHint.includes("AI")) return "assistant"; if (roleHint.includes("Function")) return "function"; if (roleHint.includes("Tool")) return "tool"; return "assistant"; }, "parseRole"); var PARAMS_TO_CAPTURE = [ "stop", "stop_sequences", "function_call", "functions", "tools", "tool_choice", "response_format" ]; var convertToLunaryMessages = /* @__PURE__ */ _chunkEC6JY3PVcjs.__name.call(void 0, (input) => { const parseMessage = /* @__PURE__ */ _chunkEC6JY3PVcjs.__name.call(void 0, (raw) => { if (typeof raw === "string") return raw; if ("message" in raw) return parseMessage(raw.message); const message = JSON.parse(JSON.stringify(raw)); try { const role = parseRole(message.id); const obj = message.kwargs; const content = _nullishCoalesce(message.text, () => ( obj.content)); return { role, content, ..._nullishCoalesce(obj.additional_kwargs, () => ( {})) }; } catch (e) { return _nullishCoalesce(message.text, () => ( message)); } }, "parseMessage"); if (Array.isArray(input)) { return input.length === 1 ? convertToLunaryMessages(input[0]) : input.map(convertToLunaryMessages); } return parseMessage(input); }, "convertToLunaryMessages"); var parseInput = /* @__PURE__ */ _chunkEC6JY3PVcjs.__name.call(void 0, (rawInput) => { if (!rawInput) return null; const { input, inputs, question } = rawInput; if (input) return input; if (inputs) return inputs; if (question) return question; return rawInput; }, "parseInput"); var parseOutput = /* @__PURE__ */ _chunkEC6JY3PVcjs.__name.call(void 0, (rawOutput) => { if (!rawOutput) return null; const { text, output, answer, result } = rawOutput; if (text) return text; if (answer) return answer; if (output) return output; if (result) return result; return rawOutput; }, "parseOutput"); var parseExtraAndName = /* @__PURE__ */ _chunkEC6JY3PVcjs.__name.call(void 0, (llm, extraParams, metadata) => { const allParams = { ..._nullishCoalesce(_optionalChain([extraParams, 'optionalAccess', _ => _.invocation_params]), () => ( {})), // @ts-ignore this is a valid property ..._nullishCoalesce(_optionalChain([llm, 'optionalAccess', _2 => _2.kwargs]), () => ( {})), ...metadata || {} }; const { model, model_name, modelName, model_id, userId, userProps, ...rest } = allParams; const name = model || modelName || model_name || model_id || llm.id.at(-1); const params = Object.fromEntries( Object.entries(rest).filter(([key]) => PARAMS_TO_CAPTURE.includes(key)) ); const cleanedMetadata = Object.fromEntries( Object.entries(metadata).filter( ([key]) => !PARAMS_TO_CAPTURE.includes(key) && ![ "model", "model_name", "modelName", "model_id", "userId", "userProps", "tags" ].includes(key) && ["string", "number", "boolean"].includes(typeof metadata[key]) ) ); return { name, params, cleanedMetadata, userId, userProps }; }, "parseExtraAndName"); var LunaryHandler = (_class = class extends _chunkNLT4IVE6cjs.BaseCallbackHandler { static { _chunkEC6JY3PVcjs.__name.call(void 0, this, "LunaryHandler"); } __init() {this.name = "lunary_handler"} constructor(fields = {}) { super(fields);_class.prototype.__init.call(this);; this.lunary = _chunkJ2LQ25K6cjs.src_default; if (fields) { const { appId, apiUrl, publicKey, verbose } = fields; this.lunary.init({ verbose, publicKey: _nullishCoalesce(_nullishCoalesce(_nullishCoalesce(_nullishCoalesce(publicKey, () => ( appId)), () => ( _chunkNLT4IVE6cjs.getEnvironmentVariable.call(void 0, "LUNARY_PUBLIC_KEY"))), () => ( _chunkNLT4IVE6cjs.getEnvironmentVariable.call(void 0, "LUNARY_APP_ID"))), () => ( _chunkNLT4IVE6cjs.getEnvironmentVariable.call(void 0, "LLMONITOR_APP_ID"))), apiUrl: _nullishCoalesce(_nullishCoalesce(apiUrl, () => ( _chunkNLT4IVE6cjs.getEnvironmentVariable.call(void 0, "LUNARY_API_URL"))), () => ( _chunkNLT4IVE6cjs.getEnvironmentVariable.call(void 0, "LLMONITOR_API_URL"))) }); } } async handleLLMStart(llm, prompts, runId, parentRunId, extraParams, tags, metadata) { const { name, params, cleanedMetadata, userId, userProps } = parseExtraAndName(llm, extraParams, metadata); await this.lunary.trackEvent("llm", "start", { runId, parentRunId, name, input: convertToLunaryMessages(prompts), params, metadata: cleanedMetadata, userId, userProps, tags, runtime: "langchain-js" }); } async handleChatModelStart(llm, messages, runId, parentRunId, extraParams, tags, metadata) { const { name, params, cleanedMetadata, userId, userProps } = parseExtraAndName(llm, extraParams, metadata); await this.lunary.trackEvent("llm", "start", { runId, parentRunId, name, input: convertToLunaryMessages(messages), params, metadata: cleanedMetadata, userId, userProps, tags, runtime: "langchain-js" }); } async handleLLMEnd(output, runId) { const { generations, llmOutput } = output; await this.lunary.trackEvent("llm", "end", { runId, output: convertToLunaryMessages(generations), tokensUsage: { completion: _optionalChain([llmOutput, 'optionalAccess', _3 => _3.tokenUsage, 'optionalAccess', _4 => _4.completionTokens]), prompt: _optionalChain([llmOutput, 'optionalAccess', _5 => _5.tokenUsage, 'optionalAccess', _6 => _6.promptTokens]) } }); } async handleLLMError(error, runId) { await this.lunary.trackEvent("llm", "error", { runId, error }); } async handleChainStart(chain, inputs, runId, parentRunId, tags, metadata) { const { agentName, name, userId, userProps, ...rest } = metadata || {}; const actualName = name || agentName || chain.id.at(-1); const runType = agentName || ["AgentExecutor", "PlanAndExecute"].includes(name) ? "agent" : "chain"; await this.lunary.trackEvent(runType, "start", { runId, parentRunId, name: actualName, userId, userProps, input: parseInput(inputs), metadata: rest, tags, runtime: "langchain-js" }); } async handleChainEnd(outputs, runId) { await this.lunary.trackEvent("chain", "end", { runId, output: parseOutput(outputs) }); } async handleChainError(error, runId) { await this.lunary.trackEvent("chain", "error", { runId, error }); } async handleRetrieverStart(retriever, query, runId, parentRunId, tags, metadata, name) { const { userId, userProps, ...rest } = metadata || {}; const retrieverName = name || retriever.id.at(-1); await this.lunary.trackEvent("retriever", "start", { runId, parentRunId, name: retrieverName, userId, userProps, input: query, metadata: rest, tags, runtime: "langchain-js" }); } async handleRetrieverEnd(documents, runId, parentRunId, tags) { const docMetadatas = documents.map((doc, i) => ({ summary: _optionalChain([doc, 'access', _7 => _7.pageContent, 'optionalAccess', _8 => _8.length]) > 400 ? doc.pageContent.slice(0, 400) + "..." : doc.pageContent, ...doc.metadata })); await this.lunary.trackEvent("retriever", "end", { runId, output: docMetadatas, tags }); } async handleToolStart(tool, input, runId, parentRunId, tags, metadata) { const { toolName, userId, userProps, ...rest } = metadata || {}; const name = toolName || tool.id.at(-1); await this.lunary.trackEvent("tool", "start", { runId, parentRunId, name, userId, userProps, input, metadata: rest, tags, runtime: "langchain-js" }); } async handleToolEnd(output, runId) { await this.lunary.trackEvent("tool", "end", { runId, output }); } async handleToolError(error, runId) { await this.lunary.trackEvent("tool", "error", { runId, error }); } }, _class); var replaceDoubleCurlyBraces = /* @__PURE__ */ _chunkEC6JY3PVcjs.__name.call(void 0, (str) => str.replaceAll("{{", "{").replaceAll("}}", "}"), "replaceDoubleCurlyBraces"); async function getLangChainTemplate(slug) { const template = await _chunkJ2LQ25K6cjs.src_default.renderTemplate(slug); if (template.prompt) { const text = replaceDoubleCurlyBraces(template.prompt); const prompt = _chunkNLT4IVE6cjs.PromptTemplate.fromTemplate(text); return prompt; } else { const messages = template.messages.map((message) => { const text = replaceDoubleCurlyBraces(message.content); return [ message.role.replace("user", "human").replace("assistant", "ai"), text ]; }); const prompt = _chunkFDQWQVEPcjs.ChatPromptTemplate.fromMessages(messages); return prompt; } } _chunkEC6JY3PVcjs.__name.call(void 0, getLangChainTemplate, "getLangChainTemplate"); exports.LunaryHandler = LunaryHandler; exports.getLangChainTemplate = getLangChainTemplate;