@xopcai/xopcbot 0.1.5 → 0.2.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/README.md +6 -6
- package/README.zh-CN.md +6 -6
- package/dist/agent/__tests__/media-processing.test.d.ts +6 -0
- package/dist/agent/__tests__/media-processing.test.js +385 -0
- package/dist/agent/__tests__/media-processing.test.js.map +1 -0
- package/dist/agent/fallback/__tests__/index.test.js +16 -5
- package/dist/agent/fallback/__tests__/index.test.js.map +1 -1
- package/dist/agent/fallback/candidates.d.ts +2 -4
- package/dist/agent/fallback/candidates.js +19 -26
- package/dist/agent/fallback/candidates.js.map +1 -1
- package/dist/agent/helpers.d.ts +1 -0
- package/dist/agent/helpers.js.map +1 -1
- package/dist/agent/index.d.ts +6 -1
- package/dist/agent/index.js +10 -1
- package/dist/agent/index.js.map +1 -1
- package/dist/agent/models/compat.d.ts +35 -0
- package/dist/agent/models/compat.js +110 -0
- package/dist/agent/models/compat.js.map +1 -0
- package/dist/agent/models/fallback.d.ts +38 -0
- package/dist/agent/models/fallback.js +133 -0
- package/dist/agent/models/fallback.js.map +1 -0
- package/dist/agent/models/index.d.ts +10 -0
- package/dist/agent/models/index.js +11 -0
- package/dist/agent/models/index.js.map +1 -0
- package/dist/agent/{model-manager.d.ts → models/manager.d.ts} +2 -8
- package/dist/agent/{model-manager.js → models/manager.js} +38 -24
- package/dist/agent/models/manager.js.map +1 -0
- package/dist/agent/models/scan.d.ts +46 -0
- package/dist/agent/models/scan.js +177 -0
- package/dist/agent/models/scan.js.map +1 -0
- package/dist/agent/models/selection.d.ts +44 -0
- package/dist/agent/models/selection.js +141 -0
- package/dist/agent/models/selection.js.map +1 -0
- package/dist/agent/prompt/index.js +1 -1
- package/dist/agent/prompt/index.js.map +1 -1
- package/dist/agent/service.js +34 -16
- package/dist/agent/service.js.map +1 -1
- package/dist/agent/skills/__tests__/test-framework.test.js +15 -7
- package/dist/agent/skills/__tests__/test-framework.test.js.map +1 -1
- package/dist/agent/skills/config.d.ts +1 -1
- package/dist/agent/skills/config.js +2 -2
- package/dist/agent/skills/config.js.map +1 -1
- package/dist/agent/skills/index.js +15 -28
- package/dist/agent/skills/index.js.map +1 -1
- package/dist/agent/skills/installer.d.ts +1 -1
- package/dist/agent/skills/installer.js +1 -1
- package/dist/agent/skills/scanner.d.ts +1 -1
- package/dist/agent/skills/scanner.js +1 -1
- package/dist/agent/skills/test-framework.js +21 -20
- package/dist/agent/skills/test-framework.js.map +1 -1
- package/dist/agent/skills/types.d.ts +3 -3
- package/dist/agent/skills/types.js +1 -1
- package/dist/agent/skills/watcher.d.ts +1 -1
- package/dist/agent/skills/watcher.js +1 -1
- package/dist/agent/system-prompt.d.ts +67 -0
- package/dist/agent/system-prompt.js +351 -0
- package/dist/agent/system-prompt.js.map +1 -0
- package/dist/agent/tools/__tests__/send-media.test.d.ts +6 -0
- package/dist/agent/tools/__tests__/send-media.test.js +251 -0
- package/dist/agent/tools/__tests__/send-media.test.js.map +1 -0
- package/dist/agent/types.agent-defaults.d.ts +48 -0
- package/dist/agent/types.agent-defaults.js +5 -0
- package/dist/agent/types.agent-defaults.js.map +1 -0
- package/dist/agent/types.d.ts +14 -6
- package/dist/agent/types.js +5 -0
- package/dist/agent/types.js.map +1 -1
- package/dist/agent/workspace.d.ts +94 -0
- package/dist/agent/workspace.js +625 -0
- package/dist/agent/workspace.js.map +1 -0
- package/dist/auth/index.js +1 -1
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/oauth/index.d.ts +1 -0
- package/dist/auth/oauth/index.js +1 -0
- package/dist/auth/oauth/index.js.map +1 -1
- package/dist/auth/oauth/kimi.d.ts +2 -1
- package/dist/auth/oauth/kimi.js +51 -48
- package/dist/auth/oauth/kimi.js.map +1 -1
- package/dist/auth/oauth/minimax-cn.d.ts +12 -0
- package/dist/auth/oauth/minimax-cn.js +111 -0
- package/dist/auth/oauth/minimax-cn.js.map +1 -0
- package/dist/auth/oauth/qwen.d.ts +5 -0
- package/dist/auth/oauth/qwen.js +54 -84
- package/dist/auth/oauth/qwen.js.map +1 -1
- package/dist/auth/profiles/index.d.ts +0 -2
- package/dist/auth/profiles/index.js +0 -2
- package/dist/auth/profiles/index.js.map +1 -1
- package/dist/auth/storage.js +7 -1
- package/dist/auth/storage.js.map +1 -1
- package/dist/channels/__tests__/media-integration.test.d.ts +6 -0
- package/dist/channels/__tests__/media-integration.test.js +398 -0
- package/dist/channels/__tests__/media-integration.test.js.map +1 -0
- package/dist/channels/__tests__/media.test.d.ts +6 -0
- package/dist/channels/__tests__/media.test.js +251 -0
- package/dist/channels/__tests__/media.test.js.map +1 -0
- package/dist/channels/access-control.d.ts +1 -1
- package/dist/channels/access-control.js +1 -1
- package/dist/channels/draft-stream.d.ts +1 -1
- package/dist/channels/draft-stream.js +1 -1
- package/dist/channels/format.d.ts +1 -1
- package/dist/channels/format.js +1 -1
- package/dist/channels/telegram/command-handler.js +15 -48
- package/dist/channels/telegram/command-handler.js.map +1 -1
- package/dist/channels/telegram/plugin.js +3 -2
- package/dist/channels/telegram/plugin.js.map +1 -1
- package/dist/channels/telegram/webhook.d.ts +1 -1
- package/dist/channels/telegram/webhook.js +1 -1
- package/dist/channels/types.d.ts +1 -1
- package/dist/channels/types.js +1 -1
- package/dist/channels/update-offset-store.d.ts +1 -1
- package/dist/channels/update-offset-store.js +1 -1
- package/dist/cli/commands/auth.js +8 -23
- package/dist/cli/commands/auth.js.map +1 -1
- package/dist/cli/commands/gateway.js +9 -1
- package/dist/cli/commands/gateway.js.map +1 -1
- package/dist/cli/commands/models.js +35 -29
- package/dist/cli/commands/models.js.map +1 -1
- package/dist/cli/commands/onboard.js +73 -58
- package/dist/cli/commands/onboard.js.map +1 -1
- package/dist/cli/commands/skills.js +6 -6
- package/dist/cli/commands/skills.js.map +1 -1
- package/dist/cli/index.js +0 -0
- package/dist/cli/templates.d.ts +2 -0
- package/dist/cli/templates.js +1 -1
- package/dist/cli/templates.js.map +1 -1
- package/dist/config/defaults.d.ts +19 -0
- package/dist/config/defaults.js +168 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +5 -0
- package/dist/config/index.js +4 -0
- package/dist/config/index.js.map +1 -1
- package/dist/config/integration.d.ts +12 -0
- package/dist/config/integration.js +14 -0
- package/dist/config/integration.js.map +1 -0
- package/dist/config/models-json.d.ts +454 -0
- package/dist/config/models-json.js +323 -0
- package/dist/config/models-json.js.map +1 -0
- package/dist/config/paths.d.ts +2 -0
- package/dist/config/paths.js +4 -0
- package/dist/config/paths.js.map +1 -1
- package/dist/config/reload.d.ts +1 -1
- package/dist/config/reload.js +3 -3
- package/dist/config/reload.js.map +1 -1
- package/dist/config/resolve-config-value.d.ts +36 -0
- package/dist/config/resolve-config-value.js +218 -0
- package/dist/config/resolve-config-value.js.map +1 -0
- package/dist/config/rules.js +3 -2
- package/dist/config/rules.js.map +1 -1
- package/dist/config/schema.d.ts +17 -884
- package/dist/config/schema.js +36 -312
- package/dist/config/schema.js.map +1 -1
- package/dist/config/types.models.d.ts +54 -0
- package/dist/config/types.models.js +2 -0
- package/dist/config/types.models.js.map +1 -0
- package/dist/cron/validation.d.ts +4 -4
- package/dist/gateway/hono/app.js +230 -78
- package/dist/gateway/hono/app.js.map +1 -1
- package/dist/gateway/hono/oauth-async.d.ts +14 -0
- package/dist/gateway/hono/oauth-async.js +285 -0
- package/dist/gateway/hono/oauth-async.js.map +1 -0
- package/dist/gateway/hono/oauth.d.ts +9 -0
- package/dist/gateway/hono/oauth.js +157 -0
- package/dist/gateway/hono/oauth.js.map +1 -0
- package/dist/gateway/hono/sse.js +5 -2
- package/dist/gateway/hono/sse.js.map +1 -1
- package/dist/gateway/service.d.ts +6 -2
- package/dist/gateway/service.js +20 -6
- package/dist/gateway/service.js.map +1 -1
- package/dist/gateway/static/root/assets/flow-BqIEBwW6.js +2 -0
- package/dist/gateway/static/root/assets/flow-BqIEBwW6.js.map +1 -0
- package/dist/gateway/static/root/assets/main-Br2tw-87.js +5168 -0
- package/dist/gateway/static/root/assets/main-Br2tw-87.js.map +1 -0
- package/dist/gateway/static/root/assets/main-DwlbPf8Z.css +1 -0
- package/dist/gateway/static/root/index.html +2 -2
- package/dist/plugins/index.d.ts +0 -2
- package/dist/plugins/index.js +0 -2
- package/dist/plugins/index.js.map +1 -1
- package/dist/plugins/types.d.ts +0 -2
- package/dist/plugins/types.js +0 -2
- package/dist/plugins/types.js.map +1 -1
- package/dist/providers/index.d.ts +50 -22
- package/dist/providers/index.js +276 -50
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/model-registry.d.ts +84 -0
- package/dist/providers/model-registry.js +385 -0
- package/dist/providers/model-registry.js.map +1 -0
- package/dist/types/providers.d.ts +2 -63
- package/dist/types/providers.js +1 -1
- package/dist/utils/__tests__/frontmatter.test.js +4 -3
- package/dist/utils/__tests__/frontmatter.test.js.map +1 -1
- package/dist/utils/diagnostic-events.d.ts +230 -0
- package/dist/utils/diagnostic-events.js +189 -0
- package/dist/utils/diagnostic-events.js.map +1 -0
- package/dist/utils/frontmatter.d.ts +0 -1
- package/dist/utils/frontmatter.js +13 -77
- package/dist/utils/frontmatter.js.map +1 -1
- package/dist/utils/log-stream.d.ts +95 -0
- package/dist/utils/log-stream.js +229 -0
- package/dist/utils/log-stream.js.map +1 -0
- package/dist/utils/logger.d.ts +5 -0
- package/dist/utils/logger.js +25 -0
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/redact.d.ts +73 -0
- package/dist/utils/redact.js +245 -0
- package/dist/utils/redact.js.map +1 -0
- package/package.json +6 -4
- package/skills/find-skills/SKILL.md +0 -9
- package/dist/__tests__/core.test.d.ts +0 -1
- package/dist/__tests__/core.test.js +0 -72
- package/dist/__tests__/core.test.js.map +0 -1
- package/dist/agent/model-manager.js.map +0 -1
- package/dist/cli/commands/configure.d.ts +0 -1
- package/dist/cli/commands/configure.js +0 -171
- package/dist/cli/commands/configure.js.map +0 -1
- package/dist/cli/commands/gateway-daemon.d.ts +0 -1
- package/dist/cli/commands/gateway-daemon.js +0 -141
- package/dist/cli/commands/gateway-daemon.js.map +0 -1
- package/dist/config/__tests__/diff.test.d.ts +0 -1
- package/dist/config/__tests__/diff.test.js +0 -192
- package/dist/config/__tests__/diff.test.js.map +0 -1
- package/dist/config/__tests__/loader.test.d.ts +0 -1
- package/dist/config/__tests__/loader.test.js +0 -356
- package/dist/config/__tests__/loader.test.js.map +0 -1
- package/dist/config/__tests__/paths.test.d.ts +0 -1
- package/dist/config/__tests__/paths.test.js +0 -192
- package/dist/config/__tests__/paths.test.js.map +0 -1
- package/dist/config/__tests__/reload.test.d.ts +0 -1
- package/dist/config/__tests__/reload.test.js +0 -374
- package/dist/config/__tests__/reload.test.js.map +0 -1
- package/dist/config/__tests__/rules.test.d.ts +0 -1
- package/dist/config/__tests__/rules.test.js +0 -204
- package/dist/config/__tests__/rules.test.js.map +0 -1
- package/dist/config/__tests__/schema.test.d.ts +0 -1
- package/dist/config/__tests__/schema.test.js +0 -672
- package/dist/config/__tests__/schema.test.js.map +0 -1
- package/dist/daemon/background-start.d.ts +0 -33
- package/dist/daemon/background-start.js +0 -89
- package/dist/daemon/background-start.js.map +0 -1
- package/dist/daemon/gateway-manager.d.ts +0 -87
- package/dist/daemon/gateway-manager.js +0 -324
- package/dist/daemon/gateway-manager.js.map +0 -1
- package/dist/daemon/index.d.ts +0 -5
- package/dist/daemon/index.js +0 -6
- package/dist/daemon/index.js.map +0 -1
- package/dist/gateway/static/root/assets/main-DevbZW9K.js +0 -2227
- package/dist/gateway/static/root/assets/main-DevbZW9K.js.map +0 -1
- package/dist/gateway/static/root/assets/main-DxZg1Nmz.css +0 -1
- package/dist/providers/__tests__/registry.test.d.ts +0 -1
- package/dist/providers/__tests__/registry.test.js +0 -110
- package/dist/providers/__tests__/registry.test.js.map +0 -1
- package/dist/providers/api-strategies.d.ts +0 -15
- package/dist/providers/api-strategies.js +0 -96
- package/dist/providers/api-strategies.js.map +0 -1
- package/dist/providers/auto-discovery.d.ts +0 -39
- package/dist/providers/auto-discovery.js +0 -189
- package/dist/providers/auto-discovery.js.map +0 -1
- package/dist/providers/config.d.ts +0 -25
- package/dist/providers/config.js +0 -42
- package/dist/providers/config.js.map +0 -1
- package/dist/providers/model-catalog.d.ts +0 -92
- package/dist/providers/model-catalog.js +0 -998
- package/dist/providers/model-catalog.js.map +0 -1
- package/dist/providers/models-dev-data.d.ts +0 -11
- package/dist/providers/models-dev-data.js +0 -1035
- package/dist/providers/models-dev-data.js.map +0 -1
- package/dist/providers/models-dev.d.ts +0 -34
- package/dist/providers/models-dev.js +0 -33
- package/dist/providers/models-dev.js.map +0 -1
- package/dist/providers/pi-ai.d.ts +0 -62
- package/dist/providers/pi-ai.js +0 -221
- package/dist/providers/pi-ai.js.map +0 -1
- package/dist/providers/provider-catalog.d.ts +0 -91
- package/dist/providers/provider-catalog.js +0 -791
- package/dist/providers/provider-catalog.js.map +0 -1
- package/dist/providers/registry.d.ts +0 -135
- package/dist/providers/registry.js +0 -475
- package/dist/providers/registry.js.map +0 -1
- package/dist/providers/types.d.ts +0 -95
- package/dist/providers/types.js +0 -7
- package/dist/providers/types.js.map +0 -1
- package/dist/session/chat-manager.d.ts +0 -49
- package/dist/session/chat-manager.js +0 -167
- package/dist/session/chat-manager.js.map +0 -1
- package/dist/session/chat-types.d.ts +0 -53
- package/dist/session/chat-types.js +0 -63
- package/dist/session/chat-types.js.map +0 -1
package/README.md
CHANGED
|
@@ -55,14 +55,14 @@ npm install -g @xopcai/xopcbot
|
|
|
55
55
|
|
|
56
56
|
# Or from source
|
|
57
57
|
git clone https://github.com/xopcai/xopcbot.git
|
|
58
|
-
cd xopcbot &&
|
|
58
|
+
cd xopcbot && npm install && npm build
|
|
59
59
|
```
|
|
60
60
|
|
|
61
61
|
### 2️⃣ Setup (interactive wizard)
|
|
62
62
|
|
|
63
63
|
```bash
|
|
64
64
|
xopcbot onboard
|
|
65
|
-
# or:
|
|
65
|
+
# or: npm run dev -- onboard
|
|
66
66
|
```
|
|
67
67
|
|
|
68
68
|
The wizard will guide you through:
|
|
@@ -111,16 +111,16 @@ xopcbot agent -m "Hello!" --channel telegram --chat-id 123456
|
|
|
111
111
|
|
|
112
112
|
```bash
|
|
113
113
|
# Development (with hot reload)
|
|
114
|
-
|
|
114
|
+
npm run dev
|
|
115
115
|
|
|
116
116
|
# Build for production
|
|
117
|
-
|
|
117
|
+
npm run build
|
|
118
118
|
|
|
119
119
|
# Run tests
|
|
120
|
-
|
|
120
|
+
npm test
|
|
121
121
|
|
|
122
122
|
# Lint
|
|
123
|
-
|
|
123
|
+
npm run lint
|
|
124
124
|
```
|
|
125
125
|
|
|
126
126
|
---
|
package/README.zh-CN.md
CHANGED
|
@@ -55,14 +55,14 @@ npm install -g @xopcai/xopcbot
|
|
|
55
55
|
|
|
56
56
|
# 或从源码构建
|
|
57
57
|
git clone https://github.com/xopcai/xopcbot.git
|
|
58
|
-
cd xopcbot &&
|
|
58
|
+
cd xopcbot && npm install && npm build
|
|
59
59
|
```
|
|
60
60
|
|
|
61
61
|
### 2️⃣ 配置(交互式向导)
|
|
62
62
|
|
|
63
63
|
```bash
|
|
64
64
|
xopcbot onboard
|
|
65
|
-
# 或:
|
|
65
|
+
# 或: npm run dev -- onboard
|
|
66
66
|
```
|
|
67
67
|
|
|
68
68
|
向导会引导你完成:
|
|
@@ -111,16 +111,16 @@ xopcbot agent -m "你好!" --channel telegram --chat-id 123456
|
|
|
111
111
|
|
|
112
112
|
```bash
|
|
113
113
|
# 开发模式(热重载)
|
|
114
|
-
|
|
114
|
+
npm run dev
|
|
115
115
|
|
|
116
116
|
# 构建生产版本
|
|
117
|
-
|
|
117
|
+
npm run build
|
|
118
118
|
|
|
119
119
|
# 运行测试
|
|
120
|
-
|
|
120
|
+
npm test
|
|
121
121
|
|
|
122
122
|
# 代码检查
|
|
123
|
-
|
|
123
|
+
npm run lint
|
|
124
124
|
```
|
|
125
125
|
|
|
126
126
|
---
|
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Media Processing Tests
|
|
3
|
+
*
|
|
4
|
+
* Tests for media message handling in AgentService.
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, expect } from 'vitest';
|
|
7
|
+
describe('Agent Message Content Building', () => {
|
|
8
|
+
describe('MessageContent Array Construction', () => {
|
|
9
|
+
it('should build message content with only text', () => {
|
|
10
|
+
const expandedContent = 'Hello world';
|
|
11
|
+
const attachments = [];
|
|
12
|
+
const messageContent = [];
|
|
13
|
+
if (expandedContent.trim()) {
|
|
14
|
+
messageContent.push({ type: 'text', text: expandedContent });
|
|
15
|
+
}
|
|
16
|
+
if (attachments && attachments.length > 0) {
|
|
17
|
+
for (const att of attachments) {
|
|
18
|
+
if (att.type === 'photo' || att.mimeType?.startsWith('image/')) {
|
|
19
|
+
messageContent.push({ type: 'image', data: att.data, mimeType: att.mimeType });
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
const fileInfo = `[File: ${att.name || att.type} (${att.mimeType || 'unknown type'}, ${att.size || 0} bytes)]`;
|
|
23
|
+
messageContent.push({ type: 'text', text: fileInfo });
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
expect(messageContent).toHaveLength(1);
|
|
28
|
+
expect(messageContent[0]).toEqual({ type: 'text', text: 'Hello world' });
|
|
29
|
+
});
|
|
30
|
+
it('should build message content with text and single image', () => {
|
|
31
|
+
const expandedContent = 'Check this photo';
|
|
32
|
+
const attachments = [
|
|
33
|
+
{
|
|
34
|
+
type: 'photo',
|
|
35
|
+
mimeType: 'image/jpeg',
|
|
36
|
+
data: '/9j/4AAQSkZJRgABAQ==',
|
|
37
|
+
name: 'photo.jpg',
|
|
38
|
+
size: 1024,
|
|
39
|
+
},
|
|
40
|
+
];
|
|
41
|
+
const messageContent = [];
|
|
42
|
+
if (expandedContent.trim()) {
|
|
43
|
+
messageContent.push({ type: 'text', text: expandedContent });
|
|
44
|
+
}
|
|
45
|
+
if (attachments && attachments.length > 0) {
|
|
46
|
+
for (const att of attachments) {
|
|
47
|
+
if (att.type === 'photo' || att.mimeType?.startsWith('image/')) {
|
|
48
|
+
messageContent.push({ type: 'image', data: att.data, mimeType: att.mimeType });
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
const fileInfo = `[File: ${att.name || att.type} (${att.mimeType || 'unknown type'}, ${att.size || 0} bytes)]`;
|
|
52
|
+
messageContent.push({ type: 'text', text: fileInfo });
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
expect(messageContent).toHaveLength(2);
|
|
57
|
+
expect(messageContent[0]).toEqual({ type: 'text', text: 'Check this photo' });
|
|
58
|
+
expect(messageContent[1]).toEqual({
|
|
59
|
+
type: 'image',
|
|
60
|
+
data: '/9j/4AAQSkZJRgABAQ==',
|
|
61
|
+
mimeType: 'image/jpeg'
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
it('should build message content with multiple images', () => {
|
|
65
|
+
const expandedContent = 'Here are photos';
|
|
66
|
+
const attachments = [
|
|
67
|
+
{ type: 'photo', mimeType: 'image/jpeg', data: 'data1', name: 'photo1.jpg', size: 1000 },
|
|
68
|
+
{ type: 'photo', mimeType: 'image/png', data: 'data2', name: 'photo2.png', size: 2000 },
|
|
69
|
+
{ type: 'photo', mimeType: 'image/webp', data: 'data3', name: 'photo3.webp', size: 1500 },
|
|
70
|
+
];
|
|
71
|
+
const messageContent = [];
|
|
72
|
+
if (expandedContent.trim()) {
|
|
73
|
+
messageContent.push({ type: 'text', text: expandedContent });
|
|
74
|
+
}
|
|
75
|
+
if (attachments && attachments.length > 0) {
|
|
76
|
+
for (const att of attachments) {
|
|
77
|
+
if (att.type === 'photo' || att.mimeType?.startsWith('image/')) {
|
|
78
|
+
messageContent.push({ type: 'image', data: att.data, mimeType: att.mimeType });
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
const fileInfo = `[File: ${att.name || att.type} (${att.mimeType || 'unknown type'}, ${att.size || 0} bytes)]`;
|
|
82
|
+
messageContent.push({ type: 'text', text: fileInfo });
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
expect(messageContent).toHaveLength(4);
|
|
87
|
+
expect(messageContent[0].type).toBe('text');
|
|
88
|
+
expect(messageContent[1]).toEqual({ type: 'image', data: 'data1', mimeType: 'image/jpeg' });
|
|
89
|
+
expect(messageContent[2]).toEqual({ type: 'image', data: 'data2', mimeType: 'image/png' });
|
|
90
|
+
expect(messageContent[3]).toEqual({ type: 'image', data: 'data3', mimeType: 'image/webp' });
|
|
91
|
+
});
|
|
92
|
+
it('should convert non-image attachments to text description', () => {
|
|
93
|
+
const expandedContent = 'Here is a file';
|
|
94
|
+
const attachments = [
|
|
95
|
+
{
|
|
96
|
+
type: 'document',
|
|
97
|
+
mimeType: 'application/pdf',
|
|
98
|
+
data: 'pdfdata123',
|
|
99
|
+
name: 'document.pdf',
|
|
100
|
+
size: 102400,
|
|
101
|
+
},
|
|
102
|
+
];
|
|
103
|
+
const messageContent = [];
|
|
104
|
+
if (expandedContent.trim()) {
|
|
105
|
+
messageContent.push({ type: 'text', text: expandedContent });
|
|
106
|
+
}
|
|
107
|
+
if (attachments && attachments.length > 0) {
|
|
108
|
+
for (const att of attachments) {
|
|
109
|
+
if (att.type === 'photo' || att.mimeType?.startsWith('image/')) {
|
|
110
|
+
messageContent.push({ type: 'image', data: att.data, mimeType: att.mimeType });
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
const fileInfo = `[File: ${att.name || att.type} (${att.mimeType || 'unknown type'}, ${att.size || 0} bytes)]`;
|
|
114
|
+
messageContent.push({ type: 'text', text: fileInfo });
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
expect(messageContent).toHaveLength(2);
|
|
119
|
+
expect(messageContent[0]).toEqual({ type: 'text', text: 'Here is a file' });
|
|
120
|
+
expect(messageContent[1]).toEqual({
|
|
121
|
+
type: 'text',
|
|
122
|
+
text: '[File: document.pdf (application/pdf, 102400 bytes)]'
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
it('should handle mixed image and non-image attachments', () => {
|
|
126
|
+
const expandedContent = 'Mixed content';
|
|
127
|
+
const attachments = [
|
|
128
|
+
{ type: 'photo', mimeType: 'image/jpeg', data: 'img1', name: 'photo.jpg', size: 1000 },
|
|
129
|
+
{ type: 'document', mimeType: 'application/pdf', data: 'pdf1', name: 'doc.pdf', size: 5000 },
|
|
130
|
+
{ type: 'photo', mimeType: 'image/png', data: 'img2', name: 'screenshot.png', size: 2000 },
|
|
131
|
+
{ type: 'audio', mimeType: 'audio/mpeg', data: 'audio1', name: 'voice.mp3', size: 3000 },
|
|
132
|
+
];
|
|
133
|
+
const messageContent = [];
|
|
134
|
+
if (expandedContent.trim()) {
|
|
135
|
+
messageContent.push({ type: 'text', text: expandedContent });
|
|
136
|
+
}
|
|
137
|
+
if (attachments && attachments.length > 0) {
|
|
138
|
+
for (const att of attachments) {
|
|
139
|
+
if (att.type === 'photo' || att.mimeType?.startsWith('image/')) {
|
|
140
|
+
messageContent.push({ type: 'image', data: att.data, mimeType: att.mimeType });
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
const fileInfo = `[File: ${att.name || att.type} (${att.mimeType || 'unknown type'}, ${att.size || 0} bytes)]`;
|
|
144
|
+
messageContent.push({ type: 'text', text: fileInfo });
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
expect(messageContent).toHaveLength(5);
|
|
149
|
+
expect(messageContent[0]).toEqual({ type: 'text', text: 'Mixed content' });
|
|
150
|
+
expect(messageContent[1]).toEqual({ type: 'image', data: 'img1', mimeType: 'image/jpeg' });
|
|
151
|
+
expect(messageContent[2]).toEqual({ type: 'text', text: '[File: doc.pdf (application/pdf, 5000 bytes)]' });
|
|
152
|
+
expect(messageContent[3]).toEqual({ type: 'image', data: 'img2', mimeType: 'image/png' });
|
|
153
|
+
expect(messageContent[4]).toEqual({ type: 'text', text: '[File: voice.mp3 (audio/mpeg, 3000 bytes)]' });
|
|
154
|
+
});
|
|
155
|
+
it('should handle empty content with only attachments', () => {
|
|
156
|
+
const expandedContent = '';
|
|
157
|
+
const attachments = [
|
|
158
|
+
{ type: 'photo', mimeType: 'image/jpeg', data: 'imgdata', name: 'photo.jpg', size: 1000 },
|
|
159
|
+
];
|
|
160
|
+
const messageContent = [];
|
|
161
|
+
if (expandedContent.trim()) {
|
|
162
|
+
messageContent.push({ type: 'text', text: expandedContent });
|
|
163
|
+
}
|
|
164
|
+
if (attachments && attachments.length > 0) {
|
|
165
|
+
for (const att of attachments) {
|
|
166
|
+
if (att.type === 'photo' || att.mimeType?.startsWith('image/')) {
|
|
167
|
+
messageContent.push({ type: 'image', data: att.data, mimeType: att.mimeType });
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
const fileInfo = `[File: ${att.name || att.type} (${att.mimeType || 'unknown type'}, ${att.size || 0} bytes)]`;
|
|
171
|
+
messageContent.push({ type: 'text', text: fileInfo });
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
expect(messageContent).toHaveLength(1);
|
|
176
|
+
expect(messageContent[0]).toEqual({ type: 'image', data: 'imgdata', mimeType: 'image/jpeg' });
|
|
177
|
+
});
|
|
178
|
+
it('should handle webp images correctly', () => {
|
|
179
|
+
const expandedContent = 'WebP image';
|
|
180
|
+
const attachments = [
|
|
181
|
+
{ type: 'photo', mimeType: 'image/webp', data: 'webpdata', name: 'sticker.webp', size: 500 },
|
|
182
|
+
];
|
|
183
|
+
const messageContent = [];
|
|
184
|
+
if (expandedContent.trim()) {
|
|
185
|
+
messageContent.push({ type: 'text', text: expandedContent });
|
|
186
|
+
}
|
|
187
|
+
if (attachments && attachments.length > 0) {
|
|
188
|
+
for (const att of attachments) {
|
|
189
|
+
if (att.type === 'photo' || att.mimeType?.startsWith('image/')) {
|
|
190
|
+
messageContent.push({ type: 'image', data: att.data, mimeType: att.mimeType });
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
const fileInfo = `[File: ${att.name || att.type} (${att.mimeType || 'unknown type'}, ${att.size || 0} bytes)]`;
|
|
194
|
+
messageContent.push({ type: 'text', text: fileInfo });
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
expect(messageContent).toHaveLength(2);
|
|
199
|
+
expect(messageContent[1]).toEqual({ type: 'image', data: 'webpdata', mimeType: 'image/webp' });
|
|
200
|
+
});
|
|
201
|
+
it('should handle gif images correctly', () => {
|
|
202
|
+
const expandedContent = 'GIF image';
|
|
203
|
+
const attachments = [
|
|
204
|
+
{ type: 'document', mimeType: 'image/gif', data: 'gifdata', name: 'animation.gif', size: 2000 },
|
|
205
|
+
];
|
|
206
|
+
const messageContent = [];
|
|
207
|
+
if (expandedContent.trim()) {
|
|
208
|
+
messageContent.push({ type: 'text', text: expandedContent });
|
|
209
|
+
}
|
|
210
|
+
if (attachments && attachments.length > 0) {
|
|
211
|
+
for (const att of attachments) {
|
|
212
|
+
if (att.type === 'photo' || att.mimeType?.startsWith('image/')) {
|
|
213
|
+
messageContent.push({ type: 'image', data: att.data, mimeType: att.mimeType });
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
const fileInfo = `[File: ${att.name || att.type} (${att.mimeType || 'unknown type'}, ${att.size || 0} bytes)]`;
|
|
217
|
+
messageContent.push({ type: 'text', text: fileInfo });
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
expect(messageContent).toHaveLength(2);
|
|
222
|
+
expect(messageContent[1]).toEqual({ type: 'image', data: 'gifdata', mimeType: 'image/gif' });
|
|
223
|
+
});
|
|
224
|
+
});
|
|
225
|
+
describe('UserMessage Construction', () => {
|
|
226
|
+
it('should create valid AgentMessage with content array', () => {
|
|
227
|
+
const messageContent = [
|
|
228
|
+
{ type: 'text', text: 'Hello' },
|
|
229
|
+
{ type: 'image', data: 'imagedata', mimeType: 'image/jpeg' },
|
|
230
|
+
];
|
|
231
|
+
const userMessage = {
|
|
232
|
+
role: 'user',
|
|
233
|
+
content: messageContent,
|
|
234
|
+
timestamp: Date.now(),
|
|
235
|
+
};
|
|
236
|
+
expect(userMessage.role).toBe('user');
|
|
237
|
+
expect(Array.isArray(userMessage.content)).toBe(true);
|
|
238
|
+
expect(userMessage.content).toHaveLength(2);
|
|
239
|
+
expect(userMessage.timestamp).toBeGreaterThan(0);
|
|
240
|
+
});
|
|
241
|
+
it('should handle message with only images', () => {
|
|
242
|
+
const messageContent = [
|
|
243
|
+
{ type: 'image', data: 'img1', mimeType: 'image/jpeg' },
|
|
244
|
+
{ type: 'image', data: 'img2', mimeType: 'image/png' },
|
|
245
|
+
];
|
|
246
|
+
const userMessage = {
|
|
247
|
+
role: 'user',
|
|
248
|
+
content: messageContent,
|
|
249
|
+
timestamp: 1234567890,
|
|
250
|
+
};
|
|
251
|
+
expect(userMessage.content).toHaveLength(2);
|
|
252
|
+
expect(userMessage.content[0].type).toBe('image');
|
|
253
|
+
expect(userMessage.content[1].type).toBe('image');
|
|
254
|
+
});
|
|
255
|
+
});
|
|
256
|
+
});
|
|
257
|
+
describe('Outbound Media Message', () => {
|
|
258
|
+
it('should create OutboundMessage with mediaUrl', () => {
|
|
259
|
+
const reply = {
|
|
260
|
+
channel: 'telegram',
|
|
261
|
+
chat_id: '987654321',
|
|
262
|
+
content: 'Here is the image you requested',
|
|
263
|
+
mediaUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==',
|
|
264
|
+
mediaType: 'photo',
|
|
265
|
+
type: 'message',
|
|
266
|
+
};
|
|
267
|
+
expect(reply.mediaUrl).toBeTruthy();
|
|
268
|
+
expect(reply.mediaUrl.startsWith('data:image/png;base64,')).toBe(true);
|
|
269
|
+
expect(reply.mediaType).toBe('photo');
|
|
270
|
+
});
|
|
271
|
+
it('should handle data URL construction for different media types', () => {
|
|
272
|
+
const testCases = [
|
|
273
|
+
{ mimeType: 'image/jpeg', base64: '/9j/4AAQSkZJRg==', type: 'photo' },
|
|
274
|
+
{ mimeType: 'image/png', base64: 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==', type: 'photo' },
|
|
275
|
+
{ mimeType: 'video/mp4', base64: 'AAAAFGZ0eXBtcDQyAAAAAG1wNDJpc29tYXZjMQ==', type: 'video' },
|
|
276
|
+
];
|
|
277
|
+
testCases.forEach(({ mimeType, base64, type }) => {
|
|
278
|
+
const dataUrl = `data:${mimeType};base64,${base64}`;
|
|
279
|
+
expect(dataUrl.startsWith(`data:${mimeType};base64,`)).toBe(true);
|
|
280
|
+
const reply = {
|
|
281
|
+
channel: 'telegram',
|
|
282
|
+
chat_id: '123',
|
|
283
|
+
content: 'Media',
|
|
284
|
+
mediaUrl: dataUrl,
|
|
285
|
+
mediaType: type,
|
|
286
|
+
};
|
|
287
|
+
expect(reply.mediaType).toBe(type);
|
|
288
|
+
});
|
|
289
|
+
});
|
|
290
|
+
});
|
|
291
|
+
describe('SendMedia Tool', () => {
|
|
292
|
+
describe('Media Type Detection', () => {
|
|
293
|
+
const detectMediaType = (filePath) => {
|
|
294
|
+
const ext = filePath.split('.').pop()?.toLowerCase();
|
|
295
|
+
const imageExts = ['jpg', 'jpeg', 'png', 'gif', 'webp', 'bmp', 'svg'];
|
|
296
|
+
const videoExts = ['mp4', 'mov', 'avi', 'webm', 'mkv'];
|
|
297
|
+
const audioExts = ['mp3', 'wav', 'ogg', 'm4a', 'flac'];
|
|
298
|
+
if (imageExts.includes(ext || ''))
|
|
299
|
+
return 'photo';
|
|
300
|
+
if (videoExts.includes(ext || ''))
|
|
301
|
+
return 'video';
|
|
302
|
+
if (audioExts.includes(ext || ''))
|
|
303
|
+
return 'audio';
|
|
304
|
+
return 'document';
|
|
305
|
+
};
|
|
306
|
+
it('should detect photo files', () => {
|
|
307
|
+
expect(detectMediaType('image.jpg')).toBe('photo');
|
|
308
|
+
expect(detectMediaType('image.jpeg')).toBe('photo');
|
|
309
|
+
expect(detectMediaType('image.png')).toBe('photo');
|
|
310
|
+
expect(detectMediaType('image.gif')).toBe('photo');
|
|
311
|
+
expect(detectMediaType('image.webp')).toBe('photo');
|
|
312
|
+
expect(detectMediaType('image.bmp')).toBe('photo');
|
|
313
|
+
expect(detectMediaType('image.svg')).toBe('photo');
|
|
314
|
+
});
|
|
315
|
+
it('should detect video files', () => {
|
|
316
|
+
expect(detectMediaType('clip.mp4')).toBe('video');
|
|
317
|
+
expect(detectMediaType('clip.mov')).toBe('video');
|
|
318
|
+
expect(detectMediaType('clip.avi')).toBe('video');
|
|
319
|
+
expect(detectMediaType('clip.webm')).toBe('video');
|
|
320
|
+
expect(detectMediaType('clip.mkv')).toBe('video');
|
|
321
|
+
});
|
|
322
|
+
it('should detect audio files', () => {
|
|
323
|
+
expect(detectMediaType('sound.mp3')).toBe('audio');
|
|
324
|
+
expect(detectMediaType('sound.wav')).toBe('audio');
|
|
325
|
+
expect(detectMediaType('sound.ogg')).toBe('audio');
|
|
326
|
+
expect(detectMediaType('sound.m4a')).toBe('audio');
|
|
327
|
+
expect(detectMediaType('sound.flac')).toBe('audio');
|
|
328
|
+
});
|
|
329
|
+
it('should default to document for unknown extensions', () => {
|
|
330
|
+
expect(detectMediaType('file.pdf')).toBe('document');
|
|
331
|
+
expect(detectMediaType('file.txt')).toBe('document');
|
|
332
|
+
expect(detectMediaType('file.zip')).toBe('document');
|
|
333
|
+
expect(detectMediaType('file.xyz')).toBe('document');
|
|
334
|
+
expect(detectMediaType('file')).toBe('document');
|
|
335
|
+
});
|
|
336
|
+
});
|
|
337
|
+
describe('MIME Type Detection', () => {
|
|
338
|
+
const detectMimeType = (filePath) => {
|
|
339
|
+
const ext = filePath.split('.').pop()?.toLowerCase();
|
|
340
|
+
const mimeMap = {
|
|
341
|
+
jpg: 'image/jpeg',
|
|
342
|
+
jpeg: 'image/jpeg',
|
|
343
|
+
png: 'image/png',
|
|
344
|
+
gif: 'image/gif',
|
|
345
|
+
webp: 'image/webp',
|
|
346
|
+
bmp: 'image/bmp',
|
|
347
|
+
svg: 'image/svg+xml',
|
|
348
|
+
mp4: 'video/mp4',
|
|
349
|
+
mov: 'video/quicktime',
|
|
350
|
+
avi: 'video/x-msvideo',
|
|
351
|
+
webm: 'video/webm',
|
|
352
|
+
mp3: 'audio/mpeg',
|
|
353
|
+
wav: 'audio/wav',
|
|
354
|
+
ogg: 'audio/ogg',
|
|
355
|
+
m4a: 'audio/mp4',
|
|
356
|
+
flac: 'audio/flac',
|
|
357
|
+
pdf: 'application/pdf',
|
|
358
|
+
doc: 'application/msword',
|
|
359
|
+
docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
|
|
360
|
+
txt: 'text/plain',
|
|
361
|
+
zip: 'application/zip',
|
|
362
|
+
};
|
|
363
|
+
return mimeMap[ext || ''] || 'application/octet-stream';
|
|
364
|
+
};
|
|
365
|
+
it('should return correct MIME type for images', () => {
|
|
366
|
+
expect(detectMimeType('photo.jpg')).toBe('image/jpeg');
|
|
367
|
+
expect(detectMimeType('photo.png')).toBe('image/png');
|
|
368
|
+
expect(detectMimeType('photo.gif')).toBe('image/gif');
|
|
369
|
+
expect(detectMimeType('photo.webp')).toBe('image/webp');
|
|
370
|
+
expect(detectMimeType('photo.svg')).toBe('image/svg+xml');
|
|
371
|
+
});
|
|
372
|
+
it('should return correct MIME type for documents', () => {
|
|
373
|
+
expect(detectMimeType('doc.pdf')).toBe('application/pdf');
|
|
374
|
+
expect(detectMimeType('doc.doc')).toBe('application/msword');
|
|
375
|
+
expect(detectMimeType('doc.docx')).toBe('application/vnd.openxmlformats-officedocument.wordprocessingml.document');
|
|
376
|
+
expect(detectMimeType('doc.txt')).toBe('text/plain');
|
|
377
|
+
expect(detectMimeType('doc.zip')).toBe('application/zip');
|
|
378
|
+
});
|
|
379
|
+
it('should return octet-stream for unknown types', () => {
|
|
380
|
+
expect(detectMimeType('file.xyz')).toBe('application/octet-stream');
|
|
381
|
+
expect(detectMimeType('file')).toBe('application/octet-stream');
|
|
382
|
+
});
|
|
383
|
+
});
|
|
384
|
+
});
|
|
385
|
+
//# sourceMappingURL=media-processing.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-processing.test.js","sourceRoot":"","sources":["../../../src/agent/__tests__/media-processing.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -54,14 +54,18 @@ describe('FailoverError', () => {
|
|
|
54
54
|
});
|
|
55
55
|
describe('resolveFallbackCandidates', () => {
|
|
56
56
|
it('returns single candidate with no config', () => {
|
|
57
|
-
|
|
57
|
+
// With no config and no API keys in env, no candidates should be returned
|
|
58
|
+
const candidates = resolveFallbackCandidates({ cfg: {}, provider: 'anthropic', model: 'claude-sonnet-4-5' });
|
|
58
59
|
expect(candidates).toEqual([]);
|
|
59
60
|
});
|
|
60
61
|
it('includes fallbacks from config', () => {
|
|
61
62
|
const candidates = resolveFallbackCandidates({
|
|
62
63
|
cfg: {
|
|
63
64
|
agents: { defaults: { model: { primary: 'anthropic/claude-sonnet-4-5', fallbacks: ['openai/gpt-4o'] } } },
|
|
64
|
-
providers: {
|
|
65
|
+
providers: {
|
|
66
|
+
anthropic: 'test-key',
|
|
67
|
+
openai: 'test-key',
|
|
68
|
+
},
|
|
65
69
|
},
|
|
66
70
|
provider: 'anthropic',
|
|
67
71
|
model: 'claude-sonnet-4-5',
|
|
@@ -73,7 +77,10 @@ describe('resolveFallbackCandidates', () => {
|
|
|
73
77
|
const candidates = resolveFallbackCandidates({
|
|
74
78
|
cfg: {
|
|
75
79
|
agents: { defaults: { model: { primary: 'anthropic/claude-sonnet-4-5', fallbacks: ['openai/gpt-4o'] } } },
|
|
76
|
-
providers: {
|
|
80
|
+
providers: {
|
|
81
|
+
anthropic: 'test-key',
|
|
82
|
+
minimax: 'test-key',
|
|
83
|
+
},
|
|
77
84
|
},
|
|
78
85
|
provider: 'anthropic',
|
|
79
86
|
model: 'claude-sonnet-4-5',
|
|
@@ -86,7 +93,9 @@ describe('resolveFallbackCandidates', () => {
|
|
|
86
93
|
const candidates = resolveFallbackCandidates({
|
|
87
94
|
cfg: {
|
|
88
95
|
agents: { defaults: { model: { primary: 'anthropic/claude-sonnet-4-5', fallbacks: ['anthropic/claude-sonnet-4-5'] } } },
|
|
89
|
-
providers: {
|
|
96
|
+
providers: {
|
|
97
|
+
anthropic: 'test-key',
|
|
98
|
+
},
|
|
90
99
|
},
|
|
91
100
|
provider: 'anthropic',
|
|
92
101
|
model: 'claude-sonnet-4-5',
|
|
@@ -98,7 +107,9 @@ describe('resolveFallbackCandidates', () => {
|
|
|
98
107
|
const candidates = resolveFallbackCandidates({
|
|
99
108
|
cfg: {
|
|
100
109
|
agents: { defaults: { model: { primary: 'anthropic/claude-sonnet-4-5', fallbacks: ['openai/gpt-4o', 'unconfigured/model'] } } },
|
|
101
|
-
providers: {
|
|
110
|
+
providers: {
|
|
111
|
+
anthropic: 'test-key',
|
|
112
|
+
},
|
|
102
113
|
},
|
|
103
114
|
provider: 'anthropic',
|
|
104
115
|
model: 'claude-sonnet-4-5',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../../src/agent/fallback/__tests__/index.test.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../../src/agent/fallback/__tests__/index.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Config } from '../../config/schema.js';
|
|
2
|
+
import { isProviderConfigured } from '../../config/schema.js';
|
|
2
3
|
export interface ModelCandidate {
|
|
3
4
|
provider: string;
|
|
4
5
|
model: string;
|
|
@@ -11,10 +12,7 @@ export interface FallbackAttempt {
|
|
|
11
12
|
status?: number;
|
|
12
13
|
code?: string;
|
|
13
14
|
}
|
|
14
|
-
|
|
15
|
-
* Check if a provider is configured (has API key or is enabled for local providers)
|
|
16
|
-
*/
|
|
17
|
-
export declare function isProviderConfigured(cfg: Config | undefined, provider: string): boolean;
|
|
15
|
+
export { isProviderConfigured };
|
|
18
16
|
export declare function resolveFallbackCandidates(params: {
|
|
19
17
|
cfg: Config | undefined;
|
|
20
18
|
provider: string;
|