@kelvinjhu/lexiang-search 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +48 -183
- package/dist/cli.d.ts +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +8 -9
- package/dist/cli.js.map +1 -1
- package/dist/constants/api.constants.d.ts.map +1 -1
- package/dist/constants/api.constants.js +17 -15
- package/dist/constants/api.constants.js.map +1 -1
- package/dist/dto/ai-qa-request.dto.d.ts +8 -9
- package/dist/dto/ai-qa-request.dto.d.ts.map +1 -1
- package/dist/dto/ai-qa-request.dto.js +49 -62
- package/dist/dto/ai-qa-request.dto.js.map +1 -1
- package/dist/dto/ai-qa-response.dto.d.ts.map +1 -1
- package/dist/dto/ai-qa-response.dto.js +16 -20
- package/dist/dto/ai-qa-response.dto.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -7
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +57 -32
- package/dist/server.js.map +1 -1
- package/dist/services/ai-qa.service.d.ts +12 -3
- package/dist/services/ai-qa.service.d.ts.map +1 -1
- package/dist/services/ai-qa.service.js +60 -34
- package/dist/services/ai-qa.service.js.map +1 -1
- package/dist/services/lexiang-api.service.d.ts +6 -2
- package/dist/services/lexiang-api.service.d.ts.map +1 -1
- package/dist/services/lexiang-api.service.js +76 -57
- package/dist/services/lexiang-api.service.js.map +1 -1
- package/dist/tools/ai-qa-stream.tool.d.ts +1 -9
- package/dist/tools/ai-qa-stream.tool.d.ts.map +1 -1
- package/dist/tools/ai-qa-stream.tool.js +36 -71
- package/dist/tools/ai-qa-stream.tool.js.map +1 -1
- package/dist/tools/ai-qa.tool.d.ts +1 -9
- package/dist/tools/ai-qa.tool.d.ts.map +1 -1
- package/dist/tools/ai-qa.tool.js +11 -23
- package/dist/tools/ai-qa.tool.js.map +1 -1
- package/dist/types/lexiang-api.types.js +1 -2
- package/dist/types/lexiang-api.types.js.map +1 -1
- package/dist/types/mcp.types.js +1 -2
- package/dist/types/mcp.types.js.map +1 -1
- package/dist/utils/error-handler.d.ts +37 -32
- package/dist/utils/error-handler.d.ts.map +1 -1
- package/dist/utils/error-handler.js +46 -79
- package/dist/utils/error-handler.js.map +1 -1
- package/dist/utils/logger.d.ts +1 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +6 -8
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/validator.d.ts +4 -15
- package/dist/utils/validator.d.ts.map +1 -1
- package/dist/utils/validator.js +17 -66
- package/dist/utils/validator.js.map +1 -1
- package/package.json +6 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-qa-response.dto.d.ts","sourceRoot":"","sources":["../../src/dto/ai-qa-response.dto.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,qBAAa,iBAAiB;IAC5B,OAAO,EAAG,MAAM,CAAC;IACjB,SAAS,EAAG,MAAM,CAAC;IACnB,WAAW,EAAG,MAAM,CAAC;IACrB,KAAK,EAAG,MAAM,CAAC;IACf,GAAG,EAAG,MAAM,CAAC;CACd;AAED,qBAAa,eAAe;IAC1B,KAAK,EAAG,MAAM,CAAC;IACf,GAAG,EAAG,MAAM,CAAC;CACd;AAED,qBAAa,oBAAoB;IAC/B,kBAAkB,EAAG,MAAM,CAAC;IAC5B,gBAAgB,EAAG,iBAAiB,EAAE,CAAC;IACvC,cAAc,EAAG,eAAe,EAAE,CAAC;CACpC;AAED,qBAAa,mBAAmB;IAC9B,OAAO,EAAG,MAAM,CAAC;IACjB,aAAa,EAAG,MAAM,CAAC;IACvB,UAAU,EAAG,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,EAAG,oBAAoB,CAAC;CAC3C;AAED,qBAAa,eAAe;IAC1B,IAAI,EAAG,MAAM,CAAC;IACd,OAAO,EAAG,MAAM,CAAC;IACjB,UAAU,EAAG,MAAM,CAAC;IACpB,IAAI,EAAG,mBAAmB,CAAC;CAC5B;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,mBAAmB,GAAG;IACxD,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxD,
|
|
1
|
+
{"version":3,"file":"ai-qa-response.dto.d.ts","sourceRoot":"","sources":["../../src/dto/ai-qa-response.dto.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,qBAAa,iBAAiB;IAC5B,OAAO,EAAG,MAAM,CAAC;IACjB,SAAS,EAAG,MAAM,CAAC;IACnB,WAAW,EAAG,MAAM,CAAC;IACrB,KAAK,EAAG,MAAM,CAAC;IACf,GAAG,EAAG,MAAM,CAAC;CACd;AAED,qBAAa,eAAe;IAC1B,KAAK,EAAG,MAAM,CAAC;IACf,GAAG,EAAG,MAAM,CAAC;CACd;AAED,qBAAa,oBAAoB;IAC/B,kBAAkB,EAAG,MAAM,CAAC;IAC5B,gBAAgB,EAAG,iBAAiB,EAAE,CAAC;IACvC,cAAc,EAAG,eAAe,EAAE,CAAC;CACpC;AAED,qBAAa,mBAAmB;IAC9B,OAAO,EAAG,MAAM,CAAC;IACjB,aAAa,EAAG,MAAM,CAAC;IACvB,UAAU,EAAG,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,EAAG,oBAAoB,CAAC;CAC3C;AAED,qBAAa,eAAe;IAC1B,IAAI,EAAG,MAAM,CAAC;IACd,OAAO,EAAG,MAAM,CAAC;IACjB,UAAU,EAAG,MAAM,CAAC;IACpB,IAAI,EAAG,mBAAmB,CAAC;CAC5B;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,mBAAmB,GAAG;IACxD,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxD,CAkBA"}
|
|
@@ -1,57 +1,53 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* AI问答响应DTO
|
|
4
3
|
*/
|
|
5
|
-
|
|
6
|
-
exports.AiQaResponseDto = exports.AiQaResponseDataDto = exports.AdditionalContentDto = exports.ReferenceDocDto = exports.ReferenceChunkDto = void 0;
|
|
7
|
-
exports.toMcpResponse = toMcpResponse;
|
|
8
|
-
class ReferenceChunkDto {
|
|
4
|
+
export class ReferenceChunkDto {
|
|
9
5
|
content;
|
|
10
6
|
target_id;
|
|
11
7
|
target_type;
|
|
12
8
|
title;
|
|
13
9
|
url;
|
|
14
10
|
}
|
|
15
|
-
|
|
16
|
-
class ReferenceDocDto {
|
|
11
|
+
export class ReferenceDocDto {
|
|
17
12
|
title;
|
|
18
13
|
url;
|
|
19
14
|
}
|
|
20
|
-
|
|
21
|
-
class AdditionalContentDto {
|
|
15
|
+
export class AdditionalContentDto {
|
|
22
16
|
generated_question;
|
|
23
17
|
reference_chunks;
|
|
24
18
|
reference_docs;
|
|
25
19
|
}
|
|
26
|
-
|
|
27
|
-
class AiQaResponseDataDto {
|
|
20
|
+
export class AiQaResponseDataDto {
|
|
28
21
|
content;
|
|
29
22
|
answer_source;
|
|
30
23
|
session_id;
|
|
31
24
|
reasoning_content;
|
|
32
25
|
additional_content;
|
|
33
26
|
}
|
|
34
|
-
|
|
35
|
-
class AiQaResponseDto {
|
|
27
|
+
export class AiQaResponseDto {
|
|
36
28
|
code;
|
|
37
29
|
message;
|
|
38
30
|
request_id;
|
|
39
31
|
data;
|
|
40
32
|
}
|
|
41
|
-
exports.AiQaResponseDto = AiQaResponseDto;
|
|
42
33
|
/**
|
|
43
34
|
* 转换为MCP响应格式
|
|
44
35
|
*/
|
|
45
|
-
function toMcpResponse(data) {
|
|
36
|
+
export function toMcpResponse(data) {
|
|
37
|
+
// 处理空内容,避免Claude困惑
|
|
38
|
+
const content = data.content && data.content.trim().length > 0
|
|
39
|
+
? data.content
|
|
40
|
+
: "抱歉,在指定的知识范围内未找到相关内容。";
|
|
41
|
+
const reference_docs = data.additional_content?.reference_docs?.map((doc) => ({
|
|
42
|
+
title: doc.title,
|
|
43
|
+
url: doc.url,
|
|
44
|
+
})) || [];
|
|
46
45
|
return {
|
|
47
|
-
content
|
|
46
|
+
content,
|
|
48
47
|
answer_source: data.answer_source,
|
|
49
48
|
session_id: data.session_id,
|
|
50
49
|
reasoning_content: data.reasoning_content,
|
|
51
|
-
reference_docs
|
|
52
|
-
title: doc.title,
|
|
53
|
-
url: doc.url,
|
|
54
|
-
})),
|
|
50
|
+
reference_docs,
|
|
55
51
|
};
|
|
56
52
|
}
|
|
57
53
|
//# sourceMappingURL=ai-qa-response.dto.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-qa-response.dto.js","sourceRoot":"","sources":["../../src/dto/ai-qa-response.dto.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ai-qa-response.dto.js","sourceRoot":"","sources":["../../src/dto/ai-qa-response.dto.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,OAAO,iBAAiB;IAC5B,OAAO,CAAU;IACjB,SAAS,CAAU;IACnB,WAAW,CAAU;IACrB,KAAK,CAAU;IACf,GAAG,CAAU;CACd;AAED,MAAM,OAAO,eAAe;IAC1B,KAAK,CAAU;IACf,GAAG,CAAU;CACd;AAED,MAAM,OAAO,oBAAoB;IAC/B,kBAAkB,CAAU;IAC5B,gBAAgB,CAAuB;IACvC,cAAc,CAAqB;CACpC;AAED,MAAM,OAAO,mBAAmB;IAC9B,OAAO,CAAU;IACjB,aAAa,CAAU;IACvB,UAAU,CAAU;IACpB,iBAAiB,CAAU;IAC3B,kBAAkB,CAAwB;CAC3C;AAED,MAAM,OAAO,eAAe;IAC1B,IAAI,CAAU;IACd,OAAO,CAAU;IACjB,UAAU,CAAU;IACpB,IAAI,CAAuB;CAC5B;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,IAAyB;IAOrD,mBAAmB;IACnB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QAC5D,CAAC,CAAC,IAAI,CAAC,OAAO;QACd,CAAC,CAAC,sBAAsB,CAAC;IAE3B,MAAM,cAAc,GAAG,IAAI,CAAC,kBAAkB,EAAE,cAAc,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC5E,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,GAAG,EAAE,GAAG,CAAC,GAAG;KACb,CAAC,CAAC,IAAI,EAAE,CAAC;IAEV,OAAO;QACL,OAAO;QACP,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;QACzC,cAAc;KACf,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,kBAAkB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,18 +1,17 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* MCP服务器入口
|
|
4
3
|
*/
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
import 'reflect-metadata'; // 必须在最前面引入
|
|
5
|
+
import { LexiangMcpServer } from './server.js';
|
|
6
|
+
import { logger } from './utils/logger.js';
|
|
8
7
|
/**
|
|
9
8
|
* 启动MCP服务器
|
|
10
9
|
*/
|
|
11
10
|
async function main() {
|
|
12
|
-
const server = new
|
|
11
|
+
const server = new LexiangMcpServer();
|
|
13
12
|
// 优雅关闭处理
|
|
14
13
|
const shutdown = async (signal) => {
|
|
15
|
-
|
|
14
|
+
logger.info(`Received ${signal}, shutting down gracefully...`);
|
|
16
15
|
await server.stop();
|
|
17
16
|
process.exit(0);
|
|
18
17
|
};
|
|
@@ -23,7 +22,7 @@ async function main() {
|
|
|
23
22
|
}
|
|
24
23
|
// 启动应用
|
|
25
24
|
main().catch((error) => {
|
|
26
|
-
|
|
25
|
+
logger.error('Fatal error', { error });
|
|
27
26
|
process.exit(1);
|
|
28
27
|
});
|
|
29
28
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,kBAAkB,CAAC,CAAC,WAAW;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C;;GAEG;AACH,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;IAEtC,SAAS;IACT,MAAM,QAAQ,GAAG,KAAK,EAAE,MAAc,EAAiB,EAAE;QACvD,MAAM,CAAC,IAAI,CAAC,YAAY,MAAM,+BAA+B,CAAC,CAAC;QAC/D,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IACjD,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IAE/C,QAAQ;IACR,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;AACvB,CAAC;AAED,OAAO;AACP,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;GAEG;AAaH;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,YAAY,CAAiG;;IAoBrH;;OAEG;IACH,OAAO,CAAC,aAAa;IAYrB;;OAEG;IACH,OAAO,CAAC,aAAa;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;GAEG;AAaH;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,YAAY,CAAiG;;IAoBrH;;OAEG;IACH,OAAO,CAAC,aAAa;IAYrB;;OAEG;IACH,OAAO,CAAC,aAAa;IA2ErB;;OAEG;IACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAkBnC;;OAEG;IACU,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAUnC"}
|
package/dist/server.js
CHANGED
|
@@ -1,24 +1,21 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* MCP服务器核心实现
|
|
4
3
|
*/
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
const ai_qa_tool_1 = require("./tools/ai-qa.tool");
|
|
13
|
-
const ai_qa_stream_tool_1 = require("./tools/ai-qa-stream.tool");
|
|
4
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
5
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
6
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
7
|
+
import { logger } from './utils/logger.js';
|
|
8
|
+
import { handleError } from './utils/error-handler.js';
|
|
9
|
+
import { AiQaToolHandler } from './tools/ai-qa.tool.js';
|
|
10
|
+
import { AiQaStreamToolHandler } from './tools/ai-qa-stream.tool.js';
|
|
14
11
|
/**
|
|
15
12
|
* 乐享AI问答MCP服务器
|
|
16
13
|
*/
|
|
17
|
-
class LexiangMcpServer {
|
|
14
|
+
export class LexiangMcpServer {
|
|
18
15
|
server;
|
|
19
16
|
toolHandlers;
|
|
20
17
|
constructor() {
|
|
21
|
-
this.server = new
|
|
18
|
+
this.server = new Server({
|
|
22
19
|
name: 'mcp-lexiang-search',
|
|
23
20
|
version: '1.0.0',
|
|
24
21
|
}, {
|
|
@@ -34,11 +31,11 @@ class LexiangMcpServer {
|
|
|
34
31
|
* 注册工具处理器
|
|
35
32
|
*/
|
|
36
33
|
registerTools() {
|
|
37
|
-
const aiQaHandler = new
|
|
38
|
-
const aiQaStreamHandler = new
|
|
34
|
+
const aiQaHandler = new AiQaToolHandler();
|
|
35
|
+
const aiQaStreamHandler = new AiQaStreamToolHandler();
|
|
39
36
|
this.toolHandlers.set(aiQaHandler.name, aiQaHandler);
|
|
40
37
|
this.toolHandlers.set(aiQaStreamHandler.name, aiQaStreamHandler);
|
|
41
|
-
|
|
38
|
+
logger.info('Tools registered', {
|
|
42
39
|
tools: Array.from(this.toolHandlers.keys()),
|
|
43
40
|
});
|
|
44
41
|
}
|
|
@@ -47,25 +44,40 @@ class LexiangMcpServer {
|
|
|
47
44
|
*/
|
|
48
45
|
setupHandlers() {
|
|
49
46
|
// 处理工具列表请求
|
|
50
|
-
this.server.setRequestHandler(
|
|
47
|
+
this.server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
51
48
|
const tools = Array.from(this.toolHandlers.values()).map((handler) => ({
|
|
52
49
|
name: handler.name,
|
|
53
50
|
description: handler.description,
|
|
54
51
|
inputSchema: handler.inputSchema,
|
|
55
52
|
}));
|
|
56
|
-
|
|
53
|
+
logger.debug('List tools request', { count: tools.length });
|
|
57
54
|
return { tools };
|
|
58
55
|
});
|
|
59
56
|
// 处理工具调用请求
|
|
60
|
-
this.server.setRequestHandler(
|
|
57
|
+
this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
61
58
|
const { name, arguments: args } = request.params;
|
|
62
|
-
|
|
59
|
+
logger.info('Tool call request', { name });
|
|
63
60
|
const handler = this.toolHandlers.get(name);
|
|
64
61
|
if (!handler) {
|
|
65
62
|
throw new Error(`Tool not found: ${name}`);
|
|
66
63
|
}
|
|
67
64
|
try {
|
|
68
65
|
const result = await handler.execute(args);
|
|
66
|
+
// 调试模式:如果结果看起来是空的,打印出来看看
|
|
67
|
+
if (!result || (typeof result === 'object' && Object.keys(result).length === 0)) {
|
|
68
|
+
return {
|
|
69
|
+
content: [
|
|
70
|
+
{
|
|
71
|
+
type: 'text',
|
|
72
|
+
text: JSON.stringify({
|
|
73
|
+
status: 'empty_result',
|
|
74
|
+
message: 'Tool executed but returned empty result',
|
|
75
|
+
raw_result: result
|
|
76
|
+
}, null, 2)
|
|
77
|
+
}
|
|
78
|
+
]
|
|
79
|
+
};
|
|
80
|
+
}
|
|
69
81
|
return {
|
|
70
82
|
content: [
|
|
71
83
|
{
|
|
@@ -76,9 +88,23 @@ class LexiangMcpServer {
|
|
|
76
88
|
};
|
|
77
89
|
}
|
|
78
90
|
catch (error) {
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
91
|
+
logger.error('Tool execution failed', { name, error });
|
|
92
|
+
// 关键修改:将错误详情直接返回给 Claude,方便用户调试
|
|
93
|
+
const errorInfo = {
|
|
94
|
+
status: 'error',
|
|
95
|
+
message: error.message || 'Unknown error',
|
|
96
|
+
stack: error.stack,
|
|
97
|
+
details: error.response?.data || error.meta || 'No details available'
|
|
98
|
+
};
|
|
99
|
+
return {
|
|
100
|
+
content: [
|
|
101
|
+
{
|
|
102
|
+
type: 'text',
|
|
103
|
+
text: JSON.stringify(errorInfo, null, 2)
|
|
104
|
+
}
|
|
105
|
+
],
|
|
106
|
+
isError: true
|
|
107
|
+
};
|
|
82
108
|
}
|
|
83
109
|
});
|
|
84
110
|
}
|
|
@@ -87,18 +113,18 @@ class LexiangMcpServer {
|
|
|
87
113
|
*/
|
|
88
114
|
async start() {
|
|
89
115
|
try {
|
|
90
|
-
|
|
116
|
+
logger.info('Starting MCP server...');
|
|
91
117
|
// 使用stdio传输
|
|
92
|
-
const transport = new
|
|
118
|
+
const transport = new StdioServerTransport();
|
|
93
119
|
await this.server.connect(transport);
|
|
94
|
-
|
|
120
|
+
logger.info('MCP server started successfully', {
|
|
95
121
|
name: 'mcp-lexiang-search',
|
|
96
122
|
version: '1.0.0',
|
|
97
123
|
});
|
|
98
124
|
}
|
|
99
125
|
catch (error) {
|
|
100
|
-
|
|
101
|
-
throw
|
|
126
|
+
logger.error('Failed to start MCP server', { error });
|
|
127
|
+
throw handleError(error);
|
|
102
128
|
}
|
|
103
129
|
}
|
|
104
130
|
/**
|
|
@@ -106,15 +132,14 @@ class LexiangMcpServer {
|
|
|
106
132
|
*/
|
|
107
133
|
async stop() {
|
|
108
134
|
try {
|
|
109
|
-
|
|
135
|
+
logger.info('Stopping MCP server...');
|
|
110
136
|
await this.server.close();
|
|
111
|
-
|
|
137
|
+
logger.info('MCP server stopped');
|
|
112
138
|
}
|
|
113
139
|
catch (error) {
|
|
114
|
-
|
|
115
|
-
throw
|
|
140
|
+
logger.error('Failed to stop MCP server', { error });
|
|
141
|
+
throw handleError(error);
|
|
116
142
|
}
|
|
117
143
|
}
|
|
118
144
|
}
|
|
119
|
-
exports.LexiangMcpServer = LexiangMcpServer;
|
|
120
145
|
//# sourceMappingURL=server.js.map
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,20 +1,29 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* AI问答业务服务
|
|
3
3
|
*/
|
|
4
|
-
import { AiQaRequestDto } from '../dto/ai-qa-request.dto';
|
|
5
|
-
import { toMcpResponse } from '../dto/ai-qa-response.dto';
|
|
4
|
+
import { AiQaRequestDto } from '../dto/ai-qa-request.dto.js';
|
|
5
|
+
import { toMcpResponse } from '../dto/ai-qa-response.dto.js';
|
|
6
|
+
import { StreamChunk } from '../types/lexiang-api.types.js';
|
|
6
7
|
/**
|
|
7
8
|
* AI问答服务
|
|
8
9
|
*/
|
|
9
10
|
export declare class AiQaService {
|
|
10
11
|
private apiClient;
|
|
11
12
|
constructor();
|
|
13
|
+
/**
|
|
14
|
+
* 获取App Key和Secret
|
|
15
|
+
*/
|
|
16
|
+
private getCredentials;
|
|
12
17
|
/**
|
|
13
18
|
* 执行非流式AI问答
|
|
14
19
|
*/
|
|
15
20
|
executeNonStream(requestDto: AiQaRequestDto): Promise<ReturnType<typeof toMcpResponse>>;
|
|
16
21
|
/**
|
|
17
|
-
* 执行流式AI问答
|
|
22
|
+
* 执行流式AI问答 (Generator模式)
|
|
23
|
+
*/
|
|
24
|
+
executeStreamGenerator(requestDto: AiQaRequestDto): AsyncGenerator<StreamChunk, void, unknown>;
|
|
25
|
+
/**
|
|
26
|
+
* @deprecated 使用 executeStreamGenerator 代替
|
|
18
27
|
*/
|
|
19
28
|
executeStream(requestDto: AiQaRequestDto, onChunk: (delta_content: string, content: string, is_stop: boolean) => void, onComplete: (session_id: string) => void, onError: (error: Error) => void): Promise<void>;
|
|
20
29
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-qa.service.d.ts","sourceRoot":"","sources":["../../src/services/ai-qa.service.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"ai-qa.service.d.ts","sourceRoot":"","sources":["../../src/services/ai-qa.service.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAG7D,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAG5D;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,SAAS,CAAmB;;IAMpC;;OAEG;IACH,OAAO,CAAC,cAAc;IAWtB;;OAEG;IACG,gBAAgB,CAAC,UAAU,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;IAqC7F;;OAEG;IACI,sBAAsB,CAAC,UAAU,EAAE,cAAc,GAAG,cAAc,CAAC,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC;IAyBrG;;OAEG;IACG,aAAa,CACjB,UAAU,EAAE,cAAc,EAC1B,OAAO,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,EAC3E,UAAU,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,EACxC,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAC9B,OAAO,CAAC,IAAI,CAAC;CAqBjB"}
|
|
@@ -1,81 +1,107 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* AI问答业务服务
|
|
4
3
|
*/
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const logger_1 = require("../utils/logger");
|
|
4
|
+
import { LexiangApiClient } from './lexiang-api.service.js';
|
|
5
|
+
import { toMcpResponse } from '../dto/ai-qa-response.dto.js';
|
|
6
|
+
import { ANONYMOUS_STAFF_ID } from '../constants/api.constants.js';
|
|
7
|
+
import { logger } from '../utils/logger.js';
|
|
8
|
+
import { BaseError, ApiError } from '../utils/error-handler.js';
|
|
11
9
|
/**
|
|
12
10
|
* AI问答服务
|
|
13
11
|
*/
|
|
14
|
-
class AiQaService {
|
|
12
|
+
export class AiQaService {
|
|
15
13
|
apiClient;
|
|
16
14
|
constructor() {
|
|
17
|
-
this.apiClient = new
|
|
15
|
+
this.apiClient = new LexiangApiClient();
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* 获取App Key和Secret
|
|
19
|
+
*/
|
|
20
|
+
getCredentials(dto) {
|
|
21
|
+
const appKey = dto.app_key || process.env.LEXIANG_APP_KEY;
|
|
22
|
+
const appSecret = dto.app_secret || process.env.LEXIANG_APP_SECRET;
|
|
23
|
+
if (!appKey || !appSecret) {
|
|
24
|
+
throw new BaseError('Missing credentials: LEXIANG_APP_KEY or LEXIANG_APP_SECRET must be provided in environment variables or request parameters');
|
|
25
|
+
}
|
|
26
|
+
return { appKey, appSecret };
|
|
18
27
|
}
|
|
19
28
|
/**
|
|
20
29
|
* 执行非流式AI问答
|
|
21
30
|
*/
|
|
22
31
|
async executeNonStream(requestDto) {
|
|
23
32
|
try {
|
|
24
|
-
|
|
33
|
+
logger.info('Executing non-stream AI QA', { query: requestDto.query });
|
|
34
|
+
const { appKey, appSecret } = this.getCredentials(requestDto);
|
|
25
35
|
// 获取access token
|
|
26
|
-
const accessToken = await this.apiClient.getAccessToken(
|
|
36
|
+
const accessToken = await this.apiClient.getAccessToken(appKey, appSecret);
|
|
27
37
|
// 构造请求
|
|
28
38
|
const lexiangRequest = requestDto.toLexiangRequest();
|
|
29
39
|
// 调用API
|
|
30
|
-
const response = await this.apiClient.queryAiQa(accessToken,
|
|
40
|
+
const response = await this.apiClient.queryAiQa(accessToken, ANONYMOUS_STAFF_ID, lexiangRequest);
|
|
41
|
+
// 打印原始响应以便调试
|
|
42
|
+
logger.debug('Raw API Response', { response });
|
|
43
|
+
// 检查业务错误码
|
|
44
|
+
if (response.code !== 0) {
|
|
45
|
+
throw new ApiError(`Lexiang API Error: ${response.message}`, {
|
|
46
|
+
code: response.code,
|
|
47
|
+
request_id: response.request_id
|
|
48
|
+
});
|
|
49
|
+
}
|
|
31
50
|
// 转换响应
|
|
32
|
-
const mcpResponse =
|
|
33
|
-
|
|
51
|
+
const mcpResponse = toMcpResponse(response.data);
|
|
52
|
+
logger.info('Non-stream AI QA completed', { session_id: response.data.session_id });
|
|
34
53
|
return mcpResponse;
|
|
35
54
|
}
|
|
36
55
|
catch (error) {
|
|
37
|
-
|
|
56
|
+
logger.error('Non-stream AI QA failed', { query: requestDto.query, error });
|
|
38
57
|
throw error;
|
|
39
58
|
}
|
|
40
59
|
}
|
|
41
60
|
/**
|
|
42
|
-
* 执行流式AI问答
|
|
61
|
+
* 执行流式AI问答 (Generator模式)
|
|
43
62
|
*/
|
|
44
|
-
async
|
|
63
|
+
async *executeStreamGenerator(requestDto) {
|
|
45
64
|
try {
|
|
46
|
-
|
|
65
|
+
logger.info('Executing stream AI QA', { query: requestDto.query });
|
|
66
|
+
const { appKey, appSecret } = this.getCredentials(requestDto);
|
|
47
67
|
// 获取access token
|
|
48
|
-
const accessToken = await this.apiClient.getAccessToken(
|
|
68
|
+
const accessToken = await this.apiClient.getAccessToken(appKey, appSecret);
|
|
49
69
|
// 构造请求
|
|
50
70
|
const lexiangRequest = requestDto.toLexiangRequest();
|
|
51
|
-
// 用于存储完整内容
|
|
52
|
-
let fullContent = '';
|
|
53
|
-
let sessionId = '';
|
|
54
71
|
// 调用流式API
|
|
55
|
-
|
|
56
|
-
|
|
72
|
+
const generator = this.apiClient.streamAiQaGenerator(accessToken, ANONYMOUS_STAFF_ID, lexiangRequest);
|
|
73
|
+
for await (const chunk of generator) {
|
|
74
|
+
yield chunk;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
logger.error('Stream AI QA failed', { query: requestDto.query, error });
|
|
79
|
+
throw error;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* @deprecated 使用 executeStreamGenerator 代替
|
|
84
|
+
*/
|
|
85
|
+
async executeStream(requestDto, onChunk, onComplete, onError) {
|
|
86
|
+
try {
|
|
87
|
+
let sessionId = '';
|
|
88
|
+
const generator = this.executeStreamGenerator(requestDto);
|
|
89
|
+
for await (const chunk of generator) {
|
|
57
90
|
if (chunk.session_id && !sessionId) {
|
|
58
91
|
sessionId = chunk.session_id;
|
|
59
92
|
}
|
|
60
93
|
if (chunk.delta_content) {
|
|
61
|
-
fullContent += chunk.delta_content;
|
|
62
94
|
onChunk(chunk.delta_content, chunk.content, chunk.is_stop);
|
|
63
95
|
}
|
|
64
|
-
if (chunk.content) {
|
|
65
|
-
fullContent = chunk.content;
|
|
66
|
-
}
|
|
67
96
|
if (chunk.is_stop) {
|
|
68
|
-
|
|
97
|
+
logger.info('Stream AI QA completed', { session_id: sessionId });
|
|
69
98
|
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
}, onError);
|
|
99
|
+
}
|
|
100
|
+
onComplete(sessionId);
|
|
73
101
|
}
|
|
74
102
|
catch (error) {
|
|
75
|
-
logger_1.logger.error('Stream AI QA failed', { query: requestDto.query, error });
|
|
76
103
|
onError(error);
|
|
77
104
|
}
|
|
78
105
|
}
|
|
79
106
|
}
|
|
80
|
-
exports.AiQaService = AiQaService;
|
|
81
107
|
//# sourceMappingURL=ai-qa.service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-qa.service.js","sourceRoot":"","sources":["../../src/services/ai-qa.service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ai-qa.service.js","sourceRoot":"","sources":["../../src/services/ai-qa.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* 乐享API客户端服务
|
|
3
3
|
*/
|
|
4
|
-
import { AiQaRequest, AiQaResponse, StreamChunk } from '../types/lexiang-api.types';
|
|
4
|
+
import { AiQaRequest, AiQaResponse, StreamChunk } from '../types/lexiang-api.types.js';
|
|
5
5
|
/**
|
|
6
6
|
* 乐享API客户端
|
|
7
7
|
*/
|
|
@@ -34,7 +34,11 @@ export declare class LexiangApiClient {
|
|
|
34
34
|
*/
|
|
35
35
|
queryAiQa(accessToken: string, staffId: string, request: AiQaRequest): Promise<AiQaResponse>;
|
|
36
36
|
/**
|
|
37
|
-
* 流式AI问答
|
|
37
|
+
* 流式AI问答 (Generator模式)
|
|
38
|
+
*/
|
|
39
|
+
streamAiQaGenerator(accessToken: string, staffId: string, request: AiQaRequest): AsyncGenerator<StreamChunk, void, unknown>;
|
|
40
|
+
/**
|
|
41
|
+
* @deprecated 使用 streamAiQaGenerator 代替
|
|
38
42
|
*/
|
|
39
43
|
streamAiQa(accessToken: string, staffId: string, request: AiQaRequest, onChunk: (chunk: StreamChunk) => void, onComplete: () => void, onError: (error: Error) => void): Promise<void>;
|
|
40
44
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lexiang-api.service.d.ts","sourceRoot":"","sources":["../../src/services/lexiang-api.service.ts"],"names":[],"mappings":"AAAA;;GAEG;AAYH,OAAO,EAEL,WAAW,EACX,YAAY,EACZ,WAAW,EACZ,MAAM,
|
|
1
|
+
{"version":3,"file":"lexiang-api.service.d.ts","sourceRoot":"","sources":["../../src/services/lexiang-api.service.ts"],"names":[],"mappings":"AAAA;;GAEG;AAYH,OAAO,EAEL,WAAW,EACX,YAAY,EACZ,WAAW,EACZ,MAAM,+BAA+B,CAAC;AAWvC;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,UAAU,CAAgB;IAClC,OAAO,CAAC,UAAU,CAA0C;;IAsB5D;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAoBxB;;OAEG;IACH,OAAO,CAAC,WAAW;IAInB;;OAEG;IACH,OAAO,CAAC,YAAY;IAIpB;;OAEG;IACG,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAqCxE;;OAEG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAMrC;;OAEG;IACG,SAAS,CACb,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,YAAY,CAAC;IA2BxB;;OAEG;IACI,mBAAmB,CACxB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,WAAW,GACnB,cAAc,CAAC,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC;IAkE7C;;OAEG;IACG,UAAU,CACd,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,EACrC,UAAU,EAAE,MAAM,IAAI,EACtB,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAC9B,OAAO,CAAC,IAAI,CAAC;CAWjB"}
|