Files
DLE/backend/services/vectorSearchClient.js
2025-10-30 22:41:04 +03:00

119 lines
3.5 KiB
JavaScript

/**
* Copyright (c) 2024-2025 Тарабанов Александр Викторович
* All rights reserved.
*
* This software is proprietary and confidential.
* Unauthorized copying, modification, or distribution is prohibited.
*
* For licensing inquiries: info@hb3-accelerator.com
* Website: https://hb3-accelerator.com
* GitHub: https://github.com/VC-HB3-Accelerator
*/
const axios = require('axios');
const logger = require('../utils/logger');
const ollamaConfig = require('./ollamaConfig');
const VECTOR_SEARCH_URL = process.env.VECTOR_SEARCH_URL || 'http://vector-search:8001';
const TIMEOUTS = ollamaConfig.getTimeouts();
async function upsert(tableId, rows) {
logger.info(`[VectorSearch] upsert: tableId=${tableId}, rows=${rows.length}`);
try {
const res = await axios.post(`${VECTOR_SEARCH_URL}/upsert`, {
table_id: String(tableId),
rows: rows.map(r => ({
row_id: String(r.row_id),
text: r.text,
metadata: r.metadata || {}
}))
}, {
timeout: TIMEOUTS.vectorUpsert // Централизованный таймаут для индексации
});
logger.info(`[VectorSearch] upsert result:`, res.data);
return res.data;
} catch (error) {
logger.error(`[VectorSearch] upsert error:`, error.message);
throw error;
}
}
async function search(tableId, query, topK = 3) {
logger.info(`[VectorSearch] search: tableId=${tableId}, query="${query}", topK=${topK}`);
try {
const res = await axios.post(`${VECTOR_SEARCH_URL}/search`, {
table_id: String(tableId),
query,
top_k: topK
}, {
timeout: TIMEOUTS.vectorSearch // Централизованный таймаут для поиска
});
logger.info(`[VectorSearch] search result:`, res.data.results);
return res.data.results;
} catch (error) {
logger.error(`[VectorSearch] search error:`, error.message);
throw error;
}
}
async function remove(tableId, rowIds) {
logger.info(`[VectorSearch] remove: tableId=${tableId}, rowIds=${rowIds}`);
try {
const res = await axios.post(`${VECTOR_SEARCH_URL}/delete`, {
table_id: String(tableId),
row_ids: rowIds.map(String)
});
logger.info(`[VectorSearch] remove result:`, res.data);
return res.data;
} catch (error) {
logger.error(`[VectorSearch] remove error:`, error.message);
throw error;
}
}
async function rebuild(tableId, rows) {
logger.info(`[VectorSearch] rebuild: tableId=${tableId}, rows=${rows.length}`);
try {
const res = await axios.post(`${VECTOR_SEARCH_URL}/rebuild`, {
table_id: String(tableId),
rows: rows.map(r => ({
row_id: String(r.row_id),
text: r.text,
metadata: r.metadata || {}
}))
});
logger.info(`[VectorSearch] rebuild result:`, res.data);
return res.data;
} catch (error) {
logger.error(`[VectorSearch] rebuild error:`, error.message);
throw error;
}
}
async function health() {
logger.info(`[VectorSearch] health check`);
try {
const res = await axios.get(`${VECTOR_SEARCH_URL}/health`, { timeout: TIMEOUTS.vectorHealth });
logger.info(`[VectorSearch] health result:`, res.data);
return {
status: 'ok',
url: VECTOR_SEARCH_URL,
response: res.data
};
} catch (error) {
logger.error(`[VectorSearch] health error:`, error.message);
return {
status: 'error',
url: VECTOR_SEARCH_URL,
error: error.message
};
}
}
module.exports = {
upsert,
search,
remove,
rebuild,
health
};