explorbot 0.5.5 → 0.5.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/models.json +7 -6
- package/dist/package.json +1 -1
- package/dist/src/commands/init-command.js +4 -1
- package/dist/src/commands/recommended-models-command.js +4 -0
- package/dist/src/config.js +6 -0
- package/docs/basics/getting-started.md +2 -1
- package/docs/basics/providers.md +7 -6
- package/docs/workflow/agentic-usage.md +1 -1
- package/models.json +7 -6
- package/package.json +1 -1
- package/src/commands/init-command.ts +3 -1
- package/src/commands/recommended-models-command.ts +2 -0
- package/src/config.ts +7 -0
package/dist/models.json
CHANGED
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
"openrouter": {
|
|
3
3
|
"model": "openai/gpt-oss-20b:nitro",
|
|
4
4
|
"visionModel": "openai/gpt-5.6-luna",
|
|
5
|
-
"agenticModel": "
|
|
5
|
+
"agenticModel": "anthropic/claude-haiku-5.5",
|
|
6
|
+
"decisionModel": "typesafe/jev-latest"
|
|
6
7
|
},
|
|
7
8
|
"poolside": {
|
|
8
9
|
"model": "poolside/laguna-xs-2.1"
|
|
@@ -14,13 +15,13 @@
|
|
|
14
15
|
},
|
|
15
16
|
"openai": {
|
|
16
17
|
"model": "gpt-5-nano",
|
|
17
|
-
"visionModel": "gpt-
|
|
18
|
-
"agenticModel": "gpt-
|
|
18
|
+
"visionModel": "gpt-6-luna",
|
|
19
|
+
"agenticModel": "gpt-6-luna"
|
|
19
20
|
},
|
|
20
21
|
"anthropic": {
|
|
21
|
-
"model": "claude-haiku-
|
|
22
|
-
"visionModel": "claude-haiku-
|
|
23
|
-
"agenticModel": "claude-haiku-
|
|
22
|
+
"model": "claude-haiku-5-5",
|
|
23
|
+
"visionModel": "claude-haiku-5-5",
|
|
24
|
+
"agenticModel": "claude-haiku-5-5"
|
|
24
25
|
},
|
|
25
26
|
"mistral": {
|
|
26
27
|
"model": "mistral-small-latest",
|
package/dist/package.json
CHANGED
|
@@ -225,7 +225,10 @@ export function modelLines(provider, only) {
|
|
|
225
225
|
let selected = roles;
|
|
226
226
|
if (only)
|
|
227
227
|
selected = roles.filter(([role]) => only.includes(role));
|
|
228
|
-
|
|
228
|
+
const lines = selected.map(([role, comment]) => ` // ${comment}\n ${role}: '${provider}/${recommended[role] || '<model-id>'}',`);
|
|
229
|
+
if (!only && recommended.decisionModel)
|
|
230
|
+
lines.push(` // decision model judging ambiguous outcomes\n decisionModel: { provider: '${provider}', model: '${recommended.decisionModel}' },`);
|
|
231
|
+
return lines.join('\n');
|
|
229
232
|
}
|
|
230
233
|
function globalConfigTemplate(provider) {
|
|
231
234
|
const { envKey } = PROVIDERS[provider];
|
|
@@ -44,6 +44,8 @@ export class RecommendedModelsCommand extends BaseCommand {
|
|
|
44
44
|
if (!roles[role])
|
|
45
45
|
models.push([label, chalk.dim('not served, pair with another provider')]);
|
|
46
46
|
}
|
|
47
|
+
if (roles.decisionModel)
|
|
48
|
+
models.push(['decisionModel (judge)', roles.decisionModel]);
|
|
47
49
|
lines.push(...renderSection('models', models, 2));
|
|
48
50
|
const envKey = PROVIDERS[provider]?.envKey;
|
|
49
51
|
if (!envKey) {
|
|
@@ -61,6 +63,8 @@ export class RecommendedModelsCommand extends BaseCommand {
|
|
|
61
63
|
env.push([label, `${ROLES[role].env}=${provider}/${roles[role]}`]);
|
|
62
64
|
label = '';
|
|
63
65
|
}
|
|
66
|
+
if (roles.decisionModel)
|
|
67
|
+
env.push(['decision', `EXPLORBOT_DECISION_MODEL=${provider}/${roles.decisionModel}`]);
|
|
64
68
|
lines.push(...renderSection('env variables', env, 2));
|
|
65
69
|
}
|
|
66
70
|
const modelVars = ['EXPLORBOT_AI_PROVIDER', ...MODEL_ENV_VARS];
|
package/dist/src/config.js
CHANGED
|
@@ -137,6 +137,10 @@ export class ConfigParser {
|
|
|
137
137
|
sourcePath = join(outputRoot, 'explorbot.config.js');
|
|
138
138
|
log(`Configuration built from EXPLORBOT_* environment variables. Output: ${outputRoot}`);
|
|
139
139
|
}
|
|
140
|
+
const configuredUrl = loadedConfig?.playwright?.url || loadedConfig?.web?.url || '';
|
|
141
|
+
if (!this.runBase && resolvedPath && !isGlobalConfigPath(resolvedPath) && URL.canParse(configuredUrl)) {
|
|
142
|
+
this.runBase = parseRunBase(configuredUrl);
|
|
143
|
+
}
|
|
140
144
|
let config = this.resolveConfig(loadedConfig);
|
|
141
145
|
await resolveConfigModels(config.ai);
|
|
142
146
|
this.site = null;
|
|
@@ -377,6 +381,8 @@ export class ConfigParser {
|
|
|
377
381
|
ai.agenticModel = await resolveModel(agenticSpec, 'agenticModel');
|
|
378
382
|
if (!agenticSpec && recommended.agenticModel)
|
|
379
383
|
ai.agenticModel = await resolveModel(provider, 'agenticModel');
|
|
384
|
+
if (recommended.decisionModel)
|
|
385
|
+
ai.decisionModel = { provider: provider, model: recommended.decisionModel };
|
|
380
386
|
const dirs = { knowledge: 'knowledge', experience: 'experience', output: 'output' };
|
|
381
387
|
if (process.env.EXPLORBOT_OUTPUT)
|
|
382
388
|
dirs.output = '.';
|
|
@@ -39,7 +39,8 @@ export default {
|
|
|
39
39
|
ai: {
|
|
40
40
|
model: 'openrouter/openai/gpt-oss-20b:nitro',
|
|
41
41
|
visionModel: 'openrouter/openai/gpt-5.6-luna',
|
|
42
|
-
agenticModel: 'openrouter/
|
|
42
|
+
agenticModel: 'openrouter/anthropic/claude-haiku-5.5',
|
|
43
|
+
decisionModel: { provider: 'openrouter', model: 'typesafe/jev-latest' },
|
|
43
44
|
},
|
|
44
45
|
};
|
|
45
46
|
```
|
package/docs/basics/providers.md
CHANGED
|
@@ -56,7 +56,8 @@ export default {
|
|
|
56
56
|
ai: {
|
|
57
57
|
model: openrouter('openai/gpt-oss-20b:nitro'),
|
|
58
58
|
visionModel: openrouter('openai/gpt-5.6-luna'),
|
|
59
|
-
agenticModel: openrouter('
|
|
59
|
+
agenticModel: openrouter('anthropic/claude-haiku-5.5'),
|
|
60
|
+
decisionModel: { provider: 'openrouter', model: 'typesafe/jev-latest' },
|
|
60
61
|
},
|
|
61
62
|
};
|
|
62
63
|
```
|
|
@@ -123,8 +124,8 @@ Set the recommended models in the exported config:
|
|
|
123
124
|
export default {
|
|
124
125
|
ai: {
|
|
125
126
|
model: openai('gpt-5-nano'),
|
|
126
|
-
visionModel: openai('gpt-
|
|
127
|
-
agenticModel: openai('gpt-
|
|
127
|
+
visionModel: openai('gpt-6-luna'),
|
|
128
|
+
agenticModel: openai('gpt-6-luna'),
|
|
128
129
|
},
|
|
129
130
|
};
|
|
130
131
|
```
|
|
@@ -156,9 +157,9 @@ Set the recommended model in the exported config:
|
|
|
156
157
|
```javascript
|
|
157
158
|
export default {
|
|
158
159
|
ai: {
|
|
159
|
-
model: anthropic('claude-haiku-
|
|
160
|
-
visionModel: anthropic('claude-haiku-
|
|
161
|
-
agenticModel: anthropic('claude-haiku-
|
|
160
|
+
model: anthropic('claude-haiku-5-5'),
|
|
161
|
+
visionModel: anthropic('claude-haiku-5-5'),
|
|
162
|
+
agenticModel: anthropic('claude-haiku-5-5'),
|
|
162
163
|
},
|
|
163
164
|
};
|
|
164
165
|
```
|
|
@@ -103,7 +103,7 @@ On its own, without a provider, `EXPLORBOT_AI_MODEL` must carry the provider as
|
|
|
103
103
|
```
|
|
104
104
|
openrouter/openai/gpt-oss-120b:nitro → openrouter, model "openai/gpt-oss-120b:nitro"
|
|
105
105
|
groq/openai/gpt-oss-20b → groq, model "openai/gpt-oss-20b"
|
|
106
|
-
anthropic/claude-haiku-
|
|
106
|
+
anthropic/claude-haiku-5-5 → anthropic, model "claude-haiku-5-5"
|
|
107
107
|
```
|
|
108
108
|
|
|
109
109
|
`EXPLORBOT_VISION_MODEL` and `EXPLORBOT_AGENTIC_MODEL` override those roles the same way — a provider name for its recommendation, or `provider/model-id` to pin one. Mix the forms to take a provider's recommendations and override one role:
|
package/models.json
CHANGED
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
"openrouter": {
|
|
3
3
|
"model": "openai/gpt-oss-20b:nitro",
|
|
4
4
|
"visionModel": "openai/gpt-5.6-luna",
|
|
5
|
-
"agenticModel": "
|
|
5
|
+
"agenticModel": "anthropic/claude-haiku-5.5",
|
|
6
|
+
"decisionModel": "typesafe/jev-latest"
|
|
6
7
|
},
|
|
7
8
|
"poolside": {
|
|
8
9
|
"model": "poolside/laguna-xs-2.1"
|
|
@@ -14,13 +15,13 @@
|
|
|
14
15
|
},
|
|
15
16
|
"openai": {
|
|
16
17
|
"model": "gpt-5-nano",
|
|
17
|
-
"visionModel": "gpt-
|
|
18
|
-
"agenticModel": "gpt-
|
|
18
|
+
"visionModel": "gpt-6-luna",
|
|
19
|
+
"agenticModel": "gpt-6-luna"
|
|
19
20
|
},
|
|
20
21
|
"anthropic": {
|
|
21
|
-
"model": "claude-haiku-
|
|
22
|
-
"visionModel": "claude-haiku-
|
|
23
|
-
"agenticModel": "claude-haiku-
|
|
22
|
+
"model": "claude-haiku-5-5",
|
|
23
|
+
"visionModel": "claude-haiku-5-5",
|
|
24
|
+
"agenticModel": "claude-haiku-5-5"
|
|
24
25
|
},
|
|
25
26
|
"mistral": {
|
|
26
27
|
"model": "mistral-small-latest",
|
package/package.json
CHANGED
|
@@ -260,7 +260,9 @@ export function modelLines(provider: string, only?: ModelRole[]): string {
|
|
|
260
260
|
let selected = roles;
|
|
261
261
|
if (only) selected = roles.filter(([role]) => only.includes(role));
|
|
262
262
|
|
|
263
|
-
|
|
263
|
+
const lines = selected.map(([role, comment]) => ` // ${comment}\n ${role}: '${provider}/${recommended[role] || '<model-id>'}',`);
|
|
264
|
+
if (!only && recommended.decisionModel) lines.push(` // decision model judging ambiguous outcomes\n decisionModel: { provider: '${provider}', model: '${recommended.decisionModel}' },`);
|
|
265
|
+
return lines.join('\n');
|
|
264
266
|
}
|
|
265
267
|
|
|
266
268
|
function globalConfigTemplate(provider: string): string {
|
|
@@ -52,6 +52,7 @@ export class RecommendedModelsCommand extends BaseCommand {
|
|
|
52
52
|
if (roles[role]) models.push([label, roles[role]]);
|
|
53
53
|
if (!roles[role]) models.push([label, chalk.dim('not served, pair with another provider')]);
|
|
54
54
|
}
|
|
55
|
+
if (roles.decisionModel) models.push(['decisionModel (judge)', roles.decisionModel]);
|
|
55
56
|
lines.push(...renderSection('models', models, 2));
|
|
56
57
|
|
|
57
58
|
const envKey = PROVIDERS[provider]?.envKey;
|
|
@@ -70,6 +71,7 @@ export class RecommendedModelsCommand extends BaseCommand {
|
|
|
70
71
|
env.push([label, `${ROLES[role].env}=${provider}/${roles[role]}`]);
|
|
71
72
|
label = '';
|
|
72
73
|
}
|
|
74
|
+
if (roles.decisionModel) env.push(['decision', `EXPLORBOT_DECISION_MODEL=${provider}/${roles.decisionModel}`]);
|
|
73
75
|
lines.push(...renderSection('env variables', env, 2));
|
|
74
76
|
}
|
|
75
77
|
|
package/src/config.ts
CHANGED
|
@@ -420,6 +420,11 @@ export class ConfigParser {
|
|
|
420
420
|
log(`Configuration built from EXPLORBOT_* environment variables. Output: ${outputRoot}`);
|
|
421
421
|
}
|
|
422
422
|
|
|
423
|
+
const configuredUrl = loadedConfig?.playwright?.url || loadedConfig?.web?.url || '';
|
|
424
|
+
if (!this.runBase && resolvedPath && !isGlobalConfigPath(resolvedPath) && URL.canParse(configuredUrl)) {
|
|
425
|
+
this.runBase = parseRunBase(configuredUrl);
|
|
426
|
+
}
|
|
427
|
+
|
|
423
428
|
let config = this.resolveConfig(loadedConfig as ExplorbotConfig);
|
|
424
429
|
await resolveConfigModels(config.ai);
|
|
425
430
|
this.site = null;
|
|
@@ -675,6 +680,8 @@ export class ConfigParser {
|
|
|
675
680
|
if (agenticSpec) ai.agenticModel = await resolveModel(agenticSpec, 'agenticModel');
|
|
676
681
|
if (!agenticSpec && recommended.agenticModel) ai.agenticModel = await resolveModel(provider!, 'agenticModel');
|
|
677
682
|
|
|
683
|
+
if (recommended.decisionModel) ai.decisionModel = { provider: provider!, model: recommended.decisionModel };
|
|
684
|
+
|
|
678
685
|
const dirs = { knowledge: 'knowledge', experience: 'experience', output: 'output' };
|
|
679
686
|
if (process.env.EXPLORBOT_OUTPUT) dirs.output = '.';
|
|
680
687
|
|