@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.
Files changed (59) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +81 -0
  3. package/dist/agents/index.d.ts +35 -0
  4. package/dist/agents/index.js +233 -0
  5. package/dist/ai/chinese-provider.d.ts +146 -0
  6. package/dist/ai/chinese-provider.js +193 -0
  7. package/dist/ai/custom-provider.d.ts +11 -0
  8. package/dist/ai/custom-provider.js +113 -0
  9. package/dist/ai/index.d.ts +7 -0
  10. package/dist/ai/index.js +42 -0
  11. package/dist/ai/openai-provider.d.ts +18 -0
  12. package/dist/ai/openai-provider.js +161 -0
  13. package/dist/config/index.d.ts +20 -0
  14. package/dist/config/index.js +83 -0
  15. package/dist/conversation.d.ts +26 -0
  16. package/dist/conversation.js +126 -0
  17. package/dist/index.d.ts +10 -0
  18. package/dist/index.js +72 -0
  19. package/dist/mcp/index.d.ts +48 -0
  20. package/dist/mcp/index.js +175 -0
  21. package/dist/sandbox/index.d.ts +31 -0
  22. package/dist/sandbox/index.js +197 -0
  23. package/dist/skills/index.d.ts +16 -0
  24. package/dist/skills/index.js +169 -0
  25. package/dist/tools/ask-user-question.d.ts +62 -0
  26. package/dist/tools/ask-user-question.js +71 -0
  27. package/dist/tools/base.d.ts +16 -0
  28. package/dist/tools/base.js +39 -0
  29. package/dist/tools/glob.d.ts +27 -0
  30. package/dist/tools/glob.js +125 -0
  31. package/dist/tools/image-read.d.ts +42 -0
  32. package/dist/tools/image-read.js +125 -0
  33. package/dist/tools/index.d.ts +27 -0
  34. package/dist/tools/index.js +127 -0
  35. package/dist/tools/list-directory.d.ts +28 -0
  36. package/dist/tools/list-directory.js +94 -0
  37. package/dist/tools/pdf-extract.d.ts +32 -0
  38. package/dist/tools/pdf-extract.js +130 -0
  39. package/dist/tools/read-file.d.ts +31 -0
  40. package/dist/tools/read-file.js +116 -0
  41. package/dist/tools/replace.d.ts +35 -0
  42. package/dist/tools/replace.js +93 -0
  43. package/dist/tools/run-shell-command.d.ts +35 -0
  44. package/dist/tools/run-shell-command.js +81 -0
  45. package/dist/tools/save-memory.d.ts +22 -0
  46. package/dist/tools/save-memory.js +91 -0
  47. package/dist/tools/search-file-content.d.ts +42 -0
  48. package/dist/tools/search-file-content.js +153 -0
  49. package/dist/tools/task.d.ts +46 -0
  50. package/dist/tools/task.js +54 -0
  51. package/dist/tools/web-fetch.d.ts +26 -0
  52. package/dist/tools/web-fetch.js +81 -0
  53. package/dist/tools/web-search.d.ts +35 -0
  54. package/dist/tools/web-search.js +86 -0
  55. package/dist/tools/write-file.d.ts +25 -0
  56. package/dist/tools/write-file.js +76 -0
  57. package/dist/types/index.d.ts +166 -0
  58. package/dist/types/index.js +43 -0
  59. 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLXByb3ZpZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FpL2N1c3RvbS1wcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxrREFBNkM7QUFRN0MsTUFBYSxjQUFjO0lBQ3pCLElBQUksR0FBRyxRQUFRLENBQUM7SUFDUixNQUFNLENBQWdCO0lBQ3RCLE1BQU0sQ0FBUztJQUNmLFlBQVksQ0FBUztJQUU3QixZQUFZLE1BQWMsRUFBRSxPQUFlLEVBQUUsWUFBcUI7UUFDaEUsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLElBQUksUUFBUSxDQUFDO1FBQzdDLElBQUksQ0FBQyxNQUFNLEdBQUcsZUFBSyxDQUFDLE1BQU0sQ0FBQztZQUN6QixPQUFPLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sS0FBSztZQUM1RCxPQUFPLEVBQUU7Z0JBQ1AsY0FBYyxFQUFFLGtCQUFrQjtnQkFDbEMsZUFBZSxFQUFFLFVBQVUsTUFBTSxFQUFFO2FBQ3BDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBOEI7UUFDdkMsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtZQUMzRCxLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVk7WUFDeEIsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO1lBQzFCLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztZQUNwQixXQUFXLEVBQUUsT0FBTyxDQUFDLFVBQVU7WUFDL0IsVUFBVSxFQUFFLE9BQU8sQ0FBQyxTQUFTO1lBQzdCLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVztTQUNqQyxDQUFDLENBQUM7UUFFSCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QyxPQUFPO1lBQ0wsRUFBRSxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNwQixPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPO1lBQy9CLFNBQVMsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ3RELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRTtnQkFDVCxJQUFJLEVBQUUsVUFBbUI7Z0JBQ3pCLFFBQVEsRUFBRTtvQkFDUixJQUFJLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJO29CQUN0QixTQUFTLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxTQUFTO2lCQUNqQzthQUNGLENBQUMsQ0FBQztZQUNILFlBQVksRUFBRSxNQUFNLENBQUMsYUFBYTtZQUNsQyxLQUFLLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUMzQixZQUFZLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYTtnQkFDL0MsZ0JBQWdCLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCO2dCQUN2RCxXQUFXLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWTthQUM5QyxDQUFDLENBQUMsQ0FBQyxTQUFTO1NBQ2QsQ0FBQztJQUNKLENBQUM7SUFFRCxLQUFLLENBQUMsVUFBVSxDQUNkLE9BQThCLEVBQzlCLE9BQXFDO1FBRXJDLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUU7WUFDM0QsS0FBSyxFQUFFLElBQUksQ0FBQyxZQUFZO1lBQ3hCLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtZQUMxQixLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUs7WUFDcEIsV0FBVyxFQUFFLE9BQU8sQ0FBQyxVQUFVO1lBQy9CLFVBQVUsRUFBRSxPQUFPLENBQUMsU0FBUztZQUM3QixXQUFXLEVBQUUsT0FBTyxDQUFDLFdBQVc7WUFDaEMsTUFBTSxFQUFFLElBQUk7U0FDYixFQUFFO1lBQ0QsWUFBWSxFQUFFLFFBQVE7U0FDdkIsQ0FBQyxDQUFDO1FBRUgsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQztRQUM3QixJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFFaEIsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFhLEVBQUUsRUFBRTtZQUNsQyxNQUFNLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzNCLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakMsTUFBTSxHQUFHLEtBQUssQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFFM0IsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDekIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUM1QixJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztvQkFDakMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDOUIsSUFBSSxJQUFJLEtBQUssUUFBUTt3QkFBRSxTQUFTO29CQUVoQyxJQUFJLENBQUM7d0JBQ0gsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDaEMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUM7d0JBQ3ZDLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxDQUFDO3dCQUV0RCxPQUFPLENBQUM7NEJBQ04sRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFOzRCQUNiLEtBQUssRUFBRTtnQ0FDTCxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU87Z0NBQ3ZCLFNBQVMsRUFBRSxLQUFLLEVBQUUsVUFBVTtnQ0FDNUIsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJOzZCQUNsQjs0QkFDRCxZQUFZLEVBQUUsWUFBWSxJQUFJLElBQUk7eUJBQ25DLENBQUMsQ0FBQztvQkFDTCxDQUFDO29CQUFDLE1BQU0sQ0FBQzt3QkFDUCxvQkFBb0I7b0JBQ3RCLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDckMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDMUIsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDN0IsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLFNBQVM7UUFDYixJQUFJLENBQUM7WUFDSCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2xELE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDekQsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDN0IsQ0FBQztJQUNILENBQUM7Q0FDRjtBQWxIRCx3Q0FrSEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXhpb3MsIHsgQXhpb3NJbnN0YW5jZSB9IGZyb20gJ2F4aW9zJztcbmltcG9ydCB7XG4gIEFJUHJvdmlkZXIsXG4gIENoYXRDb21wbGV0aW9uT3B0aW9ucyxcbiAgQ2hhdENvbXBsZXRpb25SZXNwb25zZSxcbiAgU3RyZWFtQ2h1bmtcbn0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgQ3VzdG9tUHJvdmlkZXIgaW1wbGVtZW50cyBBSVByb3ZpZGVyIHtcbiAgbmFtZSA9ICdjdXN0b20nO1xuICBwcml2YXRlIGNsaWVudDogQXhpb3NJbnN0YW5jZTtcbiAgcHJpdmF0ZSBhcGlLZXk6IHN0cmluZztcbiAgcHJpdmF0ZSBkZWZhdWx0TW9kZWw6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihhcGlLZXk6IHN0cmluZywgYmFzZVVybDogc3RyaW5nLCBkZWZhdWx0TW9kZWw/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';
@@ -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=