neatlogs 1.0.6 → 1.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/azure-openai.cjs +344 -0
- package/dist/azure-openai.cjs.map +1 -0
- package/dist/azure-openai.d.ts +30 -0
- package/dist/azure-openai.mjs +318 -0
- package/dist/azure-openai.mjs.map +1 -0
- package/dist/bedrock.cjs +540 -0
- package/dist/bedrock.cjs.map +1 -0
- package/dist/bedrock.d.ts +29 -0
- package/dist/bedrock.mjs +514 -0
- package/dist/bedrock.mjs.map +1 -0
- package/dist/browser.cjs +121 -0
- package/dist/browser.cjs.map +1 -0
- package/dist/browser.d.ts +143 -0
- package/dist/browser.mjs +96 -0
- package/dist/browser.mjs.map +1 -0
- package/dist/claude-agent-sdk.cjs +406 -0
- package/dist/claude-agent-sdk.cjs.map +1 -0
- package/dist/claude-agent-sdk.d.ts +49 -0
- package/dist/claude-agent-sdk.mjs +381 -0
- package/dist/claude-agent-sdk.mjs.map +1 -0
- package/dist/index.cjs +3219 -1129
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +7 -1
- package/dist/index.mjs +3210 -1131
- package/dist/index.mjs.map +1 -1
- package/dist/langchain.cjs +9 -9
- package/dist/langchain.cjs.map +1 -1
- package/dist/langchain.mjs +9 -9
- package/dist/langchain.mjs.map +1 -1
- package/dist/mastra-wrap.cjs +25 -25
- package/dist/mastra-wrap.cjs.map +1 -1
- package/dist/mastra-wrap.mjs +25 -25
- package/dist/mastra-wrap.mjs.map +1 -1
- package/dist/openai-agents.cjs +6 -6
- package/dist/openai-agents.cjs.map +1 -1
- package/dist/openai-agents.mjs +6 -6
- package/dist/openai-agents.mjs.map +1 -1
- package/dist/opencode-plugin.cjs +5879 -0
- package/dist/opencode-plugin.cjs.map +1 -0
- package/dist/opencode-plugin.d.ts +38 -0
- package/dist/opencode-plugin.mjs +5854 -0
- package/dist/opencode-plugin.mjs.map +1 -0
- package/dist/openrouter-agent.cjs +273 -0
- package/dist/openrouter-agent.cjs.map +1 -0
- package/dist/openrouter-agent.d.ts +34 -0
- package/dist/openrouter-agent.mjs +247 -0
- package/dist/openrouter-agent.mjs.map +1 -0
- package/dist/pi-agent.cjs +10 -10
- package/dist/pi-agent.cjs.map +1 -1
- package/dist/pi-agent.mjs +10 -10
- package/dist/pi-agent.mjs.map +1 -1
- package/dist/vertex-ai.cjs +424 -0
- package/dist/vertex-ai.cjs.map +1 -0
- package/dist/vertex-ai.d.ts +39 -0
- package/dist/vertex-ai.mjs +397 -0
- package/dist/vertex-ai.mjs.map +1 -0
- package/package.json +76 -1
package/dist/mastra-wrap.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/mastra-wrap.ts"],"sourcesContent":["/**\n * Neatlogs Mastra wrapper — full nested tracing via method-wrapping.\n *\n * Usage:\n * import { wrapMastra } from 'neatlogs/mastra';\n * import { Agent } from '@mastra/core/agent';\n * const agent = wrapMastra(new Agent({ ... }));\n * const result = await agent.generate('Hello');\n *\n * Philosophy (same as wrapAISDK): we own the capturing layer. Instead of\n * depending on Mastra's internal observability bus or @mastra/observability,\n * we wrap Mastra's own methods and emit OpenTelemetry spans ourselves. Every\n * parent span is opened as the ACTIVE span, so child operations (LLM calls,\n * tool executions, workflow steps) nest automatically.\n *\n * Coverage (duck-typed by the methods present on the entity):\n * - Agent.generate()/stream() → AGENT (parent)\n * ↳ resolved model doGenerate/doStream → LLM (child, per model step)\n * ↳ each tool's execute() → TOOL (child, per tool call)\n * - Workflow.createRun().start()/resume() → WORKFLOW\n * - MastraVector.query() → RETRIEVER\n * - MastraVector.upsert/update/delete() → VECTOR_STORE\n * - MastraMemory.recall/saveMessages/... → CHAIN (memory ops)\n * - MDocument.chunk() → CHAIN\n * - rerank() (standalone fn) → RERANKER\n * - root Mastra (getAgent + getWorkflow) → proxy that wraps what it returns\n */\n\nimport { trace, context as otelContext, SpanStatusCode, type Span } from '@opentelemetry/api';\n\nconst TRACER_NAME = 'neatlogs.mastra';\nconst PATCH_FLAG = '_neatlogs_patched';\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport function wrapMastra<T extends object>(entity: T): T {\n if (!entity || (entity as any)[PATCH_FLAG]) return entity;\n\n const e = entity as any;\n const className = entity.constructor?.name ?? '';\n\n // Root Mastra: wrap the agents/workflows it hands out (it itself has neither\n // generate nor createRun). Detect by the getter pair.\n if (isRootMastra(e)) {\n const proxied = wrapRootMastra(e);\n markPatched(proxied);\n return proxied as T;\n }\n\n if (isAgent(e, className)) {\n patchAgent(e);\n } else if (isWorkflow(e, className)) {\n patchWorkflow(e);\n } else if (isVector(e, className)) {\n patchVector(e);\n } else if (isMemory(e, className)) {\n patchMemory(e);\n } else if (isDocument(e, className)) {\n patchDocument(e);\n }\n\n markPatched(e);\n return entity;\n}\n\n/**\n * Wrap a standalone `rerank()` function (from `@mastra/rag`) so each call emits\n * a RERANKER span. Returns a wrapped function; the original is unchanged.\n *\n * import { rerank } from '@mastra/rag';\n * const tracedRerank = wrapMastraRerank(rerank);\n */\nexport function wrapMastraRerank<F extends (...args: any[]) => any>(rerankFn: F): F {\n return (async function tracedRerank(...args: any[]) {\n return withSpan('mastra.rerank', { 'neatlogs.span.kind': 'RERANKER' }, (span) => {\n // rerank(results, query, model, options)\n const results = args?.[0];\n const query = args?.[1];\n const options = args?.[3];\n if (typeof query === 'string') {\n span.setAttribute('neatlogs.reranker.query', query.slice(0, 10000));\n span.setAttribute('input.value', query.slice(0, 10000));\n }\n if (Array.isArray(results)) span.setAttribute('neatlogs.reranker.input_documents', safeStringify(results).slice(0, 10000));\n if (options?.topK != null) span.setAttribute('neatlogs.reranker.top_k', options.topK);\n return Promise.resolve(rerankFn(...args)).then((result) => {\n span.setAttribute('neatlogs.reranker.output_documents', safeStringify(result).slice(0, 10000));\n span.setAttribute('output.value', safeStringify(result).slice(0, 10000));\n return result;\n });\n });\n }) as unknown as F;\n}\n\n// ---------------------------------------------------------------------------\n// Detection (duck-typed — robust across Mastra versions / build shapes)\n// ---------------------------------------------------------------------------\n\nfunction isRootMastra(e: any): boolean {\n return typeof e.getAgent === 'function' && typeof e.getWorkflow === 'function';\n}\n\nfunction isAgent(e: any, className: string): boolean {\n // An agent exposes generate()/stream(). getLLM()/listTools() are wrapped\n // opportunistically when present (installAgentLlmHook/installAgentToolHooks\n // no-op otherwise), so they are not required for detection.\n return className === 'Agent' || typeof e.generate === 'function' || typeof e.stream === 'function';\n}\n\nfunction isWorkflow(e: any, className: string): boolean {\n return className === 'Workflow' || typeof e.createRun === 'function';\n}\n\nfunction isVector(e: any, className: string): boolean {\n return /Vector/.test(className) || (typeof e.query === 'function' && typeof e.upsert === 'function');\n}\n\nfunction isMemory(e: any, className: string): boolean {\n return /Memory/.test(className) || (typeof e.recall === 'function' && typeof e.saveMessages === 'function');\n}\n\nfunction isDocument(e: any, className: string): boolean {\n return className === 'MDocument' || (typeof e.chunk === 'function' && typeof e.getDocs === 'function');\n}\n\n// ---------------------------------------------------------------------------\n// Agent\n// ---------------------------------------------------------------------------\n\nfunction patchAgent(agent: any): void {\n patchAgentMethod(agent, 'generate', false);\n patchAgentMethod(agent, 'stream', true);\n}\n\n/**\n * Wrap generate()/stream() with an AGENT parent span. Before delegating, also\n * install child-span hooks on this agent's resolved model (LLM) and tools\n * (TOOL) so they nest under the AGENT span. Hooks are installed lazily/once.\n */\nfunction patchAgentMethod(agent: any, method: 'generate' | 'stream', streaming: boolean): void {\n if (typeof agent[method] !== 'function') return;\n const orig = agent[method].bind(agent);\n\n agent[method] = async function tracedAgentMethod(input: any, opts?: any): Promise<any> {\n const agentName = agent.name ?? agent.id ?? 'mastra_agent';\n const model = extractModelId(agent.model);\n\n // Ensure LLM + TOOL child hooks are present (idempotent).\n installAgentLlmHook(agent);\n installAgentToolHooks(agent);\n\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': 'AGENT',\n 'neatlogs.agent.name': agentName,\n 'input.value': toInputValue(input),\n };\n if (model) attrs['neatlogs.llm.model_name'] = model;\n if (agent.instructions && typeof agent.instructions === 'string') {\n attrs['neatlogs.llm.system_prompt'] = agent.instructions.slice(0, 5000);\n }\n if (streaming) attrs['neatlogs.llm.is_streaming'] = true;\n\n if (streaming) {\n // stream() returns immediately; the model only runs when the caller drains\n // the stream. Keep the AGENT span open + active across the whole stream so\n // doStream (LLM) children nest, and finalize when the output completes.\n const tracer = trace.getTracer(TRACER_NAME);\n const span = tracer.startSpan(`mastra.agent.${agentName}`, { attributes: attrs }, otelContext.active());\n const ctx = trace.setSpan(otelContext.active(), span);\n try {\n const result = await otelContext.with(ctx, () => orig(input, opts));\n return wrapStreamingOutput(result, span, ctx);\n } catch (err) {\n recordError(span, err);\n span.end();\n throw err;\n }\n }\n\n return withActiveSpan(`mastra.agent.${agentName}`, attrs, async (span) => {\n const result = await orig(input, opts);\n finalizeAgentResult(span, result);\n return result;\n });\n };\n}\n\n/**\n * Patch agent.getLLM so the model it returns has doGenerate/doStream wrapped\n * (emitting LLM child spans). Mastra calls this.getLLM() inside generate/stream,\n * and the resolved model is the single chokepoint for the real provider call.\n */\nfunction installAgentLlmHook(agent: any): void {\n if (agent.__neatlogs_llm_hook || typeof agent.getLLM !== 'function') return;\n agent.__neatlogs_llm_hook = true;\n\n const origGetLLM = agent.getLLM.bind(agent);\n agent.getLLM = function patchedGetLLM(...args: any[]): any {\n const out = origGetLLM(...args);\n return Promise.resolve(out).then((llm: any) => {\n try {\n const model = typeof llm?.getModel === 'function' ? llm.getModel() : llm;\n patchModelInPlace(model);\n } catch {\n /* best-effort */\n }\n return llm;\n });\n };\n}\n\n/** Wrap a resolved language model's doGenerate/doStream in place (idempotent). */\nfunction patchModelInPlace(model: any): void {\n if (!model || model.__neatlogs_model_patched) return;\n model.__neatlogs_model_patched = true;\n const modelId = model.modelId ?? model.modelName ?? '';\n const provider = model.provider ?? '';\n\n for (const fn of ['doGenerate', 'doStream'] as const) {\n if (typeof model[fn] !== 'function') continue;\n const orig = model[fn].bind(model);\n const isStream = fn === 'doStream';\n\n model[fn] = function tracedModelCall(callOpts: any): any {\n const attrs: Record<string, any> = { 'neatlogs.span.kind': 'LLM' };\n if (modelId) attrs['neatlogs.llm.model_name'] = modelId;\n if (provider) attrs['neatlogs.llm.provider'] = provider;\n if (isStream) attrs['neatlogs.llm.is_streaming'] = true;\n const promptInput = callOpts?.prompt ?? callOpts?.messages;\n if (promptInput !== undefined) attrs['input.value'] = safeStringify(promptInput).slice(0, 10000);\n captureInvocationParams(attrs, callOpts);\n\n return withActiveSpan(`mastra.llm.${modelId || 'model'}.${fn}`, attrs, async (span) => {\n const result = await orig(callOpts);\n if (!isStream) finalizeModelResult(span, result);\n // Streaming doGenerate-style results serialize lazily; record what we can.\n else if (result?.usage) recordUsage(span, result.usage);\n return result;\n });\n };\n }\n}\n\n/** Patch each tool's execute() so tool calls become TOOL child spans. */\nfunction installAgentToolHooks(agent: any): void {\n if (agent.__neatlogs_tool_hook) return;\n let tools: Record<string, any> | undefined;\n try {\n tools = typeof agent.listTools === 'function' ? agent.listTools() : undefined;\n } catch {\n tools = undefined;\n }\n if (!tools || typeof tools !== 'object') return;\n agent.__neatlogs_tool_hook = true;\n\n for (const [key, tool] of Object.entries<any>(tools)) {\n patchToolExecute(tool, key);\n }\n}\n\nfunction patchToolExecute(tool: any, key: string): void {\n if (!tool || typeof tool.execute !== 'function' || tool.__neatlogs_tool_patched) return;\n tool.__neatlogs_tool_patched = true;\n const toolName = tool.id ?? key;\n const orig = tool.execute.bind(tool);\n\n tool.execute = function tracedToolExecute(params: any, options?: any): any {\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': 'TOOL',\n 'neatlogs.tool.name': toolName,\n 'input.value': safeStringify(params).slice(0, 10000),\n };\n if (tool.description) attrs['neatlogs.tool.description'] = String(tool.description).slice(0, 2000);\n\n return withActiveSpan(`mastra.tool.${toolName}`, attrs, async (span) => {\n const result = await orig(params, options);\n span.setAttribute('output.value', safeStringify(result).slice(0, 10000));\n return result;\n });\n };\n}\n\n// ---------------------------------------------------------------------------\n// Workflow\n// ---------------------------------------------------------------------------\n\nfunction patchWorkflow(workflow: any): void {\n if (typeof workflow.createRun !== 'function') return;\n const origCreateRun = workflow.createRun.bind(workflow);\n const workflowName = workflow.name ?? workflow.id ?? 'mastra_workflow';\n\n workflow.createRun = async function tracedCreateRun(...args: any[]): Promise<any> {\n const run = await origCreateRun(...args);\n if (!run) return run;\n patchRunMethod(run, 'start', workflowName);\n patchRunMethod(run, 'resume', workflowName);\n return run;\n };\n}\n\nfunction patchRunMethod(run: any, method: 'start' | 'resume', workflowName: string): void {\n if (typeof run[method] !== 'function') return;\n const orig = run[method].bind(run);\n\n run[method] = async function tracedRunMethod(startOpts: any): Promise<any> {\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': 'WORKFLOW',\n 'neatlogs.workflow.name': workflowName,\n };\n if (startOpts?.inputData !== undefined) {\n attrs['input.value'] = safeStringify(startOpts.inputData).slice(0, 10000);\n }\n\n return withActiveSpan(`mastra.workflow.${workflowName}`, attrs, async (span) => {\n const result = await orig(startOpts);\n if (result?.status) span.setAttribute('neatlogs.metadata', safeStringify({ status: result.status }));\n if (result?.result !== undefined) {\n span.setAttribute('output.value', safeStringify(result.result).slice(0, 10000));\n }\n return result;\n });\n };\n}\n\n// ---------------------------------------------------------------------------\n// Vector store\n// ---------------------------------------------------------------------------\n\nconst VECTOR_READ_OPS = ['query'];\nconst VECTOR_WRITE_OPS = ['upsert', 'updateVector', 'deleteVector', 'createIndex', 'deleteIndex'];\n\nfunction patchVector(vector: any): void {\n for (const op of VECTOR_READ_OPS) patchVectorOp(vector, op, 'RETRIEVER');\n for (const op of VECTOR_WRITE_OPS) patchVectorOp(vector, op, 'VECTOR_STORE');\n}\n\nfunction patchVectorOp(vector: any, op: string, kind: 'RETRIEVER' | 'VECTOR_STORE'): void {\n if (typeof vector[op] !== 'function') return;\n const orig = vector[op].bind(vector);\n const dbName = vector.constructor?.name ?? 'vector';\n\n vector[op] = async function tracedVectorOp(params: any): Promise<any> {\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': kind,\n 'neatlogs.db.system': dbName,\n 'neatlogs.db.operation': op,\n 'input.value': safeStringify(params).slice(0, 10000),\n };\n const indexName = params?.indexName;\n if (indexName) attrs['neatlogs.vectordb.index_name'] = String(indexName);\n if (kind === 'RETRIEVER' && params?.topK != null) attrs['neatlogs.retriever.top_k'] = params.topK;\n return withActiveSpan(`mastra.vector.${op}`, attrs, async (span) => {\n const result = await orig(params);\n span.setAttribute('output.value', safeStringify(result).slice(0, 10000));\n return result;\n });\n };\n}\n\n// ---------------------------------------------------------------------------\n// Memory\n// ---------------------------------------------------------------------------\n\nconst MEMORY_OPS = ['recall', 'saveMessages', 'updateWorkingMemory', 'deleteMessages'];\n\nfunction patchMemory(memory: any): void {\n for (const op of MEMORY_OPS) {\n if (typeof memory[op] !== 'function') continue;\n const orig = memory[op].bind(memory);\n memory[op] = async function tracedMemoryOp(...args: any[]): Promise<any> {\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': 'CHAIN',\n 'neatlogs.db.operation': op,\n 'input.value': safeStringify(args?.[0]).slice(0, 10000),\n };\n return withActiveSpan(`mastra.memory.${op}`, attrs, async (span) => {\n const result = await orig(...args);\n span.setAttribute('output.value', safeStringify(result).slice(0, 8000));\n return result;\n });\n };\n }\n}\n\n// ---------------------------------------------------------------------------\n// MDocument\n// ---------------------------------------------------------------------------\n\nfunction patchDocument(doc: any): void {\n if (typeof doc.chunk !== 'function') return;\n const orig = doc.chunk.bind(doc);\n doc.chunk = async function tracedChunk(...args: any[]): Promise<any> {\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': 'CHAIN',\n 'neatlogs.db.operation': 'chunk',\n };\n return withActiveSpan('mastra.document.chunk', attrs, async (span) => {\n const result = await orig(...args);\n if (Array.isArray(result)) span.setAttribute('neatlogs.db.documents_count', result.length);\n return result;\n });\n };\n}\n\n// ---------------------------------------------------------------------------\n// Root Mastra proxy\n// ---------------------------------------------------------------------------\n\nfunction wrapRootMastra(mastra: any): any {\n const AGENT_GETTERS = new Set(['getAgent', 'getAgentById']);\n const WORKFLOW_GETTERS = new Set(['getWorkflow', 'getWorkflowById']);\n\n return new Proxy(mastra, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n if (typeof value !== 'function') return value;\n const name = String(prop);\n\n if (AGENT_GETTERS.has(name) || WORKFLOW_GETTERS.has(name)) {\n return (...args: any[]) => {\n const entity = value.apply(target, args);\n return entity && typeof entity === 'object' ? wrapMastra(entity) : entity;\n };\n }\n return value.bind(target);\n },\n });\n}\n\n// ---------------------------------------------------------------------------\n// Streaming output wrapping\n// ---------------------------------------------------------------------------\n\n/**\n * Finalize the AGENT span for a streaming result.\n *\n * Mastra's `stream()` returns a `MastraModelOutput` (NOT a plain async-iterable):\n * the model only runs when the caller drains `.textStream`/`.fullStream` or\n * awaits `.text`. We therefore:\n * 1. Re-establish the AGENT span's context around stream consumption so the\n * model's `doStream` (LLM) child nests under it.\n * 2. Tap the `.text`/`.usage`/`.finishReason` promises — which resolve when the\n * stream completes regardless of how the caller consumes — to record output\n * and end the span exactly once.\n * Falls back to legacy async-iterable / thenable shapes for older Mastra.\n */\nfunction wrapStreamingOutput(output: any, span: Span, ctx: ReturnType<typeof otelContext.active>): any {\n if (!output) {\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n return output;\n }\n\n let ended = false;\n const endOnce = (err?: unknown) => {\n if (ended) return;\n ended = true;\n if (err) recordError(span, err);\n else span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n };\n\n // MastraModelOutput: has awaitable .text (thenable). Tap completion promises.\n if (output.text && typeof output.text.then === 'function') {\n const finalize = async () => {\n try {\n const [text, usage, finishReason] = await Promise.all([\n Promise.resolve(output.text).catch(() => undefined),\n Promise.resolve(output.usage).catch(() => undefined),\n Promise.resolve(output.finishReason).catch(() => undefined),\n ]);\n if (typeof text === 'string' && text) {\n span.setAttribute('neatlogs.llm.output_messages.0.role', 'assistant');\n span.setAttribute('neatlogs.llm.output_messages.0.content', text.slice(0, 10000));\n }\n if (usage) recordUsage(span, usage);\n if (finishReason) span.setAttribute('neatlogs.llm.stop_reason', normalizeFinishReason(finishReason));\n endOnce();\n } catch (err) {\n endOnce(err);\n }\n };\n // Drive finalization without requiring the caller to consume; the promises\n // resolve when Mastra finishes the stream internally.\n void finalize();\n\n // Re-establish span context around stream getters so doStream children nest.\n return rebindStreamContext(output, ctx);\n }\n\n // Legacy async-iterable\n if (output[Symbol.asyncIterator]) {\n const origIterator = output[Symbol.asyncIterator].bind(output);\n const textParts: string[] = [];\n const wrapped = Object.create(Object.getPrototypeOf(output));\n Object.assign(wrapped, output);\n wrapped[Symbol.asyncIterator] = function () {\n const iterator = origIterator();\n const finish = () => {\n if (textParts.length) {\n span.setAttribute('neatlogs.llm.output_messages.0.role', 'assistant');\n span.setAttribute('neatlogs.llm.output_messages.0.content', textParts.join('').slice(0, 10000));\n }\n endOnce();\n };\n return {\n async next(): Promise<IteratorResult<any>> {\n try {\n const r = await iterator.next();\n if (r.done) { finish(); return r; }\n const chunk = r.value;\n if (typeof chunk === 'string') textParts.push(chunk);\n else if (chunk?.text) textParts.push(chunk.text);\n else if (chunk?.delta) textParts.push(chunk.delta);\n return r;\n } catch (err) { endOnce(err); throw err; }\n },\n async return(value?: any): Promise<IteratorResult<any>> {\n finish();\n return iterator.return?.(value) ?? { done: true, value: undefined };\n },\n async throw(err?: any): Promise<IteratorResult<any>> {\n endOnce(err);\n return iterator.throw?.(err) ?? { done: true, value: undefined };\n },\n };\n };\n return wrapped;\n }\n\n // Thenable (awaited result)\n if (typeof output.then === 'function') {\n return output\n .then((resolved: any) => { finalizeAgentResult(span, resolved); endOnce(); return resolved; })\n .catch((err: any) => { endOnce(err); throw err; });\n }\n\n endOnce();\n return output;\n}\n\n/**\n * Wrap the async-iterable getters on a MastraModelOutput so that draining the\n * stream runs inside the AGENT span's context (lets the model's doStream child\n * span attach to the right parent). Returns a proxy; non-stream props pass through.\n */\nfunction rebindStreamContext(output: any, ctx: ReturnType<typeof otelContext.active>): any {\n const STREAM_PROPS = new Set(['textStream', 'fullStream', 'objectStream', 'elementStream']);\n return new Proxy(output, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n if (typeof prop === 'string' && STREAM_PROPS.has(prop) && value && value[Symbol.asyncIterator]) {\n const origIterator = value[Symbol.asyncIterator].bind(value);\n return {\n [Symbol.asyncIterator]() {\n return otelContext.with(ctx, () => origIterator());\n },\n };\n }\n if (typeof value === 'function') return value.bind(target);\n return value;\n },\n });\n}\n\n// ---------------------------------------------------------------------------\n// Result finalization\n// ---------------------------------------------------------------------------\n\nfunction finalizeAgentResult(span: Span, result: any): void {\n if (!result) return;\n\n if (result.text) {\n span.setAttribute('neatlogs.llm.output_messages.0.role', 'assistant');\n span.setAttribute('neatlogs.llm.output_messages.0.content', String(result.text).slice(0, 10000));\n }\n\n if (Array.isArray(result.toolCalls)) {\n for (let i = 0; i < result.toolCalls.length; i++) {\n const tc = result.toolCalls[i];\n const p = tc.payload ?? tc;\n setToolCall(span, i, p.toolName ?? p.name, p.args ?? p.arguments, p.toolCallId ?? p.id);\n }\n }\n\n if (result.usage) recordUsage(span, result.usage);\n if (result.finishReason) span.setAttribute('neatlogs.llm.stop_reason', normalizeFinishReason(result.finishReason));\n if (result.model) span.setAttribute('neatlogs.llm.model_name', result.model);\n}\n\nfunction finalizeModelResult(span: Span, result: any): void {\n if (!result) return;\n // AI SDK v5 doGenerate result: { content[], finishReason, usage, ... }.\n // `content` is an array of typed parts (text / tool-call); `text` may be absent.\n if (typeof result.text === 'string' && result.text) {\n span.setAttribute('neatlogs.llm.output_messages.0.role', 'assistant');\n span.setAttribute('neatlogs.llm.output_messages.0.content', result.text.slice(0, 10000));\n } else if (Array.isArray(result.content)) {\n const text = result.content\n .filter((p: any) => p?.type === 'text' && typeof p.text === 'string')\n .map((p: any) => p.text)\n .join('');\n if (text) {\n span.setAttribute('neatlogs.llm.output_messages.0.role', 'assistant');\n span.setAttribute('neatlogs.llm.output_messages.0.content', text.slice(0, 10000));\n }\n // Tool-call parts → indexed tool_calls\n const toolCalls = result.content.filter((p: any) => p?.type === 'tool-call');\n for (let i = 0; i < toolCalls.length; i++) {\n const tc = toolCalls[i];\n setToolCall(span, i, tc.toolName, tc.input ?? tc.args, tc.toolCallId);\n }\n span.setAttribute('output.value', safeStringify(result.content).slice(0, 10000));\n }\n if (result.usage) recordUsage(span, result.usage);\n span.setAttribute('neatlogs.llm.stop_reason', normalizeFinishReason(result.finishReason));\n}\n\nfunction normalizeFinishReason(fr: any): string {\n if (fr == null) return '';\n if (typeof fr === 'string') return fr;\n // AI SDK v5 raw model returns { unified: 'tool-calls', ... }\n return String(fr.unified ?? fr.reason ?? fr.type ?? safeStringify(fr));\n}\n\n/** Read a possibly-nested token count: 42, or { total: 42 }. */\nfunction tokenValue(v: any): number | undefined {\n if (v == null) return undefined;\n if (typeof v === 'number') return v;\n if (typeof v === 'object' && typeof v.total === 'number') return v.total;\n const n = Number(v);\n return Number.isFinite(n) ? n : undefined;\n}\n\n/**\n * Capture LLM sampling/invocation parameters from the model call options onto\n * the span, using only canonical neatlogs.* keys. Present-only — absent params\n * are skipped. Mirrors AI SDK LanguageModelV2CallOptions field names.\n */\nfunction captureInvocationParams(attrs: Record<string, any>, callOpts: any): void {\n if (!callOpts) return;\n const map: Array<[string, string]> = [\n ['temperature', 'neatlogs.llm.temperature'],\n ['maxOutputTokens', 'neatlogs.llm.max_tokens'],\n ['maxTokens', 'neatlogs.llm.max_tokens'],\n ['topP', 'neatlogs.llm.top_p'],\n ['topK', 'neatlogs.llm.top_k'],\n ['frequencyPenalty', 'neatlogs.llm.frequency_penalty'],\n ['presencePenalty', 'neatlogs.llm.presence_penalty'],\n ];\n const invocation: Record<string, any> = {};\n for (const [src, target] of map) {\n const v = callOpts[src];\n if (v != null) {\n attrs[target] = v;\n invocation[src] = v;\n }\n }\n if (Array.isArray(callOpts.stopSequences) && callOpts.stopSequences.length) {\n attrs['neatlogs.llm.stop_sequences'] = safeStringify(callOpts.stopSequences);\n invocation.stopSequences = callOpts.stopSequences;\n }\n // Tool definitions advertised to the model → neatlogs.llm.tools.{i}\n if (Array.isArray(callOpts.tools)) {\n for (let i = 0; i < callOpts.tools.length; i++) {\n attrs[`neatlogs.llm.tools.${i}`] = safeStringify(callOpts.tools[i]).slice(0, 4000);\n }\n invocation.toolChoice = callOpts.toolChoice;\n }\n if (Object.keys(invocation).length) {\n attrs['neatlogs.llm.invocation_parameters'] = safeStringify(invocation).slice(0, 4000);\n }\n}\n\n/**\n * Emit an indexed tool call directly in the neatlogs target namespace\n * `neatlogs.llm.tool_calls.{i}.{id,name,arguments}` — matching how the validated\n * openai/anthropic wrappers (src/openai.ts) emit them. The backend's\n * tool_calls.{i} target is an indexed object with these sub-fields.\n */\nfunction setToolCall(span: Span, i: number, name: any, args: any, id: any): void {\n span.setAttribute(`neatlogs.llm.tool_calls.${i}.name`, name ?? '');\n span.setAttribute(`neatlogs.llm.tool_calls.${i}.arguments`, safeStringify(args ?? {}));\n if (id) span.setAttribute(`neatlogs.llm.tool_calls.${i}.id`, id);\n}\n\nfunction recordUsage(span: Span, usage: any): void {\n if (!usage) return;\n // Shapes seen:\n // - AISDK v5 raw model: { inputTokens: {total}, outputTokens: {total} }\n // - Mastra result: { inputTokens, outputTokens, totalTokens }\n // - AISDK v3: { promptTokens, completionTokens, totalTokens }\n const prompt = tokenValue(usage.promptTokens ?? usage.inputTokens ?? usage.input_tokens);\n const completion = tokenValue(usage.completionTokens ?? usage.outputTokens ?? usage.output_tokens);\n const total = tokenValue(usage.totalTokens);\n if (prompt != null) span.setAttribute('neatlogs.llm.token_count.prompt', prompt);\n if (completion != null) span.setAttribute('neatlogs.llm.token_count.completion', completion);\n if (total != null) span.setAttribute('neatlogs.llm.token_count.total', total);\n else if (prompt != null && completion != null) {\n span.setAttribute('neatlogs.llm.token_count.total', prompt + completion);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Span helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Open a span as the ACTIVE span for the duration of `fn`, so any spans created\n * inside `fn` (model calls, tool executions, workflow steps) nest under it.\n */\nfunction withActiveSpan<T>(name: string, attrs: Record<string, any>, fn: (span: Span) => Promise<T>): Promise<T> {\n const tracer = trace.getTracer(TRACER_NAME);\n const span = tracer.startSpan(name, { attributes: attrs }, otelContext.active());\n const ctx = trace.setSpan(otelContext.active(), span);\n return otelContext.with(ctx, async () => {\n try {\n const result = await fn(span);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (err) {\n recordError(span, err);\n throw err;\n } finally {\n // Stream wrappers end the span themselves once the stream drains; guard\n // against double-end via the OTel SDK (ending twice is a no-op there).\n span.end();\n }\n });\n}\n\n/** Like withActiveSpan but for non-async-context-sensitive leaf operations. */\nfunction withSpan<T>(name: string, attrs: Record<string, any>, fn: (span: Span) => Promise<T> | T): Promise<T> {\n const tracer = trace.getTracer(TRACER_NAME);\n const span = tracer.startSpan(name, { attributes: attrs }, otelContext.active());\n return Promise.resolve()\n .then(() => fn(span))\n .then((result) => {\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n return result;\n })\n .catch((err) => {\n recordError(span, err);\n span.end();\n throw err;\n });\n}\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\nfunction markPatched(e: any): void {\n try {\n Object.defineProperty(e, PATCH_FLAG, { value: true, enumerable: false, configurable: true });\n } catch {\n e[PATCH_FLAG] = true;\n }\n}\n\nfunction extractModelId(model: any): string {\n if (!model) return '';\n if (typeof model === 'string') return model;\n return model.modelId ?? model.name ?? '';\n}\n\nfunction toInputValue(input: any): string {\n return (typeof input === 'string' ? input : safeStringify(input)).slice(0, 10000);\n}\n\nfunction safeStringify(value: unknown): string {\n if (typeof value === 'string') return value;\n try {\n return JSON.stringify(value) ?? '';\n } catch {\n return '';\n }\n}\n\nfunction recordError(span: Span, err: unknown): void {\n if (err instanceof Error) {\n span.setStatus({ code: SpanStatusCode.ERROR, message: err.message });\n span.recordException(err);\n } else {\n span.setStatus({ code: SpanStatusCode.ERROR, message: String(err) });\n }\n}\n"],"mappings":"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","names":["otelContext"]}
|
|
1
|
+
{"version":3,"sources":["../src/mastra-wrap.ts"],"sourcesContent":["/**\n * Neatlogs Mastra wrapper — full nested tracing via method-wrapping.\n *\n * Usage:\n * import { wrapMastra } from 'neatlogs/mastra';\n * import { Agent } from '@mastra/core/agent';\n * const agent = wrapMastra(new Agent({ ... }));\n * const result = await agent.generate('Hello');\n *\n * Philosophy (same as wrapAISDK): we own the capturing layer. Instead of\n * depending on Mastra's internal observability bus or @mastra/observability,\n * we wrap Mastra's own methods and emit OpenTelemetry spans ourselves. Every\n * parent span is opened as the ACTIVE span, so child operations (LLM calls,\n * tool executions, workflow steps) nest automatically.\n *\n * Coverage (duck-typed by the methods present on the entity):\n * - Agent.generate()/stream() → AGENT (parent)\n * ↳ resolved model doGenerate/doStream → LLM (child, per model step)\n * ↳ each tool's execute() → TOOL (child, per tool call)\n * - Workflow.createRun().start()/resume() → WORKFLOW\n * - MastraVector.query() → RETRIEVER\n * - MastraVector.upsert/update/delete() → VECTOR_STORE\n * - MastraMemory.recall/saveMessages/... → CHAIN (memory ops)\n * - MDocument.chunk() → CHAIN\n * - rerank() (standalone fn) → RERANKER\n * - root Mastra (getAgent + getWorkflow) → proxy that wraps what it returns\n */\n\nimport { trace, context as otelContext, SpanStatusCode, type Span } from '@opentelemetry/api';\n\nconst TRACER_NAME = 'neatlogs.mastra';\nconst PATCH_FLAG = '_neatlogs_patched';\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport function wrapMastra<T extends object>(entity: T): T {\n if (!entity || (entity as any)[PATCH_FLAG]) return entity;\n\n const e = entity as any;\n const className = entity.constructor?.name ?? '';\n\n // Root Mastra: wrap the agents/workflows it hands out (it itself has neither\n // generate nor createRun). Detect by the getter pair.\n if (isRootMastra(e)) {\n const proxied = wrapRootMastra(e);\n markPatched(proxied);\n return proxied as T;\n }\n\n if (isAgent(e, className)) {\n patchAgent(e);\n } else if (isWorkflow(e, className)) {\n patchWorkflow(e);\n } else if (isVector(e, className)) {\n patchVector(e);\n } else if (isMemory(e, className)) {\n patchMemory(e);\n } else if (isDocument(e, className)) {\n patchDocument(e);\n }\n\n markPatched(e);\n return entity;\n}\n\n/**\n * Wrap a standalone `rerank()` function (from `@mastra/rag`) so each call emits\n * a RERANKER span. Returns a wrapped function; the original is unchanged.\n *\n * import { rerank } from '@mastra/rag';\n * const tracedRerank = wrapMastraRerank(rerank);\n */\nexport function wrapMastraRerank<F extends (...args: any[]) => any>(rerankFn: F): F {\n return (async function tracedRerank(...args: any[]) {\n return withSpan('mastra.rerank', { 'neatlogs.span.kind': 'RERANKER' }, (span) => {\n // rerank(results, query, model, options)\n const results = args?.[0];\n const query = args?.[1];\n const options = args?.[3];\n if (typeof query === 'string') {\n span.setAttribute('neatlogs.reranker.query', query);\n span.setAttribute('input.value', query);\n }\n if (Array.isArray(results)) span.setAttribute('neatlogs.reranker.input_documents', safeStringify(results));\n if (options?.topK != null) span.setAttribute('neatlogs.reranker.top_k', options.topK);\n return Promise.resolve(rerankFn(...args)).then((result) => {\n span.setAttribute('neatlogs.reranker.output_documents', safeStringify(result));\n span.setAttribute('output.value', safeStringify(result));\n return result;\n });\n });\n }) as unknown as F;\n}\n\n// ---------------------------------------------------------------------------\n// Detection (duck-typed — robust across Mastra versions / build shapes)\n// ---------------------------------------------------------------------------\n\nfunction isRootMastra(e: any): boolean {\n return typeof e.getAgent === 'function' && typeof e.getWorkflow === 'function';\n}\n\nfunction isAgent(e: any, className: string): boolean {\n // An agent exposes generate()/stream(). getLLM()/listTools() are wrapped\n // opportunistically when present (installAgentLlmHook/installAgentToolHooks\n // no-op otherwise), so they are not required for detection.\n return className === 'Agent' || typeof e.generate === 'function' || typeof e.stream === 'function';\n}\n\nfunction isWorkflow(e: any, className: string): boolean {\n return className === 'Workflow' || typeof e.createRun === 'function';\n}\n\nfunction isVector(e: any, className: string): boolean {\n return /Vector/.test(className) || (typeof e.query === 'function' && typeof e.upsert === 'function');\n}\n\nfunction isMemory(e: any, className: string): boolean {\n return /Memory/.test(className) || (typeof e.recall === 'function' && typeof e.saveMessages === 'function');\n}\n\nfunction isDocument(e: any, className: string): boolean {\n return className === 'MDocument' || (typeof e.chunk === 'function' && typeof e.getDocs === 'function');\n}\n\n// ---------------------------------------------------------------------------\n// Agent\n// ---------------------------------------------------------------------------\n\nfunction patchAgent(agent: any): void {\n patchAgentMethod(agent, 'generate', false);\n patchAgentMethod(agent, 'stream', true);\n}\n\n/**\n * Wrap generate()/stream() with an AGENT parent span. Before delegating, also\n * install child-span hooks on this agent's resolved model (LLM) and tools\n * (TOOL) so they nest under the AGENT span. Hooks are installed lazily/once.\n */\nfunction patchAgentMethod(agent: any, method: 'generate' | 'stream', streaming: boolean): void {\n if (typeof agent[method] !== 'function') return;\n const orig = agent[method].bind(agent);\n\n agent[method] = async function tracedAgentMethod(input: any, opts?: any): Promise<any> {\n const agentName = agent.name ?? agent.id ?? 'mastra_agent';\n const model = extractModelId(agent.model);\n\n // Ensure LLM + TOOL child hooks are present (idempotent).\n installAgentLlmHook(agent);\n installAgentToolHooks(agent);\n\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': 'AGENT',\n 'neatlogs.agent.name': agentName,\n 'input.value': toInputValue(input),\n };\n if (model) attrs['neatlogs.llm.model_name'] = model;\n if (agent.instructions && typeof agent.instructions === 'string') {\n attrs['neatlogs.llm.system_prompt'] = agent.instructions;\n }\n if (streaming) attrs['neatlogs.llm.is_streaming'] = true;\n\n if (streaming) {\n // stream() returns immediately; the model only runs when the caller drains\n // the stream. Keep the AGENT span open + active across the whole stream so\n // doStream (LLM) children nest, and finalize when the output completes.\n const tracer = trace.getTracer(TRACER_NAME);\n const span = tracer.startSpan(`mastra.agent.${agentName}`, { attributes: attrs }, otelContext.active());\n const ctx = trace.setSpan(otelContext.active(), span);\n try {\n const result = await otelContext.with(ctx, () => orig(input, opts));\n return wrapStreamingOutput(result, span, ctx);\n } catch (err) {\n recordError(span, err);\n span.end();\n throw err;\n }\n }\n\n return withActiveSpan(`mastra.agent.${agentName}`, attrs, async (span) => {\n const result = await orig(input, opts);\n finalizeAgentResult(span, result);\n return result;\n });\n };\n}\n\n/**\n * Patch agent.getLLM so the model it returns has doGenerate/doStream wrapped\n * (emitting LLM child spans). Mastra calls this.getLLM() inside generate/stream,\n * and the resolved model is the single chokepoint for the real provider call.\n */\nfunction installAgentLlmHook(agent: any): void {\n if (agent.__neatlogs_llm_hook || typeof agent.getLLM !== 'function') return;\n agent.__neatlogs_llm_hook = true;\n\n const origGetLLM = agent.getLLM.bind(agent);\n agent.getLLM = function patchedGetLLM(...args: any[]): any {\n const out = origGetLLM(...args);\n return Promise.resolve(out).then((llm: any) => {\n try {\n const model = typeof llm?.getModel === 'function' ? llm.getModel() : llm;\n patchModelInPlace(model);\n } catch {\n /* best-effort */\n }\n return llm;\n });\n };\n}\n\n/** Wrap a resolved language model's doGenerate/doStream in place (idempotent). */\nfunction patchModelInPlace(model: any): void {\n if (!model || model.__neatlogs_model_patched) return;\n model.__neatlogs_model_patched = true;\n const modelId = model.modelId ?? model.modelName ?? '';\n const provider = model.provider ?? '';\n\n for (const fn of ['doGenerate', 'doStream'] as const) {\n if (typeof model[fn] !== 'function') continue;\n const orig = model[fn].bind(model);\n const isStream = fn === 'doStream';\n\n model[fn] = function tracedModelCall(callOpts: any): any {\n const attrs: Record<string, any> = { 'neatlogs.span.kind': 'LLM' };\n if (modelId) attrs['neatlogs.llm.model_name'] = modelId;\n if (provider) attrs['neatlogs.llm.provider'] = provider;\n if (isStream) attrs['neatlogs.llm.is_streaming'] = true;\n const promptInput = callOpts?.prompt ?? callOpts?.messages;\n if (promptInput !== undefined) attrs['input.value'] = safeStringify(promptInput);\n captureInvocationParams(attrs, callOpts);\n\n return withActiveSpan(`mastra.llm.${modelId || 'model'}.${fn}`, attrs, async (span) => {\n const result = await orig(callOpts);\n if (!isStream) finalizeModelResult(span, result);\n // Streaming doGenerate-style results serialize lazily; record what we can.\n else if (result?.usage) recordUsage(span, result.usage);\n return result;\n });\n };\n }\n}\n\n/** Patch each tool's execute() so tool calls become TOOL child spans. */\nfunction installAgentToolHooks(agent: any): void {\n if (agent.__neatlogs_tool_hook) return;\n let tools: Record<string, any> | undefined;\n try {\n tools = typeof agent.listTools === 'function' ? agent.listTools() : undefined;\n } catch {\n tools = undefined;\n }\n if (!tools || typeof tools !== 'object') return;\n agent.__neatlogs_tool_hook = true;\n\n for (const [key, tool] of Object.entries<any>(tools)) {\n patchToolExecute(tool, key);\n }\n}\n\nfunction patchToolExecute(tool: any, key: string): void {\n if (!tool || typeof tool.execute !== 'function' || tool.__neatlogs_tool_patched) return;\n tool.__neatlogs_tool_patched = true;\n const toolName = tool.id ?? key;\n const orig = tool.execute.bind(tool);\n\n tool.execute = function tracedToolExecute(params: any, options?: any): any {\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': 'TOOL',\n 'neatlogs.tool.name': toolName,\n 'input.value': safeStringify(params),\n };\n if (tool.description) attrs['neatlogs.tool.description'] = String(tool.description);\n\n return withActiveSpan(`mastra.tool.${toolName}`, attrs, async (span) => {\n const result = await orig(params, options);\n span.setAttribute('output.value', safeStringify(result));\n return result;\n });\n };\n}\n\n// ---------------------------------------------------------------------------\n// Workflow\n// ---------------------------------------------------------------------------\n\nfunction patchWorkflow(workflow: any): void {\n if (typeof workflow.createRun !== 'function') return;\n const origCreateRun = workflow.createRun.bind(workflow);\n const workflowName = workflow.name ?? workflow.id ?? 'mastra_workflow';\n\n workflow.createRun = async function tracedCreateRun(...args: any[]): Promise<any> {\n const run = await origCreateRun(...args);\n if (!run) return run;\n patchRunMethod(run, 'start', workflowName);\n patchRunMethod(run, 'resume', workflowName);\n return run;\n };\n}\n\nfunction patchRunMethod(run: any, method: 'start' | 'resume', workflowName: string): void {\n if (typeof run[method] !== 'function') return;\n const orig = run[method].bind(run);\n\n run[method] = async function tracedRunMethod(startOpts: any): Promise<any> {\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': 'WORKFLOW',\n 'neatlogs.workflow.name': workflowName,\n };\n if (startOpts?.inputData !== undefined) {\n attrs['input.value'] = safeStringify(startOpts.inputData);\n }\n\n return withActiveSpan(`mastra.workflow.${workflowName}`, attrs, async (span) => {\n const result = await orig(startOpts);\n if (result?.status) span.setAttribute('neatlogs.metadata', safeStringify({ status: result.status }));\n if (result?.result !== undefined) {\n span.setAttribute('output.value', safeStringify(result.result));\n }\n return result;\n });\n };\n}\n\n// ---------------------------------------------------------------------------\n// Vector store\n// ---------------------------------------------------------------------------\n\nconst VECTOR_READ_OPS = ['query'];\nconst VECTOR_WRITE_OPS = ['upsert', 'updateVector', 'deleteVector', 'createIndex', 'deleteIndex'];\n\nfunction patchVector(vector: any): void {\n for (const op of VECTOR_READ_OPS) patchVectorOp(vector, op, 'RETRIEVER');\n for (const op of VECTOR_WRITE_OPS) patchVectorOp(vector, op, 'VECTOR_STORE');\n}\n\nfunction patchVectorOp(vector: any, op: string, kind: 'RETRIEVER' | 'VECTOR_STORE'): void {\n if (typeof vector[op] !== 'function') return;\n const orig = vector[op].bind(vector);\n const dbName = vector.constructor?.name ?? 'vector';\n\n vector[op] = async function tracedVectorOp(params: any): Promise<any> {\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': kind,\n 'neatlogs.db.system': dbName,\n 'neatlogs.db.operation': op,\n 'input.value': safeStringify(params),\n };\n const indexName = params?.indexName;\n if (indexName) attrs['neatlogs.vectordb.index_name'] = String(indexName);\n if (kind === 'RETRIEVER' && params?.topK != null) attrs['neatlogs.retriever.top_k'] = params.topK;\n return withActiveSpan(`mastra.vector.${op}`, attrs, async (span) => {\n const result = await orig(params);\n span.setAttribute('output.value', safeStringify(result));\n return result;\n });\n };\n}\n\n// ---------------------------------------------------------------------------\n// Memory\n// ---------------------------------------------------------------------------\n\nconst MEMORY_OPS = ['recall', 'saveMessages', 'updateWorkingMemory', 'deleteMessages'];\n\nfunction patchMemory(memory: any): void {\n for (const op of MEMORY_OPS) {\n if (typeof memory[op] !== 'function') continue;\n const orig = memory[op].bind(memory);\n memory[op] = async function tracedMemoryOp(...args: any[]): Promise<any> {\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': 'CHAIN',\n 'neatlogs.db.operation': op,\n 'input.value': safeStringify(args?.[0]),\n };\n return withActiveSpan(`mastra.memory.${op}`, attrs, async (span) => {\n const result = await orig(...args);\n span.setAttribute('output.value', safeStringify(result));\n return result;\n });\n };\n }\n}\n\n// ---------------------------------------------------------------------------\n// MDocument\n// ---------------------------------------------------------------------------\n\nfunction patchDocument(doc: any): void {\n if (typeof doc.chunk !== 'function') return;\n const orig = doc.chunk.bind(doc);\n doc.chunk = async function tracedChunk(...args: any[]): Promise<any> {\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': 'CHAIN',\n 'neatlogs.db.operation': 'chunk',\n };\n return withActiveSpan('mastra.document.chunk', attrs, async (span) => {\n const result = await orig(...args);\n if (Array.isArray(result)) span.setAttribute('neatlogs.db.documents_count', result.length);\n return result;\n });\n };\n}\n\n// ---------------------------------------------------------------------------\n// Root Mastra proxy\n// ---------------------------------------------------------------------------\n\nfunction wrapRootMastra(mastra: any): any {\n const AGENT_GETTERS = new Set(['getAgent', 'getAgentById']);\n const WORKFLOW_GETTERS = new Set(['getWorkflow', 'getWorkflowById']);\n\n return new Proxy(mastra, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n if (typeof value !== 'function') return value;\n const name = String(prop);\n\n if (AGENT_GETTERS.has(name) || WORKFLOW_GETTERS.has(name)) {\n return (...args: any[]) => {\n const entity = value.apply(target, args);\n return entity && typeof entity === 'object' ? wrapMastra(entity) : entity;\n };\n }\n return value.bind(target);\n },\n });\n}\n\n// ---------------------------------------------------------------------------\n// Streaming output wrapping\n// ---------------------------------------------------------------------------\n\n/**\n * Finalize the AGENT span for a streaming result.\n *\n * Mastra's `stream()` returns a `MastraModelOutput` (NOT a plain async-iterable):\n * the model only runs when the caller drains `.textStream`/`.fullStream` or\n * awaits `.text`. We therefore:\n * 1. Re-establish the AGENT span's context around stream consumption so the\n * model's `doStream` (LLM) child nests under it.\n * 2. Tap the `.text`/`.usage`/`.finishReason` promises — which resolve when the\n * stream completes regardless of how the caller consumes — to record output\n * and end the span exactly once.\n * Falls back to legacy async-iterable / thenable shapes for older Mastra.\n */\nfunction wrapStreamingOutput(output: any, span: Span, ctx: ReturnType<typeof otelContext.active>): any {\n if (!output) {\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n return output;\n }\n\n let ended = false;\n const endOnce = (err?: unknown) => {\n if (ended) return;\n ended = true;\n if (err) recordError(span, err);\n else span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n };\n\n // MastraModelOutput: has awaitable .text (thenable). Tap completion promises.\n if (output.text && typeof output.text.then === 'function') {\n const finalize = async () => {\n try {\n const [text, usage, finishReason] = await Promise.all([\n Promise.resolve(output.text).catch(() => undefined),\n Promise.resolve(output.usage).catch(() => undefined),\n Promise.resolve(output.finishReason).catch(() => undefined),\n ]);\n if (typeof text === 'string' && text) {\n span.setAttribute('neatlogs.llm.output_messages.0.role', 'assistant');\n span.setAttribute('neatlogs.llm.output_messages.0.content', text);\n }\n if (usage) recordUsage(span, usage);\n if (finishReason) span.setAttribute('neatlogs.llm.stop_reason', normalizeFinishReason(finishReason));\n endOnce();\n } catch (err) {\n endOnce(err);\n }\n };\n // Drive finalization without requiring the caller to consume; the promises\n // resolve when Mastra finishes the stream internally.\n void finalize();\n\n // Re-establish span context around stream getters so doStream children nest.\n return rebindStreamContext(output, ctx);\n }\n\n // Legacy async-iterable\n if (output[Symbol.asyncIterator]) {\n const origIterator = output[Symbol.asyncIterator].bind(output);\n const textParts: string[] = [];\n const wrapped = Object.create(Object.getPrototypeOf(output));\n Object.assign(wrapped, output);\n wrapped[Symbol.asyncIterator] = function () {\n const iterator = origIterator();\n const finish = () => {\n if (textParts.length) {\n span.setAttribute('neatlogs.llm.output_messages.0.role', 'assistant');\n span.setAttribute('neatlogs.llm.output_messages.0.content', textParts.join(''));\n }\n endOnce();\n };\n return {\n async next(): Promise<IteratorResult<any>> {\n try {\n const r = await iterator.next();\n if (r.done) { finish(); return r; }\n const chunk = r.value;\n if (typeof chunk === 'string') textParts.push(chunk);\n else if (chunk?.text) textParts.push(chunk.text);\n else if (chunk?.delta) textParts.push(chunk.delta);\n return r;\n } catch (err) { endOnce(err); throw err; }\n },\n async return(value?: any): Promise<IteratorResult<any>> {\n finish();\n return iterator.return?.(value) ?? { done: true, value: undefined };\n },\n async throw(err?: any): Promise<IteratorResult<any>> {\n endOnce(err);\n return iterator.throw?.(err) ?? { done: true, value: undefined };\n },\n };\n };\n return wrapped;\n }\n\n // Thenable (awaited result)\n if (typeof output.then === 'function') {\n return output\n .then((resolved: any) => { finalizeAgentResult(span, resolved); endOnce(); return resolved; })\n .catch((err: any) => { endOnce(err); throw err; });\n }\n\n endOnce();\n return output;\n}\n\n/**\n * Wrap the async-iterable getters on a MastraModelOutput so that draining the\n * stream runs inside the AGENT span's context (lets the model's doStream child\n * span attach to the right parent). Returns a proxy; non-stream props pass through.\n */\nfunction rebindStreamContext(output: any, ctx: ReturnType<typeof otelContext.active>): any {\n const STREAM_PROPS = new Set(['textStream', 'fullStream', 'objectStream', 'elementStream']);\n return new Proxy(output, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n if (typeof prop === 'string' && STREAM_PROPS.has(prop) && value && value[Symbol.asyncIterator]) {\n const origIterator = value[Symbol.asyncIterator].bind(value);\n return {\n [Symbol.asyncIterator]() {\n return otelContext.with(ctx, () => origIterator());\n },\n };\n }\n if (typeof value === 'function') return value.bind(target);\n return value;\n },\n });\n}\n\n// ---------------------------------------------------------------------------\n// Result finalization\n// ---------------------------------------------------------------------------\n\nfunction finalizeAgentResult(span: Span, result: any): void {\n if (!result) return;\n\n if (result.text) {\n span.setAttribute('neatlogs.llm.output_messages.0.role', 'assistant');\n span.setAttribute('neatlogs.llm.output_messages.0.content', String(result.text));\n }\n\n if (Array.isArray(result.toolCalls)) {\n for (let i = 0; i < result.toolCalls.length; i++) {\n const tc = result.toolCalls[i];\n const p = tc.payload ?? tc;\n setToolCall(span, i, p.toolName ?? p.name, p.args ?? p.arguments, p.toolCallId ?? p.id);\n }\n }\n\n if (result.usage) recordUsage(span, result.usage);\n if (result.finishReason) span.setAttribute('neatlogs.llm.stop_reason', normalizeFinishReason(result.finishReason));\n if (result.model) span.setAttribute('neatlogs.llm.model_name', result.model);\n}\n\nfunction finalizeModelResult(span: Span, result: any): void {\n if (!result) return;\n // AI SDK v5 doGenerate result: { content[], finishReason, usage, ... }.\n // `content` is an array of typed parts (text / tool-call); `text` may be absent.\n if (typeof result.text === 'string' && result.text) {\n span.setAttribute('neatlogs.llm.output_messages.0.role', 'assistant');\n span.setAttribute('neatlogs.llm.output_messages.0.content', result.text);\n } else if (Array.isArray(result.content)) {\n const text = result.content\n .filter((p: any) => p?.type === 'text' && typeof p.text === 'string')\n .map((p: any) => p.text)\n .join('');\n if (text) {\n span.setAttribute('neatlogs.llm.output_messages.0.role', 'assistant');\n span.setAttribute('neatlogs.llm.output_messages.0.content', text);\n }\n // Tool-call parts → indexed tool_calls\n const toolCalls = result.content.filter((p: any) => p?.type === 'tool-call');\n for (let i = 0; i < toolCalls.length; i++) {\n const tc = toolCalls[i];\n setToolCall(span, i, tc.toolName, tc.input ?? tc.args, tc.toolCallId);\n }\n span.setAttribute('output.value', safeStringify(result.content));\n }\n if (result.usage) recordUsage(span, result.usage);\n span.setAttribute('neatlogs.llm.stop_reason', normalizeFinishReason(result.finishReason));\n}\n\nfunction normalizeFinishReason(fr: any): string {\n if (fr == null) return '';\n if (typeof fr === 'string') return fr;\n // AI SDK v5 raw model returns { unified: 'tool-calls', ... }\n return String(fr.unified ?? fr.reason ?? fr.type ?? safeStringify(fr));\n}\n\n/** Read a possibly-nested token count: 42, or { total: 42 }. */\nfunction tokenValue(v: any): number | undefined {\n if (v == null) return undefined;\n if (typeof v === 'number') return v;\n if (typeof v === 'object' && typeof v.total === 'number') return v.total;\n const n = Number(v);\n return Number.isFinite(n) ? n : undefined;\n}\n\n/**\n * Capture LLM sampling/invocation parameters from the model call options onto\n * the span, using only canonical neatlogs.* keys. Present-only — absent params\n * are skipped. Mirrors AI SDK LanguageModelV2CallOptions field names.\n */\nfunction captureInvocationParams(attrs: Record<string, any>, callOpts: any): void {\n if (!callOpts) return;\n const map: Array<[string, string]> = [\n ['temperature', 'neatlogs.llm.temperature'],\n ['maxOutputTokens', 'neatlogs.llm.max_tokens'],\n ['maxTokens', 'neatlogs.llm.max_tokens'],\n ['topP', 'neatlogs.llm.top_p'],\n ['topK', 'neatlogs.llm.top_k'],\n ['frequencyPenalty', 'neatlogs.llm.frequency_penalty'],\n ['presencePenalty', 'neatlogs.llm.presence_penalty'],\n ];\n const invocation: Record<string, any> = {};\n for (const [src, target] of map) {\n const v = callOpts[src];\n if (v != null) {\n attrs[target] = v;\n invocation[src] = v;\n }\n }\n if (Array.isArray(callOpts.stopSequences) && callOpts.stopSequences.length) {\n attrs['neatlogs.llm.stop_sequences'] = safeStringify(callOpts.stopSequences);\n invocation.stopSequences = callOpts.stopSequences;\n }\n // Tool definitions advertised to the model → neatlogs.llm.tools.{i}\n if (Array.isArray(callOpts.tools)) {\n for (let i = 0; i < callOpts.tools.length; i++) {\n attrs[`neatlogs.llm.tools.${i}`] = safeStringify(callOpts.tools[i]);\n }\n invocation.toolChoice = callOpts.toolChoice;\n }\n if (Object.keys(invocation).length) {\n attrs['neatlogs.llm.invocation_parameters'] = safeStringify(invocation);\n }\n}\n\n/**\n * Emit an indexed tool call directly in the neatlogs target namespace\n * `neatlogs.llm.tool_calls.{i}.{id,name,arguments}` — matching how the validated\n * openai/anthropic wrappers (src/openai.ts) emit them. The backend's\n * tool_calls.{i} target is an indexed object with these sub-fields.\n */\nfunction setToolCall(span: Span, i: number, name: any, args: any, id: any): void {\n span.setAttribute(`neatlogs.llm.tool_calls.${i}.name`, name ?? '');\n span.setAttribute(`neatlogs.llm.tool_calls.${i}.arguments`, safeStringify(args ?? {}));\n if (id) span.setAttribute(`neatlogs.llm.tool_calls.${i}.id`, id);\n}\n\nfunction recordUsage(span: Span, usage: any): void {\n if (!usage) return;\n // Shapes seen:\n // - AISDK v5 raw model: { inputTokens: {total}, outputTokens: {total} }\n // - Mastra result: { inputTokens, outputTokens, totalTokens }\n // - AISDK v3: { promptTokens, completionTokens, totalTokens }\n const prompt = tokenValue(usage.promptTokens ?? usage.inputTokens ?? usage.input_tokens);\n const completion = tokenValue(usage.completionTokens ?? usage.outputTokens ?? usage.output_tokens);\n const total = tokenValue(usage.totalTokens);\n if (prompt != null) span.setAttribute('neatlogs.llm.token_count.prompt', prompt);\n if (completion != null) span.setAttribute('neatlogs.llm.token_count.completion', completion);\n if (total != null) span.setAttribute('neatlogs.llm.token_count.total', total);\n else if (prompt != null && completion != null) {\n span.setAttribute('neatlogs.llm.token_count.total', prompt + completion);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Span helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Open a span as the ACTIVE span for the duration of `fn`, so any spans created\n * inside `fn` (model calls, tool executions, workflow steps) nest under it.\n */\nfunction withActiveSpan<T>(name: string, attrs: Record<string, any>, fn: (span: Span) => Promise<T>): Promise<T> {\n const tracer = trace.getTracer(TRACER_NAME);\n const span = tracer.startSpan(name, { attributes: attrs }, otelContext.active());\n const ctx = trace.setSpan(otelContext.active(), span);\n return otelContext.with(ctx, async () => {\n try {\n const result = await fn(span);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (err) {\n recordError(span, err);\n throw err;\n } finally {\n // Stream wrappers end the span themselves once the stream drains; guard\n // against double-end via the OTel SDK (ending twice is a no-op there).\n span.end();\n }\n });\n}\n\n/** Like withActiveSpan but for non-async-context-sensitive leaf operations. */\nfunction withSpan<T>(name: string, attrs: Record<string, any>, fn: (span: Span) => Promise<T> | T): Promise<T> {\n const tracer = trace.getTracer(TRACER_NAME);\n const span = tracer.startSpan(name, { attributes: attrs }, otelContext.active());\n return Promise.resolve()\n .then(() => fn(span))\n .then((result) => {\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n return result;\n })\n .catch((err) => {\n recordError(span, err);\n span.end();\n throw err;\n });\n}\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\nfunction markPatched(e: any): void {\n try {\n Object.defineProperty(e, PATCH_FLAG, { value: true, enumerable: false, configurable: true });\n } catch {\n e[PATCH_FLAG] = true;\n }\n}\n\nfunction extractModelId(model: any): string {\n if (!model) return '';\n if (typeof model === 'string') return model;\n return model.modelId ?? model.name ?? '';\n}\n\nfunction toInputValue(input: any): string {\n return (typeof input === 'string' ? input : safeStringify(input));\n}\n\nfunction safeStringify(value: unknown): string {\n if (typeof value === 'string') return value;\n try {\n return JSON.stringify(value) ?? '';\n } catch {\n return '';\n }\n}\n\nfunction recordError(span: Span, err: unknown): void {\n if (err instanceof Error) {\n span.setStatus({ code: SpanStatusCode.ERROR, message: err.message });\n span.recordException(err);\n } else {\n span.setStatus({ code: SpanStatusCode.ERROR, message: String(err) });\n }\n}\n"],"mappings":"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","names":["otelContext"]}
|
package/dist/mastra-wrap.mjs
CHANGED
|
@@ -32,14 +32,14 @@ function wrapMastraRerank(rerankFn) {
|
|
|
32
32
|
const query = args?.[1];
|
|
33
33
|
const options = args?.[3];
|
|
34
34
|
if (typeof query === "string") {
|
|
35
|
-
span.setAttribute("neatlogs.reranker.query", query
|
|
36
|
-
span.setAttribute("input.value", query
|
|
35
|
+
span.setAttribute("neatlogs.reranker.query", query);
|
|
36
|
+
span.setAttribute("input.value", query);
|
|
37
37
|
}
|
|
38
|
-
if (Array.isArray(results)) span.setAttribute("neatlogs.reranker.input_documents", safeStringify(results)
|
|
38
|
+
if (Array.isArray(results)) span.setAttribute("neatlogs.reranker.input_documents", safeStringify(results));
|
|
39
39
|
if (options?.topK != null) span.setAttribute("neatlogs.reranker.top_k", options.topK);
|
|
40
40
|
return Promise.resolve(rerankFn(...args)).then((result) => {
|
|
41
|
-
span.setAttribute("neatlogs.reranker.output_documents", safeStringify(result)
|
|
42
|
-
span.setAttribute("output.value", safeStringify(result)
|
|
41
|
+
span.setAttribute("neatlogs.reranker.output_documents", safeStringify(result));
|
|
42
|
+
span.setAttribute("output.value", safeStringify(result));
|
|
43
43
|
return result;
|
|
44
44
|
});
|
|
45
45
|
});
|
|
@@ -82,7 +82,7 @@ function patchAgentMethod(agent, method, streaming) {
|
|
|
82
82
|
};
|
|
83
83
|
if (model) attrs["neatlogs.llm.model_name"] = model;
|
|
84
84
|
if (agent.instructions && typeof agent.instructions === "string") {
|
|
85
|
-
attrs["neatlogs.llm.system_prompt"] = agent.instructions
|
|
85
|
+
attrs["neatlogs.llm.system_prompt"] = agent.instructions;
|
|
86
86
|
}
|
|
87
87
|
if (streaming) attrs["neatlogs.llm.is_streaming"] = true;
|
|
88
88
|
if (streaming) {
|
|
@@ -136,7 +136,7 @@ function patchModelInPlace(model) {
|
|
|
136
136
|
if (provider) attrs["neatlogs.llm.provider"] = provider;
|
|
137
137
|
if (isStream) attrs["neatlogs.llm.is_streaming"] = true;
|
|
138
138
|
const promptInput = callOpts?.prompt ?? callOpts?.messages;
|
|
139
|
-
if (promptInput !== void 0) attrs["input.value"] = safeStringify(promptInput)
|
|
139
|
+
if (promptInput !== void 0) attrs["input.value"] = safeStringify(promptInput);
|
|
140
140
|
captureInvocationParams(attrs, callOpts);
|
|
141
141
|
return withActiveSpan(`mastra.llm.${modelId || "model"}.${fn}`, attrs, async (span) => {
|
|
142
142
|
const result = await orig(callOpts);
|
|
@@ -170,12 +170,12 @@ function patchToolExecute(tool, key) {
|
|
|
170
170
|
const attrs = {
|
|
171
171
|
"neatlogs.span.kind": "TOOL",
|
|
172
172
|
"neatlogs.tool.name": toolName,
|
|
173
|
-
"input.value": safeStringify(params)
|
|
173
|
+
"input.value": safeStringify(params)
|
|
174
174
|
};
|
|
175
|
-
if (tool.description) attrs["neatlogs.tool.description"] = String(tool.description)
|
|
175
|
+
if (tool.description) attrs["neatlogs.tool.description"] = String(tool.description);
|
|
176
176
|
return withActiveSpan(`mastra.tool.${toolName}`, attrs, async (span) => {
|
|
177
177
|
const result = await orig(params, options);
|
|
178
|
-
span.setAttribute("output.value", safeStringify(result)
|
|
178
|
+
span.setAttribute("output.value", safeStringify(result));
|
|
179
179
|
return result;
|
|
180
180
|
});
|
|
181
181
|
};
|
|
@@ -201,13 +201,13 @@ function patchRunMethod(run, method, workflowName) {
|
|
|
201
201
|
"neatlogs.workflow.name": workflowName
|
|
202
202
|
};
|
|
203
203
|
if (startOpts?.inputData !== void 0) {
|
|
204
|
-
attrs["input.value"] = safeStringify(startOpts.inputData)
|
|
204
|
+
attrs["input.value"] = safeStringify(startOpts.inputData);
|
|
205
205
|
}
|
|
206
206
|
return withActiveSpan(`mastra.workflow.${workflowName}`, attrs, async (span) => {
|
|
207
207
|
const result = await orig(startOpts);
|
|
208
208
|
if (result?.status) span.setAttribute("neatlogs.metadata", safeStringify({ status: result.status }));
|
|
209
209
|
if (result?.result !== void 0) {
|
|
210
|
-
span.setAttribute("output.value", safeStringify(result.result)
|
|
210
|
+
span.setAttribute("output.value", safeStringify(result.result));
|
|
211
211
|
}
|
|
212
212
|
return result;
|
|
213
213
|
});
|
|
@@ -228,14 +228,14 @@ function patchVectorOp(vector, op, kind) {
|
|
|
228
228
|
"neatlogs.span.kind": kind,
|
|
229
229
|
"neatlogs.db.system": dbName,
|
|
230
230
|
"neatlogs.db.operation": op,
|
|
231
|
-
"input.value": safeStringify(params)
|
|
231
|
+
"input.value": safeStringify(params)
|
|
232
232
|
};
|
|
233
233
|
const indexName = params?.indexName;
|
|
234
234
|
if (indexName) attrs["neatlogs.vectordb.index_name"] = String(indexName);
|
|
235
235
|
if (kind === "RETRIEVER" && params?.topK != null) attrs["neatlogs.retriever.top_k"] = params.topK;
|
|
236
236
|
return withActiveSpan(`mastra.vector.${op}`, attrs, async (span) => {
|
|
237
237
|
const result = await orig(params);
|
|
238
|
-
span.setAttribute("output.value", safeStringify(result)
|
|
238
|
+
span.setAttribute("output.value", safeStringify(result));
|
|
239
239
|
return result;
|
|
240
240
|
});
|
|
241
241
|
};
|
|
@@ -249,11 +249,11 @@ function patchMemory(memory) {
|
|
|
249
249
|
const attrs = {
|
|
250
250
|
"neatlogs.span.kind": "CHAIN",
|
|
251
251
|
"neatlogs.db.operation": op,
|
|
252
|
-
"input.value": safeStringify(args?.[0])
|
|
252
|
+
"input.value": safeStringify(args?.[0])
|
|
253
253
|
};
|
|
254
254
|
return withActiveSpan(`mastra.memory.${op}`, attrs, async (span) => {
|
|
255
255
|
const result = await orig(...args);
|
|
256
|
-
span.setAttribute("output.value", safeStringify(result)
|
|
256
|
+
span.setAttribute("output.value", safeStringify(result));
|
|
257
257
|
return result;
|
|
258
258
|
});
|
|
259
259
|
};
|
|
@@ -316,7 +316,7 @@ function wrapStreamingOutput(output, span, ctx) {
|
|
|
316
316
|
]);
|
|
317
317
|
if (typeof text === "string" && text) {
|
|
318
318
|
span.setAttribute("neatlogs.llm.output_messages.0.role", "assistant");
|
|
319
|
-
span.setAttribute("neatlogs.llm.output_messages.0.content", text
|
|
319
|
+
span.setAttribute("neatlogs.llm.output_messages.0.content", text);
|
|
320
320
|
}
|
|
321
321
|
if (usage) recordUsage(span, usage);
|
|
322
322
|
if (finishReason) span.setAttribute("neatlogs.llm.stop_reason", normalizeFinishReason(finishReason));
|
|
@@ -338,7 +338,7 @@ function wrapStreamingOutput(output, span, ctx) {
|
|
|
338
338
|
const finish = () => {
|
|
339
339
|
if (textParts.length) {
|
|
340
340
|
span.setAttribute("neatlogs.llm.output_messages.0.role", "assistant");
|
|
341
|
-
span.setAttribute("neatlogs.llm.output_messages.0.content", textParts.join("")
|
|
341
|
+
span.setAttribute("neatlogs.llm.output_messages.0.content", textParts.join(""));
|
|
342
342
|
}
|
|
343
343
|
endOnce();
|
|
344
344
|
};
|
|
@@ -407,7 +407,7 @@ function finalizeAgentResult(span, result) {
|
|
|
407
407
|
if (!result) return;
|
|
408
408
|
if (result.text) {
|
|
409
409
|
span.setAttribute("neatlogs.llm.output_messages.0.role", "assistant");
|
|
410
|
-
span.setAttribute("neatlogs.llm.output_messages.0.content", String(result.text)
|
|
410
|
+
span.setAttribute("neatlogs.llm.output_messages.0.content", String(result.text));
|
|
411
411
|
}
|
|
412
412
|
if (Array.isArray(result.toolCalls)) {
|
|
413
413
|
for (let i = 0; i < result.toolCalls.length; i++) {
|
|
@@ -424,19 +424,19 @@ function finalizeModelResult(span, result) {
|
|
|
424
424
|
if (!result) return;
|
|
425
425
|
if (typeof result.text === "string" && result.text) {
|
|
426
426
|
span.setAttribute("neatlogs.llm.output_messages.0.role", "assistant");
|
|
427
|
-
span.setAttribute("neatlogs.llm.output_messages.0.content", result.text
|
|
427
|
+
span.setAttribute("neatlogs.llm.output_messages.0.content", result.text);
|
|
428
428
|
} else if (Array.isArray(result.content)) {
|
|
429
429
|
const text = result.content.filter((p) => p?.type === "text" && typeof p.text === "string").map((p) => p.text).join("");
|
|
430
430
|
if (text) {
|
|
431
431
|
span.setAttribute("neatlogs.llm.output_messages.0.role", "assistant");
|
|
432
|
-
span.setAttribute("neatlogs.llm.output_messages.0.content", text
|
|
432
|
+
span.setAttribute("neatlogs.llm.output_messages.0.content", text);
|
|
433
433
|
}
|
|
434
434
|
const toolCalls = result.content.filter((p) => p?.type === "tool-call");
|
|
435
435
|
for (let i = 0; i < toolCalls.length; i++) {
|
|
436
436
|
const tc = toolCalls[i];
|
|
437
437
|
setToolCall(span, i, tc.toolName, tc.input ?? tc.args, tc.toolCallId);
|
|
438
438
|
}
|
|
439
|
-
span.setAttribute("output.value", safeStringify(result.content)
|
|
439
|
+
span.setAttribute("output.value", safeStringify(result.content));
|
|
440
440
|
}
|
|
441
441
|
if (result.usage) recordUsage(span, result.usage);
|
|
442
442
|
span.setAttribute("neatlogs.llm.stop_reason", normalizeFinishReason(result.finishReason));
|
|
@@ -478,12 +478,12 @@ function captureInvocationParams(attrs, callOpts) {
|
|
|
478
478
|
}
|
|
479
479
|
if (Array.isArray(callOpts.tools)) {
|
|
480
480
|
for (let i = 0; i < callOpts.tools.length; i++) {
|
|
481
|
-
attrs[`neatlogs.llm.tools.${i}`] = safeStringify(callOpts.tools[i])
|
|
481
|
+
attrs[`neatlogs.llm.tools.${i}`] = safeStringify(callOpts.tools[i]);
|
|
482
482
|
}
|
|
483
483
|
invocation.toolChoice = callOpts.toolChoice;
|
|
484
484
|
}
|
|
485
485
|
if (Object.keys(invocation).length) {
|
|
486
|
-
attrs["neatlogs.llm.invocation_parameters"] = safeStringify(invocation)
|
|
486
|
+
attrs["neatlogs.llm.invocation_parameters"] = safeStringify(invocation);
|
|
487
487
|
}
|
|
488
488
|
}
|
|
489
489
|
function setToolCall(span, i, name, args, id) {
|
|
@@ -546,7 +546,7 @@ function extractModelId(model) {
|
|
|
546
546
|
return model.modelId ?? model.name ?? "";
|
|
547
547
|
}
|
|
548
548
|
function toInputValue(input) {
|
|
549
|
-
return
|
|
549
|
+
return typeof input === "string" ? input : safeStringify(input);
|
|
550
550
|
}
|
|
551
551
|
function safeStringify(value) {
|
|
552
552
|
if (typeof value === "string") return value;
|