From 908e9776897fc42393e82ebd7d9f73a13c5ab70f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gerg=C5=91=20M=C3=B3ricz?= Date: Wed, 6 Aug 2025 18:33:24 +0200 Subject: [PATCH] feat: langfuse integration (#1928) --- apps/api/package.json | 5 + apps/api/pnpm-lock.yaml | 1333 +++++++++++++++++ apps/api/src/index.ts | 19 +- .../deep-research/deep-research-service.ts | 21 + .../src/lib/deep-research/research-manager.ts | 15 + .../completions/analyzeSchemaAndPrompt.ts | 13 +- .../lib/extract/completions/batchExtract.ts | 13 +- .../extract/completions/checkShouldExtract.ts | 5 + .../lib/extract/completions/singleAnswer.ts | 10 + .../api/src/lib/extract/extraction-service.ts | 36 +- .../completions/analyzeSchemaAndPrompt-f0.ts | 4 +- .../fire-0/completions/batchExtract-f0.ts | 7 +- .../completions/checkShouldExtract-f0.ts | 5 + .../fire-0/completions/singleAnswer-f0.ts | 8 +- .../extract/fire-0/extraction-service-f0.ts | 24 +- .../src/lib/extract/fire-0/llmExtract-f0.ts | 44 +- apps/api/src/lib/extract/fire-0/ranker-f0.ts | 14 +- .../api/src/lib/extract/fire-0/reranker-f0.ts | 9 +- .../lib/extract/fire-0/url-processor-f0.ts | 24 +- apps/api/src/lib/extract/reranker.ts | 8 + apps/api/src/lib/extract/url-processor.ts | 29 +- .../generate-llmstxt-service.ts | 5 + apps/api/src/lib/ranker.test.ts | 6 +- apps/api/src/lib/ranker.ts | 14 +- .../scrapeURL/lib/extractSmartScrape.ts | 9 +- .../scraper/scrapeURL/transformers/diff.ts | 10 + .../scrapeURL/transformers/llmExtract.ts | 62 +- apps/api/src/services/langfuse.ts | 3 + apps/api/src/services/queue-worker.ts | 15 + apps/api/src/services/worker/scrape-worker.ts | 18 + 30 files changed, 1753 insertions(+), 35 deletions(-) create mode 100644 apps/api/src/services/langfuse.ts diff --git a/apps/api/package.json b/apps/api/package.json index 41b794641..f00e39aa0 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -72,6 +72,8 @@ "@google-cloud/storage": "^7.16.0", "@nangohq/node": "^0.40.8", "@openrouter/ai-sdk-provider": "^0.4.5", + "@opentelemetry/auto-instrumentations-node": "^0.62.0", + "@opentelemetry/sdk-node": "^0.203.0", "@sentry/cli": "^2.33.1", "@sentry/node": "^9.40.0", "@sentry/profiling-node": "^9.40.0", @@ -110,6 +112,8 @@ "json-schema-to-zod": "^2.3.0", "keyword-extractor": "^0.0.28", "koffi": "^2.9.0", + "langfuse": "^3.38.4", + "langfuse-vercel": "^3.38.4", "languagedetect": "^2.0.0", "lodash": "^4.17.21", "logsnag": "^1.0.0", @@ -119,6 +123,7 @@ "md5": "^2.3.0", "moment": "^2.29.4", "ollama-ai-provider": "^1.2.0", + "openai": "^5.12.0", "parse-diff": "^0.11.1", "pdf-parse": "^1.1.1", "pos": "^0.4.2", diff --git a/apps/api/pnpm-lock.yaml b/apps/api/pnpm-lock.yaml index 4cb562420..dd8c904ef 100644 --- a/apps/api/pnpm-lock.yaml +++ b/apps/api/pnpm-lock.yaml @@ -62,6 +62,12 @@ importers: '@openrouter/ai-sdk-provider': specifier: ^0.4.5 version: 0.4.5(zod@3.24.2) + '@opentelemetry/auto-instrumentations-node': + specifier: ^0.62.0 + version: 0.62.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(encoding@0.1.13) + '@opentelemetry/sdk-node': + specifier: ^0.203.0 + version: 0.203.0(@opentelemetry/api@1.9.0) '@sentry/cli': specifier: ^2.33.1 version: 2.33.1(encoding@0.1.13) @@ -176,6 +182,12 @@ importers: koffi: specifier: ^2.9.0 version: 2.9.0 + langfuse: + specifier: ^3.38.4 + version: 3.38.4 + langfuse-vercel: + specifier: ^3.38.4 + version: 3.38.4(ai@4.3.5(react@18.3.1)(zod@3.24.2)) languagedetect: specifier: ^2.0.0 version: 2.0.0 @@ -203,6 +215,9 @@ importers: ollama-ai-provider: specifier: ^1.2.0 version: 1.2.0(zod@3.24.2) + openai: + specifier: ^5.12.0 + version: 5.12.0(ws@8.18.0)(zod@3.24.2) parse-diff: specifier: ^0.11.1 version: 0.11.1 @@ -1082,6 +1097,15 @@ packages: resolution: {integrity: sha512-7/5LRgykyOfQENcm6hDKP8SX/u9XxE5YOiWOkgkwcoO+cG8xT/cyOvp9wwN3IxfdYgpHs8CE7Nq2PKX2lNaEXw==} engines: {node: '>=14'} + '@grpc/grpc-js@1.13.4': + resolution: {integrity: sha512-GsFaMXCkMqkKIvwCQjCrwH+GHbPKBjhwo/8ZuUkWHqbI73Kky9I+pQltrlT0+MWpedCoosda53lgjYfyEPgxBg==} + engines: {node: '>=12.10.0'} + + '@grpc/proto-loader@0.7.15': + resolution: {integrity: sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==} + engines: {node: '>=6'} + hasBin: true + '@ioredis/commands@1.2.0': resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} @@ -1188,6 +1212,9 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@js-sdsl/ordered-map@4.4.2': + resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} + '@jsdevtools/ono@7.1.3': resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} @@ -1241,6 +1268,10 @@ packages: peerDependencies: zod: ^3.0.0 + '@opentelemetry/api-logs@0.203.0': + resolution: {integrity: sha512-9B9RU0H7Ya1Dx/Rkyc4stuBZSGVQF27WigitInx2QQoj6KUpEFYPKoWjdFTunJYxmXmh17HeBvbMa1EhGyPmqQ==} + engines: {node: '>=8.0.0'} + '@opentelemetry/api-logs@0.57.2': resolution: {integrity: sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A==} engines: {node: '>=14'} @@ -1249,66 +1280,253 @@ packages: resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} engines: {node: '>=8.0.0'} + '@opentelemetry/auto-instrumentations-node@0.62.0': + resolution: {integrity: sha512-h5g+VNJjiyX6u/IQpn36ZCHOENg1QW0GgBOHBcFGnHBBhmTww4R3brExdeuYbvLj3UQY09n+UHFEoMOqkhq07A==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.4.1 + '@opentelemetry/core': ^2.0.0 + '@opentelemetry/context-async-hooks@1.30.1': resolution: {integrity: sha512-s5vvxXPVdjqS3kTLKMeBMvop9hbWkwzBpu+mUO2M7sZtlkyDJGwFe33wRKnbaYDo8ExRVBIIdwIGrqpxHuKttA==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@opentelemetry/context-async-hooks@2.0.1': + resolution: {integrity: sha512-XuY23lSI3d4PEqKA+7SLtAgwqIfc6E/E9eAQWLN1vlpC53ybO3o6jW4BsXo1xvz9lYyyWItfQDDLzezER01mCw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@opentelemetry/core@1.30.1': resolution: {integrity: sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@opentelemetry/core@2.0.1': + resolution: {integrity: sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/exporter-logs-otlp-grpc@0.203.0': + resolution: {integrity: sha512-g/2Y2noc/l96zmM+g0LdeuyYKINyBwN6FJySoU15LHPLcMN/1a0wNk2SegwKcxrRdE7Xsm7fkIR5n6XFe3QpPw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-logs-otlp-http@0.203.0': + resolution: {integrity: sha512-s0hys1ljqlMTbXx2XiplmMJg9wG570Z5lH7wMvrZX6lcODI56sG4HL03jklF63tBeyNwK2RV1/ntXGo3HgG4Qw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-logs-otlp-proto@0.203.0': + resolution: {integrity: sha512-nl/7S91MXn5R1aIzoWtMKGvqxgJgepB/sH9qW0rZvZtabnsjbf8OQ1uSx3yogtvLr0GzwD596nQKz2fV7q2RBw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-metrics-otlp-grpc@0.203.0': + resolution: {integrity: sha512-FCCj9nVZpumPQSEI57jRAA89hQQgONuoC35Lt+rayWY/mzCAc6BQT7RFyFaZKJ2B7IQ8kYjOCPsF/HGFWjdQkQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-metrics-otlp-http@0.203.0': + resolution: {integrity: sha512-HFSW10y8lY6BTZecGNpV3GpoSy7eaO0Z6GATwZasnT4bEsILp8UJXNG5OmEsz4SdwCSYvyCbTJdNbZP3/8LGCQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-metrics-otlp-proto@0.203.0': + resolution: {integrity: sha512-OZnhyd9npU7QbyuHXFEPVm3LnjZYifuKpT3kTnF84mXeEQ84pJJZgyLBpU4FSkSwUkt/zbMyNAI7y5+jYTWGIg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-prometheus@0.203.0': + resolution: {integrity: sha512-2jLuNuw5m4sUj/SncDf/mFPabUxMZmmYetx5RKIMIQyPnl6G6ooFzfeE8aXNRf8YD1ZXNlCnRPcISxjveGJHNg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-trace-otlp-grpc@0.203.0': + resolution: {integrity: sha512-322coOTf81bm6cAA8+ML6A+m4r2xTCdmAZzGNTboPXRzhwPt4JEmovsFAs+grpdarObd68msOJ9FfH3jxM6wqA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-trace-otlp-http@0.203.0': + resolution: {integrity: sha512-ZDiaswNYo0yq/cy1bBLJFe691izEJ6IgNmkjm4C6kE9ub/OMQqDXORx2D2j8fzTBTxONyzusbaZlqtfmyqURPw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-trace-otlp-proto@0.203.0': + resolution: {integrity: sha512-1xwNTJ86L0aJmWRwENCJlH4LULMG2sOXWIVw+Szta4fkqKVY50Eo4HoVKKq6U9QEytrWCr8+zjw0q/ZOeXpcAQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-zipkin@2.0.1': + resolution: {integrity: sha512-a9eeyHIipfdxzCfc2XPrE+/TI3wmrZUDFtG2RRXHSbZZULAny7SyybSvaDvS77a7iib5MPiAvluwVvbGTsHxsw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + '@opentelemetry/instrumentation-amqplib@0.46.1': resolution: {integrity: sha512-AyXVnlCf/xV3K/rNumzKxZqsULyITJH6OVLiW6730JPRqWA7Zc9bvYoVNpN6iOpTU8CasH34SU/ksVJmObFibQ==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.3.0 + '@opentelemetry/instrumentation-amqplib@0.50.0': + resolution: {integrity: sha512-kwNs/itehHG/qaQBcVrLNcvXVPW0I4FCOVtw3LHMLdYIqD7GJ6Yv2nX+a4YHjzbzIeRYj8iyMp0Bl7tlkidq5w==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-aws-lambda@0.54.0': + resolution: {integrity: sha512-uiYI+kcMUJ/H9cxAwB8c9CaG8behLRgcYSOEA8M/tMQ54Y1ZmzAuEE3QKOi21/s30x5Q+by9g7BwiVfDtqzeMA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-aws-sdk@0.56.0': + resolution: {integrity: sha512-Jl2B/FYEb6tBCk9G31CMomKPikGU2g+CEhrGddDI0o1YeNpg3kAO9dExF+w489/IJUGZX6/wudyNvV7z4k9NjQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-bunyan@0.49.0': + resolution: {integrity: sha512-ky5Am1y6s3Ex/3RygHxB/ZXNG07zPfg9Z6Ora+vfeKcr/+I6CJbWXWhSBJor3gFgKN3RvC11UWVURnmDpBS6Pg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-cassandra-driver@0.49.0': + resolution: {integrity: sha512-BNIvqldmLkeikfI5w5Rlm9vG5NnQexfPoxOgEMzfDVOEF+vS6351I6DzWLLgWWR9CNF/jQJJi/lr6am2DLp0Rw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + '@opentelemetry/instrumentation-connect@0.43.1': resolution: {integrity: sha512-ht7YGWQuV5BopMcw5Q2hXn3I8eG8TH0J/kc/GMcW4CuNTgiP6wCu44BOnucJWL3CmFWaRHI//vWyAhaC8BwePw==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.3.0 + '@opentelemetry/instrumentation-connect@0.47.0': + resolution: {integrity: sha512-pjenvjR6+PMRb6/4X85L4OtkQCootgb/Jzh/l/Utu3SJHBid1F+gk9sTGU2FWuhhEfV6P7MZ7BmCdHXQjgJ42g==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-cucumber@0.18.0': + resolution: {integrity: sha512-i+cUbLHvRShuevtM0NwjQR9wnABhmYw8+dbgD57LNBde7xkuSDot0CTzX+pYn32djtQ1bPYZiLf+uwS0JsMUrw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + '@opentelemetry/instrumentation-dataloader@0.16.1': resolution: {integrity: sha512-K/qU4CjnzOpNkkKO4DfCLSQshejRNAJtd4esgigo/50nxCB6XCyi1dhAblUHM9jG5dRm8eu0FB+t87nIo99LYQ==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.3.0 + '@opentelemetry/instrumentation-dataloader@0.21.0': + resolution: {integrity: sha512-Xu4CZ1bfhdkV3G6iVHFgKTgHx8GbKSqrTU01kcIJRGHpowVnyOPEv1CW5ow+9GU2X4Eki8zoNuVUenFc3RluxQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-dns@0.47.0': + resolution: {integrity: sha512-775fOnewWkTF4iXMGKgwvOGqEmPrU1PZpXjjqvTrEErYBJe7Fz1WlEeUStHepyKOdld7Ghv7TOF/kE3QDctvrg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + '@opentelemetry/instrumentation-express@0.47.1': resolution: {integrity: sha512-QNXPTWteDclR2B4pDFpz0TNghgB33UMjUt14B+BZPmtH1MwUFAfLHBaP5If0Z5NZC+jaH8oF2glgYjrmhZWmSw==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.3.0 + '@opentelemetry/instrumentation-express@0.52.0': + resolution: {integrity: sha512-W7pizN0Wh1/cbNhhTf7C62NpyYw7VfCFTYg0DYieSTrtPBT1vmoSZei19wfKLnrMsz3sHayCg0HxCVL2c+cz5w==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-fastify@0.48.0': + resolution: {integrity: sha512-3zQlE/DoVfVH6/ycuTv7vtR/xib6WOa0aLFfslYcvE62z0htRu/ot8PV/zmMZfnzpTQj8S/4ULv36R6UIbpJIg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + '@opentelemetry/instrumentation-fs@0.19.1': resolution: {integrity: sha512-6g0FhB3B9UobAR60BGTcXg4IHZ6aaYJzp0Ki5FhnxyAPt8Ns+9SSvgcrnsN2eGmk3RWG5vYycUGOEApycQL24A==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.3.0 + '@opentelemetry/instrumentation-fs@0.23.0': + resolution: {integrity: sha512-Puan+QopWHA/KNYvDfOZN6M/JtF6buXEyD934vrb8WhsX1/FuM7OtoMlQyIqAadnE8FqqDL4KDPiEfCQH6pQcQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + '@opentelemetry/instrumentation-generic-pool@0.43.1': resolution: {integrity: sha512-M6qGYsp1cURtvVLGDrPPZemMFEbuMmCXgQYTReC/IbimV5sGrLBjB+/hANUpRZjX67nGLdKSVLZuQQAiNz+sww==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.3.0 + '@opentelemetry/instrumentation-generic-pool@0.47.0': + resolution: {integrity: sha512-UfHqf3zYK+CwDwEtTjaD12uUqGGTswZ7ofLBEdQ4sEJp9GHSSJMQ2hT3pgBxyKADzUdoxQAv/7NqvL42ZI+Qbw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + '@opentelemetry/instrumentation-graphql@0.47.1': resolution: {integrity: sha512-EGQRWMGqwiuVma8ZLAZnExQ7sBvbOx0N/AE/nlafISPs8S+QtXX+Viy6dcQwVWwYHQPAcuY3bFt3xgoAwb4ZNQ==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.3.0 + '@opentelemetry/instrumentation-graphql@0.51.0': + resolution: {integrity: sha512-LchkOu9X5DrXAnPI1+Z06h/EH/zC7D6sA86hhPrk3evLlsJTz0grPrkL/yUJM9Ty0CL/y2HSvmWQCjbJEz/ADg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-grpc@0.203.0': + resolution: {integrity: sha512-Qmjx2iwccHYRLoE4RFS46CvQE9JG9Pfeae4EPaNZjvIuJxb/pZa2R9VWzRlTehqQWpAvto/dGhtkw8Tv+o0LTg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + '@opentelemetry/instrumentation-hapi@0.45.2': resolution: {integrity: sha512-7Ehow/7Wp3aoyCrZwQpU7a2CnoMq0XhIcioFuKjBb0PLYfBfmTsFTUyatlHu0fRxhwcRsSQRTvEhmZu8CppBpQ==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.3.0 + '@opentelemetry/instrumentation-hapi@0.50.0': + resolution: {integrity: sha512-5xGusXOFQXKacrZmDbpHQzqYD1gIkrMWuwvlrEPkYOsjUqGUjl1HbxCsn5Y9bUXOCgP1Lj6A4PcKt1UiJ2MujA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-http@0.203.0': + resolution: {integrity: sha512-y3uQAcCOAwnO6vEuNVocmpVzG3PER6/YZqbPbbffDdJ9te5NkHEkfSMNzlC3+v7KlE+WinPGc3N7MR30G1HY2g==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + '@opentelemetry/instrumentation-http@0.57.2': resolution: {integrity: sha512-1Uz5iJ9ZAlFOiPuwYg29Bf7bJJc/GeoeJIFKJYQf67nTVKFe8RHbEtxgkOmK4UGZNHKXcpW4P8cWBYzBn1USpg==} engines: {node: '>=14'} @@ -1321,6 +1539,18 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 + '@opentelemetry/instrumentation-ioredis@0.51.0': + resolution: {integrity: sha512-9IUws0XWCb80NovS+17eONXsw1ZJbHwYYMXiwsfR9TSurkLV5UNbRSKb9URHO+K+pIJILy9wCxvyiOneMr91Ig==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-kafkajs@0.12.0': + resolution: {integrity: sha512-bIe4aSAAxytp88nzBstgr6M7ZiEpW6/D1/SuKXdxxuprf18taVvFL2H5BDNGZ7A14K27haHqzYqtCTqFXHZOYg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + '@opentelemetry/instrumentation-kafkajs@0.7.1': resolution: {integrity: sha512-OtjaKs8H7oysfErajdYr1yuWSjMAectT7Dwr+axIoZqT9lmEOkD/H/3rgAs8h/NIuEi2imSXD+vL4MZtOuJfqQ==} engines: {node: '>=14'} @@ -1333,88 +1563,326 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 + '@opentelemetry/instrumentation-knex@0.48.0': + resolution: {integrity: sha512-V5wuaBPv/lwGxuHjC6Na2JFRjtPgstw19jTFl1B1b6zvaX8zVDYUDaR5hL7glnQtUSCMktPttQsgK4dhXpddcA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + '@opentelemetry/instrumentation-koa@0.47.1': resolution: {integrity: sha512-l/c+Z9F86cOiPJUllUCt09v+kICKvT+Vg1vOAJHtHPsJIzurGayucfCMq2acd/A/yxeNWunl9d9eqZ0G+XiI6A==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.3.0 + '@opentelemetry/instrumentation-koa@0.51.0': + resolution: {integrity: sha512-XNLWeMTMG1/EkQBbgPYzCeBD0cwOrfnn8ao4hWgLv0fNCFQu1kCsJYygz2cvKuCs340RlnG4i321hX7R8gj3Rg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + '@opentelemetry/instrumentation-lru-memoizer@0.44.1': resolution: {integrity: sha512-5MPkYCvG2yw7WONEjYj5lr5JFehTobW7wX+ZUFy81oF2lr9IPfZk9qO+FTaM0bGEiymwfLwKe6jE15nHn1nmHg==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.3.0 + '@opentelemetry/instrumentation-lru-memoizer@0.48.0': + resolution: {integrity: sha512-KUW29wfMlTPX1wFz+NNrmE7IzN7NWZDrmFWHM/VJcmFEuQGnnBuTIdsP55CnBDxKgQ/qqYFp4udQFNtjeFosPw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-memcached@0.47.0': + resolution: {integrity: sha512-vXDs/l4hlWy1IepPG1S6aYiIZn+tZDI24kAzwKKJmR2QEJRL84PojmALAEJGazIOLl/VdcCPZdMb0U2K0VzojA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + '@opentelemetry/instrumentation-mongodb@0.52.0': resolution: {integrity: sha512-1xmAqOtRUQGR7QfJFfGV/M2kC7wmI2WgZdpru8hJl3S0r4hW0n3OQpEHlSGXJAaNFyvT+ilnwkT+g5L4ljHR6g==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.3.0 + '@opentelemetry/instrumentation-mongodb@0.56.0': + resolution: {integrity: sha512-YG5IXUUmxX3Md2buVMvxm9NWlKADrnavI36hbJsihqqvBGsWnIfguf0rUP5Srr0pfPqhQjUP+agLMsvu0GmUpA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + '@opentelemetry/instrumentation-mongoose@0.46.1': resolution: {integrity: sha512-3kINtW1LUTPkiXFRSSBmva1SXzS/72we/jL22N+BnF3DFcoewkdkHPYOIdAAk9gSicJ4d5Ojtt1/HeibEc5OQg==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.3.0 + '@opentelemetry/instrumentation-mongoose@0.50.0': + resolution: {integrity: sha512-Am8pk1Ct951r4qCiqkBcGmPIgGhoDiFcRtqPSLbJrUZqEPUsigjtMjoWDRLG1Ki1NHgOF7D0H7d+suWz1AAizw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + '@opentelemetry/instrumentation-mysql2@0.45.2': resolution: {integrity: sha512-h6Ad60FjCYdJZ5DTz1Lk2VmQsShiViKe0G7sYikb0GHI0NVvApp2XQNRHNjEMz87roFttGPLHOYVPlfy+yVIhQ==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.3.0 + '@opentelemetry/instrumentation-mysql2@0.49.0': + resolution: {integrity: sha512-dCub9wc02mkJWNyHdVEZ7dvRzy295SmNJa+LrAJY2a/+tIiVBQqEAajFzKwp9zegVVnel9L+WORu34rGLQDzxA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + '@opentelemetry/instrumentation-mysql@0.45.1': resolution: {integrity: sha512-TKp4hQ8iKQsY7vnp/j0yJJ4ZsP109Ht6l4RHTj0lNEG1TfgTrIH5vJMbgmoYXWzNHAqBH2e7fncN12p3BP8LFg==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.3.0 + '@opentelemetry/instrumentation-mysql@0.49.0': + resolution: {integrity: sha512-QU9IUNqNsrlfE3dJkZnFHqLjlndiU39ll/YAAEvWE40sGOCi9AtOF6rmEGzJ1IswoZ3oyePV7q2MP8SrhJfVAA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-nestjs-core@0.49.0': + resolution: {integrity: sha512-1R/JFwdmZIk3T/cPOCkVvFQeKYzbbUvDxVH3ShXamUwBlGkdEu5QJitlRMyVNZaHkKZKWgYrBarGQsqcboYgaw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-net@0.47.0': + resolution: {integrity: sha512-csoJ++Njpf7C09JH+0HNGenuNbDZBqO1rFhMRo6s0rAmJwNh9zY3M/urzptmKlqbKnf4eH0s+CKHy/+M8fbFsQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-oracledb@0.29.0': + resolution: {integrity: sha512-2aHLiJdkyiUbooIUm7FaZf+O4jyqEl+RfFpgud1dxT87QeeYM216wi+xaMNzsb5yKtRBqbA3qeHBCyenYrOZwA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + '@opentelemetry/instrumentation-pg@0.51.1': resolution: {integrity: sha512-QxgjSrxyWZc7Vk+qGSfsejPVFL1AgAJdSBMYZdDUbwg730D09ub3PXScB9d04vIqPriZ+0dqzjmQx0yWKiCi2Q==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.3.0 + '@opentelemetry/instrumentation-pg@0.55.0': + resolution: {integrity: sha512-yfJ5bYE7CnkW/uNsnrwouG/FR7nmg09zdk2MSs7k0ZOMkDDAE3WBGpVFFApGgNu2U+gtzLgEzOQG4I/X+60hXw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-pino@0.50.0': + resolution: {integrity: sha512-Pi0cWGp4f2gresq2xqef4IsuunLdebJ9n9tZxytDz2ci4euIfW36ILpszQmRNhwCVDCZLmUgGDKZGj4PXyPd0w==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + '@opentelemetry/instrumentation-redis-4@0.46.1': resolution: {integrity: sha512-UMqleEoabYMsWoTkqyt9WAzXwZ4BlFZHO40wr3d5ZvtjKCHlD4YXLm+6OLCeIi/HkX7EXvQaz8gtAwkwwSEvcQ==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.3.0 + '@opentelemetry/instrumentation-redis@0.51.0': + resolution: {integrity: sha512-uL/GtBA0u72YPPehwOvthAe+Wf8k3T+XQPBssJmTYl6fzuZjNq8zTfxVFhl9nRFjFVEe+CtiYNT0Q3AyqW1Z0A==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-restify@0.49.0': + resolution: {integrity: sha512-tsGZZhS4mVZH7omYxw5jpsrD3LhWizqWc0PYtAnzpFUvL5ZINHE+cm57bssTQ2AK/GtZMxu9LktwCvIIf3dSmw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-router@0.48.0': + resolution: {integrity: sha512-Wixrc8CchuJojXpaS/dCQjFOMc+3OEil1H21G+WLYQb8PcKt5kzW9zDBT19nyjjQOx/D/uHPfgbrT+Dc7cfJ9w==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-runtime-node@0.17.0': + resolution: {integrity: sha512-O+xc0woqrSjue5IgpCCMvlgsuDrq6DDEfiHW3S3vRMCjXE1ZoPjaDE/K6EURorN+tjnzZQN1gOMSrscSGAbjHg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-socket.io@0.50.0': + resolution: {integrity: sha512-6JN6lnKN9ZuZtZdMQIR+no1qHzQvXSZUsNe3sSWMgqmNRyEXuDUWBIyKKeG0oHRHtR4xE4QhJyD4D5kKRPWZFA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + '@opentelemetry/instrumentation-tedious@0.18.1': resolution: {integrity: sha512-5Cuy/nj0HBaH+ZJ4leuD7RjgvA844aY2WW+B5uLcWtxGjRZl3MNLuxnNg5DYWZNPO+NafSSnra0q49KWAHsKBg==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.3.0 + '@opentelemetry/instrumentation-tedious@0.22.0': + resolution: {integrity: sha512-XrrNSUCyEjH1ax9t+Uo6lv0S2FCCykcF7hSxBMxKf7Xn0bPRxD3KyFUZy25aQXzbbbUHhtdxj3r2h88SfEM3aA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + '@opentelemetry/instrumentation-undici@0.10.1': resolution: {integrity: sha512-rkOGikPEyRpMCmNu9AQuV5dtRlDmJp2dK5sw8roVshAGoB6hH/3QjDtRhdwd75SsJwgynWUNRUYe0wAkTo16tQ==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.7.0 + '@opentelemetry/instrumentation-undici@0.14.0': + resolution: {integrity: sha512-2HN+7ztxAReXuxzrtA3WboAKlfP5OsPA57KQn2AdYZbJ3zeRPcLXyW4uO/jpLE6PLm0QRtmeGCmfYpqRlwgSwg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.7.0 + + '@opentelemetry/instrumentation-winston@0.48.0': + resolution: {integrity: sha512-QuKbswAaQfRULhtlYbeNC9gOAXPxOSCE4BjIzuY1oEsc84kIsHUjn3yvY9Q83s3eg3j0JycNcAMi8u0yTl5PIQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation@0.203.0': + resolution: {integrity: sha512-ke1qyM+3AK2zPuBPb6Hk/GCsc5ewbLvPNkEuELx/JmANeEp6ZjnZ+wypPAJSucTw0wvCGrUaibDSdcrGFoWxKQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + '@opentelemetry/instrumentation@0.57.2': resolution: {integrity: sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.3.0 + '@opentelemetry/otlp-exporter-base@0.203.0': + resolution: {integrity: sha512-Wbxf7k+87KyvxFr5D7uOiSq/vHXWommvdnNE7vECO3tAhsA2GfOlpWINCMWUEPdHZ7tCXxw6Epp3vgx3jU7llQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/otlp-grpc-exporter-base@0.203.0': + resolution: {integrity: sha512-te0Ze1ueJF+N/UOFl5jElJW4U0pZXQ8QklgSfJ2linHN0JJsuaHG8IabEUi2iqxY8ZBDlSiz1Trfv5JcjWWWwQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/otlp-transformer@0.203.0': + resolution: {integrity: sha512-Y8I6GgoCna0qDQ2W6GCRtaF24SnvqvA8OfeTi7fqigD23u8Jpb4R5KFv/pRvrlGagcCLICMIyh9wiejp4TXu/A==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/propagation-utils@0.31.3': + resolution: {integrity: sha512-ZI6LKjyo+QYYZY5SO8vfoCQ9A69r1/g+pyjvtu5RSK38npINN1evEmwqbqhbg2CdcIK3a4PN6pDAJz/yC5/gAA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/propagator-b3@2.0.1': + resolution: {integrity: sha512-Hc09CaQ8Tf5AGLmf449H726uRoBNGPBL4bjr7AnnUpzWMvhdn61F78z9qb6IqB737TffBsokGAK1XykFEZ1igw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/propagator-jaeger@2.0.1': + resolution: {integrity: sha512-7PMdPBmGVH2eQNb/AtSJizQNgeNTfh6jQFqys6lfhd6P4r+m/nTh3gKPPpaCXVdRQ+z93vfKk+4UGty390283w==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@opentelemetry/redis-common@0.36.2': resolution: {integrity: sha512-faYX1N0gpLhej/6nyp6bgRjzAKXn5GOEMYY7YhciSfCoITAktLUtQ36d24QEWNA1/WA1y6qQunCe0OhHRkVl9g==} engines: {node: '>=14'} + '@opentelemetry/redis-common@0.38.0': + resolution: {integrity: sha512-4Wc0AWURII2cfXVVoZ6vDqK+s5n4K5IssdrlVrvGsx6OEOKdghKtJZqXAHWFiZv4nTDLH2/2fldjIHY8clMOjQ==} + engines: {node: ^18.19.0 || >=20.6.0} + + '@opentelemetry/resource-detector-alibaba-cloud@0.31.3': + resolution: {integrity: sha512-I556LHcLVsBXEgnbPgQISP/JezDt5OfpgOaJNR1iVJl202r+K145OSSOxnH5YOc/KvrydBD0FOE03F7x0xnVTw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/resource-detector-aws@2.3.0': + resolution: {integrity: sha512-PkD/lyXG3B3REq1Y6imBLckljkJYXavtqGYSryAeJYvGOf5Ds3doR+BCGjmKeF6ObAtI5MtpBeUStTDtGtBsWA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/resource-detector-azure@0.10.0': + resolution: {integrity: sha512-5cNAiyPBg53Uxe/CW7hsCq8HiKNAUGH+gi65TtgpzSR9bhJG4AEbuZhbJDFwe97tn2ifAD1JTkbc/OFuaaFWbA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/resource-detector-container@0.7.3': + resolution: {integrity: sha512-SK+xUFw6DKYbQniaGmIFsFxAZsr8RpRSRWxKi5/ZJAoqqPnjcyGI/SeUx8zzPk4XLO084zyM4pRHgir0hRTaSQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/resource-detector-gcp@0.37.0': + resolution: {integrity: sha512-LGpJBECIMsVKhiulb4nxUw++m1oF4EiDDPmFGW2aqYaAF0oUvJNv8Z/55CAzcZ7SxvlTgUwzewXDBsuCup7iqw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + '@opentelemetry/resources@1.30.1': resolution: {integrity: sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@opentelemetry/resources@2.0.1': + resolution: {integrity: sha512-dZOB3R6zvBwDKnHDTB4X1xtMArB/d324VsbiPkX/Yu0Q8T2xceRthoIVFhJdvgVM2QhGVUyX9tzwiNxGtoBJUw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-logs@0.203.0': + resolution: {integrity: sha512-vM2+rPq0Vi3nYA5akQD2f3QwossDnTDLvKbea6u/A2NZ3XDkPxMfo/PNrDoXhDUD/0pPo2CdH5ce/thn9K0kLw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.4.0 <1.10.0' + + '@opentelemetry/sdk-metrics@2.0.1': + resolution: {integrity: sha512-wf8OaJoSnujMAHWR3g+/hGvNcsC16rf9s1So4JlMiFaFHiE4HpIA3oUh+uWZQ7CNuK8gVW/pQSkgoa5HkkOl0g==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.9.0 <1.10.0' + + '@opentelemetry/sdk-node@0.203.0': + resolution: {integrity: sha512-zRMvrZGhGVMvAbbjiNQW3eKzW/073dlrSiAKPVWmkoQzah9wfynpVPeL55f9fVIm0GaBxTLcPeukWGy0/Wj7KQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + '@opentelemetry/sdk-trace-base@1.30.1': resolution: {integrity: sha512-jVPgBbH1gCy2Lb7X0AVQ8XAfgg0pJ4nvl8/IiQA6nxOsPvS+0zMJaFSs2ltXe0J6C8dqjcnpyqINDJmU30+uOg==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@opentelemetry/sdk-trace-base@2.0.1': + resolution: {integrity: sha512-xYLlvk/xdScGx1aEqvxLwf6sXQLXCjk3/1SQT9X9AoN5rXRhkdvIFShuNNmtTEPRBqcsMbS4p/gJLNI2wXaDuQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-trace-node@2.0.1': + resolution: {integrity: sha512-UhdbPF19pMpBtCWYP5lHbTogLWx9N0EBxtdagvkn5YtsAnCBZzL7SjktG+ZmupRgifsHMjwUaCCaVmqGfSADmA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@opentelemetry/semantic-conventions@1.28.0': resolution: {integrity: sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==} engines: {node: '>=14'} @@ -1429,6 +1897,12 @@ packages: peerDependencies: '@opentelemetry/api': ^1.1.0 + '@opentelemetry/sql-common@0.41.0': + resolution: {integrity: sha512-pmzXctVbEERbqSfiAgdes9Y63xjoOyXcD7B6IXBkVb+vbM7M9U98mn33nGXxPf4dfYR0M+vhcKRZmbSJ7HfqFA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@paralleldrive/cuid2@2.2.2': resolution: {integrity: sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA==} @@ -1447,6 +1921,36 @@ packages: peerDependencies: '@opentelemetry/api': ^1.8 + '@protobufjs/aspromise@1.1.2': + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + + '@protobufjs/base64@1.1.2': + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + + '@protobufjs/codegen@2.0.4': + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + + '@protobufjs/eventemitter@1.1.0': + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + + '@protobufjs/fetch@1.1.0': + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + + '@protobufjs/float@1.0.2': + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + + '@protobufjs/inquire@1.1.0': + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + + '@protobufjs/path@1.1.2': + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + + '@protobufjs/pool@1.1.0': + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + + '@protobufjs/utf8@1.1.0': + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + '@react-email/render@0.0.15': resolution: {integrity: sha512-/pT5dBu0y1mogrfEpc002rgRcXpbShK6PFtxTVU6LZZ+bccvZPgk67HKc01lxpa1eYGQgZ6I+VQ02GRnMDclTg==} engines: {node: '>=18.0.0'} @@ -1799,6 +2303,9 @@ packages: '@tsconfig/recommended@1.0.6': resolution: {integrity: sha512-0IKu9GHYF1NGTJiYgfWwqnOQSlnE9V9R7YohHNNf0/fj/SyOZWzdd06JFr0fLpg1Mqw0kGbYg8w5xdkSqLKM9g==} + '@types/aws-lambda@8.10.150': + resolution: {integrity: sha512-AX+AbjH/rH5ezX1fbK8onC/a+HyQHo7QGmvoxAE42n22OsciAxvZoZNEr22tbXs8WfP1nIsBjKDpgPm3HjOZbA==} + '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -1814,6 +2321,9 @@ packages: '@types/body-parser@1.19.5': resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + '@types/bunyan@1.8.11': + resolution: {integrity: sha512-758fRH7umIMk5qt5ELmRMff4mLDlN+xyYzC+dkPTdKwbSkJFvz6xwyScrytPU0QIBbRRwbiE8/BIg8bpajerNQ==} + '@types/caseless@0.12.5': resolution: {integrity: sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==} @@ -1865,6 +2375,9 @@ packages: '@types/lodash@4.17.14': resolution: {integrity: sha512-jsxagdikDiDBeIRaPYtArcT8my4tN1og7MtMRquFT3XNA6axxyHDRUemqDz/taRDdOUn0GnGHRCuff4q48sW9A==} + '@types/memcached@2.2.10': + resolution: {integrity: sha512-AM9smvZN55Gzs2wRrqeMHVP7KE8KWgCJO/XL5yCly2xF6EKa4YlbpK+cLSAH4NG/Ah64HrlegmGqW8kYws7Vxg==} + '@types/methods@1.1.4': resolution: {integrity: sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==} @@ -1874,6 +2387,9 @@ packages: '@types/mysql@2.15.26': resolution: {integrity: sha512-DSLCOXhkvfS5WNNPbfn2KdICAmk8lLc+/PNvnPnF7gOdMZCxopXduqv0OQ13y/yA/zXTSikZZqVgybUxOEg6YQ==} + '@types/mysql@2.15.27': + resolution: {integrity: sha512-YfWiV16IY0OeBfBCk8+hXKmdTKrKlwKN1MNKAPBu5JYxLwBEZl7QzeEpGnlZb3VMGJrrGmB84gXiH+ofs/TezA==} + '@types/node-fetch@2.6.11': resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} @@ -1883,12 +2399,18 @@ packages: '@types/node@20.14.1': resolution: {integrity: sha512-T2MzSGEu+ysB/FkWfqmhV3PLyQlowdptmmgD20C6QxsS8Fmv5SjpZ1ayXaEC0S21/h5UJ9iA6W/5vSNU5l00OA==} + '@types/oracledb@6.5.2': + resolution: {integrity: sha512-kK1eBS/Adeyis+3OlBDMeQQuasIDLUYXsi2T15ccNJ0iyUpQ4xDF7svFu3+bGVrI0CMBUclPciz+lsQR3JX3TQ==} + '@types/pdf-parse@1.1.4': resolution: {integrity: sha512-+gbBHbNCVGGYw1S9lAIIvrHW47UYOhMIFUsJcMkMrzy1Jf0vulBN3XQIjPgnoOXveMuHnF3b57fXROnY/Or7eg==} '@types/pg-pool@2.0.6': resolution: {integrity: sha512-TaAUE5rq2VQYxab5Ts7WZhKNmuN78Q6PiFonTDdpbx8a1H0M1vhy3rhiMjl+e2iHmogyMw7jZF4FrE6eJUy5HQ==} + '@types/pg@8.15.4': + resolution: {integrity: sha512-I6UNVBAoYbvuWkkU3oosC8yxqH21f4/Jc4DK71JLG3dT2mdlGe1z+ep/LQGXaKaOgcvUrsQoPRqfgtMcvZiJhg==} + '@types/pg@8.6.1': resolution: {integrity: sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==} @@ -3314,6 +3836,20 @@ packages: kuler@2.0.0: resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} + langfuse-core@3.38.4: + resolution: {integrity: sha512-onTAqcEGhoXuBgqDFXe2t+bt9Vi+5YChRgdz3voM49JKoHwtVZQiUdqTfjSivGR75eSbYoiaIL8IRoio+jaqwg==} + engines: {node: '>=18'} + + langfuse-vercel@3.38.4: + resolution: {integrity: sha512-gyhQuim2b1qpI7yiGnww9qzqsdpD59XagD+QB3eGHIrX+1ao7vbcrwL14H0GlsLIUM10Nud9wtEbxiFZP1PB7g==} + engines: {node: '>=18'} + peerDependencies: + ai: '>=3.2.44' + + langfuse@3.38.4: + resolution: {integrity: sha512-2UqMeHLl3DGNX1Nh/cO4jGhk7TzDJ6gjQLlyS9rwFCKVO81xot6b58yeTsTB5YrWupWsOxQtMNoQYIQGOUlH9Q==} + engines: {node: '>=18'} + languagedetect@2.0.0: resolution: {integrity: sha512-AZb/liiQ+6ZoTj4f1J0aE6OkzhCo8fyH+tuSaPfSo8YHCWLFJrdSixhtO2TYdIkjcDQNaR4RmGaV2A5FJklDMQ==} engines: {node: '>= 0.4.8'} @@ -3335,6 +3871,9 @@ packages: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + lodash.defaults@4.2.0: resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} @@ -3362,6 +3901,9 @@ packages: logsnag@1.0.0: resolution: {integrity: sha512-HMzjh75OR5EVY7Be4Rw8TcDTIY5UPsrXF1HvQ6EzDi21x5cQcDzi4Ts0Y/ruPCbxKY2KG17YjeeTzErXFewFBg==} + long@5.3.2: + resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -3511,6 +4053,10 @@ packages: msgpackr@1.11.2: resolution: {integrity: sha512-F9UngXRlPyWCDEASDpTf6c9uNhGPTqnTeLVt7bN+bU1eajoR/8V9ys2BRaV5C/e5ihE6sJ9uPIKaYt6bFuO32g==} + mustache@4.2.0: + resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} + hasBin: true + nanoid@3.3.8: resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -3620,6 +4166,18 @@ packages: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} + openai@5.12.0: + resolution: {integrity: sha512-vUdt02xiWgOHiYUmW0Hj1Qu9OKAiVQu5Bd547ktVCiMKC1BkB5L3ImeEnCyq3WpRKR6ZTaPgekzqdozwdPs7Lg==} + hasBin: true + peerDependencies: + ws: ^8.18.0 + zod: ^3.23.8 + peerDependenciesMeta: + ws: + optional: true + zod: + optional: true + option@0.2.4: resolution: {integrity: sha512-pkEqbDyl8ou5cpq+VsnQbe/WlEy5qS7xPzMS1U55OCG9KPvwFD46zDbxQIj3egJSFc3D+XhYOPUzz49zQAVy7A==} @@ -3789,6 +4347,10 @@ packages: proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + protobufjs@7.5.3: + resolution: {integrity: sha512-sildjKwVqOI2kmFDiXQ6aEB0fjYTafpEvIBs8tOR8qI4spuL9OPROLVu2qZqi/xgCfsHIwVqlaF8JBjWFHnKbw==} + engines: {node: '>=12.0.0'} + proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} @@ -5651,6 +6213,18 @@ snapshots: - encoding - supports-color + '@grpc/grpc-js@1.13.4': + dependencies: + '@grpc/proto-loader': 0.7.15 + '@js-sdsl/ordered-map': 4.4.2 + + '@grpc/proto-loader@0.7.15': + dependencies: + lodash.camelcase: 4.3.0 + long: 5.3.2 + protobufjs: 7.5.3 + yargs: 17.7.2 + '@ioredis/commands@1.2.0': {} '@isaacs/cliui@8.0.2': @@ -5860,6 +6434,8 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 + '@js-sdsl/ordered-map@4.4.2': {} + '@jsdevtools/ono@7.1.3': {} '@mixmark-io/domino@2.2.0': {} @@ -5898,21 +6474,195 @@ snapshots: '@ai-sdk/provider-utils': 2.1.10(zod@3.24.2) zod: 3.24.2 + '@opentelemetry/api-logs@0.203.0': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs@0.57.2': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/api@1.9.0': {} + '@opentelemetry/auto-instrumentations-node@0.62.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(encoding@0.1.13)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-amqplib': 0.50.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-aws-lambda': 0.54.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-aws-sdk': 0.56.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-bunyan': 0.49.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-cassandra-driver': 0.49.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-connect': 0.47.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-cucumber': 0.18.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-dataloader': 0.21.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-dns': 0.47.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-express': 0.52.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-fastify': 0.48.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-fs': 0.23.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-generic-pool': 0.47.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-graphql': 0.51.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-grpc': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-hapi': 0.50.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-http': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-ioredis': 0.51.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-kafkajs': 0.12.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-knex': 0.48.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-koa': 0.51.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-lru-memoizer': 0.48.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-memcached': 0.47.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mongodb': 0.56.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mongoose': 0.50.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mysql': 0.49.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mysql2': 0.49.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-nestjs-core': 0.49.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-net': 0.47.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-oracledb': 0.29.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-pg': 0.55.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-pino': 0.50.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-redis': 0.51.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-restify': 0.49.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-router': 0.48.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-runtime-node': 0.17.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-socket.io': 0.50.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-tedious': 0.22.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-undici': 0.14.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-winston': 0.48.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resource-detector-alibaba-cloud': 0.31.3(@opentelemetry/api@1.9.0) + '@opentelemetry/resource-detector-aws': 2.3.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resource-detector-azure': 0.10.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resource-detector-container': 0.7.3(@opentelemetry/api@1.9.0) + '@opentelemetry/resource-detector-gcp': 0.37.0(@opentelemetry/api@1.9.0)(encoding@0.1.13) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-node': 0.203.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - encoding + - supports-color + '@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 + '@opentelemetry/context-async-hooks@2.0.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/semantic-conventions': 1.28.0 + '@opentelemetry/core@2.0.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/semantic-conventions': 1.36.0 + + '@opentelemetry/exporter-logs-otlp-grpc@0.203.0(@opentelemetry/api@1.9.0)': + dependencies: + '@grpc/grpc-js': 1.13.4 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-grpc-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.203.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-logs-otlp-http@0.203.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.203.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.203.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-logs-otlp-proto@0.203.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.203.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-metrics-otlp-grpc@0.203.0(@opentelemetry/api@1.9.0)': + dependencies: + '@grpc/grpc-js': 1.13.4 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-metrics-otlp-http': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-grpc-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-metrics-otlp-http@0.203.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-metrics-otlp-proto@0.203.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-metrics-otlp-http': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-prometheus@0.203.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-trace-otlp-grpc@0.203.0(@opentelemetry/api@1.9.0)': + dependencies: + '@grpc/grpc-js': 1.13.4 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-grpc-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-trace-otlp-http@0.203.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-zipkin@2.0.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.36.0 + '@opentelemetry/instrumentation-amqplib@0.46.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -5922,6 +6672,51 @@ snapshots: transitivePeerDependencies: - supports-color + '@opentelemetry/instrumentation-amqplib@0.50.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.36.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-aws-lambda@0.54.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.36.0 + '@types/aws-lambda': 8.10.150 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-aws-sdk@0.56.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/propagation-utils': 0.31.3(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.36.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-bunyan@0.49.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.203.0 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@types/bunyan': 1.8.11 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-cassandra-driver@0.49.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.36.0 + transitivePeerDependencies: + - supports-color + '@opentelemetry/instrumentation-connect@0.43.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -5932,6 +6727,24 @@ snapshots: transitivePeerDependencies: - supports-color + '@opentelemetry/instrumentation-connect@0.47.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.36.0 + '@types/connect': 3.4.38 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-cucumber@0.18.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.36.0 + transitivePeerDependencies: + - supports-color + '@opentelemetry/instrumentation-dataloader@0.16.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -5939,6 +6752,20 @@ snapshots: transitivePeerDependencies: - supports-color + '@opentelemetry/instrumentation-dataloader@0.21.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-dns@0.47.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + '@opentelemetry/instrumentation-express@0.47.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -5948,6 +6775,24 @@ snapshots: transitivePeerDependencies: - supports-color + '@opentelemetry/instrumentation-express@0.52.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.36.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-fastify@0.48.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.36.0 + transitivePeerDependencies: + - supports-color + '@opentelemetry/instrumentation-fs@0.19.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -5956,6 +6801,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@opentelemetry/instrumentation-fs@0.23.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + '@opentelemetry/instrumentation-generic-pool@0.43.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -5963,6 +6816,13 @@ snapshots: transitivePeerDependencies: - supports-color + '@opentelemetry/instrumentation-generic-pool@0.47.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + '@opentelemetry/instrumentation-graphql@0.47.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -5970,6 +6830,21 @@ snapshots: transitivePeerDependencies: - supports-color + '@opentelemetry/instrumentation-graphql@0.51.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-grpc@0.203.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.36.0 + transitivePeerDependencies: + - supports-color + '@opentelemetry/instrumentation-hapi@0.45.2(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -5979,6 +6854,25 @@ snapshots: transitivePeerDependencies: - supports-color + '@opentelemetry/instrumentation-hapi@0.50.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.36.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-http@0.203.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.36.0 + forwarded-parse: 2.1.2 + transitivePeerDependencies: + - supports-color + '@opentelemetry/instrumentation-http@0.57.2(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -5999,6 +6893,23 @@ snapshots: transitivePeerDependencies: - supports-color + '@opentelemetry/instrumentation-ioredis@0.51.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/redis-common': 0.38.0 + '@opentelemetry/semantic-conventions': 1.36.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-kafkajs@0.12.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.36.0 + transitivePeerDependencies: + - supports-color + '@opentelemetry/instrumentation-kafkajs@0.7.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -6015,6 +6926,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@opentelemetry/instrumentation-knex@0.48.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.36.0 + transitivePeerDependencies: + - supports-color + '@opentelemetry/instrumentation-koa@0.47.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -6024,6 +6943,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@opentelemetry/instrumentation-koa@0.51.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.36.0 + transitivePeerDependencies: + - supports-color + '@opentelemetry/instrumentation-lru-memoizer@0.44.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -6031,6 +6959,22 @@ snapshots: transitivePeerDependencies: - supports-color + '@opentelemetry/instrumentation-lru-memoizer@0.48.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-memcached@0.47.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.36.0 + '@types/memcached': 2.2.10 + transitivePeerDependencies: + - supports-color + '@opentelemetry/instrumentation-mongodb@0.52.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -6039,6 +6983,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@opentelemetry/instrumentation-mongodb@0.56.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.36.0 + transitivePeerDependencies: + - supports-color + '@opentelemetry/instrumentation-mongoose@0.46.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -6048,6 +7000,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@opentelemetry/instrumentation-mongoose@0.50.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.36.0 + transitivePeerDependencies: + - supports-color + '@opentelemetry/instrumentation-mysql2@0.45.2(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -6057,6 +7018,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@opentelemetry/instrumentation-mysql2@0.49.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.36.0 + '@opentelemetry/sql-common': 0.41.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + '@opentelemetry/instrumentation-mysql@0.45.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -6066,6 +7036,40 @@ snapshots: transitivePeerDependencies: - supports-color + '@opentelemetry/instrumentation-mysql@0.49.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.36.0 + '@types/mysql': 2.15.27 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-nestjs-core@0.49.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.36.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-net@0.47.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.36.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-oracledb@0.29.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.36.0 + '@types/oracledb': 6.5.2 + transitivePeerDependencies: + - supports-color + '@opentelemetry/instrumentation-pg@0.51.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -6078,6 +7082,27 @@ snapshots: transitivePeerDependencies: - supports-color + '@opentelemetry/instrumentation-pg@0.55.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.36.0 + '@opentelemetry/sql-common': 0.41.0(@opentelemetry/api@1.9.0) + '@types/pg': 8.15.4 + '@types/pg-pool': 2.0.6 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-pino@0.50.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.203.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + '@opentelemetry/instrumentation-redis-4@0.46.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -6087,6 +7112,47 @@ snapshots: transitivePeerDependencies: - supports-color + '@opentelemetry/instrumentation-redis@0.51.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/redis-common': 0.38.0 + '@opentelemetry/semantic-conventions': 1.36.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-restify@0.49.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.36.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-router@0.48.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.36.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-runtime-node@0.17.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-socket.io@0.50.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.36.0 + transitivePeerDependencies: + - supports-color + '@opentelemetry/instrumentation-tedious@0.18.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -6096,6 +7162,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@opentelemetry/instrumentation-tedious@0.22.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.36.0 + '@types/tedious': 4.0.14 + transitivePeerDependencies: + - supports-color + '@opentelemetry/instrumentation-undici@0.10.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -6104,6 +7179,31 @@ snapshots: transitivePeerDependencies: - supports-color + '@opentelemetry/instrumentation-undici@0.14.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-winston@0.48.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.203.0 + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation@0.203.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.203.0 + import-in-the-middle: 1.14.2 + require-in-the-middle: 7.3.0 + transitivePeerDependencies: + - supports-color + '@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -6116,14 +7216,141 @@ snapshots: transitivePeerDependencies: - supports-color + '@opentelemetry/otlp-exporter-base@0.203.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/otlp-grpc-exporter-base@0.203.0(@opentelemetry/api@1.9.0)': + dependencies: + '@grpc/grpc-js': 1.13.4 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/otlp-transformer@0.203.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.203.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) + protobufjs: 7.5.3 + + '@opentelemetry/propagation-utils@0.31.3(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + + '@opentelemetry/propagator-b3@2.0.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/propagator-jaeger@2.0.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/redis-common@0.36.2': {} + '@opentelemetry/redis-common@0.38.0': {} + + '@opentelemetry/resource-detector-alibaba-cloud@0.31.3(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.36.0 + + '@opentelemetry/resource-detector-aws@2.3.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.36.0 + + '@opentelemetry/resource-detector-azure@0.10.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.36.0 + + '@opentelemetry/resource-detector-container@0.7.3(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.36.0 + + '@opentelemetry/resource-detector-gcp@0.37.0(@opentelemetry/api@1.9.0)(encoding@0.1.13)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.36.0 + gcp-metadata: 6.1.1(encoding@0.1.13) + transitivePeerDependencies: + - encoding + - supports-color + '@opentelemetry/resources@1.30.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.28.0 + '@opentelemetry/resources@2.0.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.36.0 + + '@opentelemetry/sdk-logs@0.203.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.203.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/sdk-metrics@2.0.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/sdk-node@0.203.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.203.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-logs-otlp-grpc': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-logs-otlp-http': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-logs-otlp-proto': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-metrics-otlp-grpc': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-metrics-otlp-http': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-metrics-otlp-proto': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-prometheus': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-trace-otlp-grpc': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-trace-otlp-http': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-trace-otlp-proto': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-zipkin': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/propagator-b3': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/propagator-jaeger': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-node': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.36.0 + transitivePeerDependencies: + - supports-color + '@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -6131,6 +7358,20 @@ snapshots: '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.28.0 + '@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.36.0 + + '@opentelemetry/sdk-trace-node@2.0.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/context-async-hooks': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions@1.28.0': {} '@opentelemetry/semantic-conventions@1.36.0': {} @@ -6140,6 +7381,11 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sql-common@0.41.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@paralleldrive/cuid2@2.2.2': dependencies: '@noble/hashes': 1.8.0 @@ -6162,6 +7408,29 @@ snapshots: transitivePeerDependencies: - supports-color + '@protobufjs/aspromise@1.1.2': {} + + '@protobufjs/base64@1.1.2': {} + + '@protobufjs/codegen@2.0.4': {} + + '@protobufjs/eventemitter@1.1.0': {} + + '@protobufjs/fetch@1.1.0': + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + + '@protobufjs/float@1.0.2': {} + + '@protobufjs/inquire@1.1.0': {} + + '@protobufjs/path@1.1.2': {} + + '@protobufjs/pool@1.1.0': {} + + '@protobufjs/utf8@1.1.0': {} + '@react-email/render@0.0.15': dependencies: html-to-text: 9.0.5 @@ -6691,6 +7960,8 @@ snapshots: '@tsconfig/recommended@1.0.6': {} + '@types/aws-lambda@8.10.150': {} + '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.24.6 @@ -6717,6 +7988,10 @@ snapshots: '@types/connect': 3.4.38 '@types/node': 20.14.1 + '@types/bunyan@1.8.11': + dependencies: + '@types/node': 20.14.1 + '@types/caseless@0.12.5': {} '@types/connect@3.4.38': @@ -6778,6 +8053,10 @@ snapshots: '@types/lodash@4.17.14': {} + '@types/memcached@2.2.10': + dependencies: + '@types/node': 20.14.1 + '@types/methods@1.1.4': {} '@types/mime@1.3.5': {} @@ -6786,6 +8065,10 @@ snapshots: dependencies: '@types/node': 20.14.1 + '@types/mysql@2.15.27': + dependencies: + '@types/node': 20.14.1 + '@types/node-fetch@2.6.11': dependencies: '@types/node': 20.14.1 @@ -6799,12 +8082,22 @@ snapshots: dependencies: undici-types: 5.26.5 + '@types/oracledb@6.5.2': + dependencies: + '@types/node': 20.14.1 + '@types/pdf-parse@1.1.4': {} '@types/pg-pool@2.0.6': dependencies: '@types/pg': 8.6.1 + '@types/pg@8.15.4': + dependencies: + '@types/node': 20.14.1 + pg-protocol: 1.6.1 + pg-types: 2.2.0 + '@types/pg@8.6.1': dependencies: '@types/node': 20.14.1 @@ -8564,6 +9857,20 @@ snapshots: kuler@2.0.0: {} + langfuse-core@3.38.4: + dependencies: + mustache: 4.2.0 + + langfuse-vercel@3.38.4(ai@4.3.5(react@18.3.1)(zod@3.24.2)): + dependencies: + ai: 4.3.5(react@18.3.1)(zod@3.24.2) + langfuse: 3.38.4 + langfuse-core: 3.38.4 + + langfuse@3.38.4: + dependencies: + langfuse-core: 3.38.4 + languagedetect@2.0.0: {} leac@0.6.0: {} @@ -8580,6 +9887,8 @@ snapshots: dependencies: p-locate: 4.1.0 + lodash.camelcase@4.3.0: {} + lodash.defaults@4.2.0: {} lodash.isarguments@3.1.0: {} @@ -8614,6 +9923,8 @@ snapshots: transitivePeerDependencies: - encoding + long@5.3.2: {} + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 @@ -8749,6 +10060,8 @@ snapshots: optionalDependencies: msgpackr-extract: 3.0.3 + mustache@4.2.0: {} + nanoid@3.3.8: {} natural-compare@1.4.0: {} @@ -8836,6 +10149,11 @@ snapshots: dependencies: mimic-fn: 2.1.0 + openai@5.12.0(ws@8.18.0)(zod@3.24.2): + optionalDependencies: + ws: 8.18.0 + zod: 3.24.2 + option@0.2.4: {} p-limit@2.3.0: @@ -8988,6 +10306,21 @@ snapshots: proto-list@1.2.4: {} + protobufjs@7.5.3: + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 20.14.1 + long: 5.3.2 + proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 diff --git a/apps/api/src/index.ts b/apps/api/src/index.ts index 2bed3cc71..3ff680558 100644 --- a/apps/api/src/index.ts +++ b/apps/api/src/index.ts @@ -27,6 +27,9 @@ import { RateLimiterMode } from "./types"; import { attachWsProxy } from "./services/agentLivecastWS"; import { cacheableLookup } from "./scraper/scrapeURL/lib/cacheableLookup"; import domainFrequencyRouter from "./routes/domain-frequency"; +import { NodeSDK } from "@opentelemetry/sdk-node"; +import { LangfuseExporter } from "langfuse-vercel"; +import { getNodeAutoInstrumentations } from "@opentelemetry/auto-instrumentations-node"; const { createBullBoard } = require("@bull-board/api"); const { BullMQAdapter } = require('@bull-board/api/bullMQAdapter'); @@ -39,6 +42,14 @@ logger.info(`Number of CPUs: ${numCPUs} available`); cacheableLookup.install(http.globalAgent); cacheableLookup.install(https.globalAgent); +const langfuseOtel = process.env.LANGFUSE_PUBLIC_KEY ? new NodeSDK({ + traceExporter: new LangfuseExporter(), + instrumentations: [getNodeAutoInstrumentations()] +}) : null; +if (langfuseOtel) { + langfuseOtel.start(); +} + // Initialize Express with WebSocket support const expressApp = express(); const ws = expressWs(expressApp); @@ -106,7 +117,13 @@ function startServer(port = DEFAULT_PORT) { } server.close(() => { logger.info("Server closed."); - process.exit(0); + if (langfuseOtel) { + langfuseOtel.shutdown().then(() => { + process.exit(0); + }); + } else { + process.exit(0); + } }); }; diff --git a/apps/api/src/lib/deep-research/deep-research-service.ts b/apps/api/src/lib/deep-research/deep-research-service.ts index 0f44bcebc..3c212c424 100644 --- a/apps/api/src/lib/deep-research/deep-research-service.ts +++ b/apps/api/src/lib/deep-research/deep-research-service.ts @@ -93,6 +93,11 @@ export async function performDeepResearch(options: DeepResearchServiceOptions) { nextSearchTopic, state.getFindings(), costTracking, + { + teamId, + functionId: "performDeepResearch/nextSearchTopic", + deepResearchId: researchId, + }, ) ).slice(0, 3); @@ -246,6 +251,11 @@ export async function performDeepResearch(options: DeepResearchServiceOptions) { timeRemaining, options.systemPrompt ?? "", costTracking, + { + teamId, + functionId: "performDeepResearch/analysisPhase", + deepResearchId: researchId, + }, ); if (checkTimeLimit()) { @@ -321,6 +331,11 @@ export async function performDeepResearch(options: DeepResearchServiceOptions) { state.getSummaries(), options.analysisPrompt, costTracking, + { + teamId, + functionId: "performDeepResearch/finalAnalysisJson", + deepResearchId: researchId, + }, options.formats, options.jsonOptions, ); @@ -332,6 +347,12 @@ export async function performDeepResearch(options: DeepResearchServiceOptions) { state.getSummaries(), options.analysisPrompt, costTracking, + { + teamId, + functionId: "performDeepResearch/finalAnalysisMarkdown", + deepResearchId: researchId, + }, + options.formats, ); } diff --git a/apps/api/src/lib/deep-research/research-manager.ts b/apps/api/src/lib/deep-research/research-manager.ts index 0f9618a99..6633e193b 100644 --- a/apps/api/src/lib/deep-research/research-manager.ts +++ b/apps/api/src/lib/deep-research/research-manager.ts @@ -154,6 +154,7 @@ export class ResearchLLMService { topic: string, findings: DeepResearchFinding[] = [], costTracking: CostTracking, + metadata: { teamId: string, functionId?: string, deepResearchId?: string }, ): Promise<{ query: string; researchGoal: string }[]> { const { extract } = await generateCompletions({ logger: this.logger.child({ @@ -203,6 +204,10 @@ export class ResearchLLMService { method: "generateSearchQueries", }, }, + metadata: { + ...metadata, + functionId: metadata.functionId ? (metadata.functionId + "/generateSearchQueries") : "generateSearchQueries", + }, }); return extract.queries; @@ -214,6 +219,7 @@ export class ResearchLLMService { timeRemaining: number, systemPrompt: string, costTracking: CostTracking, + metadata: { teamId: string, functionId?: string, deepResearchId?: string }, ): Promise { try { const timeRemainingMinutes = @@ -263,6 +269,10 @@ export class ResearchLLMService { method: "analyzeAndPlan", }, }, + metadata: { + ...metadata, + functionId: metadata.functionId ? (metadata.functionId + "/analyzeAndPlan") : "analyzeAndPlan", + }, }); return extract.analysis; @@ -278,6 +288,7 @@ export class ResearchLLMService { summaries: string[], analysisPrompt: string, costTracking: CostTracking, + metadata: { teamId: string, functionId?: string, deepResearchId?: string }, formats?: string[], jsonOptions?: ExtractOptions, ): Promise { @@ -337,6 +348,10 @@ export class ResearchLLMService { method: "generateFinalAnalysis", }, }, + metadata: { + ...metadata, + functionId: metadata.functionId ? (metadata.functionId + "/generateFinalAnalysis") : "generateFinalAnalysis", + }, }); return extract; diff --git a/apps/api/src/lib/extract/completions/analyzeSchemaAndPrompt.ts b/apps/api/src/lib/extract/completions/analyzeSchemaAndPrompt.ts index 922ebeb97..bf169f54e 100644 --- a/apps/api/src/lib/extract/completions/analyzeSchemaAndPrompt.ts +++ b/apps/api/src/lib/extract/completions/analyzeSchemaAndPrompt.ts @@ -8,7 +8,6 @@ import { buildAnalyzeSchemaPrompt, buildAnalyzeSchemaUserPrompt, } from "../build-prompts"; -import { jsonSchema } from "ai"; import { getModel } from "../../../lib/generic-ai"; import { Logger } from "winston"; import { CostTracking } from "../extraction-service"; @@ -18,6 +17,7 @@ export async function analyzeSchemaAndPrompt( prompt: string, logger: Logger, costTracking: CostTracking, + metadata: { teamId: string, functionId?: string, extractId?: string, scrapeId?: string, deepResearchId?: string }, ): Promise<{ isMultiEntity: boolean; multiEntityKeys: string[]; @@ -26,7 +26,10 @@ export async function analyzeSchemaAndPrompt( tokenUsage: TokenUsage; }> { if (!schema) { - const genRes = await generateSchemaFromPrompt(prompt, logger, costTracking); + const genRes = await generateSchemaFromPrompt(prompt, logger, costTracking, { + ...metadata, + functionId: metadata.functionId ? (metadata.functionId + "/analyzeSchemaAndPrompt") : "analyzeSchemaAndPrompt", + }); schema = genRes.extract; } @@ -59,11 +62,15 @@ export async function analyzeSchemaAndPrompt( model, costTrackingOptions: { costTracking, - metadata: { + metadata: { module: "extract", method: "analyzeSchemaAndPrompt", }, }, + metadata: { + ...metadata, + functionId: metadata.functionId ? (metadata.functionId + "/analyzeSchemaAndPrompt") : "analyzeSchemaAndPrompt", + }, }); const { isMultiEntity, multiEntityKeys, reasoning, keyIndicators } = diff --git a/apps/api/src/lib/extract/completions/batchExtract.ts b/apps/api/src/lib/extract/completions/batchExtract.ts index e6c71211e..64587af65 100644 --- a/apps/api/src/lib/extract/completions/batchExtract.ts +++ b/apps/api/src/lib/extract/completions/batchExtract.ts @@ -25,6 +25,7 @@ type BatchExtractOptions = { extractId?: string; sessionId?: string; costTracking: CostTracking; + metadata: { teamId: string, functionId?: string, extractId?: string, scrapeId?: string }; }; /** @@ -56,7 +57,9 @@ export async function batchExtractPromise(options: BatchExtractOptions, logger: doc, useAgent, extractId, - sessionId } = options; + sessionId, + metadata, + } = options; const generationOptions: GenerateCompletionsOptions = { logger: logger.child({ @@ -83,6 +86,10 @@ export async function batchExtractPromise(options: BatchExtractOptions, logger: method: "batchExtractPromise", }, }, + metadata: { + ...metadata, + functionId: metadata.functionId ? (metadata.functionId + "/batchExtractPromise") : "batchExtractPromise", + }, }; let extractedDataArray: any[] = []; @@ -98,6 +105,10 @@ export async function batchExtractPromise(options: BatchExtractOptions, logger: useAgent, extractId, sessionId, + metadata: { + ...metadata, + functionId: metadata.functionId ? (metadata.functionId + "/batchExtractPromise") : "batchExtractPromise", + }, }); extractedDataArray = e; warning = w; diff --git a/apps/api/src/lib/extract/completions/checkShouldExtract.ts b/apps/api/src/lib/extract/completions/checkShouldExtract.ts index 6f678ee83..ffd92032e 100644 --- a/apps/api/src/lib/extract/completions/checkShouldExtract.ts +++ b/apps/api/src/lib/extract/completions/checkShouldExtract.ts @@ -14,6 +14,7 @@ export async function checkShouldExtract( multiEntitySchema: any, doc: Document, costTracking: CostTracking, + metadata: { teamId: string, functionId?: string, extractId?: string, scrapeId?: string, deepResearchId?: string }, ): Promise<{ tokenUsage: TokenUsage; extract: boolean; }> { const shouldExtractCheck = await generateCompletions({ logger: logger.child({ method: "extractService/checkShouldExtract" }), @@ -41,6 +42,10 @@ export async function checkShouldExtract( method: "checkShouldExtract", }, }, + metadata: { + ...metadata, + functionId: metadata.functionId ? (metadata.functionId + "/checkShouldExtract") : "checkShouldExtract", + }, }); return { diff --git a/apps/api/src/lib/extract/completions/singleAnswer.ts b/apps/api/src/lib/extract/completions/singleAnswer.ts index 7260c1c48..c59f26b86 100644 --- a/apps/api/src/lib/extract/completions/singleAnswer.ts +++ b/apps/api/src/lib/extract/completions/singleAnswer.ts @@ -19,6 +19,7 @@ export async function singleAnswerCompletion({ extractId, sessionId, costTracking, + metadata, }: { singleAnswerDocs: Document[]; rSchema: any; @@ -29,6 +30,7 @@ export async function singleAnswerCompletion({ extractId: string; sessionId: string; costTracking: CostTracking; + metadata: { teamId: string, functionId?: string, extractId?: string, scrapeId?: string }; }): Promise<{ extract: any; tokenUsage: TokenUsage; @@ -60,6 +62,10 @@ export async function singleAnswerCompletion({ method: "singleAnswerCompletion", }, }, + metadata: { + ...metadata, + functionId: metadata.functionId ? (metadata.functionId + "/singleAnswerCompletion") : "singleAnswerCompletion", + }, }; const { extractedDataArray, warning } = await extractData({ @@ -68,6 +74,10 @@ export async function singleAnswerCompletion({ useAgent, extractId, sessionId, + metadata: { + ...metadata, + functionId: metadata.functionId ? (metadata.functionId + "/singleAnswerCompletion") : "singleAnswerCompletion", + }, }); const completion = { diff --git a/apps/api/src/lib/extract/extraction-service.ts b/apps/api/src/lib/extract/extraction-service.ts index 6f60d695d..8c2eb3801 100644 --- a/apps/api/src/lib/extract/extraction-service.ts +++ b/apps/api/src/lib/extract/extraction-service.ts @@ -38,6 +38,8 @@ import { search } from "../../search"; import { buildRephraseToSerpPrompt } from "./build-prompts"; import { getACUCTeam } from "../../controllers/auth"; import { isUrlBlocked } from "../../scraper/WebScraper/utils/blocklist"; +import { langfuse } from "../../services/langfuse"; + interface ExtractServiceOptions { request: ExtractRequest; teamId: string; @@ -149,6 +151,16 @@ export async function performExtraction( teamId, }); + langfuse.trace({ + id: "extract:" + extractId, + name: "performExtraction", + metadata: { + teamId, + extractId, + model: "fire-1", + }, + }); + try { // If no URLs are provided, generate URLs from the prompt @@ -159,6 +171,7 @@ export async function performExtraction( const rephrasedPrompt = await generateBasicCompletion( buildRephraseToSerpPrompt(request.prompt), costTracking, + { teamId, extractId }, ); let rptxt = rephrasedPrompt?.text.replace('"', "").replace("'", "") || ""; const searchResults = await search({ @@ -244,7 +257,11 @@ export async function performExtraction( let reqSchema = request.schema; if (!reqSchema && request.prompt) { - const schemaGenRes = await generateSchemaFromPrompt(request.prompt, logger, costTracking); + const schemaGenRes = await generateSchemaFromPrompt(request.prompt, logger, costTracking, { + teamId, + functionId: "performExtraction/generateRequestSchema", + extractId, + }); reqSchema = schemaGenRes.extract; @@ -277,7 +294,11 @@ export async function performExtraction( reasoning, keyIndicators, tokenUsage: schemaAnalysisTokenUsage, - } = await analyzeSchemaAndPrompt(urls, reqSchema, request.prompt ?? "", logger, costTracking); + } = await analyzeSchemaAndPrompt(urls, reqSchema, request.prompt ?? "", logger, costTracking, { + teamId, + functionId: "performExtraction", + extractId, + }); logger.debug("Analyzed schema.", { isMultiEntity, @@ -310,6 +331,7 @@ export async function performExtraction( reasoning, multiEntityKeys, keyIndicators, + extractId, }, urlTraces, (links: string[]) => { @@ -510,6 +532,11 @@ export async function performExtraction( extractId, sessionId, costTracking, + metadata: { + teamId, + functionId: "performExtraction/multiEntity", + extractId, + }, }, logger); // Race between timeout and completion @@ -885,6 +912,11 @@ export async function performExtraction( extractId, sessionId: thisSessionId, costTracking, + metadata: { + teamId, + functionId: "performExtraction", + extractId, + }, }); logger.debug("Done generating singleAnswer completions."); diff --git a/apps/api/src/lib/extract/fire-0/completions/analyzeSchemaAndPrompt-f0.ts b/apps/api/src/lib/extract/fire-0/completions/analyzeSchemaAndPrompt-f0.ts index 5121da741..88d847120 100644 --- a/apps/api/src/lib/extract/fire-0/completions/analyzeSchemaAndPrompt-f0.ts +++ b/apps/api/src/lib/extract/fire-0/completions/analyzeSchemaAndPrompt-f0.ts @@ -16,6 +16,7 @@ export async function analyzeSchemaAndPrompt_F0( urls: string[], schema: any, prompt: string, + metadata: { teamId: string, extractId?: string } ): Promise<{ isMultiEntity: boolean; multiEntityKeys: string[]; @@ -24,7 +25,7 @@ export async function analyzeSchemaAndPrompt_F0( tokenUsage: TokenUsage; }> { if (!schema) { - schema = await generateSchemaFromPrompt_F0(prompt); + schema = await generateSchemaFromPrompt_F0(prompt, metadata); } const schemaString = JSON.stringify(schema); @@ -54,6 +55,7 @@ export async function analyzeSchemaAndPrompt_F0( }, markdown: "", model, + metadata, }); const { isMultiEntity, multiEntityKeys, reasoning, keyIndicators } = diff --git a/apps/api/src/lib/extract/fire-0/completions/batchExtract-f0.ts b/apps/api/src/lib/extract/fire-0/completions/batchExtract-f0.ts index 1358abb8f..d3a3dfb8f 100644 --- a/apps/api/src/lib/extract/fire-0/completions/batchExtract-f0.ts +++ b/apps/api/src/lib/extract/fire-0/completions/batchExtract-f0.ts @@ -20,6 +20,7 @@ export async function batchExtractPromise_F0( prompt: string, systemPrompt: string, doc: Document, + metadata: { teamId: string, functionId?: string, extractId?: string, scrapeId?: string } ): Promise<{ extract: any; numTokens: number; @@ -42,7 +43,11 @@ export async function batchExtractPromise_F0( schema: multiEntitySchema, }, markdown: buildDocument_F0(doc), - isExtractEndpoint: true + isExtractEndpoint: true, + metadata: { + ...metadata, + functionId: metadata.functionId ? (metadata.functionId + "/batchExtractPromise_F0") : "batchExtractPromise_F0", + } }); return { diff --git a/apps/api/src/lib/extract/fire-0/completions/checkShouldExtract-f0.ts b/apps/api/src/lib/extract/fire-0/completions/checkShouldExtract-f0.ts index 39c7c7719..72996be17 100644 --- a/apps/api/src/lib/extract/fire-0/completions/checkShouldExtract-f0.ts +++ b/apps/api/src/lib/extract/fire-0/completions/checkShouldExtract-f0.ts @@ -10,6 +10,7 @@ export async function checkShouldExtract_F0( prompt: string, multiEntitySchema: any, doc: Document, + metadata: { teamId: string, functionId?: string, extractId?: string, scrapeId?: string } ): Promise<{ tokenUsage: TokenUsage; extract: boolean }> { const shouldExtractCheck = await generateCompletions_F0({ logger: logger.child({ method: "extractService/checkShouldExtract" }), @@ -30,6 +31,10 @@ export async function checkShouldExtract_F0( markdown: buildDocument(doc), isExtractEndpoint: true, model: getModel("gpt-4o-mini"), + metadata: { + ...metadata, + functionId: metadata.functionId ? (metadata.functionId + "/checkShouldExtract_F0") : "checkShouldExtract_F0", + } }); return { diff --git a/apps/api/src/lib/extract/fire-0/completions/singleAnswer-f0.ts b/apps/api/src/lib/extract/fire-0/completions/singleAnswer-f0.ts index 4b60778e1..d4b315f26 100644 --- a/apps/api/src/lib/extract/fire-0/completions/singleAnswer-f0.ts +++ b/apps/api/src/lib/extract/fire-0/completions/singleAnswer-f0.ts @@ -9,12 +9,14 @@ export async function singleAnswerCompletion_F0({ links, prompt, systemPrompt, + metadata, }: { singleAnswerDocs: Document[]; rSchema: any; links: string[]; prompt: string; systemPrompt: string; + metadata: { teamId: string, functionId?: string, extractId?: string, scrapeId?: string }; }): Promise<{ extract: any; tokenUsage: TokenUsage; @@ -32,7 +34,11 @@ export async function singleAnswerCompletion_F0({ schema: rSchema, }, markdown: singleAnswerDocs.map((x) => buildDocument_F0(x)).join("\n"), - isExtractEndpoint: true + isExtractEndpoint: true, + metadata: { + ...metadata, + functionId: metadata.functionId ? (metadata.functionId + "/singleAnswerCompletion_F0") : "singleAnswerCompletion_F0", + } }); return { extract: completion.extract, diff --git a/apps/api/src/lib/extract/fire-0/extraction-service-f0.ts b/apps/api/src/lib/extract/fire-0/extraction-service-f0.ts index e35ca6d10..f03de5cc4 100644 --- a/apps/api/src/lib/extract/fire-0/extraction-service-f0.ts +++ b/apps/api/src/lib/extract/fire-0/extraction-service-f0.ts @@ -33,6 +33,7 @@ import { singleAnswerCompletion_F0 } from "./completions/singleAnswer-f0"; import { calculateFinalResultCost_F0, estimateTotalCost_F0 } from "./usage/llm-cost-f0"; import { SourceTracker_F0 } from "./helpers/source-tracker-f0"; import { getACUCTeam } from "../../../controllers/auth"; +import { langfuse } from "../../../services/langfuse"; interface ExtractServiceOptions { @@ -88,13 +89,23 @@ import { getACUCTeam } from "../../../controllers/auth"; extractId, teamId, }); + + langfuse.trace({ + id: "extract:" + extractId, + name: "performExtraction", + metadata: { + teamId, + extractId, + model: "fire-0", + }, + }); // If no URLs are provided, generate URLs from the prompt if ((!request.urls || request.urls.length === 0) && request.prompt) { logger.debug("Generating URLs from prompt...", { prompt: request.prompt, }); - const rephrasedPrompt = await generateBasicCompletion_FO(buildRephraseToSerpPrompt_F0(request.prompt)); + const rephrasedPrompt = await generateBasicCompletion_FO(buildRephraseToSerpPrompt_F0(request.prompt), { teamId, extractId }); const searchResults = await search({ query: rephrasedPrompt.replace('"', "").replace("'", ""), num_results: 10, @@ -179,6 +190,7 @@ import { getACUCTeam } from "../../../controllers/auth"; limit: request.limit, includeSubdomains: request.includeSubdomains, schema: request.schema, + extractId, }, urlTraces, (links: string[]) => { @@ -251,7 +263,7 @@ import { getACUCTeam } from "../../../controllers/auth"; let reqSchema = request.schema; if (!reqSchema && request.prompt) { - reqSchema = await generateSchemaFromPrompt_F0(request.prompt); + reqSchema = await generateSchemaFromPrompt_F0(request.prompt, { teamId, extractId }); logger.debug("Generated request schema.", { originalSchema: request.schema, schema: reqSchema, @@ -279,7 +291,7 @@ import { getACUCTeam } from "../../../controllers/auth"; reasoning, keyIndicators, tokenUsage: schemaAnalysisTokenUsage, - } = await analyzeSchemaAndPrompt_F0(links, reqSchema, request.prompt ?? ""); + } = await analyzeSchemaAndPrompt_F0(links, reqSchema, request.prompt ?? "", { teamId, extractId }); logger.debug("Analyzed schema.", { isMultiEntity, @@ -423,6 +435,7 @@ import { getACUCTeam } from "../../../controllers/auth"; request.prompt ?? "", multiEntitySchema, doc, + { teamId, extractId, functionId: "performExtraction_F0" } ); tokenUsage.push(shouldExtractCheckTokenUsage); @@ -464,7 +477,7 @@ import { getACUCTeam } from "../../../controllers/auth"; ], }); - const completionPromise = batchExtractPromise_F0(multiEntitySchema, links, request.prompt ?? "", request.systemPrompt ?? "", doc); + const completionPromise = batchExtractPromise_F0(multiEntitySchema, links, request.prompt ?? "", request.systemPrompt ?? "", doc, { teamId, extractId, functionId: "performExtraction_F0" }); // Race between timeout and completion const multiEntityCompletion = (await Promise.race([ @@ -736,7 +749,8 @@ import { getACUCTeam } from "../../../controllers/auth"; rSchema, links, prompt: request.prompt ?? "", - systemPrompt: request.systemPrompt ?? "" + systemPrompt: request.systemPrompt ?? "", + metadata: { teamId, extractId, functionId: "performExtraction_F0" } }); logger.debug("Done generating singleAnswer completions."); diff --git a/apps/api/src/lib/extract/fire-0/llmExtract-f0.ts b/apps/api/src/lib/extract/fire-0/llmExtract-f0.ts index efe82d4bc..191f7bd7c 100644 --- a/apps/api/src/lib/extract/fire-0/llmExtract-f0.ts +++ b/apps/api/src/lib/extract/fire-0/llmExtract-f0.ts @@ -157,6 +157,7 @@ export async function generateCompletions_F0({ isExtractEndpoint, model = getModel("gpt-4o-mini"), mode = "object", + metadata, }: { model?: LanguageModel; logger: Logger; @@ -165,6 +166,7 @@ export async function generateCompletions_F0({ previousWarning?: string; isExtractEndpoint?: boolean; mode?: "object" | "no-object"; + metadata: { teamId: string, functionId?: string, extractId?: string, scrapeId?: string }; }): Promise<{ extract: any; numTokens: number; @@ -205,6 +207,15 @@ export async function generateCompletions_F0({ prompt: options.prompt + (markdown ? `\n\nData:${markdown}` : ""), temperature: options.temperature ?? 0, system: options.systemPrompt, + experimental_telemetry: { + isEnabled: true, + functionId: metadata.functionId, + metadata: { + teamId: metadata.teamId, + ...(metadata.extractId ? { langfuseTraceId: "extract:" + metadata.extractId, extractId: metadata.extractId } : {}), + ...(metadata.scrapeId ? { langfuseTraceId: "scrape:" + metadata.scrapeId, scrapeId: metadata.scrapeId } : {}), + } + } }); extract = result.text; @@ -279,7 +290,16 @@ export async function generateCompletions_F0({ const { text: fixedText } = await generateText({ model: model, prompt: `Fix this JSON that had the following error: ${error}\n\nOriginal text:\n${text}\n\nReturn only the fixed JSON, no explanation.`, - system: "You are a JSON repair expert. Your only job is to fix malformed JSON and return valid JSON that matches the original structure and intent as closely as possible. Do not include any explanation or commentary - only return the fixed JSON. Do not return it in a Markdown code block, just plain JSON." + system: "You are a JSON repair expert. Your only job is to fix malformed JSON and return valid JSON that matches the original structure and intent as closely as possible. Do not include any explanation or commentary - only return the fixed JSON. Do not return it in a Markdown code block, just plain JSON.", + experimental_telemetry: { + isEnabled: true, + functionId: metadata.functionId, + metadata: { + teamId: metadata.teamId, + ...(metadata.extractId ? { langfuseTraceId: "extract:" + metadata.extractId, extractId: metadata.extractId } : {}), + ...(metadata.scrapeId ? { langfuseTraceId: "scrape:" + metadata.scrapeId, scrapeId: metadata.scrapeId } : {}), + } + } }); return fixedText; } @@ -297,7 +317,16 @@ export async function generateCompletions_F0({ onError: (error: Error) => { console.error(error); } - }) + }), + experimental_telemetry: { + isEnabled: true, + functionId: metadata.functionId, + metadata: { + teamId: metadata.teamId, + ...(metadata.extractId ? { langfuseTraceId: "extract:" + metadata.extractId, extractId: metadata.extractId } : {}), + ...(metadata.scrapeId ? { langfuseTraceId: "scrape:" + metadata.scrapeId, scrapeId: metadata.scrapeId } : {}), + } + } } satisfies Parameters[0]; const result = await generateObject(generateObjectConfig); @@ -348,7 +377,8 @@ export async function performLLMExtract( }), options: meta.options.extract!, markdown: document.markdown, - previousWarning: document.warning + previousWarning: document.warning, + metadata: { teamId: meta.internalOptions.teamId, functionId: "performLLMExtract", scrapeId: meta.id }, }); if (meta.options.formats.includes("json")) { @@ -408,7 +438,7 @@ export function removeDefaultProperty_F0(schema: any): any { return rest; } -export async function generateSchemaFromPrompt_F0(prompt: string): Promise { +export async function generateSchemaFromPrompt_F0(prompt: string, metadata: { teamId: string, functionId?: string, extractId?: string }): Promise { const model = getModel("gpt-4o"); const temperatures = [0, 0.1, 0.3]; // Different temperatures to try let lastError: Error | null = null; @@ -450,7 +480,11 @@ Return a valid JSON schema object with properties that would capture the informa prompt: `Generate a JSON schema for extracting the following information: ${prompt}`, temperature: temp }, - markdown: prompt + markdown: prompt, + metadata: { + ...metadata, + functionId: metadata.functionId ? (metadata.functionId + "/generateSchemaFromPrompt_F0") : "generateSchemaFromPrompt_F0", + }, }); return extract; diff --git a/apps/api/src/lib/extract/fire-0/ranker-f0.ts b/apps/api/src/lib/extract/fire-0/ranker-f0.ts index 4ab45291c..f55c452a0 100644 --- a/apps/api/src/lib/extract/fire-0/ranker-f0.ts +++ b/apps/api/src/lib/extract/fire-0/ranker-f0.ts @@ -4,10 +4,17 @@ import { getEmbeddingModel } from "../../../lib/generic-ai"; configDotenv(); -async function getEmbedding(text: string) { +async function getEmbedding(text: string, metadata: { teamId: string, extractId?: string }) { const { embedding } = await embed({ model: getEmbeddingModel("text-embedding-3-small"), value: text, + experimental_telemetry: { + isEnabled: true, + metadata: { + ...(metadata.extractId ? { langfuseTraceId: "extract:" + metadata.extractId, extractId: metadata.extractId } : {}), + teamId: metadata.teamId, + } + } }); return embedding; @@ -35,6 +42,7 @@ async function performRanking_F0( linksWithContext: string[], links: string[], searchQuery: string, + metadata: { teamId: string, extractId?: string } ) { try { // Handle invalid inputs @@ -46,12 +54,12 @@ async function performRanking_F0( const sanitizedQuery = searchQuery; // Generate embeddings for the search query - const queryEmbedding = await getEmbedding(sanitizedQuery); + const queryEmbedding = await getEmbedding(sanitizedQuery, metadata); // Generate embeddings for each link and calculate similarity in parallel const linksAndScores = await Promise.all( linksWithContext.map((linkWithContext, index) => - getEmbedding(linkWithContext) + getEmbedding(linkWithContext, metadata) .then((linkEmbedding) => { const score = cosineSimilarity(queryEmbedding, linkEmbedding); return { diff --git a/apps/api/src/lib/extract/fire-0/reranker-f0.ts b/apps/api/src/lib/extract/fire-0/reranker-f0.ts index 16ad1840c..c552f73b0 100644 --- a/apps/api/src/lib/extract/fire-0/reranker-f0.ts +++ b/apps/api/src/lib/extract/fire-0/reranker-f0.ts @@ -49,6 +49,7 @@ export async function rerankLinks_F0( searchQuery: string, urlTraces: URLTrace[], flags: TeamFlags, + metadata: { teamId: string, extractId?: string } ): Promise { // console.log("Going to rerank links"); const mappedLinksRerank = mappedLinks.map( @@ -59,6 +60,7 @@ export async function rerankLinks_F0( mappedLinksRerank, mappedLinks.map((l) => l.url), searchQuery, + metadata, ); // First try with high threshold @@ -168,10 +170,11 @@ export type RerankerOptions = { links: MapDocument[]; searchQuery: string; urlTraces: URLTrace[]; + metadata: { teamId: string, functionId?: string, extractId?: string, scrapeId?: string }; }; export async function rerankLinksWithLLM_F0(options: RerankerOptions, costTracking: CostTracking): Promise { - const { links, searchQuery, urlTraces } = options; + const { links, searchQuery, urlTraces, metadata } = options; const chunkSize = 100; const chunks: MapDocument[][] = []; const TIMEOUT_MS = 20000; @@ -243,6 +246,10 @@ export async function rerankLinksWithLLM_F0(options: RerankerOptions, costTracki method: "rerankLinksWithLLM", }, }, + metadata: { + ...metadata, + functionId: metadata.functionId ? (metadata.functionId + "/rerankLinksWithLLM_F0") : "rerankLinksWithLLM_F0", + } }); const completion = await Promise.race([ diff --git a/apps/api/src/lib/extract/fire-0/url-processor-f0.ts b/apps/api/src/lib/extract/fire-0/url-processor-f0.ts index 8fe5348d7..128fc5dbd 100644 --- a/apps/api/src/lib/extract/fire-0/url-processor-f0.ts +++ b/apps/api/src/lib/extract/fire-0/url-processor-f0.ts @@ -11,11 +11,18 @@ import { getModel } from "../../generic-ai"; import { CostTracking } from "../extraction-service"; import { getACUCTeam } from "../../../controllers/auth"; -export async function generateBasicCompletion_FO(prompt: string) { +export async function generateBasicCompletion_FO(prompt: string, metadata: { teamId: string, extractId?: string }) { const { text } = await generateText({ model: getModel("gpt-4o"), prompt: prompt, - temperature: 0 + temperature: 0, + experimental_telemetry: { + isEnabled: true, + metadata: { + ...(metadata.extractId ? { langfuseTraceId: "extract:" + metadata.extractId, extractId: metadata.extractId } : {}), + teamId: metadata.teamId, + } + } }); return text; } @@ -28,6 +35,7 @@ interface ProcessUrlOptions { origin?: string; limit?: number; includeSubdomains?: boolean; + extractId?: string; } export async function processUrl_F0( @@ -67,6 +75,7 @@ export async function processUrl_F0( ( await generateBasicCompletion_FO( buildRefrasedPrompt(options.prompt, baseUrl), + { teamId: options.teamId, extractId: options.extractId }, ) ) ?.replace('"', "") @@ -190,6 +199,7 @@ export async function processUrl_F0( rephrasedPrompt = (await generateBasicCompletion_FO( buildPreRerankPrompt(rephrasedPrompt, options.schema, baseUrl), + { teamId: options.teamId, extractId: options.extractId }, )) ?? "Extract the data according to the schema: " + JSON.stringify(options.schema, null, 2); @@ -216,6 +226,11 @@ export async function processUrl_F0( links: mappedLinks, searchQuery: rephrasedPrompt, urlTraces, + metadata: { + teamId: options.teamId, + functionId: "processUrl_F0", + extractId: options.extractId, + }, }, new CostTracking()); mappedLinks = rerankerResult.mapDocument; let tokensUsed = rerankerResult.tokensUsed; @@ -230,6 +245,11 @@ export async function processUrl_F0( links: mappedLinks, searchQuery: rephrasedPrompt, urlTraces, + metadata: { + teamId: options.teamId, + functionId: "processUrl_F0", + extractId: options.extractId, + }, }, new CostTracking()); mappedLinks = rerankerResult.mapDocument; tokensUsed += rerankerResult.tokensUsed; diff --git a/apps/api/src/lib/extract/reranker.ts b/apps/api/src/lib/extract/reranker.ts index 370924691..8b189db69 100644 --- a/apps/api/src/lib/extract/reranker.ts +++ b/apps/api/src/lib/extract/reranker.ts @@ -57,6 +57,7 @@ export async function rerankLinks( searchQuery: string, urlTraces: URLTrace[], flags: TeamFlags, + metadata: { teamId: string, extractId?: string } ): Promise { // console.log("Going to rerank links"); const mappedLinksRerank = mappedLinks.map( @@ -67,6 +68,7 @@ export async function rerankLinks( mappedLinksRerank, mappedLinks.map((l) => l.url), searchQuery, + metadata, ); // First try with high threshold @@ -182,6 +184,7 @@ export type RerankerOptions = { multiEntityKeys: string[]; keyIndicators: string[]; costTracking: CostTracking; + metadata: { teamId: string, functionId?: string, extractId?: string }; }; export async function rerankLinksWithLLM( @@ -195,6 +198,7 @@ export async function rerankLinksWithLLM( reasoning, multiEntityKeys, keyIndicators, + metadata, } = options; const chunkSize = 5000; const chunks: MapDocument[][] = []; @@ -327,6 +331,10 @@ export async function rerankLinksWithLLM( method: "rerankLinksWithLLM", }, }, + metadata: { + ...metadata, + functionId: metadata.functionId ? (metadata.functionId + "/rerankLinksWithLLM") : "rerankLinksWithLLM", + }, }); completion = await completionPromise; diff --git a/apps/api/src/lib/extract/url-processor.ts b/apps/api/src/lib/extract/url-processor.ts index 0197f455b..bad45f6ff 100644 --- a/apps/api/src/lib/extract/url-processor.ts +++ b/apps/api/src/lib/extract/url-processor.ts @@ -11,7 +11,7 @@ import { getModel } from "../generic-ai"; import { calculateCost } from "../../scraper/scrapeURL/transformers/llmExtract"; import type { CostTracking } from "./extraction-service"; -export async function generateBasicCompletion(prompt: string, costTracking: CostTracking): Promise<{ text: string } | null> { +export async function generateBasicCompletion(prompt: string, costTracking: CostTracking, metadata: { teamId: string, extractId?: string }): Promise<{ text: string } | null> { try { const result = await generateText({ model: getModel("gpt-4o", "openai"), @@ -20,6 +20,13 @@ export async function generateBasicCompletion(prompt: string, costTracking: Cost anthropic: { thinking: { type: "enabled", budgetTokens: 12000 }, }, + }, + experimental_telemetry: { + isEnabled: true, + metadata: { + ...(metadata.extractId ? { langfuseTraceId: "extract:" + metadata.extractId, extractId: metadata.extractId } : {}), + teamId: metadata.teamId, + } } }); costTracking.addCall({ @@ -47,6 +54,13 @@ export async function generateBasicCompletion(prompt: string, costTracking: Cost anthropic: { thinking: { type: "enabled", budgetTokens: 12000 }, }, + }, + experimental_telemetry: { + isEnabled: true, + metadata: { + ...(metadata.extractId ? { langfuseTraceId: "extract:" + metadata.extractId, extractId: metadata.extractId } : {}), + teamId: metadata.teamId, + } } }); costTracking.addCall({ @@ -85,6 +99,7 @@ interface ProcessUrlOptions { reasoning: string; multiEntityKeys: string[]; keyIndicators: string[]; + extractId?: string; } export async function processUrl( @@ -124,6 +139,7 @@ export async function processUrl( const res = await generateBasicCompletion( buildRefrasedPrompt(options.prompt, baseUrl), costTracking, + { teamId: options.teamId, extractId: options.extractId }, ); if (res) { @@ -251,6 +267,7 @@ export async function processUrl( const res = await generateBasicCompletion( buildPreRerankPrompt(rephrasedPrompt, options.schema, baseUrl), costTracking, + { teamId: options.teamId, extractId: options.extractId }, ); if (res) { @@ -288,6 +305,11 @@ export async function processUrl( multiEntityKeys: options.multiEntityKeys, keyIndicators: options.keyIndicators, costTracking, + metadata: { + teamId: options.teamId, + functionId: "processUrl/pass1", + extractId: options.extractId, + }, }); mappedLinks = rerankerResult.mapDocument; let tokensUsed = rerankerResult.tokensUsed; @@ -307,6 +329,11 @@ export async function processUrl( multiEntityKeys: options.multiEntityKeys, keyIndicators: options.keyIndicators, costTracking, + metadata: { + teamId: options.teamId, + functionId: "processUrl/pass2", + extractId: options.extractId, + }, }); mappedLinks = rerankerResult.mapDocument; tokensUsed += rerankerResult.tokensUsed; diff --git a/apps/api/src/lib/generate-llmstxt/generate-llmstxt-service.ts b/apps/api/src/lib/generate-llmstxt/generate-llmstxt-service.ts index 98c079f71..e3cacc6d0 100644 --- a/apps/api/src/lib/generate-llmstxt/generate-llmstxt-service.ts +++ b/apps/api/src/lib/generate-llmstxt/generate-llmstxt-service.ts @@ -180,6 +180,11 @@ export async function performGenerateLlmsTxt( method: "generateDescription", }, }, + metadata: { + teamId, + functionId: "generate-llmstxt", + llmsTxtId: generationId, + }, }); return { diff --git a/apps/api/src/lib/ranker.test.ts b/apps/api/src/lib/ranker.test.ts index b884c2fbf..1a06f4ad9 100644 --- a/apps/api/src/lib/ranker.test.ts +++ b/apps/api/src/lib/ranker.test.ts @@ -16,7 +16,7 @@ describe("performRanking", () => { const searchQuery = "cats training"; - const result = await performRanking(linksWithContext, links, searchQuery); + const result = await performRanking(linksWithContext, links, searchQuery, { teamId: "test-suite" }); // Should return array of objects with link, linkWithContext, score, originalIndex expect(result).toBeInstanceOf(Array); @@ -43,7 +43,7 @@ describe("performRanking", () => { }); it("should handle empty inputs", async () => { - const result = await performRanking([], [], ""); + const result = await performRanking([], [], "", { teamId: "test-suite" }); expect(result).toEqual([]); }); @@ -57,7 +57,7 @@ describe("performRanking", () => { const searchQuery = "test"; - const result = await performRanking(linksWithContext, links, searchQuery); + const result = await performRanking(linksWithContext, links, searchQuery, { teamId: "test-suite" }); // If scores are equal, original order should be maintained expect(result[0].originalIndex).toBeLessThan(result[1].originalIndex); diff --git a/apps/api/src/lib/ranker.ts b/apps/api/src/lib/ranker.ts index 01e5d6f45..828292c47 100644 --- a/apps/api/src/lib/ranker.ts +++ b/apps/api/src/lib/ranker.ts @@ -4,10 +4,17 @@ import { getEmbeddingModel } from "./generic-ai"; configDotenv(); -async function getEmbedding(text: string) { +async function getEmbedding(text: string, metadata: { teamId: string, extractId?: string }) { const { embedding } = await embed({ model: getEmbeddingModel("text-embedding-3-small"), value: text, + experimental_telemetry: { + isEnabled: true, + metadata: { + ...(metadata.extractId ? { langfuseTraceId: "extract:" + metadata.extractId, extractId: metadata.extractId } : {}), + teamId: metadata.teamId, + } + } }); return embedding; @@ -35,6 +42,7 @@ async function performRanking( linksWithContext: string[], links: string[], searchQuery: string, + metadata: { teamId: string, extractId?: string } ) { try { // Handle invalid inputs @@ -46,12 +54,12 @@ async function performRanking( const sanitizedQuery = searchQuery; // Generate embeddings for the search query - const queryEmbedding = await getEmbedding(sanitizedQuery); + const queryEmbedding = await getEmbedding(sanitizedQuery, metadata); // Generate embeddings for each link and calculate similarity in parallel const linksAndScores = await Promise.all( linksWithContext.map((linkWithContext, index) => - getEmbedding(linkWithContext) + getEmbedding(linkWithContext, metadata) .then((linkEmbedding) => { const score = cosineSimilarity(queryEmbedding, linkEmbedding); return { diff --git a/apps/api/src/scraper/scrapeURL/lib/extractSmartScrape.ts b/apps/api/src/scraper/scrapeURL/lib/extractSmartScrape.ts index 508e1dee6..45c53552e 100644 --- a/apps/api/src/scraper/scrapeURL/lib/extractSmartScrape.ts +++ b/apps/api/src/scraper/scrapeURL/lib/extractSmartScrape.ts @@ -214,6 +214,7 @@ export async function extractData({ extractId, sessionId, scrapeId, + metadata, }: { extractOptions: GenerateCompletionsOptions; urls: string[]; @@ -221,6 +222,7 @@ export async function extractData({ extractId?: string; sessionId?: string; scrapeId?: string; + metadata: { teamId: string, functionId?: string }; }): Promise<{ extractedDataArray: any[]; warning: any; @@ -233,7 +235,12 @@ export async function extractData({ // TODO: remove the "required" fields here!! it breaks o3-mini if (!schema && extractOptions.options.prompt) { - const genRes = await generateSchemaFromPrompt(extractOptions.options.prompt, logger, extractOptions.costTrackingOptions.costTracking); + const genRes = await generateSchemaFromPrompt(extractOptions.options.prompt, logger, extractOptions.costTrackingOptions.costTracking, { + ...metadata, + extractId, + scrapeId, + functionId: metadata.functionId ? (metadata.functionId + "/extractData") : "extractData", + }); schema = genRes.extract; } diff --git a/apps/api/src/scraper/scrapeURL/transformers/diff.ts b/apps/api/src/scraper/scrapeURL/transformers/diff.ts index d6f49cf59..50e9067f3 100644 --- a/apps/api/src/scraper/scrapeURL/transformers/diff.ts +++ b/apps/api/src/scraper/scrapeURL/transformers/diff.ts @@ -26,6 +26,11 @@ async function extractDataWithSchema(content: string, meta: Meta): Promise<{ ext method: "extractDataWithSchema", }, }, + metadata: { + teamId: meta.internalOptions.teamId, + functionId: "deriveDiff/extractDataWithSchema", + scrapeId: meta.id, + }, }); return { extract }; } catch (error) { @@ -183,6 +188,11 @@ export async function deriveDiff(meta: Meta, document: Document): Promise; }; + metadata: { teamId: string, functionId?: string, extractId?: string, scrapeId?: string, deepResearchId?: string, llmsTxtId?: string }; }; export async function generateCompletions({ logger, @@ -248,6 +249,7 @@ export async function generateCompletions({ providerOptions, retryModel = getModel("claude-3-5-sonnet-20240620", "anthropic"), costTrackingOptions, + metadata, }: GenerateCompletionsOptions): Promise<{ extract: any; numTokens: number; @@ -281,6 +283,17 @@ export async function generateCompletions({ thinking: { type: "enabled", budgetTokens: 12000 }, }, }, + experimental_telemetry: { + isEnabled: true, + functionId: metadata.functionId ? (metadata.functionId + "/generateText") : "generateText", + metadata: { + teamId: metadata.teamId, + ...(metadata.extractId ? { langfuseTraceId: "extract:" + metadata.extractId, extractId: metadata.extractId } : {}), + ...(metadata.scrapeId ? { langfuseTraceId: "scrape:" + metadata.scrapeId, scrapeId: metadata.scrapeId } : {}), + ...(metadata.deepResearchId ? { langfuseTraceId: "deepResearch:" + metadata.deepResearchId, deepResearchId: metadata.deepResearchId } : {}), + ...(metadata.llmsTxtId ? { langfuseTraceId: "llmsTxt:" + metadata.llmsTxtId, llmsTxtId: metadata.llmsTxtId } : {}), + }, + }, }); costTrackingOptions.costTracking.addCall({ @@ -335,6 +348,17 @@ export async function generateCompletions({ thinking: { type: "enabled", budgetTokens: 12000 }, }, }, + experimental_telemetry: { + isEnabled: true, + functionId: metadata.functionId ? (metadata.functionId + "/generateText") : "generateText", + metadata: { + teamId: metadata.teamId, + ...(metadata.extractId ? { langfuseTraceId: "extract:" + metadata.extractId, extractId: metadata.extractId } : {}), + ...(metadata.scrapeId ? { langfuseTraceId: "scrape:" + metadata.scrapeId, scrapeId: metadata.scrapeId } : {}), + ...(metadata.deepResearchId ? { langfuseTraceId: "deepResearch:" + metadata.deepResearchId, deepResearchId: metadata.deepResearchId } : {}), + ...(metadata.llmsTxtId ? { langfuseTraceId: "llmsTxt:" + metadata.llmsTxtId, llmsTxtId: metadata.llmsTxtId } : {}), + } + }, }); extract = result.text; @@ -451,6 +475,17 @@ export async function generateCompletions({ thinking: { type: "enabled", budgetTokens: 12000 }, }, }, + experimental_telemetry: { + isEnabled: true, + functionId: metadata.functionId ? (metadata.functionId + "/repairText") : "repairText", + metadata: { + teamId: metadata.teamId, + ...(metadata.extractId ? { langfuseTraceId: "extract:" + metadata.extractId, extractId: metadata.extractId } : {}), + ...(metadata.scrapeId ? { langfuseTraceId: "scrape:" + metadata.scrapeId, scrapeId: metadata.scrapeId } : {}), + ...(metadata.deepResearchId ? { langfuseTraceId: "deepResearch:" + metadata.deepResearchId, deepResearchId: metadata.deepResearchId } : {}), + ...(metadata.llmsTxtId ? { langfuseTraceId: "llmsTxt:" + metadata.llmsTxtId, llmsTxtId: metadata.llmsTxtId } : {}), + }, + }, }); costTrackingOptions.costTracking.addCall({ @@ -496,6 +531,17 @@ export async function generateCompletions({ console.error(error); }, }), + experimental_telemetry: { + isEnabled: true, + functionId: metadata.functionId, + metadata: { + teamId: metadata.teamId, + ...(metadata.extractId ? { langfuseTraceId: "extract:" + metadata.extractId, extractId: metadata.extractId } : {}), + ...(metadata.scrapeId ? { langfuseTraceId: "scrape:" + metadata.scrapeId, scrapeId: metadata.scrapeId } : {}), + ...(metadata.deepResearchId ? { langfuseTraceId: "deepResearch:" + metadata.deepResearchId, deepResearchId: metadata.deepResearchId } : {}), + ...(metadata.llmsTxtId ? { langfuseTraceId: "llmsTxt:" + metadata.llmsTxtId, llmsTxtId: metadata.llmsTxtId } : {}), + } + } } satisfies Parameters[0]; // const now = new Date().getTime(); @@ -685,6 +731,11 @@ export async function performLLMExtract( method: "performLLMExtract", }, }, + metadata: { + teamId: meta.internalOptions.teamId, + functionId: "performLLMExtract", + scrapeId: meta.id, + }, }; const { extractedDataArray, warning, costLimitExceededTokenUsage } = @@ -693,6 +744,10 @@ export async function performLLMExtract( urls: [meta.rewrittenUrl ?? meta.url], useAgent: false, scrapeId: meta.id, + metadata: { + teamId: meta.internalOptions.teamId, + functionId: "performLLMExtract", + }, }); if (warning) { @@ -836,6 +891,7 @@ export async function generateSchemaFromPrompt( prompt: string, logger: Logger, costTracking: CostTracking, + metadata: { teamId: string, functionId?: string, extractId?: string, scrapeId?: string }, ): Promise<{ extract: any }> { const model = getModel("gpt-4o", "openai"); const retryModel = getModel("gpt-4o-mini", "openai"); @@ -888,6 +944,10 @@ Return a valid JSON schema object with properties that would capture the informa method: "generateSchemaFromPrompt", }, }, + metadata: { + ...metadata, + functionId: metadata.functionId ? (metadata.functionId + "/generateSchemaFromPrompt") : "generateSchemaFromPrompt", + }, }); return { extract }; diff --git a/apps/api/src/services/langfuse.ts b/apps/api/src/services/langfuse.ts new file mode 100644 index 000000000..7c4ddb514 --- /dev/null +++ b/apps/api/src/services/langfuse.ts @@ -0,0 +1,3 @@ +import { Langfuse } from "langfuse"; + +export const langfuse = new Langfuse(); \ No newline at end of file diff --git a/apps/api/src/services/queue-worker.ts b/apps/api/src/services/queue-worker.ts index 8e2a403f2..11a5a8437 100644 --- a/apps/api/src/services/queue-worker.ts +++ b/apps/api/src/services/queue-worker.ts @@ -44,6 +44,9 @@ import { robustFetch } from "../scraper/scrapeURL/lib/fetch"; import { redisEvictConnection } from "./redis"; import path from "path"; import { finishCrawlIfNeeded } from "./worker/crawl-logic"; +import { NodeSDK } from "@opentelemetry/sdk-node"; +import { getNodeAutoInstrumentations } from "@opentelemetry/auto-instrumentations-node"; +import { LangfuseExporter } from "langfuse-vercel"; configDotenv(); @@ -66,6 +69,15 @@ const runningJobs: Set = new Set(); cacheableLookup.install(http.globalAgent); cacheableLookup.install(https.globalAgent); +const langfuseOtel = process.env.LANGFUSE_PUBLIC_KEY ? new NodeSDK({ + traceExporter: new LangfuseExporter(), + instrumentations: [getNodeAutoInstrumentations()], +}) : null; + +if (langfuseOtel) { + langfuseOtel.start(); +} + const processExtractJobInternal = async ( token: string, job: Job & { id: string }, @@ -547,5 +559,8 @@ app.listen(workerPort, () => { await scrapeQueueEvents.close(); console.log("All jobs finished. Worker out!"); + if (langfuseOtel) { + await langfuseOtel.shutdown(); + } process.exit(0); })(); \ No newline at end of file diff --git a/apps/api/src/services/worker/scrape-worker.ts b/apps/api/src/services/worker/scrape-worker.ts index 37f918172..0942b081e 100644 --- a/apps/api/src/services/worker/scrape-worker.ts +++ b/apps/api/src/services/worker/scrape-worker.ts @@ -45,6 +45,9 @@ import { calculateCreditsToBeBilled } from "../../lib/scrape-billing"; import { getBillingQueue } from "../queue-service"; import type { Logger } from "winston"; import { finishCrawlIfNeeded } from "./crawl-logic"; +import { LangfuseExporter } from "langfuse-vercel"; +import { getNodeAutoInstrumentations } from "@opentelemetry/auto-instrumentations-node"; +import { NodeSDK } from "@opentelemetry/sdk-node"; class RacedRedirectError extends Error { constructor() { @@ -790,6 +793,15 @@ export const processJobInternal = async (job: Job & { id: string }) => { crawlId: job.data?.crawl_id ?? undefined, zeroDataRetention: job.data?.zeroDataRetention ?? false, }); + + const langfuseOtel = process.env.LANGFUSE_PUBLIC_KEY ? new NodeSDK({ + traceExporter: new LangfuseExporter(), + instrumentations: [getNodeAutoInstrumentations()], + }) : null; + + if (langfuseOtel) { + langfuseOtel.start(); + } try { try { @@ -843,6 +855,12 @@ export const processJobInternal = async (job: Job & { id: string }) => { logger.debug("Job failed", { error }); Sentry.captureException(error); throw error; + } finally { + if (langfuseOtel) { + langfuseOtel.shutdown().then(() => { + logger.debug("Langfuse OTEL shutdown"); + }); + } } };