koishi-plugin-isthattrue 0.1.0
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/lib/agents/index.d.ts +2 -0
- package/lib/agents/searchAgent.d.ts +43 -0
- package/lib/agents/verifyAgent.d.ts +34 -0
- package/lib/config.d.ts +27 -0
- package/lib/index.d.ts +7 -0
- package/lib/index.js +1026 -0
- package/lib/services/chatluna.d.ts +48 -0
- package/lib/services/messageParser.d.ts +37 -0
- package/lib/types.d.ts +98 -0
- package/lib/utils/prompts.d.ts +54 -0
- package/package.json +43 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { Context } from 'koishi';
|
|
2
|
+
import { ChatRequest, ChatResponse } from '../types';
|
|
3
|
+
import { HumanMessage, SystemMessage } from '@langchain/core/messages';
|
|
4
|
+
declare module 'koishi' {
|
|
5
|
+
interface Context {
|
|
6
|
+
chatluna: ChatlunaService;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
interface ChatlunaService {
|
|
10
|
+
createChatModel(fullModelName: string): Promise<{
|
|
11
|
+
value: ChatModel | undefined;
|
|
12
|
+
}>;
|
|
13
|
+
}
|
|
14
|
+
interface ChatModel {
|
|
15
|
+
invoke(messages: Array<HumanMessage | SystemMessage>, options?: {
|
|
16
|
+
temperature?: number;
|
|
17
|
+
}): Promise<{
|
|
18
|
+
content: string | object;
|
|
19
|
+
}>;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Chatluna 集成服务
|
|
23
|
+
* 封装对 koishi-plugin-chatluna 的调用
|
|
24
|
+
*/
|
|
25
|
+
export declare class ChatlunaAdapter {
|
|
26
|
+
private ctx;
|
|
27
|
+
private config?;
|
|
28
|
+
private logger;
|
|
29
|
+
constructor(ctx: Context, config?: any);
|
|
30
|
+
/**
|
|
31
|
+
* 检查 Chatluna 服务是否可用
|
|
32
|
+
*/
|
|
33
|
+
isAvailable(): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* 发送聊天请求
|
|
36
|
+
*/
|
|
37
|
+
chat(request: ChatRequest): Promise<ChatResponse>;
|
|
38
|
+
/**
|
|
39
|
+
* 带重试的聊天请求
|
|
40
|
+
*/
|
|
41
|
+
chatWithRetry(request: ChatRequest, maxRetries?: number, fallbackModel?: string): Promise<ChatResponse>;
|
|
42
|
+
/**
|
|
43
|
+
* 从响应中提取来源链接
|
|
44
|
+
*/
|
|
45
|
+
private extractSources;
|
|
46
|
+
private sleep;
|
|
47
|
+
}
|
|
48
|
+
export {};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { Context } from 'koishi';
|
|
2
|
+
import { MessageContent } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* 消息解析服务
|
|
5
|
+
* 用于解析引用消息中的文本和图片内容
|
|
6
|
+
*/
|
|
7
|
+
export declare class MessageParser {
|
|
8
|
+
private ctx;
|
|
9
|
+
constructor(ctx: Context);
|
|
10
|
+
/**
|
|
11
|
+
* 从会话中提取引用消息的内容
|
|
12
|
+
*/
|
|
13
|
+
parseQuotedMessage(session: any): Promise<MessageContent | null>;
|
|
14
|
+
/**
|
|
15
|
+
* 从整个会话中提取可验证内容(优先引用,其次是当前消息)
|
|
16
|
+
*/
|
|
17
|
+
parseSession(session: any): Promise<MessageContent | null>;
|
|
18
|
+
/**
|
|
19
|
+
* 解析消息内容字符串
|
|
20
|
+
*/
|
|
21
|
+
parseContent(content: string): {
|
|
22
|
+
text: string;
|
|
23
|
+
images: string[];
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* 获取图片的base64编码
|
|
27
|
+
*/
|
|
28
|
+
imageToBase64(url: string): Promise<string | null>;
|
|
29
|
+
/**
|
|
30
|
+
* 准备消息内容用于LLM处理
|
|
31
|
+
* 将图片转换为base64,合并文本
|
|
32
|
+
*/
|
|
33
|
+
prepareForLLM(content: MessageContent): Promise<{
|
|
34
|
+
text: string;
|
|
35
|
+
imageBase64List: string[];
|
|
36
|
+
}>;
|
|
37
|
+
}
|
package/lib/types.d.ts
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 消息内容类型
|
|
3
|
+
*/
|
|
4
|
+
export interface MessageContent {
|
|
5
|
+
/** 原始文本 */
|
|
6
|
+
text: string;
|
|
7
|
+
/** 图片URL列表 */
|
|
8
|
+
images: string[];
|
|
9
|
+
/** 是否包含引用消息 */
|
|
10
|
+
hasQuote: boolean;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* 搜索结果
|
|
14
|
+
*/
|
|
15
|
+
export interface SearchResult {
|
|
16
|
+
/** Agent ID */
|
|
17
|
+
agentId: string;
|
|
18
|
+
/** 搜索角度/关键词 */
|
|
19
|
+
perspective: string;
|
|
20
|
+
/** 搜索发现 */
|
|
21
|
+
findings: string;
|
|
22
|
+
/** 相关来源 */
|
|
23
|
+
sources: string[];
|
|
24
|
+
/** 可信度评分 0-1 */
|
|
25
|
+
confidence: number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* 验证结论
|
|
29
|
+
*/
|
|
30
|
+
export declare enum Verdict {
|
|
31
|
+
TRUE = "true",
|
|
32
|
+
FALSE = "false",
|
|
33
|
+
UNCERTAIN = "uncertain",
|
|
34
|
+
PARTIALLY_TRUE = "partially_true"
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* 最终验证结果
|
|
38
|
+
*/
|
|
39
|
+
export interface VerificationResult {
|
|
40
|
+
/** 待验证的原始内容 */
|
|
41
|
+
originalContent: MessageContent;
|
|
42
|
+
/** 各Agent搜索结果 */
|
|
43
|
+
searchResults: SearchResult[];
|
|
44
|
+
/** 最终判决 */
|
|
45
|
+
verdict: Verdict;
|
|
46
|
+
/** 判决理由 */
|
|
47
|
+
reasoning: string;
|
|
48
|
+
/** 参考来源汇总 */
|
|
49
|
+
sources: string[];
|
|
50
|
+
/** 可信度评分 0-1 */
|
|
51
|
+
confidence: number;
|
|
52
|
+
/** 处理耗时(ms) */
|
|
53
|
+
processingTime: number;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Agent 配置
|
|
57
|
+
*/
|
|
58
|
+
export interface AgentConfig {
|
|
59
|
+
/** Agent 名称 */
|
|
60
|
+
name: string;
|
|
61
|
+
/** 使用的模型 */
|
|
62
|
+
model: string;
|
|
63
|
+
/** 搜索角度描述 */
|
|
64
|
+
perspective: string;
|
|
65
|
+
/** 系统提示词 */
|
|
66
|
+
systemPrompt?: string;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Chatluna 聊天请求
|
|
70
|
+
*/
|
|
71
|
+
export interface ChatRequest {
|
|
72
|
+
/** 模型名称 */
|
|
73
|
+
model: string;
|
|
74
|
+
/** 消息内容 */
|
|
75
|
+
message: string;
|
|
76
|
+
/** 图片(base64) */
|
|
77
|
+
images?: string[];
|
|
78
|
+
/** 系统提示词 */
|
|
79
|
+
systemPrompt?: string;
|
|
80
|
+
/** 是否启用搜索 */
|
|
81
|
+
enableSearch?: boolean;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Chatluna 聊天响应
|
|
85
|
+
*/
|
|
86
|
+
export interface ChatResponse {
|
|
87
|
+
/** 回复内容 */
|
|
88
|
+
content: string;
|
|
89
|
+
/** 搜索结果来源(如果有) */
|
|
90
|
+
sources?: string[];
|
|
91
|
+
/** 使用的模型 */
|
|
92
|
+
model: string;
|
|
93
|
+
/** token使用量 */
|
|
94
|
+
usage?: {
|
|
95
|
+
promptTokens: number;
|
|
96
|
+
completionTokens: number;
|
|
97
|
+
};
|
|
98
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt 模板集合
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* 搜索Agent系统提示词
|
|
6
|
+
*/
|
|
7
|
+
export declare const SEARCH_AGENT_SYSTEM_PROMPT = "\u4F60\u662F\u4E00\u4E2A\u4E13\u4E1A\u7684\u4E8B\u5B9E\u6838\u67E5\u641C\u7D22\u5458\u3002\u4F60\u7684\u4EFB\u52A1\u662F\u9488\u5BF9\u7ED9\u5B9A\u7684\u58F0\u660E\uFF0C\u4ECE\u7279\u5B9A\u89D2\u5EA6\u641C\u7D22\u76F8\u5173\u4FE1\u606F\u3002\n\n## \u4F60\u7684\u804C\u8D23:\n1. \u4ED4\u7EC6\u5206\u6790\u5F85\u9A8C\u8BC1\u7684\u58F0\u660E\n2. \u4ECE\u4F60\u88AB\u5206\u914D\u7684\u89D2\u5EA6\u8FDB\u884C\u6DF1\u5EA6\u641C\u7D22\n3. \u6536\u96C6\u76F8\u5173\u7684\u8BC1\u636E\u548C\u6765\u6E90\n4. \u5BA2\u89C2\u8BC4\u4F30\u627E\u5230\u7684\u4FE1\u606F\n\n## \u8F93\u51FA\u683C\u5F0F:\n\u8BF7\u4EE5JSON\u683C\u5F0F\u8FD4\u56DE\u4F60\u7684\u641C\u7D22\u7ED3\u679C:\n```json\n{\n \"perspective\": \"\u4F60\u7684\u641C\u7D22\u89D2\u5EA6\",\n \"findings\": \"\u8BE6\u7EC6\u7684\u641C\u7D22\u53D1\u73B0\",\n \"sources\": [\"\u6765\u6E901\", \"\u6765\u6E902\"],\n \"supports_claim\": true/false/null,\n \"confidence\": 0.0-1.0,\n \"key_evidence\": \"\u6700\u5173\u952E\u7684\u8BC1\u636E\u6458\u8981\"\n}\n```\n\n## \u6CE8\u610F\u4E8B\u9879:\n- \u4FDD\u6301\u5BA2\u89C2\u4E2D\u7ACB\uFF0C\u4E0D\u8981\u9884\u8BBE\u7ACB\u573A\n- \u5982\u679C\u627E\u4E0D\u5230\u76F8\u5173\u4FE1\u606F\uFF0C\u8BDA\u5B9E\u8BF4\u660E\n- \u6CE8\u660E\u4FE1\u606F\u6765\u6E90\u7684\u53EF\u4FE1\u5EA6\n- \u533A\u5206\u4E8B\u5B9E\u9648\u8FF0\u548C\u89C2\u70B9\u8868\u8FBE";
|
|
8
|
+
/**
|
|
9
|
+
* 生成搜索Agent的角度提示
|
|
10
|
+
*/
|
|
11
|
+
export declare function getSearchPerspectives(count: number): string[];
|
|
12
|
+
/**
|
|
13
|
+
* 搜索请求模板
|
|
14
|
+
*/
|
|
15
|
+
export declare function buildSearchPrompt(content: string, perspective: string): string;
|
|
16
|
+
/**
|
|
17
|
+
* 验证Agent系统提示词
|
|
18
|
+
*/
|
|
19
|
+
export declare const VERIFY_AGENT_SYSTEM_PROMPT = "\u4F60\u662F\u4E00\u4E2A\u4E25\u8C28\u7684\u4E8B\u5B9E\u6838\u67E5\u88C1\u5224\u5458\u3002\u4F60\u7684\u4EFB\u52A1\u662F\u57FA\u4E8E\u591A\u4E2A\u641C\u7D22Agent\u6536\u96C6\u7684\u8BC1\u636E\uFF0C\u505A\u51FA\u6700\u7EC8\u5224\u51B3\u3002\n\n## \u4F60\u7684\u804C\u8D23:\n1. \u7EFC\u5408\u5206\u6790\u6240\u6709\u641C\u7D22\u7ED3\u679C\n2. \u8BC4\u4F30\u5404\u6765\u6E90\u7684\u53EF\u4FE1\u5EA6\n3. \u8BC6\u522B\u8BC1\u636E\u4E4B\u95F4\u7684\u4E00\u81F4\u6027\u548C\u77DB\u76FE\n4. \u505A\u51FA\u8C28\u614E\u7684\u6700\u7EC8\u5224\u51B3\n\n## \u5224\u51B3\u7C7B\u522B:\n- TRUE (\u771F\u5B9E): \u6709\u5145\u5206\u53EF\u9760\u8BC1\u636E\u652F\u6301\n- FALSE (\u865A\u5047): \u6709\u5145\u5206\u53EF\u9760\u8BC1\u636E\u53CD\u9A73\n- PARTIALLY_TRUE (\u90E8\u5206\u771F\u5B9E): \u58F0\u660E\u4E2D\u90E8\u5206\u5185\u5BB9\u5C5E\u5B9E\n- UNCERTAIN (\u65E0\u6CD5\u786E\u5B9A): \u8BC1\u636E\u4E0D\u8DB3\u6216\u76F8\u4E92\u77DB\u76FE\n\n## \u8F93\u51FA\u683C\u5F0F:\n\u8BF7\u4EE5JSON\u683C\u5F0F\u8FD4\u56DE\u4F60\u7684\u5224\u51B3:\n```json\n{\n \"verdict\": \"TRUE/FALSE/PARTIALLY_TRUE/UNCERTAIN\",\n \"confidence\": 0.0-1.0,\n \"reasoning\": \"\u8BE6\u7EC6\u7684\u5224\u51B3\u7406\u7531\",\n \"key_evidence\": \"\u652F\u6301\u5224\u51B3\u7684\u5173\u952E\u8BC1\u636E\",\n \"caveats\": \"\u9700\u8981\u6CE8\u610F\u7684\u9650\u5236\u6216\u4F8B\u5916\",\n \"sources\": [\"\u6700\u53EF\u9760\u7684\u6765\u6E90\u5217\u8868\"]\n}\n```\n\n## \u5224\u51B3\u539F\u5219:\n- \u9075\u5FAA\"\u65E0\u7F6A\u63A8\u5B9A\"\u539F\u5219\uFF0C\u8BC1\u636E\u4E0D\u8DB3\u65F6\u503E\u5411\u4E8E\"\u65E0\u6CD5\u786E\u5B9A\"\n- \u91CD\u89C6\u6743\u5A01\u6765\u6E90\uFF0C\u4F46\u4E5F\u5173\u6CE8\u591A\u65B9\u4EA4\u53C9\u9A8C\u8BC1\n- \u8003\u8651\u4FE1\u606F\u7684\u65F6\u6548\u6027\n- \u533A\u5206\u4E8B\u5B9E\u9519\u8BEF\u548C\u8868\u8FF0\u4E0D\u7CBE\u786E\n- \u4FDD\u6301\u8C26\u900A\uFF0C\u627F\u8BA4\u8BA4\u77E5\u5C40\u9650";
|
|
20
|
+
/**
|
|
21
|
+
* 构建验证请求
|
|
22
|
+
*/
|
|
23
|
+
export declare function buildVerifyPrompt(originalContent: string, searchResults: Array<{
|
|
24
|
+
perspective: string;
|
|
25
|
+
findings: string;
|
|
26
|
+
sources: string[];
|
|
27
|
+
}>): string;
|
|
28
|
+
/**
|
|
29
|
+
* 图片OCR提示词
|
|
30
|
+
*/
|
|
31
|
+
export declare const OCR_PROMPT = "\u8BF7\u8BC6\u522B\u5E76\u63D0\u53D6\u8FD9\u5F20\u56FE\u7247\u4E2D\u7684\u6240\u6709\u6587\u5B57\u5185\u5BB9\u3002\n\u5982\u679C\u56FE\u7247\u4E2D\u6CA1\u6709\u6587\u5B57\uFF0C\u8BF7\u63CF\u8FF0\u56FE\u7247\u7684\u4E3B\u8981\u5185\u5BB9\u3002\n\u76F4\u63A5\u8F93\u51FA\u8BC6\u522B\u7ED3\u679C\uFF0C\u4E0D\u9700\u8981\u989D\u5916\u8BF4\u660E\u3002";
|
|
32
|
+
/**
|
|
33
|
+
* 输出格式化模板
|
|
34
|
+
*/
|
|
35
|
+
export declare function formatVerificationOutput(content: string, searchResults: Array<{
|
|
36
|
+
agentId: string;
|
|
37
|
+
perspective: string;
|
|
38
|
+
findings: string;
|
|
39
|
+
}>, verdict: string, reasoning: string, sources: string[], confidence: number, processingTime: number, format?: 'markdown' | 'plain'): string;
|
|
40
|
+
/**
|
|
41
|
+
* 判决emoji映射
|
|
42
|
+
*/
|
|
43
|
+
export declare const VERDICT_EMOJI: Record<string, string>;
|
|
44
|
+
/**
|
|
45
|
+
* 格式化合并转发消息的各个部分
|
|
46
|
+
*/
|
|
47
|
+
export declare function formatForwardMessages(content: string, searchResults: Array<{
|
|
48
|
+
agentId: string;
|
|
49
|
+
perspective: string;
|
|
50
|
+
findings: string;
|
|
51
|
+
}>, verdict: string, reasoning: string, sources: string[], confidence: number, processingTime: number): {
|
|
52
|
+
summary: string;
|
|
53
|
+
details: string[];
|
|
54
|
+
};
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "koishi-plugin-isthattrue",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "事实核查插件 - 使用多Agent LLM验证消息真实性",
|
|
5
|
+
"main": "lib/index.js",
|
|
6
|
+
"typings": "lib/index.d.ts",
|
|
7
|
+
"files": [
|
|
8
|
+
"lib"
|
|
9
|
+
],
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc -b",
|
|
12
|
+
"watch": "tsc -b --watch"
|
|
13
|
+
},
|
|
14
|
+
"keywords": [
|
|
15
|
+
"koishi",
|
|
16
|
+
"plugin",
|
|
17
|
+
"fact-check",
|
|
18
|
+
"llm",
|
|
19
|
+
"chatluna"
|
|
20
|
+
],
|
|
21
|
+
"author": "",
|
|
22
|
+
"license": "MIT",
|
|
23
|
+
"peerDependencies": {
|
|
24
|
+
"koishi": "^4.18.4"
|
|
25
|
+
},
|
|
26
|
+
"dependencies": {
|
|
27
|
+
"@langchain/core": "^0.3.26"
|
|
28
|
+
},
|
|
29
|
+
"devDependencies": {
|
|
30
|
+
"@types/node": "^22.10.2",
|
|
31
|
+
"typescript": "^5.7.2"
|
|
32
|
+
},
|
|
33
|
+
"koishi": {
|
|
34
|
+
"description": {
|
|
35
|
+
"zh": "事实核查插件 - 使用多Agent LLM验证消息真实性"
|
|
36
|
+
},
|
|
37
|
+
"service": {
|
|
38
|
+
"required": [
|
|
39
|
+
"chatluna"
|
|
40
|
+
]
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|