shenju-enterprise-search-mcp
Version:
123 lines (103 loc) • 3.96 kB
JavaScript
/**
* 企业资料检索客户端 - 对接企业知识库API
*/
const axios = require('axios');
class SearchClient {
constructor(apiKey, appId, baseUrl = 'https://api.enterprise-search.example.com/v1') {
this.apiKey = apiKey;
this.appId = appId;
this.baseUrl = baseUrl;
console.log(`初始化企业检索客户端, baseUrl: ${baseUrl}, appId: ${appId ? '已设置' : '未设置'}`);
this.client = axios.create({
baseURL: this.baseUrl,
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${this.apiKey}`
},
// 增加超时设置
timeout: 30000
});
}
/**
* 执行文档搜索
* @param {string} query 检索查询
* @param {Object} options 额外选项
* @returns {Promise<Object>} API响应
*/
async documentSearch(query, options = {}) {
try {
const filter = options.filter || '';
const limit = options.limit || 10;
const includeContent = options.includeContent || false;
console.log(`准备调用企业资料检索API, 查询: ${query}, 过滤器: ${filter}`);
const requestBody = {
query,
filter,
limit,
include_content: includeContent
};
// 如果设置了appId,添加到请求中
if (this.appId) {
requestBody.app_id = this.appId;
}
console.log(`发送检索请求: ${this.baseUrl}/search`);
const response = await this.client.post('/search', requestBody);
console.log(`检索API调用成功, 状态码: ${response.status}, 结果数: ${response.data.results?.length || 0}`);
return response.data;
} catch (error) {
console.error('企业检索API调用失败:', error.message);
if (error.response) {
console.error('错误状态码:', error.response.status);
console.error('错误详情:', JSON.stringify(error.response.data));
console.error('请求URL:', error.config?.url);
console.error('请求头:', JSON.stringify(error.config?.headers, (key, value) => {
// 隐藏敏感信息
if (key === 'Authorization') return 'Bearer ***';
return value;
}));
console.error('请求数据:', JSON.stringify(error.config?.data));
throw new Error(`API错误: ${error.response.status} - ${JSON.stringify(error.response.data)}`);
} else if (error.request) {
console.error('请求已发送但未收到响应', error.request);
throw new Error('无法连接到企业检索API服务器');
} else {
console.error('请求配置错误:', error.message);
throw new Error(`请求配置错误: ${error.message}`);
}
}
}
/**
* 执行问答检索
* @param {string} question 问题内容
* @param {Object} options 额外选项
* @returns {Promise<Object>} API响应
*/
async documentQA(question, options = {}) {
try {
const filter = options.filter || '';
const includeSources = options.includeSources || true;
console.log(`准备调用企业问答API, 问题: ${question}`);
const requestBody = {
question,
filter,
include_sources: includeSources
};
// 添加appId (如果有)
if (this.appId) {
requestBody.app_id = this.appId;
}
console.log(`发送问答请求: ${this.baseUrl}/qa`);
const response = await this.client.post('/qa', requestBody);
console.log(`问答API调用成功, 状态码: ${response.status}`);
return response.data;
} catch (error) {
console.error('企业问答API调用失败:', error.message);
if (error.response) {
console.error('错误状态码:', error.response.status);
console.error('错误详情:', JSON.stringify(error.response.data || '无详细信息'));
}
throw error;
}
}
}
module.exports = SearchClient;