@nahisaho/katashiro-analyzer 2.0.13 → 2.1.1
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/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/research/agent/ActionRouter.d.ts +101 -0
- package/dist/research/agent/ActionRouter.d.ts.map +1 -0
- package/dist/research/agent/ActionRouter.js +284 -0
- package/dist/research/agent/ActionRouter.js.map +1 -0
- package/dist/research/agent/ActionTracker.d.ts +105 -0
- package/dist/research/agent/ActionTracker.d.ts.map +1 -0
- package/dist/research/agent/ActionTracker.js +219 -0
- package/dist/research/agent/ActionTracker.js.map +1 -0
- package/dist/research/agent/AnswerEvaluator.d.ts +156 -0
- package/dist/research/agent/AnswerEvaluator.d.ts.map +1 -0
- package/dist/research/agent/AnswerEvaluator.js +626 -0
- package/dist/research/agent/AnswerEvaluator.js.map +1 -0
- package/dist/research/agent/DeepResearchAgent.d.ts +136 -0
- package/dist/research/agent/DeepResearchAgent.d.ts.map +1 -0
- package/dist/research/agent/DeepResearchAgent.js +381 -0
- package/dist/research/agent/DeepResearchAgent.js.map +1 -0
- package/dist/research/agent/KnowledgeStore.d.ts +95 -0
- package/dist/research/agent/KnowledgeStore.d.ts.map +1 -0
- package/dist/research/agent/KnowledgeStore.js +189 -0
- package/dist/research/agent/KnowledgeStore.js.map +1 -0
- package/dist/research/agent/QueryRewriter.d.ts +111 -0
- package/dist/research/agent/QueryRewriter.d.ts.map +1 -0
- package/dist/research/agent/QueryRewriter.js +350 -0
- package/dist/research/agent/QueryRewriter.js.map +1 -0
- package/dist/research/agent/TokenTracker.d.ts +100 -0
- package/dist/research/agent/TokenTracker.d.ts.map +1 -0
- package/dist/research/agent/TokenTracker.js +150 -0
- package/dist/research/agent/TokenTracker.js.map +1 -0
- package/dist/research/agent/actions/AnswerActionHandler.d.ts +44 -0
- package/dist/research/agent/actions/AnswerActionHandler.d.ts.map +1 -0
- package/dist/research/agent/actions/AnswerActionHandler.js +158 -0
- package/dist/research/agent/actions/AnswerActionHandler.js.map +1 -0
- package/dist/research/agent/actions/BaseActionHandler.d.ts +87 -0
- package/dist/research/agent/actions/BaseActionHandler.d.ts.map +1 -0
- package/dist/research/agent/actions/BaseActionHandler.js +67 -0
- package/dist/research/agent/actions/BaseActionHandler.js.map +1 -0
- package/dist/research/agent/actions/CodingActionHandler.d.ts +66 -0
- package/dist/research/agent/actions/CodingActionHandler.d.ts.map +1 -0
- package/dist/research/agent/actions/CodingActionHandler.js +233 -0
- package/dist/research/agent/actions/CodingActionHandler.js.map +1 -0
- package/dist/research/agent/actions/ReflectActionHandler.d.ts +32 -0
- package/dist/research/agent/actions/ReflectActionHandler.d.ts.map +1 -0
- package/dist/research/agent/actions/ReflectActionHandler.js +107 -0
- package/dist/research/agent/actions/ReflectActionHandler.js.map +1 -0
- package/dist/research/agent/actions/SearchActionHandler.d.ts +30 -0
- package/dist/research/agent/actions/SearchActionHandler.d.ts.map +1 -0
- package/dist/research/agent/actions/SearchActionHandler.js +73 -0
- package/dist/research/agent/actions/SearchActionHandler.js.map +1 -0
- package/dist/research/agent/actions/VisitActionHandler.d.ts +33 -0
- package/dist/research/agent/actions/VisitActionHandler.d.ts.map +1 -0
- package/dist/research/agent/actions/VisitActionHandler.js +83 -0
- package/dist/research/agent/actions/VisitActionHandler.js.map +1 -0
- package/dist/research/agent/actions/index.d.ts +10 -0
- package/dist/research/agent/actions/index.d.ts.map +1 -0
- package/dist/research/agent/actions/index.js +10 -0
- package/dist/research/agent/actions/index.js.map +1 -0
- package/dist/research/agent/index.d.ts +62 -0
- package/dist/research/agent/index.d.ts.map +1 -0
- package/dist/research/agent/index.js +57 -0
- package/dist/research/agent/index.js.map +1 -0
- package/dist/research/agent/types.d.ts +421 -0
- package/dist/research/agent/types.d.ts.map +1 -0
- package/dist/research/agent/types.js +45 -0
- package/dist/research/agent/types.js.map +1 -0
- package/dist/research/index.d.ts +1 -0
- package/dist/research/index.d.ts.map +1 -1
- package/dist/research/index.js +2 -0
- package/dist/research/index.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TokenTracker - トークン使用量追跡
|
|
3
|
+
*
|
|
4
|
+
* @requirement REQ-DR-007
|
|
5
|
+
* @design DES-v2.1.0-DeepResearchAgent
|
|
6
|
+
*/
|
|
7
|
+
import type { TokenUsage } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* TokenTrackerオプション
|
|
10
|
+
*/
|
|
11
|
+
export interface TokenTrackerOptions {
|
|
12
|
+
/** トークン予算 */
|
|
13
|
+
budget: number;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* トークン使用量を追跡するクラス
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* const tracker = new TokenTracker({ budget: 1_000_000 });
|
|
21
|
+
*
|
|
22
|
+
* tracker.trackUsage(100, 50); // promptTokens, completionTokens
|
|
23
|
+
*
|
|
24
|
+
* console.log(`Remaining: ${tracker.getRemainingBudget()}`);
|
|
25
|
+
* console.log(`Usage: ${(tracker.getUsageRatio() * 100).toFixed(1)}%`);
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export declare class TokenTracker {
|
|
29
|
+
private budget;
|
|
30
|
+
private promptTokens;
|
|
31
|
+
private completionTokens;
|
|
32
|
+
private usage;
|
|
33
|
+
private history;
|
|
34
|
+
constructor(options: TokenTrackerOptions | number);
|
|
35
|
+
/**
|
|
36
|
+
* トークン使用量を記録(prompt/completionトークン)
|
|
37
|
+
*/
|
|
38
|
+
trackUsage(promptTokens: number, completionTokens: number): void;
|
|
39
|
+
/**
|
|
40
|
+
* トークン使用量を記録(ツール名付き)
|
|
41
|
+
*/
|
|
42
|
+
trackUsage(tool: string, usage: TokenUsage): void;
|
|
43
|
+
/**
|
|
44
|
+
* 総使用量を取得
|
|
45
|
+
*/
|
|
46
|
+
getTotalUsage(): number;
|
|
47
|
+
/**
|
|
48
|
+
* トークン使用量を取得
|
|
49
|
+
*/
|
|
50
|
+
getUsage(): TokenUsage;
|
|
51
|
+
/**
|
|
52
|
+
* 残り予算を取得
|
|
53
|
+
*/
|
|
54
|
+
getRemainingBudget(): number;
|
|
55
|
+
/**
|
|
56
|
+
* ツール別の使用量を取得
|
|
57
|
+
*/
|
|
58
|
+
getBreakdown(): Record<string, number>;
|
|
59
|
+
/**
|
|
60
|
+
* 予算を超過しているか
|
|
61
|
+
*/
|
|
62
|
+
isExceeded(): boolean;
|
|
63
|
+
/**
|
|
64
|
+
* 使用率を取得(0-1)
|
|
65
|
+
*/
|
|
66
|
+
getUsageRatio(): number;
|
|
67
|
+
/**
|
|
68
|
+
* 残り予算の比率を取得(0-1)
|
|
69
|
+
*/
|
|
70
|
+
getRemainingRatio(): number;
|
|
71
|
+
/**
|
|
72
|
+
* 履歴を取得
|
|
73
|
+
*/
|
|
74
|
+
getHistory(): Array<{
|
|
75
|
+
tool: string;
|
|
76
|
+
usage: TokenUsage;
|
|
77
|
+
timestamp: string;
|
|
78
|
+
}>;
|
|
79
|
+
/**
|
|
80
|
+
* 予算を更新
|
|
81
|
+
*/
|
|
82
|
+
setBudget(budget: number): void;
|
|
83
|
+
/**
|
|
84
|
+
* リセット
|
|
85
|
+
*/
|
|
86
|
+
reset(): void;
|
|
87
|
+
/**
|
|
88
|
+
* 現在の状態をサマリーとして取得
|
|
89
|
+
*/
|
|
90
|
+
getSummary(): {
|
|
91
|
+
budget: number;
|
|
92
|
+
used: number;
|
|
93
|
+
remaining: number;
|
|
94
|
+
usageRatio: number;
|
|
95
|
+
isExceeded: boolean;
|
|
96
|
+
breakdown: Record<string, number>;
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
export type { TokenUsage };
|
|
100
|
+
//# sourceMappingURL=TokenTracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TokenTracker.d.ts","sourceRoot":"","sources":["../../../src/research/agent/TokenTracker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,aAAa;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;GAYG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,gBAAgB,CAAa;IACrC,OAAO,CAAC,KAAK,CAAsB;IACnC,OAAO,CAAC,OAAO,CAAgE;gBAEnE,OAAO,EAAE,mBAAmB,GAAG,MAAM;IAUjD;;OAEG;IACH,UAAU,CAAC,YAAY,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,IAAI;IAChE;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI;IA8BjD;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACH,QAAQ,IAAI,UAAU;IAQtB;;OAEG;IACH,kBAAkB,IAAI,MAAM;IAI5B;;OAEG;IACH,YAAY,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAQtC;;OAEG;IACH,UAAU,IAAI,OAAO;IAIrB;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACH,iBAAiB,IAAI,MAAM;IAI3B;;OAEG;IACH,UAAU,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,UAAU,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAI3E;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI/B;;OAEG;IACH,KAAK,IAAI,IAAI;IAOb;;OAEG;IACH,UAAU,IAAI;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,OAAO,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACnC;CAUF;AAGD,YAAY,EAAE,UAAU,EAAE,CAAC"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TokenTracker - トークン使用量追跡
|
|
3
|
+
*
|
|
4
|
+
* @requirement REQ-DR-007
|
|
5
|
+
* @design DES-v2.1.0-DeepResearchAgent
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* トークン使用量を追跡するクラス
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* const tracker = new TokenTracker({ budget: 1_000_000 });
|
|
13
|
+
*
|
|
14
|
+
* tracker.trackUsage(100, 50); // promptTokens, completionTokens
|
|
15
|
+
*
|
|
16
|
+
* console.log(`Remaining: ${tracker.getRemainingBudget()}`);
|
|
17
|
+
* console.log(`Usage: ${(tracker.getUsageRatio() * 100).toFixed(1)}%`);
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export class TokenTracker {
|
|
21
|
+
budget;
|
|
22
|
+
promptTokens = 0;
|
|
23
|
+
completionTokens = 0;
|
|
24
|
+
usage;
|
|
25
|
+
history;
|
|
26
|
+
constructor(options) {
|
|
27
|
+
if (typeof options === 'number') {
|
|
28
|
+
this.budget = options;
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
this.budget = options.budget;
|
|
32
|
+
}
|
|
33
|
+
this.usage = new Map();
|
|
34
|
+
this.history = [];
|
|
35
|
+
}
|
|
36
|
+
trackUsage(arg1, arg2) {
|
|
37
|
+
if (typeof arg1 === 'number' && typeof arg2 === 'number') {
|
|
38
|
+
// trackUsage(promptTokens, completionTokens)
|
|
39
|
+
this.promptTokens += arg1;
|
|
40
|
+
this.completionTokens += arg2;
|
|
41
|
+
const total = arg1 + arg2;
|
|
42
|
+
const current = this.usage.get('llm') || 0;
|
|
43
|
+
this.usage.set('llm', current + total);
|
|
44
|
+
this.history.push({
|
|
45
|
+
tool: 'llm',
|
|
46
|
+
usage: { promptTokens: arg1, completionTokens: arg2, totalTokens: total },
|
|
47
|
+
timestamp: new Date().toISOString(),
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
else if (typeof arg1 === 'string' && typeof arg2 === 'object') {
|
|
51
|
+
// trackUsage(tool, usage)
|
|
52
|
+
const tool = arg1;
|
|
53
|
+
const usage = arg2;
|
|
54
|
+
this.promptTokens += usage.promptTokens;
|
|
55
|
+
this.completionTokens += usage.completionTokens;
|
|
56
|
+
const current = this.usage.get(tool) || 0;
|
|
57
|
+
this.usage.set(tool, current + usage.totalTokens);
|
|
58
|
+
this.history.push({
|
|
59
|
+
tool,
|
|
60
|
+
usage,
|
|
61
|
+
timestamp: new Date().toISOString(),
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* 総使用量を取得
|
|
67
|
+
*/
|
|
68
|
+
getTotalUsage() {
|
|
69
|
+
return this.promptTokens + this.completionTokens;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* トークン使用量を取得
|
|
73
|
+
*/
|
|
74
|
+
getUsage() {
|
|
75
|
+
return {
|
|
76
|
+
promptTokens: this.promptTokens,
|
|
77
|
+
completionTokens: this.completionTokens,
|
|
78
|
+
totalTokens: this.promptTokens + this.completionTokens,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* 残り予算を取得
|
|
83
|
+
*/
|
|
84
|
+
getRemainingBudget() {
|
|
85
|
+
return Math.max(0, this.budget - this.getTotalUsage());
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* ツール別の使用量を取得
|
|
89
|
+
*/
|
|
90
|
+
getBreakdown() {
|
|
91
|
+
const result = {};
|
|
92
|
+
for (const [tool, count] of this.usage.entries()) {
|
|
93
|
+
result[tool] = count;
|
|
94
|
+
}
|
|
95
|
+
return result;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* 予算を超過しているか
|
|
99
|
+
*/
|
|
100
|
+
isExceeded() {
|
|
101
|
+
return this.getTotalUsage() >= this.budget;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* 使用率を取得(0-1)
|
|
105
|
+
*/
|
|
106
|
+
getUsageRatio() {
|
|
107
|
+
return this.getTotalUsage() / this.budget;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* 残り予算の比率を取得(0-1)
|
|
111
|
+
*/
|
|
112
|
+
getRemainingRatio() {
|
|
113
|
+
return this.getRemainingBudget() / this.budget;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* 履歴を取得
|
|
117
|
+
*/
|
|
118
|
+
getHistory() {
|
|
119
|
+
return [...this.history];
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* 予算を更新
|
|
123
|
+
*/
|
|
124
|
+
setBudget(budget) {
|
|
125
|
+
this.budget = budget;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* リセット
|
|
129
|
+
*/
|
|
130
|
+
reset() {
|
|
131
|
+
this.promptTokens = 0;
|
|
132
|
+
this.completionTokens = 0;
|
|
133
|
+
this.usage.clear();
|
|
134
|
+
this.history = [];
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* 現在の状態をサマリーとして取得
|
|
138
|
+
*/
|
|
139
|
+
getSummary() {
|
|
140
|
+
return {
|
|
141
|
+
budget: this.budget,
|
|
142
|
+
used: this.getTotalUsage(),
|
|
143
|
+
remaining: this.getRemainingBudget(),
|
|
144
|
+
usageRatio: this.getUsageRatio(),
|
|
145
|
+
isExceeded: this.isExceeded(),
|
|
146
|
+
breakdown: this.getBreakdown(),
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=TokenTracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TokenTracker.js","sourceRoot":"","sources":["../../../src/research/agent/TokenTracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AnswerActionHandler - 回答生成アクション
|
|
3
|
+
*
|
|
4
|
+
* @requirement REQ-DR-001
|
|
5
|
+
* @requirement REQ-DR-004
|
|
6
|
+
* @design DES-v2.1.0-DeepResearchAgent
|
|
7
|
+
*/
|
|
8
|
+
import type { LLMClientInterface, AnswerParams, KnowledgeItem } from '../types.js';
|
|
9
|
+
import type { AnswerEvaluator } from '../AnswerEvaluator.js';
|
|
10
|
+
import { BaseActionHandler, type ExecutionContext, type ActionResult, type ActionHandlerOptions } from './BaseActionHandler.js';
|
|
11
|
+
/**
|
|
12
|
+
* 回答アクションハンドラのオプション
|
|
13
|
+
*/
|
|
14
|
+
export interface AnswerActionHandlerOptions extends ActionHandlerOptions {
|
|
15
|
+
/** LLMクライアント */
|
|
16
|
+
llmClient: LLMClientInterface;
|
|
17
|
+
/** 回答評価器 */
|
|
18
|
+
evaluator: AnswerEvaluator;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* 回答を生成するアクションハンドラ
|
|
22
|
+
*/
|
|
23
|
+
export declare class AnswerActionHandler extends BaseActionHandler<AnswerParams> {
|
|
24
|
+
readonly actionType: "answer";
|
|
25
|
+
private llmClient;
|
|
26
|
+
private evaluator;
|
|
27
|
+
constructor(options: AnswerActionHandlerOptions);
|
|
28
|
+
/**
|
|
29
|
+
* 回答を生成
|
|
30
|
+
*/
|
|
31
|
+
execute(params: AnswerParams, context: ExecutionContext): Promise<ActionResult>;
|
|
32
|
+
/**
|
|
33
|
+
* ナレッジから回答を生成
|
|
34
|
+
*/
|
|
35
|
+
private generateAnswer;
|
|
36
|
+
/**
|
|
37
|
+
* Beastモード用の強制回答生成
|
|
38
|
+
*/
|
|
39
|
+
generateForcedAnswer(question: string, knowledge: KnowledgeItem[]): Promise<{
|
|
40
|
+
answer: string;
|
|
41
|
+
references: string[];
|
|
42
|
+
}>;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=AnswerActionHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AnswerActionHandler.d.ts","sourceRoot":"","sources":["../../../../src/research/agent/actions/AnswerActionHandler.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACnF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,KAAK,YAAY,EAAE,KAAK,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAEhI;;GAEG;AACH,MAAM,WAAW,0BAA2B,SAAQ,oBAAoB;IACtE,gBAAgB;IAChB,SAAS,EAAE,kBAAkB,CAAC;IAC9B,YAAY;IACZ,SAAS,EAAE,eAAe,CAAC;CAC5B;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,iBAAiB,CAAC,YAAY,CAAC;IACtE,QAAQ,CAAC,UAAU,EAAG,QAAQ,CAAU;IAExC,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,SAAS,CAAkB;gBAEvB,OAAO,EAAE,0BAA0B;IAM/C;;OAEG;IACG,OAAO,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC;IA6CrF;;OAEG;YACW,cAAc;IA+D5B;;OAEG;IACG,oBAAoB,CACxB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,aAAa,EAAE,GACzB,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CAyDrD"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AnswerActionHandler - 回答生成アクション
|
|
3
|
+
*
|
|
4
|
+
* @requirement REQ-DR-001
|
|
5
|
+
* @requirement REQ-DR-004
|
|
6
|
+
* @design DES-v2.1.0-DeepResearchAgent
|
|
7
|
+
*/
|
|
8
|
+
import { BaseActionHandler } from './BaseActionHandler.js';
|
|
9
|
+
/**
|
|
10
|
+
* 回答を生成するアクションハンドラ
|
|
11
|
+
*/
|
|
12
|
+
export class AnswerActionHandler extends BaseActionHandler {
|
|
13
|
+
actionType = 'answer';
|
|
14
|
+
llmClient;
|
|
15
|
+
evaluator;
|
|
16
|
+
constructor(options) {
|
|
17
|
+
super(options);
|
|
18
|
+
this.llmClient = options.llmClient;
|
|
19
|
+
this.evaluator = options.evaluator;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* 回答を生成
|
|
23
|
+
*/
|
|
24
|
+
async execute(params, context) {
|
|
25
|
+
const { isFinal } = params;
|
|
26
|
+
try {
|
|
27
|
+
// ナレッジから回答を生成
|
|
28
|
+
const generatedAnswer = await this.generateAnswer(context.question, context.currentKnowledge);
|
|
29
|
+
// 回答を評価
|
|
30
|
+
const evaluation = await this.evaluator.evaluate(context.question, generatedAnswer.answer, context.currentKnowledge);
|
|
31
|
+
// 評価結果をナレッジアイテムとして保存
|
|
32
|
+
const item = this.createKnowledgeItem(`Answer Attempt:\n\n${generatedAnswer.answer}\n\nEvaluation: ${evaluation.pass ? 'PASS' : 'FAIL'}\nDetails: ${evaluation.think}`, {
|
|
33
|
+
type: 'reflection',
|
|
34
|
+
title: isFinal ? 'Final Answer' : 'Answer Attempt',
|
|
35
|
+
});
|
|
36
|
+
return {
|
|
37
|
+
success: evaluation.pass || isFinal === true,
|
|
38
|
+
knowledgeItems: [item],
|
|
39
|
+
metadata: {
|
|
40
|
+
answer: generatedAnswer.answer,
|
|
41
|
+
references: generatedAnswer.references,
|
|
42
|
+
evaluation,
|
|
43
|
+
isFinal: isFinal === true,
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
return {
|
|
49
|
+
success: false,
|
|
50
|
+
knowledgeItems: [],
|
|
51
|
+
error: error instanceof Error ? error.message : 'Answer generation failed',
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* ナレッジから回答を生成
|
|
57
|
+
*/
|
|
58
|
+
async generateAnswer(question, knowledge) {
|
|
59
|
+
// ナレッジをコンテキストとして構築
|
|
60
|
+
const knowledgeContext = knowledge
|
|
61
|
+
.map((k) => `[${k.id}] ${k.summary}\nSource: ${k.sourceId}`)
|
|
62
|
+
.join('\n\n');
|
|
63
|
+
const prompt = `Based on the gathered knowledge, provide a comprehensive answer to the question.
|
|
64
|
+
|
|
65
|
+
Question: "${question}"
|
|
66
|
+
|
|
67
|
+
Available Knowledge:
|
|
68
|
+
${knowledgeContext || 'No knowledge available.'}
|
|
69
|
+
|
|
70
|
+
Instructions:
|
|
71
|
+
1. Synthesize information from multiple sources
|
|
72
|
+
2. Provide a well-structured answer
|
|
73
|
+
3. Cite sources using [source-id] format
|
|
74
|
+
4. Acknowledge any gaps in the available information
|
|
75
|
+
5. Be factual and avoid speculation
|
|
76
|
+
|
|
77
|
+
Respond in JSON format:
|
|
78
|
+
{
|
|
79
|
+
"answer": "Your comprehensive answer here...",
|
|
80
|
+
"references": ["source-id-1", "source-id-2"]
|
|
81
|
+
}`;
|
|
82
|
+
const response = await this.llmClient.chat({
|
|
83
|
+
messages: [{ role: 'user', content: prompt }],
|
|
84
|
+
temperature: 0.7,
|
|
85
|
+
maxTokens: 2000,
|
|
86
|
+
});
|
|
87
|
+
// トークン追跡
|
|
88
|
+
if (response.usage) {
|
|
89
|
+
this.tokenTracker.trackUsage(response.usage.promptTokens ?? 0, response.usage.completionTokens ?? 0);
|
|
90
|
+
}
|
|
91
|
+
try {
|
|
92
|
+
const jsonMatch = response.content.match(/\{[\s\S]*\}/);
|
|
93
|
+
if (jsonMatch) {
|
|
94
|
+
const parsed = JSON.parse(jsonMatch[0]);
|
|
95
|
+
return parsed;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
// パース失敗
|
|
100
|
+
}
|
|
101
|
+
// デフォルト
|
|
102
|
+
return {
|
|
103
|
+
answer: response.content,
|
|
104
|
+
references: knowledge.map((k) => k.sourceId),
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Beastモード用の強制回答生成
|
|
109
|
+
*/
|
|
110
|
+
async generateForcedAnswer(question, knowledge) {
|
|
111
|
+
const knowledgeContext = knowledge
|
|
112
|
+
.map((k) => k.summary)
|
|
113
|
+
.join('\n')
|
|
114
|
+
.slice(0, 5000);
|
|
115
|
+
const prompt = `You MUST provide an answer now, even if incomplete.
|
|
116
|
+
|
|
117
|
+
Question: "${question}"
|
|
118
|
+
|
|
119
|
+
Available Information:
|
|
120
|
+
${knowledgeContext || 'Limited information available.'}
|
|
121
|
+
|
|
122
|
+
Instructions:
|
|
123
|
+
1. Provide the best possible answer with available information
|
|
124
|
+
2. Clearly indicate what is known vs. unknown
|
|
125
|
+
3. Suggest areas for further research if needed
|
|
126
|
+
|
|
127
|
+
Respond in JSON format:
|
|
128
|
+
{
|
|
129
|
+
"answer": "Your answer here...",
|
|
130
|
+
"references": [],
|
|
131
|
+
"limitations": "What is not covered..."
|
|
132
|
+
}`;
|
|
133
|
+
const response = await this.llmClient.chat({
|
|
134
|
+
messages: [{ role: 'user', content: prompt }],
|
|
135
|
+
temperature: 0.5,
|
|
136
|
+
maxTokens: 2000,
|
|
137
|
+
});
|
|
138
|
+
// トークン追跡
|
|
139
|
+
if (response.usage) {
|
|
140
|
+
this.tokenTracker.trackUsage(response.usage.promptTokens ?? 0, response.usage.completionTokens ?? 0);
|
|
141
|
+
}
|
|
142
|
+
try {
|
|
143
|
+
const jsonMatch = response.content.match(/\{[\s\S]*\}/);
|
|
144
|
+
if (jsonMatch) {
|
|
145
|
+
const parsed = JSON.parse(jsonMatch[0]);
|
|
146
|
+
return parsed;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
// パース失敗
|
|
151
|
+
}
|
|
152
|
+
return {
|
|
153
|
+
answer: response.content,
|
|
154
|
+
references: [],
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=AnswerActionHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AnswerActionHandler.js","sourceRoot":"","sources":["../../../../src/research/agent/actions/AnswerActionHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* アクションハンドラの基底クラスとインターフェース
|
|
3
|
+
*
|
|
4
|
+
* @requirement REQ-DR-001
|
|
5
|
+
* @design DES-v2.1.0-DeepResearchAgent
|
|
6
|
+
*/
|
|
7
|
+
import type { ActionType, KnowledgeItem, AgentConfig } from '../types.js';
|
|
8
|
+
import type { TokenTracker } from '../TokenTracker.js';
|
|
9
|
+
/**
|
|
10
|
+
* アクション実行結果
|
|
11
|
+
*/
|
|
12
|
+
export interface ActionResult {
|
|
13
|
+
/** 成功したか */
|
|
14
|
+
success: boolean;
|
|
15
|
+
/** 取得したナレッジアイテム */
|
|
16
|
+
knowledgeItems: KnowledgeItem[];
|
|
17
|
+
/** エラーメッセージ(失敗時) */
|
|
18
|
+
error?: string;
|
|
19
|
+
/** 追加のメタデータ */
|
|
20
|
+
metadata?: Record<string, unknown>;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* アクションハンドラのオプション
|
|
24
|
+
*/
|
|
25
|
+
export interface ActionHandlerOptions {
|
|
26
|
+
/** エージェント設定 */
|
|
27
|
+
config: AgentConfig;
|
|
28
|
+
/** トークントラッカー */
|
|
29
|
+
tokenTracker: TokenTracker;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* アクションハンドラの基底インターフェース
|
|
33
|
+
*/
|
|
34
|
+
export interface IActionHandler<TParams = unknown> {
|
|
35
|
+
/** アクションタイプ */
|
|
36
|
+
readonly actionType: ActionType;
|
|
37
|
+
/**
|
|
38
|
+
* アクションを実行
|
|
39
|
+
*/
|
|
40
|
+
execute(params: TParams, context: ExecutionContext): Promise<ActionResult>;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* アクション実行コンテキスト(簡易版)
|
|
44
|
+
*/
|
|
45
|
+
export interface ExecutionContext {
|
|
46
|
+
/** 元の質問 */
|
|
47
|
+
question: string;
|
|
48
|
+
/** 現在のステップ番号 */
|
|
49
|
+
stepNumber: number;
|
|
50
|
+
/** 訪問済みURL */
|
|
51
|
+
visitedUrls: string[];
|
|
52
|
+
/** 検索結果からのURL候補 */
|
|
53
|
+
searchResultUrls: {
|
|
54
|
+
index: number;
|
|
55
|
+
url: string;
|
|
56
|
+
title: string;
|
|
57
|
+
}[];
|
|
58
|
+
/** 現在のナレッジ */
|
|
59
|
+
currentKnowledge: KnowledgeItem[];
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* アクションハンドラの基底抽象クラス
|
|
63
|
+
*/
|
|
64
|
+
export declare abstract class BaseActionHandler<TParams = unknown> implements IActionHandler<TParams> {
|
|
65
|
+
abstract readonly actionType: ActionType;
|
|
66
|
+
protected config: AgentConfig;
|
|
67
|
+
protected tokenTracker: TokenTracker;
|
|
68
|
+
constructor(options: ActionHandlerOptions);
|
|
69
|
+
abstract execute(params: TParams, context: ExecutionContext): Promise<ActionResult>;
|
|
70
|
+
/**
|
|
71
|
+
* ナレッジアイテムを生成
|
|
72
|
+
*/
|
|
73
|
+
protected createKnowledgeItem(content: string, source: {
|
|
74
|
+
url?: string;
|
|
75
|
+
title?: string;
|
|
76
|
+
type: 'web' | 'code' | 'reflection';
|
|
77
|
+
}): KnowledgeItem;
|
|
78
|
+
/**
|
|
79
|
+
* コンテンツから要約を生成
|
|
80
|
+
*/
|
|
81
|
+
private createSummary;
|
|
82
|
+
/**
|
|
83
|
+
* コンテンツからキーワードを抽出
|
|
84
|
+
*/
|
|
85
|
+
private extractKeywords;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=BaseActionHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaseActionHandler.d.ts","sourceRoot":"","sources":["../../../../src/research/agent/actions/BaseActionHandler.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,YAAY;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,mBAAmB;IACnB,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,oBAAoB;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,eAAe;IACf,MAAM,EAAE,WAAW,CAAC;IACpB,gBAAgB;IAChB,YAAY,EAAE,YAAY,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc,CAAC,OAAO,GAAG,OAAO;IAC/C,eAAe;IACf,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAEhC;;OAEG;IACH,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CAC5E;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,WAAW;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc;IACd,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,mBAAmB;IACnB,gBAAgB,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAClE,cAAc;IACd,gBAAgB,EAAE,aAAa,EAAE,CAAC;CACnC;AAED;;GAEG;AACH,8BAAsB,iBAAiB,CAAC,OAAO,GAAG,OAAO,CAAE,YAAW,cAAc,CAAC,OAAO,CAAC;IAC3F,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAEzC,SAAS,CAAC,MAAM,EAAE,WAAW,CAAC;IAC9B,SAAS,CAAC,YAAY,EAAE,YAAY,CAAC;gBAEzB,OAAO,EAAE,oBAAoB;IAKzC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC;IAEnF;;OAEG;IACH,SAAS,CAAC,mBAAmB,CAC3B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,KAAK,GAAG,MAAM,GAAG,YAAY,CAAA;KAAE,GAC5E,aAAa;IAmBhB;;OAEG;IACH,OAAO,CAAC,aAAa;IASrB;;OAEG;IACH,OAAO,CAAC,eAAe;CAiBxB"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* アクションハンドラの基底クラスとインターフェース
|
|
3
|
+
*
|
|
4
|
+
* @requirement REQ-DR-001
|
|
5
|
+
* @design DES-v2.1.0-DeepResearchAgent
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* アクションハンドラの基底抽象クラス
|
|
9
|
+
*/
|
|
10
|
+
export class BaseActionHandler {
|
|
11
|
+
config;
|
|
12
|
+
tokenTracker;
|
|
13
|
+
constructor(options) {
|
|
14
|
+
this.config = options.config;
|
|
15
|
+
this.tokenTracker = options.tokenTracker;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* ナレッジアイテムを生成
|
|
19
|
+
*/
|
|
20
|
+
createKnowledgeItem(content, source) {
|
|
21
|
+
const now = new Date();
|
|
22
|
+
const id = `ki-${now.getTime()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
23
|
+
return {
|
|
24
|
+
id,
|
|
25
|
+
sourceId: source.url || `internal-${id}`,
|
|
26
|
+
sourceType: source.type,
|
|
27
|
+
summary: this.createSummary(content),
|
|
28
|
+
content,
|
|
29
|
+
keywords: this.extractKeywords(content),
|
|
30
|
+
timestamp: now.toISOString(),
|
|
31
|
+
metadata: {
|
|
32
|
+
title: source.title,
|
|
33
|
+
url: source.url,
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* コンテンツから要約を生成
|
|
39
|
+
*/
|
|
40
|
+
createSummary(content) {
|
|
41
|
+
// 最初の300文字を要約として使用
|
|
42
|
+
const cleaned = content.replace(/\s+/g, ' ').trim();
|
|
43
|
+
if (cleaned.length <= 300) {
|
|
44
|
+
return cleaned;
|
|
45
|
+
}
|
|
46
|
+
return cleaned.slice(0, 297) + '...';
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* コンテンツからキーワードを抽出
|
|
50
|
+
*/
|
|
51
|
+
extractKeywords(content) {
|
|
52
|
+
// 簡易的なキーワード抽出
|
|
53
|
+
const words = content
|
|
54
|
+
.toLowerCase()
|
|
55
|
+
.replace(/[^\w\s]/g, ' ')
|
|
56
|
+
.split(/\s+/)
|
|
57
|
+
.filter((w) => w.length > 3);
|
|
58
|
+
// 頻度でソート
|
|
59
|
+
const freq = new Map();
|
|
60
|
+
for (const word of words) {
|
|
61
|
+
freq.set(word, (freq.get(word) || 0) + 1);
|
|
62
|
+
}
|
|
63
|
+
const sorted = [...freq.entries()].sort((a, b) => b[1] - a[1]);
|
|
64
|
+
return sorted.slice(0, 10).map(([word]) => word);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=BaseActionHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaseActionHandler.js","sourceRoot":"","sources":["../../../../src/research/agent/actions/BaseActionHandler.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA0DH;;GAEG;AACH,MAAM,OAAgB,iBAAiB;IAG3B,MAAM,CAAc;IACpB,YAAY,CAAe;IAErC,YAAY,OAA6B;QACvC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAC3C,CAAC;IAID;;OAEG;IACO,mBAAmB,CAC3B,OAAe,EACf,MAA6E;QAE7E,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QAE3E,OAAO;YACL,EAAE;YACF,QAAQ,EAAE,MAAM,CAAC,GAAG,IAAI,YAAY,EAAE,EAAE;YACxC,UAAU,EAAE,MAAM,CAAC,IAAI;YACvB,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;YACpC,OAAO;YACP,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC;YACvC,SAAS,EAAE,GAAG,CAAC,WAAW,EAAE;YAC5B,QAAQ,EAAE;gBACR,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,GAAG,EAAE,MAAM,CAAC,GAAG;aAChB;SACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,OAAe;QACnC,mBAAmB;QACnB,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACpD,IAAI,OAAO,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;YAC1B,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC;IACvC,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,OAAe;QACrC,cAAc;QACd,MAAM,KAAK,GAAG,OAAO;aAClB,WAAW,EAAE;aACb,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC;aACxB,KAAK,CAAC,KAAK,CAAC;aACZ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAE/B,SAAS;QACT,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;QACvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5C,CAAC;QAED,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/D,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IACnD,CAAC;CACF"}
|