claude-scionos 4.3.3 → 4.3.5
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.fr.md +5 -1
- package/README.md +5 -1
- package/index.js +7 -2
- package/package.json +1 -1
- package/src/proxy.js +33 -0
- package/src/routerlab.js +35 -2
package/README.fr.md
CHANGED
|
@@ -56,6 +56,8 @@ npx claude-scionos auth test
|
|
|
56
56
|
npx claude-scionos --strategy aws
|
|
57
57
|
npx claude-scionos --service llm --strategy claude
|
|
58
58
|
npx claude-scionos --service llm --strategy claude-gpt
|
|
59
|
+
npx claude-scionos --service llm --strategy claude-gpt-special
|
|
60
|
+
npx claude-scionos --service llm --strategy deepseek-v4-beta
|
|
59
61
|
npx claude-scionos --strategy aws --no-prompt -p "Résume ce dépôt"
|
|
60
62
|
```
|
|
61
63
|
|
|
@@ -65,7 +67,7 @@ npx claude-scionos --strategy aws --no-prompt -p "Résume ce dépôt"
|
|
|
65
67
|
- `--service llm` bascule le lanceur vers `https://llm.routerlab.ch`
|
|
66
68
|
- `llm` est prévu pour un accès sur invitation
|
|
67
69
|
- les tokens enregistrés avec `auth login --service llm` sont stockés séparément du token RouterLab par défaut
|
|
68
|
-
- `llm` expose pour l'instant `claude`, `claude-gpt`, `claude-
|
|
70
|
+
- `llm` expose pour l'instant `claude`, `claude-gpt`, `claude-gpt-special` et `deepseek-v4-beta`
|
|
69
71
|
- `routerlab` expose aussi `claude-gpt`, `claude-minimax-m2.7` et `claude-glm-5.1`
|
|
70
72
|
|
|
71
73
|
## Stratégies
|
|
@@ -75,6 +77,8 @@ npx claude-scionos --strategy aws --no-prompt -p "Résume ce dépôt"
|
|
|
75
77
|
- `claude` : remappe les familles de modèles Claude sur `--service llm` vers les variantes Claude standard `claude-haiku-4-5-20251001`, `claude-sonnet-4-6` et `claude-opus-4-6`
|
|
76
78
|
- `claude-gpt` : mappe les requêtes Claude vers la famille `claude-gpt`
|
|
77
79
|
`claude-gpt-5.5 ==> claude-opus-4.7`, `claude-gpt-5.4 ==> claude-sonnet-4.6`, `claude-gpt-5.4-mini ==> claude-gpt-5.4-mini`
|
|
80
|
+
- `claude-gpt-special` : sur `--service llm`, force toutes les requêtes vers `claude-gpt-5.4-sp`
|
|
81
|
+
- `deepseek-v4-beta` : sur `--service llm`, mappe les requêtes Claude vers `claude-deepseek-v4-pro` pour opus et `claude-deepseek-v4-flash` pour sonnet ou haiku
|
|
78
82
|
- `claude-qwen3.6-plus` : force toutes les requêtes vers `claude-qwen3.6-plus`
|
|
79
83
|
- `claude-minimax-m2.7` : force toutes les requêtes vers `claude-minimax-m2.7`
|
|
80
84
|
- `claude-glm-5.1` : force toutes les requêtes vers `claude-glm-5.1`
|
package/README.md
CHANGED
|
@@ -56,6 +56,8 @@ npx claude-scionos auth test
|
|
|
56
56
|
npx claude-scionos --strategy aws
|
|
57
57
|
npx claude-scionos --service llm --strategy claude
|
|
58
58
|
npx claude-scionos --service llm --strategy claude-gpt
|
|
59
|
+
npx claude-scionos --service llm --strategy claude-gpt-special
|
|
60
|
+
npx claude-scionos --service llm --strategy deepseek-v4-beta
|
|
59
61
|
npx claude-scionos --strategy aws --no-prompt -p "Summarize this repo"
|
|
60
62
|
```
|
|
61
63
|
|
|
@@ -65,7 +67,7 @@ npx claude-scionos --strategy aws --no-prompt -p "Summarize this repo"
|
|
|
65
67
|
- `--service llm` switches the launcher to `https://llm.routerlab.ch`
|
|
66
68
|
- `llm` is intended for invitation-only access
|
|
67
69
|
- Tokens stored with `auth login --service llm` are kept separate from the default RouterLab token
|
|
68
|
-
- `llm` currently exposes `claude`, `claude-gpt`, `claude-
|
|
70
|
+
- `llm` currently exposes `claude`, `claude-gpt`, `claude-gpt-special`, and `deepseek-v4-beta`
|
|
69
71
|
- `routerlab` also exposes `claude-gpt`, `claude-minimax-m2.7`, and `claude-glm-5.1`
|
|
70
72
|
|
|
71
73
|
## Strategies
|
|
@@ -75,6 +77,8 @@ npx claude-scionos --strategy aws --no-prompt -p "Summarize this repo"
|
|
|
75
77
|
- `claude`: remap Claude model families on `--service llm` to the standard Claude variants `claude-haiku-4-5-20251001`, `claude-sonnet-4-6`, and `claude-opus-4-6`
|
|
76
78
|
- `claude-gpt`: map Claude requests to the `claude-gpt` family
|
|
77
79
|
`claude-gpt-5.5 ==> claude-opus-4.7`, `claude-gpt-5.4 ==> claude-sonnet-4.6`, `claude-gpt-5.4-mini ==> claude-gpt-5.4-mini`
|
|
80
|
+
- `claude-gpt-special`: on `--service llm`, force all requests to `claude-gpt-5.4-sp`
|
|
81
|
+
- `deepseek-v4-beta`: on `--service llm`, map Claude requests to `claude-deepseek-v4-pro` for opus and `claude-deepseek-v4-flash` for sonnet or haiku
|
|
78
82
|
- `claude-qwen3.6-plus`: force all requests to `claude-qwen3.6-plus`
|
|
79
83
|
- `claude-minimax-m2.7`: force all requests to `claude-minimax-m2.7`
|
|
80
84
|
- `claude-glm-5.1`: force all requests to `claude-glm-5.1`
|
package/index.js
CHANGED
|
@@ -562,11 +562,16 @@ async function runDoctor(serviceConfig) {
|
|
|
562
562
|
showStatus('Env token', getEnvironmentToken() ? 'ok' : 'warn', getEnvironmentToken() ? 'available' : 'not set');
|
|
563
563
|
console.log('');
|
|
564
564
|
|
|
565
|
-
const
|
|
565
|
+
const envToken = getEnvironmentToken();
|
|
566
|
+
const candidate = envToken
|
|
567
|
+
? { token: envToken, source: 'environment' }
|
|
568
|
+
: { token: null, source: storedStatus.stored ? 'secure-store' : 'none' };
|
|
566
569
|
let validation = null;
|
|
567
570
|
|
|
568
571
|
if (!candidate.token) {
|
|
569
|
-
showStatus(`${serviceConfig.tokenPromptLabel} auth`, 'warn',
|
|
572
|
+
showStatus(`${serviceConfig.tokenPromptLabel} auth`, 'warn', storedStatus.stored
|
|
573
|
+
? 'Skipped: stored token available but not validated during doctor on Windows'
|
|
574
|
+
: 'Skipped: no environment or stored token available');
|
|
570
575
|
} else {
|
|
571
576
|
validation = await validateToken(candidate.token, {
|
|
572
577
|
baseUrl: resolveServiceBaseUrl(serviceConfig.value),
|
package/package.json
CHANGED
package/src/proxy.js
CHANGED
|
@@ -76,6 +76,14 @@ function getPreferredClaudeModel(requestedModel = '') {
|
|
|
76
76
|
return 'claude-sonnet-4-6';
|
|
77
77
|
}
|
|
78
78
|
|
|
79
|
+
function getPreferredDeepseekV4Model(requestedModel = '') {
|
|
80
|
+
if (requestedModel.includes('opus')) {
|
|
81
|
+
return 'claude-deepseek-v4-pro';
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return 'claude-deepseek-v4-flash';
|
|
85
|
+
}
|
|
86
|
+
|
|
79
87
|
function resolveMappedModel(targetModel, requestedModel = '', availableModels = []) {
|
|
80
88
|
if (targetModel === 'claude') {
|
|
81
89
|
const preferredModel = getPreferredClaudeModel(requestedModel);
|
|
@@ -98,6 +106,31 @@ function resolveMappedModel(targetModel, requestedModel = '', availableModels =
|
|
|
98
106
|
);
|
|
99
107
|
}
|
|
100
108
|
|
|
109
|
+
if (targetModel === 'claude-gpt-special') {
|
|
110
|
+
return 'claude-gpt-5.4-sp';
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
if (targetModel === 'deepseek-v4-beta') {
|
|
114
|
+
const preferredModel = getPreferredDeepseekV4Model(requestedModel);
|
|
115
|
+
const availableDeepseekModels = Array.isArray(availableModels)
|
|
116
|
+
? availableModels.filter((model) => model === 'claude-deepseek-v4-pro' || model === 'claude-deepseek-v4-flash')
|
|
117
|
+
: [];
|
|
118
|
+
|
|
119
|
+
if (availableDeepseekModels.length === 0) {
|
|
120
|
+
return preferredModel;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
if (availableDeepseekModels.includes(preferredModel)) {
|
|
124
|
+
return preferredModel;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
return (
|
|
128
|
+
availableDeepseekModels.find((model) => model === 'claude-deepseek-v4-flash')
|
|
129
|
+
?? availableDeepseekModels[0]
|
|
130
|
+
?? preferredModel
|
|
131
|
+
);
|
|
132
|
+
}
|
|
133
|
+
|
|
101
134
|
if (targetModel !== 'aws') {
|
|
102
135
|
if (targetModel !== 'claude-gpt') {
|
|
103
136
|
return targetModel;
|
package/src/routerlab.js
CHANGED
|
@@ -28,7 +28,7 @@ const SERVICES = {
|
|
|
28
28
|
secureStorageAccount: 'routerlab-llm-token',
|
|
29
29
|
secureStorageLabel: 'RouterLab LLM Token',
|
|
30
30
|
secureStorageFileName: 'routerlab-llm-token.secure.txt',
|
|
31
|
-
strategyValues: ['claude', 'claude-gpt', 'claude-
|
|
31
|
+
strategyValues: ['claude', 'claude-gpt', 'claude-gpt-special', 'deepseek-v4-beta'],
|
|
32
32
|
},
|
|
33
33
|
};
|
|
34
34
|
const DEFAULT_SERVICE = 'routerlab';
|
|
@@ -102,6 +102,22 @@ const STRATEGIES = [
|
|
|
102
102
|
aliases: ['claude-gpt-5.4'],
|
|
103
103
|
verificationModels: ['claude-gpt-5.4'],
|
|
104
104
|
},
|
|
105
|
+
{
|
|
106
|
+
value: 'claude-gpt-special',
|
|
107
|
+
name: 'OpenAI GPT special',
|
|
108
|
+
selectionName: 'OpenAI GPT special (only gpt-5.4)',
|
|
109
|
+
description: 'Forces all requests to claude-gpt-5.4-sp.',
|
|
110
|
+
selectionDescription: 'Forces all requests to claude-gpt-5.4-sp.',
|
|
111
|
+
mappedModels: ['claude-gpt-5.4-sp'],
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
value: 'deepseek-v4-beta',
|
|
115
|
+
name: 'deepseek-v4 beta',
|
|
116
|
+
selectionName: 'deepseek-v4 beta',
|
|
117
|
+
description: 'Maps Claude requests to the deepseek-v4 family. Opus 4.7 => claude-deepseek-v4-pro, Sonnet 4.6 => claude-deepseek-v4-flash, Haiku => claude-deepseek-v4-flash.',
|
|
118
|
+
selectionDescription: 'Opus 4.7 => claude-deepseek-v4-pro, Sonnet 4.6 => claude-deepseek-v4-flash, Haiku => claude-deepseek-v4-flash.',
|
|
119
|
+
verificationModels: ['claude-deepseek-v4-pro', 'claude-deepseek-v4-flash'],
|
|
120
|
+
},
|
|
105
121
|
{
|
|
106
122
|
value: 'claude-qwen3.6-plus',
|
|
107
123
|
name: 'Qwen3.6 Plus',
|
|
@@ -271,7 +287,15 @@ function getServiceStrategies(serviceValue = DEFAULT_SERVICE) {
|
|
|
271
287
|
}
|
|
272
288
|
|
|
273
289
|
function normalizeStrategyValue(strategyValue) {
|
|
274
|
-
|
|
290
|
+
if (strategyValue === 'claude-gpt-5.4') {
|
|
291
|
+
return 'claude-gpt';
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
if (strategyValue === 'claude-gpt-5.4-sp') {
|
|
295
|
+
return 'claude-gpt-special';
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
return strategyValue;
|
|
275
299
|
}
|
|
276
300
|
|
|
277
301
|
function findStrategy(strategyValue, serviceValue = DEFAULT_SERVICE) {
|
|
@@ -671,6 +695,15 @@ function deleteStoredToken(serviceValue = DEFAULT_SERVICE) {
|
|
|
671
695
|
|
|
672
696
|
function getStoredTokenStatus(serviceValue = DEFAULT_SERVICE) {
|
|
673
697
|
const storage = getSecureStorageBackend();
|
|
698
|
+
|
|
699
|
+
if (process.platform === 'win32') {
|
|
700
|
+
const tokenFile = getWindowsTokenFile(serviceValue);
|
|
701
|
+
return {
|
|
702
|
+
...storage,
|
|
703
|
+
stored: fs.existsSync(tokenFile) && hasNonEmptyWindowsTokenFile(tokenFile),
|
|
704
|
+
};
|
|
705
|
+
}
|
|
706
|
+
|
|
674
707
|
const storedToken = getStoredToken(serviceValue);
|
|
675
708
|
return {
|
|
676
709
|
...storage,
|