From 2c8cb3ca7520d3a054f7c47baf21e533e57cf7a3 Mon Sep 17 00:00:00 2001 From: Nir Gazit Date: Mon, 11 Mar 2024 19:43:47 +0100 Subject: [PATCH] fix(llamaindex): support streaming --- .../recording.har | 38 +- .../recording.har | 667 ++++++++++++++++++ .../src/custom-llm-instrumentation.ts | 7 +- .../instrumentation-llamaindex/src/utils.ts | 78 +- .../test/instrumentation.test.ts | 54 ++ packages/sample-app/src/sample_llamaindex.ts | 8 +- 6 files changed, 812 insertions(+), 40 deletions(-) create mode 100644 packages/instrumentation-llamaindex/recordings/Test-LlamaIndex-instrumentation_1988279490/should-build-proper-trace-on-streaming-query-engine_2069720152/recording.har diff --git a/packages/instrumentation-llamaindex/recordings/Test-LlamaIndex-instrumentation_1988279490/should-add-span-for-all-instrumented-methods_2883459899/recording.har b/packages/instrumentation-llamaindex/recordings/Test-LlamaIndex-instrumentation_1988279490/should-add-span-for-all-instrumented-methods_2883459899/recording.har index 59d32c53..4bc7b633 100644 --- a/packages/instrumentation-llamaindex/recordings/Test-LlamaIndex-instrumentation_1988279490/should-add-span-for-all-instrumented-methods_2883459899/recording.har +++ b/packages/instrumentation-llamaindex/recordings/Test-LlamaIndex-instrumentation_1988279490/should-add-span-for-all-instrumented-methods_2883459899/recording.har @@ -452,17 +452,17 @@ } }, { - "_id": "c84ada703c8ad9f08e8e196367e1079b", + "_id": "4d705d14a30eb714ad1b4db58213356a", "_order": 0, "cache": {}, "request": { - "bodySize": 7868, + "bodySize": 9608, "cookies": [], "headers": [ { "_fromType": "array", "name": "content-length", - "value": "7868" + "value": "9608" }, { "_fromType": "array", @@ -525,29 +525,29 @@ "postData": { "mimeType": "application/json", "params": [], - "text": "{\n \"model\": \"text-embedding-ada-002\",\n \"input\": [\n \"Albert Einstein: A Genius Unveiled\\n\\nAlbert Einstein, renowned as the father of modern physics, remains an emblematic figure in the annals of science. Born in Ulm, Germany, in 1879, his intellectual prowess was evident from an early age. However, it was his groundbreaking theory of relativity, encapsulated in the equation E=mc^2, that revolutionized our understanding of space, time, and energy.\",\n \"/*\\n * Copyright Traceloop\\n *\\n * Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n * you may not use this file except in compliance with the License. * You may obtain a copy of the License at\\n *\\n * https://www.apache.org/licenses/LICENSE-2.0\\n *\\n * Unless required by applicable law or agreed to in writing, software\\n * distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and\\n * limitations under the License.\",\n \"* See the License for the specific language governing permissions and\\n * limitations under the License. */\\n\\nimport { context } from \\\"@opentelemetry/api\\\";\\nimport { AsyncHooksContextManager } from \\\"@opentelemetry/context-async-hooks\\\";\\nimport { LlamaIndexInstrumentation } from \\\"../src/instrumentation\\\";\\nimport * as assert from \\\"assert\\\";\\nimport {\\n BasicTracerProvider,\\n InMemorySpanExporter,\\n SimpleSpanProcessor,\\n} from \\\"@opentelemetry/sdk-trace-base\\\";\\nimport type * as llamaindexImport from \\\"llamaindex\\\";\\n\\nimport { Polly, setupMocha as setupPolly } from \\\"@pollyjs/core\\\";\\nimport NodeHttpAdapter from \\\"@pollyjs/adapter-node-http\\\";\\nimport FSPersister from \\\"@pollyjs/persister-fs\\\";\\n\\nconst memoryExporter = new InMemorySpanExporter();\\n\\nPolly.register(NodeHttpAdapter);\\nPolly.register(FSPersister);\\n\\ndescribe(\\\"Test LlamaIndex instrumentation\\\", async function () {\\n const provider = new BasicTracerProvider();\\n let instrumentation: LlamaIndexInstrumentation;\\n let contextManager: AsyncHooksContextManager;\\n let llamaindex: typeof llamaindexImport;\\n\\n setupPolly({\\n adapters: [\\\"node-http\\\"],\\n persister: \\\"fs\\\",\\n recordIfMissing: process.env.RECORD_MODE === \\\"NEW\\\",\\n matchRequestsBy: {\\n headers: false,\\n },\\n });\\n\\n before(() => {\\n if (process.env.RECORD_MODE !== \\\"NEW\\\") {\\n process.env.OPENAI_API_KEY = \\\"test\\\";\\n }\\n\\n provider.addSpanProcessor(new SimpleSpanProcessor(memoryExporter));\\n instrumentation = new LlamaIndexInstrumentation();\\n instrumentation.setTracerProvider(provider);\\n llamaindex = require(\\\"llamaindex\\\");\\n });\\n\\n beforeEach(function () {\\n contextManager = new AsyncHooksContextManager().enable();\\n context.setGlobalContextManager(contextManager);\\n\\n const { server } = this.polly as Polly;\\n server.any().on(\\\"beforePersist\\\", (_req, recording) => {\\n recording.request.headers = recording.request.headers.filter(\\n ({ name }: { name: string }) => name !== \\\"authorization\\\",\\n );\\n });\\n });\\n\\n afterEach(() => {\\n memoryExporter.reset();\\n context.disable();\\n });\\n\\n it(\\\"should set attributes in span for LLM instrumentation\\\", async () => {\\n const model = \\\"gpt-3.5-turbo\\\";\\n const prompt = \\\"Tell me a joke about OpenTelemetry\\\";\\n const openai = new llamaindex.OpenAI({ model, temperature: 0 });\\n const res = await openai.chat({\\n messages: [{ role: \\\"user\\\", content: prompt }],\\n });\\n\\n assert.ok(res);\\n assert.ok(res.message);\\n\\n const spans = memoryExporter.getFinishedSpans();\\n\\n assert.strictEqual(spans.length, 1);\\n const chatAttributes = spans[0].attributes;\\n\\n assert.strictEqual(chatAttributes[\\\"llm.vendor\\\"], \\\"OpenAI\\\");\\n assert.strictEqual(chatAttributes[\\\"llm.request.type\\\"], \\\"chat\\\");\\n assert.strictEqual(chatAttributes[\\\"llm.request.model\\\"], model);\\n assert.strictEqual(chatAttributes[\\\"llm.top_p\\\"], 1);\\n assert.strictEqual(chatAttributes[\\\"llm.prompts.0.content\\\"], prompt);\\n assert.strictEqual(chatAttributes[\\\"llm.prompts.0.role\\\"], \\\"user\\\");\\n assert.strictEqual(chatAttributes[\\\"llm.completions.0.role\\\"], \\\"assistant\\\");\\n assert.strictEqual(\\n chatAttributes[\\\"llm.completions.0.content\\\"],\\n res.message.content,\\n );\\n });\\n\\n it(\\\"should set attributes in span for LLM instrumentation in case of streaming response\\\", async () => {\\n const model = \\\"gpt-3.5-turbo\\\";\\n const prompt = \\\"Tell me a joke about OpenTelemetry\\\";\\n const openai = new llamaindex.OpenAI({ model, temperature: 0 });\\n const res = await openai.chat({\\n messages: [{ role: \\\"user\\\", content: prompt }],\\n stream: true,\\n });\\n\\n assert.ok(res);\\n let message = \\\"\\\";\\n for await (const messageChunk of res) {\\n if (messageChunk.delta) {\\n message += messageChunk.delta;\\n }\\n }\\n assert.ok(message);\\n\\n const spans = memoryExporter.getFinishedSpans();\\n\\n assert.strictEqual(spans.length, 1);\\n const chatAttributes = spans[0].attributes;\\n\\n assert.strictEqual(chatAttributes[\\\"llm.vendor\\\"], \\\"OpenAI\\\");\\n assert.strictEqual(chatAttributes[\\\"llm.request.type\\\"], \\\"chat\\\");\\n assert.strictEqual(chatAttributes[\\\"llm.request.model\\\"], model);\\n assert.strictEqual(chatAttributes[\\\"llm.top_p\\\"], 1);\\n assert.strictEqual(chatAttributes[\\\"llm.prompts.0.content\\\"], prompt);\\n assert.strictEqual(chatAttributes[\\\"llm.prompts.0.role\\\"], \\\"user\\\");\\n assert.strictEqual(chatAttributes[\\\"llm.completions.0.content\\\"], message);\\n });\\n\\n it(\\\"should add span for all instrumented methods\\\", async () => {\\n const directoryReader = new llamaindex.SimpleDirectoryReader();\\n const documents = await directoryReader.loadData({ directoryPath: \\\"test\\\" });\\n const embedModel = new llamaindex.OpenAIEmbedding();\\n const vectorStore = new llamaindex.SimpleVectorStore();\\n\\n const serviceContext = llamaindex.serviceContextFromDefaults({\\n embedModel,\\n });\\n const storageContext = await llamaindex.storageContextFromDefaults({\\n vectorStore,\\n });\\n\\n const index = await llamaindex.VectorStoreIndex.fromDocuments(documents, {\\n storageContext,\\n serviceContext,\\n });\\n\\n const queryEngine = index.asQueryEngine();\\n\\n const result = await queryEngine.query({\\n query: \\\"Where was albert einstein born?\\\",\\n });\\n\\n assert.ok(result.response);\\n\\n const spans = memoryExporter.getFinishedSpans();\\n\\n const spanNames = spans.map((span) => span.name);\\n\\n // TODO: Need to figure out why this doesn't get logged\\n // assert.ok(spanNames.includes(\\\"get_query_embedding.task\\\"));\\n\\n const retrieverQueryEngineSpan = spans.find(\\n (span) => span.name === \\\"retriever_query_engine.query\\\",\\n );\\n\\n assert.ok(spanNames.includes(\\\"retriever_query_engine.retrieve\\\"));\\n assert.ok(spanNames.includes(\\\"llamaindex.open_ai.chat\\\"));\\n assert.ok(spanNames.includes(\\\"response_synthesizer.synthesize\\\"));\\n assert.ok(spanNames.includes(\\\"vector_index_retriever.retrieve\\\"));\\n\\n assert.ok(retrieverQueryEngineSpan);\\n assert.ok(retrieverQueryEngineSpan.attributes[\\\"traceloop.entity.input\\\"]);\\n assert.ok(retrieverQueryEngineSpan.attributes[\\\"traceloop.entity.output\\\"]);\\n assert.strictEqual(\\n JSON.parse(\\n retrieverQueryEngineSpan.attributes[\\n \\\"traceloop.entity.input\\\"\\n ].toString(),\\n ).kwargs.query,\\n \\\"Where was albert einstein born?\\\",\\n );\\n assert.strictEqual(\\n JSON.parse(\\n retrieverQueryEngineSpan.attributes[\\n \\\"traceloop.entity.output\\\"\\n ].toString(),\\n ).response,\\n result.response,\\n );\\n }).timeout(60000);\\n});\"\n ]\n}" + "text": "{\n \"model\": \"text-embedding-ada-002\",\n \"input\": [\n \"Albert Einstein: A Genius Unveiled\\n\\nAlbert Einstein, renowned as the father of modern physics, remains an emblematic figure in the annals of science. Born in Ulm, Germany, in 1879, his intellectual prowess was evident from an early age. However, it was his groundbreaking theory of relativity, encapsulated in the equation E=mc^2, that revolutionized our understanding of space, time, and energy.\",\n \"/*\\n * Copyright Traceloop\\n *\\n * Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n * you may not use this file except in compliance with the License. * You may obtain a copy of the License at\\n *\\n * https://www.apache.org/licenses/LICENSE-2.0\\n *\\n * Unless required by applicable law or agreed to in writing, software\\n * distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and\\n * limitations under the License.\",\n \"* See the License for the specific language governing permissions and\\n * limitations under the License. */\\n\\nimport { context } from \\\"@opentelemetry/api\\\";\\nimport { AsyncHooksContextManager } from \\\"@opentelemetry/context-async-hooks\\\";\\nimport { LlamaIndexInstrumentation } from \\\"../src/instrumentation\\\";\\nimport * as assert from \\\"assert\\\";\\nimport {\\n BasicTracerProvider,\\n InMemorySpanExporter,\\n SimpleSpanProcessor,\\n} from \\\"@opentelemetry/sdk-trace-base\\\";\\nimport type * as llamaindexImport from \\\"llamaindex\\\";\\n\\nimport { Polly, setupMocha as setupPolly } from \\\"@pollyjs/core\\\";\\nimport NodeHttpAdapter from \\\"@pollyjs/adapter-node-http\\\";\\nimport FSPersister from \\\"@pollyjs/persister-fs\\\";\\n\\nconst memoryExporter = new InMemorySpanExporter();\\n\\nPolly.register(NodeHttpAdapter);\\nPolly.register(FSPersister);\\n\\ndescribe(\\\"Test LlamaIndex instrumentation\\\", async function () {\\n const provider = new BasicTracerProvider();\\n let instrumentation: LlamaIndexInstrumentation;\\n let contextManager: AsyncHooksContextManager;\\n let llamaindex: typeof llamaindexImport;\\n\\n setupPolly({\\n adapters: [\\\"node-http\\\"],\\n persister: \\\"fs\\\",\\n recordIfMissing: process.env.RECORD_MODE === \\\"NEW\\\",\\n matchRequestsBy: {\\n headers: false,\\n },\\n });\\n\\n before(() => {\\n if (process.env.RECORD_MODE !== \\\"NEW\\\") {\\n process.env.OPENAI_API_KEY = \\\"test\\\";\\n }\\n\\n provider.addSpanProcessor(new SimpleSpanProcessor(memoryExporter));\\n instrumentation = new LlamaIndexInstrumentation();\\n instrumentation.setTracerProvider(provider);\\n llamaindex = require(\\\"llamaindex\\\");\\n });\\n\\n beforeEach(function () {\\n contextManager = new AsyncHooksContextManager().enable();\\n context.setGlobalContextManager(contextManager);\\n\\n const { server } = this.polly as Polly;\\n server.any().on(\\\"beforePersist\\\", (_req, recording) => {\\n recording.request.headers = recording.request.headers.filter(\\n ({ name }: { name: string }) => name !== \\\"authorization\\\",\\n );\\n });\\n });\\n\\n afterEach(() => {\\n memoryExporter.reset();\\n context.disable();\\n });\\n\\n it(\\\"should set attributes in span for LLM instrumentation\\\", async () => {\\n const model = \\\"gpt-3.5-turbo\\\";\\n const prompt = \\\"Tell me a joke about OpenTelemetry\\\";\\n const openai = new llamaindex.OpenAI({ model, temperature: 0 });\\n const res = await openai.chat({\\n messages: [{ role: \\\"user\\\", content: prompt }],\\n });\\n\\n assert.ok(res);\\n assert.ok(res.message);\\n\\n const spans = memoryExporter.getFinishedSpans();\\n\\n assert.strictEqual(spans.length, 1);\\n const chatAttributes = spans[0].attributes;\\n\\n assert.strictEqual(chatAttributes[\\\"llm.vendor\\\"], \\\"OpenAI\\\");\\n assert.strictEqual(chatAttributes[\\\"llm.request.type\\\"], \\\"chat\\\");\\n assert.strictEqual(chatAttributes[\\\"llm.request.model\\\"], model);\\n assert.strictEqual(chatAttributes[\\\"llm.top_p\\\"], 1);\\n assert.strictEqual(chatAttributes[\\\"llm.prompts.0.content\\\"], prompt);\\n assert.strictEqual(chatAttributes[\\\"llm.prompts.0.role\\\"], \\\"user\\\");\\n assert.strictEqual(chatAttributes[\\\"llm.completions.0.role\\\"], \\\"assistant\\\");\\n assert.strictEqual(\\n chatAttributes[\\\"llm.completions.0.content\\\"],\\n res.message.content,\\n );\\n });\\n\\n it(\\\"should set attributes in span for LLM instrumentation in case of streaming response\\\", async () => {\\n const model = \\\"gpt-3.5-turbo\\\";\\n const prompt = \\\"Tell me a joke about OpenTelemetry\\\";\\n const openai = new llamaindex.OpenAI({ model, temperature: 0 });\\n const res = await openai.chat({\\n messages: [{ role: \\\"user\\\", content: prompt }],\\n stream: true,\\n });\\n\\n assert.ok(res);\\n let message = \\\"\\\";\\n for await (const messageChunk of res) {\\n if (messageChunk.delta) {\\n message += messageChunk.delta;\\n }\\n }\\n assert.ok(message);\\n\\n const spans = memoryExporter.getFinishedSpans();\\n\\n assert.strictEqual(spans.length, 1);\\n const chatAttributes = spans[0].attributes;\\n\\n assert.strictEqual(chatAttributes[\\\"llm.vendor\\\"], \\\"OpenAI\\\");\\n assert.strictEqual(chatAttributes[\\\"llm.request.type\\\"], \\\"chat\\\");\\n assert.strictEqual(chatAttributes[\\\"llm.request.model\\\"], model);\\n assert.strictEqual(chatAttributes[\\\"llm.top_p\\\"], 1);\\n assert.strictEqual(chatAttributes[\\\"llm.prompts.0.content\\\"], prompt);\\n assert.strictEqual(chatAttributes[\\\"llm.prompts.0.role\\\"], \\\"user\\\");\\n assert.strictEqual(chatAttributes[\\\"llm.completions.0.content\\\"], message);\\n });\\n\\n it(\\\"should add span for all instrumented methods\\\", async () => {\\n const directoryReader = new llamaindex.SimpleDirectoryReader();\\n const documents = await directoryReader.loadData({ directoryPath: \\\"test\\\" });\\n const embedModel = new llamaindex.OpenAIEmbedding();\\n const vectorStore = new llamaindex.SimpleVectorStore();\\n\\n const serviceContext = llamaindex.serviceContextFromDefaults({\\n embedModel,\\n });\\n const storageContext = await llamaindex.storageContextFromDefaults({\\n vectorStore,\\n });\\n\\n const index = await llamaindex.VectorStoreIndex.fromDocuments(documents, {\\n storageContext,\\n serviceContext,\\n });\\n\\n const queryEngine = index.asQueryEngine();\\n\\n const result = await queryEngine.query({\\n query: \\\"Where was albert einstein born?\\\",\\n });\\n\\n assert.ok(result.response);\\n\\n const spans = memoryExporter.getFinishedSpans();\\n\\n const spanNames = spans.map((span) => span.name);\\n\\n // TODO: Need to figure out why this doesn't get logged\\n // assert.ok(spanNames.includes(\\\"get_query_embedding.task\\\"));\\n\\n const retrieverQueryEngineSpan = spans.find(\\n (span) => span.name === \\\"retriever_query_engine.query\\\",\\n );\\n\\n assert.ok(spanNames.includes(\\\"retriever_query_engine.retrieve\\\"));\\n assert.ok(spanNames.includes(\\\"llamaindex.open_ai.chat\\\"));\\n assert.ok(spanNames.includes(\\\"response_synthesizer.synthesize\\\"));\\n assert.ok(spanNames.includes(\\\"vector_index_retriever.retrieve\\\"));\\n\\n assert.ok(retrieverQueryEngineSpan);\\n assert.ok(retrieverQueryEngineSpan.attributes[\\\"traceloop.entity.input\\\"]);\\n assert.ok(retrieverQueryEngineSpan.attributes[\\\"traceloop.entity.output\\\"]);\\n assert.strictEqual(\\n JSON.parse(\\n retrieverQueryEngineSpan.attributes[\\n \\\"traceloop.entity.input\\\"\\n ].toString(),\\n ).kwargs.query,\\n \\\"Where was albert einstein born?\\\",\\n );\\n assert.strictEqual(\\n JSON.parse(\\n retrieverQueryEngineSpan.attributes[\\n \\\"traceloop.entity.output\\\"\\n ].toString(),\\n ).response,\\n result.response,\\n );\\n }).timeout(60000);\\n\\n it(\\\"should build proper trace on streaming query engine\\\", async () => {\\n const directoryReader = new llamaindex.SimpleDirectoryReader();\\n const documents = await directoryReader.loadData({ directoryPath: \\\"test\\\" });\\n const embedModel = new llamaindex.OpenAIEmbedding();\\n const vectorStore = new llamaindex.SimpleVectorStore();\\n\\n const serviceContext = llamaindex.serviceContextFromDefaults({\\n embedModel,\\n });\\n const storageContext = await llamaindex.storageContextFromDefaults({\\n vectorStore,\\n });\\n\\n const index = await llamaindex.VectorStoreIndex.fromDocuments(documents, {\\n storageContext,\\n serviceContext,\\n });\\n\\n const queryEngine = index.asQueryEngine();\\n\\n const result = await queryEngine.query({\\n query: \\\"Where was albert einstein born?\\\",\\n stream: true,\\n });\\n\\n for await (const res of result) {\\n assert.ok(res);\\n }\\n\\n const spans = memoryExporter.getFinishedSpans();\\n\\n // TODO: Need to figure out why this doesn't get logged\\n // assert.ok(spanNames.includes(\\\"get_query_embedding.task\\\"));\\n\\n const retrieverQueryEngineSpan = spans.find(\\n (span) => span.name === \\\"retriever_query_engine.query\\\",\\n );\\n const synthesizeSpan = spans.find(\\n (span) => span.name === \\\"response_synthesizer.synthesize\\\",\\n );\\n const openAIChatSpan = spans.find(\\n (span) => span.name === \\\"llamaindex.open_ai.chat\\\",\\n );\\n\\n assert.strictEqual(\\n synthesizeSpan?.parentSpanId,\\n retrieverQueryEngineSpan?.spanContext().spanId,\\n );\\n assert.strictEqual(\\n openAIChatSpan?.parentSpanId,\\n synthesizeSpan?.spanContext().spanId,\\n );\\n }).timeout(60000);\\n});\"\n ]\n}" }, "queryString": [], "url": "https://api.openai.com/v1/embeddings" }, "response": { - "bodySize": 30104, + "bodySize": 30000, "content": { "encoding": "base64", "mimeType": "application/json", - "size": 30104, - "text": "[\"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\"]" + "size": 30000, + "text": "[\"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\",\"AwDTh+ar1IYBAA==\"]" }, "cookies": [ { "domain": ".api.openai.com", - "expires": "2024-03-06T18:02:12.000Z", + "expires": "2024-03-11T19:13:25.000Z", "httpOnly": true, "name": "__cf_bm", "path": "/", "sameSite": "None", "secure": true, - "value": "M9DT3y3z4Ha70FYuq3IFT7mSsuUOWTRUF2B7d901bgk-1709746332-1.0.1.1-Zr1fEWTvZS7GBwhtEKNYKGiZB.LHVY5C95xfAmth7vCQff3iH2xCprVcwYHUvzmrntCwn6eBxLvZGx7ng9_9eQ" + "value": "9KG4xlo3kkMKATXZ8EfW46xsMShY4dfWJQIo0UUCMoQ-1710182605-1.0.1.1-r7grSntYf3lmqr71mnVpDFmOkDUDrzdDVgo7vHxjD2PbVhjshTQdVcirWIlzIV98NrDzo8Dm7C6e3KMmLvOwUg" }, { "domain": ".api.openai.com", @@ -556,13 +556,13 @@ "path": "/", "sameSite": "None", "secure": true, - "value": "d0zrMqnWyU10YZ_wfyFoJa5FJbQZmMnHD.NBW9NP12A-1709746332965-0.0.1.1-604800000" + "value": "..jKw4AP3Q1UbHivy3er0qdujFB.ju_z4Z1xWnB5KRM-1710182605513-0.0.1.1-604800000" } ], "headers": [ { "name": "date", - "value": "Wed, 06 Mar 2024 17:32:12 GMT" + "value": "Mon, 11 Mar 2024 18:43:25 GMT" }, { "name": "content-type", @@ -590,7 +590,7 @@ }, { "name": "openai-processing-ms", - "value": "58" + "value": "83" }, { "name": "openai-version", @@ -614,7 +614,7 @@ }, { "name": "x-request-id", - "value": "req_f30918dd29660d8ffa5194ca3bbbb540" + "value": "req_701f418a7bfa3a4dd62e5aa638b45888" }, { "name": "cf-cache-status", @@ -623,12 +623,12 @@ { "_fromType": "array", "name": "set-cookie", - "value": "__cf_bm=M9DT3y3z4Ha70FYuq3IFT7mSsuUOWTRUF2B7d901bgk-1709746332-1.0.1.1-Zr1fEWTvZS7GBwhtEKNYKGiZB.LHVY5C95xfAmth7vCQff3iH2xCprVcwYHUvzmrntCwn6eBxLvZGx7ng9_9eQ; path=/; expires=Wed, 06-Mar-24 18:02:12 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" + "value": "__cf_bm=9KG4xlo3kkMKATXZ8EfW46xsMShY4dfWJQIo0UUCMoQ-1710182605-1.0.1.1-r7grSntYf3lmqr71mnVpDFmOkDUDrzdDVgo7vHxjD2PbVhjshTQdVcirWIlzIV98NrDzo8Dm7C6e3KMmLvOwUg; path=/; expires=Mon, 11-Mar-24 19:13:25 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" }, { "_fromType": "array", "name": "set-cookie", - "value": "_cfuvid=d0zrMqnWyU10YZ_wfyFoJa5FJbQZmMnHD.NBW9NP12A-1709746332965-0.0.1.1-604800000; path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" + "value": "_cfuvid=..jKw4AP3Q1UbHivy3er0qdujFB.ju_z4Z1xWnB5KRM-1710182605513-0.0.1.1-604800000; path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" }, { "name": "server", @@ -636,7 +636,7 @@ }, { "name": "cf-ray", - "value": "860415738992baa6-MXP" + "value": "862db0a2aabf0e13-MXP" }, { "name": "content-encoding", @@ -653,8 +653,8 @@ "status": 200, "statusText": "OK" }, - "startedDateTime": "2024-03-06T17:32:12.588Z", - "time": 632, + "startedDateTime": "2024-03-11T18:43:25.116Z", + "time": 762, "timings": { "blocked": -1, "connect": -1, @@ -662,7 +662,7 @@ "receive": 0, "send": 0, "ssl": -1, - "wait": 632 + "wait": 762 } } ], diff --git a/packages/instrumentation-llamaindex/recordings/Test-LlamaIndex-instrumentation_1988279490/should-build-proper-trace-on-streaming-query-engine_2069720152/recording.har b/packages/instrumentation-llamaindex/recordings/Test-LlamaIndex-instrumentation_1988279490/should-build-proper-trace-on-streaming-query-engine_2069720152/recording.har new file mode 100644 index 00000000..ab5d2742 --- /dev/null +++ b/packages/instrumentation-llamaindex/recordings/Test-LlamaIndex-instrumentation_1988279490/should-build-proper-trace-on-streaming-query-engine_2069720152/recording.har @@ -0,0 +1,667 @@ +{ + "log": { + "_recordingName": "Test LlamaIndex instrumentation/should build proper trace on streaming query engine", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "35e4e3d1b757b5697226d1cf6efde888", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 95, + "cookies": [], + "headers": [ + { + "_fromType": "array", + "name": "content-length", + "value": "95" + }, + { + "_fromType": "array", + "name": "accept", + "value": "application/json" + }, + { + "_fromType": "array", + "name": "content-type", + "value": "application/json" + }, + { + "_fromType": "array", + "name": "user-agent", + "value": "OpenAI/JS 4.28.4" + }, + { + "_fromType": "array", + "name": "x-stainless-lang", + "value": "js" + }, + { + "_fromType": "array", + "name": "x-stainless-package-version", + "value": "4.28.4" + }, + { + "_fromType": "array", + "name": "x-stainless-os", + "value": "MacOS" + }, + { + "_fromType": "array", + "name": "x-stainless-arch", + "value": "arm64" + }, + { + "_fromType": "array", + "name": "x-stainless-runtime", + "value": "node" + }, + { + "_fromType": "array", + "name": "x-stainless-runtime-version", + "value": "v18.17.1" + }, + { + "_fromType": "array", + "name": "accept-encoding", + "value": "gzip,deflate" + }, + { + "name": "host", + "value": "api.openai.com" + } + ], + "headersSize": 463, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/json", + "params": [], + "text": "{\n \"model\": \"text-embedding-ada-002\",\n \"input\": [\n \"Where was albert einstein born?\"\n ]\n}" + }, + "queryString": [], + "url": "https://api.openai.com/v1/embeddings" + }, + "response": { + "bodySize": 10177, + "content": { + "encoding": "base64", + "mimeType": "application/json", + "size": 10177, + "text": "[\"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\"]" + }, + "cookies": [ + { + "domain": ".api.openai.com", + "expires": "2024-03-11T19:12:48.000Z", + "httpOnly": true, + "name": "__cf_bm", + "path": "/", + "sameSite": "None", + "secure": true, + "value": "JIWX69SknEXbxMZBdxHtCE.j8hG4ZSaXslQGkSEk3.0-1710182568-1.0.1.1-B58qjuEiZ5KrFtJSKujd7q4pCh02kzUUDXGzTcjxz7IKoyeFwG.E0FdeHIpB_s5g70x_jHgfZTwKSWn9ivpTgQ" + }, + { + "domain": ".api.openai.com", + "httpOnly": true, + "name": "_cfuvid", + "path": "/", + "sameSite": "None", + "secure": true, + "value": "bw6EZHz.GKDyJR6xR9c4us8R4.sulSJwGV86DFXe7Fc-1710182568876-0.0.1.1-604800000" + } + ], + "headers": [ + { + "name": "date", + "value": "Mon, 11 Mar 2024 18:42:48 GMT" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "transfer-encoding", + "value": "chunked" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "name": "access-control-allow-origin", + "value": "*" + }, + { + "name": "openai-model", + "value": "text-embedding-ada-002" + }, + { + "name": "openai-organization", + "value": "traceloop" + }, + { + "name": "openai-processing-ms", + "value": "23" + }, + { + "name": "openai-version", + "value": "2020-10-01" + }, + { + "name": "strict-transport-security", + "value": "max-age=15724800; includeSubDomains" + }, + { + "name": "x-ratelimit-limit-requests", + "value": "5000" + }, + { + "name": "x-ratelimit-remaining-requests", + "value": "4999" + }, + { + "name": "x-ratelimit-reset-requests", + "value": "12ms" + }, + { + "name": "x-request-id", + "value": "req_d751da8430713f9b4602f4b993eeb55c" + }, + { + "name": "cf-cache-status", + "value": "DYNAMIC" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "__cf_bm=JIWX69SknEXbxMZBdxHtCE.j8hG4ZSaXslQGkSEk3.0-1710182568-1.0.1.1-B58qjuEiZ5KrFtJSKujd7q4pCh02kzUUDXGzTcjxz7IKoyeFwG.E0FdeHIpB_s5g70x_jHgfZTwKSWn9ivpTgQ; path=/; expires=Mon, 11-Mar-24 19:12:48 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "_cfuvid=bw6EZHz.GKDyJR6xR9c4us8R4.sulSJwGV86DFXe7Fc-1710182568876-0.0.1.1-604800000; path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" + }, + { + "name": "server", + "value": "cloudflare" + }, + { + "name": "cf-ray", + "value": "862dafbe5af60e51-MXP" + }, + { + "name": "content-encoding", + "value": "gzip" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=86400" + } + ], + "headersSize": 1066, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-03-11T18:42:48.654Z", + "time": 341, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 341 + } + }, + { + "_id": "b4d91742ad75611d7acc306ee8971613", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 1356, + "cookies": [], + "headers": [ + { + "_fromType": "array", + "name": "content-length", + "value": "1356" + }, + { + "_fromType": "array", + "name": "accept", + "value": "application/json" + }, + { + "_fromType": "array", + "name": "content-type", + "value": "application/json" + }, + { + "_fromType": "array", + "name": "user-agent", + "value": "OpenAI/JS 4.28.4" + }, + { + "_fromType": "array", + "name": "x-stainless-lang", + "value": "js" + }, + { + "_fromType": "array", + "name": "x-stainless-package-version", + "value": "4.28.4" + }, + { + "_fromType": "array", + "name": "x-stainless-os", + "value": "MacOS" + }, + { + "_fromType": "array", + "name": "x-stainless-arch", + "value": "arm64" + }, + { + "_fromType": "array", + "name": "x-stainless-runtime", + "value": "node" + }, + { + "_fromType": "array", + "name": "x-stainless-runtime-version", + "value": "v18.17.1" + }, + { + "_fromType": "array", + "name": "accept-encoding", + "value": "gzip,deflate" + }, + { + "name": "host", + "value": "api.openai.com" + } + ], + "headersSize": 471, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/json", + "params": [], + "text": "{\n \"model\": \"gpt-3.5-turbo\",\n \"temperature\": 0.1,\n \"messages\": [\n {\n \"role\": \"user\",\n \"content\": \"Context information is below.\\n---------------------\\nAlbert Einstein: A Genius Unveiled\\n\\nAlbert Einstein, renowned as the father of modern physics, remains an emblematic figure in the annals of science. Born in Ulm, Germany, in 1879, his intellectual prowess was evident from an early age. However, it was his groundbreaking theory of relativity, encapsulated in the equation E=mc^2, that revolutionized our understanding of space, time, and energy. /*\\n * Copyright Traceloop\\n *\\n * Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n * you may not use this file except in compliance with the License. * You may obtain a copy of the License at\\n *\\n * https://www.apache.org/licenses/LICENSE-2.0\\n *\\n * Unless required by applicable law or agreed to in writing, software\\n * distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and\\n * limitations under the License.\\n---------------------\\nGiven the context information and not prior knowledge, answer the query.\\nQuery: Where was albert einstein born?\\nAnswer:\"\n }\n ],\n \"top_p\": 1,\n \"stream\": true\n}" + }, + "queryString": [], + "url": "https://api.openai.com/v1/chat/completions" + }, + "response": { + "bodySize": 3172, + "content": { + "mimeType": "text/event-stream", + "size": 3172, + "text": "data: {\"id\":\"chatcmpl-91etllKY75GK1kG3l6g4E2Gnj9YyF\",\"object\":\"chat.completion.chunk\",\"created\":1710182569,\"model\":\"gpt-3.5-turbo-0125\",\"system_fingerprint\":\"fp_4f0b692a78\",\"choices\":[{\"index\":0,\"delta\":{\"role\":\"assistant\",\"content\":\"\"},\"logprobs\":null,\"finish_reason\":null}]}\n\ndata: {\"id\":\"chatcmpl-91etllKY75GK1kG3l6g4E2Gnj9YyF\",\"object\":\"chat.completion.chunk\",\"created\":1710182569,\"model\":\"gpt-3.5-turbo-0125\",\"system_fingerprint\":\"fp_4f0b692a78\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"Albert\"},\"logprobs\":null,\"finish_reason\":null}]}\n\ndata: {\"id\":\"chatcmpl-91etllKY75GK1kG3l6g4E2Gnj9YyF\",\"object\":\"chat.completion.chunk\",\"created\":1710182569,\"model\":\"gpt-3.5-turbo-0125\",\"system_fingerprint\":\"fp_4f0b692a78\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" Einstein\"},\"logprobs\":null,\"finish_reason\":null}]}\n\ndata: {\"id\":\"chatcmpl-91etllKY75GK1kG3l6g4E2Gnj9YyF\",\"object\":\"chat.completion.chunk\",\"created\":1710182569,\"model\":\"gpt-3.5-turbo-0125\",\"system_fingerprint\":\"fp_4f0b692a78\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" was\"},\"logprobs\":null,\"finish_reason\":null}]}\n\ndata: {\"id\":\"chatcmpl-91etllKY75GK1kG3l6g4E2Gnj9YyF\",\"object\":\"chat.completion.chunk\",\"created\":1710182569,\"model\":\"gpt-3.5-turbo-0125\",\"system_fingerprint\":\"fp_4f0b692a78\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" born\"},\"logprobs\":null,\"finish_reason\":null}]}\n\ndata: {\"id\":\"chatcmpl-91etllKY75GK1kG3l6g4E2Gnj9YyF\",\"object\":\"chat.completion.chunk\",\"created\":1710182569,\"model\":\"gpt-3.5-turbo-0125\",\"system_fingerprint\":\"fp_4f0b692a78\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" in\"},\"logprobs\":null,\"finish_reason\":null}]}\n\ndata: {\"id\":\"chatcmpl-91etllKY75GK1kG3l6g4E2Gnj9YyF\",\"object\":\"chat.completion.chunk\",\"created\":1710182569,\"model\":\"gpt-3.5-turbo-0125\",\"system_fingerprint\":\"fp_4f0b692a78\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" Ul\"},\"logprobs\":null,\"finish_reason\":null}]}\n\ndata: {\"id\":\"chatcmpl-91etllKY75GK1kG3l6g4E2Gnj9YyF\",\"object\":\"chat.completion.chunk\",\"created\":1710182569,\"model\":\"gpt-3.5-turbo-0125\",\"system_fingerprint\":\"fp_4f0b692a78\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"m\"},\"logprobs\":null,\"finish_reason\":null}]}\n\ndata: {\"id\":\"chatcmpl-91etllKY75GK1kG3l6g4E2Gnj9YyF\",\"object\":\"chat.completion.chunk\",\"created\":1710182569,\"model\":\"gpt-3.5-turbo-0125\",\"system_fingerprint\":\"fp_4f0b692a78\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\",\"},\"logprobs\":null,\"finish_reason\":null}]}\n\ndata: {\"id\":\"chatcmpl-91etllKY75GK1kG3l6g4E2Gnj9YyF\",\"object\":\"chat.completion.chunk\",\"created\":1710182569,\"model\":\"gpt-3.5-turbo-0125\",\"system_fingerprint\":\"fp_4f0b692a78\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" Germany\"},\"logprobs\":null,\"finish_reason\":null}]}\n\ndata: {\"id\":\"chatcmpl-91etllKY75GK1kG3l6g4E2Gnj9YyF\",\"object\":\"chat.completion.chunk\",\"created\":1710182569,\"model\":\"gpt-3.5-turbo-0125\",\"system_fingerprint\":\"fp_4f0b692a78\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\".\"},\"logprobs\":null,\"finish_reason\":null}]}\n\ndata: {\"id\":\"chatcmpl-91etllKY75GK1kG3l6g4E2Gnj9YyF\",\"object\":\"chat.completion.chunk\",\"created\":1710182569,\"model\":\"gpt-3.5-turbo-0125\",\"system_fingerprint\":\"fp_4f0b692a78\",\"choices\":[{\"index\":0,\"delta\":{},\"logprobs\":null,\"finish_reason\":\"stop\"}]}\n\ndata: [DONE]\n\n" + }, + "cookies": [ + { + "domain": ".api.openai.com", + "expires": "2024-03-11T19:12:49.000Z", + "httpOnly": true, + "name": "__cf_bm", + "path": "/", + "sameSite": "None", + "secure": true, + "value": "UGdC5XMG77P0D7LwewkLoL7hp8MOsYplGbNY9OEtXCE-1710182569-1.0.1.1-CY66suwkzUMSDdqNKScd_xrNJNCaDosxM1INvXHK6bDJrGJpyzd3ze5QZTo9hSMDM.vOQHeVpPYKkuShgrA1dQ" + }, + { + "domain": ".api.openai.com", + "httpOnly": true, + "name": "_cfuvid", + "path": "/", + "sameSite": "None", + "secure": true, + "value": "vmwnOdAkBt0WfHcGby0r7I26G9dDLZAU0ZYKZJlxHlc-1710182569563-0.0.1.1-604800000" + } + ], + "headers": [ + { + "name": "date", + "value": "Mon, 11 Mar 2024 18:42:49 GMT" + }, + { + "name": "content-type", + "value": "text/event-stream" + }, + { + "name": "transfer-encoding", + "value": "chunked" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "name": "access-control-allow-origin", + "value": "*" + }, + { + "name": "cache-control", + "value": "no-cache, must-revalidate" + }, + { + "name": "openai-model", + "value": "gpt-3.5-turbo-0125" + }, + { + "name": "openai-organization", + "value": "traceloop" + }, + { + "name": "openai-processing-ms", + "value": "71" + }, + { + "name": "openai-version", + "value": "2020-10-01" + }, + { + "name": "strict-transport-security", + "value": "max-age=15724800; includeSubDomains" + }, + { + "name": "x-ratelimit-limit-requests", + "value": "5000" + }, + { + "name": "x-ratelimit-limit-tokens", + "value": "160000" + }, + { + "name": "x-ratelimit-remaining-requests", + "value": "4999" + }, + { + "name": "x-ratelimit-remaining-tokens", + "value": "159689" + }, + { + "name": "x-ratelimit-reset-requests", + "value": "12ms" + }, + { + "name": "x-ratelimit-reset-tokens", + "value": "116ms" + }, + { + "name": "x-request-id", + "value": "req_9793520f485093871f830207964c2b1c" + }, + { + "name": "cf-cache-status", + "value": "DYNAMIC" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "__cf_bm=UGdC5XMG77P0D7LwewkLoL7hp8MOsYplGbNY9OEtXCE-1710182569-1.0.1.1-CY66suwkzUMSDdqNKScd_xrNJNCaDosxM1INvXHK6bDJrGJpyzd3ze5QZTo9hSMDM.vOQHeVpPYKkuShgrA1dQ; path=/; expires=Mon, 11-Mar-24 19:12:49 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "_cfuvid=vmwnOdAkBt0WfHcGby0r7I26G9dDLZAU0ZYKZJlxHlc-1710182569563-0.0.1.1-604800000; path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" + }, + { + "name": "server", + "value": "cloudflare" + }, + { + "name": "cf-ray", + "value": "862dafc08ed50e51-MXP" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=86400" + } + ], + "headersSize": 1186, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-03-11T18:42:49.007Z", + "time": 658, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 658 + } + }, + { + "_id": "4d705d14a30eb714ad1b4db58213356a", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 9608, + "cookies": [], + "headers": [ + { + "_fromType": "array", + "name": "content-length", + "value": "9608" + }, + { + "_fromType": "array", + "name": "accept", + "value": "application/json" + }, + { + "_fromType": "array", + "name": "content-type", + "value": "application/json" + }, + { + "_fromType": "array", + "name": "user-agent", + "value": "OpenAI/JS 4.28.4" + }, + { + "_fromType": "array", + "name": "x-stainless-lang", + "value": "js" + }, + { + "_fromType": "array", + "name": "x-stainless-package-version", + "value": "4.28.4" + }, + { + "_fromType": "array", + "name": "x-stainless-os", + "value": "MacOS" + }, + { + "_fromType": "array", + "name": "x-stainless-arch", + "value": "arm64" + }, + { + "_fromType": "array", + "name": "x-stainless-runtime", + "value": "node" + }, + { + "_fromType": "array", + "name": "x-stainless-runtime-version", + "value": "v18.17.1" + }, + { + "_fromType": "array", + "name": "accept-encoding", + "value": "gzip,deflate" + }, + { + "name": "host", + "value": "api.openai.com" + } + ], + "headersSize": 465, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/json", + "params": [], + "text": "{\n \"model\": \"text-embedding-ada-002\",\n \"input\": [\n \"Albert Einstein: A Genius Unveiled\\n\\nAlbert Einstein, renowned as the father of modern physics, remains an emblematic figure in the annals of science. Born in Ulm, Germany, in 1879, his intellectual prowess was evident from an early age. However, it was his groundbreaking theory of relativity, encapsulated in the equation E=mc^2, that revolutionized our understanding of space, time, and energy.\",\n \"/*\\n * Copyright Traceloop\\n *\\n * Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n * you may not use this file except in compliance with the License. * You may obtain a copy of the License at\\n *\\n * https://www.apache.org/licenses/LICENSE-2.0\\n *\\n * Unless required by applicable law or agreed to in writing, software\\n * distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and\\n * limitations under the License.\",\n \"* See the License for the specific language governing permissions and\\n * limitations under the License. */\\n\\nimport { context } from \\\"@opentelemetry/api\\\";\\nimport { AsyncHooksContextManager } from \\\"@opentelemetry/context-async-hooks\\\";\\nimport { LlamaIndexInstrumentation } from \\\"../src/instrumentation\\\";\\nimport * as assert from \\\"assert\\\";\\nimport {\\n BasicTracerProvider,\\n InMemorySpanExporter,\\n SimpleSpanProcessor,\\n} from \\\"@opentelemetry/sdk-trace-base\\\";\\nimport type * as llamaindexImport from \\\"llamaindex\\\";\\n\\nimport { Polly, setupMocha as setupPolly } from \\\"@pollyjs/core\\\";\\nimport NodeHttpAdapter from \\\"@pollyjs/adapter-node-http\\\";\\nimport FSPersister from \\\"@pollyjs/persister-fs\\\";\\n\\nconst memoryExporter = new InMemorySpanExporter();\\n\\nPolly.register(NodeHttpAdapter);\\nPolly.register(FSPersister);\\n\\ndescribe(\\\"Test LlamaIndex instrumentation\\\", async function () {\\n const provider = new BasicTracerProvider();\\n let instrumentation: LlamaIndexInstrumentation;\\n let contextManager: AsyncHooksContextManager;\\n let llamaindex: typeof llamaindexImport;\\n\\n setupPolly({\\n adapters: [\\\"node-http\\\"],\\n persister: \\\"fs\\\",\\n recordIfMissing: process.env.RECORD_MODE === \\\"NEW\\\",\\n matchRequestsBy: {\\n headers: false,\\n },\\n });\\n\\n before(() => {\\n if (process.env.RECORD_MODE !== \\\"NEW\\\") {\\n process.env.OPENAI_API_KEY = \\\"test\\\";\\n }\\n\\n provider.addSpanProcessor(new SimpleSpanProcessor(memoryExporter));\\n instrumentation = new LlamaIndexInstrumentation();\\n instrumentation.setTracerProvider(provider);\\n llamaindex = require(\\\"llamaindex\\\");\\n });\\n\\n beforeEach(function () {\\n contextManager = new AsyncHooksContextManager().enable();\\n context.setGlobalContextManager(contextManager);\\n\\n const { server } = this.polly as Polly;\\n server.any().on(\\\"beforePersist\\\", (_req, recording) => {\\n recording.request.headers = recording.request.headers.filter(\\n ({ name }: { name: string }) => name !== \\\"authorization\\\",\\n );\\n });\\n });\\n\\n afterEach(() => {\\n memoryExporter.reset();\\n context.disable();\\n });\\n\\n it(\\\"should set attributes in span for LLM instrumentation\\\", async () => {\\n const model = \\\"gpt-3.5-turbo\\\";\\n const prompt = \\\"Tell me a joke about OpenTelemetry\\\";\\n const openai = new llamaindex.OpenAI({ model, temperature: 0 });\\n const res = await openai.chat({\\n messages: [{ role: \\\"user\\\", content: prompt }],\\n });\\n\\n assert.ok(res);\\n assert.ok(res.message);\\n\\n const spans = memoryExporter.getFinishedSpans();\\n\\n assert.strictEqual(spans.length, 1);\\n const chatAttributes = spans[0].attributes;\\n\\n assert.strictEqual(chatAttributes[\\\"llm.vendor\\\"], \\\"OpenAI\\\");\\n assert.strictEqual(chatAttributes[\\\"llm.request.type\\\"], \\\"chat\\\");\\n assert.strictEqual(chatAttributes[\\\"llm.request.model\\\"], model);\\n assert.strictEqual(chatAttributes[\\\"llm.top_p\\\"], 1);\\n assert.strictEqual(chatAttributes[\\\"llm.prompts.0.content\\\"], prompt);\\n assert.strictEqual(chatAttributes[\\\"llm.prompts.0.role\\\"], \\\"user\\\");\\n assert.strictEqual(chatAttributes[\\\"llm.completions.0.role\\\"], \\\"assistant\\\");\\n assert.strictEqual(\\n chatAttributes[\\\"llm.completions.0.content\\\"],\\n res.message.content,\\n );\\n });\\n\\n it(\\\"should set attributes in span for LLM instrumentation in case of streaming response\\\", async () => {\\n const model = \\\"gpt-3.5-turbo\\\";\\n const prompt = \\\"Tell me a joke about OpenTelemetry\\\";\\n const openai = new llamaindex.OpenAI({ model, temperature: 0 });\\n const res = await openai.chat({\\n messages: [{ role: \\\"user\\\", content: prompt }],\\n stream: true,\\n });\\n\\n assert.ok(res);\\n let message = \\\"\\\";\\n for await (const messageChunk of res) {\\n if (messageChunk.delta) {\\n message += messageChunk.delta;\\n }\\n }\\n assert.ok(message);\\n\\n const spans = memoryExporter.getFinishedSpans();\\n\\n assert.strictEqual(spans.length, 1);\\n const chatAttributes = spans[0].attributes;\\n\\n assert.strictEqual(chatAttributes[\\\"llm.vendor\\\"], \\\"OpenAI\\\");\\n assert.strictEqual(chatAttributes[\\\"llm.request.type\\\"], \\\"chat\\\");\\n assert.strictEqual(chatAttributes[\\\"llm.request.model\\\"], model);\\n assert.strictEqual(chatAttributes[\\\"llm.top_p\\\"], 1);\\n assert.strictEqual(chatAttributes[\\\"llm.prompts.0.content\\\"], prompt);\\n assert.strictEqual(chatAttributes[\\\"llm.prompts.0.role\\\"], \\\"user\\\");\\n assert.strictEqual(chatAttributes[\\\"llm.completions.0.content\\\"], message);\\n });\\n\\n it(\\\"should add span for all instrumented methods\\\", async () => {\\n const directoryReader = new llamaindex.SimpleDirectoryReader();\\n const documents = await directoryReader.loadData({ directoryPath: \\\"test\\\" });\\n const embedModel = new llamaindex.OpenAIEmbedding();\\n const vectorStore = new llamaindex.SimpleVectorStore();\\n\\n const serviceContext = llamaindex.serviceContextFromDefaults({\\n embedModel,\\n });\\n const storageContext = await llamaindex.storageContextFromDefaults({\\n vectorStore,\\n });\\n\\n const index = await llamaindex.VectorStoreIndex.fromDocuments(documents, {\\n storageContext,\\n serviceContext,\\n });\\n\\n const queryEngine = index.asQueryEngine();\\n\\n const result = await queryEngine.query({\\n query: \\\"Where was albert einstein born?\\\",\\n });\\n\\n assert.ok(result.response);\\n\\n const spans = memoryExporter.getFinishedSpans();\\n\\n const spanNames = spans.map((span) => span.name);\\n\\n // TODO: Need to figure out why this doesn't get logged\\n // assert.ok(spanNames.includes(\\\"get_query_embedding.task\\\"));\\n\\n const retrieverQueryEngineSpan = spans.find(\\n (span) => span.name === \\\"retriever_query_engine.query\\\",\\n );\\n\\n assert.ok(spanNames.includes(\\\"retriever_query_engine.retrieve\\\"));\\n assert.ok(spanNames.includes(\\\"llamaindex.open_ai.chat\\\"));\\n assert.ok(spanNames.includes(\\\"response_synthesizer.synthesize\\\"));\\n assert.ok(spanNames.includes(\\\"vector_index_retriever.retrieve\\\"));\\n\\n assert.ok(retrieverQueryEngineSpan);\\n assert.ok(retrieverQueryEngineSpan.attributes[\\\"traceloop.entity.input\\\"]);\\n assert.ok(retrieverQueryEngineSpan.attributes[\\\"traceloop.entity.output\\\"]);\\n assert.strictEqual(\\n JSON.parse(\\n retrieverQueryEngineSpan.attributes[\\n \\\"traceloop.entity.input\\\"\\n ].toString(),\\n ).kwargs.query,\\n \\\"Where was albert einstein born?\\\",\\n );\\n assert.strictEqual(\\n JSON.parse(\\n retrieverQueryEngineSpan.attributes[\\n \\\"traceloop.entity.output\\\"\\n ].toString(),\\n ).response,\\n result.response,\\n );\\n }).timeout(60000);\\n\\n it(\\\"should build proper trace on streaming query engine\\\", async () => {\\n const directoryReader = new llamaindex.SimpleDirectoryReader();\\n const documents = await directoryReader.loadData({ directoryPath: \\\"test\\\" });\\n const embedModel = new llamaindex.OpenAIEmbedding();\\n const vectorStore = new llamaindex.SimpleVectorStore();\\n\\n const serviceContext = llamaindex.serviceContextFromDefaults({\\n embedModel,\\n });\\n const storageContext = await llamaindex.storageContextFromDefaults({\\n vectorStore,\\n });\\n\\n const index = await llamaindex.VectorStoreIndex.fromDocuments(documents, {\\n storageContext,\\n serviceContext,\\n });\\n\\n const queryEngine = index.asQueryEngine();\\n\\n const result = await queryEngine.query({\\n query: \\\"Where was albert einstein born?\\\",\\n stream: true,\\n });\\n\\n for await (const res of result) {\\n assert.ok(res);\\n }\\n\\n const spans = memoryExporter.getFinishedSpans();\\n\\n // TODO: Need to figure out why this doesn't get logged\\n // assert.ok(spanNames.includes(\\\"get_query_embedding.task\\\"));\\n\\n const retrieverQueryEngineSpan = spans.find(\\n (span) => span.name === \\\"retriever_query_engine.query\\\",\\n );\\n const synthesizeSpan = spans.find(\\n (span) => span.name === \\\"response_synthesizer.synthesize\\\",\\n );\\n const openAIChatSpan = spans.find(\\n (span) => span.name === \\\"llamaindex.open_ai.chat\\\",\\n );\\n\\n assert.strictEqual(\\n synthesizeSpan?.parentSpanId,\\n retrieverQueryEngineSpan?.spanContext().spanId,\\n );\\n assert.strictEqual(\\n openAIChatSpan?.parentSpanId,\\n synthesizeSpan?.spanContext().spanId,\\n );\\n }).timeout(60000);\\n});\"\n ]\n}" + }, + "queryString": [], + "url": "https://api.openai.com/v1/embeddings" + }, + "response": { + "bodySize": 29997, + "content": { + "encoding": "base64", + "mimeType": "application/json", + "size": 29997, + "text": "[\"H4sIAAAAAAAAA4xZyY5Yxw28+ysGOksGl+LmX8nJjoTAQeIc4oMB/3zAGdvBK8oYCwMdenr6NbeqIvvXb15ePvznh39++fvPH757+fCvH//784ePu/b5+5+///Ddy9++eXl5efn19f/Hzi///uHL588//vSP1+2vv/zxp89ffvnw3Yv8sfL/Tb+ftP/kW5E2Kyv9+Mfip11FqbRVfHzs9aiZwjw3W6fCO+gIM6kS6POIUfGZoc0a1hFFew0+McZ7R5BJF9aumqqh+6ZitB6L1hLhamSDwizZDVqp0lJkWUGqTJ7nSqjCng4zS4GjaaNMrBHscm1xOB6b1TJbxp4naI+mk7s01MRH6QZqGkqOhXSbOR1aU2PddK0=\",\"TO9HvORb8dBJYwu0LKtA3zdzTfK2l7UIX8A7h/NF1cNmOOPKNEuckwhq6bTqbolOCkFkOF1K3GUmi6Jtm3Cazxi6Dhz6tFV63JDPT5nmfo5yUCycswqeiGabxtXBqaJmm9lP/xnCIyn+6pqeTgd4Ysw8KdWmo/C8qWJsaggIdNSswZaOREiSAYYwaV7VGEDJBb6Zylf1qQSf6qZTQaUSXSLkadFXIDKwV3oEHGlktyatqot55wEhTZk8mKcWqhxai3H3Yh+4jzmOZ1KnqTIskCJ5SrNnUFxGM7AkFEiZ5iSULesZNhfokKbIurRTtnugohgCHOMH3cUiTrZ1WrmwW1XKkU6JWSHZxltVaziztT0FRS6RijI9gI1KrySOw97f4ppgpm31HhC9prFLK6PTXX0LIcwGdlIjYEb3RY4WAZHC8WSzN8hSH2fWkhFhayug6oyOrhUgLu3GdJ14ReTiBuOLj0Qf3ls2OskhuYQsHEkJR6pTzmuqKjjtpKZcuZ5FK9pMhxhl1KTY48u+SsEByoKhyzJcgsIgqosclVyK43DGzo5pacYezLOcXhlJC5PwUyRjYcTp0sCkv6OV3hipj/7y9hKquy1FaA8bZZE4yrAWY1iVWQEBPR8zBYLya8VWD7jCZKDhcs6At8PJB4qAMIDLCr46dGvWUokLf6bBCnd5rRVGgfSeLA5khIKQxsLRPRzFaR3GZOs0OagqsfbyAYOMORqkNImYFZoFA2dcVSnr/miZYWd/FeWg48IaRBEzIDwxC2tlXVIpbXTRkm0QOKZpLSysx5dUSWsiK8h2sclGN9Ugk+xv8rG76ygljZlntUOyt2HhNqg3hTlRrVb/kptyYguWasi9I47+iEWbZMCzmVIWBGI2Kt0c/9Fiv2rVSrMjdiIqTli8TRgGwtIDDM89tVjwjMs2FsLyB0syXCewUKY9D4splvUqreNOQmXZkO3MGaYtC5tmLtQVxbexVJQXCaIlgYihdtMyWp16NZWQFmbY7Hpo2teLxiYaafrNHuh7TP4W/PaAs58MaHRe9MNyI/nfOprFkzq0Kvo9Dvok32ZoVX1FE0Y0t1UuYzncAYhPr15n7RLZYxLJ2r4qcaRal40me1wlnABDAN32NDiMRPBvaFuTxgS/DXNydkkY1FVpL0aFedexzTxrkWVyKKfchKWcgl0FT/Jvv19588Pdw1u47R2PVm6QBuEmzDjZeRo01e4kby8GWeezPFw6JKlmFAY/CgU7ByiuePP9IbegHaWstaUKoH5FC6JMl56RxvI5K8YI8q0GYX+lCdQcLz92Rie3JeqZpWTRG7SQlWUFl8AZvPnUkJtDcvQI5A7DEdMTq3YIsCBWSaVmHkAeFByDnIb5TzpmE89VYu+c+3YCgHBOgF2uUu8zy2mcNrZ0NA6O9Bb36QdWS/IVsOPHYNpFxs5OKInGF/goCm5ueVp+8+kzZUSFMj2bhLJASOyAh0KzA57GmbBJlB7FmggELzJBvonu6nYeLMioDfe6Yh15RY+kHXHpFjGZBDXpYsL9VLVJso5olwEL+R23mAQrdkvrmNPm6TZaw2FVtZSuo9BTSu2UUnSkHNCvjMAQ6EPGh0fg6EwUSVIRLDry+BdeUgTOy1sRqnHV3yIKHdBiRS2otcptrV9HZXPgLJaouSFSiW1TWOpoL3jwVo+I1Hda6z/v7bfzmYmDMq07W+Y5/rbWRcxjO648Q1CBLUk3F44vJXGFftWLOcLKXjC5cumxGNv/8TOGV6YaDzbFbSAddzwBk/NoAds3A+KPredghLKKONLQIWicC5Q2+Bkh4NUsn6Qi+0w71eAuJA==\",\"LXVnfX1UZFvDzgESrzKQIzupJzLyCj+jDHRm0c7pibZHvN7szWqgLjVmBUMVNFCsQO6j2OvfT0F5oNJZOn2GC7U9AoG91SzgsdrJlax/4VDdhwM9TxypXjLcykl5PGrmbcTeUjiNi+wcr07WRpYl1bNt4TU3qQoJF/7avhUuufKEdtXEnMkgdJTfhDS8EMoRS9v+5+i2rcd+R7N++rNHBbhbM+N/fUC6svOO/mVS4gzhfCcVckgzoM1CxKBjeXhBDdpOOOUT0Drw4+pFyBFTCnrqs5UX51Hs67MvX8c82pm3sUo6uPJ9X0Yfg+c31dazp5wCMZm6b5ghOOJzBc4ZwOlOV4sfAfdjcXnFtS15en7eNn9T+jtzYj3lOX46Jw9rfsadSMXvgPQ/AAAA//8=\",\"jH3Lim1LcuSvFHd+IPwR7h71K01P1FUICSRNNBA0/e+NrbWvUJpF1klqULDJm2fneni428v/+9Z2eQQ/BhaF+d5+36qnR/lezI3VzrX53++JHh4ez/Qsk843PU/I450r19aHfqFS0hkSaAkP9yc7Y1byL6is9Eke17fj0OJJ1TYPqmudiRPc/a3MMOdOG/9LKrQBKEMmmPRASfz6k76X59DzNlaH6A9D98qQk7ut4hbEzzrtLnN6P9yFVNPLKzuDFp7BklrWyfKC2SOYpQw0Hxj9xKUQPSA//da2KgYcw1ev5KK5zkwvpmgSc8biU2p8RQpgj5ne+EnpfYSwdPSsfMKcBhfPupOTlsNFGzWoD/0CRyUX4ul6oq/yVWeEiDjxoLlUHzFkHEK9DQQ1Iwu4LDbMpuDs7sPwntuSmda2TRxikyLW1BGFAuab3FoFy+lLAdJhagD915L6ESArpdoY/nhjvnZHbAH4UVpRhgXI7iXTwYX0udbBD/EUGQIHr7PGh0pIjcdykRTtci4sa/y0yT1oKD9CGNu9Y2jIApuytj6cYMN5Xt59olSQ0btX8MCPedn/sUrlhSY9l0qX0FXyYQ4ABdAAPcRrF+AWY4DLI4dOLbxEaN+YM49AeeQrgMFn8yUE9Iyjl+rTsd0CpfaqzBRh2d72hVN85WruehX2OZUsnWiMF/yjU9uP86lVnttYFmVgyI0whEhbkSIIwXxwinEMj7N10tTH8/MdcIGpf8rVrJ64K3gMMN8aJjVXn7X5TfDt0YKF7SgTdvzKzvepaj7l8CLt5MdAVXCfMWAqhMBFkXDmAX1QksrpLlz63RV4bo2vwTLf3vzFrEBvhYgJHvxOmhrQqPKbDc0q93u458BdhpstEsi9Qpwek2cRV9LP8ARrvrIX4RtRnSW9/NkATUyf/ONMva4DjlGgCE/bXcPnSFhSbxUrMxmdxslWsxjuvbdc+McOXdkIMw/+VjoR/vp+1oUgoWT8zLNFvmHpUzu/XthjC/eGD8fTXl94xo9+1M5hpvvGZRh0scek6TZ0FyF9nwhAP0Dq2eN8DpriKzUAC/l1OJmtSg10GGuoHYN6ML4wIh/Q3KJZLOAbBKTr+cSarvc2nAgXMXPUYgIcPf7h8hHjbbZaGwT7UtrfJ3lDXsMN4cHv5UIBEnkpgwOlHz9JadEM8kMrGM7aTDTpptU6QQuy4hLdb4mSiHWBHyZ6QuhH1Y6/NxdSXrwoAmXs3HS6BA4n5+cW1FYvkTZmt+glD+gunt+iTi+GJzod6m/hoY8fV8EgKqto19N3yMSfqye5UeyxlEcGTfCppPMtpleY0J07XcaNi5oAGq0L/hc5PTKvPGdjKbHbO5wnqwButehT38dXEepubfgacpIThPp+ujtFDz4ByMQEn8m1lwDkkWM+9A0KxIMUyl4is16Jv0pOBQfA7Yy3RoeoK83XaK/tULq5SKoDeO0RSdKEjhvde21p9gHnG593UK8wZ4fOr0LEc1aVwS+SbwNGJDjyhR11z0pqLi5q5F8fVb+XcGsQlFUffTqMOdN0WxNyw6C1zq8igZfpAaDAbEAUtDU8s3UIMrzwB2xGUK3DvpKc7wEEXkyeZF97J3+r2WfzDZef/PRdq0LG+dwQFykk0zs34wE7E6pgrl1jB6y6NGnQBv5ELZ2YkYdPK7NpD1EV4+KkVB80HrFZAn32gRxfEED3M4xs+UTIQHvVqqDzOemXrxAX0SZ61UUXPcEVx1YdUG65jLPS+WAB2EPts3ec3MM312dbHRHfAlQQ+XNnteB1eJR6CzBzlcihpmQxNHsjPQFXspTUGg==\",\"NqMS0L2DYeTymW0/0BqUx3TKn782BK70z8fgWJfzDy9ByBkuwNRHVh4hj6Z2k29TX2eSYajcZdsPAyizfFJ6m4M6M9LKzTaxxMB/NoJjiejpMxk9wlSeqMVx9zLaWSflFKyy2MMU0mSGi1MFCuAjo1y19xHfnwc+E/7C1pQxu7Zmd9VRlO4Ag1VUutv4IPBakPAdEcP7HiHX15yxXjTFB7pNVgg3uliGo87aLgI4SD8g/+dGCe2PsUQZ3eYSjq/DPD1/y+ObDZ4HKXXQpKjAUmfiG1ug/MfnjzqP3UQOvcvUtXa0dhkLsHKyumwgnuFXKhotjTOyaw7BFF8stJ+C9wIlVFGO+4E6kO6sWx3SfEKZtcD5sF6q2lX7kuZyZsJTatR4JAyFydgh3ADFQtJxX8dYEwQd5KYj1wLHYgifiotFXUeDC2aWujtKpT/Tc/S0gZA0hTU8NTewu7dCCmvmSC/ivsEj8G3JxJnBR+NpwbrxrmWKAweeTpM/AYyNsvL1IJqKnx43QEHsIRAc+9e3CngfvKMiYtpQTZiIC46vGfFglMG1wIQ9mluZMDBh2YhHB7adadHxX2g5B3a/1Q4NaLLlUwt0K1zSMFSLkHt3lBu3D7ZLaGjYx2lQ9kmcGAQKeOy1mDiIOsWYgrlBDsLW89pM1t8+M3+0EUJ8kCb7vYE7Th0GloCAh+qC5+yvsuz3OhmUlVyOvA6UWFTktoVUPgfi30stwon56ohRDtILHjp84Emv3xTPV51gMKSwTgdHYIiC1YsfFtRYO8HAiu1G2yBjLpt83ocwIFDbjIRldomkpzOMn5iK3kHVJ3HYmrwFVyLex8IES8xIMY2GP6JOAbtZjPe8BNaVzG0GQJViHttPg6HgucThh2WhaLc3O7cgSoqcUv88PDHS3Ad6xaWu6M46wueawYLEJ9GCYfDIQQ6S9vKWwMco2oNpUXPfupm1u63Fq5RVo7DZa4sWY6EaauHz8HBmMnPq1OYOxyLiCD5GBvBPh1i7SmQGe3KV9MQb3BjDXmvQb4vKGf2EEFt/KsXzJzZ0r1o1UlVgGGcB+Q1+RN8zpxR+RPvMDRnOGh9x6EN4LObKnOG3HN1ntjizEVHBCQ1gSL5C2+9zWL2lzXx45nF+0yHQhQYgf3fsv+3Lrq2ih4kzQyXfUURlHMtVm2mptQ+OUcEgoOdL4Tgx0Ul6A05yfkfgjolSXYFDuDNCXFQx54iSsoXDG3TBoSoKyxJ8/mZnsd2xnK3klfAdxG9q8CtCgEZpH2UnEWzBEqPHwDY6cUQtcTNUwT8rbIA4KD/y1mlhSH3QSstA69sWH6az55jo5XEScyDA1a63asOdulRhcgwKph8Euaw4qjgAR3DEreSetrZIqsNru3pa0pfks6B3WSXKREgIQ/MDztryiEGiigZCtKRIPtlHefiGuIiaityuDAZsjyKNAlbJOQqOW8GU7t1d+Ei7ogSov2k/Vth0tUSiwHggAQAXedfn7C0zfq2hDluzub8Pm6COD7a5UasGRFA5/DjcKX8ooXB80WMG85xwACu6o5MuZeCk3Yq7gLQSixZkjvKung5vFZ9C/BZiLj9AiaXoTjUCfvgdhLtZoNvIJR6jO/qSDZxbBGGGjJ3lMtckOiFufU+wfnBN1Zayuwr67iXaL2P5yC04AjypKGphYQyxrB9AevziOUQ4zv7NR660tBPdu6ETEbgQ/bDYex4VD3HjNz7ODR1U/Y7Pe8/+AtYoeEQf5xIWDqDJRe872jSbeVdTtbunKUFCjWIlVG3muHwvQYo+2lS4IFX7cY4AcPuUm+YWVduIaRlqIReGCmqZHA==\",\"oWGQyMUwgA9aSzmSJ+dE8MBYY0fAciCecbQ2L/gPXDKZ9jRrtKGhDOprXnpC5p+DA0kYl6q1TRq+jaNaC81qcLZyFrGl+60e1V+Fxm89iJm9xX15k6uA1ySYHO7dlGQUN7hA+JX01YbhTpTOl3HrG4fkIAhDUOLzJlz8z9/gYN5aW+ws0b9j4jTvKUZQZnpLmJ33Pi1UY1Y2BBh87GWoBSDc64j4AHWJCQB48DP5Tb2J0JGtMjIHQiC1Umjc26wDDV+s5L4VDmR5RfAroH8QEg0Fa8QHh/NVlZvoML1Y5dkxNtyUi8DxvYwLLkl+Quugn2RkfarP0ZNwoCETZm2QNCJBOWu+XrSX/4/dpNPyNei4fmR2gm5/HZmbLWuJQv9MuJCLePPlU6iQ9yyuS5BvhfI+YeuInVuJKySX7SVSAwz+W1Qc7baVh4iK8vpJABFyUcDr0WnIZsIP5YkYGK1fiR5C6hccDSx66QRYy/EP12g6SJ8EKkE8GNt1PR6dgjgqdyxUWx6FIadnnYI8R0/P7CaBKx5oTKmqn0GrJfANDFyV8ROcBO7/4K8qZOt3qiGE/WwFmgF8uByEoMOKnSYxUV90nJ+D2IA0uQxwUABKNcApVmd+EJhyT7eAd39MRcUQpPIbYok8IGci4KrpwtTRfhEOnWFpNgAvfmKsNiJhpQlHYJ6LPvyqVv5GauUwLQe7nvd5sGX2FBjsfPtHfFTupygJsHT2xfkHOik4LLSDDwsgbrE5Aul98JXezl2SAXsHatMLkTwXm1EIiARtYGhD8jHvMc80j+GAxmDx8H8XtKhWzc9p3DUjU0IAsJJGyQD2Sl7c9p2iO5kNqZaknyDAkq8j2o9dHIL00HoaMMZQ769rCXoqQJg6nJXW+8hLUq4ipBOVGubLkvyXtk1D61LS4uOe5U90bKCEmnsXfyNSBbVzkaxcE/Isy9wk23OmpqWRnjHOyPPcCahYckJiybHtbc7xkw4B7xIVXgJJPEKjIsXJfpLctapgFmPDoqQ7fdRWtU3y19TN/F6ZQnXnN3raRzK6IG/ZriLcUxLtbZBGNL9jvbxC5YHV7SZ4ZqS3zDN3zRjqKs5fAg5ybC9NOwOh7ux+BJghd+3qa0cuJEIiWvTBns4n391y7zj6Dv/exq0PzT1nc9Xr2DqHpfL4WiYqyxizZKE8sD3NU8WLi2bh61cwxNOJSiYakZXkWIPvbvnvMufemTBbSVpUKs5Nf9wLI/pFUap+pl1K43uH3RFoUhyh7xjglZu/VYI4mdGMCUfsKKuy4qSPUKmJpkSeOc3LelswUI7J0ZtdzUw7gDF2x715U0IhXuKpAaC55L2hfq7l4uwmxuIfACxghJJj1wwCsiV35r6XQEacT/omogd5oIpuhE5xqEZB3cDHRffmco3ZeQkpD8QvImQmbT+IS//HGM9HgH+Qppai3mwnZgEArXM6zPWlMaQycXLcqlPx1U90Vwq8YwMkQhx9F4/f9jepgy/LZidF7IXwWxcH7q1fR7a0tRTkhixsSbNcIdDZLPHsA4dyxSRwp0LawYMrmDJnHyTOct32c0yCaWGaklBUuOmbIwpmx5ioGM8TqsXM8PEIckw+8l9ItMT2DxJZog+gOhIW+SbnAhXWiIHnRvsyyzlysJkcd1isGAtD3jYsjyI0Huig5d0CvMVD1z2HBzsfNKgk996iksWjAaqlZYA+46yeaEcABvU3aNCOagsBlramMzNB9xl5QOmrnYfCz78f969pexfW+0UwT3P3GHjFjb8XZjbg8fLqQG1Bb64kfn1C+VYzgzNQ0oh9bB1+ugwWwIu0vCsqQxSeIA==\",\"0/0Il4gMynNpByuLQ1/Py7wTELSGo8VQEZBZqmTzGRfDIIiSKGFOh8UT0KgiVFlIR+QPLq4+2zfaHlngMsXmFESMtqY/mc+M/8bd8070EMyU2HRzEIvAmh1ApSFC9mPshMd+BONzveApbqVvECLB7pzVHsPW3UYrJoM7EsREHInINRObMOgj6Zf2OnmamyhkzPO7BQ988hsrB/Vb5A5sM8JJ+XGRRwRUo3l+3zM7tMTCo9xNFxWz5OwonjXVGfutqDu8oSMRBWjD6kLfaWOqPjzXX0MmnvU9SzaSJJShO3/iTkLMvkkU6wLIMxyDh54OHkjZNjNfpe1vF27bi+OciFL4AINwbEk2wS1r7ZtP4WMSlQKkIhIiisgWXy7Nwo0WARCTvL9GCJBvNWCGiGCJjAGcliWmifCI5pyo6xosSD2QxH44hWDN0c4ogIfIQDgor8kkffByrm82iU3hUGfEdsOY6SKcDhcRmgoyvwunAT5+6nBqDhLgXEru7AQDIMex49LmD9QjCIwI43sAjD3Y5XN2p5iXrubchf03WP4ms+sOF3w6TsclXHuqXLzyBgfm0FApCyo+26DKe6sp/nRLXpXPTujbGDcKBLETqGeQ4f42dObVGCD9hL8XdqRszYwfHB6ce8s+8V/f3ge4qWfJTgxJSnq7pUYAsTTI0Krxpo5AZPWIgu1B6gRHvizlMrz6dnExnXOUIUTCBL/5kjD4oqinmjVegdqVIjMX4daLpRe/IAZpH2vqAG3vYxpWZSO6/KcL57yawmpDUWPsTpfIsutmxAImwGJjACNCCGtT9Ensydpcerdho5cgcVhKuJ2zPJ4lUbK4AJH4inakVXHoLBQHGINFd9EDNo87zkCEsSsKYipPwrYfWFeEKgbGXTIWOr/hhfBHXoyDgU6SnjwbMTriOwaNJzrKBS2WaNJWQl0pSDjkNhY/CKxZcxrySkZqbZyXfSGhKCX4okGcthgPU087Pxj9RLeO6YvbICGKPkFAQI2odkKCEFtWAV0iHx78tqc4mHICzJh8r33EPHlj5hG0zNEnF8HGr2uaxjNSH3CmIkGI4lj9eySMYwFJpgQFqHn4+iHqq4SurzpwmDM1esD0cSm/ySrwWuBIFE3kWiluWqQT94/+ezgUphnnxbqNYWfe6ljSKpgbWqav/znq82EBhKMHUitoVMLqwWRUIQHbREKxBB275gUL6fTJupVABo2R/6wtwixKD0Xg7OexF8jccNorVhw4azVWwEGoc/PzsslpfLsBjviHkfwGfFM+dufEDKe93py/toV4fdzA5SNXFTBR8ih2E0VDMcB0hmGUFfcPNvkWWyuAM4GqkvwKGDv5rXQsE+N+DBNuJ+cCp5nGEZlna7b1ZWElYD7EJUhCRNU+QiNe0Qw7jh0aco4CVazfhAV+l3i94JI81CEFHCR2wUXdNVR0n0e5K2reRqMlWxvcvlphfn2790FP4gue/0p6cJCppNkclmmJGrAsFdxDPyT0rJdaj74JB65XV52/I21/fZu5cgVw1mMKcUb6KxIsGMM6M4C71Or55F5w5r/B6ylAe9RI4XhogRQ3ssrvXjsfBDzSqDX8EMJ4QSgnjNl9Venj7cT6cR6XJ03NWZ81n9yt1OnaSwJwuyvyyBOMdXgCHl+6sE+qD6NBO/pijQDdwDvDNJ/0najwCjOfZYBHjFcLIWg45ndA90fj7spe3tO57ysNxQH95zqS+bq/+c8qgM1f0iHv3MWJG8oAflpcLMH7gdbfQSuuUNcGmDnqkDx7iTYQ65lCK6mKXWDaz5aN97du9td3ayRFJv8KET36yKOUCPPInw==\",\"CXlu5MB9SxYIuC2zlvqMX0FZ7KOJRby86mOBRsqg4AMLwbzcJ8IYfiS6EJFzKm/EDp0U1hqZWHwkwjV6ZI0O9sqk6WyqniwQwfytvjFW4tUtOWXwVeH0/Xz4v5///3/vz/zfz4d//Mc//evf/89//vHXv/zx93/7p7//7W//8u///Mefv+aPf/n3v/39v/7461/++yr8jx/661/+F+Pk06uktSvdVPykpiz2w2Ct2RYcca9GYGbJMdNLrKgQH7RsEIb8YlTSgOWh8h0g267h97z3CTZWIxA2k1MsLedrHt9nPNkzS/N+gZNz17eRMssCCqTxnSMNy3lWVHAf4lgzwLHgEZMpa9OwhuxwTYN0K4VRnzMCnR81zTxLlftC9EffVma7LPUMPLUttRpLC6DeF9gVeTbcuAc26zJfgxFdIjvixJGgHWxDULngi/6w9xDQXOlKh4IFXD0UaMWYlqjLLnAEp/RpWR4Cw7mwzmXqIYO75kgyRoDbYeUXrGK8fhQ6cuZ14lW2CMRt2BekSfoPAKD2K+wlEc1MY6yUyPipkAA37CPYitfBlzZyZsJCLjqxeCR07PSssZbNe1Euf9iz31jXAAF611RJQI5fe8s3loKiEj+uMM2cB88JyTbfRqA9KtXFHtMo05jsdXHpQD8Mi52MUWUha9WRGsLTSiC0SNNyHZgB/8Xz7IaoH5Q/OxVbwoWjsiWK5CHDkvNIsbNxi5kELNs6qiMBQMf0ZSKxd7hH2AeCsZD60YLxoakb41q77UkH4n2Y3SEYEzQQ+5hmaaZoM5CZZ2LDg7o8RKhks/M0g4xn9l5i6/IqPpcgot4SB/NQpYKHILG4XHIiAtK0YjEn9s/ynxUxS5JjMF+cLYfrnsgj2w4fjb6uy9pQW0v66MmS3WCJRZTiQQN+IyGFSIwXGRyqquhRn4jP1PithINDNMG2seab9dNRAnQirUPeD8cqk5J1iVAFy77hKU/OOgd6/jUS48/oiiNUjge2P/AolAsRLbwND5mj9run8EM9Ii54ROs8kZx4sgqYiJQ+BPHJOjpYvayE0oSaRQLMETS2jtywwF7CEW4hgZmy3SQeVTTHxj2/lRUGD+LtojcDQb+5ohj0kF6asZ/YJlySPdWyyLGwEcUFoj8dW2oStPi7ZNEBhlLlzLG2lwFas8hW7MabbXTAFYSrhEzia2T8nztZdwtDg4osCSKGGykFHMuve12oYey9ZBwC0uKLzeF2wS2QTiQwOyTbMvrBUCAamGdvSYli+4nbxmf/HwAA//8=\",\"jJ3LimVJdkR/pah5Nr7dt7/qV4QmrSpEC9SaaCAQ+ndhfk4WHbY8OmIgBNlJZcS957jvh9myf/xodDXToK03usE7rrAe34jsqbA2jp2aj5jaHDsd0nfaFZ9spKbMCLXRD88Supy49IKEpEMvHEAD73VQkdbJCJgExk3IJ5CQWSgpi1nbgitdOGq1K18Hi2CtO4BiaF3Tboy2U9InMK2U9OJBduKSOGj/9Pue8iRRiavftG3YjGvTaYmDVSB3+h6btA+b2EovfV4fTp1rw9iaAu1gPzfrLM0L9CZX6PSvUvbzVhryo/ry6N+hDFZ+65IQwiVe9lE72neTeyxfuypdYgJvqW5Gsg63oGZ+TJV+7NSKSxhQmm+FYPuGa1SmkqpvEU3Y2y8RrQadscnYOQn4YCW+VpASSKPIUcCGyyfaqn0PktF0UvoAsZe2C6bW87gNnHuvpwgRI2VN/Q/+fmnKbs9LHvVYh1hwdQhJlbMYF8xYeM6kdBZt+Y5xCF1EFLwoR3AGFgnnZTrx2cyMVi5x3folPn6zPWcGpKgCx9Mp36twZBVSgyX6UAO4L+twssD5qyQVnSg15sPJZWmNTGYPMNxOde/xFpJoLSZ9HTxFSydBLCkgCih9a52MNp8qpp46mDmGEHugSEpWfGkI9Z+o0Cm11gBcT2l13aheUzI87IFEHrPfotUxRreDvaZ2zq72n2OUyzxfctKosJXJMuxR5HXoVPX6XurZBbeA6ntXHcTMdeED6x/aFBA3FqtNd+NtKnhUYI4vWZpTQbcpnZZr8NfBXLgcaDQD4T7dyFLclxemB70FaXuUS/qoDsWJWK7snQ+dspgqpve7WSjus33Yu1Gct3NuuLmbUoUXJiFVRllXgh8kGCQZ9eMg+yXjSh3OofXK5fauSG1LkDLa5PiCCUqb7+lxW9rqb2b5tD5GVo545mDWiBCdzTUggp2gOJcBeaMWUL07At4DFTVwE44z48APKw0xGGFTOUme9DHlJQO/o8v+6WOyFOPHebdbQW5AHOaM3jGdjH6Ab6YwnEf+WoFGGbmYZJYnILJ91dO9gSdzLJacdc6AWFXB9kHcfttQZFaFcTPqaOvqalSzyfAPl/pQJQuYp4jqfoyLnxa+ol+zkq49ewbg7WeHhPqjth0VfiGp+nGVyTm/CKE7VoUJHJiMOIB6yIOA0NjQTHu7RkBzpkF68xzF00rPstfj3g8uFqAiUeEAS9G6yN0xIrGvZJmhGeC4ABll8sOvpRWfj6+UkuFxbg/ScUBKXJUBD+xDPTNyvE8xdcNBErF1iEGnoxxq/yGUbdOqj8tkd9i+ZTzeqyAGe6bWGG4UX6kID2+7VR3iRl9SUiKkcs8AnEUMuzZgFtjSsuIdU0yZX91l9e1DLU6+nxHvcWdgFrBbrzsJhpY31D/GXjQ48OrhqG4x59Hgo4G4pItkXXzhrVHAEVpeUfu9EYkpgon2ki4xFMY7v172skp4pySSYy5wjWSiJyNLXHjMU2Mrx7VCuCZFrGN8t5IPMD0f82OcwztDazuLZ4iqpijAva0TaJhfT4sUppgVtMmuWVlB0SyghR+Wsr0OfGGnjYco4yxyPHpHJBcu2eYOxKy3lQX2/DZyEYau7OOJWl5zSKmOPNRzz+Za9VVAzNJYbmNOL1cAxJMikWLhXaVpSy7dRAGEk1CtKvyhQ4mBiHoRVB+rIXFOhnvYtJQJ8J+mbCsgImnrRkbsMVguK841nu5fPFbP4V8GstglUQE8SsCxenGatTXAc8No5KdlcTn9U7a2BpaRxDATYTsij0zEgYr3g4hPTdw9k68eacJkGg==\",\"py5mBCho7IUwD91SHolSW0jKCdgPxTRFoqaxGyQASh7x7csUns2O/aNf7niFp67wCqb6bLxMDt3b62wJbcEpVhlUgMhQnEIDiV8oDN/M1db2RjjmVLidT/z3Fo3KBTLyWJGNy03/U7WqEUR09rzkGN2GoXWUwWA6FZIKNFhfbwKEsL5EUYcs3D5RqKPv6fTBpvv4sv0Sjs+JR0Nreg9rv6zz73IikRIrnIoKy2wNzKureqH2GXhhTjJRw24Bk8M3UXF35x+0DOmRIDqcyrShuF1dWS0XRnJixy21hi8slfESRMicmghtRtdrz3i6OJQQt8bXekFoH7HCppq/IWVMDEdXVVy32Rpb9ImKtenL3aDiSkuDsdIzL/P9iparzhs6hSxqUE2Kg8yCPYhZndvEdiEU1YZrWHcp5hM1dZasL07N55Pu8gxwM2xI2efRktkeKtfaFf3lGA3cMs+WbWaCwiEm+LC7N1PRKM6ZTY1GMVXT4OVjW/n8ZkumIFc8iu08GVe/h2Z7btQTZMWhHVNtJSTm2gMFFWht6gD2AWvRHtoDxfwn+FOjHqtQ599XY7jymupz0HypocMAqmaBeOBQ/TnanyMQfnN6ma8lCc9nkF5xapPvU3Y1eK4NT41RrQHoc1x2r9oZXkh/W84M1zfIAgXu/yg5lnNbQpdRw5ZW0o/WXAjVjlYPe42uwKrwYkO5VEhFmEIFO3pGLk6o+nTRyBUPGoZI60hk2Y17ryJjCQpmuccTaSblrDn9i23r5HbML5Y7z4OhrBkvZJUCiJfuLkfDku4+9/4JcFd+MF7xGZgvh7ZLrrIVJHcn1owjVnGDYa+5iu1P2s7Y24Gva7eRADb0AMWB7+CzElnFkyzFKPnwCP3Yf1EvXuYfPyZNh8uNmPdBbTnrAaivZc5051TTp4y8275yFLj6Ve4tjpCrAHLVQW0isM7u0vzUDAYHUY9eRnVK+DrBKxh1pCRMfi+qTfU5+u3BErEC++8216HwOc+kFoBWpauqvsTTmSkCPybYUtnhC+sIZ1R/DK5h02CtuQrjqi0R/H+hGz1fgD/CfUjl3L6joGhHPuDbIKmfEDk8BfsGA0uCGeaxRjDV4HCFKLZQFk06qkdDinqBVw/ha/yLXULgejuqapX5eEPcZb/QtfhJGBbOkhvFw20CfkD9SDkV3bMjFXZoWO4rLjGfoBpSDUeooNSjC5urqrAqf70lTBMMBQl5Qi24yHEIFuCnVq2l+l6ztzGQKiAN8S7gNbbe8WrWLh/cd6R9GiliJLKUeE+Hrcg5/nuqsMbCWo2r28TFVMhwYbMU/uHjhOubdVflSemsH5WJo8b4+1QUV9SC1O4T1CqCBqRYYnYtZg4JVdBwPJ+oeJA0Na/t/BSU6Ojzj66wK4zbbruW3cbEsafXc670COAmUiCOmHPzM9Mudak6kabJ8O8joKlyD5dfT3L6lG+UaNTVCvcKusO10qlLTF6kWgqLWAoHPkuKBFBxlETqiwaNsSY05i1a9VJJq8u8pPLuPQtGUderRqHFuy0sh25TVllcdhASsXWEe5NQZ68FZfMQOtwH3bXuJAj58HITCty2hFrAiElQiYoL+8TCdr/z77LFo+DHdGMoE9qdHAKA1Itrt/dVPOd+r7VYzB7tD3CQy8cL5axQmeZ4UfhECkGChmL0WhesKKdVYgae8uZdOzXnTrgJz357N/DxNI2p/G6qvnjsrP0qfE6AkyiUjknsAcctB5A/mXGTW8mrrVQbScbtarGLL/c+OakpKwcDCCTC6OCCCiff2ABtl8FV8S6YPyVN//K+OU7f7IgQIbwS4RBa2Lpveg==\",\"7dVRzQi47g2UbqJBCsCac3SIfs7QH86dvYQR9/o7hB1Jd/OlyBYurtkjCGtzec9TfmoQU6jpWgVPsvSjswCRMoqmzo5u8c3PO7RBsMQnK65y9pmYXMhkExBfSYQ9oZwKLQM2PttWZda8xKiOXjgWaxI0ILJ8zfQDnyvrZwMbZft0WGnUdHtqXhncKAj/rPBFbNbq9gcvQ6TFjeRmDQ7sCYm5licpywkd2QMFm6LuENt8nXCfGypvYcj7lNIAh87mr3TLOddqk3wuDPYU1T1pUjm1OF60qLO6xOdMEbWe8lJjiPvjmoYcy2t0nSmL2dF5pA7IgRC2ByYX1XY4gkehkE/1T3Fbuvi7Pb81MVWr3Z1OUJv4gzhqh/ajjOUTxcT1DEPGLDrYz4jRFigCvvTpHfQ+GZX+ud4srFJpFCe5yDdYnaZUjqXcygvFX2GLdxXlncxL3CprZ/HMe/qunw91zuEAkxhHfv+VfOZF4q7WlwextdqL/VN64ZNmIu1usEHbpe/ooPEpTdNP72NzconDlmoBPtURJ50SI4mds6DQXRkN0Bx9VlCNali5YMLbK13XpEWPKkws7ssMJqxI0wdyHarnVw8gYwo+WXkZ4eCYbUBVNGRqA8aiyqKUWPDK8eN3sJhoxa22mgkoG7x9JfF/KjEpirFrmFOlzPiGal5OSOz2lI9eXACjGh3tinYaHgB5rNkTAcU6XJlIdgylR5HvbapSdQASPUZsnzmukyro95RgXhMoaTSOz8xLQ1K0uat3N+audWba3yqzpa8fqJLL4SI7sVPFiZyqVoaIbUh+ewvFmviATOVYut8kAkwYCrtfZM/u4TglNTXBHgYu4rdjq+HfDcZW7z1Vj5LjK37Bn6l3+HaE8RIe300srSDcV3kVSjXxobYcBa5UFv+gklnnuJjn+eirAWouSSDWAkerXYLQr7UWIBsvNgii1zWSaHjhnVeSFaA8jO6Xi/ozkgrrbmXCrpEaYtJ+oLjXQbuFDWzfqXsL/8MUBRVS5Yvp5SDHHLl/9WfTd/SsicuuzAgtQrr5ldEU0Bmo9UUpZO7PbFr3NoIOkWJzr/uk0O0DDhAFmCXdQKsjQkZA6/Q5tCw3LUitUYkFevaRzHmFdZu8zd2LC9vKscvRDAloxNsFRePi6OZXqUeshBXJuc/dDbkk/ulf2NdeSp3K1P6V5frHz/iKTlXTPvYc+F18S/Oc92oGt4sBslxydKtYU4AZL8Kc7ywL7Ym5FlVbcQnXjDY8/VUqpQqO4m65/SGUn7Xinb2qmSOVNoKjS8XMx6P6zWcvu8MctLINZE9vaRnd1twOx8yelzpqRVTHbfekqlhMFlR/bXQE7KlfnSwfj/yc4riuGacLgqckZJiq4IxrMYThx6SkK/4ivDEczZeKF1za+83s7YJuKDTfEUXWIBfnUgupoDzjBPPD7eDjfug1uFZDpDDc7BTBPVPPFeFlU48Te/QdTXw0XR90BWqFh09WsSI+VW9TSC4MekSyowB/5G7VO16RpADVksa0QQ8jlq13zJe7o/wldu2J3KITI8PQHaA1noAHhW9d6HAbaRKaOrbtw1TWxE8dNPG7hoJR0nYCsnpfktXrzgBD6Mk/DsSXd0aSS5yxKIJrIzMXmRZiReCnlXuZyP4lETufudoXzzhfJP/4mU+wyO2VLpcZt73MkQAiyMAc61vQITlR4VQ+2uTwC6zLguT29Cum4FKP3qvJFzar75jB14ZKeI4fWWK8FkTNCarOG74kD5Z/B+DM7uwTIvahqsrlwPjVnwpMZBQXpstbcEv2E4bJW49xvMRAgFYFvQNQpfElOBlbow==\",\"JoxJQlpr/1CmElTqd7YPp11cgGlpqubFrfIFkSj1if8MYKfPTgLWgO8TPBKbvJkzSEaWWn17cawjAw2VYMMeQ3h3Bl7bg1Sr7Pg7NTLpYX1yjMy+dn5pJn/+sR4dz4DS0SmafZa8bqdSL3IBZNcDQsSxV8fuXPrP9HQ8bS3S/VxPDqDzN2v0sRO5ycK/0YS4Cq/Uk+AFVctB7I5L+kEFyyeGlDYoAO5zXF8VPZ609TFq5i3XJOMjmGom9bch+xD3m9FE014wyw2l8RK1X7DxP//Z0mFQ0KdDCbBuH6h77ssx1bIuOyx6bJkI5eTZk2uqoEKcczfy5IFbWZDD8ziPtkbAQyyVHMg5dfdx4UE2cMcoiX0LT9k//LkbCqqHJeOsdeCIF9SpEOo7xO1iCKfigDATGnvVQLiVvEgxkJ2uMqCSiSNoceDEPa44sAXGVqBCZwHM+XHf88yKfWkid3yfXzkA37QWJYBgF9ZnnYPR0WZledxX2gQ59EQGtgWMiBawyym8SlHxFJ/Yc++KpUGtubmXLUfElbXj3JTlwfW8V6Co+oOdzEbQS8xgAEmzPCv1dsLF6nMneFhl6ZX3f0p+e0TAFnkuE8S3oevDR7gol976WqjYTZ2oLiWfAx2sKq7ANYXE9GmcgNv25NXT/cG1IB8aVIJKZh9YWm/ta1EbX7WD/SB/YUWIs9N3eIyBrh6RoSrrgfjIemFd767VntcWOrRqIdWioe2oB1Nj8Kn3C/MJ3+qzonPTLh/PYY6Arvh+ZBZNwJEkDIj565Q+6mjMrCS9xOG4yq4Vw9PjBmjg/KHsejf84yNa6KmkREsFKifHwqKmKZTGE53jMMu9QWkhsxDSfqR78fFMX6qEnH4o5Mr850KaT4/EOB7L7yEdJSgZg8nJK+dCTXFCCt2OEb1kfOV5vO98H1ja0IXuVuWRZZIVvust2mkLprWxhhx9MRDl1BST0odVATSMnQgvVpsHRRyMru9zLMM7IBdxPhsckvJe+u9wvbVhZ3zQ6msnMveit+05sKrP+4z8CuH5KSdSpc+CdkDD0HLZyO1IGB9nKoWHA/RUzuQ31ulS00fHTEFb3AHlOcEDTz2ksQTQD1OMaboh2wQhp57JPhzA7TiDv4R5vf9YCzdFgMv0bq6av/j1VBE0+8wTiULapkXi/fi8Cr2a5IWT9SAsbZwFQIE5e9bwtAXlsKqfIRi3LFcRCty1MP9sZ3xpc0Ll/ZAqrrFNLrQeKzv84feED3G/CtNVz9nhH4J+MWSvP66xglmYSoOx8NzKyc0d6uWXiK7YcfRvoqN7pLCq6uL73hBpzsuji92lKjieyS91uStYMTecW8Vxshfe4AoWBO7KpdZPItwsjkG9oNbjgBO+g6kAU+RtcetufCi1BFnMgRJLwPthyKseLUOE9oF+8Br7+Md1Qvk0fOLYBGSHQj4iH6brkHUMY5WA371duj7tNJaqB97bKiw99tECQ4J25ByFt3caUSbF4NHn9LdVoeRge1Ph+Ewos6ADHVqUN/j7XJ/4ErIyWVgefbO9aLmOaYNCMCarPJnJoObCXffURSsXLl/iuN5gFNl0Jy5P7ZkhKJ9dKDdvraumfyjQJezxT6EddrDPcG480XJoVkytFPc9sQDPtXWpslUMR0qUPbVy8WnGPpQ8CLYUm+Cc5SUwWnzRj30qVhKxMpFbKwB/Ld+CqkFV+vymI0ZtlzRdI2e9ggPBHwBiua0OlXw7sONqkkoS6HU7TTQKDJfp9XG+R5Z8w/F856NtUEvpfuowzojO6TFe9dgl7OFSqHmh90+AY7TKoB6/49+JPEqRKnPhqz18dw==\",\"ewq6UqHKIlxvZHX6FOBlz+8qd0i74C470sl0IkeZwIXoy10Xm2BGhTp47EHSw21BJNnf5Peluw5Ih5DMpuOUUQxWH34HS8cwwdA+5zJcCW0PRr9JBBtkZvqW6vP50Kon4PkbEAx5sedGo3co9RMJq53StKI0jUmKb9MP5lNM3pkvu2duCvVvEO9Ty2Zx7Mpd1KgF3PTtaRz6DDQOMUYkzbBdqb00o8gGSjufku26r8HiJM9gNRng+2qWEc2f8ujZu0vR7gzJKtFrS4R3S+roU5LYR2HmdeIld6J0SfcQhyNgsDv/svbJwD1VfrlxgkqtVMj81NWIXZXGXB7VXs7G0pNN1IMp6MKFFtOsh6/oq+4Ea1CBLwsrwxrS8n+tcfsZGLe6QOv+XbpH48f11Pwcrr80rvGzSRWnzNV+CGlUjo1bHTz2+7ljJncvPeuFymKf7yswVZ67tVGi1bqPVDbf6XknCgPESmiJmoQ0HGGmC+YfwhUlWS+qoBJb8YiCNe0ncxVRDwunplJ6bUciLzcVUsv05PjpVEFuvCwK6K+FNBtomusaXW22U3j0UiPDc42Y+Q2Pw1HnADZWehdyz8tFLEaub9NTvUwPMg/lbLot7P4ugrH6mutW6v9w2Mu0BzXU1mWWnLjVysxz9d3p0g6pSF31K+pzNvtT/fMVWXduHXm8XrvRWHWyUgoN/z7JfAaRqwuZ7l1eXLKW5h59QXkNwuFTz/Q5doVdf6m2tTN1C/reYLURBdgtGlNxK1Bed4UeXjiXp6+FuPJybogDVBgprvagVm+WFavXSmIwIZsaLMalBezYwuguj85VUNTsziE5WtiLQlWVA578pgQRX8LUUJwQSgRZ8iajYGTx9dsNGtNH3qGsdc7mbn2i9Clc6dfmY5yqmVFCtoLstWfFqD9jHFB033fE+by+TK/71M0Wx0ELS2jtQu5VwmQ2uuerQjZ71g3NKCwTD+BuI9JK6rXpMq8TeUs+haCHtPSrAAi7U+5GzWsUmrzVFVy4doJo/XNtoehfnKeCUi0oMGMhu1hdl+r6f176PvLeXMj/k8xsIzyU6/e3WDmkc5fRrFo+yrTeLZBOeb+ArtcHoTH3CNTnOZRqMb9iPL7DMHlvcHxX7WPBtUqVzwip7BSfRNXrCRmDrFlWHmpMvL8UGT++99TN5CG2qzUwSg5xj5G/Aqv5aOky2mqitGB5EjIoriAZYmxcfwcxEkTh6aUDu/mT4urmciw7VwsItQVbIBmfGRbP910BEymjQ4eZZwPl4m3s5t7E8gOQ+caiWndMKh+OQpQA8mLubIDrHbI8sGC6ZZGZovdrchYoL4x3CKcygawea8CnNxXaDFv1XiPxV7XCD3DFT1DFxCEjHmbdXzBW3nolc7la4eoCFttWFYt3ltdQDbWWE8oGMCXfeVOO3jDGUl1AtVZNV9hosVYbLQ+5e8nx/uG/nv//f8/f+d/3D3/9r7/+xx//9t+//vbLr3/851//+P33v/3933/9+Z/59W9///2P//n1t1/+/CH+4S/99su/WPMxszsdrMokysez9wDTOI63DhwwCfdEcYDSd2/qEDRsLo0pDZ1sjhNJvwk+ar3iUVAA0Ga8yeiyUxRf6KkNGzBfFr28XrUJL+TutpTOxTkYh3cAXs6pnT+etaKhjAJqrPjLqOREBqiY6rQWOy72uiEMwXCZz44L8nquPvykmnuuhqJFjHWmycg30i9cwPTLUiSm4S1/DLEp8ZIqr3L646XvT4YUv6/zIsetipKDnTtjftQkv4STrHAmKzzal19N7h3X8UVKneHba4WqLZeN7L4Xjvo4kzV8hw==\",\"AtdPj3eKIf0RTEWzIPJXX3V0nKhDKjpuiPqAcfIsFRvWmnvWwsxiueAGGB+tV52pvkcYW9oG93ZFOk9GhHiZ0Su8vhce1xzDn+I627rsA/cUyylAEMod86Kr1WewUbxKB1wrdLVr0Dk5SXIShm43WuFm1gLPWHQ56TCu7GtuekWkpFigSGsZDqKmDqnhwCNle+b2krjLiGxSfuXctolCsehfQpV3OxFP1rf3xuXUeJMZhW349FyDk56OgTj7ThzoYg/4tkLbYgVp+d08W/HFaq99p4/ZJXL37CWl0s0NZnvdF2X1KBo4+ERpzYWouqpUqeKm2AfViAx2ASRrwRWs0TsWPqvH9v2+enAAAotE6+BVVp0QO+FsKnvTLLC6WJ5w+MchfPv8aw1p0R2/cjg6fRCoLn4+TBZVR8LYcGOp1k23jg/50VyfrS05mCZb/56PYlWAe2lxBm751Tn1SHjmwhZX5vA5AF0e0Qh16LM0QE6PghdTW3UAisGB1UbrQ8/wKR87szfsB4K7OBtz58SIEycFmRe/q35MEXhH/LkDcWzHsYz1mFIvSF+T9c9vZo0bA+FQWnhN5Kj2VmAn0FLWP8L/BwAA//8=\",\"jJ1bkhu5DkRX5BskQYDg/jd2I1nliRAO262f+Ziw2y2pROKReVK32qCYUXNR0KCkRNxwd2lJgnAGaRE8cPC5tw33o/qtxfewPRNT+HLlw6pGvZNwBRzr6CI9UJs8PGsEoKWLrI9zelInchZ/g5HcggvRQxkav2wiBsdOjMyU1cLbQjOrk40HCFd+GsX/9rl6eQDQNMJT58m+rnsJOe3IzMueyag50Z/q90QKVGgPQttxvFxdQhivaboIn500UzvL2T7T0joEN2mDsY35XJqsUDKYJLT26rAeufRIdfTqawaCWSzIstdUInYwCzIqjhEfyyvTWP2CbVZ5QeintVhouHJuv8D0MwDdkI1lwKJrLqti3fjPTlHeUDjuvvRAfY5LoToGzCK+LRBaqyG1WyPlNbaXQaRistxrDp9gsPumD//8wjxj7rlHrVJj6LOBOXWoHKxam6kREFYitsfgt1CWTGOuWGhfU9pz+WXQnV7rMRWYkJdLNLUup2TPOjzpGti1KkaTLjo2TLsSygxqMHMP8giVFTu4ZIbAa5xRbC3nbeuEArbPd08EFklK7PDqHRV4fVyu/5ZsxBvJw+lmVZpleqzKDs8FlDTISw72f9e5t+ADqCUVaO94XE1PcR3bSJCwqmjlLDwTxff0/okKem6/TryYKY0CHZFGX61s5LsctUDr+ZD3bQBZshxySpOLCF3lVrwVFmga7xg4Q/j4fPZl1Ux/e/fU46xaax3Ce16EaaptV9ULdz9p6fU3GEoqHxhQtUAQpEwbAcebrYHxkL7BezK5olUD0JB3Z9dAvHCBrsi4V24pnARaq0nDTH22EG0Mw9S2q94l0wUPwLUzJb6q96am8TXvRyxKGCw04prIt7+9MdKom5D6OIolXIehUUyfOlqQetYnSDDXUaUp5bsuUjP0eNSbU9qUWuYox2mwhDw4tsGibOauZcZJJ6IQ2yTZ48xFegYsVUbKFl6jgExOyaKm0tRnIb9DZh+FISKwZS+07NJH1vbP9WXkOn/0MeqyKvTNqdPqGJHM7oh1ee5FcFpVO8GD9+wR10gmIWroP7E6ka9iIkLu4spQxvicFeAk1VezagvaIooyMXundawWT3PgtVrT3K85Y1XzYOpB75YFA70IT4pn/SKID0js5hsuu6E2+JK4MpXUVH+CCAAQDokrJDRfvWwUubpou9XNVB8mfUchfz+ifCjAJPDOibD0jAkuXoiEQF3Z9E8cw0O5jwWisNA6FwK3M9dMW+IIWApddigAlP2wuyBNXrEJntw5wtH2C4c7Nm534erKE+byUBhxKlop1JplIa+sj2mr3vjDVkJSJs7MBI5i6fts8dvg/yl65d3ClkQB3mOAgLfFagN2X80vzW7C41NxrWT5AceGcjYvQcVTDsbW4YOYa1UhoIQB9Mq16fhg1VmjRg9R07ET0RVA7P6a7hQxjENmrcQgsaIhOs/0z3zWl9OxjgCNCLhRo2la6pWV41bYimn4sZqKVRP8GLmiVR6x1mA54e6wNQaGdbMZRgBKOenwRiruc/52cL1xeO5MKaiFyHuYSJ0woXtRyw+uTxfMsSOTYEbWMT/3o3+uRenbwWWDc6cPHxsTorEOAPTzDfPj+cMzv2TxZDDD0vzMEDbYa3604KMNsjC9425W58Bhu9WEI8nistflngDJMPF13RU1Jk5EFgemQ3DDmJSjSkJAxLooHVnv/TGWWSyI0NrWvQ07sy+oZ8ZBg9XNVNdbkx2aHllsNsJA96fx4Fk97OwbJwJ3Rn+jwCNJEXPoDrWOtZ3I+OmKkDLob9tMDE+kYxgdcRL3A3vqaw==\",\"bmDcpMLP2vhicSc0UmQ9laRPSEQ2y+2B4GzpvquFSyAcllSS2ZoxulThYp+DxLfAV2IVYKY6n+suX/TBRfrsdbilGLwJQopmWLWtlUtn1175Osps4jcvygzdd8NggU/eY08bNS9X6uoJ+MMauWjV2Ed498u052XJrcxZAwP2toWQyrMUroa38L4uuOtRO9qhIoXSgOtrimyUJiiFe9WNl8a4iMNMFZR15yZG8ADrMmWPdIBGNQQrP3Xo/iEjP/u8yLIwRHwMQIMq194vTLecIsawtXFdzsg51RSuV1GBuodyqejtrz36bTCq3sMnOVkS2NSc+vunepdQyPFZ3xRZ3if+ulbc2CdhrPcOsFTHdMKfFaJbJ/FnF4pRfBdgo1xU2hmMkfB+RKzq/hNxIysiQRHYcyONQMM5yJ/1a+k+QUaJCxKCpXwshLebTu2aQzdaXGIlh/U9EbeTMq5Chu6LVps+58SSqe8Zu1UHZk/BSUvFpjeAhKUjrJ6tM6F7a9kGXNkSmKyWfaqklkMXN6MhOKzNOS9BdlLK0ioz9GfBmZSo1qgp3ZF1r9aU3DTqtc594bu+8ASGJI9ZGOiE2IzRmNICUdkQ2VEO6hs9DJM0hSTtutbQaqsFT79lzLFU7ck3IadjkypyUVbn79BwD4hWoRestsjqTGUiqcoEoUGrCESGXvQwIvGAXGDDMlC8UwPwUBYUAIM+UoyhMggbJ0m4M6tGzXQd7KclEof6WongJ8WuXpBpnshk00y94+t4ws+QOWzHKgKy6jK08bLm16TMLg0hDJGinc1e9YJbJD7aCS9rexZqPyoEhoclncERvmtUmp5rCfDKy5qtAA7+ov/NaqdU9anPdl19GnI9TBEzSExOdYqTgCgf9QESziEQuxsOul0fEp1i9C6bSVZKsQ1fvV9yb/Uf2GqFbrUCA9o2ymbqqhzrWpJMnCtDa6xZQVTikgO9rN9Vbox6pQhFXD9XqS56RSCESOy12jn+mVpT6/dCnaD4CSf6Vt0dFq4KlI8KIBXj6tOP8rSCEgQjclcEmKTr4qgg66UsR4tjhoDTRtp1cfFppNPRVGeaLoY+WBi5BuKMFHXlndm0Ln8dHFxTJw6KII1MOr70I3zSwINd7CPUE1+ZTeZFtNmnKgCISoYC0Yye1tVscP4n9A/SwIVkqq841JHXZkzL/BqMwc33O0ySQLauU/NgnzH1D2iI2rK1q7finJH1hOku+XeQzGVGzqXYkx2vtasXqWpcfZnmph09RMzapc02nd0AUUjhml7XjmrpG+IHVM/vSn2TxyQ7HeXaTu0NGbyrr4cKRUXmKkelbupGmrVWjINsCm0vcCb0Xo1rGHa+KY8+cYHITj72RACdGAJ15v6YMSq+SX+baiyt6y0TTXjuPS5Vb7+tpW+HlUiRHEVNP5lTpTgptfAL791KJgouthha4TJd17u9yeqJ+nAuYYlRyOXamKPsqR4Kw6UuYMGFTJAWgJZdTA7KvFVw8Kry3VwbxqapbFDcGDOiGTbzsmZ18iFk8NrgOAvtzm3zmNFqGO/V7KKkgMCaQ9N4/312iGL2GQ2HFITQlirPHnCeOdvlPBgm18GorYfJWVMnbAporV2CsrB8EnyylB8HRVPPFQOQjrNpqOorH9MBPKxLsJcPNDX9KNVMLOwXr0ulLvnWgFNyaV2GQ46uuUfNIp7ahp3hUzx0/yq/HFTfcbEOygZARnn9dM9vEBqUVioO4iKuYsd2BrVZPcc6zPR/YZiS4qMqce1zz/M8nMsDLY08QbVLULtvhgNuh/At9XNRBtRE+tyYkZ3bm3rGPi+gN8I4Zygyag==\",\"A8wQrcrHr2+h+TG0o+QYKi4YGlINEs/D3b13XthduJ/J1YuUN8jYagq8RgZdzEUEgQyJ/RJv6Bcp5uXClZRP8u3x+3Ku2xKtsLRW0lAsFhHyWmKRKYEfZqNyQ1eOlHbp2D0p49MYOhLWUBqwlHqVLBrF1t5IoPsNTcARa9WLSkPARcy6gCiwJAqnPncHX0KclJq7Xje0f1H7MejacmlWcM4pYX0bD5m+sdnTkziy1gGS+HBuOyOtJYl6NzcWLZ9PE6CEgw40jlnlANxFSdJQtcHXIEMIw97atIAAeFldWfrhx+MSfYQ/TAzqdU8kAA4W9Vry4PiHteo5prbWu5VZZ/PCBRBFelRkskvcN+tGI5R6UAdaNxdDOzlZkinWRa5uCqvazdsRY7rFwYA0+XP9GyOwPCcR3FTtRkGY/uhvF9B//PvhVZC1VA0TAXSZqHSBQ6r+Wc3PqLeiVAbD0G+uvddAUpqmHwlLkmFrUBy9b+6J6h1IuRTHHVAsukCmZCDLSuR0lxxecf0E91LbXYYk3GkpctIgJegR2ypHXRZkDcBrOlebbGBFadvbvrFXtinAB8qC5btd1Pb7c6j55/qPPWt8UTSwNzkU0ukbzKk1VrlQTJuq2OOL7QSmtT8eozoFGfQ2piC3+e+z4U2palK1LNL2YOP7QQ6Cef9bAymzcBCjelIsq05EcSDN4THM2Frww5l72bpKPLIM48WeiiuoYmNdMRVCJ8VirwE0N2lj81BwGq4+ofxygCt/UhTqMGNMJXtVefxS1ABEtpJl14wOE+p8MfVM6XxVRK1GARCeaWbp2PCmzvkqN1wjaAlS8rGzyFZ6SQDSaFlxOz3i+KBrIbojDBCLdmE5Dc2NwvF8CcvA3CTlyC/Cw5c+NDpbq63jnRo4Bol9py22CpbBBb6b71378K5tiTNMqI7KXgyfDxZ4gopthvwqjKJSIU9QVX1AflC5tmW6dzCTvkFZusmPXTknKrTxNKnkcce6onknGuE6Qdelp9EzvXfZPhenL412eF4wSa4dF8hYMeHjuB0g5tlWWfDc772mvEwYCI5T0A0Kidn5wuyInuucYS47OuQvYBLtwOHqVYTd7494n6EAKRAa7h+O2IFjIGBNnzBVwR5IodAAqldpQ9aQP8VqzY2lmfTy+7cb67nclqPCfN2rYKNq9Y6B7TpUAhy/B47tVW7BA0borQuTpu8kAkfOCfMalChMsGOyeRM5yUzfDIOLOT1AHbfzm+06UgpwxkQSdsDQqcZ9PU+LW/p5cG3+m2r2eVUmTdv65+LyXVFKdlxFUlsww/Km9BPBBvPqWhWb/GKPMT9VRT5hnTkzLdi9kwmPNplXIKvWJALq7gvq65Cs8P0XCWtWbGJ4Xjg/2Tfkr9j8PCxFEzuhaplVUaOucSY5HKUu4s+mYMSVKXvHWsg+kF7JQYKpBTkGx49zSRAXuBmYt73NAFACCuu8swcUzlYxDAEoignR9A6jwuY7UeEOT+Z0KG8U2ZMeg0+HpgAbqO0fQCC5RSuvA5fdP4Or3mu+74212PXPjhTjDA+oSaRWfzFVo94qelEpkTmx1YqRmptABrEbLOrddUxjanzWSkxpzjlB0NAAspXftwuxWy3eikFNxNnKd99qCdS3FhIoRlMpZXV1ofCQnA0dsmvXP77YVJ9IgTpjmaa0EnSHOrsXWqW5F13+tSZ5Uw2Ua4YGyLN/Xip/blyed0P7OUR9t4iEdbJ/+YfsxBVoWGVqmsOuNIZ06FhYsL9o4egAerUMzoIfzFUNQg0BiwKbKfW3VZETEspCq2c9cFyvNsVX+sXN/JzhUmegGM8dnw==\",\"o5Z33BcaQnX74hHtukZIDbGsCAGQSJ4PdzdMEMVc5Wj5Zsv/YYT1+hnrCG5JWW+/0pHejfp2PPVt9emV3zzWyV/JAoeQlSS/cEvdRQWCbzp373MkMNhdVQ93UEsBwnXuIJBT1ON3rGH0Ha/h5qCrd6iflM3T6r+j7JrsGLAI4l2NBetkHQDGq6CpKiDvSryH+ip9Texmm9gkVWmuAQvPoctnouIwYBhU/z4QQP+Dc98vyctTeYabhq5MTNZvUr3elU9Zv34y1PaaxnlzMWk85kgz7iepqIYDdGERO7VykgxUA/P1iylkW+0uu74ms946J8sTidh3726kcSoSB2YXXxErpfxoNYBDznJvsy631xnZXPJug6DZKw7pPqbcW9YMBpqqycUsi0itA+XOihfpMWMjxI7Umz8/y9zGTpr2FbBA25meTOW4YUUwlHsDTb5irwaeO/ESF1FFu5+t2r96/bd2N6tjpN517FY7lPIn18J3YTpkWLIPe4W86CjymqNiOl9qDdpFB6hV0a1PVj61UXuihYFZQwb5ddD5w+OZMduIL1ptif9l8J/fIIG07N0I1tQf1jajeneltQAz2GVKnlieRK4IJJsoDyegNTE9uHU7HjGZSa3UGahtQvACnIkuxAFE7eWeeZa9M/HI21YFg6TrK0P3INvFG4fSo8rRzixRA358OhpQZoc3Q4T5WsgqVntUvyZNoM+yR8YbWE5yBRhx1zPNBBSAlCtynE1iNeOutZFnOLeCW6APWrm603Nhn3TIN5ahzwm1Cw+ZRy2iPoNB5DehcWy9vZ+/Qg+bVjOrzpQzq71RksRq8FlayAyCFiTJGw50QSpBoOqB9+4dchX9U5xqK0VZq0hO1cRa2195HHa25CB+5YD6Ah333Qv33G9mUbeRd5tPKH531jZJq/t6U4QGphjpXDHivGvehqAgTp4+I9q+JKE3VilKixhs74WpTicfskFUdjU1wT92MNeytUUdOF4LSm2I94WkXhEr/D/H+hR7IBtRwdKTi2NpDfAqR7YOnI6ykjbiGUNs3QoBuAHfm0+LSmmVIMiJQpgKTamU7DxJD+MLQpdK4VlTy8zakoIIW6Qhfm3l1ynzndYhsYXrboqiyit9j/jCF9Jms9ZACm4wnxX/LhV2NGq1YiFAUXmve3c6X5tXCoMW9n0hFcrb5RsoDtiqVjltYQZkzEedjad3jJoaMeb2zyb9/foNq7zQO/VWxz2vkvZ83Dm43tm2Bxi30lRkNebXH3wtZP/8/DVAB/sjrlEstVbBb3owzKow51ZwK47D0U+wvn4tgEdPWEvx4/evb+J1rGCxJ8ZopmEe40UVibSzvggt0R2zdcjZ75aA5/kSDhsP2G312g7yy6IBVKsiqJMvxgL+UZus3dD+DBVyE7ChCnb/KQTkif/D+Quh3EsQD6vN/FjhnXKmqReBUjJwzk2X9ArqgKqHeC4kHbP16NiqrRCFfHMZ933Jizo+2e2lmFZk51qsCtIndR6iJ4i0MeF+dWQ7UY3c/tdkiLw8XzPWxbgT8pW3KpGWlhgIqCrnfq5mC1C/+pGvEE21V6UoK3xDifC/EBkekoDC05B34rmRqqf+qyqurtXm1Uo0Uis1bAuVr1NNfD7cL0AL2TIqParZ1lCsPoSpixkb6963ErHn79dSb1v9GEpI5WWhF9j9kosoywzJ+GuJaNHwdregbegu35GUPM5++/8AAAD//w==\",\"jJ3bahwxDIbv8xTL3m+xZcuW8i6hpGQJpTnRbKFQ8u7ln5kWol9DclVoc6S7Hln/4Xt3mxnNOSSK92FkfjU0T1SyrcEBFceoBiXYhLyKzs69dE215L25MIf4GysrqxLiB9s7J5b9whXRD9TpVR3vzqx2VMYxLx72MsJo5iSetkj0cUeEZoTRSXBJWV8w4kL0ZclER+znadi7DOUuiqT1h6FQm39RECeKzZCxeGLdrXZJsIBKV92O8Wyw1orsQbwO0Gm8F9YAXjQx/aJhtLNg0pxeRNOHtxFHCMd0Q7kjmz6MzB+aERC0qVLBKY5t4tXXhkgvE7ww0EYHU29AQXeyRImxe3N6J6QfFiN0TZ4dzDkG0ADcE1tpI31ki1OA5s757+mxdyvBZqw/rC04a7q9CJJeNLMtJAQy/XkHP5bWTmVGWo7CLdNi62iGZRlqGk18oJ53DrqB1sjWjay8CR3ZQhWxmdu3zKl9crA88yvWAo9o9IhDjirM0ewmXFXD7T77VK/0K6Cvzy263DGsTrI8gdbsUYCGwzvaURU6G70Tc6OMDplGc3iHq9biRhWGlDo+iuqlyJ91s6WDbPpiGM5p24BEHxcRoCmkkNIKwT4pAuC64+3o4fA0FgaQ1qgFkACO2GFVIWY3Pn/GgQ3Un1hYUzAZxYjzknkleCyQ8knY0YqxJygacvaiIdxRkYdb1peGmFr8VaGWU6cmaCSSSFFJs3RqZQMI2xqhV+CnQTN9LEfs2qNv04pOmbQuECMvXK3jPbV8K/9qNIVKV9iBY+Gh6uRoy5jFvNIyj8IxO92mq8EERMTodEJ7u/EoPowiFXUWmvB7cS+0Wkm7x1JAw47xLx/C8ER3IgEWqCgxzQRuRYtgJADV+EKK/oJwx1YxaBBRu0SOimrX0ajM1wvDeoXENFSyEH0Mb/dCq/vmVgtt2b3XQX1iqcQmyGhScQgKjnqJcLw2vX7CrJYGhvcpVFUdtSNUXbKUvRLlK0JlNnGoldgynxZCttoZy5kQq/aT6qLDa1S9KrjBNVzpxR3yI7v45hQjPm2Fz4MKHYEYpqDKwsigbE4uYCZAwy0KMStXcNVAotsUI8NRQ0kgEE7jCwRJqKRXH5U3HvyuXcowI8GV9J3VGtuNCr8qypM4LoPXkxWKZHQ8WZwciTiba8RSpMpVVxS/sRc4DXoxB6VAch6fM9xC5ButfQpaOlUL74hEEN2sHzyvNrvtsk6KRxD04cnN3+aY1OOTCJoa1dy2justIXQprr63Fs27rTDBj2hUSFR+EEicoIYChAjRABEqiKHqojo7ZVUEOrAx5ymBeu0sUAVtCEKbgAUnS5eFjnZ/Cm5pV5IpuCRtJ1tQvhQ4P2M0qEoTHsrxw9ao66LpzmjXiibT+CBj89o/90SoN1jN4G6TJu2GVsUoGFe0eI54tlMD8il126btdXlX4fLfOCaCUBS5ao51LaWjgi8vTQukLQibgQRpsDCoon+QEJYpZIc74tZKXXRK0Taouiiv54M4ux5mJVr9xLo36mzP6AocNl8L9ZqOqB1hi8AFkFAXaCVYR5tzJKeTDSFLDBCgUZseZc5OsADB3s2pwSxapbceBysW5R1uol91RaAJdHw05m7sDmBUo1cHaRqjFpzZNSIBagD2rMYEHUoUhwYcSK3b390sf75dHQ43+LDj4/Pd+eF4fThezr8vp/Pjt/Pd3fen+9Pt3e2pFDkuH/Tr9fb+fLw+/Fk++fjy8/nx5fL18vzj/PR6vD7I/0ngeHm+3D68/5crfLu3q78AAAD//w==\",\"AwDTh+ar1IYBAA==\"]" + }, + "cookies": [ + { + "domain": ".api.openai.com", + "expires": "2024-03-11T19:13:26.000Z", + "httpOnly": true, + "name": "__cf_bm", + "path": "/", + "sameSite": "None", + "secure": true, + "value": "aZ9gGSKzLRf6CetGtPPoArbq3ECceGzbCYmg6BefVAY-1710182606-1.0.1.1-6KdUAsmpCR_7lNFvNt5pDTbYcWOYfNNwZKgaxyriQpn8sRjSXteMLDRLJJ7JkMDz.2Ic7RHpcLCnM_WXFXsSgQ" + }, + { + "domain": ".api.openai.com", + "httpOnly": true, + "name": "_cfuvid", + "path": "/", + "sameSite": "None", + "secure": true, + "value": "z_GvV3dlO7q1zFRkqjLDzHbtRU.S2YlgG51CKRIb5Sw-1710182606276-0.0.1.1-604800000" + } + ], + "headers": [ + { + "name": "date", + "value": "Mon, 11 Mar 2024 18:43:26 GMT" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "transfer-encoding", + "value": "chunked" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "name": "access-control-allow-origin", + "value": "*" + }, + { + "name": "openai-model", + "value": "text-embedding-ada-002" + }, + { + "name": "openai-organization", + "value": "traceloop" + }, + { + "name": "openai-processing-ms", + "value": "68" + }, + { + "name": "openai-version", + "value": "2020-10-01" + }, + { + "name": "strict-transport-security", + "value": "max-age=15724800; includeSubDomains" + }, + { + "name": "x-ratelimit-limit-requests", + "value": "5000" + }, + { + "name": "x-ratelimit-remaining-requests", + "value": "4999" + }, + { + "name": "x-ratelimit-reset-requests", + "value": "12ms" + }, + { + "name": "x-request-id", + "value": "req_66f25d4b21d666794c552aad3bb73750" + }, + { + "name": "cf-cache-status", + "value": "DYNAMIC" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "__cf_bm=aZ9gGSKzLRf6CetGtPPoArbq3ECceGzbCYmg6BefVAY-1710182606-1.0.1.1-6KdUAsmpCR_7lNFvNt5pDTbYcWOYfNNwZKgaxyriQpn8sRjSXteMLDRLJJ7JkMDz.2Ic7RHpcLCnM_WXFXsSgQ; path=/; expires=Mon, 11-Mar-24 19:13:26 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "_cfuvid=z_GvV3dlO7q1zFRkqjLDzHbtRU.S2YlgG51CKRIb5Sw-1710182606276-0.0.1.1-604800000; path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" + }, + { + "name": "server", + "value": "cloudflare" + }, + { + "name": "cf-ray", + "value": "862db0a75a8f0e13-MXP" + }, + { + "name": "content-encoding", + "value": "gzip" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=86400" + } + ], + "headersSize": 1066, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2024-03-11T18:43:25.937Z", + "time": 698, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 698 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/packages/instrumentation-llamaindex/src/custom-llm-instrumentation.ts b/packages/instrumentation-llamaindex/src/custom-llm-instrumentation.ts index b2d22666..17126f92 100644 --- a/packages/instrumentation-llamaindex/src/custom-llm-instrumentation.ts +++ b/packages/instrumentation-llamaindex/src/custom-llm-instrumentation.ts @@ -4,6 +4,7 @@ import type * as llamaindex from "llamaindex"; import { Tracer, Span, + Context, SpanKind, SpanStatusCode, trace, @@ -14,7 +15,7 @@ import { safeExecuteInTheMiddle } from "@opentelemetry/instrumentation"; import { SpanAttributes } from "@traceloop/ai-semantic-conventions"; import { LlamaIndexInstrumentationConfig } from "./types"; -import { shouldSendPrompts, generatorWrapper } from "./utils"; +import { shouldSendPrompts, llmGeneratorWrapper } from "./utils"; type LLM = llamaindex.LLM; @@ -85,6 +86,7 @@ export class CustomLLMInstrumentation { result = plugin.handleStreamingResponse( result, span, + execContext, this.metadata, ); } else { @@ -139,6 +141,7 @@ export class CustomLLMInstrumentation { handleStreamingResponse( result: T, span: Span, + execContext: Context, metadata: llamaindex.LLMMetadata, ): T { span.setAttribute(SpanAttributes.LLM_RESPONSE_MODEL, metadata.model); @@ -148,7 +151,7 @@ export class CustomLLMInstrumentation { return result; } - return generatorWrapper(result, (message) => { + return llmGeneratorWrapper(result, execContext, (message) => { span.setAttribute(`${SpanAttributes.LLM_COMPLETIONS}.0.content`, message); span.setStatus({ code: SpanStatusCode.OK }); span.end(); diff --git a/packages/instrumentation-llamaindex/src/utils.ts b/packages/instrumentation-llamaindex/src/utils.ts index 713750f2..efc2c57f 100644 --- a/packages/instrumentation-llamaindex/src/utils.ts +++ b/packages/instrumentation-llamaindex/src/utils.ts @@ -3,6 +3,7 @@ import * as llamaindex from "llamaindex"; import { trace, context, Tracer, SpanStatusCode } from "@opentelemetry/api"; import { LlamaIndexInstrumentationConfig } from "./types"; import { safeExecuteInTheMiddle } from "@opentelemetry/instrumentation"; +import { Context } from "@opentelemetry/api"; import { TraceloopSpanKindValues, SpanAttributes, @@ -21,14 +22,46 @@ export const shouldSendPrompts = (config: LlamaIndexInstrumentationConfig) => { return config.traceContent !== undefined ? config.traceContent : true; }; +// Adopted from https://github.com/open-telemetry/opentelemetry-js/issues/2951#issuecomment-1214587378 +export function bindAsyncGenerator( + ctx: Context, + generator: AsyncGenerator, +): AsyncGenerator { + return { + next: context.bind(ctx, generator.next.bind(generator)), + return: context.bind(ctx, generator.return.bind(generator)), + throw: context.bind(ctx, generator.throw.bind(generator)), + + [Symbol.asyncIterator]() { + return bindAsyncGenerator(ctx, generator[Symbol.asyncIterator]()); + }, + }; +} + export async function* generatorWrapper( + streamingResult: AsyncGenerator, + ctx: Context, + fn: () => void, +) { + for await (const chunk of bindAsyncGenerator(ctx, streamingResult)) { + yield chunk; + } + fn(); +} + +export async function* llmGeneratorWrapper( streamingResult: | AsyncIterable | AsyncIterable, + ctx: Context, fn: (message: string) => void, ) { let message = ""; - for await (const messageChunk of streamingResult) { + + for await (const messageChunk of bindAsyncGenerator( + ctx, + streamingResult as AsyncGenerator, + )) { if ((messageChunk as llamaindex.ChatResponseChunk).delta) { message += (messageChunk as llamaindex.ChatResponseChunk).delta; } @@ -50,6 +83,9 @@ export function genericWrapper( // eslint-disable-next-line @typescript-eslint/ban-types return (original: Function) => { return function method(this: any, ...args: unknown[]) { + const params = args[0]; + const streaming = params && (params as any).stream; + const name = `${lodash.snakeCase(className)}.${lodash.snakeCase(methodName)}`; const span = tracer().startSpan(`${name}`, {}, context.active()); span.setAttribute(SpanAttributes.TRACELOOP_SPAN_KIND, kind); @@ -98,25 +134,33 @@ export function genericWrapper( const wrappedPromise = execPromise .then((result: any) => { return new Promise((resolve) => { - span.setStatus({ code: SpanStatusCode.OK }); + if (streaming) { + result = generatorWrapper(result, execContext, () => { + span.setStatus({ code: SpanStatusCode.OK }); + span.end(); + }); + resolve(result); + } else { + span.setStatus({ code: SpanStatusCode.OK }); - try { - if (shouldSendPrompts) { - if (result instanceof Map) { - span.setAttribute( - SpanAttributes.TRACELOOP_ENTITY_OUTPUT, - JSON.stringify(Array.from(result.entries())), - ); - } else { - span.setAttribute( - SpanAttributes.TRACELOOP_ENTITY_OUTPUT, - JSON.stringify(result), - ); + try { + if (shouldSendPrompts) { + if (result instanceof Map) { + span.setAttribute( + SpanAttributes.TRACELOOP_ENTITY_OUTPUT, + JSON.stringify(Array.from(result.entries())), + ); + } else { + span.setAttribute( + SpanAttributes.TRACELOOP_ENTITY_OUTPUT, + JSON.stringify(result), + ); + } } + } finally { + span.end(); + resolve(result); } - } finally { - span.end(); - resolve(result); } }); }) diff --git a/packages/instrumentation-llamaindex/test/instrumentation.test.ts b/packages/instrumentation-llamaindex/test/instrumentation.test.ts index 850ba1f5..60e2ae3c 100644 --- a/packages/instrumentation-llamaindex/test/instrumentation.test.ts +++ b/packages/instrumentation-llamaindex/test/instrumentation.test.ts @@ -200,4 +200,58 @@ describe("Test LlamaIndex instrumentation", async function () { result.response, ); }).timeout(60000); + + it("should build proper trace on streaming query engine", async () => { + const directoryReader = new llamaindex.SimpleDirectoryReader(); + const documents = await directoryReader.loadData({ directoryPath: "test" }); + const embedModel = new llamaindex.OpenAIEmbedding(); + const vectorStore = new llamaindex.SimpleVectorStore(); + + const serviceContext = llamaindex.serviceContextFromDefaults({ + embedModel, + }); + const storageContext = await llamaindex.storageContextFromDefaults({ + vectorStore, + }); + + const index = await llamaindex.VectorStoreIndex.fromDocuments(documents, { + storageContext, + serviceContext, + }); + + const queryEngine = index.asQueryEngine(); + + const result = await queryEngine.query({ + query: "Where was albert einstein born?", + stream: true, + }); + + for await (const res of result) { + assert.ok(res); + } + + const spans = memoryExporter.getFinishedSpans(); + + // TODO: Need to figure out why this doesn't get logged + // assert.ok(spanNames.includes("get_query_embedding.task")); + + const retrieverQueryEngineSpan = spans.find( + (span) => span.name === "retriever_query_engine.query", + ); + const synthesizeSpan = spans.find( + (span) => span.name === "response_synthesizer.synthesize", + ); + const openAIChatSpan = spans.find( + (span) => span.name === "llamaindex.open_ai.chat", + ); + + assert.strictEqual( + synthesizeSpan?.parentSpanId, + retrieverQueryEngineSpan?.spanContext().spanId, + ); + assert.strictEqual( + openAIChatSpan?.parentSpanId, + synthesizeSpan?.spanContext().spanId, + ); + }).timeout(60000); }); diff --git a/packages/sample-app/src/sample_llamaindex.ts b/packages/sample-app/src/sample_llamaindex.ts index 761a7269..e909545c 100644 --- a/packages/sample-app/src/sample_llamaindex.ts +++ b/packages/sample-app/src/sample_llamaindex.ts @@ -36,6 +36,7 @@ class SampleLlamaIndex { const res = await queryEngine.query({ query: "What did the author do growing up?", + stream: true, }); return res; } @@ -45,7 +46,10 @@ traceloop.withAssociationProperties( { user_id: "12345", chat_id: "789" }, async () => { const sampleLlamaIndex = new SampleLlamaIndex(); - const result = await sampleLlamaIndex.query(); - console.log(result.response); + const res = await sampleLlamaIndex.query(); + for await (const result of res) { + process.stdout.write(result.response); + } + //console.log(result.response); }, );