persona-core 1.0.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/dist/db/client.d.ts +55 -0
- package/dist/db/client.d.ts.map +1 -0
- package/dist/db/client.js +157 -0
- package/dist/db/client.js.map +1 -0
- package/dist/db/index.d.ts +7 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +7 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/repositories/executionRepository.d.ts +15 -0
- package/dist/db/repositories/executionRepository.d.ts.map +1 -0
- package/dist/db/repositories/executionRepository.js +41 -0
- package/dist/db/repositories/executionRepository.js.map +1 -0
- package/dist/db/repositories/index.d.ts +10 -0
- package/dist/db/repositories/index.d.ts.map +1 -0
- package/dist/db/repositories/index.js +10 -0
- package/dist/db/repositories/index.js.map +1 -0
- package/dist/db/repositories/nodeRepository.d.ts +15 -0
- package/dist/db/repositories/nodeRepository.d.ts.map +1 -0
- package/dist/db/repositories/nodeRepository.js +61 -0
- package/dist/db/repositories/nodeRepository.js.map +1 -0
- package/dist/db/repositories/personaRepository.d.ts +13 -0
- package/dist/db/repositories/personaRepository.d.ts.map +1 -0
- package/dist/db/repositories/personaRepository.js +42 -0
- package/dist/db/repositories/personaRepository.js.map +1 -0
- package/dist/db/repositories/planResultRepository.d.ts +13 -0
- package/dist/db/repositories/planResultRepository.d.ts.map +1 -0
- package/dist/db/repositories/planResultRepository.js +30 -0
- package/dist/db/repositories/planResultRepository.js.map +1 -0
- package/dist/db/repositories/scheduleRepository.d.ts +27 -0
- package/dist/db/repositories/scheduleRepository.d.ts.map +1 -0
- package/dist/db/repositories/scheduleRepository.js +187 -0
- package/dist/db/repositories/scheduleRepository.js.map +1 -0
- package/dist/db/repositories/types.d.ts +132 -0
- package/dist/db/repositories/types.d.ts.map +1 -0
- package/dist/db/repositories/types.js +5 -0
- package/dist/db/repositories/types.js.map +1 -0
- package/dist/db/schema.d.ts +742 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +85 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/capabilities.d.ts +56 -0
- package/dist/llm/capabilities.d.ts.map +1 -0
- package/dist/llm/capabilities.js +305 -0
- package/dist/llm/capabilities.js.map +1 -0
- package/dist/llm/index.d.ts +7 -0
- package/dist/llm/index.d.ts.map +1 -0
- package/dist/llm/index.js +10 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/llm/interfaces.d.ts +249 -0
- package/dist/llm/interfaces.d.ts.map +1 -0
- package/dist/llm/interfaces.js +5 -0
- package/dist/llm/interfaces.js.map +1 -0
- package/dist/llm/providers/anthropic-compatible.d.ts +48 -0
- package/dist/llm/providers/anthropic-compatible.d.ts.map +1 -0
- package/dist/llm/providers/anthropic-compatible.js +163 -0
- package/dist/llm/providers/anthropic-compatible.js.map +1 -0
- package/dist/llm/providers/index.d.ts +14 -0
- package/dist/llm/providers/index.d.ts.map +1 -0
- package/dist/llm/providers/index.js +12 -0
- package/dist/llm/providers/index.js.map +1 -0
- package/dist/llm/providers/openai-compatible.d.ts +59 -0
- package/dist/llm/providers/openai-compatible.d.ts.map +1 -0
- package/dist/llm/providers/openai-compatible.js +207 -0
- package/dist/llm/providers/openai-compatible.js.map +1 -0
- package/dist/services/actionService.d.ts +132 -0
- package/dist/services/actionService.d.ts.map +1 -0
- package/dist/services/actionService.js +971 -0
- package/dist/services/actionService.js.map +1 -0
- package/dist/services/branchService.d.ts +19 -0
- package/dist/services/branchService.d.ts.map +1 -0
- package/dist/services/branchService.js +50 -0
- package/dist/services/branchService.js.map +1 -0
- package/dist/services/expressionEvaluator.d.ts +16 -0
- package/dist/services/expressionEvaluator.d.ts.map +1 -0
- package/dist/services/expressionEvaluator.js +70 -0
- package/dist/services/expressionEvaluator.js.map +1 -0
- package/dist/services/factory.d.ts +43 -0
- package/dist/services/factory.d.ts.map +1 -0
- package/dist/services/factory.js +30 -0
- package/dist/services/factory.js.map +1 -0
- package/dist/services/index.d.ts +15 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +17 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/interfaces.d.ts +117 -0
- package/dist/services/interfaces.d.ts.map +1 -0
- package/dist/services/interfaces.js +5 -0
- package/dist/services/interfaces.js.map +1 -0
- package/dist/services/loaders/fileLoader.d.ts +56 -0
- package/dist/services/loaders/fileLoader.d.ts.map +1 -0
- package/dist/services/loaders/fileLoader.js +161 -0
- package/dist/services/loaders/fileLoader.js.map +1 -0
- package/dist/services/loaders/index.d.ts +6 -0
- package/dist/services/loaders/index.d.ts.map +1 -0
- package/dist/services/loaders/index.js +6 -0
- package/dist/services/loaders/index.js.map +1 -0
- package/dist/services/loaders/transformers.d.ts +32 -0
- package/dist/services/loaders/transformers.d.ts.map +1 -0
- package/dist/services/loaders/transformers.js +78 -0
- package/dist/services/loaders/transformers.js.map +1 -0
- package/dist/services/mockAction.d.ts +65 -0
- package/dist/services/mockAction.d.ts.map +1 -0
- package/dist/services/mockAction.js +153 -0
- package/dist/services/mockAction.js.map +1 -0
- package/dist/services/mockBranch.d.ts +50 -0
- package/dist/services/mockBranch.d.ts.map +1 -0
- package/dist/services/mockBranch.js +75 -0
- package/dist/services/mockBranch.js.map +1 -0
- package/dist/services/mockThinking.d.ts +68 -0
- package/dist/services/mockThinking.d.ts.map +1 -0
- package/dist/services/mockThinking.js +89 -0
- package/dist/services/mockThinking.js.map +1 -0
- package/dist/services/thinkingService.d.ts +15 -0
- package/dist/services/thinkingService.d.ts.map +1 -0
- package/dist/services/thinkingService.js +117 -0
- package/dist/services/thinkingService.js.map +1 -0
- package/dist/temporal/activities/actionActivities.d.ts +15 -0
- package/dist/temporal/activities/actionActivities.d.ts.map +1 -0
- package/dist/temporal/activities/actionActivities.js +140 -0
- package/dist/temporal/activities/actionActivities.js.map +1 -0
- package/dist/temporal/activities/branchActivities.d.ts +13 -0
- package/dist/temporal/activities/branchActivities.d.ts.map +1 -0
- package/dist/temporal/activities/branchActivities.js +26 -0
- package/dist/temporal/activities/branchActivities.js.map +1 -0
- package/dist/temporal/activities/dbActivities.d.ts +14 -0
- package/dist/temporal/activities/dbActivities.d.ts.map +1 -0
- package/dist/temporal/activities/dbActivities.js +84 -0
- package/dist/temporal/activities/dbActivities.js.map +1 -0
- package/dist/temporal/activities/index.d.ts +9 -0
- package/dist/temporal/activities/index.d.ts.map +1 -0
- package/dist/temporal/activities/index.js +9 -0
- package/dist/temporal/activities/index.js.map +1 -0
- package/dist/temporal/activities/thinkingActivities.d.ts +17 -0
- package/dist/temporal/activities/thinkingActivities.d.ts.map +1 -0
- package/dist/temporal/activities/thinkingActivities.js +145 -0
- package/dist/temporal/activities/thinkingActivities.js.map +1 -0
- package/dist/temporal/activities/types.d.ts +100 -0
- package/dist/temporal/activities/types.d.ts.map +1 -0
- package/dist/temporal/activities/types.js +5 -0
- package/dist/temporal/activities/types.js.map +1 -0
- package/dist/temporal/client.d.ts +43 -0
- package/dist/temporal/client.d.ts.map +1 -0
- package/dist/temporal/client.js +75 -0
- package/dist/temporal/client.js.map +1 -0
- package/dist/temporal/index.d.ts +10 -0
- package/dist/temporal/index.d.ts.map +1 -0
- package/dist/temporal/index.js +12 -0
- package/dist/temporal/index.js.map +1 -0
- package/dist/temporal/personaCoreClient.d.ts +199 -0
- package/dist/temporal/personaCoreClient.d.ts.map +1 -0
- package/dist/temporal/personaCoreClient.js +233 -0
- package/dist/temporal/personaCoreClient.js.map +1 -0
- package/dist/temporal/personaWorker.d.ts +141 -0
- package/dist/temporal/personaWorker.d.ts.map +1 -0
- package/dist/temporal/personaWorker.js +93 -0
- package/dist/temporal/personaWorker.js.map +1 -0
- package/dist/temporal/worker.d.ts +66 -0
- package/dist/temporal/worker.d.ts.map +1 -0
- package/dist/temporal/worker.js +109 -0
- package/dist/temporal/worker.js.map +1 -0
- package/dist/temporal/workflows/index.d.ts +5 -0
- package/dist/temporal/workflows/index.d.ts.map +1 -0
- package/dist/temporal/workflows/index.js +5 -0
- package/dist/temporal/workflows/index.js.map +1 -0
- package/dist/temporal/workflows/scheduleWorkflow.d.ts +31 -0
- package/dist/temporal/workflows/scheduleWorkflow.d.ts.map +1 -0
- package/dist/temporal/workflows/scheduleWorkflow.js +256 -0
- package/dist/temporal/workflows/scheduleWorkflow.js.map +1 -0
- package/dist/types/common.d.ts +81 -0
- package/dist/types/common.d.ts.map +1 -0
- package/dist/types/common.js +5 -0
- package/dist/types/common.js.map +1 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +12 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/nodes.d.ts +496 -0
- package/dist/types/nodes.d.ts.map +1 -0
- package/dist/types/nodes.js +5 -0
- package/dist/types/nodes.js.map +1 -0
- package/dist/types/persona.d.ts +59 -0
- package/dist/types/persona.d.ts.map +1 -0
- package/dist/types/persona.js +36 -0
- package/dist/types/persona.js.map +1 -0
- package/dist/types/schedule.d.ts +143 -0
- package/dist/types/schedule.d.ts.map +1 -0
- package/dist/types/schedule.js +155 -0
- package/dist/types/schedule.js.map +1 -0
- package/dist/utils/dateUtils.d.ts +31 -0
- package/dist/utils/dateUtils.d.ts.map +1 -0
- package/dist/utils/dateUtils.js +53 -0
- package/dist/utils/dateUtils.js.map +1 -0
- package/dist/utils/index.d.ts +8 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +8 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/inputResolver.d.ts +43 -0
- package/dist/utils/inputResolver.d.ts.map +1 -0
- package/dist/utils/inputResolver.js +137 -0
- package/dist/utils/inputResolver.js.map +1 -0
- package/dist/utils/sharedDataUtils.d.ts +36 -0
- package/dist/utils/sharedDataUtils.d.ts.map +1 -0
- package/dist/utils/sharedDataUtils.js +84 -0
- package/dist/utils/sharedDataUtils.js.map +1 -0
- package/dist/utils/typeGuards.d.ts +33 -0
- package/dist/utils/typeGuards.d.ts.map +1 -0
- package/dist/utils/typeGuards.js +50 -0
- package/dist/utils/typeGuards.js.map +1 -0
- package/docs/add-llm-provider.md +353 -0
- package/docs/external/deepseek-v32.md +28 -0
- package/docs/quick-start.md +849 -0
- package/docs/suite-guide.md +148 -0
- package/docs/usage-guide.md +1487 -0
- package/package.json +80 -0
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM 抽象层接口定义
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* LLM 对话消息
|
|
6
|
+
*/
|
|
7
|
+
export interface LLMMessage {
|
|
8
|
+
role: 'system' | 'user' | 'assistant';
|
|
9
|
+
content: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* LLM 调用响应
|
|
13
|
+
* 包含内容和可选的元数据(如思考过程)
|
|
14
|
+
*/
|
|
15
|
+
export interface LLMResponse {
|
|
16
|
+
/** 模型生成的内容 */
|
|
17
|
+
content: string;
|
|
18
|
+
/** 模型的思考过程(如果模型支持,如 DeepSeek R1 的 reasoning_content) */
|
|
19
|
+
reasoningContent?: string;
|
|
20
|
+
/** 使用的 token 数量 */
|
|
21
|
+
usage?: {
|
|
22
|
+
promptTokens?: number;
|
|
23
|
+
completionTokens?: number;
|
|
24
|
+
reasoningTokens?: number;
|
|
25
|
+
totalTokens?: number;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* 结构化输出响应
|
|
30
|
+
*/
|
|
31
|
+
export interface LLMStructuredResponse<T> {
|
|
32
|
+
/** 解析后的结构化数据 */
|
|
33
|
+
data: T;
|
|
34
|
+
/** 原始内容 */
|
|
35
|
+
rawContent: string;
|
|
36
|
+
/** 模型的思考过程(如果模型支持) */
|
|
37
|
+
reasoningContent?: string;
|
|
38
|
+
/** 使用的 token 数量 */
|
|
39
|
+
usage?: LLMResponse['usage'];
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* 结构化输出配置
|
|
43
|
+
*/
|
|
44
|
+
export interface StructuredOutputConfig<T> {
|
|
45
|
+
/** JSON Schema 描述字符串 */
|
|
46
|
+
schema: string;
|
|
47
|
+
/** 结果解析函数 */
|
|
48
|
+
parser?: (content: string) => T;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* LLM 调用选项
|
|
52
|
+
*/
|
|
53
|
+
export interface LLMCallOptions {
|
|
54
|
+
/** 温度参数 (0-1) */
|
|
55
|
+
temperature?: number;
|
|
56
|
+
/** 最大输出 tokens */
|
|
57
|
+
maxTokens?: number;
|
|
58
|
+
/** 超时时间 (ms) */
|
|
59
|
+
timeout?: number;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* 核心 LLM 提供者接口
|
|
63
|
+
* 所有 LLM 提供者(DeepSeek、Claude、Gemini 等)都需要实现此接口
|
|
64
|
+
*/
|
|
65
|
+
export interface LLMProvider {
|
|
66
|
+
/** 提供者名称(用于日志和调试) */
|
|
67
|
+
readonly name: string;
|
|
68
|
+
/**
|
|
69
|
+
* 基础对话能力
|
|
70
|
+
* @param messages 对话消息列表
|
|
71
|
+
* @param options 调用选项
|
|
72
|
+
* @returns 模型响应(包含内容和可选的思考过程)
|
|
73
|
+
*/
|
|
74
|
+
chat(messages: LLMMessage[], options?: LLMCallOptions): Promise<LLMResponse>;
|
|
75
|
+
/**
|
|
76
|
+
* 带结构化输出的对话
|
|
77
|
+
* @param messages 对话消息列表
|
|
78
|
+
* @param config 结构化输出配置
|
|
79
|
+
* @param options 调用选项
|
|
80
|
+
* @returns 结构化响应(包含解析后数据和可选的思考过程)
|
|
81
|
+
*/
|
|
82
|
+
chatWithStructuredOutput<T>(messages: LLMMessage[], config: StructuredOutputConfig<T>, options?: LLMCallOptions): Promise<LLMStructuredResponse<T>>;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* 后续节点信息(用于工作流上下文)
|
|
86
|
+
*/
|
|
87
|
+
export interface UpcomingNodeInfo {
|
|
88
|
+
id: string;
|
|
89
|
+
kind: 'thinking' | 'action' | 'branch';
|
|
90
|
+
/** 动作类型 ID(仅 action 节点) */
|
|
91
|
+
actionTypeId?: string;
|
|
92
|
+
/** 动作名称(仅 action 节点,便于 LLM 理解) */
|
|
93
|
+
actionName?: string;
|
|
94
|
+
/** 思考提示(仅 thinking 节点) */
|
|
95
|
+
thinkingPrompt?: string;
|
|
96
|
+
/** 下一个节点 ID */
|
|
97
|
+
nextNodeId: string | null;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* 工作流上下文(用于中间 thinking 节点)
|
|
101
|
+
*/
|
|
102
|
+
export interface WorkflowContext {
|
|
103
|
+
/** 当前节点 ID */
|
|
104
|
+
currentNodeId: string;
|
|
105
|
+
/** 当前节点在执行链中的位置(从 1 开始) */
|
|
106
|
+
position: number;
|
|
107
|
+
/** 后续已规划的节点列表 */
|
|
108
|
+
upcomingNodes: UpcomingNodeInfo[];
|
|
109
|
+
/** 是否有后续节点 */
|
|
110
|
+
hasUpcomingNodes: boolean;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* 规划上下文
|
|
114
|
+
*/
|
|
115
|
+
export interface PlanningContext {
|
|
116
|
+
sharedData: Record<string, unknown>;
|
|
117
|
+
availableActionTypes: Array<{
|
|
118
|
+
id: string;
|
|
119
|
+
name: string;
|
|
120
|
+
description?: string;
|
|
121
|
+
inputFields: Array<{
|
|
122
|
+
name: string;
|
|
123
|
+
required: boolean;
|
|
124
|
+
}>;
|
|
125
|
+
outputFields: Array<{
|
|
126
|
+
name: string;
|
|
127
|
+
/** TypeScript 类型格式,如: "Array<{ title: string, link: string }>" */
|
|
128
|
+
typeHint?: string;
|
|
129
|
+
}>;
|
|
130
|
+
}>;
|
|
131
|
+
/** 工作流上下文(当作为中间节点时提供) */
|
|
132
|
+
workflowContext?: WorkflowContext;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* 规划输出
|
|
136
|
+
*/
|
|
137
|
+
export interface PlanningOutput {
|
|
138
|
+
analysis: string;
|
|
139
|
+
plannedNodes: PlannedNode[];
|
|
140
|
+
sharedDataUpdates: Record<string, unknown>;
|
|
141
|
+
sharedDataDeclaration?: {
|
|
142
|
+
fields: Array<{
|
|
143
|
+
name: string;
|
|
144
|
+
isCollection: boolean;
|
|
145
|
+
description?: string;
|
|
146
|
+
}>;
|
|
147
|
+
};
|
|
148
|
+
/** 模型思考过程(如果模型支持) */
|
|
149
|
+
reasoningContent?: string;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* 规划生成的节点
|
|
153
|
+
*/
|
|
154
|
+
export interface PlannedNode {
|
|
155
|
+
id: string;
|
|
156
|
+
kind: 'thinking' | 'action' | 'branch';
|
|
157
|
+
actionTypeId?: string;
|
|
158
|
+
thinkingPrompt?: string;
|
|
159
|
+
inputs?: Record<string, {
|
|
160
|
+
type: 'fixed' | 'reference';
|
|
161
|
+
value?: unknown;
|
|
162
|
+
fieldName?: string;
|
|
163
|
+
/**
|
|
164
|
+
* 从数组或嵌套对象中提取数据的路径表达式
|
|
165
|
+
* 例如: "[0].link" 获取数组第一项的 link 字段
|
|
166
|
+
* 例如: "[*].imageUrl" 获取数组所有项的 imageUrl 字段组成新数组
|
|
167
|
+
*/
|
|
168
|
+
path?: string;
|
|
169
|
+
}>;
|
|
170
|
+
outputMappings?: Array<{
|
|
171
|
+
outputField: string;
|
|
172
|
+
targetField: string;
|
|
173
|
+
expression?: string;
|
|
174
|
+
}>;
|
|
175
|
+
sharedDataDeclaration?: {
|
|
176
|
+
fields: Array<{
|
|
177
|
+
name: string;
|
|
178
|
+
isCollection: boolean;
|
|
179
|
+
description?: string;
|
|
180
|
+
}>;
|
|
181
|
+
};
|
|
182
|
+
branches?: Array<{
|
|
183
|
+
branchId: string;
|
|
184
|
+
name: string;
|
|
185
|
+
targetNodeId: string;
|
|
186
|
+
}>;
|
|
187
|
+
decisionConfig?: unknown;
|
|
188
|
+
nextNodeId: string | null;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* 规划能力 - 用于思考节点
|
|
192
|
+
* 需要结构化输出来生成节点规划
|
|
193
|
+
*/
|
|
194
|
+
export interface PlanningCapability {
|
|
195
|
+
/**
|
|
196
|
+
* 执行规划
|
|
197
|
+
* @param systemPrompt 系统提示词(来自 Persona)
|
|
198
|
+
* @param userPrompt 用户提示词(来自思考节点配置)
|
|
199
|
+
* @param context 规划上下文(共享数据、可用动作等)
|
|
200
|
+
* @param options 可选的 LLM 调用选项(规划场景建议使用低 temperature 以保证稳定性)
|
|
201
|
+
* @returns 规划结果
|
|
202
|
+
*/
|
|
203
|
+
plan(systemPrompt: string, userPrompt: string, context: PlanningContext, options?: LLMCallOptions): Promise<PlanningOutput>;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* 分支决策能力 - 用于 LLM 类型的分支节点
|
|
207
|
+
*/
|
|
208
|
+
export interface BranchDecisionCapability {
|
|
209
|
+
/**
|
|
210
|
+
* 执行分支决策
|
|
211
|
+
* @param prompt 决策提示词
|
|
212
|
+
* @param inputs 决策输入数据
|
|
213
|
+
* @param branches 可选分支列表
|
|
214
|
+
* @param options 可选的 LLM 调用选项(决策场景建议使用低 temperature)
|
|
215
|
+
* @returns 选择的分支 ID
|
|
216
|
+
*/
|
|
217
|
+
decide(prompt: string, inputs: Record<string, unknown>, branches: Array<{
|
|
218
|
+
branchId: string;
|
|
219
|
+
name: string;
|
|
220
|
+
}>, options?: LLMCallOptions): Promise<string>;
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* 内容生成结果
|
|
224
|
+
*/
|
|
225
|
+
export interface ContentGenerationResult {
|
|
226
|
+
/** 生成的内容,结构与 outputFields 定义一致 */
|
|
227
|
+
outputs: Record<string, unknown>;
|
|
228
|
+
/** 模型思考过程(如果模型支持) */
|
|
229
|
+
reasoningContent?: string;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* 内容生成能力 - 用于 llm_call 类型的动作节点
|
|
233
|
+
*/
|
|
234
|
+
export interface ContentGenerationCapability {
|
|
235
|
+
/**
|
|
236
|
+
* 生成内容
|
|
237
|
+
* @param actionName 动作名称
|
|
238
|
+
* @param actionDescription 动作描述
|
|
239
|
+
* @param inputs 输入参数
|
|
240
|
+
* @param outputFields 期望的输出字段
|
|
241
|
+
* @param options 可选的 LLM 调用选项(如 temperature)
|
|
242
|
+
* @returns 生成结果(包含输出和可选的思考过程)
|
|
243
|
+
*/
|
|
244
|
+
generate(actionName: string, actionDescription: string | undefined, inputs: Record<string, unknown>, outputFields: Array<{
|
|
245
|
+
name: string;
|
|
246
|
+
typeHint?: string;
|
|
247
|
+
}>, options?: LLMCallOptions): Promise<ContentGenerationResult>;
|
|
248
|
+
}
|
|
249
|
+
//# sourceMappingURL=interfaces.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/llm/interfaces.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../src/llm/interfaces.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anthropic 兼容格式 LLM Provider
|
|
3
|
+
*
|
|
4
|
+
* 支持所有使用 Anthropic API 格式的服务:
|
|
5
|
+
* - Anthropic Claude
|
|
6
|
+
* - AWS Bedrock (Claude)
|
|
7
|
+
*/
|
|
8
|
+
import { LLMProvider, LLMMessage, LLMResponse, LLMStructuredResponse, StructuredOutputConfig, LLMCallOptions } from '../interfaces.js';
|
|
9
|
+
export interface AnthropicCompatibleProviderConfig {
|
|
10
|
+
/** API Key */
|
|
11
|
+
apiKey: string;
|
|
12
|
+
/** API 基础 URL,默认 https://api.anthropic.com */
|
|
13
|
+
baseUrl?: string;
|
|
14
|
+
/** 模型名称,默认 claude-sonnet-4-20250514 */
|
|
15
|
+
model?: string;
|
|
16
|
+
/** 请求超时时间(毫秒),默认 60000 */
|
|
17
|
+
defaultTimeout?: number;
|
|
18
|
+
/** Anthropic API 版本,默认 2023-06-01 */
|
|
19
|
+
apiVersion?: string;
|
|
20
|
+
/** Provider 名称,用于日志,默认 anthropic-compatible */
|
|
21
|
+
providerName?: string;
|
|
22
|
+
/** 是否启用 extended thinking 模式,默认 false */
|
|
23
|
+
enableThinking?: boolean;
|
|
24
|
+
/** thinking 模式的 token 预算,默认 10000 */
|
|
25
|
+
thinkingBudgetTokens?: number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Anthropic 兼容格式 Provider
|
|
29
|
+
*
|
|
30
|
+
* 使用 Anthropic Messages API 格式:
|
|
31
|
+
* - Endpoint: /v1/messages
|
|
32
|
+
* - 请求体: { model, messages, system, max_tokens, ... }
|
|
33
|
+
*/
|
|
34
|
+
export declare class AnthropicCompatibleProvider implements LLMProvider {
|
|
35
|
+
readonly name: string;
|
|
36
|
+
private config;
|
|
37
|
+
private endpoint;
|
|
38
|
+
constructor(config: AnthropicCompatibleProviderConfig);
|
|
39
|
+
chat(messages: LLMMessage[], options?: LLMCallOptions): Promise<LLMResponse>;
|
|
40
|
+
chatWithStructuredOutput<T>(messages: LLMMessage[], config: StructuredOutputConfig<T>, options?: LLMCallOptions): Promise<LLMStructuredResponse<T>>;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* 便捷别名:Claude Provider
|
|
44
|
+
*/
|
|
45
|
+
export declare class ClaudeProvider extends AnthropicCompatibleProvider {
|
|
46
|
+
constructor(config: Omit<AnthropicCompatibleProviderConfig, 'providerName'>);
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=anthropic-compatible.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic-compatible.d.ts","sourceRoot":"","sources":["../../../src/llm/providers/anthropic-compatible.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,WAAW,EACX,UAAU,EACV,WAAW,EACX,qBAAqB,EACrB,sBAAsB,EACtB,cAAc,EACf,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,iCAAiC;IAChD,cAAc;IACd,MAAM,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uCAAuC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0BAA0B;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qCAAqC;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+CAA+C;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yCAAyC;IACzC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,qCAAqC;IACrC,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED;;;;;;GAMG;AACH,qBAAa,2BAA4B,YAAW,WAAW;IAC7D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,OAAO,CAAC,MAAM,CAIZ;IACF,OAAO,CAAC,QAAQ,CAAS;gBAEb,MAAM,EAAE,iCAAiC;IAwB/C,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC;IA8F5E,wBAAwB,CAAC,CAAC,EAC9B,QAAQ,EAAE,UAAU,EAAE,EACtB,MAAM,EAAE,sBAAsB,CAAC,CAAC,CAAC,EACjC,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;CAwCrC;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,2BAA2B;gBACjD,MAAM,EAAE,IAAI,CAAC,iCAAiC,EAAE,cAAc,CAAC;CAM5E"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anthropic 兼容格式 LLM Provider
|
|
3
|
+
*
|
|
4
|
+
* 支持所有使用 Anthropic API 格式的服务:
|
|
5
|
+
* - Anthropic Claude
|
|
6
|
+
* - AWS Bedrock (Claude)
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Anthropic 兼容格式 Provider
|
|
10
|
+
*
|
|
11
|
+
* 使用 Anthropic Messages API 格式:
|
|
12
|
+
* - Endpoint: /v1/messages
|
|
13
|
+
* - 请求体: { model, messages, system, max_tokens, ... }
|
|
14
|
+
*/
|
|
15
|
+
export class AnthropicCompatibleProvider {
|
|
16
|
+
name;
|
|
17
|
+
config;
|
|
18
|
+
endpoint;
|
|
19
|
+
constructor(config) {
|
|
20
|
+
let baseUrl = config.baseUrl ?? 'https://api.anthropic.com';
|
|
21
|
+
// 移除尾部斜杠
|
|
22
|
+
baseUrl = baseUrl.replace(/\/$/, '');
|
|
23
|
+
this.config = {
|
|
24
|
+
apiKey: config.apiKey,
|
|
25
|
+
baseUrl,
|
|
26
|
+
model: config.model ?? 'claude-sonnet-4-20250514',
|
|
27
|
+
defaultTimeout: config.defaultTimeout ?? 60000,
|
|
28
|
+
apiVersion: config.apiVersion ?? '2023-06-01',
|
|
29
|
+
providerName: config.providerName ?? 'anthropic-compatible',
|
|
30
|
+
enableThinking: config.enableThinking ?? false,
|
|
31
|
+
thinkingBudgetTokens: config.thinkingBudgetTokens ?? 10000,
|
|
32
|
+
};
|
|
33
|
+
this.name = this.config.providerName;
|
|
34
|
+
this.endpoint = `${this.config.baseUrl}/v1/messages`;
|
|
35
|
+
if (this.config.enableThinking) {
|
|
36
|
+
console.log(`[${this.name}] Extended thinking mode enabled (budget: ${this.config.thinkingBudgetTokens} tokens)`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
async chat(messages, options) {
|
|
40
|
+
const timeout = options?.timeout ?? this.config.defaultTimeout;
|
|
41
|
+
const controller = new AbortController();
|
|
42
|
+
const timeoutId = setTimeout(() => controller.abort(), timeout);
|
|
43
|
+
try {
|
|
44
|
+
// 分离 system 消息和其他消息
|
|
45
|
+
const systemMessage = messages.find(m => m.role === 'system');
|
|
46
|
+
const nonSystemMessages = messages.filter(m => m.role !== 'system');
|
|
47
|
+
// 计算 max_tokens
|
|
48
|
+
let maxTokens = options?.maxTokens ?? 4096;
|
|
49
|
+
// 启用 extended thinking 模式时,max_tokens 必须大于 thinking.budget_tokens
|
|
50
|
+
if (this.config.enableThinking) {
|
|
51
|
+
// 确保 max_tokens > thinking.budget_tokens
|
|
52
|
+
const minMaxTokens = this.config.thinkingBudgetTokens + 4096;
|
|
53
|
+
maxTokens = Math.max(maxTokens, minMaxTokens);
|
|
54
|
+
}
|
|
55
|
+
const requestBody = {
|
|
56
|
+
model: this.config.model,
|
|
57
|
+
messages: nonSystemMessages.map(m => ({ role: m.role, content: m.content })),
|
|
58
|
+
max_tokens: maxTokens,
|
|
59
|
+
};
|
|
60
|
+
// Anthropic API 使用单独的 system 参数
|
|
61
|
+
if (systemMessage) {
|
|
62
|
+
requestBody.system = systemMessage.content;
|
|
63
|
+
}
|
|
64
|
+
// 启用 extended thinking 模式
|
|
65
|
+
if (this.config.enableThinking) {
|
|
66
|
+
requestBody.thinking = {
|
|
67
|
+
type: 'enabled',
|
|
68
|
+
budget_tokens: this.config.thinkingBudgetTokens,
|
|
69
|
+
};
|
|
70
|
+
// Extended thinking 模式下,temperature 必须为 1
|
|
71
|
+
requestBody.temperature = 1;
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
// Anthropic 不支持 temperature = 0,最小值为 0.01
|
|
75
|
+
const temperature = options?.temperature ?? 0.7;
|
|
76
|
+
requestBody.temperature = Math.max(0.01, temperature);
|
|
77
|
+
}
|
|
78
|
+
const response = await fetch(this.endpoint, {
|
|
79
|
+
method: 'POST',
|
|
80
|
+
headers: {
|
|
81
|
+
'x-api-key': this.config.apiKey,
|
|
82
|
+
'anthropic-version': this.config.apiVersion,
|
|
83
|
+
'Content-Type': 'application/json',
|
|
84
|
+
},
|
|
85
|
+
body: JSON.stringify(requestBody),
|
|
86
|
+
signal: controller.signal,
|
|
87
|
+
});
|
|
88
|
+
if (!response.ok) {
|
|
89
|
+
const error = await response.text();
|
|
90
|
+
throw new Error(`${this.name} API error: ${response.status} - ${error}`);
|
|
91
|
+
}
|
|
92
|
+
const data = await response.json();
|
|
93
|
+
// Anthropic 返回的是 content 数组
|
|
94
|
+
// 查找 text 类型的内容作为主要响应
|
|
95
|
+
const textContent = data.content.find(c => c.type === 'text');
|
|
96
|
+
// 查找 thinking 类型的内容作为思考过程(Claude extended thinking)
|
|
97
|
+
const thinkingContent = data.content.find(c => c.type === 'thinking');
|
|
98
|
+
// Debug: 检查是否有 thinking 内容
|
|
99
|
+
if (thinkingContent?.thinking) {
|
|
100
|
+
console.log(`[${this.name}] Model returned thinking content (${thinkingContent.thinking.length} chars)`);
|
|
101
|
+
}
|
|
102
|
+
return {
|
|
103
|
+
content: textContent?.text ?? '',
|
|
104
|
+
reasoningContent: thinkingContent?.thinking,
|
|
105
|
+
usage: data.usage ? {
|
|
106
|
+
promptTokens: data.usage.input_tokens,
|
|
107
|
+
completionTokens: data.usage.output_tokens,
|
|
108
|
+
totalTokens: (data.usage.input_tokens ?? 0) + (data.usage.output_tokens ?? 0),
|
|
109
|
+
} : undefined,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
finally {
|
|
113
|
+
clearTimeout(timeoutId);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
async chatWithStructuredOutput(messages, config, options) {
|
|
117
|
+
// 增强最后一条消息,添加 JSON 格式要求
|
|
118
|
+
const enhancedMessages = [
|
|
119
|
+
...messages.slice(0, -1),
|
|
120
|
+
{
|
|
121
|
+
role: messages[messages.length - 1].role,
|
|
122
|
+
content: `${messages[messages.length - 1].content}
|
|
123
|
+
|
|
124
|
+
请严格按照以下 JSON 格式返回结果,不要包含任何其他内容:
|
|
125
|
+
${config.schema}`,
|
|
126
|
+
},
|
|
127
|
+
];
|
|
128
|
+
const response = await this.chat(enhancedMessages, options);
|
|
129
|
+
const content = response.content;
|
|
130
|
+
// 提取 JSON 内容
|
|
131
|
+
const jsonMatch = content.match(/```json\n?([\s\S]*?)\n?```/) ||
|
|
132
|
+
content.match(/\{[\s\S]*\}/);
|
|
133
|
+
if (!jsonMatch) {
|
|
134
|
+
throw new Error(`Failed to parse structured output: ${content}`);
|
|
135
|
+
}
|
|
136
|
+
const jsonStr = jsonMatch[1] || jsonMatch[0];
|
|
137
|
+
let data;
|
|
138
|
+
if (config.parser) {
|
|
139
|
+
data = config.parser(jsonStr);
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
data = JSON.parse(jsonStr);
|
|
143
|
+
}
|
|
144
|
+
return {
|
|
145
|
+
data,
|
|
146
|
+
rawContent: content,
|
|
147
|
+
reasoningContent: response.reasoningContent,
|
|
148
|
+
usage: response.usage,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* 便捷别名:Claude Provider
|
|
154
|
+
*/
|
|
155
|
+
export class ClaudeProvider extends AnthropicCompatibleProvider {
|
|
156
|
+
constructor(config) {
|
|
157
|
+
super({
|
|
158
|
+
...config,
|
|
159
|
+
providerName: 'claude',
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=anthropic-compatible.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic-compatible.js","sourceRoot":"","sources":["../../../src/llm/providers/anthropic-compatible.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM Providers 导出
|
|
3
|
+
*
|
|
4
|
+
* 提供两种通用格式的 Provider:
|
|
5
|
+
* - OpenAI 兼容格式:适用于大多数 LLM 服务
|
|
6
|
+
* - Anthropic 兼容格式:适用于 Claude 及兼容服务
|
|
7
|
+
*/
|
|
8
|
+
export { OpenAICompatibleProvider, DeepSeekProvider, OpenAIProvider, } from './openai-compatible.js';
|
|
9
|
+
export type { OpenAICompatibleProviderConfig } from './openai-compatible.js';
|
|
10
|
+
export { AnthropicCompatibleProvider, ClaudeProvider, } from './anthropic-compatible.js';
|
|
11
|
+
export type { AnthropicCompatibleProviderConfig } from './anthropic-compatible.js';
|
|
12
|
+
export type { OpenAICompatibleProviderConfig as DeepSeekProviderConfig } from './openai-compatible.js';
|
|
13
|
+
export type { AnthropicCompatibleProviderConfig as ClaudeProviderConfig } from './anthropic-compatible.js';
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/llm/providers/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EACL,wBAAwB,EACxB,gBAAgB,EAChB,cAAc,GACf,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,8BAA8B,EAAE,MAAM,wBAAwB,CAAC;AAG7E,OAAO,EACL,2BAA2B,EAC3B,cAAc,GACf,MAAM,2BAA2B,CAAC;AACnC,YAAY,EAAE,iCAAiC,EAAE,MAAM,2BAA2B,CAAC;AAGnF,YAAY,EAAE,8BAA8B,IAAI,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACvG,YAAY,EAAE,iCAAiC,IAAI,oBAAoB,EAAE,MAAM,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM Providers 导出
|
|
3
|
+
*
|
|
4
|
+
* 提供两种通用格式的 Provider:
|
|
5
|
+
* - OpenAI 兼容格式:适用于大多数 LLM 服务
|
|
6
|
+
* - Anthropic 兼容格式:适用于 Claude 及兼容服务
|
|
7
|
+
*/
|
|
8
|
+
// OpenAI 兼容格式(主要)
|
|
9
|
+
export { OpenAICompatibleProvider, DeepSeekProvider, OpenAIProvider, } from './openai-compatible.js';
|
|
10
|
+
// Anthropic 兼容格式
|
|
11
|
+
export { AnthropicCompatibleProvider, ClaudeProvider, } from './anthropic-compatible.js';
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/llm/providers/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,kBAAkB;AAClB,OAAO,EACL,wBAAwB,EACxB,gBAAgB,EAChB,cAAc,GACf,MAAM,wBAAwB,CAAC;AAGhC,iBAAiB;AACjB,OAAO,EACL,2BAA2B,EAC3B,cAAc,GACf,MAAM,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI 兼容格式 LLM Provider
|
|
3
|
+
*
|
|
4
|
+
* 支持所有使用 OpenAI API 格式的服务:
|
|
5
|
+
* - OpenAI
|
|
6
|
+
* - DeepSeek
|
|
7
|
+
* - Groq
|
|
8
|
+
* - Together AI
|
|
9
|
+
* - Fireworks AI
|
|
10
|
+
* - OpenRouter
|
|
11
|
+
* - LiteLLM 代理
|
|
12
|
+
* - 大多数国产大模型 API
|
|
13
|
+
*/
|
|
14
|
+
import { LLMProvider, LLMMessage, LLMResponse, LLMStructuredResponse, StructuredOutputConfig, LLMCallOptions } from '../interfaces.js';
|
|
15
|
+
export interface OpenAICompatibleProviderConfig {
|
|
16
|
+
/** API Key */
|
|
17
|
+
apiKey: string;
|
|
18
|
+
/** API 基础 URL,默认 https://api.openai.com/v1 */
|
|
19
|
+
baseUrl?: string;
|
|
20
|
+
/** 模型名称,默认 gpt-4 */
|
|
21
|
+
model?: string;
|
|
22
|
+
/** 请求超时时间(毫秒),默认 60000 */
|
|
23
|
+
defaultTimeout?: number;
|
|
24
|
+
/** Provider 名称,用于日志,默认 openai-compatible */
|
|
25
|
+
providerName?: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* OpenAI 兼容格式 Provider
|
|
29
|
+
*
|
|
30
|
+
* 使用 OpenAI Chat Completions API 格式:
|
|
31
|
+
* - Endpoint: /chat/completions
|
|
32
|
+
* - 请求体: { model, messages, temperature, max_tokens, ... }
|
|
33
|
+
*/
|
|
34
|
+
export declare class OpenAICompatibleProvider implements LLMProvider {
|
|
35
|
+
readonly name: string;
|
|
36
|
+
private config;
|
|
37
|
+
private endpoint;
|
|
38
|
+
constructor(config: OpenAICompatibleProviderConfig);
|
|
39
|
+
chat(messages: LLMMessage[], options?: LLMCallOptions): Promise<LLMResponse>;
|
|
40
|
+
chatWithStructuredOutput<T>(messages: LLMMessage[], config: StructuredOutputConfig<T>, options?: LLMCallOptions): Promise<LLMStructuredResponse<T>>;
|
|
41
|
+
/**
|
|
42
|
+
* 尝试修复 LLM 生成的格式错误的 JSON
|
|
43
|
+
* 主要处理字符串值中未转义的特殊字符
|
|
44
|
+
*/
|
|
45
|
+
private repairJson;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* 便捷别名:DeepSeek Provider
|
|
49
|
+
*/
|
|
50
|
+
export declare class DeepSeekProvider extends OpenAICompatibleProvider {
|
|
51
|
+
constructor(config: Omit<OpenAICompatibleProviderConfig, 'providerName'>);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* 便捷别名:OpenAI Provider
|
|
55
|
+
*/
|
|
56
|
+
export declare class OpenAIProvider extends OpenAICompatibleProvider {
|
|
57
|
+
constructor(config: Omit<OpenAICompatibleProviderConfig, 'providerName'>);
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=openai-compatible.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-compatible.d.ts","sourceRoot":"","sources":["../../../src/llm/providers/openai-compatible.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EACL,WAAW,EACX,UAAU,EACV,WAAW,EACX,qBAAqB,EACrB,sBAAsB,EACtB,cAAc,EACf,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,8BAA8B;IAC7C,cAAc;IACd,MAAM,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oBAAoB;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0BAA0B;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,4CAA4C;IAC5C,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;GAMG;AACH,qBAAa,wBAAyB,YAAW,WAAW;IAC1D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,OAAO,CAAC,MAAM,CAA4F;IAC1G,OAAO,CAAC,QAAQ,CAAS;gBAEb,MAAM,EAAE,8BAA8B;IAqB5C,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC;IAgE5E,wBAAwB,CAAC,CAAC,EAC9B,QAAQ,EAAE,UAAU,EAAE,EACtB,MAAM,EAAE,sBAAsB,CAAC,CAAC,CAAC,EACjC,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAgDpC;;;OAGG;IACH,OAAO,CAAC,UAAU;CA+CnB;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,wBAAwB;gBAChD,MAAM,EAAE,IAAI,CAAC,8BAA8B,EAAE,cAAc,CAAC;CAQzE;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,wBAAwB;gBAC9C,MAAM,EAAE,IAAI,CAAC,8BAA8B,EAAE,cAAc,CAAC;CAQzE"}
|