Files
e-tib.com/.next/dev/server/_rsc_src_lib_qdrant_ts.js
Marc Mintel d14122005d Initial commit: E-TIB production hardening & E2E foundation
Former-commit-id: ef04fca3d76375630c05aac117bf586953f3b657
2026-04-28 19:11:38 +02:00

35 lines
23 KiB
JavaScript

"use strict";
/*
* ATTENTION: An "eval-source-map" devtool has been used.
* This devtool is neither made for production nor for readable output files.
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
* or disable the default devtool with "devtool: false".
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
*/
exports.id = "_rsc_src_lib_qdrant_ts";
exports.ids = ["_rsc_src_lib_qdrant_ts"];
exports.modules = {
/***/ "(rsc)/./src/lib/qdrant.ts":
/*!***************************!*\
!*** ./src/lib/qdrant.ts ***!
\***************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ COLLECTION_NAME: () => (/* binding */ COLLECTION_NAME),\n/* harmony export */ VECTOR_SIZE: () => (/* binding */ VECTOR_SIZE),\n/* harmony export */ deleteProductVector: () => (/* binding */ deleteProductVector),\n/* harmony export */ ensureCollection: () => (/* binding */ ensureCollection),\n/* harmony export */ generateEmbedding: () => (/* binding */ generateEmbedding),\n/* harmony export */ qdrant: () => (/* binding */ qdrant),\n/* harmony export */ searchProducts: () => (/* binding */ searchProducts),\n/* harmony export */ upsertProductVector: () => (/* binding */ upsertProductVector)\n/* harmony export */ });\n/* harmony import */ var _qdrant_js_client_rest__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @qdrant/js-client-rest */ \"(rsc)/./node_modules/.pnpm/@qdrant+js-client-rest@1.17.0_typescript@5.9.3/node_modules/@qdrant/js-client-rest/dist/esm/qdrant-client.js\");\n/* harmony import */ var _redis__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./redis */ \"(rsc)/./src/lib/redis.ts\");\n\n\nconst isDockerContainer = process.env.IS_DOCKER === 'true' || process.env.HOSTNAME?.includes('etib-app');\nconst qdrantUrl = process.env.QDRANT_URL || (isDockerContainer ? 'http://etib-qdrant:6333' : 'http://localhost:16333');\nconst qdrantApiKey = process.env.QDRANT_API_KEY || '';\nconst qdrant = new _qdrant_js_client_rest__WEBPACK_IMPORTED_MODULE_1__.QdrantClient({\n url: qdrantUrl,\n apiKey: qdrantApiKey || undefined,\n // Disable qdrant client's own version check to avoid the warning spam\n checkCompatibility: false\n});\nconst COLLECTION_NAME = 'klz_products';\nconst VECTOR_SIZE = 1024; // Mistral mistral-embed\n// Cache TTLs\nconst EMBEDDING_CACHE_TTL = 60 * 60 * 24; // 24h — embeddings are deterministic\nconst SEARCH_CACHE_TTL = 60 * 30; // 30 min — product data could change\n// Track collection existence in-memory (don't re-check every request)\nlet collectionVerified = false;\n/**\n * Ensure the collection exists in Qdrant (only checks once per process lifetime).\n */ async function ensureCollection() {\n if (collectionVerified) return;\n try {\n const collections = await qdrant.getCollections();\n const exists = collections.collections.some((c)=>c.name === COLLECTION_NAME);\n if (!exists) {\n await qdrant.createCollection(COLLECTION_NAME, {\n vectors: {\n size: VECTOR_SIZE,\n distance: 'Cosine'\n }\n });\n console.log(`Successfully created Qdrant collection: ${COLLECTION_NAME}`);\n }\n collectionVerified = true;\n } catch (error) {\n console.error('Error ensuring Qdrant collection:', error);\n }\n}\n/**\n * Hash text for cache key\n */ function hashKey(text) {\n const { createHash } = __webpack_require__(/*! crypto */ \"crypto\");\n return createHash('sha256').update(text).digest('hex').slice(0, 32);\n}\n/**\n * Generate embedding using Mistral API (EU/DSGVO-compliant)\n */ async function generateEmbedding(text) {\n const cacheKey = `emb:${hashKey(text.toLowerCase().trim())}`;\n // Try Redis cache first\n try {\n const cached = await _redis__WEBPACK_IMPORTED_MODULE_0__[\"default\"].get(cacheKey);\n if (cached) {\n return JSON.parse(cached);\n }\n } catch {\n // Redis down — proceed without cache\n }\n const mistralKey = process.env.MISTRAL_API_KEY;\n if (!mistralKey) {\n throw new Error('MISTRAL_API_KEY is not set');\n }\n const response = await fetch('https://api.mistral.ai/v1/embeddings', {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${mistralKey}`,\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n model: 'mistral-embed',\n input: [\n text\n ]\n })\n });\n if (!response.ok) {\n const errorBody = await response.text();\n throw new Error(`Failed to generate embedding: ${response.status} ${response.statusText} ${errorBody}`);\n }\n const data = await response.json();\n const embedding = data.data[0].embedding;\n // Cache the embedding in Redis\n try {\n await _redis__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(cacheKey, JSON.stringify(embedding), 'EX', EMBEDDING_CACHE_TTL);\n } catch {\n // Redis down — proceed without caching\n }\n return embedding;\n}\n/**\n * Upsert a product into Qdrant\n */ async function upsertProductVector(id, text, payload) {\n try {\n await ensureCollection();\n const vector = await generateEmbedding(text);\n await qdrant.upsert(COLLECTION_NAME, {\n wait: true,\n points: [\n {\n id: id,\n vector,\n payload\n }\n ]\n });\n } catch (error) {\n console.error('Error writing to Qdrant:', error);\n }\n}\n/**\n * Delete a product from Qdrant\n */ async function deleteProductVector(id) {\n try {\n await ensureCollection();\n await qdrant.delete(COLLECTION_NAME, {\n wait: true,\n points: [\n id\n ]\n });\n } catch (error) {\n console.error('Error deleting from Qdrant:', error);\n }\n}\n/**\n * Search products in Qdrant.\n * Results are cached in Redis for 30 minutes keyed by query text.\n */ async function searchProducts(query, limit = 5) {\n const cacheKey = `search:${hashKey(query.toLowerCase().trim())}:${limit}`;\n // Try Redis cache first\n try {\n const cached = await _redis__WEBPACK_IMPORTED_MODULE_0__[\"default\"].get(cacheKey);\n if (cached) {\n console.log(`[Qdrant] Cache HIT for query: \"${query.substring(0, 50)}\"`);\n return JSON.parse(cached);\n }\n } catch {\n // Redis down — proceed without cache\n }\n try {\n await ensureCollection();\n const vector = await generateEmbedding(query);\n const results = await qdrant.search(COLLECTION_NAME, {\n vector,\n limit,\n with_payload: true\n });\n // Cache results in Redis\n try {\n await _redis__WEBPACK_IMPORTED_MODULE_0__[\"default\"].set(cacheKey, JSON.stringify(results), 'EX', SEARCH_CACHE_TTL);\n } catch {\n // Redis down — proceed without caching\n }\n return results;\n } catch (error) {\n console.error('Error searching in Qdrant:', error);\n return [];\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LHdCQUF3QjtJQUN4QixJQUFJO1FBQ0YsTUFBTW5DLFNBQVMsTUFBTTlDLDhDQUFLQSxDQUFDK0MsR0FBRyxDQUFDSjtRQUMvQixJQUFJRyxRQUFRO1lBQ1ZkLFFBQVFDLEdBQUcsQ0FBQyxDQUFDLCtCQUErQixFQUFFK0MsTUFBTUUsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7WUFDdkUsT0FBT2xDLEtBQUtDLEtBQUssQ0FBQ0g7UUFDcEI7SUFDRixFQUFFLE9BQU07SUFDTixxQ0FBcUM7SUFDdkM7SUFFQSxJQUFJO1FBQ0YsTUFBTXpCO1FBQ04sTUFBTW9ELFNBQVMsTUFBTS9CLGtCQUFrQnNDO1FBRXZDLE1BQU1HLFVBQVUsTUFBTXhFLE9BQU95RSxNQUFNLENBQUNwRSxpQkFBaUI7WUFDbkR5RDtZQUNBUTtZQUNBSSxjQUFjO1FBQ2hCO1FBRUEseUJBQXlCO1FBQ3pCLElBQUk7WUFDRixNQUFNckYsOENBQUtBLENBQUNxRSxHQUFHLENBQUMxQixVQUFVSyxLQUFLVyxTQUFTLENBQUN3QixVQUFVLE1BQU1oRTtRQUMzRCxFQUFFLE9BQU07UUFDTix1Q0FBdUM7UUFDekM7UUFFQSxPQUFPZ0U7SUFDVCxFQUFFLE9BQU9qRCxPQUFPO1FBQ2RGLFFBQVFFLEtBQUssQ0FBQyw4QkFBOEJBO1FBQzVDLE9BQU8sRUFBRTtJQUNYO0FBQ0YiLCJzb3VyY2VzIjpbIi9Vc2Vycy9tYXJjbWludGVsL1Byb2plY3RzL2UtdGliLmNvbS9zcmMvbGliL3FkcmFudC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBRZHJhbnRDbGllbnQgfSBmcm9tICdAcWRyYW50L2pzLWNsaWVudC1yZXN0JztcbmltcG9ydCByZWRpcyBmcm9tICcuL3JlZGlzJztcblxuY29uc3QgaXNEb2NrZXJDb250YWluZXIgPVxuICBwcm9jZXNzLmVudi5JU19ET0NLRVIgPT09ICd0cnVlJyB8fCBwcm9jZXNzLmVudi5IT1NUTkFNRT8uaW5jbHVkZXMoJ2V0aWItYXBwJyk7XG5jb25zdCBxZHJhbnRVcmwgPVxuICBwcm9jZXNzLmVudi5RRFJBTlRfVVJMIHx8XG4gIChpc0RvY2tlckNvbnRhaW5lciA/ICdodHRwOi8vZXRpYi1xZHJhbnQ6NjMzMycgOiAnaHR0cDovL2xvY2FsaG9zdDoxNjMzMycpO1xuY29uc3QgcWRyYW50QXBpS2V5ID0gcHJvY2Vzcy5lbnYuUURSQU5UX0FQSV9LRVkgfHwgJyc7XG5cbmV4cG9ydCBjb25zdCBxZHJhbnQgPSBuZXcgUWRyYW50Q2xpZW50KHtcbiAgdXJsOiBxZHJhbnRVcmwsXG4gIGFwaUtleTogcWRyYW50QXBpS2V5IHx8IHVuZGVmaW5lZCxcbiAgLy8gRGlzYWJsZSBxZHJhbnQgY2xpZW50J3Mgb3duIHZlcnNpb24gY2hlY2sgdG8gYXZvaWQgdGhlIHdhcm5pbmcgc3BhbVxuICBjaGVja0NvbXBhdGliaWxpdHk6IGZhbHNlLFxufSk7XG5cbmV4cG9ydCBjb25zdCBDT0xMRUNUSU9OX05BTUUgPSAna2x6X3Byb2R1Y3RzJztcbmV4cG9ydCBjb25zdCBWRUNUT1JfU0laRSA9IDEwMjQ7IC8vIE1pc3RyYWwgbWlzdHJhbC1lbWJlZFxuXG4vLyBDYWNoZSBUVExzXG5jb25zdCBFTUJFRERJTkdfQ0FDSEVfVFRMID0gNjAgKiA2MCAqIDI0OyAvLyAyNGgg4oCUIGVtYmVkZGluZ3MgYXJlIGRldGVybWluaXN0aWNcbmNvbnN0IFNFQVJDSF9DQUNIRV9UVEwgPSA2MCAqIDMwOyAvLyAzMCBtaW4g4oCUIHByb2R1Y3QgZGF0YSBjb3VsZCBjaGFuZ2VcblxuLy8gVHJhY2sgY29sbGVjdGlvbiBleGlzdGVuY2UgaW4tbWVtb3J5IChkb24ndCByZS1jaGVjayBldmVyeSByZXF1ZXN0KVxubGV0IGNvbGxlY3Rpb25WZXJpZmllZCA9IGZhbHNlO1xuXG4vKipcbiAqIEVuc3VyZSB0aGUgY29sbGVjdGlvbiBleGlzdHMgaW4gUWRyYW50IChvbmx5IGNoZWNrcyBvbmNlIHBlciBwcm9jZXNzIGxpZmV0aW1lKS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZUNvbGxlY3Rpb24oKSB7XG4gIGlmIChjb2xsZWN0aW9uVmVyaWZpZWQpIHJldHVybjtcblxuICB0cnkge1xuICAgIGNvbnN0IGNvbGxlY3Rpb25zID0gYXdhaXQgcWRyYW50LmdldENvbGxlY3Rpb25zKCk7XG4gICAgY29uc3QgZXhpc3RzID0gY29sbGVjdGlvbnMuY29sbGVjdGlvbnMuc29tZSgoYykgPT4gYy5uYW1lID09PSBDT0xMRUNUSU9OX05BTUUpO1xuICAgIGlmICghZXhpc3RzKSB7XG4gICAgICBhd2FpdCBxZHJhbnQuY3JlYXRlQ29sbGVjdGlvbihDT0xMRUNUSU9OX05BTUUsIHtcbiAgICAgICAgdmVjdG9yczoge1xuICAgICAgICAgIHNpemU6IFZFQ1RPUl9TSVpFLFxuICAgICAgICAgIGRpc3RhbmNlOiAnQ29zaW5lJyxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgY29uc29sZS5sb2coYFN1Y2Nlc3NmdWxseSBjcmVhdGVkIFFkcmFudCBjb2xsZWN0aW9uOiAke0NPTExFQ1RJT05fTkFNRX1gKTtcbiAgICB9XG4gICAgY29sbGVjdGlvblZlcmlmaWVkID0gdHJ1ZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKCdFcnJvciBlbnN1cmluZyBRZHJhbnQgY29sbGVjdGlvbjonLCBlcnJvcik7XG4gIH1cbn1cblxuLyoqXG4gKiBIYXNoIHRleHQgZm9yIGNhY2hlIGtleVxuICovXG5mdW5jdGlvbiBoYXNoS2V5KHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgY3JlYXRlSGFzaCB9ID0gcmVxdWlyZSgnY3J5cHRvJyk7XG4gIHJldHVybiBjcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUodGV4dCkuZGlnZXN0KCdoZXgnKS5zbGljZSgwLCAzMik7XG59XG5cbi8qKlxuICogR2VuZXJhdGUgZW1iZWRkaW5nIHVzaW5nIE1pc3RyYWwgQVBJIChFVS9EU0dWTy1jb21wbGlhbnQpXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVtYmVkZGluZyh0ZXh0OiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcltdPiB7XG4gIGNvbnN0IGNhY2hlS2V5ID0gYGVtYjoke2hhc2hLZXkodGV4dC50b0xvd2VyQ2FzZSgpLnRyaW0oKSl9YDtcblxuICAvLyBUcnkgUmVkaXMgY2FjaGUgZmlyc3RcbiAgdHJ5IHtcbiAgICBjb25zdCBjYWNoZWQgPSBhd2FpdCByZWRpcy5nZXQoY2FjaGVLZXkpO1xuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGNhY2hlZCk7XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICAvLyBSZWRpcyBkb3duIOKAlCBwcm9jZWVkIHdpdGhvdXQgY2FjaGVcbiAgfVxuXG4gIGNvbnN0IG1pc3RyYWxLZXkgPSBwcm9jZXNzLmVudi5NSVNUUkFMX0FQSV9LRVk7XG4gIGlmICghbWlzdHJhbEtleSkge1xuICAgIHRocm93IG5ldyBFcnJvcignTUlTVFJBTF9BUElfS0VZIGlzIG5vdCBzZXQnKTtcbiAgfVxuXG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJ2h0dHBzOi8vYXBpLm1pc3RyYWwuYWkvdjEvZW1iZWRkaW5ncycsIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBoZWFkZXJzOiB7XG4gICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7bWlzdHJhbEtleX1gLFxuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICB9LFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIG1vZGVsOiAnbWlzdHJhbC1lbWJlZCcsXG4gICAgICBpbnB1dDogW3RleHRdLFxuICAgIH0pLFxuICB9KTtcblxuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgY29uc3QgZXJyb3JCb2R5ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBGYWlsZWQgdG8gZ2VuZXJhdGUgZW1iZWRkaW5nOiAke3Jlc3BvbnNlLnN0YXR1c30gJHtyZXNwb25zZS5zdGF0dXNUZXh0fSAke2Vycm9yQm9keX1gLFxuICAgICk7XG4gIH1cblxuICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICBjb25zdCBlbWJlZGRpbmcgPSBkYXRhLmRhdGFbMF0uZW1iZWRkaW5nO1xuXG4gIC8vIENhY2hlIHRoZSBlbWJlZGRpbmcgaW4gUmVkaXNcbiAgdHJ5IHtcbiAgICBhd2FpdCByZWRpcy5zZXQoY2FjaGVLZXksIEpTT04uc3RyaW5naWZ5KGVtYmVkZGluZyksICdFWCcsIEVNQkVERElOR19DQUNIRV9UVEwpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBSZWRpcyBkb3duIOKAlCBwcm9jZWVkIHdpdGhvdXQgY2FjaGluZ1xuICB9XG5cbiAgcmV0dXJuIGVtYmVkZGluZztcbn1cblxuLyoqXG4gKiBVcHNlcnQgYSBwcm9kdWN0IGludG8gUWRyYW50XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cHNlcnRQcm9kdWN0VmVjdG9yKFxuICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICB0ZXh0OiBzdHJpbmcsXG4gIHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4pIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBlbnN1cmVDb2xsZWN0aW9uKCk7XG4gICAgY29uc3QgdmVjdG9yID0gYXdhaXQgZ2VuZXJhdGVFbWJlZGRpbmcodGV4dCk7XG5cbiAgICBhd2FpdCBxZHJhbnQudXBzZXJ0KENPTExFQ1RJT05fTkFNRSwge1xuICAgICAgd2FpdDogdHJ1ZSxcbiAgICAgIHBvaW50czogW1xuICAgICAgICB7XG4gICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgIHZlY3RvcixcbiAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKCdFcnJvciB3cml0aW5nIHRvIFFkcmFudDonLCBlcnJvcik7XG4gIH1cbn1cblxuLyoqXG4gKiBEZWxldGUgYSBwcm9kdWN0IGZyb20gUWRyYW50XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVQcm9kdWN0VmVjdG9yKGlkOiBzdHJpbmcgfCBudW1iZXIpIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBlbnN1cmVDb2xsZWN0aW9uKCk7XG4gICAgYXdhaXQgcWRyYW50LmRlbGV0ZShDT0xMRUNUSU9OX05BTUUsIHtcbiAgICAgIHdhaXQ6IHRydWUsXG4gICAgICBwb2ludHM6IFtpZF0gYXMgW3N0cmluZyB8IG51bWJlcl0sXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcignRXJyb3IgZGVsZXRpbmcgZnJvbSBRZHJhbnQ6JywgZXJyb3IpO1xuICB9XG59XG5cbi8qKlxuICogU2VhcmNoIHByb2R1Y3RzIGluIFFkcmFudC5cbiAqIFJlc3VsdHMgYXJlIGNhY2hlZCBpbiBSZWRpcyBmb3IgMzAgbWludXRlcyBrZXllZCBieSBxdWVyeSB0ZXh0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VhcmNoUHJvZHVjdHMocXVlcnk6IHN0cmluZywgbGltaXQgPSA1KSB7XG4gIGNvbnN0IGNhY2hlS2V5ID0gYHNlYXJjaDoke2hhc2hLZXkocXVlcnkudG9Mb3dlckNhc2UoKS50cmltKCkpfToke2xpbWl0fWA7XG5cbiAgLy8gVHJ5IFJlZGlzIGNhY2hlIGZpcnN0XG4gIHRyeSB7XG4gICAgY29uc3QgY2FjaGVkID0gYXdhaXQgcmVkaXMuZ2V0KGNhY2hlS2V5KTtcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBjb25zb2xlLmxvZyhgW1FkcmFudF0gQ2FjaGUgSElUIGZvciBxdWVyeTogXCIke3F1ZXJ5LnN1YnN0cmluZygwLCA1MCl9XCJgKTtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGNhY2hlZCk7XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICAvLyBSZWRpcyBkb3duIOKAlCBwcm9jZWVkIHdpdGhvdXQgY2FjaGVcbiAgfVxuXG4gIHRyeSB7XG4gICAgYXdhaXQgZW5zdXJlQ29sbGVjdGlvbigpO1xuICAgIGNvbnN0IHZlY3RvciA9IGF3YWl0IGdlbmVyYXRlRW1iZWRkaW5nKHF1ZXJ5KTtcblxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBxZHJhbnQuc2VhcmNoKENPTExFQ1RJT05fTkFNRSwge1xuICAgICAgdmVjdG9yLFxuICAgICAgbGltaXQsXG4gICAgICB3aXRoX3BheWxvYWQ6IHRydWUsXG4gICAgfSk7XG5cbiAgICAvLyBDYWNoZSByZXN1bHRzIGluIFJlZGlzXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHJlZGlzLnNldChjYWNoZUtleSwgSlNPTi5zdHJpbmdpZnkocmVzdWx0cyksICdFWCcsIFNFQVJDSF9DQUNIRV9UVEwpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gUmVkaXMgZG93biDigJQgcHJvY2VlZCB3aXRob3V0IGNhY2hpbmdcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKCdFcnJvciBzZWFyY2hpbmcgaW4gUWRyYW50OicsIGVycm9yKTtcbiAgICByZXR1cm4gW107XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJRZHJhbnRDbGllbnQiLCJyZWRpcyIsImlzRG9ja2VyQ29udGFpbmVyIiwicHJvY2VzcyIsImVudiIsIklTX0RPQ0tFUiIsIkhPU1ROQU1FIiwiaW5jbHVkZXMiLCJxZHJhbnRVcmwiLCJRRFJBTlRfVVJMIiwicWRyYW50QXBpS2V5IiwiUURSQU5UX0FQSV9LRVkiLCJxZHJhbnQiLCJ1cmwiLCJhcGlLZXkiLCJ1bmRlZmluZWQiLCJjaGVja0NvbXBhdGliaWxpdHkiLCJDT0xMRUNUSU9OX05BTUUiLCJWRUNUT1JfU0laRSIsIkVNQkVERElOR19DQUNIRV9UVEwiLCJTRUFSQ0hfQ0FDSEVfVFRMIiwiY29sbGVjdGlvblZlcmlmaWVkIiwiZW5zdXJlQ29sbGVjdGlvbiIsImNvbGxlY3Rpb25zIiwiZ2V0Q29sbGVjdGlvbnMiLCJleGlzdHMiLCJzb21lIiwiYyIsIm5hbWUiLCJjcmVhdGVDb2xsZWN0aW9uIiwidmVjdG9ycyIsInNpemUiLCJkaXN0YW5jZSIsImNvbnNvbGUiLCJsb2ciLCJlcnJvciIsImhhc2hLZXkiLCJ0ZXh0IiwiY3JlYXRlSGFzaCIsInJlcXVpcmUiLCJ1cGRhdGUiLCJkaWdlc3QiLCJzbGljZSIsImdlbmVyYXRlRW1iZWRkaW5nIiwiY2FjaGVLZXkiLCJ0b0xvd2VyQ2FzZSIsInRyaW0iLCJjYWNoZWQiLCJnZXQiLCJKU09OIiwicGFyc2UiLCJtaXN0cmFsS2V5IiwiTUlTVFJBTF9BUElfS0VZIiwiRXJyb3IiLCJyZXNwb25zZSIsImZldGNoIiwibWV0aG9kIiwiaGVhZGVycyIsIkF1dGhvcml6YXRpb24iLCJib2R5Iiwic3RyaW5naWZ5IiwibW9kZWwiLCJpbnB1dCIsIm9rIiwiZXJyb3JCb2R5Iiwic3RhdHVzIiwic3RhdHVzVGV4dCIsImRhdGEiLCJqc29uIiwiZW1iZWRkaW5nIiwic2V0IiwidXBzZXJ0UHJvZHVjdFZlY3RvciIsImlkIiwicGF5bG9hZCIsInZlY3RvciIsInVwc2VydCIsIndhaXQiLCJwb2ludHMiLCJkZWxldGVQcm9kdWN0VmVjdG9yIiwiZGVsZXRlIiwic2VhcmNoUHJvZHVjdHMiLCJxdWVyeSIsImxpbWl0Iiwic3Vic3RyaW5nIiwicmVzdWx0cyIsInNlYXJjaCIsIndpdGhfcGF5bG9hZCJdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(rsc)/./src/lib/qdrant.ts\n");
/***/ }),
/***/ "(rsc)/./src/lib/redis.ts":
/*!**************************!*\
!*** ./src/lib/redis.ts ***!
\**************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__),\n/* harmony export */ redis: () => (/* binding */ redis)\n/* harmony export */ });\n/* harmony import */ var ioredis__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ioredis */ \"ioredis\");\n/* harmony import */ var ioredis__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(ioredis__WEBPACK_IMPORTED_MODULE_0__);\n\nconst isDockerContainer = process.env.IS_DOCKER === 'true' || process.env.HOSTNAME?.includes('klz-app');\nconst redisUrl = process.env.REDIS_URL || (isDockerContainer ? 'redis://klz-redis:6379' : 'redis://localhost:6379');\n// Only create a single instance in Node.js\nconst globalForRedis = global;\nconst redis = globalForRedis.redis || new (ioredis__WEBPACK_IMPORTED_MODULE_0___default())(redisUrl, {\n maxRetriesPerRequest: 3\n});\nif (true) {\n globalForRedis.redis = redis;\n}\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (redis);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9zcmMvbGliL3JlZGlzLnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBNEI7QUFFNUIsTUFBTUMsb0JBQ0pDLFFBQVFDLEdBQUcsQ0FBQ0MsU0FBUyxLQUFLLFVBQVVGLFFBQVFDLEdBQUcsQ0FBQ0UsUUFBUSxFQUFFQyxTQUFTO0FBQ3JFLE1BQU1DLFdBQ0pMLFFBQVFDLEdBQUcsQ0FBQ0ssU0FBUyxJQUNwQlAsQ0FBQUEsb0JBQW9CLDJCQUEyQix3QkFBdUI7QUFFekUsMkNBQTJDO0FBQzNDLE1BQU1RLGlCQUFpQkM7QUFFaEIsTUFBTUMsUUFDWEYsZUFBZUUsS0FBSyxJQUNwQixJQUFJWCxnREFBS0EsQ0FBQ08sVUFBVTtJQUNsQkssc0JBQXNCO0FBQ3hCLEdBQUc7QUFFTCxJQUFJVixJQUFxQyxFQUFFO0lBQ3pDTyxlQUFlRSxLQUFLLEdBQUdBO0FBQ3pCO0FBRUEsaUVBQWVBLEtBQUtBLEVBQUMiLCJzb3VyY2VzIjpbIi9Vc2Vycy9tYXJjbWludGVsL1Byb2plY3RzL2UtdGliLmNvbS9zcmMvbGliL3JlZGlzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWRpcyBmcm9tICdpb3JlZGlzJztcblxuY29uc3QgaXNEb2NrZXJDb250YWluZXIgPVxuICBwcm9jZXNzLmVudi5JU19ET0NLRVIgPT09ICd0cnVlJyB8fCBwcm9jZXNzLmVudi5IT1NUTkFNRT8uaW5jbHVkZXMoJ2tsei1hcHAnKTtcbmNvbnN0IHJlZGlzVXJsID1cbiAgcHJvY2Vzcy5lbnYuUkVESVNfVVJMIHx8XG4gIChpc0RvY2tlckNvbnRhaW5lciA/ICdyZWRpczovL2tsei1yZWRpczo2Mzc5JyA6ICdyZWRpczovL2xvY2FsaG9zdDo2Mzc5Jyk7XG5cbi8vIE9ubHkgY3JlYXRlIGEgc2luZ2xlIGluc3RhbmNlIGluIE5vZGUuanNcbmNvbnN0IGdsb2JhbEZvclJlZGlzID0gZ2xvYmFsIGFzIHVua25vd24gYXMgeyByZWRpczogUmVkaXMgfTtcblxuZXhwb3J0IGNvbnN0IHJlZGlzID1cbiAgZ2xvYmFsRm9yUmVkaXMucmVkaXMgfHxcbiAgbmV3IFJlZGlzKHJlZGlzVXJsLCB7XG4gICAgbWF4UmV0cmllc1BlclJlcXVlc3Q6IDMsXG4gIH0pO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBnbG9iYWxGb3JSZWRpcy5yZWRpcyA9IHJlZGlzO1xufVxuXG5leHBvcnQgZGVmYXVsdCByZWRpcztcbiJdLCJuYW1lcyI6WyJSZWRpcyIsImlzRG9ja2VyQ29udGFpbmVyIiwicHJvY2VzcyIsImVudiIsIklTX0RPQ0tFUiIsIkhPU1ROQU1FIiwiaW5jbHVkZXMiLCJyZWRpc1VybCIsIlJFRElTX1VSTCIsImdsb2JhbEZvclJlZGlzIiwiZ2xvYmFsIiwicmVkaXMiLCJtYXhSZXRyaWVzUGVyUmVxdWVzdCJdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(rsc)/./src/lib/redis.ts\n");
/***/ })
};
;