@oflow-ai/core 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/LICENSE +21 -0
- package/README.md +81 -0
- package/dist/agents/index.d.ts +35 -0
- package/dist/agents/index.js +233 -0
- package/dist/ai/chinese-provider.d.ts +146 -0
- package/dist/ai/chinese-provider.js +193 -0
- package/dist/ai/custom-provider.d.ts +11 -0
- package/dist/ai/custom-provider.js +113 -0
- package/dist/ai/index.d.ts +7 -0
- package/dist/ai/index.js +42 -0
- package/dist/ai/openai-provider.d.ts +18 -0
- package/dist/ai/openai-provider.js +161 -0
- package/dist/config/index.d.ts +20 -0
- package/dist/config/index.js +83 -0
- package/dist/conversation.d.ts +26 -0
- package/dist/conversation.js +126 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +72 -0
- package/dist/mcp/index.d.ts +48 -0
- package/dist/mcp/index.js +175 -0
- package/dist/sandbox/index.d.ts +31 -0
- package/dist/sandbox/index.js +197 -0
- package/dist/skills/index.d.ts +16 -0
- package/dist/skills/index.js +169 -0
- package/dist/tools/ask-user-question.d.ts +62 -0
- package/dist/tools/ask-user-question.js +71 -0
- package/dist/tools/base.d.ts +16 -0
- package/dist/tools/base.js +39 -0
- package/dist/tools/glob.d.ts +27 -0
- package/dist/tools/glob.js +125 -0
- package/dist/tools/image-read.d.ts +42 -0
- package/dist/tools/image-read.js +125 -0
- package/dist/tools/index.d.ts +27 -0
- package/dist/tools/index.js +127 -0
- package/dist/tools/list-directory.d.ts +28 -0
- package/dist/tools/list-directory.js +94 -0
- package/dist/tools/pdf-extract.d.ts +32 -0
- package/dist/tools/pdf-extract.js +130 -0
- package/dist/tools/read-file.d.ts +31 -0
- package/dist/tools/read-file.js +116 -0
- package/dist/tools/replace.d.ts +35 -0
- package/dist/tools/replace.js +93 -0
- package/dist/tools/run-shell-command.d.ts +35 -0
- package/dist/tools/run-shell-command.js +81 -0
- package/dist/tools/save-memory.d.ts +22 -0
- package/dist/tools/save-memory.js +91 -0
- package/dist/tools/search-file-content.d.ts +42 -0
- package/dist/tools/search-file-content.js +153 -0
- package/dist/tools/task.d.ts +46 -0
- package/dist/tools/task.js +54 -0
- package/dist/tools/web-fetch.d.ts +26 -0
- package/dist/tools/web-fetch.js +81 -0
- package/dist/tools/web-search.d.ts +35 -0
- package/dist/tools/web-search.js +86 -0
- package/dist/tools/write-file.d.ts +25 -0
- package/dist/tools/write-file.js +76 -0
- package/dist/types/index.d.ts +166 -0
- package/dist/types/index.js +43 -0
- package/package.json +54 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 oFlow Team
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# @oflow-ai/core
|
|
2
|
+
|
|
3
|
+
Core library for oFlow CLI. Provides AI providers, tools, and utilities.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @oflow-ai/core
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Features
|
|
12
|
+
|
|
13
|
+
- **Multi-provider AI support**: OpenAI, DeepSeek, Qwen, GLM, Baichuan, Yi, Moonshot, SiliconFlow
|
|
14
|
+
- **Tool system**: File operations, shell commands, web search, and more
|
|
15
|
+
- **Conversation management**: Message history and context handling
|
|
16
|
+
- **MCP integration**: Model Context Protocol server support
|
|
17
|
+
- **Skill system**: Extensible skill packages
|
|
18
|
+
- **Sub-agents**: Specialized agents for different tasks
|
|
19
|
+
- **Sandbox execution**: Docker/Podman isolation
|
|
20
|
+
|
|
21
|
+
## Usage
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
import { createAIProvider, Conversation, getConfigManager } from '@oflow-ai/core';
|
|
25
|
+
|
|
26
|
+
// Configure authentication
|
|
27
|
+
const configManager = getConfigManager();
|
|
28
|
+
configManager.setAuth({
|
|
29
|
+
provider: 'deepseek',
|
|
30
|
+
apiKey: 'your-api-key',
|
|
31
|
+
model: 'deepseek-chat'
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
// Create AI provider
|
|
35
|
+
const provider = createAIProvider(configManager.getAuth()!);
|
|
36
|
+
|
|
37
|
+
// Start conversation
|
|
38
|
+
const conversation = new Conversation({
|
|
39
|
+
provider,
|
|
40
|
+
workingDirectory: process.cwd(),
|
|
41
|
+
onContent: (content) => console.log(content)
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
await conversation.sendMessage('Hello!');
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Supported Providers
|
|
48
|
+
|
|
49
|
+
| Provider | Auth Type | Models |
|
|
50
|
+
|----------|-----------|--------|
|
|
51
|
+
| openai | API Key | gpt-4o, gpt-4-turbo, o1-preview, etc. |
|
|
52
|
+
| deepseek | API Key | deepseek-chat, deepseek-reasoner |
|
|
53
|
+
| qwen | API Key | qwen-turbo, qwen-plus, qwen-max |
|
|
54
|
+
| zhipu | API Key | glm-4, glm-4-plus, glm-4-flash |
|
|
55
|
+
| baichuan | API Key | Baichuan4, Baichuan3-Turbo |
|
|
56
|
+
| yi | API Key | yi-lightning, yi-large |
|
|
57
|
+
| moonshot | API Key | moonshot-v1-8k, moonshot-v1-32k |
|
|
58
|
+
| siliconflow | API Key | Multiple open-source models |
|
|
59
|
+
| custom | API Key + Base URL | Any OpenAI-compatible API |
|
|
60
|
+
|
|
61
|
+
## Tools
|
|
62
|
+
|
|
63
|
+
Available tools:
|
|
64
|
+
- `read_file` - Read file contents
|
|
65
|
+
- `write_file` - Write to files
|
|
66
|
+
- `list_directory` - List directory contents
|
|
67
|
+
- `glob` - Find files by pattern
|
|
68
|
+
- `search_file_content` - Search within files
|
|
69
|
+
- `run_shell_command` - Execute shell commands
|
|
70
|
+
- `web_search` - Search the web
|
|
71
|
+
- `web_fetch` - Fetch web content
|
|
72
|
+
- `replace` - Replace text in files
|
|
73
|
+
- `image_read` - Analyze images
|
|
74
|
+
- `pdf_extract` - Extract PDF content
|
|
75
|
+
- `ask_user_question` - Interactive user prompts
|
|
76
|
+
- `task` - Launch sub-agents
|
|
77
|
+
- `save_memory` - Store long-term memories
|
|
78
|
+
|
|
79
|
+
## License
|
|
80
|
+
|
|
81
|
+
MIT
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { AIProvider } from '../types';
|
|
2
|
+
export type AgentType = 'general-purpose' | 'plan-agent' | 'explore-agent' | 'code-reviewer' | 'frontend-tester';
|
|
3
|
+
export interface AgentDefinition {
|
|
4
|
+
type: AgentType;
|
|
5
|
+
name: string;
|
|
6
|
+
description: string;
|
|
7
|
+
systemPrompt: string;
|
|
8
|
+
allowedTools: string[] | '*';
|
|
9
|
+
maxTokens?: number;
|
|
10
|
+
temperature?: number;
|
|
11
|
+
}
|
|
12
|
+
export declare const AGENT_DEFINITIONS: Record<AgentType, AgentDefinition>;
|
|
13
|
+
export interface AgentResult {
|
|
14
|
+
success: boolean;
|
|
15
|
+
output: string;
|
|
16
|
+
filesModified?: string[];
|
|
17
|
+
errors?: string[];
|
|
18
|
+
}
|
|
19
|
+
export declare class Agent {
|
|
20
|
+
private definition;
|
|
21
|
+
private provider;
|
|
22
|
+
private toolRegistry;
|
|
23
|
+
private messages;
|
|
24
|
+
private workingDirectory;
|
|
25
|
+
constructor(definition: AgentDefinition, provider: AIProvider, workingDirectory: string);
|
|
26
|
+
execute(task: string, onProgress?: (update: string) => void): Promise<AgentResult>;
|
|
27
|
+
private getAllowedTools;
|
|
28
|
+
}
|
|
29
|
+
export declare class AgentFactory {
|
|
30
|
+
private provider;
|
|
31
|
+
private workingDirectory;
|
|
32
|
+
constructor(provider: AIProvider, workingDirectory: string);
|
|
33
|
+
createAgent(type: AgentType): Agent;
|
|
34
|
+
getAvailableAgents(): AgentDefinition[];
|
|
35
|
+
}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AgentFactory = exports.Agent = exports.AGENT_DEFINITIONS = void 0;
|
|
4
|
+
const tools_1 = require("../tools");
|
|
5
|
+
// 预定义的代理
|
|
6
|
+
exports.AGENT_DEFINITIONS = {
|
|
7
|
+
'general-purpose': {
|
|
8
|
+
type: 'general-purpose',
|
|
9
|
+
name: 'General Purpose Agent',
|
|
10
|
+
description: 'For complex research, code searching, and multi-step tasks',
|
|
11
|
+
systemPrompt: `You are a general-purpose AI agent that can handle complex, multi-step tasks autonomously.
|
|
12
|
+
You have access to tools for file operations, shell commands, and web searches.
|
|
13
|
+
Break down complex tasks into smaller steps and execute them systematically.
|
|
14
|
+
Always verify your work and report results clearly.`,
|
|
15
|
+
allowedTools: '*',
|
|
16
|
+
maxTokens: 8192,
|
|
17
|
+
temperature: 0.7
|
|
18
|
+
},
|
|
19
|
+
'plan-agent': {
|
|
20
|
+
type: 'plan-agent',
|
|
21
|
+
name: 'Planning Agent',
|
|
22
|
+
description: 'For planning, analysis, and outlining implementation steps',
|
|
23
|
+
systemPrompt: `You are a planning agent specialized in analyzing tasks and creating detailed implementation plans.
|
|
24
|
+
Your role is to:
|
|
25
|
+
1. Understand the user's requirements
|
|
26
|
+
2. Analyze the existing codebase
|
|
27
|
+
3. Create a structured implementation plan
|
|
28
|
+
4. Identify potential issues and edge cases
|
|
29
|
+
5. Suggest best practices
|
|
30
|
+
|
|
31
|
+
Do NOT make code changes. Focus on analysis and planning.`,
|
|
32
|
+
allowedTools: ['read_file', 'list_directory', 'glob', 'search_file_content'],
|
|
33
|
+
maxTokens: 4096,
|
|
34
|
+
temperature: 0.5
|
|
35
|
+
},
|
|
36
|
+
'explore-agent': {
|
|
37
|
+
type: 'explore-agent',
|
|
38
|
+
name: 'Exploration Agent',
|
|
39
|
+
description: 'For exploring and understanding codebases without making changes',
|
|
40
|
+
systemPrompt: `You are an exploration agent specialized in understanding and analyzing codebases.
|
|
41
|
+
Your role is to:
|
|
42
|
+
1. Explore the project structure
|
|
43
|
+
2. Identify key files and patterns
|
|
44
|
+
3. Understand the architecture
|
|
45
|
+
4. Answer questions about the codebase
|
|
46
|
+
|
|
47
|
+
Do NOT make any changes to files. Only read and analyze.`,
|
|
48
|
+
allowedTools: ['read_file', 'list_directory', 'glob', 'search_file_content'],
|
|
49
|
+
maxTokens: 4096,
|
|
50
|
+
temperature: 0.5
|
|
51
|
+
},
|
|
52
|
+
'code-reviewer': {
|
|
53
|
+
type: 'code-reviewer',
|
|
54
|
+
name: 'Code Review Agent',
|
|
55
|
+
description: 'For reviewing code changes and providing feedback',
|
|
56
|
+
systemPrompt: `You are a code review agent specialized in reviewing code changes.
|
|
57
|
+
Your role is to:
|
|
58
|
+
1. Review code for bugs and issues
|
|
59
|
+
2. Check for security vulnerabilities
|
|
60
|
+
3. Suggest improvements
|
|
61
|
+
4. Ensure code follows best practices
|
|
62
|
+
5. Check for performance issues
|
|
63
|
+
|
|
64
|
+
Provide constructive feedback with specific suggestions.`,
|
|
65
|
+
allowedTools: ['read_file', 'list_directory', 'glob', 'search_file_content'],
|
|
66
|
+
maxTokens: 4096,
|
|
67
|
+
temperature: 0.3
|
|
68
|
+
},
|
|
69
|
+
'frontend-tester': {
|
|
70
|
+
type: 'frontend-tester',
|
|
71
|
+
name: 'Frontend Tester Agent',
|
|
72
|
+
description: 'For testing frontend UI and components',
|
|
73
|
+
systemPrompt: `You are a frontend testing agent specialized in testing web UIs.
|
|
74
|
+
Your role is to:
|
|
75
|
+
1. Test UI components for correctness
|
|
76
|
+
2. Check responsive design
|
|
77
|
+
3. Verify accessibility
|
|
78
|
+
4. Test user interactions
|
|
79
|
+
5. Report visual issues
|
|
80
|
+
|
|
81
|
+
Focus on user-facing functionality and visual correctness.`,
|
|
82
|
+
allowedTools: ['read_file', 'write_file', 'run_shell_command', 'glob'],
|
|
83
|
+
maxTokens: 4096,
|
|
84
|
+
temperature: 0.3
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
// Agent类
|
|
88
|
+
class Agent {
|
|
89
|
+
definition;
|
|
90
|
+
provider;
|
|
91
|
+
toolRegistry;
|
|
92
|
+
messages = [];
|
|
93
|
+
workingDirectory;
|
|
94
|
+
constructor(definition, provider, workingDirectory) {
|
|
95
|
+
this.definition = definition;
|
|
96
|
+
this.provider = provider;
|
|
97
|
+
this.toolRegistry = (0, tools_1.getToolRegistry)();
|
|
98
|
+
this.workingDirectory = workingDirectory;
|
|
99
|
+
// 初始化系统提示
|
|
100
|
+
this.messages.push({
|
|
101
|
+
role: 'system',
|
|
102
|
+
content: definition.systemPrompt
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
async execute(task, onProgress) {
|
|
106
|
+
this.messages.push({ role: 'user', content: task });
|
|
107
|
+
let iterations = 0;
|
|
108
|
+
const maxIterations = 30;
|
|
109
|
+
let finalOutput = '';
|
|
110
|
+
const filesModified = [];
|
|
111
|
+
const errors = [];
|
|
112
|
+
while (iterations < maxIterations) {
|
|
113
|
+
iterations++;
|
|
114
|
+
// 获取允许的工具
|
|
115
|
+
const tools = this.getAllowedTools();
|
|
116
|
+
const chatOptions = {
|
|
117
|
+
messages: this.messages,
|
|
118
|
+
tools: tools.length > 0 ? tools : undefined,
|
|
119
|
+
toolChoice: tools.length > 0 ? 'auto' : undefined,
|
|
120
|
+
maxTokens: this.definition.maxTokens || 4096,
|
|
121
|
+
temperature: this.definition.temperature || 0.7,
|
|
122
|
+
stream: true
|
|
123
|
+
};
|
|
124
|
+
let currentContent = '';
|
|
125
|
+
let toolCalls = [];
|
|
126
|
+
try {
|
|
127
|
+
await this.provider.chatStream(chatOptions, (chunk) => {
|
|
128
|
+
if (chunk.delta.content) {
|
|
129
|
+
currentContent += chunk.delta.content;
|
|
130
|
+
onProgress?.(chunk.delta.content);
|
|
131
|
+
}
|
|
132
|
+
if (chunk.delta.toolCalls) {
|
|
133
|
+
for (const tc of chunk.delta.toolCalls) {
|
|
134
|
+
if (tc.id && tc.function?.name) {
|
|
135
|
+
toolCalls.push({
|
|
136
|
+
id: tc.id,
|
|
137
|
+
type: 'function',
|
|
138
|
+
function: {
|
|
139
|
+
name: tc.function.name,
|
|
140
|
+
arguments: tc.function.arguments || ''
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
const existing = toolCalls.find(t => t.id === tc.id);
|
|
146
|
+
if (existing && tc.function?.arguments) {
|
|
147
|
+
existing.function.arguments += tc.function.arguments;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
// 添加助手消息
|
|
154
|
+
this.messages.push({
|
|
155
|
+
role: 'assistant',
|
|
156
|
+
content: currentContent || '',
|
|
157
|
+
toolCalls: toolCalls.length > 0 ? toolCalls : undefined
|
|
158
|
+
});
|
|
159
|
+
// 处理工具调用
|
|
160
|
+
if (toolCalls.length > 0) {
|
|
161
|
+
for (const toolCall of toolCalls) {
|
|
162
|
+
onProgress?.(`\n🔧 Using tool: ${toolCall.function.name}\n`);
|
|
163
|
+
const toolOptions = {
|
|
164
|
+
workingDirectory: this.workingDirectory
|
|
165
|
+
};
|
|
166
|
+
const result = await this.toolRegistry.execute(toolCall, toolOptions);
|
|
167
|
+
if (result.isError) {
|
|
168
|
+
errors.push(`${toolCall.function.name}: ${result.content}`);
|
|
169
|
+
}
|
|
170
|
+
// 跟踪修改的文件
|
|
171
|
+
if (['write_file', 'replace'].includes(toolCall.function.name)) {
|
|
172
|
+
try {
|
|
173
|
+
const params = JSON.parse(toolCall.function.arguments);
|
|
174
|
+
if (params.file_path) {
|
|
175
|
+
filesModified.push(params.file_path);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
catch { }
|
|
179
|
+
}
|
|
180
|
+
this.messages.push({
|
|
181
|
+
role: 'tool',
|
|
182
|
+
toolCallId: toolCall.id,
|
|
183
|
+
content: result.content
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
// 没有工具调用,完成
|
|
189
|
+
finalOutput = currentContent;
|
|
190
|
+
break;
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
errors.push(error instanceof Error ? error.message : String(error));
|
|
194
|
+
break;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return {
|
|
198
|
+
success: errors.length === 0,
|
|
199
|
+
output: finalOutput,
|
|
200
|
+
filesModified: filesModified.length > 0 ? filesModified : undefined,
|
|
201
|
+
errors: errors.length > 0 ? errors : undefined
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
getAllowedTools() {
|
|
205
|
+
const allTools = this.toolRegistry.getDefinitions();
|
|
206
|
+
if (this.definition.allowedTools === '*') {
|
|
207
|
+
return allTools;
|
|
208
|
+
}
|
|
209
|
+
return allTools.filter(tool => this.definition.allowedTools.includes(tool.function.name));
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
exports.Agent = Agent;
|
|
213
|
+
// Agent工厂
|
|
214
|
+
class AgentFactory {
|
|
215
|
+
provider;
|
|
216
|
+
workingDirectory;
|
|
217
|
+
constructor(provider, workingDirectory) {
|
|
218
|
+
this.provider = provider;
|
|
219
|
+
this.workingDirectory = workingDirectory;
|
|
220
|
+
}
|
|
221
|
+
createAgent(type) {
|
|
222
|
+
const definition = exports.AGENT_DEFINITIONS[type];
|
|
223
|
+
if (!definition) {
|
|
224
|
+
throw new Error(`Unknown agent type: ${type}`);
|
|
225
|
+
}
|
|
226
|
+
return new Agent(definition, this.provider, this.workingDirectory);
|
|
227
|
+
}
|
|
228
|
+
getAvailableAgents() {
|
|
229
|
+
return Object.values(exports.AGENT_DEFINITIONS);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
exports.AgentFactory = AgentFactory;
|
|
233
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWdlbnRzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLG9DQUE2RTtBQWU3RSxTQUFTO0FBQ0ksUUFBQSxpQkFBaUIsR0FBdUM7SUFDbkUsaUJBQWlCLEVBQUU7UUFDakIsSUFBSSxFQUFFLGlCQUFpQjtRQUN2QixJQUFJLEVBQUUsdUJBQXVCO1FBQzdCLFdBQVcsRUFBRSw0REFBNEQ7UUFDekUsWUFBWSxFQUFFOzs7b0RBR2tDO1FBQ2hELFlBQVksRUFBRSxHQUFHO1FBQ2pCLFNBQVMsRUFBRSxJQUFJO1FBQ2YsV0FBVyxFQUFFLEdBQUc7S0FDakI7SUFDRCxZQUFZLEVBQUU7UUFDWixJQUFJLEVBQUUsWUFBWTtRQUNsQixJQUFJLEVBQUUsZ0JBQWdCO1FBQ3RCLFdBQVcsRUFBRSw0REFBNEQ7UUFDekUsWUFBWSxFQUFFOzs7Ozs7OzswREFRd0M7UUFDdEQsWUFBWSxFQUFFLENBQUMsV0FBVyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxxQkFBcUIsQ0FBQztRQUM1RSxTQUFTLEVBQUUsSUFBSTtRQUNmLFdBQVcsRUFBRSxHQUFHO0tBQ2pCO0lBQ0QsZUFBZSxFQUFFO1FBQ2YsSUFBSSxFQUFFLGVBQWU7UUFDckIsSUFBSSxFQUFFLG1CQUFtQjtRQUN6QixXQUFXLEVBQUUsa0VBQWtFO1FBQy9FLFlBQVksRUFBRTs7Ozs7Ozt5REFPdUM7UUFDckQsWUFBWSxFQUFFLENBQUMsV0FBVyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxxQkFBcUIsQ0FBQztRQUM1RSxTQUFTLEVBQUUsSUFBSTtRQUNmLFdBQVcsRUFBRSxHQUFHO0tBQ2pCO0lBQ0QsZUFBZSxFQUFFO1FBQ2YsSUFBSSxFQUFFLGVBQWU7UUFDckIsSUFBSSxFQUFFLG1CQUFtQjtRQUN6QixXQUFXLEVBQUUsbURBQW1EO1FBQ2hFLFlBQVksRUFBRTs7Ozs7Ozs7eURBUXVDO1FBQ3JE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QztJQUNKLENBQUM7Q0FDRjtBQXJKRCxzQkFxSkM7QUFFRCxVQUFVO0FBQ1YsTUFBYSxZQUFZO0lBQ2YsUUFBUSxDQUFhO0lBQ3JCLGdCQUFnQixDQUFTO0lBRWpDLFlBQVksUUFBb0IsRUFBRSxnQkFBd0I7UUFDeEQsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO0lBQzNDLENBQUM7SUFFRCxXQUFXLENBQUMsSUFBZTtRQUN6QixNQUFNLFVBQVUsR0FBRyx5QkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNqRCxDQUFDO1FBQ0QsT0FBTyxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQsa0JBQWtCO1FBQ2hCLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyx5QkFBaUIsQ0FBQyxDQUFDO0lBQzFDLENBQUM7Q0FDRjtBQXBCRCxvQ0FvQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBSVByb3ZpZGVyLCBDaGF0Q29tcGxldGlvbk9wdGlvbnMsIE1lc3NhZ2UsIFRvb2xEZWZpbml0aW9uLCBUb29sQ2FsbCwgU3RyZWFtQ2h1bmsgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBUb29sUmVnaXN0cnksIGdldFRvb2xSZWdpc3RyeSwgVG9vbEV4ZWN1dGVPcHRpb25zIH0gZnJvbSAnLi4vdG9vbHMnO1xuXG4vLyBBZ2VudOexu+Wei+WumuS5iVxuZXhwb3J0IHR5cGUgQWdlbnRUeXBlID0gJ2dlbmVyYWwtcHVycG9zZScgfCAncGxhbi1hZ2VudCcgfCAnZXhwbG9yZS1hZ2VudCcgfCAnY29kZS1yZXZpZXdlcicgfCAnZnJvbnRlbmQtdGVzdGVyJztcblxuZXhwb3J0IGludGVyZmFjZSBBZ2VudERlZmluaXRpb24ge1xuICB0eXBlOiBBZ2VudFR5cGU7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgc3lzdGVtUHJvbXB0OiBzdHJpbmc7XG4gIGFsbG93ZWRUb29sczogc3RyaW5nW10gfCAnKic7XG4gIG1heFRva2Vucz86IG51bWJlcjtcbiAgdGVtcGVyYXR1cmU/OiBudW1iZXI7XG59XG5cbi8vIOmihOWumuS5ieeahOS7o+eQhlxuZXhwb3J0IGNvbnN0IEFHRU5UX0RFRklOSVRJT05TOiBSZWNvcmQ8QWdlbnRUeXBlLCBBZ2VudERlZmluaXRpb24+ID0ge1xuICAnZ2VuZXJhbC1wdXJwb3NlJzoge1xuICAgIHR5cGU6ICdnZW5lcmFsLXB1cnBvc2UnLFxuICAgIG5hbWU6ICdHZW5lcmFsIFB1cnBvc2UgQWdlbnQnLFxuICAgIGRlc2NyaXB0aW9uOiAnRm9yIGNvbXBsZXggcmVzZWFyY2gsIGNvZGUgc2VhcmNoaW5nLCBhbmQgbXVsdGktc3RlcCB0YXNrcycsXG4gICAgc3lzdGVtUHJvbXB0OiBgWW91IGFyZSBhIGdlbmVyYWwtcHVycG9zZSBBSSBhZ2VudCB0aGF0IGNhbiBoYW5kbGUgY29tcGxleCwgbXVsdGktc3RlcCB0YXNrcyBhdXRvbm9tb3VzbHkuXG5Zb3UgaGF2ZSBhY2Nlc3MgdG8gdG9vbHMgZm9yIGZpbGUgb3BlcmF0aW9ucywgc2hlbGwgY29tbWFuZHMsIGFuZCB3ZWIgc2VhcmNoZXMuXG5CcmVhayBkb3duIGNvbXBsZXggdGFza3MgaW50byBzbWFsbGVyIHN0ZXBzIGFuZCBleGVjdXRlIHRoZW0gc3lzdGVtYXRpY2FsbHkuXG5BbHdheXMgdmVyaWZ5IHlvdXIgd29yayBhbmQgcmVwb3J0IHJlc3VsdHMgY2xlYXJseS5gLFxuICAgIGFsbG93ZWRUb29sczogJyonLFxuICAgIG1heFRva2VuczogODE5MixcbiAgICB0ZW1wZXJhdHVyZTogMC43XG4gIH0sXG4gICdwbGFuLWFnZW50Jzoge1xuICAgIHR5cGU6ICdwbGFuLWFnZW50JyxcbiAgICBuYW1lOiAnUGxhbm5pbmcgQWdlbnQnLFxuICAgIGRlc2NyaXB0aW9uOiAnRm9yIHBsYW5uaW5nLCBhbmFseXNpcywgYW5kIG91dGxpbmluZyBpbXBsZW1lbnRhdGlvbiBzdGVwcycsXG4gICAgc3lzdGVtUHJvbXB0OiBgWW91IGFyZSBhIHBsYW5uaW5nIGFnZW50IHNwZWNpYWxpemVkIGluIGFuYWx5emluZyB0YXNrcyBhbmQgY3JlYXRpbmcgZGV0YWlsZWQgaW1wbGVtZW50YXRpb24gcGxhbnMuXG5Zb3VyIHJvbGUgaXMgdG86XG4xLiBVbmRlcnN0YW5kIHRoZSB1c2VyJ3MgcmVxdWlyZW1lbnRzXG4yLiBBbmFseXplIHRoZSBleGlzdGluZyBjb2RlYmFzZVxuMy4gQ3JlYXRlIGEgc3RydWN0dXJlZCBpbXBsZW1lbnRhdGlvbiBwbGFuXG40LiBJZGVudGlmeSBwb3RlbnRpYWwgaXNzdWVzIGFuZCBlZGdlIGNhc2VzXG41LiBTdWdnZXN0IGJlc3QgcHJhY3RpY2VzXG5cbkRvIE5PVCBtYWtlIGNvZGUgY2hhbmdlcy4gRm9jdXMgb24gYW5hbHlzaXMgYW5kIHBsYW5uaW5nLmAsXG4gICAgYWxsb3dlZFRvb2xzOiBbJ3JlYWRfZmlsZScsICdsaXN0X2RpcmVjdG9yeScsICdnbG9iJywgJ3NlYXJjaF9maWxlX2NvbnRlbnQnXSxcbiAgICBtYXhUb2tlbnM6IDQwOTYsXG4gICAgdGVtcGVyYXR1cmU6IDAuNVxuICB9LFxuICAnZXhwbG9yZS1hZ2VudCc6IHtcbiAgICB0eXBlOiAnZXhwbG9yZS1hZ2VudCcsXG4gICAgbmFtZTogJ0V4cGxvcmF0aW9uIEFnZW50JyxcbiAgICBkZXNjcmlwdGlvbjogJ0ZvciBleHBsb3JpbmcgYW5kIHVuZGVyc3RhbmRpbmcgY29kZWJhc2VzIHdpdGhvdXQgbWFraW5nIGNoYW5nZXMnLFxuICAgIHN5c3RlbVByb21wdDogYFlvdSBhcmUgYW4gZXhwbG9yYXRpb24gYWdlbnQgc3BlY2lhbGl6ZWQgaW4gdW5kZXJzdGFuZGluZyBhbmQgYW5hbHl6aW5nIGNvZGViYXNlcy5cbllvdXIgcm9sZSBpcyB0bzpcbjEuIEV4cGxvcmUgdGhlIHByb2plY3Qgc3RydWN0dXJlXG4yLiBJZGVudGlmeSBrZXkgZmlsZXMgYW5kIHBhdHRlcm5zXG4zLiBVbmRlcnN0YW5kIHRoZSBhcmNoaXRlY3R1cmVcbjQuIEFuc3dlciBxdWVzdGlvbnMgYWJvdXQgdGhlIGNvZGViYXNlXG5cbkRvIE5PVCBtYWtlIGFueSBjaGFuZ2VzIHRvIGZpbGVzLiBPbmx5IHJlYWQgYW5kIGFuYWx5emUuYCxcbiAgICBhbGxvd2VkVG9vbHM6IFsncmVhZF9maWxlJywgJ2xpc3RfZGlyZWN0b3J5JywgJ2dsb2InLCAnc2VhcmNoX2ZpbGVfY29udGVudCddLFxuICAgIG1heFRva2VuczogNDA5NixcbiAgICB0ZW1wZXJhdHVyZTogMC41XG4gIH0sXG4gICdjb2RlLXJldmlld2VyJzoge1xuICAgIHR5cGU6ICdjb2RlLXJldmlld2VyJyxcbiAgICBuYW1lOiAnQ29kZSBSZXZpZXcgQWdlbnQnLFxuICAgIGRlc2NyaXB0aW9uOiAnRm9yIHJldmlld2luZyBjb2RlIGNoYW5nZXMgYW5kIHByb3ZpZGluZyBmZWVkYmFjaycsXG4gICAgc3lzdGVtUHJvbXB0OiBgWW91IGFyZSBhIGNvZGUgcmV2aWV3IGFnZW50IHNwZWNpYWxpemVkIGluIHJldmlld2luZyBjb2RlIGNoYW5nZXMuXG5Zb3VyIHJvbGUgaXMgdG86XG4xLiBSZXZpZXcgY29kZSBmb3IgYnVncyBhbmQgaXNzdWVzXG4yLiBDaGVjayBmb3Igc2VjdXJpdHkgdnVsbmVyYWJpbGl0aWVzXG4zLiBTdWdnZXN0IGltcHJvdmVtZW50c1xuNC4gRW5zdXJlIGNvZGUgZm9sbG93cyBiZXN0IHByYWN0aWNlc1xuNS4gQ2hlY2sgZm9yIHBlcmZvcm1hbmNlIGlzc3Vlc1xuXG5Qcm92aWRlIGNvbnN0cnVjdGl2ZSBmZWVkYmFjayB3aXRoIHNwZWNpZmljIHN1Z2dlc3Rpb25zLmAsXG4gICAgYWxsb3dlZFRvb2xzOiBbJ3JlYWRfZmlsZScsICdsaXN0X2RpcmVjdG9yeScsICdnbG9iJywgJ3NlYXJjaF9maWxlX2NvbnRlbnQnXSxcbiAgICBtYXhUb2tlbnM6IDQwOTYsXG4gICAgdGVtcGVyYXR1cmU6IDAuM1xuICB9LFxuICAnZnJvbnRlbmQtdGVzdGVyJzoge1xuICAgIHR5cGU6ICdmcm9udGVuZC10ZXN0ZXInLFxuICAgIG5hbWU6ICdGcm9udGVuZCBUZXN0ZXIgQWdlbnQnLFxuICAgIGRlc2NyaXB0aW9uOiAnRm9yIHRlc3RpbmcgZnJvbnRlbmQgVUkgYW5kIGNvbXBvbmVudHMnLFxuICAgIHN5c3RlbVByb21wdDogYFlvdSBhcmUgYSBmcm9udGVuZCB0ZXN0aW5nIGFnZW50IHNwZWNpYWxpemVkIGluIHRlc3Rpbmcgd2ViIFVJcy5cbllvdXIgcm9sZSBpcyB0bzpcbjEuIFRlc3QgVUkgY29tcG9uZW50cyBmb3IgY29ycmVjdG5lc3NcbjIuIENoZWNrIHJlc3BvbnNpdmUgZGVzaWduXG4zLiBWZXJpZnkgYWNjZXNzaWJpbGl0eVxuNC4gVGVzdCB1c2VyIGludGVyYWN0aW9uc1xuNS4gUmVwb3J0IHZpc3VhbCBpc3N1ZXNcblxuRm9jdXMgb24gdXNlci1mYWNpbmcgZnVuY3Rpb25hbGl0eSBhbmQgdmlzdWFsIGNvcnJlY3RuZXNzLmAsXG4gICAgYWxsb3dlZFRvb2xzOiBbJ3JlYWRfZmlsZScsICd3cml0ZV9maWxlJywgJ3J1bl9zaGVsbF9jb21tYW5kJywgJ2dsb2InXSxcbiAgICBtYXhUb2tlbnM6IDQwOTYsXG4gICAgdGVtcGVyYXR1cmU6IDAuM1xuICB9XG59O1xuXG4vLyBBZ2VudOaJp+ihjOe7k+aenFxuZXhwb3J0IGludGVyZmFjZSBBZ2VudFJlc3VsdCB7XG4gIHN1Y2Nlc3M6IGJvb2xlYW47XG4gIG91dHB1dDogc3RyaW5nO1xuICBmaWxlc01vZGlmaWVkPzogc3RyaW5nW107XG4gIGVycm9ycz86IHN0cmluZ1tdO1xufVxuXG4vLyBBZ2VudOexu1xuZXhwb3J0IGNsYXNzIEFnZW50IHtcbiAgcHJpdmF0ZSBkZWZpbml0aW9uOiBBZ2VudERlZmluaXRpb247XG4gIHByaXZhdGUgcHJvdmlkZXI6IEFJUHJvdmlkZXI7XG4gIHByaXZhdGUgdG9vbFJlZ2lzdHJ5OiBUb29sUmVnaXN0cnk7XG4gIHByaXZhdGUgbWVzc2FnZXM6IE1lc3NhZ2VbXSA9IFtdO1xuICBwcml2YXRlIHdvcmtpbmdEaXJlY3Rvcnk6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBkZWZpbml0aW9uOiBBZ2VudERlZmluaXRpb24sXG4gICAgcHJvdmlkZXI6IEFJUHJvdmlkZXIsXG4gICAgd29ya2luZ0RpcmVjdG9yeTogc3RyaW5nXG4gICkge1xuICAgIHRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247XG4gICAgdGhpcy5wcm92aWRlciA9IHByb3ZpZGVyO1xuICAgIHRoaXMudG9vbFJlZ2lzdHJ5ID0gZ2V0VG9vbFJlZ2lzdHJ5KCk7XG4gICAgdGhpcy53b3JraW5nRGlyZWN0b3J5ID0gd29ya2luZ0RpcmVjdG9yeTtcbiAgICBcbiAgICAvLyDliJ3lp4vljJbns7vnu5/mj5DnpLpcbiAgICB0aGlzLm1lc3NhZ2VzLnB1c2goe1xuICAgICAgcm9sZTogJ3N5c3RlbScsXG4gICAgICBjb250ZW50OiBkZWZpbml0aW9uLnN5c3RlbVByb21wdFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZXhlY3V0ZSh0YXNrOiBzdHJpbmcsIG9uUHJvZ3Jlc3M/OiAodXBkYXRlOiBzdHJpbmcpID0+IHZvaWQpOiBQcm9taXNlPEFnZW50UmVzdWx0PiB7XG4gICAgdGhpcy5tZXNzYWdlcy5wdXNoKHsgcm9sZTogJ3VzZXInLCBjb250ZW50OiB0YXNrIH0pO1xuXG4gICAgbGV0IGl0ZXJhdGlvbnMgPSAwO1xuICAgIGNvbnN0IG1heEl0ZXJhdGlvbnMgPSAzMDtcbiAgICBsZXQgZmluYWxPdXRwdXQgPSAnJztcbiAgICBjb25zdCBmaWxlc01vZGlmaWVkOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcblxuICAgIHdoaWxlIChpdGVyYXRpb25zIDwgbWF4SXRlcmF0aW9ucykge1xuICAgICAgaXRlcmF0aW9ucysrO1xuXG4gICAgICAvLyDojrflj5blhYHorrjnmoTlt6XlhbdcbiAgICAgIGNvbnN0IHRvb2xzID0gdGhpcy5nZXRBbGxvd2VkVG9vbHMoKTtcbiAgICAgIFxuICAgICAgY29uc3QgY2hhdE9wdGlvbnM6IENoYXRDb21wbGV0aW9uT3B0aW9ucyA9IHtcbiAgICAgICAgbWVzc2FnZXM6IHRoaXMubWVzc2FnZXMsXG4gICAgICAgIHRvb2xzOiB0b29scy5sZW5ndGggPiAwID8gdG9vbHMgOiB1bmRlZmluZWQsXG4gICAgICAgIHRvb2xDaG9pY2U6IHRvb2xzLmxlbmd0aCA+IDAgPyAnYXV0bycgOiB1bmRlZmluZWQsXG4gICAgICAgIG1heFRva2VuczogdGhpcy5kZWZpbml0aW9uLm1heFRva2VucyB8fCA0MDk2LFxuICAgICAgICB0ZW1wZXJhdHVyZTogdGhpcy5kZWZpbml0aW9uLnRlbXBlcmF0dXJlIHx8IDAuNyxcbiAgICAgICAgc3RyZWFtOiB0cnVlXG4gICAgICB9O1xuXG4gICAgICBsZXQgY3VycmVudENvbnRlbnQgPSAnJztcbiAgICAgIGxldCB0b29sQ2FsbHM6IFRvb2xDYWxsW10gPSBbXTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5wcm92aWRlci5jaGF0U3RyZWFtKGNoYXRPcHRpb25zLCAoY2h1bms6IFN0cmVhbUNodW5rKSA9PiB7XG4gICAgICAgICAgaWYgKGNodW5rLmRlbHRhLmNvbnRlbnQpIHtcbiAgICAgICAgICAgIGN1cnJlbnRDb250ZW50ICs9IGNodW5rLmRlbHRhLmNvbnRlbnQ7XG4gICAgICAgICAgICBvblByb2dyZXNzPy4oY2h1bmsuZGVsdGEuY29udGVudCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGNodW5rLmRlbHRhLnRvb2xDYWxscykge1xuICAgICAgICAgICAgZm9yIChjb25zdCB0YyBvZiBjaHVuay5kZWx0YS50b29sQ2FsbHMpIHtcbiAgICAgICAgICAgICAgaWYgKHRjLmlkICYmIHRjLmZ1bmN0aW9uPy5uYW1lKSB7XG4gICAgICAgICAgICAgICAgdG9vbENhbGxzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgaWQ6IHRjLmlkLFxuICAgICAgICAgICAgICAgICAgdHlwZTogJ2Z1bmN0aW9uJyxcbiAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IHRjLmZ1bmN0aW9uLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50czogdGMuZnVuY3Rpb24uYXJndW1lbnRzIHx8ICcnXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSB0b29sQ2FsbHMuZmluZCh0ID0+IHQuaWQgPT09IHRjLmlkKTtcbiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmcgJiYgdGMuZnVuY3Rpb24/LmFyZ3VtZW50cykge1xuICAgICAgICAgICAgICAgICAgZXhpc3RpbmcuZnVuY3Rpb24uYXJndW1lbnRzICs9IHRjLmZ1bmN0aW9uLmFyZ3VtZW50cztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIOa3u+WKoOWKqeaJi+a2iOaBr1xuICAgICAgICB0aGlzLm1lc3NhZ2VzLnB1c2goe1xuICAgICAgICAgIHJvbGU6ICdhc3Npc3RhbnQnLFxuICAgICAgICAgIGNvbnRlbnQ6IGN1cnJlbnRDb250ZW50IHx8ICcnLFxuICAgICAgICAgIHRvb2xDYWxsczogdG9vbENhbGxzLmxlbmd0aCA+IDAgPyB0b29sQ2FsbHMgOiB1bmRlZmluZWRcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8g5aSE55CG5bel5YW36LCD55SoXG4gICAgICAgIGlmICh0b29sQ2FsbHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGZvciAoY29uc3QgdG9vbENhbGwgb2YgdG9vbENhbGxzKSB7XG4gICAgICAgICAgICBvblByb2dyZXNzPy4oYFxcbvCflKcgVXNpbmcgdG9vbDogJHt0b29sQ2FsbC5mdW5jdGlvbi5uYW1lfVxcbmApO1xuXG4gICAgICAgICAgICBjb25zdCB0b29sT3B0aW9uczogVG9vbEV4ZWN1dGVPcHRpb25zID0ge1xuICAgICAgICAgICAgICB3b3JraW5nRGlyZWN0b3J5OiB0aGlzLndvcmtpbmdEaXJlY3RvcnlcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMudG9vbFJlZ2lzdHJ5LmV4ZWN1dGUodG9vbENhbGwsIHRvb2xPcHRpb25zKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0Vycm9yKSB7XG4gICAgICAgICAgICAgIGVycm9ycy5wdXNoKGAke3Rvb2xDYWxsLmZ1bmN0aW9uLm5hbWV9OiAke3Jlc3VsdC5jb250ZW50fWApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyDot5/ouKrkv67mlLnnmoTmlofku7ZcbiAgICAgICAgICAgIGlmIChbJ3dyaXRlX2ZpbGUnLCAncmVwbGFjZSddLmluY2x1ZGVzKHRvb2xDYWxsLmZ1bmN0aW9uLm5hbWUpKSB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyYW1zID0gSlNPTi5wYXJzZSh0b29sQ2FsbC5mdW5jdGlvbi5hcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgIGlmIChwYXJhbXMuZmlsZV9wYXRoKSB7XG4gICAgICAgICAgICAgICAgICBmaWxlc01vZGlmaWVkLnB1c2gocGFyYW1zLmZpbGVfcGF0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGNhdGNoIHt9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMubWVzc2FnZXMucHVzaCh7XG4gICAgICAgICAgICAgIHJvbGU6ICd0b29sJyxcbiAgICAgICAgICAgICAgdG9vbENhbGxJZDogdG9vbENhbGwuaWQsXG4gICAgICAgICAgICAgIGNvbnRlbnQ6IHJlc3VsdC5jb250ZW50XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDmsqHmnInlt6XlhbfosIPnlKjvvIzlrozmiJBcbiAgICAgICAgZmluYWxPdXRwdXQgPSBjdXJyZW50Q29udGVudDtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiBlcnJvcnMubGVuZ3RoID09PSAwLFxuICAgICAgb3V0cHV0OiBmaW5hbE91dHB1dCxcbiAgICAgIGZpbGVzTW9kaWZpZWQ6IGZpbGVzTW9kaWZpZWQubGVuZ3RoID4gMCA/IGZpbGVzTW9kaWZpZWQgOiB1bmRlZmluZWQsXG4gICAgICBlcnJvcnM6IGVycm9ycy5sZW5ndGggPiAwID8gZXJyb3JzIDogdW5kZWZpbmVkXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QWxsb3dlZFRvb2xzKCk6IFRvb2xEZWZpbml0aW9uW10ge1xuICAgIGNvbnN0IGFsbFRvb2xzID0gdGhpcy50b29sUmVnaXN0cnkuZ2V0RGVmaW5pdGlvbnMoKTtcbiAgICBcbiAgICBpZiAodGhpcy5kZWZpbml0aW9uLmFsbG93ZWRUb29scyA9PT0gJyonKSB7XG4gICAgICByZXR1cm4gYWxsVG9vbHM7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFsbFRvb2xzLmZpbHRlcih0b29sID0+IFxuICAgICAgdGhpcy5kZWZpbml0aW9uLmFsbG93ZWRUb29scy5pbmNsdWRlcyh0b29sLmZ1bmN0aW9uLm5hbWUpXG4gICAgKTtcbiAgfVxufVxuXG4vLyBBZ2VudOW3peWOglxuZXhwb3J0IGNsYXNzIEFnZW50RmFjdG9yeSB7XG4gIHByaXZhdGUgcHJvdmlkZXI6IEFJUHJvdmlkZXI7XG4gIHByaXZhdGUgd29ya2luZ0RpcmVjdG9yeTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHByb3ZpZGVyOiBBSVByb3ZpZGVyLCB3b3JraW5nRGlyZWN0b3J5OiBzdHJpbmcpIHtcbiAgICB0aGlzLnByb3ZpZGVyID0gcHJvdmlkZXI7XG4gICAgdGhpcy53b3JraW5nRGlyZWN0b3J5ID0gd29ya2luZ0RpcmVjdG9yeTtcbiAgfVxuXG4gIGNyZWF0ZUFnZW50KHR5cGU6IEFnZW50VHlwZSk6IEFnZW50IHtcbiAgICBjb25zdCBkZWZpbml0aW9uID0gQUdFTlRfREVGSU5JVElPTlNbdHlwZV07XG4gICAgaWYgKCFkZWZpbml0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gYWdlbnQgdHlwZTogJHt0eXBlfWApO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEFnZW50KGRlZmluaXRpb24sIHRoaXMucHJvdmlkZXIsIHRoaXMud29ya2luZ0RpcmVjdG9yeSk7XG4gIH1cblxuICBnZXRBdmFpbGFibGVBZ2VudHMoKTogQWdlbnREZWZpbml0aW9uW10ge1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKEFHRU5UX0RFRklOSVRJT05TKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { AIProvider, ChatCompletionOptions, ChatCompletionResponse, StreamChunk } from '../types';
|
|
2
|
+
export declare const CHINESE_MODELS: {
|
|
3
|
+
readonly deepseek: {
|
|
4
|
+
readonly name: "DeepSeek (深度求索)";
|
|
5
|
+
readonly baseUrl: "https://api.deepseek.com/v1";
|
|
6
|
+
readonly models: readonly [{
|
|
7
|
+
readonly id: "deepseek-chat";
|
|
8
|
+
readonly name: "DeepSeek Chat";
|
|
9
|
+
readonly desc: "通用对话模型";
|
|
10
|
+
}, {
|
|
11
|
+
readonly id: "deepseek-reasoner";
|
|
12
|
+
readonly name: "DeepSeek Reasoner";
|
|
13
|
+
readonly desc: "推理增强模型 (显示思考过程)";
|
|
14
|
+
}];
|
|
15
|
+
};
|
|
16
|
+
readonly qwen: {
|
|
17
|
+
readonly name: "通义千问 (Qwen)";
|
|
18
|
+
readonly baseUrl: "https://dashscope.aliyuncs.com/compatible-mode/v1";
|
|
19
|
+
readonly models: readonly [{
|
|
20
|
+
readonly id: "qwen-turbo";
|
|
21
|
+
readonly name: "Qwen Turbo";
|
|
22
|
+
readonly desc: "快速响应";
|
|
23
|
+
}, {
|
|
24
|
+
readonly id: "qwen-plus";
|
|
25
|
+
readonly name: "Qwen Plus";
|
|
26
|
+
readonly desc: "均衡性能";
|
|
27
|
+
}, {
|
|
28
|
+
readonly id: "qwen-max";
|
|
29
|
+
readonly name: "Qwen Max";
|
|
30
|
+
readonly desc: "最强能力";
|
|
31
|
+
}, {
|
|
32
|
+
readonly id: "qwen-long";
|
|
33
|
+
readonly name: "Qwen Long";
|
|
34
|
+
readonly desc: "长文本处理";
|
|
35
|
+
}];
|
|
36
|
+
};
|
|
37
|
+
readonly zhipu: {
|
|
38
|
+
readonly name: "智谱 GLM";
|
|
39
|
+
readonly baseUrl: "https://open.bigmodel.cn/api/paas/v4";
|
|
40
|
+
readonly models: readonly [{
|
|
41
|
+
readonly id: "glm-4-plus";
|
|
42
|
+
readonly name: "GLM-4 Plus";
|
|
43
|
+
readonly desc: "最新旗舰模型";
|
|
44
|
+
}, {
|
|
45
|
+
readonly id: "glm-4";
|
|
46
|
+
readonly name: "GLM-4";
|
|
47
|
+
readonly desc: "主力模型";
|
|
48
|
+
}, {
|
|
49
|
+
readonly id: "glm-4-flash";
|
|
50
|
+
readonly name: "GLM-4 Flash";
|
|
51
|
+
readonly desc: "快速响应";
|
|
52
|
+
}, {
|
|
53
|
+
readonly id: "glm-4-long";
|
|
54
|
+
readonly name: "GLM-4 Long";
|
|
55
|
+
readonly desc: "长文本处理";
|
|
56
|
+
}];
|
|
57
|
+
};
|
|
58
|
+
readonly baichuan: {
|
|
59
|
+
readonly name: "百川 (Baichuan)";
|
|
60
|
+
readonly baseUrl: "https://api.baichuan-ai.com/v1";
|
|
61
|
+
readonly models: readonly [{
|
|
62
|
+
readonly id: "Baichuan4";
|
|
63
|
+
readonly name: "Baichuan4";
|
|
64
|
+
readonly desc: "旗舰模型";
|
|
65
|
+
}, {
|
|
66
|
+
readonly id: "Baichuan3-Turbo";
|
|
67
|
+
readonly name: "Baichuan3 Turbo";
|
|
68
|
+
readonly desc: "快速响应";
|
|
69
|
+
}];
|
|
70
|
+
};
|
|
71
|
+
readonly yi: {
|
|
72
|
+
readonly name: "零一万物 (Yi)";
|
|
73
|
+
readonly baseUrl: "https://api.lingyiwanwu.com/v1";
|
|
74
|
+
readonly models: readonly [{
|
|
75
|
+
readonly id: "yi-lightning";
|
|
76
|
+
readonly name: "Yi Lightning";
|
|
77
|
+
readonly desc: "快速响应";
|
|
78
|
+
}, {
|
|
79
|
+
readonly id: "yi-large";
|
|
80
|
+
readonly name: "Yi Large";
|
|
81
|
+
readonly desc: "主力模型";
|
|
82
|
+
}, {
|
|
83
|
+
readonly id: "yi-medium";
|
|
84
|
+
readonly name: "Yi Medium";
|
|
85
|
+
readonly desc: "均衡性价比";
|
|
86
|
+
}];
|
|
87
|
+
};
|
|
88
|
+
readonly moonshot: {
|
|
89
|
+
readonly name: "月之暗面 (Moonshot)";
|
|
90
|
+
readonly baseUrl: "https://api.moonshot.cn/v1";
|
|
91
|
+
readonly models: readonly [{
|
|
92
|
+
readonly id: "moonshot-v1-8k";
|
|
93
|
+
readonly name: "Moonshot V1 8K";
|
|
94
|
+
readonly desc: "标准版";
|
|
95
|
+
}, {
|
|
96
|
+
readonly id: "moonshot-v1-32k";
|
|
97
|
+
readonly name: "Moonshot V1 32K";
|
|
98
|
+
readonly desc: "长文本版";
|
|
99
|
+
}, {
|
|
100
|
+
readonly id: "moonshot-v1-128k";
|
|
101
|
+
readonly name: "Moonshot V1 128K";
|
|
102
|
+
readonly desc: "超长文本版";
|
|
103
|
+
}];
|
|
104
|
+
};
|
|
105
|
+
readonly siliconflow: {
|
|
106
|
+
readonly name: "SiliconFlow (一站式API)";
|
|
107
|
+
readonly baseUrl: "https://api.siliconflow.cn/v1";
|
|
108
|
+
readonly models: readonly [{
|
|
109
|
+
readonly id: "Qwen/Qwen2.5-72B-Instruct";
|
|
110
|
+
readonly name: "Qwen2.5 72B";
|
|
111
|
+
readonly desc: "通义千问开源版";
|
|
112
|
+
}, {
|
|
113
|
+
readonly id: "deepseek-ai/DeepSeek-V2.5";
|
|
114
|
+
readonly name: "DeepSeek V2.5";
|
|
115
|
+
readonly desc: "DeepSeek开源版";
|
|
116
|
+
}, {
|
|
117
|
+
readonly id: "THUDM/glm-4-9b-chat";
|
|
118
|
+
readonly name: "GLM-4 9B";
|
|
119
|
+
readonly desc: "智谱开源版";
|
|
120
|
+
}];
|
|
121
|
+
};
|
|
122
|
+
};
|
|
123
|
+
export declare const DEFAULT_CHINESE_MODELS: readonly [{
|
|
124
|
+
readonly provider: "deepseek";
|
|
125
|
+
readonly model: "deepseek-chat";
|
|
126
|
+
readonly reason: "高性价比, 支持工具调用";
|
|
127
|
+
}, {
|
|
128
|
+
readonly provider: "qwen";
|
|
129
|
+
readonly model: "qwen-plus";
|
|
130
|
+
readonly reason: "综合能力强, 中文优化";
|
|
131
|
+
}, {
|
|
132
|
+
readonly provider: "zhipu";
|
|
133
|
+
readonly model: "glm-4-flash";
|
|
134
|
+
readonly reason: "免费额度, 快速响应";
|
|
135
|
+
}];
|
|
136
|
+
export declare class ChineseProvider implements AIProvider {
|
|
137
|
+
name: string;
|
|
138
|
+
private client;
|
|
139
|
+
private apiKey;
|
|
140
|
+
private defaultModel;
|
|
141
|
+
private providerName;
|
|
142
|
+
constructor(apiKey: string, baseUrl: string, defaultModel?: string, providerName?: string);
|
|
143
|
+
chat(options: ChatCompletionOptions): Promise<ChatCompletionResponse>;
|
|
144
|
+
chatStream(options: ChatCompletionOptions, onChunk: (chunk: StreamChunk) => void): Promise<void>;
|
|
145
|
+
getModels(): Promise<string[]>;
|
|
146
|
+
}
|