UNPKG

@mastra/core

Version:

The core foundation of the Mastra framework, providing essential components and interfaces for building AI-powered applications.

809 lines (804 loc) • 24.7 kB
'use strict'; var chunkV3VLOOSW_cjs = require('./chunk-V3VLOOSW.cjs'); var chunkPO3MSOZM_cjs = require('./chunk-PO3MSOZM.cjs'); var chunkTSNDVBUU_cjs = require('./chunk-TSNDVBUU.cjs'); var chunk6TEQIYXV_cjs = require('./chunk-6TEQIYXV.cjs'); var chunk5K6WYRP2_cjs = require('./chunk-5K6WYRP2.cjs'); var chunkTXGTGUX2_cjs = require('./chunk-TXGTGUX2.cjs'); var chunkEBVYYC2Q_cjs = require('./chunk-EBVYYC2Q.cjs'); // src/mastra/hooks.ts function createOnScorerHook(mastra) { return async hookData => { if (!mastra.getStorage()) { return; } const storage = mastra.getStorage(); const entityId = hookData.entity.id; const entityType = hookData.entityType; const scorer = hookData.scorer; let scorerToUse; if (entityType === "AGENT") { const agent = mastra.getAgentById(entityId); const scorers = await agent.getScorers(); scorerToUse = scorers[scorer.id]; } else if (entityType === "WORKFLOW") { const workflow = mastra.getWorkflowById(entityId); const scorers = await workflow.getScorers(); scorerToUse = scorers[scorer.id]; } else { return; } if (!scorerToUse) { throw new chunk5K6WYRP2_cjs.MastraError({ id: "MASTRA_SCORER_NOT_FOUND", domain: "MASTRA" /* MASTRA */, category: "USER" /* USER */, text: `Scorer with ID ${hookData.scorer.id} not found` }); } let input = hookData.input; let output = hookData.output; if (entityType === "AGENT") { input = hookData.input.filter(m => m.role === "user"); } else { output = { object: hookData.output }; } const score = await scorerToUse.scorer.run({ ...hookData, input, output }); const { structuredOutput, ...rest } = hookData; await storage?.saveScore({ ...rest, ...score, entityId, scorerId: hookData.scorer.id, metadata: { structuredOutput: !!structuredOutput } }); }; } // src/mastra/index.ts var _Mastra_decorators, _init; _Mastra_decorators = [chunkPO3MSOZM_cjs.InstrumentClass({ prefix: "mastra", excludeMethods: ["getLogger", "getTelemetry"] })]; exports.Mastra = class Mastra { #vectors; #agents; #logger; #legacy_workflows; #workflows; #tts; #deployer; #serverMiddleware = []; #telemetry; #storage; #memory; #networks; #vnext_networks; #server; #mcpServers; #bundler; #idGenerator; /** * @deprecated use getTelemetry() instead */ get telemetry() { return this.#telemetry; } /** * @deprecated use getStorage() instead */ get storage() { return this.#storage; } /** * @deprecated use getMemory() instead */ get memory() { return this.#memory; } getIdGenerator() { return this.#idGenerator; } /** * Generate a unique identifier using the configured generator or default to crypto.randomUUID() * @returns A unique string ID */ generateId() { if (this.#idGenerator) { const id = this.#idGenerator(); if (!id) { const error = new chunk5K6WYRP2_cjs.MastraError({ id: "MASTRA_ID_GENERATOR_RETURNED_EMPTY_STRING", domain: "MASTRA" /* MASTRA */, category: "USER" /* USER */, text: "ID generator returned an empty string, which is not allowed" }); this.#logger?.trackException(error); throw error; } return id; } return crypto.randomUUID(); } setIdGenerator(idGenerator) { this.#idGenerator = idGenerator; } constructor(config) { if (config?.serverMiddleware) { this.#serverMiddleware = config.serverMiddleware.map(m => ({ handler: m.handler, path: m.path || "/api/*" })); } let logger; if (config?.logger === false) { logger = chunk6TEQIYXV_cjs.noopLogger; } else { if (config?.logger) { logger = config.logger; } else { const levelOnEnv = process.env.NODE_ENV === "production" && process.env.MASTRA_DEV !== "true" ? chunkTXGTGUX2_cjs.LogLevel.WARN : chunkTXGTGUX2_cjs.LogLevel.INFO; logger = new chunkTXGTGUX2_cjs.ConsoleLogger({ name: "Mastra", level: levelOnEnv }); } } this.#logger = logger; this.#idGenerator = config?.idGenerator; let storage = config?.storage; if (storage) { storage = chunkV3VLOOSW_cjs.augmentWithInit(storage); } this.#telemetry = chunkPO3MSOZM_cjs.Telemetry.init(config?.telemetry); if (config?.telemetry?.enabled !== false && typeof globalThis !== "undefined" && globalThis.___MASTRA_TELEMETRY___ !== true) { this.#logger?.warn(`Mastra telemetry is enabled, but the required instrumentation file was not loaded. If you are using Mastra outside of the mastra server environment, see: https://mastra.ai/en/docs/observability/tracing#tracing-outside-mastra-server-environment`, `If you are using a custom instrumentation file or want to disable this warning, set the globalThis.___MASTRA_TELEMETRY___ variable to true in your instrumentation file.`); } if (this.#telemetry && storage) { this.#storage = this.#telemetry.traceClass(storage, { excludeMethods: ["__setTelemetry", "__getTelemetry", "batchTraceInsert", "getTraces", "getEvalsByAgentName"] }); this.#storage.__setTelemetry(this.#telemetry); } else { this.#storage = storage; } if (config?.vectors) { let vectors = {}; Object.entries(config.vectors).forEach(([key, vector]) => { if (this.#telemetry) { vectors[key] = this.#telemetry.traceClass(vector, { excludeMethods: ["__setTelemetry", "__getTelemetry"] }); vectors[key].__setTelemetry(this.#telemetry); } else { vectors[key] = vector; } }); this.#vectors = vectors; } if (config?.networks) { this.#networks = config.networks; } if (config?.vnext_networks) { this.#vnext_networks = config.vnext_networks; } if (config?.mcpServers) { this.#mcpServers = config.mcpServers; Object.entries(this.#mcpServers).forEach(([key, server]) => { server.setId(key); if (this.#telemetry) { server.__setTelemetry(this.#telemetry); } server.__registerMastra(this); server.__setLogger(this.getLogger()); }); } if (config && `memory` in config) { const error = new chunk5K6WYRP2_cjs.MastraError({ id: "MASTRA_CONSTRUCTOR_INVALID_MEMORY_CONFIG", domain: "MASTRA" /* MASTRA */, category: "USER" /* USER */, text: ` Memory should be added to Agents, not to Mastra. Instead of: new Mastra({ memory: new Memory() }) do: new Agent({ memory: new Memory() }) ` }); this.#logger?.trackException(error); throw error; } if (config?.tts) { this.#tts = config.tts; Object.entries(this.#tts).forEach(([key, ttsCl]) => { if (this.#tts?.[key]) { if (this.#telemetry) { this.#tts[key] = this.#telemetry.traceClass(ttsCl, { excludeMethods: ["__setTelemetry", "__getTelemetry"] }); this.#tts[key].__setTelemetry(this.#telemetry); } } }); } const agents = {}; if (config?.agents) { Object.entries(config.agents).forEach(([key, agent]) => { if (agents[key]) { const error = new chunk5K6WYRP2_cjs.MastraError({ id: "MASTRA_AGENT_REGISTRATION_DUPLICATE_ID", domain: "MASTRA" /* MASTRA */, category: "USER" /* USER */, text: `Agent with name ID:${key} already exists`, details: { agentId: key } }); this.#logger?.trackException(error); throw error; } agent.__registerMastra(this); agent.__registerPrimitives({ logger: this.getLogger(), telemetry: this.#telemetry, storage: this.storage, memory: this.memory, agents, tts: this.#tts, vectors: this.#vectors }); agents[key] = agent; }); } this.#agents = agents; this.#networks = {}; this.#vnext_networks = {}; if (config?.networks) { Object.entries(config.networks).forEach(([key, network]) => { network.__registerMastra(this); this.#networks[key] = network; }); } if (config?.vnext_networks) { Object.entries(config.vnext_networks).forEach(([key, network]) => { network.__registerMastra(this); this.#vnext_networks[key] = network; }); } this.#legacy_workflows = {}; if (config?.legacy_workflows) { Object.entries(config.legacy_workflows).forEach(([key, workflow]) => { workflow.__registerMastra(this); workflow.__registerPrimitives({ logger: this.getLogger(), telemetry: this.#telemetry, storage: this.storage, memory: this.memory, agents, tts: this.#tts, vectors: this.#vectors }); this.#legacy_workflows[key] = workflow; const workflowSteps = Object.values(workflow.steps).filter(step => !!step.workflowId && !!step.workflow); if (workflowSteps.length > 0) { workflowSteps.forEach(step => { this.#legacy_workflows[step.workflowId] = step.workflow; }); } }); } this.#workflows = {}; if (config?.workflows) { Object.entries(config.workflows).forEach(([key, workflow]) => { workflow.__registerMastra(this); workflow.__registerPrimitives({ logger: this.getLogger(), telemetry: this.#telemetry, storage: this.storage, memory: this.memory, agents, tts: this.#tts, vectors: this.#vectors }); this.#workflows[key] = workflow; }); } if (config?.server) { this.#server = config.server; } chunkTSNDVBUU_cjs.registerHook("onScorerRun" /* ON_SCORER_RUN */, createOnScorerHook(this)); this.setLogger({ logger }); } getAgent(name) { const agent = this.#agents?.[name]; if (!agent) { const error = new chunk5K6WYRP2_cjs.MastraError({ id: "MASTRA_GET_AGENT_BY_NAME_NOT_FOUND", domain: "MASTRA" /* MASTRA */, category: "USER" /* USER */, text: `Agent with name ${String(name)} not found`, details: { status: 404, agentName: String(name), agents: Object.keys(this.#agents ?? {}).join(", ") } }); this.#logger?.trackException(error); throw error; } return this.#agents[name]; } getAgentById(id) { let agent = Object.values(this.#agents).find(a => a.id === id); if (!agent) { try { agent = this.getAgent(id); } catch {} } if (!agent) { const error = new chunk5K6WYRP2_cjs.MastraError({ id: "MASTRA_GET_AGENT_BY_AGENT_ID_NOT_FOUND", domain: "MASTRA" /* MASTRA */, category: "USER" /* USER */, text: `Agent with id ${String(id)} not found`, details: { status: 404, agentId: String(id), agents: Object.keys(this.#agents ?? {}).join(", ") } }); this.#logger?.trackException(error); throw error; } return agent; } getAgents() { return this.#agents; } getVector(name) { const vector = this.#vectors?.[name]; if (!vector) { const error = new chunk5K6WYRP2_cjs.MastraError({ id: "MASTRA_GET_VECTOR_BY_NAME_NOT_FOUND", domain: "MASTRA" /* MASTRA */, category: "USER" /* USER */, text: `Vector with name ${String(name)} not found`, details: { status: 404, vectorName: String(name), vectors: Object.keys(this.#vectors ?? {}).join(", ") } }); this.#logger?.trackException(error); throw error; } return vector; } getVectors() { return this.#vectors; } getDeployer() { return this.#deployer; } legacy_getWorkflow(id, { serialized } = {}) { const workflow = this.#legacy_workflows?.[id]; if (!workflow) { const error = new chunk5K6WYRP2_cjs.MastraError({ id: "MASTRA_GET_LEGACY_WORKFLOW_BY_ID_NOT_FOUND", domain: "MASTRA" /* MASTRA */, category: "USER" /* USER */, text: `Workflow with ID ${String(id)} not found`, details: { status: 404, workflowId: String(id), workflows: Object.keys(this.#legacy_workflows ?? {}).join(", ") } }); this.#logger?.trackException(error); throw error; } if (serialized) { return { name: workflow.name }; } return workflow; } getWorkflow(id, { serialized } = {}) { const workflow = this.#workflows?.[id]; if (!workflow) { const error = new chunk5K6WYRP2_cjs.MastraError({ id: "MASTRA_GET_WORKFLOW_BY_ID_NOT_FOUND", domain: "MASTRA" /* MASTRA */, category: "USER" /* USER */, text: `Workflow with ID ${String(id)} not found`, details: { status: 404, workflowId: String(id), workflows: Object.keys(this.#workflows ?? {}).join(", ") } }); this.#logger?.trackException(error); throw error; } if (serialized) { return { name: workflow.name }; } return workflow; } getWorkflowById(id) { let workflow = Object.values(this.#workflows).find(a => a.id === id); if (!workflow) { try { workflow = this.getWorkflow(id); } catch {} } if (!workflow) { const error = new chunk5K6WYRP2_cjs.MastraError({ id: "MASTRA_GET_WORKFLOW_BY_ID_NOT_FOUND", domain: "MASTRA" /* MASTRA */, category: "USER" /* USER */, text: `Workflow with id ${String(id)} not found`, details: { status: 404, workflowId: String(id), workflows: Object.keys(this.#workflows ?? {}).join(", ") } }); this.#logger?.trackException(error); throw error; } return workflow; } legacy_getWorkflows(props = {}) { if (props.serialized) { return Object.entries(this.#legacy_workflows).reduce((acc, [k, v]) => { return { ...acc, [k]: { name: v.name } }; }, {}); } return this.#legacy_workflows; } getWorkflows(props = {}) { if (props.serialized) { return Object.entries(this.#workflows).reduce((acc, [k, v]) => { return { ...acc, [k]: { name: v.name } }; }, {}); } return this.#workflows; } setStorage(storage) { this.#storage = chunkV3VLOOSW_cjs.augmentWithInit(storage); } setLogger({ logger }) { this.#logger = logger; if (this.#agents) { Object.keys(this.#agents).forEach(key => { this.#agents?.[key]?.__setLogger(this.#logger); }); } if (this.#memory) { this.#memory.__setLogger(this.#logger); } if (this.#deployer) { this.#deployer.__setLogger(this.#logger); } if (this.#tts) { Object.keys(this.#tts).forEach(key => { this.#tts?.[key]?.__setLogger(this.#logger); }); } if (this.#storage) { this.#storage.__setLogger(this.#logger); } if (this.#vectors) { Object.keys(this.#vectors).forEach(key => { this.#vectors?.[key]?.__setLogger(this.#logger); }); } if (this.#mcpServers) { Object.keys(this.#mcpServers).forEach(key => { this.#mcpServers?.[key]?.__setLogger(this.#logger); }); } } setTelemetry(telemetry) { this.#telemetry = chunkPO3MSOZM_cjs.Telemetry.init(telemetry); if (this.#agents) { Object.keys(this.#agents).forEach(key => { if (this.#telemetry) { this.#agents?.[key]?.__setTelemetry(this.#telemetry); } }); } if (this.#memory) { this.#memory = this.#telemetry.traceClass(this.#memory, { excludeMethods: ["__setTelemetry", "__getTelemetry"] }); this.#memory.__setTelemetry(this.#telemetry); } if (this.#deployer) { this.#deployer = this.#telemetry.traceClass(this.#deployer, { excludeMethods: ["__setTelemetry", "__getTelemetry"] }); this.#deployer.__setTelemetry(this.#telemetry); } if (this.#tts) { let tts = {}; Object.entries(this.#tts).forEach(([key, ttsCl]) => { if (this.#telemetry) { tts[key] = this.#telemetry.traceClass(ttsCl, { excludeMethods: ["__setTelemetry", "__getTelemetry"] }); tts[key].__setTelemetry(this.#telemetry); } }); this.#tts = tts; } if (this.#storage) { this.#storage = this.#telemetry.traceClass(this.#storage, { excludeMethods: ["__setTelemetry", "__getTelemetry"] }); this.#storage.__setTelemetry(this.#telemetry); } if (this.#vectors) { let vectors = {}; Object.entries(this.#vectors).forEach(([key, vector]) => { if (this.#telemetry) { vectors[key] = this.#telemetry.traceClass(vector, { excludeMethods: ["__setTelemetry", "__getTelemetry"] }); vectors[key].__setTelemetry(this.#telemetry); } }); this.#vectors = vectors; } } getTTS() { return this.#tts; } getLogger() { return this.#logger; } getTelemetry() { return this.#telemetry; } getMemory() { return this.#memory; } getStorage() { return this.#storage; } getServerMiddleware() { return this.#serverMiddleware; } setServerMiddleware(serverMiddleware) { if (typeof serverMiddleware === "function") { this.#serverMiddleware = [{ handler: serverMiddleware, path: "/api/*" }]; return; } if (!Array.isArray(serverMiddleware)) { const error = new chunk5K6WYRP2_cjs.MastraError({ id: "MASTRA_SET_SERVER_MIDDLEWARE_INVALID_TYPE", domain: "MASTRA" /* MASTRA */, category: "USER" /* USER */, text: `Invalid middleware: expected a function or array, received ${typeof serverMiddleware}` }); this.#logger?.trackException(error); throw error; } this.#serverMiddleware = serverMiddleware.map(m => { if (typeof m === "function") { return { handler: m, path: "/api/*" }; } return { handler: m.handler, path: m.path || "/api/*" }; }); } getNetworks() { return Object.values(this.#networks || {}); } vnext_getNetworks() { return Object.values(this.#vnext_networks || {}); } getServer() { return this.#server; } getBundlerConfig() { return this.#bundler; } /** * Get a specific network by ID * @param networkId - The ID of the network to retrieve * @returns The network with the specified ID, or undefined if not found */ getNetwork(networkId) { const networks = this.getNetworks(); return networks.find(network => { const routingAgent = network.getRoutingAgent(); return network.formatAgentId(routingAgent.name) === networkId; }); } vnext_getNetwork(networkId) { const networks = this.vnext_getNetworks(); return networks.find(network => network.id === networkId); } async getLogsByRunId({ runId, transportId, fromDate, toDate, logLevel, filters, page, perPage }) { if (!transportId) { const error = new chunk5K6WYRP2_cjs.MastraError({ id: "MASTRA_GET_LOGS_BY_RUN_ID_MISSING_TRANSPORT", domain: "MASTRA" /* MASTRA */, category: "USER" /* USER */, text: "Transport ID is required", details: { runId, transportId } }); this.#logger?.trackException(error); throw error; } if (!this.#logger?.getLogsByRunId) { const error = new chunk5K6WYRP2_cjs.MastraError({ id: "MASTRA_GET_LOGS_BY_RUN_ID_LOGGER_NOT_CONFIGURED", domain: "MASTRA" /* MASTRA */, category: "SYSTEM" /* SYSTEM */, text: "Logger is not configured or does not support getLogsByRunId operation", details: { runId, transportId } }); this.#logger?.trackException(error); throw error; } return await this.#logger.getLogsByRunId({ runId, transportId, fromDate, toDate, logLevel, filters, page, perPage }); } async getLogs(transportId, params) { if (!transportId) { const error = new chunk5K6WYRP2_cjs.MastraError({ id: "MASTRA_GET_LOGS_MISSING_TRANSPORT", domain: "MASTRA" /* MASTRA */, category: "USER" /* USER */, text: "Transport ID is required", details: { transportId } }); this.#logger?.trackException(error); throw error; } if (!this.#logger) { const error = new chunk5K6WYRP2_cjs.MastraError({ id: "MASTRA_GET_LOGS_LOGGER_NOT_CONFIGURED", domain: "MASTRA" /* MASTRA */, category: "SYSTEM" /* SYSTEM */, text: "Logger is not set", details: { transportId } }); throw error; } return await this.#logger.getLogs(transportId, params); } /** * Get all registered MCP server instances. * @returns A record of MCP server ID to MCPServerBase instance, or undefined if none are registered. */ getMCPServers() { return this.#mcpServers; } /** * Get a specific MCP server instance. * If a version is provided, it attempts to find the server with that exact logical ID and version. * If no version is provided, it returns the server with the specified logical ID that has the most recent releaseDate. * The logical ID should match the `id` property of the MCPServer instance (typically set via MCPServerConfig.id). * @param serverId - The logical ID of the MCP server to retrieve. * @param version - Optional specific version of the MCP server to retrieve. * @returns The MCP server instance, or undefined if not found or if the specific version is not found. */ getMCPServer(serverId, version) { if (!this.#mcpServers) { return void 0; } const allRegisteredServers = Object.values(this.#mcpServers || {}); const matchingLogicalIdServers = allRegisteredServers.filter(server => server.id === serverId); if (matchingLogicalIdServers.length === 0) { this.#logger?.debug(`No MCP servers found with logical ID: ${serverId}`); return void 0; } if (version) { const specificVersionServer = matchingLogicalIdServers.find(server => server.version === version); if (!specificVersionServer) { this.#logger?.debug(`MCP server with logical ID '${serverId}' found, but not version '${version}'.`); } return specificVersionServer; } else { if (matchingLogicalIdServers.length === 1) { return matchingLogicalIdServers[0]; } matchingLogicalIdServers.sort((a, b) => { const dateAVal = a.releaseDate && typeof a.releaseDate === "string" ? new Date(a.releaseDate).getTime() : NaN; const dateBVal = b.releaseDate && typeof b.releaseDate === "string" ? new Date(b.releaseDate).getTime() : NaN; if (isNaN(dateAVal) && isNaN(dateBVal)) return 0; if (isNaN(dateAVal)) return 1; if (isNaN(dateBVal)) return -1; return dateBVal - dateAVal; }); if (matchingLogicalIdServers.length > 0) { const latestServer = matchingLogicalIdServers[0]; if (latestServer && latestServer.releaseDate && typeof latestServer.releaseDate === "string" && !isNaN(new Date(latestServer.releaseDate).getTime())) { return latestServer; } } this.#logger?.warn(`Could not determine the latest server for logical ID '${serverId}' due to invalid or missing release dates, or no servers left after filtering.`); return void 0; } } }; exports.Mastra = /*@__PURE__*/(_ => { _init = chunkEBVYYC2Q_cjs.__decoratorStart(null); exports.Mastra = chunkEBVYYC2Q_cjs.__decorateElement(_init, 0, "Mastra", _Mastra_decorators, exports.Mastra); chunkEBVYYC2Q_cjs.__runInitializers(_init, 1, exports.Mastra); return exports.Mastra; })(); //# sourceMappingURL=chunk-VP22CDTX.cjs.map //# sourceMappingURL=chunk-VP22CDTX.cjs.map