@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
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ChineseProvider = exports.DEFAULT_CHINESE_MODELS = exports.CHINESE_MODELS = void 0;
|
|
7
|
+
const axios_1 = __importDefault(require("axios"));
|
|
8
|
+
// 国内模型配置
|
|
9
|
+
exports.CHINESE_MODELS = {
|
|
10
|
+
deepseek: {
|
|
11
|
+
name: 'DeepSeek (深度求索)',
|
|
12
|
+
baseUrl: 'https://api.deepseek.com/v1',
|
|
13
|
+
models: [
|
|
14
|
+
{ id: 'deepseek-chat', name: 'DeepSeek Chat', desc: '通用对话模型' },
|
|
15
|
+
{ id: 'deepseek-reasoner', name: 'DeepSeek Reasoner', desc: '推理增强模型 (显示思考过程)' }
|
|
16
|
+
]
|
|
17
|
+
},
|
|
18
|
+
qwen: {
|
|
19
|
+
name: '通义千问 (Qwen)',
|
|
20
|
+
baseUrl: 'https://dashscope.aliyuncs.com/compatible-mode/v1',
|
|
21
|
+
models: [
|
|
22
|
+
{ id: 'qwen-turbo', name: 'Qwen Turbo', desc: '快速响应' },
|
|
23
|
+
{ id: 'qwen-plus', name: 'Qwen Plus', desc: '均衡性能' },
|
|
24
|
+
{ id: 'qwen-max', name: 'Qwen Max', desc: '最强能力' },
|
|
25
|
+
{ id: 'qwen-long', name: 'Qwen Long', desc: '长文本处理' }
|
|
26
|
+
]
|
|
27
|
+
},
|
|
28
|
+
zhipu: {
|
|
29
|
+
name: '智谱 GLM',
|
|
30
|
+
baseUrl: 'https://open.bigmodel.cn/api/paas/v4',
|
|
31
|
+
models: [
|
|
32
|
+
{ id: 'glm-4-plus', name: 'GLM-4 Plus', desc: '最新旗舰模型' },
|
|
33
|
+
{ id: 'glm-4', name: 'GLM-4', desc: '主力模型' },
|
|
34
|
+
{ id: 'glm-4-flash', name: 'GLM-4 Flash', desc: '快速响应' },
|
|
35
|
+
{ id: 'glm-4-long', name: 'GLM-4 Long', desc: '长文本处理' }
|
|
36
|
+
]
|
|
37
|
+
},
|
|
38
|
+
baichuan: {
|
|
39
|
+
name: '百川 (Baichuan)',
|
|
40
|
+
baseUrl: 'https://api.baichuan-ai.com/v1',
|
|
41
|
+
models: [
|
|
42
|
+
{ id: 'Baichuan4', name: 'Baichuan4', desc: '旗舰模型' },
|
|
43
|
+
{ id: 'Baichuan3-Turbo', name: 'Baichuan3 Turbo', desc: '快速响应' }
|
|
44
|
+
]
|
|
45
|
+
},
|
|
46
|
+
yi: {
|
|
47
|
+
name: '零一万物 (Yi)',
|
|
48
|
+
baseUrl: 'https://api.lingyiwanwu.com/v1',
|
|
49
|
+
models: [
|
|
50
|
+
{ id: 'yi-lightning', name: 'Yi Lightning', desc: '快速响应' },
|
|
51
|
+
{ id: 'yi-large', name: 'Yi Large', desc: '主力模型' },
|
|
52
|
+
{ id: 'yi-medium', name: 'Yi Medium', desc: '均衡性价比' }
|
|
53
|
+
]
|
|
54
|
+
},
|
|
55
|
+
moonshot: {
|
|
56
|
+
name: '月之暗面 (Moonshot)',
|
|
57
|
+
baseUrl: 'https://api.moonshot.cn/v1',
|
|
58
|
+
models: [
|
|
59
|
+
{ id: 'moonshot-v1-8k', name: 'Moonshot V1 8K', desc: '标准版' },
|
|
60
|
+
{ id: 'moonshot-v1-32k', name: 'Moonshot V1 32K', desc: '长文本版' },
|
|
61
|
+
{ id: 'moonshot-v1-128k', name: 'Moonshot V1 128K', desc: '超长文本版' }
|
|
62
|
+
]
|
|
63
|
+
},
|
|
64
|
+
siliconflow: {
|
|
65
|
+
name: 'SiliconFlow (一站式API)',
|
|
66
|
+
baseUrl: 'https://api.siliconflow.cn/v1',
|
|
67
|
+
models: [
|
|
68
|
+
{ id: 'Qwen/Qwen2.5-72B-Instruct', name: 'Qwen2.5 72B', desc: '通义千问开源版' },
|
|
69
|
+
{ id: 'deepseek-ai/DeepSeek-V2.5', name: 'DeepSeek V2.5', desc: 'DeepSeek开源版' },
|
|
70
|
+
{ id: 'THUDM/glm-4-9b-chat', name: 'GLM-4 9B', desc: '智谱开源版' }
|
|
71
|
+
]
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
// 默认推荐的国内模型
|
|
75
|
+
exports.DEFAULT_CHINESE_MODELS = [
|
|
76
|
+
{ provider: 'deepseek', model: 'deepseek-chat', reason: '高性价比, 支持工具调用' },
|
|
77
|
+
{ provider: 'qwen', model: 'qwen-plus', reason: '综合能力强, 中文优化' },
|
|
78
|
+
{ provider: 'zhipu', model: 'glm-4-flash', reason: '免费额度, 快速响应' }
|
|
79
|
+
];
|
|
80
|
+
class ChineseProvider {
|
|
81
|
+
name = 'chinese';
|
|
82
|
+
client;
|
|
83
|
+
apiKey;
|
|
84
|
+
defaultModel;
|
|
85
|
+
providerName;
|
|
86
|
+
constructor(apiKey, baseUrl, defaultModel, providerName) {
|
|
87
|
+
this.apiKey = apiKey;
|
|
88
|
+
this.defaultModel = defaultModel || 'deepseek-chat';
|
|
89
|
+
this.providerName = providerName || 'chinese';
|
|
90
|
+
this.client = axios_1.default.create({
|
|
91
|
+
baseURL: baseUrl,
|
|
92
|
+
headers: {
|
|
93
|
+
'Content-Type': 'application/json',
|
|
94
|
+
'Authorization': `Bearer ${apiKey}`
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
async chat(options) {
|
|
99
|
+
const response = await this.client.post('/chat/completions', {
|
|
100
|
+
model: this.defaultModel,
|
|
101
|
+
messages: options.messages,
|
|
102
|
+
tools: options.tools,
|
|
103
|
+
tool_choice: options.toolChoice,
|
|
104
|
+
max_tokens: options.maxTokens,
|
|
105
|
+
temperature: options.temperature,
|
|
106
|
+
stream: false
|
|
107
|
+
});
|
|
108
|
+
const choice = response.data.choices[0];
|
|
109
|
+
return {
|
|
110
|
+
id: response.data.id,
|
|
111
|
+
content: choice.message.content,
|
|
112
|
+
toolCalls: choice.message.tool_calls?.map((tc) => ({
|
|
113
|
+
id: tc.id,
|
|
114
|
+
type: 'function',
|
|
115
|
+
function: {
|
|
116
|
+
name: tc.function.name,
|
|
117
|
+
arguments: tc.function.arguments
|
|
118
|
+
}
|
|
119
|
+
})),
|
|
120
|
+
finishReason: choice.finish_reason,
|
|
121
|
+
usage: response.data.usage ? {
|
|
122
|
+
promptTokens: response.data.usage.prompt_tokens,
|
|
123
|
+
completionTokens: response.data.usage.completion_tokens,
|
|
124
|
+
totalTokens: response.data.usage.total_tokens
|
|
125
|
+
} : undefined,
|
|
126
|
+
// 支持思考过程 (如DeepSeek Reasoner)
|
|
127
|
+
reasoning: choice.message.reasoning_content || choice.reasoning_content
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
async chatStream(options, onChunk) {
|
|
131
|
+
const response = await this.client.post('/chat/completions', {
|
|
132
|
+
model: this.defaultModel,
|
|
133
|
+
messages: options.messages,
|
|
134
|
+
tools: options.tools,
|
|
135
|
+
tool_choice: options.toolChoice,
|
|
136
|
+
max_tokens: options.maxTokens,
|
|
137
|
+
temperature: options.temperature,
|
|
138
|
+
stream: true
|
|
139
|
+
}, {
|
|
140
|
+
responseType: 'stream'
|
|
141
|
+
});
|
|
142
|
+
const stream = response.data;
|
|
143
|
+
let buffer = '';
|
|
144
|
+
stream.on('data', (chunk) => {
|
|
145
|
+
buffer += chunk.toString();
|
|
146
|
+
const lines = buffer.split('\n');
|
|
147
|
+
buffer = lines.pop() || '';
|
|
148
|
+
for (const line of lines) {
|
|
149
|
+
const trimmed = line.trim();
|
|
150
|
+
if (trimmed.startsWith('data: ')) {
|
|
151
|
+
const data = trimmed.slice(6);
|
|
152
|
+
if (data === '[DONE]')
|
|
153
|
+
continue;
|
|
154
|
+
try {
|
|
155
|
+
const parsed = JSON.parse(data);
|
|
156
|
+
const delta = parsed.choices[0]?.delta;
|
|
157
|
+
const finishReason = parsed.choices[0]?.finish_reason;
|
|
158
|
+
// 处理思考过程 (DeepSeek等支持)
|
|
159
|
+
const reasoning = delta?.reasoning_content || delta?.reasoning;
|
|
160
|
+
onChunk({
|
|
161
|
+
id: parsed.id,
|
|
162
|
+
delta: {
|
|
163
|
+
content: delta?.content ?? undefined,
|
|
164
|
+
toolCalls: delta?.tool_calls,
|
|
165
|
+
role: delta?.role,
|
|
166
|
+
reasoning: reasoning
|
|
167
|
+
},
|
|
168
|
+
finishReason: finishReason || null
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
// Skip invalid JSON
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
return new Promise((resolve, reject) => {
|
|
178
|
+
stream.on('end', resolve);
|
|
179
|
+
stream.on('error', reject);
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
async getModels() {
|
|
183
|
+
try {
|
|
184
|
+
const response = await this.client.get('/models');
|
|
185
|
+
return response.data.data.map((m) => m.id).sort();
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
return [this.defaultModel];
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
exports.ChineseProvider = ChineseProvider;
|
|
193
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hpbmVzZS1wcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9haS9jaGluZXNlLXByb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGtEQUE2QztBQVE3QyxTQUFTO0FBQ0ksUUFBQSxjQUFjLEdBQUc7SUFDNUIsUUFBUSxFQUFFO1FBQ1IsSUFBSSxFQUFFLGlCQUFpQjtRQUN2QixPQUFPLEVBQUUsNkJBQTZCO1FBQ3RDLE1BQU0sRUFBRTtZQUNOLEVBQUUsRUFBRSxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7WUFDOUQsRUFBRSxFQUFFLEVBQUUsbUJBQW1CLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRTtTQUNoRjtLQUNGO0lBQ0QsSUFBSSxFQUFFO1FBQ0osSUFBSSxFQUFFLGFBQWE7UUFDbkIsT0FBTyxFQUFFLG1EQUFtRDtRQUM1RCxNQUFNLEVBQUU7WUFDTixFQUFFLEVBQUUsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFO1lBQ3RELEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUU7WUFDcEQsRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRTtZQUNsRCxFQUFFLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFO1NBQ3REO0tBQ0Y7SUFDRCxLQUFLLEVBQUU7UUFDTCxJQUFJLEVBQUUsUUFBUTtRQUNkLE9BQU8sRUFBRSxzQ0FBc0M7UUFDL0MsTUFBTSxFQUFFO1lBQ04sRUFBRSxFQUFFLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxZQUFZLEVB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SyxFQUFFLFVBQVU7Z0NBQzVCLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSTtnQ0FDakIsU0FBUyxFQUFFLFNBQVM7NkJBQ3JCOzRCQUNELFlBQVksRUFBRSxZQUFZLElBQUksSUFBSTt5QkFDbkMsQ0FBQyxDQUFDO29CQUNMLENBQUM7b0JBQUMsTUFBTSxDQUFDO3dCQUNQLG9CQUFvQjtvQkFDdEIsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNyQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztZQUMxQixNQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxLQUFLLENBQUMsU0FBUztRQUNiLElBQUksQ0FBQztZQUNILE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDbEQsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN6RCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM3QixDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBaElELDBDQWdJQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBheGlvcywgeyBBeGlvc0luc3RhbmNlIH0gZnJvbSAnYXhpb3MnO1xuaW1wb3J0IHtcbiAgQUlQcm92aWRlcixcbiAgQ2hhdENvbXBsZXRpb25PcHRpb25zLFxuICBDaGF0Q29tcGxldGlvblJlc3BvbnNlLFxuICBTdHJlYW1DaHVua1xufSBmcm9tICcuLi90eXBlcyc7XG5cbi8vIOWbveWGheaooeWei+mFjee9rlxuZXhwb3J0IGNvbnN0IENISU5FU0VfTU9ERUxTID0ge1xuICBkZWVwc2Vlazoge1xuICAgIG5hbWU6ICdEZWVwU2VlayAo5rex5bqm5rGC57SiKScsXG4gICAgYmFzZVVybDogJ2h0dHBzOi8vYXBpLmRlZXBzZWVrLmNvbS92MScsXG4gICAgbW9kZWxzOiBbXG4gICAgICB7IGlkOiAnZGVlcHNlZWstY2hhdCcsIG5hbWU6ICdEZWVwU2VlayBDaGF0JywgZGVzYzogJ+mAmueUqOWvueivneaooeWeiycgfSxcbiAgICAgIHsgaWQ6ICdkZWVwc2Vlay1yZWFzb25lcicsIG5hbWU6ICdEZWVwU2VlayBSZWFzb25lcicsIGRlc2M6ICfmjqjnkIblop7lvLrmqKHlnosgKOaYvuekuuaAneiAg+i/h+eoiyknIH1cbiAgICBdXG4gIH0sXG4gIHF3ZW46IHtcbiAgICBuYW1lOiAn6YCa5LmJ5Y2D6ZeuIChRd2VuKScsXG4gICAgYmFzZVVybDogJ2h0dHBzOi8vZGFzaHNjb3BlLmFsaXl1bmNzLmNvbS9jb21wYXRpYmxlLW1vZGUvdjEnLFxuICAgIG1vZGVsczogW1xuICAgICAgeyBpZDogJ3F3ZW4tdHVyYm8nLCBuYW1lOiAnUXdlbiBUdXJibycsIGRlc2M6ICflv6vpgJ/lk43lupQnIH0sXG4gICAgICB7IGlkOiAncXdlbi1wbHVzJywgbmFtZTogJ1F3ZW4gUGx1cycsIGRlc2M6ICflnYfooaHmgKfog70nIH0sXG4gICAgICB7IGlkOiAncXdlbi1tYXgnLCBuYW1lOiAnUXdlbiBNYXgnLCBkZXNjOiAn5pyA5by66IO95YqbJyB9LFxuICAgICAgeyBpZDogJ3F3ZW4tbG9uZycsIG5hbWU6ICdRd2VuIExvbmcnLCBkZXNjOiAn6ZW/5paH5pys5aSE55CGJyB9XG4gICAgXVxuICB9LFxuICB6aGlwdToge1xuICAgIG5hbWU6ICfmmbrosLEgR0xNJyxcbiAgICBiYXNlVXJsOiAnaHR0cHM6Ly9vcGVuLmJpZ21vZGVsLmNuL2FwaS9wYWFzL3Y0JyxcbiAgICBtb2RlbHM6IFtcbiAgICAgIHsgaWQ6ICdnbG0tNC1wbHVzJywgbmFtZTogJ0dMTS00IFBsdXMnLCBkZXNjOiAn5pyA5paw5peX6Iiw5qih5Z6LJyB9LFxuICAgICAgeyBpZDogJ2dsbS00JywgbmFtZTogJ0dMTS00JywgZGVzYzogJ+S4u+WKm+aooeWeiycgfSxcbiAgICAgIHsgaWQ6ICdnbG0tNC1mbGFzaCcsIG5hbWU6ICdHTE0tNCBGbGFzaCcsIGRlc2M6ICflv6vpgJ/lk43lupQnIH0sXG4gICAgICB7IGlkOiAnZ2xtLTQtbG9uZycsIG5hbWU6ICdHTE0tNCBMb25nJywgZGVzYzogJ+mVv+aWh+acrOWkhOeQhicgfVxuICAgIF1cbiAgfSxcbiAgYmFpY2h1YW46IHtcbiAgICBuYW1lOiAn55m+5bedIChCYWljaHVhbiknLFxuICAgIGJhc2VVcmw6ICdodHRwczovL2FwaS5iYWljaHVhbi1haS5jb20vdjEnLFxuICAgIG1vZGVsczogW1xuICAgICAgeyBpZDogJ0JhaWNodWFuNCcsIG5hbWU6ICdCYWljaHVhbjQnLCBkZXNjOiAn5peX6Iiw5qih5Z6LJyB9LFxuICAgICAgeyBpZDogJ0JhaWNodWFuMy1UdXJibycsIG5hbWU6ICdCYWljaHVhbjMgVHVyYm8nLCBkZXNjOiAn5b+r6YCf5ZON5bqUJyB9XG4gICAgXVxuICB9LFxuICB5aToge1xuICAgIG5hbWU6ICfpm7bkuIDkuIfniakgKFlpKScsXG4gICAgYmFzZVVybDogJ2h0dHBzOi8vYXBpLmxpbmd5aXdhbnd1LmNvbS92MScsXG4gICAgbW9kZWxzOiBbXG4gICAgICB7IGlkOiAneWktbGlnaHRuaW5nJywgbmFtZTogJ1lpIExpZ2h0bmluZycsIGRlc2M6ICflv6vpgJ/lk43lupQnIH0sXG4gICAgICB7IGlkOiAneWktbGFyZ2UnLCBuYW1lOiAnWWkgTGFyZ2UnLCBkZXNjOiAn5Li75Yqb5qih5Z6LJyB9LFxuICAgICAgeyBpZDogJ3lpLW1lZGl1bScsIG5hbWU6ICdZaSBNZWRpdW0nLCBkZXNjOiAn5Z2H6KGh5oCn5Lu35q+UJyB9XG4gICAgXVxuICB9LFxuICBtb29uc2hvdDoge1xuICAgIG5hbWU6ICfmnIjkuYvmmpfpnaIgKE1vb25zaG90KScsXG4gICAgYmFzZVVybDogJ2h0dHBzOi8vYXBpLm1vb25zaG90LmNuL3YxJyxcbiAgICBtb2RlbHM6IFtcbiAgICAgIHsgaWQ6ICdtb29uc2hvdC12MS04aycsIG5hbWU6ICdNb29uc2hvdCBWMSA4SycsIGRlc2M6ICfmoIflh4bniYgnIH0sXG4gICAgICB7IGlkOiAnbW9vbnNob3QtdjEtMzJrJywgbmFtZTogJ01vb25zaG90IFYxIDMySycsIGRlc2M6ICfplb/mlofmnKzniYgnIH0sXG4gICAgICB7IGlkOiAnbW9vbnNob3QtdjEtMTI4aycsIG5hbWU6ICdNb29uc2hvdCBWMSAxMjhLJywgZGVzYzogJ+i2hemVv+aWh+acrOeJiCcgfVxuICAgIF1cbiAgfSxcbiAgc2lsaWNvbmZsb3c6IHtcbiAgICBuYW1lOiAnU2lsaWNvbkZsb3cgKOS4gOermeW8j0FQSSknLFxuICAgIGJhc2VVcmw6ICdodHRwczovL2FwaS5zaWxpY29uZmxvdy5jbi92MScsXG4gICAgbW9kZWxzOiBbXG4gICAgICB7IGlkOiAnUXdlbi9Rd2VuMi41LTcyQi1JbnN0cnVjdCcsIG5hbWU6ICdRd2VuMi41IDcyQicsIGRlc2M6ICfpgJrkuYnljYPpl67lvIDmupDniYgnIH0sXG4gICAgICB7IGlkOiAnZGVlcHNlZWstYWkvRGVlcFNlZWstVjIuNScsIG5hbWU6ICdEZWVwU2VlayBWMi41JywgZGVzYzogJ0RlZXBTZWVr5byA5rqQ54mIJyB9LFxuICAgICAgeyBpZDogJ1RIVURNL2dsbS00LTliLWNoYXQnLCBuYW1lOiAnR0xNLTQgOUInLCBkZXNjOiAn5pm66LCx5byA5rqQ54mIJyB9XG4gICAgXVxuICB9XG59IGFzIGNvbnN0O1xuXG4vLyDpu5jorqTmjqjojZDnmoTlm73lhoXmqKHlnotcbmV4cG9ydCBjb25zdCBERUZBVUxUX0NISU5FU0VfTU9ERUxTID0gW1xuICB7IHByb3ZpZGVyOiAnZGVlcHNlZWsnLCBtb2RlbDogJ2RlZXBzZWVrLWNoYXQnLCByZWFzb246ICfpq5jmgKfku7fmr5QsIOaUr+aMgeW3peWFt+iwg+eUqCcgfSxcbiAgeyBwcm92aWRlcjogJ3F3ZW4nLCBtb2RlbDogJ3F3ZW4tcGx1cycsIHJlYXNvbjogJ+e7vOWQiOiDveWKm+W8uiwg5Lit5paH5LyY5YyWJyB9LFxuICB7IHByb3ZpZGVyOiAnemhpcHUnLCBtb2RlbDogJ2dsbS00LWZsYXNoJywgcmVhc29uOiAn5YWN6LS56aKd5bqmLCDlv6vpgJ/lk43lupQnIH1cbl0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjbGFzcyBDaGluZXNlUHJvdmlkZXIgaW1wbGVtZW50cyBBSVByb3ZpZGVyIHtcbiAgbmFtZSA9ICdjaGluZXNlJztcbiAgcHJpdmF0ZSBjbGllbnQ6IEF4aW9zSW5zdGFuY2U7XG4gIHByaXZhdGUgYXBpS2V5OiBzdHJpbmc7XG4gIHByaXZhdGUgZGVmYXVsdE1vZGVsOiBzdHJpbmc7XG4gIHByaXZhdGUgcHJvdmlkZXJOYW1lOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgYXBpS2V5OiBzdHJpbmcsIFxuICAgIGJhc2VVcmw6IHN0cmluZywgXG4gICAgZGVmYXVsdE1vZGVsPzogc3RyaW5nLFxuICAgIHByb3ZpZGVyTmFtZT86IHN0cmluZ1xuICApIHtcbiAgICB0aGlzLmFwaUtleSA9IGFwaUtleTtcbiAgICB0aGlzLmRlZmF1bHRNb2RlbCA9IGRlZmF1bHRNb2RlbCB8fCAnZGVlcHNlZWstY2hhdCc7XG4gICAgdGhpcy5wcm92aWRlck5hbWUgPSBwcm92aWRlck5hbWUgfHwgJ2NoaW5lc2UnO1xuICAgIHRoaXMuY2xpZW50ID0gYXhpb3MuY3JlYXRlKHtcbiAgICAgIGJhc2VVUkw6IGJhc2VVcmwsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICdBdXRob3JpemF0aW9uJzogYEJlYXJlciAke2FwaUtleX1gXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBjaGF0KG9wdGlvbnM6IENoYXRDb21wbGV0aW9uT3B0aW9ucyk6IFByb21pc2U8Q2hhdENvbXBsZXRpb25SZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQucG9zdCgnL2NoYXQvY29tcGxldGlvbnMnLCB7XG4gICAgICBtb2RlbDogdGhpcy5kZWZhdWx0TW9kZWwsXG4gICAgICBtZXNzYWdlczogb3B0aW9ucy5tZXNzYWdlcyxcbiAgICAgIHRvb2xzOiBvcHRpb25zLnRvb2xzLFxuICAgICAgdG9vbF9jaG9pY2U6IG9wdGlvbnMudG9vbENob2ljZSxcbiAgICAgIG1heF90b2tlbnM6IG9wdGlvbnMubWF4VG9rZW5zLFxuICAgICAgdGVtcGVyYXR1cmU6IG9wdGlvbnMudGVtcGVyYXR1cmUsXG4gICAgICBzdHJlYW06IGZhbHNlXG4gICAgfSk7XG5cbiAgICBjb25zdCBjaG9pY2UgPSByZXNwb25zZS5kYXRhLmNob2ljZXNbMF07XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiByZXNwb25zZS5kYXRhLmlkLFxuICAgICAgY29udGVudDogY2hvaWNlLm1lc3NhZ2UuY29udGVudCxcbiAgICAgIHRvb2xDYWxsczogY2hvaWNlLm1lc3NhZ2UudG9vbF9jYWxscz8ubWFwKCh0YzogYW55KSA9PiAoe1xuICAgICAgICBpZDogdGMuaWQsXG4gICAgICAgIHR5cGU6ICdmdW5jdGlvbicgYXMgY29uc3QsXG4gICAgICAgIGZ1bmN0aW9uOiB7XG4gICAgICAgICAgbmFtZTogdGMuZnVuY3Rpb24ubmFtZSxcbiAgICAgICAgICBhcmd1bWVudHM6IHRjLmZ1bmN0aW9uLmFyZ3VtZW50c1xuICAgICAgICB9XG4gICAgICB9KSksXG4gICAgICBmaW5pc2hSZWFzb246IGNob2ljZS5maW5pc2hfcmVhc29uLFxuICAgICAgdXNhZ2U6IHJlc3BvbnNlLmRhdGEudXNhZ2UgPyB7XG4gICAgICAgIHByb21wdFRva2VuczogcmVzcG9uc2UuZGF0YS51c2FnZS5wcm9tcHRfdG9rZW5zLFxuICAgICAgICBjb21wbGV0aW9uVG9rZW5zOiByZXNwb25zZS5kYXRhLnVzYWdlLmNvbXBsZXRpb25fdG9rZW5zLFxuICAgICAgICB0b3RhbFRva2VuczogcmVzcG9uc2UuZGF0YS51c2FnZS50b3RhbF90b2tlbnNcbiAgICAgIH0gOiB1bmRlZmluZWQsXG4gICAgICAvLyDmlK/mjIHmgJ3ogIPov4fnqIsgKOWmgkRlZXBTZWVrIFJlYXNvbmVyKVxuICAgICAgcmVhc29uaW5nOiBjaG9pY2UubWVzc2FnZS5yZWFzb25pbmdfY29udGVudCB8fCBjaG9pY2UucmVhc29uaW5nX2NvbnRlbnRcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgY2hhdFN0cmVhbShcbiAgICBvcHRpb25zOiBDaGF0Q29tcGxldGlvbk9wdGlvbnMsXG4gICAgb25DaHVuazogKGNodW5rOiBTdHJlYW1DaHVuaykgPT4gdm9pZFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LnBvc3QoJy9jaGF0L2NvbXBsZXRpb25zJywge1xuICAgICAgbW9kZWw6IHRoaXMuZGVmYXVsdE1vZGVsLFxuICAgICAgbWVzc2FnZXM6IG9wdGlvbnMubWVzc2FnZXMsXG4gICAgICB0b29sczogb3B0aW9ucy50b29scyxcbiAgICAgIHRvb2xfY2hvaWNlOiBvcHRpb25zLnRvb2xDaG9pY2UsXG4gICAgICBtYXhfdG9rZW5zOiBvcHRpb25zLm1heFRva2VucyxcbiAgICAgIHRlbXBlcmF0dXJlOiBvcHRpb25zLnRlbXBlcmF0dXJlLFxuICAgICAgc3RyZWFtOiB0cnVlXG4gICAgfSwge1xuICAgICAgcmVzcG9uc2VUeXBlOiAnc3RyZWFtJ1xuICAgIH0pO1xuXG4gICAgY29uc3Qgc3RyZWFtID0gcmVzcG9uc2UuZGF0YTtcbiAgICBsZXQgYnVmZmVyID0gJyc7XG5cbiAgICBzdHJlYW0ub24oJ2RhdGEnLCAoY2h1bms6IEJ1ZmZlcikgPT4ge1xuICAgICAgYnVmZmVyICs9IGNodW5rLnRvU3RyaW5nKCk7XG4gICAgICBjb25zdCBsaW5lcyA9IGJ1ZmZlci5zcGxpdCgnXFxuJyk7XG4gICAgICBidWZmZXIgPSBsaW5lcy5wb3AoKSB8fCAnJztcblxuICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICAgIGNvbnN0IHRyaW1tZWQgPSBsaW5lLnRyaW0oKTtcbiAgICAgICAgaWYgKHRyaW1tZWQuc3RhcnRzV2l0aCgnZGF0YTogJykpIHtcbiAgICAgICAgICBjb25zdCBkYXRhID0gdHJpbW1lZC5zbGljZSg2KTtcbiAgICAgICAgICBpZiAoZGF0YSA9PT0gJ1tET05FXScpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICAgICAgICBjb25zdCBkZWx0YSA9IHBhcnNlZC5jaG9pY2VzWzBdPy5kZWx0YTtcbiAgICAgICAgICAgIGNvbnN0IGZpbmlzaFJlYXNvbiA9IHBhcnNlZC5jaG9pY2VzWzBdPy5maW5pc2hfcmVhc29uO1xuXG4gICAgICAgICAgICAvLyDlpITnkIbmgJ3ogIPov4fnqIsgKERlZXBTZWVr562J5pSv5oyBKVxuICAgICAgICAgICAgY29uc3QgcmVhc29uaW5nID0gZGVsdGE/LnJlYXNvbmluZ19jb250ZW50IHx8IGRlbHRhPy5yZWFzb25pbmc7XG5cbiAgICAgICAgICAgIG9uQ2h1bmsoe1xuICAgICAgICAgICAgICBpZDogcGFyc2VkLmlkLFxuICAgICAgICAgICAgICBkZWx0YToge1xuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGRlbHRhPy5jb250ZW50ID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB0b29sQ2FsbHM6IGRlbHRhPy50b29sX2NhbGxzLFxuICAgICAgICAgICAgICAgIHJvbGU6IGRlbHRhPy5yb2xlLFxuICAgICAgICAgICAgICAgIHJlYXNvbmluZzogcmVhc29uaW5nXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGZpbmlzaFJlYXNvbjogZmluaXNoUmVhc29uIHx8IG51bGxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gU2tpcCBpbnZhbGlkIEpTT05cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBzdHJlYW0ub24oJ2VuZCcsIHJlc29sdmUpO1xuICAgICAgc3RyZWFtLm9uKCdlcnJvcicsIHJlamVjdCk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBnZXRNb2RlbHMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LmdldCgnL21vZGVscycpO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGEuZGF0YS5tYXAoKG06IGFueSkgPT4gbS5pZCkuc29ydCgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIFt0aGlzLmRlZmF1bHRNb2RlbF07XG4gICAgfVxuICB9XG59Il19
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { AIProvider, ChatCompletionOptions, ChatCompletionResponse, StreamChunk } from '../types';
|
|
2
|
+
export declare class CustomProvider implements AIProvider {
|
|
3
|
+
name: string;
|
|
4
|
+
private client;
|
|
5
|
+
private apiKey;
|
|
6
|
+
private defaultModel;
|
|
7
|
+
constructor(apiKey: string, baseUrl: string, defaultModel?: string);
|
|
8
|
+
chat(options: ChatCompletionOptions): Promise<ChatCompletionResponse>;
|
|
9
|
+
chatStream(options: ChatCompletionOptions, onChunk: (chunk: StreamChunk) => void): Promise<void>;
|
|
10
|
+
getModels(): Promise<string[]>;
|
|
11
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.CustomProvider = void 0;
|
|
7
|
+
const axios_1 = __importDefault(require("axios"));
|
|
8
|
+
class CustomProvider {
|
|
9
|
+
name = 'custom';
|
|
10
|
+
client;
|
|
11
|
+
apiKey;
|
|
12
|
+
defaultModel;
|
|
13
|
+
constructor(apiKey, baseUrl, defaultModel) {
|
|
14
|
+
this.apiKey = apiKey;
|
|
15
|
+
this.defaultModel = defaultModel || 'gpt-4o';
|
|
16
|
+
this.client = axios_1.default.create({
|
|
17
|
+
baseURL: baseUrl.endsWith('/v1') ? baseUrl : `${baseUrl}/v1`,
|
|
18
|
+
headers: {
|
|
19
|
+
'Content-Type': 'application/json',
|
|
20
|
+
'Authorization': `Bearer ${apiKey}`
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
async chat(options) {
|
|
25
|
+
const response = await this.client.post('/chat/completions', {
|
|
26
|
+
model: this.defaultModel,
|
|
27
|
+
messages: options.messages,
|
|
28
|
+
tools: options.tools,
|
|
29
|
+
tool_choice: options.toolChoice,
|
|
30
|
+
max_tokens: options.maxTokens,
|
|
31
|
+
temperature: options.temperature
|
|
32
|
+
});
|
|
33
|
+
const choice = response.data.choices[0];
|
|
34
|
+
return {
|
|
35
|
+
id: response.data.id,
|
|
36
|
+
content: choice.message.content,
|
|
37
|
+
toolCalls: choice.message.tool_calls?.map((tc) => ({
|
|
38
|
+
id: tc.id,
|
|
39
|
+
type: 'function',
|
|
40
|
+
function: {
|
|
41
|
+
name: tc.function.name,
|
|
42
|
+
arguments: tc.function.arguments
|
|
43
|
+
}
|
|
44
|
+
})),
|
|
45
|
+
finishReason: choice.finish_reason,
|
|
46
|
+
usage: response.data.usage ? {
|
|
47
|
+
promptTokens: response.data.usage.prompt_tokens,
|
|
48
|
+
completionTokens: response.data.usage.completion_tokens,
|
|
49
|
+
totalTokens: response.data.usage.total_tokens
|
|
50
|
+
} : undefined
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
async chatStream(options, onChunk) {
|
|
54
|
+
const response = await this.client.post('/chat/completions', {
|
|
55
|
+
model: this.defaultModel,
|
|
56
|
+
messages: options.messages,
|
|
57
|
+
tools: options.tools,
|
|
58
|
+
tool_choice: options.toolChoice,
|
|
59
|
+
max_tokens: options.maxTokens,
|
|
60
|
+
temperature: options.temperature,
|
|
61
|
+
stream: true
|
|
62
|
+
}, {
|
|
63
|
+
responseType: 'stream'
|
|
64
|
+
});
|
|
65
|
+
const stream = response.data;
|
|
66
|
+
let buffer = '';
|
|
67
|
+
stream.on('data', (chunk) => {
|
|
68
|
+
buffer += chunk.toString();
|
|
69
|
+
const lines = buffer.split('\n');
|
|
70
|
+
buffer = lines.pop() || '';
|
|
71
|
+
for (const line of lines) {
|
|
72
|
+
const trimmed = line.trim();
|
|
73
|
+
if (trimmed.startsWith('data: ')) {
|
|
74
|
+
const data = trimmed.slice(6);
|
|
75
|
+
if (data === '[DONE]')
|
|
76
|
+
continue;
|
|
77
|
+
try {
|
|
78
|
+
const parsed = JSON.parse(data);
|
|
79
|
+
const delta = parsed.choices[0]?.delta;
|
|
80
|
+
const finishReason = parsed.choices[0]?.finish_reason;
|
|
81
|
+
onChunk({
|
|
82
|
+
id: parsed.id,
|
|
83
|
+
delta: {
|
|
84
|
+
content: delta?.content,
|
|
85
|
+
toolCalls: delta?.tool_calls,
|
|
86
|
+
role: delta?.role
|
|
87
|
+
},
|
|
88
|
+
finishReason: finishReason || null
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
// Skip invalid JSON
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
return new Promise((resolve, reject) => {
|
|
98
|
+
stream.on('end', resolve);
|
|
99
|
+
stream.on('error', reject);
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
async getModels() {
|
|
103
|
+
try {
|
|
104
|
+
const response = await this.client.get('/models');
|
|
105
|
+
return response.data.data.map((m) => m.id).sort();
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
return [this.defaultModel];
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
exports.CustomProvider = CustomProvider;
|
|
113
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLXByb3ZpZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FpL2N1c3RvbS1wcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxrREFBNkM7QUFRN0MsTUFBYSxjQUFjO0lBQ3pCLElBQUksR0FBRyxRQUFRLENBQUM7SUFDUixNQUFNLENBQWdCO0lBQ3RCLE1BQU0sQ0FBUztJQUNmLFlBQVksQ0FBUztJQUU3QixZQUFZLE1BQWMsRUFBRSxPQUFlLEVBQUUsWUFBcUI7UUFDaEUsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLElBQUksUUFBUSxDQUFDO1FBQzdDLElBQUksQ0FBQyxNQUFNLEdBQUcsZUFBSyxDQUFDLE1BQU0sQ0FBQztZQUN6QixPQUFPLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sS0FBSztZQUM1RCxPQUFPLEVBQUU7Z0JBQ1AsY0FBYyxFQUFFLGtCQUFrQjtnQkFDbEMsZUFBZSxFQUFFLFVBQVUsTUFBTSxFQUFFO2FBQ3BDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBOEI7UUFDdkMsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtZQUMzRCxLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVk7WUFDeEIsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO1lBQzFCLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztZQUNwQixXQUFXLEVBQUUsT0FBTyxDQUFDLFVBQVU7WUFDL0IsVUFBVSxFQUFFLE9BQU8sQ0FBQyxTQUFTO1lBQzdCLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVztTQUNqQyxDQUFDLENBQUM7UUFF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LENBQUM7NEJBQ04sRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFOzRCQUNiLEtBQUssRUFBRTtnQ0FDTCxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU87Z0NBQ3ZCLFNBQVMsRUFBRSxLQUFLLEVBQUUsVUFBVTtnQ0FDNUIsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJOzZCQUNsQjs0QkFDRCxZQUFZLEVBQUUsWUFBWSxJQUFJLElBQUk7eUJBQ25DLENBQUMsQ0FBQztvQkFDTCxDQUFDO29CQUFDLE1BQU0sQ0FBQzt3QkFDUCxvQkFBb0I7b0JBQ3RCLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDckMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDMUIsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDN0IsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLFNBQVM7UUFDYixJQUFJLENBQUM7WUFDSCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2xELE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDekQsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDN0IsQ0FBQztJQUNILENBQUM7Q0FDRjtBQWxIRCx3Q0FrSEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXhpb3MsIHsgQXhpb3NJbnN0YW5jZSB9IGZyb20gJ2F4aW9zJztcbmltcG9ydCB7XG4gIEFJUHJvdmlkZXIsXG4gIENoYXRDb21wbGV0aW9uT3B0aW9ucyxcbiAgQ2hhdENvbXBsZXRpb25SZXNwb25zZSxcbiAgU3RyZWFtQ2h1bmtcbn0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgQ3VzdG9tUHJvdmlkZXIgaW1wbGVtZW50cyBBSVByb3ZpZGVyIHtcbiAgbmFtZSA9ICdjdXN0b20nO1xuICBwcml2YXRlIGNsaWVudDogQXhpb3NJbnN0YW5jZTtcbiAgcHJpdmF0ZSBhcGlLZXk6IHN0cmluZztcbiAgcHJpdmF0ZSBkZWZhdWx0TW9kZWw6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihhcGlLZXk6IHN0cmluZywgYmFzZVVybDogc3RyaW5nLCBkZWZhdWx0TW9kZWw/OiBzdHJpbmcpIHtcbiAgICB0aGlzLmFwaUtleSA9IGFwaUtleTtcbiAgICB0aGlzLmRlZmF1bHRNb2RlbCA9IGRlZmF1bHRNb2RlbCB8fCAnZ3B0LTRvJztcbiAgICB0aGlzLmNsaWVudCA9IGF4aW9zLmNyZWF0ZSh7XG4gICAgICBiYXNlVVJMOiBiYXNlVXJsLmVuZHNXaXRoKCcvdjEnKSA/IGJhc2VVcmwgOiBgJHtiYXNlVXJsfS92MWAsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICdBdXRob3JpemF0aW9uJzogYEJlYXJlciAke2FwaUtleX1gXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBjaGF0KG9wdGlvbnM6IENoYXRDb21wbGV0aW9uT3B0aW9ucyk6IFByb21pc2U8Q2hhdENvbXBsZXRpb25SZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQucG9zdCgnL2NoYXQvY29tcGxldGlvbnMnLCB7XG4gICAgICBtb2RlbDogdGhpcy5kZWZhdWx0TW9kZWwsXG4gICAgICBtZXNzYWdlczogb3B0aW9ucy5tZXNzYWdlcyxcbiAgICAgIHRvb2xzOiBvcHRpb25zLnRvb2xzLFxuICAgICAgdG9vbF9jaG9pY2U6IG9wdGlvbnMudG9vbENob2ljZSxcbiAgICAgIG1heF90b2tlbnM6IG9wdGlvbnMubWF4VG9rZW5zLFxuICAgICAgdGVtcGVyYXR1cmU6IG9wdGlvbnMudGVtcGVyYXR1cmVcbiAgICB9KTtcblxuICAgIGNvbnN0IGNob2ljZSA9IHJlc3BvbnNlLmRhdGEuY2hvaWNlc1swXTtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHJlc3BvbnNlLmRhdGEuaWQsXG4gICAgICBjb250ZW50OiBjaG9pY2UubWVzc2FnZS5jb250ZW50LFxuICAgICAgdG9vbENhbGxzOiBjaG9pY2UubWVzc2FnZS50b29sX2NhbGxzPy5tYXAoKHRjOiBhbnkpID0+ICh7XG4gICAgICAgIGlkOiB0Yy5pZCxcbiAgICAgICAgdHlwZTogJ2Z1bmN0aW9uJyBhcyBjb25zdCxcbiAgICAgICAgZnVuY3Rpb246IHtcbiAgICAgICAgICBuYW1lOiB0Yy5mdW5jdGlvbi5uYW1lLFxuICAgICAgICAgIGFyZ3VtZW50czogdGMuZnVuY3Rpb24uYXJndW1lbnRzXG4gICAgICAgIH1cbiAgICAgIH0pKSxcbiAgICAgIGZpbmlzaFJlYXNvbjogY2hvaWNlLmZpbmlzaF9yZWFzb24sXG4gICAgICB1c2FnZTogcmVzcG9uc2UuZGF0YS51c2FnZSA/IHtcbiAgICAgICAgcHJvbXB0VG9rZW5zOiByZXNwb25zZS5kYXRhLnVzYWdlLnByb21wdF90b2tlbnMsXG4gICAgICAgIGNvbXBsZXRpb25Ub2tlbnM6IHJlc3BvbnNlLmRhdGEudXNhZ2UuY29tcGxldGlvbl90b2tlbnMsXG4gICAgICAgIHRvdGFsVG9rZW5zOiByZXNwb25zZS5kYXRhLnVzYWdlLnRvdGFsX3Rva2Vuc1xuICAgICAgfSA6IHVuZGVmaW5lZFxuICAgIH07XG4gIH1cblxuICBhc3luYyBjaGF0U3RyZWFtKFxuICAgIG9wdGlvbnM6IENoYXRDb21wbGV0aW9uT3B0aW9ucyxcbiAgICBvbkNodW5rOiAoY2h1bms6IFN0cmVhbUNodW5rKSA9PiB2b2lkXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQucG9zdCgnL2NoYXQvY29tcGxldGlvbnMnLCB7XG4gICAgICBtb2RlbDogdGhpcy5kZWZhdWx0TW9kZWwsXG4gICAgICBtZXNzYWdlczogb3B0aW9ucy5tZXNzYWdlcyxcbiAgICAgIHRvb2xzOiBvcHRpb25zLnRvb2xzLFxuICAgICAgdG9vbF9jaG9pY2U6IG9wdGlvbnMudG9vbENob2ljZSxcbiAgICAgIG1heF90b2tlbnM6IG9wdGlvbnMubWF4VG9rZW5zLFxuICAgICAgdGVtcGVyYXR1cmU6IG9wdGlvbnMudGVtcGVyYXR1cmUsXG4gICAgICBzdHJlYW06IHRydWVcbiAgICB9LCB7XG4gICAgICByZXNwb25zZVR5cGU6ICdzdHJlYW0nXG4gICAgfSk7XG5cbiAgICBjb25zdCBzdHJlYW0gPSByZXNwb25zZS5kYXRhO1xuICAgIGxldCBidWZmZXIgPSAnJztcblxuICAgIHN0cmVhbS5vbignZGF0YScsIChjaHVuazogQnVmZmVyKSA9PiB7XG4gICAgICBidWZmZXIgKz0gY2h1bmsudG9TdHJpbmcoKTtcbiAgICAgIGNvbnN0IGxpbmVzID0gYnVmZmVyLnNwbGl0KCdcXG4nKTtcbiAgICAgIGJ1ZmZlciA9IGxpbmVzLnBvcCgpIHx8ICcnO1xuXG4gICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgICAgY29uc3QgdHJpbW1lZCA9IGxpbmUudHJpbSgpO1xuICAgICAgICBpZiAodHJpbW1lZC5zdGFydHNXaXRoKCdkYXRhOiAnKSkge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSB0cmltbWVkLnNsaWNlKDYpO1xuICAgICAgICAgIGlmIChkYXRhID09PSAnW0RPTkVdJykgY29udGludWU7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShkYXRhKTtcbiAgICAgICAgICAgIGNvbnN0IGRlbHRhID0gcGFyc2VkLmNob2ljZXNbMF0/LmRlbHRhO1xuICAgICAgICAgICAgY29uc3QgZmluaXNoUmVhc29uID0gcGFyc2VkLmNob2ljZXNbMF0/LmZpbmlzaF9yZWFzb247XG5cbiAgICAgICAgICAgIG9uQ2h1bmsoe1xuICAgICAgICAgICAgICBpZDogcGFyc2VkLmlkLFxuICAgICAgICAgICAgICBkZWx0YToge1xuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGRlbHRhPy5jb250ZW50LFxuICAgICAgICAgICAgICAgIHRvb2xDYWxsczogZGVsdGE/LnRvb2xfY2FsbHMsXG4gICAgICAgICAgICAgICAgcm9sZTogZGVsdGE/LnJvbGVcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZmluaXNoUmVhc29uOiBmaW5pc2hSZWFzb24gfHwgbnVsbFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBTa2lwIGludmFsaWQgSlNPTlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHN0cmVhbS5vbignZW5kJywgcmVzb2x2ZSk7XG4gICAgICBzdHJlYW0ub24oJ2Vycm9yJywgcmVqZWN0KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGdldE1vZGVscygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuZ2V0KCcvbW9kZWxzJyk7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YS5kYXRhLm1hcCgobTogYW55KSA9PiBtLmlkKS5zb3J0KCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gW3RoaXMuZGVmYXVsdE1vZGVsXTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { AuthConfig } from '../types';
|
|
2
|
+
import { AIProvider } from './openai-provider';
|
|
3
|
+
export type { AIProvider } from './openai-provider';
|
|
4
|
+
export declare function createAIProvider(auth: AuthConfig, model?: string): AIProvider;
|
|
5
|
+
export { OpenAIProvider } from './openai-provider';
|
|
6
|
+
export { CustomProvider } from './custom-provider';
|
|
7
|
+
export { ChineseProvider } from './chinese-provider';
|
package/dist/ai/index.js
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ChineseProvider = exports.CustomProvider = exports.OpenAIProvider = void 0;
|
|
4
|
+
exports.createAIProvider = createAIProvider;
|
|
5
|
+
const types_1 = require("../types");
|
|
6
|
+
const openai_provider_1 = require("./openai-provider");
|
|
7
|
+
const custom_provider_1 = require("./custom-provider");
|
|
8
|
+
const chinese_provider_1 = require("./chinese-provider");
|
|
9
|
+
function createAIProvider(auth, model) {
|
|
10
|
+
const defaultModel = model || auth.model || 'gpt-4o';
|
|
11
|
+
switch (auth.provider) {
|
|
12
|
+
case 'openai':
|
|
13
|
+
return new openai_provider_1.OpenAIProvider(auth.apiKey, auth.baseUrl, defaultModel);
|
|
14
|
+
case 'custom':
|
|
15
|
+
return new custom_provider_1.CustomProvider(auth.apiKey, auth.baseUrl || 'https://api.openai.com/v1', defaultModel);
|
|
16
|
+
// 国内模型提供商
|
|
17
|
+
case 'deepseek':
|
|
18
|
+
return new chinese_provider_1.ChineseProvider(auth.apiKey, auth.baseUrl || types_1.CHINESE_MODELS.deepseek.baseUrl, defaultModel, 'deepseek');
|
|
19
|
+
case 'qwen':
|
|
20
|
+
return new chinese_provider_1.ChineseProvider(auth.apiKey, auth.baseUrl || types_1.CHINESE_MODELS.qwen.baseUrl, defaultModel, 'qwen');
|
|
21
|
+
case 'zhipu':
|
|
22
|
+
return new chinese_provider_1.ChineseProvider(auth.apiKey, auth.baseUrl || types_1.CHINESE_MODELS.zhipu.baseUrl, defaultModel, 'zhipu');
|
|
23
|
+
case 'baichuan':
|
|
24
|
+
return new chinese_provider_1.ChineseProvider(auth.apiKey, auth.baseUrl || types_1.CHINESE_MODELS.baichuan.baseUrl, defaultModel, 'baichuan');
|
|
25
|
+
case 'yi':
|
|
26
|
+
return new chinese_provider_1.ChineseProvider(auth.apiKey, auth.baseUrl || types_1.CHINESE_MODELS.yi.baseUrl, defaultModel, 'yi');
|
|
27
|
+
case 'moonshot':
|
|
28
|
+
return new chinese_provider_1.ChineseProvider(auth.apiKey, auth.baseUrl || types_1.CHINESE_MODELS.moonshot.baseUrl, defaultModel, 'moonshot');
|
|
29
|
+
case 'siliconflow':
|
|
30
|
+
return new chinese_provider_1.ChineseProvider(auth.apiKey, auth.baseUrl || types_1.CHINESE_MODELS.siliconflow.baseUrl, defaultModel, 'siliconflow');
|
|
31
|
+
case 'oflow':
|
|
32
|
+
default:
|
|
33
|
+
return new custom_provider_1.CustomProvider(auth.apiKey, auth.baseUrl || 'https://api.openai.com/v1', defaultModel);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
var openai_provider_2 = require("./openai-provider");
|
|
37
|
+
Object.defineProperty(exports, "OpenAIProvider", { enumerable: true, get: function () { return openai_provider_2.OpenAIProvider; } });
|
|
38
|
+
var custom_provider_2 = require("./custom-provider");
|
|
39
|
+
Object.defineProperty(exports, "CustomProvider", { enumerable: true, get: function () { return custom_provider_2.CustomProvider; } });
|
|
40
|
+
var chinese_provider_2 = require("./chinese-provider");
|
|
41
|
+
Object.defineProperty(exports, "ChineseProvider", { enumerable: true, get: function () { return chinese_provider_2.ChineseProvider; } });
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWkvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBT0EsNENBdUVDO0FBOUVELG9DQUE4RjtBQUM5Rix1REFBK0Q7QUFDL0QsdURBQW1EO0FBQ25ELHlEQUFxRDtBQUlyRCxTQUFnQixnQkFBZ0IsQ0FBQyxJQUFnQixFQUFFLEtBQWM7SUFDL0QsTUFBTSxZQUFZLEdBQUcsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksUUFBUSxDQUFDO0lBRXJELFFBQVEsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3RCLEtBQUssUUFBUTtZQUNYLE9BQU8sSUFBSSxnQ0FBYyxDQUFDLElBQUksQ0FBQyxNQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztRQUV0RSxLQUFLLFFBQVE7WUFDWCxPQUFPLElBQUksZ0NBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTyxFQUFFLElBQUksQ0FBQyxPQUFPLElBQUksMkJBQTJCLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFFckcsVUFBVTtRQUNWLEtBQUssVUFBVTtZQUNiLE9BQU8sSUFBSSxrQ0FBZSxDQUN4QixJQUFJLENBQUMsTUFBTyxFQUNaLElBQUksQ0FBQyxPQUFPLElBQUksc0JBQWMsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUMvQyxZQUFZLEVBQ1osVUFBVSxDQUNYLENBQUM7UUFFSixLQUFLLE1BQU07WUFDVCxPQUFPLElBQUksa0NBQWUsQ0FDeEIsSUFBSSxDQUFDLE1BQU8sRUFDWixJQUFJLENBQUMsT0FBTyxJQUFJLHNCQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFDM0MsWUFBWSxFQUNaLE1BQU0sQ0FDUCxDQUFDO1FBRUosS0FBSyxPQUFPO1lBQ1YsT0FBTyxJQUFJLGtDQUFlLENBQ3hCLElBQUksQ0FBQyxNQUFPLEVBQ1osSUFBSSxDQUFDLE9BQU8sSUFBSSxzQkFBYyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQzVDLFlBQVksRUFDWixPQUFPLENBQ1IsQ0FBQztRQUVKLEtBQUssVUFBVTtZQUNiLE9BQU8sSUFBSSxrQ0FBZSxDQUN4QixJQUFJLENBQUMsTUFBTyxFQUNaLElBQUksQ0FBQyxPQUFPLElBQUksc0JBQWMsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUMvQyxZQUFZLEVBQ1osVUFBVSxDQUNYLENBQUM7UUFFSixLQUFLLElBQUk7WUFDUCxPQUFPLElBQUksa0NBQWUsQ0FDeEIsSUFBSSxDQUFDLE1BQU8sRUFDWixJQUFJLENBQUMsT0FBTyxJQUFJLHNCQUFjLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFDekMsWUFBWSxFQUNaLElBQUksQ0FDTCxDQUFDO1FBRUosS0FBSyxVQUFVO1lBQ2IsT0FBTyxJQUFJLGtDQUFlLENBQ3hCLElBQUksQ0FBQyxNQUFPLEVBQ1osSUFBSSxDQUFDLE9BQU8sSUFBSSxzQkFBYyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQy9DLFlBQVksRUFDWixVQUFVLENBQ1gsQ0FBQztRQUVKLEtBQUssYUFBYTtZQUNoQixPQUFPLElBQUksa0NBQWUsQ0FDeEIsSUFBSSxDQUFDLE1BQU8sRUFDWixJQUFJLENBQUMsT0FBTyxJQUFJLHNCQUFjLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFDbEQsWUFBWSxFQUNaLGFBQWEsQ0FDZCxDQUFDO1FBRUosS0FBSyxPQUFPLENBQUM7UUFDYjtZQUNFLE9BQU8sSUFBSSxnQ0FBYyxDQUFDLElBQUksQ0FBQyxNQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sSUFBSSwyQkFBMkIsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUN2RyxDQUFDO0FBQ0gsQ0FBQztBQUVELHFEQUFtRDtBQUExQyxpSEFBQSxjQUFjLE9BQUE7QUFDdkIscURBQW1EO0FBQTFDLGlIQUFBLGNBQWMsT0FBQTtBQUN2Qix1REFBcUQ7QUFBNUMsbUhBQUEsZUFBZSxPQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXV0aENvbmZpZywgQ0hJTkVTRV9NT0RFTFMsIENoaW5lc2VQcm92aWRlciBhcyBDaGluZXNlUHJvdmlkZXJUeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgQUlQcm92aWRlciwgT3BlbkFJUHJvdmlkZXIgfSBmcm9tICcuL29wZW5haS1wcm92aWRlcic7XG5pbXBvcnQgeyBDdXN0b21Qcm92aWRlciB9IGZyb20gJy4vY3VzdG9tLXByb3ZpZGVyJztcbmltcG9ydCB7IENoaW5lc2VQcm92aWRlciB9IGZyb20gJy4vY2hpbmVzZS1wcm92aWRlcic7XG5cbmV4cG9ydCB0eXBlIHsgQUlQcm92aWRlciB9IGZyb20gJy4vb3BlbmFpLXByb3ZpZGVyJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFJUHJvdmlkZXIoYXV0aDogQXV0aENvbmZpZywgbW9kZWw/OiBzdHJpbmcpOiBBSVByb3ZpZGVyIHtcbiAgY29uc3QgZGVmYXVsdE1vZGVsID0gbW9kZWwgfHwgYXV0aC5tb2RlbCB8fCAnZ3B0LTRvJztcblxuICBzd2l0Y2ggKGF1dGgucHJvdmlkZXIpIHtcbiAgICBjYXNlICdvcGVuYWknOlxuICAgICAgcmV0dXJuIG5ldyBPcGVuQUlQcm92aWRlcihhdXRoLmFwaUtleSEsIGF1dGguYmFzZVVybCwgZGVmYXVsdE1vZGVsKTtcbiAgICBcbiAgICBjYXNlICdjdXN0b20nOlxuICAgICAgcmV0dXJuIG5ldyBDdXN0b21Qcm92aWRlcihhdXRoLmFwaUtleSEsIGF1dGguYmFzZVVybCB8fCAnaHR0cHM6Ly9hcGkub3BlbmFpLmNvbS92MScsIGRlZmF1bHRNb2RlbCk7XG4gICAgXG4gICAgLy8g5Zu95YaF5qih5Z6L5o+Q5L6b5ZWGXG4gICAgY2FzZSAnZGVlcHNlZWsnOlxuICAgICAgcmV0dXJuIG5ldyBDaGluZXNlUHJvdmlkZXIoXG4gICAgICAgIGF1dGguYXBpS2V5ISwgXG4gICAgICAgIGF1dGguYmFzZVVybCB8fCBDSElORVNFX01PREVMUy5kZWVwc2Vlay5iYXNlVXJsLFxuICAgICAgICBkZWZhdWx0TW9kZWwsXG4gICAgICAgICdkZWVwc2VlaydcbiAgICAgICk7XG4gICAgXG4gICAgY2FzZSAncXdlbic6XG4gICAgICByZXR1cm4gbmV3IENoaW5lc2VQcm92aWRlcihcbiAgICAgICAgYXV0aC5hcGlLZXkhLCBcbiAgICAgICAgYXV0aC5iYXNlVXJsIHx8IENISU5FU0VfTU9ERUxTLnF3ZW4uYmFzZVVybCxcbiAgICAgICAgZGVmYXVsdE1vZGVsLFxuICAgICAgICAncXdlbidcbiAgICAgICk7XG4gICAgXG4gICAgY2FzZSAnemhpcHUnOlxuICAgICAgcmV0dXJuIG5ldyBDaGluZXNlUHJvdmlkZXIoXG4gICAgICAgIGF1dGguYXBpS2V5ISwgXG4gICAgICAgIGF1dGguYmFzZVVybCB8fCBDSElORVNFX01PREVMUy56aGlwdS5iYXNlVXJsLFxuICAgICAgICBkZWZhdWx0TW9kZWwsXG4gICAgICAgICd6aGlwdSdcbiAgICAgICk7XG4gICAgXG4gICAgY2FzZSAnYmFpY2h1YW4nOlxuICAgICAgcmV0dXJuIG5ldyBDaGluZXNlUHJvdmlkZXIoXG4gICAgICAgIGF1dGguYXBpS2V5ISwgXG4gICAgICAgIGF1dGguYmFzZVVybCB8fCBDSElORVNFX01PREVMUy5iYWljaHVhbi5iYXNlVXJsLFxuICAgICAgICBkZWZhdWx0TW9kZWwsXG4gICAgICAgICdiYWljaHVhbidcbiAgICAgICk7XG4gICAgXG4gICAgY2FzZSAneWknOlxuICAgICAgcmV0dXJuIG5ldyBDaGluZXNlUHJvdmlkZXIoXG4gICAgICAgIGF1dGguYXBpS2V5ISwgXG4gICAgICAgIGF1dGguYmFzZVVybCB8fCBDSElORVNFX01PREVMUy55aS5iYXNlVXJsLFxuICAgICAgICBkZWZhdWx0TW9kZWwsXG4gICAgICAgICd5aSdcbiAgICAgICk7XG4gICAgXG4gICAgY2FzZSAnbW9vbnNob3QnOlxuICAgICAgcmV0dXJuIG5ldyBDaGluZXNlUHJvdmlkZXIoXG4gICAgICAgIGF1dGguYXBpS2V5ISwgXG4gICAgICAgIGF1dGguYmFzZVVybCB8fCBDSElORVNFX01PREVMUy5tb29uc2hvdC5iYXNlVXJsLFxuICAgICAgICBkZWZhdWx0TW9kZWwsXG4gICAgICAgICdtb29uc2hvdCdcbiAgICAgICk7XG4gICAgXG4gICAgY2FzZSAnc2lsaWNvbmZsb3cnOlxuICAgICAgcmV0dXJuIG5ldyBDaGluZXNlUHJvdmlkZXIoXG4gICAgICAgIGF1dGguYXBpS2V5ISwgXG4gICAgICAgIGF1dGguYmFzZVVybCB8fCBDSElORVNFX01PREVMUy5zaWxpY29uZmxvdy5iYXNlVXJsLFxuICAgICAgICBkZWZhdWx0TW9kZWwsXG4gICAgICAgICdzaWxpY29uZmxvdydcbiAgICAgICk7XG4gICAgXG4gICAgY2FzZSAnb2Zsb3cnOlxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbmV3IEN1c3RvbVByb3ZpZGVyKGF1dGguYXBpS2V5ISwgYXV0aC5iYXNlVXJsIHx8ICdodHRwczovL2FwaS5vcGVuYWkuY29tL3YxJywgZGVmYXVsdE1vZGVsKTtcbiAgfVxufVxuXG5leHBvcnQgeyBPcGVuQUlQcm92aWRlciB9IGZyb20gJy4vb3BlbmFpLXByb3ZpZGVyJztcbmV4cG9ydCB7IEN1c3RvbVByb3ZpZGVyIH0gZnJvbSAnLi9jdXN0b20tcHJvdmlkZXInO1xuZXhwb3J0IHsgQ2hpbmVzZVByb3ZpZGVyIH0gZnJvbSAnLi9jaGluZXNlLXByb3ZpZGVyJzsiXX0=
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { ChatCompletionOptions, ChatCompletionResponse, StreamChunk } from '../types';
|
|
2
|
+
export interface AIProvider {
|
|
3
|
+
name: string;
|
|
4
|
+
chat(options: ChatCompletionOptions): Promise<ChatCompletionResponse>;
|
|
5
|
+
chatStream(options: ChatCompletionOptions, onChunk: (chunk: StreamChunk) => void): Promise<void>;
|
|
6
|
+
getModels(): Promise<string[]>;
|
|
7
|
+
}
|
|
8
|
+
export declare class OpenAIProvider implements AIProvider {
|
|
9
|
+
name: string;
|
|
10
|
+
private client;
|
|
11
|
+
private defaultModel;
|
|
12
|
+
private models;
|
|
13
|
+
constructor(apiKey: string, baseUrl?: string, defaultModel?: string);
|
|
14
|
+
chat(options: ChatCompletionOptions): Promise<ChatCompletionResponse>;
|
|
15
|
+
chatStream(options: ChatCompletionOptions, onChunk: (chunk: StreamChunk) => void): Promise<void>;
|
|
16
|
+
getModels(): Promise<string[]>;
|
|
17
|
+
private convertMessages;
|
|
18
|
+
}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.OpenAIProvider = void 0;
|
|
7
|
+
const openai_1 = __importDefault(require("openai"));
|
|
8
|
+
class OpenAIProvider {
|
|
9
|
+
name = 'openai';
|
|
10
|
+
client;
|
|
11
|
+
defaultModel;
|
|
12
|
+
models = [
|
|
13
|
+
'gpt-4o',
|
|
14
|
+
'gpt-4o-mini',
|
|
15
|
+
'gpt-4-turbo',
|
|
16
|
+
'gpt-4',
|
|
17
|
+
'gpt-3.5-turbo',
|
|
18
|
+
'o1-preview',
|
|
19
|
+
'o1-mini'
|
|
20
|
+
];
|
|
21
|
+
constructor(apiKey, baseUrl, defaultModel) {
|
|
22
|
+
this.client = new openai_1.default({
|
|
23
|
+
apiKey,
|
|
24
|
+
baseURL: baseUrl || 'https://api.openai.com/v1'
|
|
25
|
+
});
|
|
26
|
+
this.defaultModel = defaultModel || 'gpt-4o';
|
|
27
|
+
}
|
|
28
|
+
async chat(options) {
|
|
29
|
+
const response = await this.client.chat.completions.create({
|
|
30
|
+
model: this.defaultModel,
|
|
31
|
+
messages: this.convertMessages(options.messages),
|
|
32
|
+
tools: options.tools,
|
|
33
|
+
tool_choice: options.toolChoice,
|
|
34
|
+
max_tokens: options.maxTokens,
|
|
35
|
+
temperature: options.temperature
|
|
36
|
+
});
|
|
37
|
+
const choice = response.choices[0];
|
|
38
|
+
return {
|
|
39
|
+
id: response.id,
|
|
40
|
+
content: choice.message.content,
|
|
41
|
+
toolCalls: choice.message.tool_calls?.map(tc => ({
|
|
42
|
+
id: tc.id,
|
|
43
|
+
type: 'function',
|
|
44
|
+
function: {
|
|
45
|
+
name: tc.function.name,
|
|
46
|
+
arguments: tc.function.arguments
|
|
47
|
+
}
|
|
48
|
+
})),
|
|
49
|
+
finishReason: choice.finish_reason,
|
|
50
|
+
usage: response.usage ? {
|
|
51
|
+
promptTokens: response.usage.prompt_tokens,
|
|
52
|
+
completionTokens: response.usage.completion_tokens,
|
|
53
|
+
totalTokens: response.usage.total_tokens
|
|
54
|
+
} : undefined
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
async chatStream(options, onChunk) {
|
|
58
|
+
const stream = await this.client.chat.completions.create({
|
|
59
|
+
model: this.defaultModel,
|
|
60
|
+
messages: this.convertMessages(options.messages),
|
|
61
|
+
tools: options.tools,
|
|
62
|
+
tool_choice: options.toolChoice,
|
|
63
|
+
max_tokens: options.maxTokens,
|
|
64
|
+
temperature: options.temperature,
|
|
65
|
+
stream: true
|
|
66
|
+
});
|
|
67
|
+
let currentToolCalls = new Map();
|
|
68
|
+
for await (const chunk of stream) {
|
|
69
|
+
const delta = chunk.choices[0]?.delta;
|
|
70
|
+
const finishReason = chunk.choices[0]?.finish_reason;
|
|
71
|
+
// Handle tool calls streaming
|
|
72
|
+
if (delta?.tool_calls) {
|
|
73
|
+
for (const tc of delta.tool_calls) {
|
|
74
|
+
const index = tc.index;
|
|
75
|
+
if (!currentToolCalls.has(index)) {
|
|
76
|
+
currentToolCalls.set(index, {
|
|
77
|
+
id: tc.id || '',
|
|
78
|
+
type: 'function',
|
|
79
|
+
function: { name: '', arguments: '' }
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
const current = currentToolCalls.get(index);
|
|
83
|
+
if (tc.id)
|
|
84
|
+
current.id = tc.id;
|
|
85
|
+
if (tc.function?.name)
|
|
86
|
+
current.function.name = tc.function.name;
|
|
87
|
+
if (tc.function?.arguments)
|
|
88
|
+
current.function.arguments += tc.function.arguments;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
onChunk({
|
|
92
|
+
id: chunk.id,
|
|
93
|
+
delta: {
|
|
94
|
+
content: delta?.content ?? undefined,
|
|
95
|
+
toolCalls: Array.from(currentToolCalls.values()),
|
|
96
|
+
role: delta?.role
|
|
97
|
+
},
|
|
98
|
+
finishReason: finishReason || null
|
|
99
|
+
});
|
|
100
|
+
if (finishReason) {
|
|
101
|
+
currentToolCalls.clear();
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
async getModels() {
|
|
106
|
+
try {
|
|
107
|
+
const response = await this.client.models.list();
|
|
108
|
+
return response.data
|
|
109
|
+
.filter(m => m.id.includes('gpt') || m.id.includes('o1'))
|
|
110
|
+
.map(m => m.id)
|
|
111
|
+
.sort();
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
return this.models;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
convertMessages(messages) {
|
|
118
|
+
return messages.map(msg => {
|
|
119
|
+
if (msg.role === 'system') {
|
|
120
|
+
return { role: 'system', content: msg.content };
|
|
121
|
+
}
|
|
122
|
+
if (msg.role === 'user') {
|
|
123
|
+
if (Array.isArray(msg.content)) {
|
|
124
|
+
return {
|
|
125
|
+
role: 'user',
|
|
126
|
+
content: msg.content.map(c => {
|
|
127
|
+
if (c.type === 'text')
|
|
128
|
+
return { type: 'text', text: c.text };
|
|
129
|
+
return { type: 'image_url', image_url: { url: c.imageUrl.url } };
|
|
130
|
+
})
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
return { role: 'user', content: msg.content };
|
|
134
|
+
}
|
|
135
|
+
if (msg.role === 'assistant') {
|
|
136
|
+
return {
|
|
137
|
+
role: 'assistant',
|
|
138
|
+
content: msg.content,
|
|
139
|
+
tool_calls: msg.toolCalls?.map(tc => ({
|
|
140
|
+
id: tc.id,
|
|
141
|
+
type: 'function',
|
|
142
|
+
function: {
|
|
143
|
+
name: tc.function.name,
|
|
144
|
+
arguments: tc.function.arguments
|
|
145
|
+
}
|
|
146
|
+
}))
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
if (msg.role === 'tool') {
|
|
150
|
+
return {
|
|
151
|
+
role: 'tool',
|
|
152
|
+
tool_call_id: msg.toolCallId,
|
|
153
|
+
content: msg.content
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
return { role: msg.role, content: msg.content };
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
exports.OpenAIProvider = OpenAIProvider;
|
|
161
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLXByb3ZpZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FpL29wZW5haS1wcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxvREFBNEI7QUFlNUIsTUFBYSxjQUFjO0lBQ3pCLElBQUksR0FBRyxRQUFRLENBQUM7SUFDUixNQUFNLENBQVM7SUFDZixZQUFZLENBQVM7SUFDckIsTUFBTSxHQUFhO1FBQ3pCLFFBQVE7UUFDUixhQUFhO1FBQ2IsYUFBYTtRQUNiLE9BQU87UUFDUCxlQUFlO1FBQ2YsWUFBWTtRQUNaLFNBQVM7S0FDVixDQUFDO0lBRUYsWUFBWSxNQUFjLEVBQUUsT0FBZ0IsRUFBRSxZQUFxQjtRQUNqRSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksZ0JBQU0sQ0FBQztZQUN2QixNQUFNO1lBQ04sT0FBTyxFQUFFLE9BQU8sSUFBSSwyQkFBMkI7U0FDaEQsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLElBQUksUUFBUSxDQUFDO0lBQy9DLENBQUM7SUFFRCxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQThCO1FBQ3ZDLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQztZQUN6RCxLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVk7WUFDeEIsUUFBUSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztZQUNoRCxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUs7WUFDcEIsV0FBVyxFQUFFLE9BQU8sQ0FBQyxVQUFVO1lBQy9CLFVBQVUsRUFBRSxPQUFPLENBQUMsU0FBUztZQUM3QixXQUFXLEVBQUUsT0FBTyxDQUFDLFdBQVc7U0FDakMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNu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QkFDcEMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFO3dCQUNULElBQUksRUFBRSxVQUFtQjt3QkFDekIsUUFBUSxFQUFFOzRCQUNSLElBQUksRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUk7NEJBQ3RCLFNBQVMsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLFNBQVM7eUJBQ2pDO3FCQUNGLENBQUMsQ0FBQztpQkFDSixDQUFDO1lBQ0osQ0FBQztZQUNELElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQztnQkFDeEIsT0FBTztvQkFDTCxJQUFJLEVBQUUsTUFBTTtvQkFDWixZQUFZLEVBQUUsR0FBRyxDQUFDLFVBQVc7b0JBQzdCLE9BQU8sRUFBRSxHQUFHLENBQUMsT0FBaUI7aUJBQy9CLENBQUM7WUFDSixDQUFDO1lBQ0QsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsT0FBaUIsRUFBRSxDQUFDO1FBQzVELENBQUMsQ0FBd0MsQ0FBQztJQUM1QyxDQUFDO0NBQ0Y7QUFoS0Qsd0NBZ0tDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IE9wZW5BSSBmcm9tICdvcGVuYWknO1xuaW1wb3J0IHtcbiAgQ2hhdENvbXBsZXRpb25PcHRpb25zLFxuICBDaGF0Q29tcGxldGlvblJlc3BvbnNlLFxuICBTdHJlYW1DaHVuayxcbiAgVG9vbENhbGxcbn0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFJUHJvdmlkZXIge1xuICBuYW1lOiBzdHJpbmc7XG4gIGNoYXQob3B0aW9uczogQ2hhdENvbXBsZXRpb25PcHRpb25zKTogUHJvbWlzZTxDaGF0Q29tcGxldGlvblJlc3BvbnNlPjtcbiAgY2hhdFN0cmVhbShvcHRpb25zOiBDaGF0Q29tcGxldGlvbk9wdGlvbnMsIG9uQ2h1bms6IChjaHVuazogU3RyZWFtQ2h1bmspID0+IHZvaWQpOiBQcm9taXNlPHZvaWQ+O1xuICBnZXRNb2RlbHMoKTogUHJvbWlzZTxzdHJpbmdbXT47XG59XG5cbmV4cG9ydCBjbGFzcyBPcGVuQUlQcm92aWRlciBpbXBsZW1lbnRzIEFJUHJvdmlkZXIge1xuICBuYW1lID0gJ29wZW5haSc7XG4gIHByaXZhdGUgY2xpZW50OiBPcGVuQUk7XG4gIHByaXZhdGUgZGVmYXVsdE1vZGVsOiBzdHJpbmc7XG4gIHByaXZhdGUgbW9kZWxzOiBzdHJpbmdbXSA9IFtcbiAgICAnZ3B0LTRvJyxcbiAgICAnZ3B0LTRvLW1pbmknLFxuICAgICdncHQtNC10dXJibycsXG4gICAgJ2dwdC00JyxcbiAgICAnZ3B0LTMuNS10dXJibycsXG4gICAgJ28xLXByZXZpZXcnLFxuICAgICdvMS1taW5pJ1xuICBdO1xuXG4gIGNvbnN0cnVjdG9yKGFwaUtleTogc3RyaW5nLCBiYXNlVXJsPzogc3RyaW5nLCBkZWZhdWx0TW9kZWw/OiBzdHJpbmcpIHtcbiAgICB0aGlzLmNsaWVudCA9IG5ldyBPcGVuQUkoe1xuICAgICAgYXBpS2V5LFxuICAgICAgYmFzZVVSTDogYmFzZVVybCB8fCAnaHR0cHM6Ly9hcGkub3BlbmFpLmNvbS92MSdcbiAgICB9KTtcbiAgICB0aGlzLmRlZmF1bHRNb2RlbCA9IGRlZmF1bHRNb2RlbCB8fCAnZ3B0LTRvJztcbiAgfVxuXG4gIGFzeW5jIGNoYXQob3B0aW9uczogQ2hhdENvbXBsZXRpb25PcHRpb25zKTogUHJvbWlzZTxDaGF0Q29tcGxldGlvblJlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5jaGF0LmNvbXBsZXRpb25zLmNyZWF0ZSh7XG4gICAgICBtb2RlbDogdGhpcy5kZWZhdWx0TW9kZWwsXG4gICAgICBtZXNzYWdlczogdGhpcy5jb252ZXJ0TWVzc2FnZXMob3B0aW9ucy5tZXNzYWdlcyksXG4gICAgICB0b29sczogb3B0aW9ucy50b29scyxcbiAgICAgIHRvb2xfY2hvaWNlOiBvcHRpb25zLnRvb2xDaG9pY2UsXG4gICAgICBtYXhfdG9rZW5zOiBvcHRpb25zLm1heFRva2VucyxcbiAgICAgIHRlbXBlcmF0dXJlOiBvcHRpb25zLnRlbXBlcmF0dXJlXG4gICAgfSk7XG5cbiAgICBjb25zdCBjaG9pY2UgPSByZXNwb25zZS5jaG9pY2VzWzBdO1xuICAgIHJldHVybiB7XG4gICAgICBpZDogcmVzcG9uc2UuaWQsXG4gICAgICBjb250ZW50OiBjaG9pY2UubWVzc2FnZS5jb250ZW50LFxuICAgICAgdG9vbENhbGxzOiBjaG9pY2UubWVzc2FnZS50b29sX2NhbGxzPy5tYXAodGMgPT4gKHtcbiAgICAgICAgaWQ6IHRjLmlkLFxuICAgICAgICB0eXBlOiAnZnVuY3Rpb24nIGFzIGNvbnN0LFxuICAgICAgICBmdW5jdGlvbjoge1xuICAgICAgICAgIG5hbWU6IHRjLmZ1bmN0aW9uLm5hbWUsXG4gICAgICAgICAgYXJndW1lbnRzOiB0Yy5mdW5jdGlvbi5hcmd1bWVudHNcbiAgICAgICAgfVxuICAgICAgfSkpLFxuICAgICAgZmluaXNoUmVhc29uOiBjaG9pY2UuZmluaXNoX3JlYXNvbixcbiAgICAgIHVzYWdlOiByZXNwb25zZS51c2FnZSA/IHtcbiAgICAgICAgcHJvbXB0VG9rZW5zOiByZXNwb25zZS51c2FnZS5wcm9tcHRfdG9rZW5zLFxuICAgICAgICBjb21wbGV0aW9uVG9rZW5zOiByZXNwb25zZS51c2FnZS5jb21wbGV0aW9uX3Rva2VucyxcbiAgICAgICAgdG90YWxUb2tlbnM6IHJlc3BvbnNlLnVzYWdlLnRvdGFsX3Rva2Vuc1xuICAgICAgfSA6IHVuZGVmaW5lZFxuICAgIH07XG4gIH1cblxuICBhc3luYyBjaGF0U3RyZWFtKFxuICAgIG9wdGlvbnM6IENoYXRDb21wbGV0aW9uT3B0aW9ucyxcbiAgICBvbkNodW5rOiAoY2h1bms6IFN0cmVhbUNodW5rKSA9PiB2b2lkXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHN0cmVhbSA9IGF3YWl0IHRoaXMuY2xpZW50LmNoYXQuY29tcGxldGlvbnMuY3JlYXRlKHtcbiAgICAgIG1vZGVsOiB0aGlzLmRlZmF1bHRNb2RlbCxcbiAgICAgIG1lc3NhZ2VzOiB0aGlzLmNvbnZlcnRNZXNzYWdlcyhvcHRpb25zLm1lc3NhZ2VzKSxcbiAgICAgIHRvb2xzOiBvcHRpb25zLnRvb2xzLFxuICAgICAgdG9vbF9jaG9pY2U6IG9wdGlvbnMudG9vbENob2ljZSxcbiAgICAgIG1heF90b2tlbnM6IG9wdGlvbnMubWF4VG9rZW5zLFxuICAgICAgdGVtcGVyYXR1cmU6IG9wdGlvbnMudGVtcGVyYXR1cmUsXG4gICAgICBzdHJlYW06IHRydWVcbiAgICB9KTtcblxuICAgIGxldCBjdXJyZW50VG9vbENhbGxzOiBNYXA8bnVtYmVyLCBQYXJ0aWFsPFRvb2xDYWxsPj4gPSBuZXcgTWFwKCk7XG5cbiAgICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIHN0cmVhbSkge1xuICAgICAgY29uc3QgZGVsdGEgPSBjaHVuay5jaG9pY2VzWzBdPy5kZWx0YTtcbiAgICAgIGNvbnN0IGZpbmlzaFJlYXNvbiA9IGNodW5rLmNob2ljZXNbMF0/LmZpbmlzaF9yZWFzb247XG5cbiAgICAgIC8vIEhhbmRsZSB0b29sIGNhbGxzIHN0cmVhbWluZ1xuICAgICAgaWYgKGRlbHRhPy50b29sX2NhbGxzKSB7XG4gICAgICAgIGZvciAoY29uc3QgdGMgb2YgZGVsdGEudG9vbF9jYWxscykge1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGMuaW5kZXg7XG4gICAgICAgICAgaWYgKCFjdXJyZW50VG9vbENhbGxzLmhhcyhpbmRleCkpIHtcbiAgICAgICAgICAgIGN1cnJlbnRUb29sQ2FsbHMuc2V0KGluZGV4LCB7XG4gICAgICAgICAgICAgIGlkOiB0Yy5pZCB8fCAnJyxcbiAgICAgICAgICAgICAgdHlwZTogJ2Z1bmN0aW9uJyxcbiAgICAgICAgICAgICAgZnVuY3Rpb246IHsgbmFtZTogJycsIGFyZ3VtZW50czogJycgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSBjdXJyZW50VG9vbENhbGxzLmdldChpbmRleCkhO1xuICAgICAgICAgIGlmICh0Yy5pZCkgY3VycmVudC5pZCA9IHRjLmlkO1xuICAgICAgICAgIGlmICh0Yy5mdW5jdGlvbj8ubmFtZSkgY3VycmVudC5mdW5jdGlvbiEubmFtZSA9IHRjLmZ1bmN0aW9uLm5hbWU7XG4gICAgICAgICAgaWYgKHRjLmZ1bmN0aW9uPy5hcmd1bWVudHMpIGN1cnJlbnQuZnVuY3Rpb24hLmFyZ3VtZW50cyArPSB0Yy5mdW5jdGlvbi5hcmd1bWVudHM7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgb25DaHVuayh7XG4gICAgICAgIGlkOiBjaHVuay5pZCxcbiAgICAgICAgZGVsdGE6IHtcbiAgICAgICAgICBjb250ZW50OiBkZWx0YT8uY29udGVudCA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgdG9vbENhbGxzOiBBcnJheS5mcm9tKGN1cnJlbnRUb29sQ2FsbHMudmFsdWVzKCkpLFxuICAgICAgICAgIHJvbGU6IGRlbHRhPy5yb2xlXG4gICAgICAgIH0sXG4gICAgICAgIGZpbmlzaFJlYXNvbjogZmluaXNoUmVhc29uIHx8IG51bGxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZmluaXNoUmVhc29uKSB7XG4gICAgICAgIGN1cnJlbnRUb29sQ2FsbHMuY2xlYXIoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXRNb2RlbHMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50Lm1vZGVscy5saXN0KCk7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YVxuICAgICAgICAuZmlsdGVyKG0gPT4gbS5pZC5pbmNsdWRlcygnZ3B0JykgfHwgbS5pZC5pbmNsdWRlcygnbzEnKSlcbiAgICAgICAgLm1hcChtID0+IG0uaWQpXG4gICAgICAgIC5zb3J0KCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdGhpcy5tb2RlbHM7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0TWVzc2FnZXMobWVzc2FnZXM6IENoYXRDb21wbGV0aW9uT3B0aW9uc1snbWVzc2FnZXMnXSk6IE9wZW5BSS5DaGF0Q29tcGxldGlvbk1lc3NhZ2VQYXJhbVtdIHtcbiAgICByZXR1cm4gbWVzc2FnZXMubWFwKG1zZyA9PiB7XG4gICAgICBpZiAobXNnLnJvbGUgPT09ICdzeXN0ZW0nKSB7XG4gICAgICAgIHJldHVybiB7IHJvbGU6ICdzeXN0ZW0nLCBjb250ZW50OiBtc2cuY29udGVudCBhcyBzdHJpbmcgfTtcbiAgICAgIH1cbiAgICAgIGlmIChtc2cucm9sZSA9PT0gJ3VzZXInKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG1zZy5jb250ZW50KSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByb2xlOiAndXNlcicsXG4gICAgICAgICAgICBjb250ZW50OiBtc2cuY29udGVudC5tYXAoYyA9PiB7XG4gICAgICAgICAgICAgIGlmIChjLnR5cGUgPT09ICd0ZXh0JykgcmV0dXJuIHsgdHlwZTogJ3RleHQnLCB0ZXh0OiBjLnRleHQgfTtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgdHlwZTogJ2ltYWdlX3VybCcsIGltYWdlX3VybDogeyB1cmw6IGMuaW1hZ2VVcmwhLnVybCB9IH07XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgcm9sZTogJ3VzZXInLCBjb250ZW50OiBtc2cuY29udGVudCBhcyBzdHJpbmcgfTtcbiAgICAgIH1cbiAgICAgIGlmIChtc2cucm9sZSA9PT0gJ2Fzc2lzdGFudCcpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByb2xlOiAnYXNzaXN0YW50JyxcbiAgICAgICAgICBjb250ZW50OiBtc2cuY29udGVudCBhcyBzdHJpbmcsXG4gICAgICAgICAgdG9vbF9jYWxsczogbXNnLnRvb2xDYWxscz8ubWFwKHRjID0+ICh7XG4gICAgICAgICAgICBpZDogdGMuaWQsXG4gICAgICAgICAgICB0eXBlOiAnZnVuY3Rpb24nIGFzIGNvbnN0LFxuICAgICAgICAgICAgZnVuY3Rpb246IHtcbiAgICAgICAgICAgICAgbmFtZTogdGMuZnVuY3Rpb24ubmFtZSxcbiAgICAgICAgICAgICAgYXJndW1lbnRzOiB0Yy5mdW5jdGlvbi5hcmd1bWVudHNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSlcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChtc2cucm9sZSA9PT0gJ3Rvb2wnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcm9sZTogJ3Rvb2wnLFxuICAgICAgICAgIHRvb2xfY2FsbF9pZDogbXNnLnRvb2xDYWxsSWQhLFxuICAgICAgICAgIGNvbnRlbnQ6IG1zZy5jb250ZW50IGFzIHN0cmluZ1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgcm9sZTogbXNnLnJvbGUsIGNvbnRlbnQ6IG1zZy5jb250ZW50IGFzIHN0cmluZyB9O1xuICAgIH0pIGFzIE9wZW5BSS5DaGF0Q29tcGxldGlvbk1lc3NhZ2VQYXJhbVtdO1xuICB9XG59XG4iXX0=
|