@parallel-cli/parallel 0.4.1 → 0.4.3
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/CHANGELOG.md +116 -0
- package/README.md +136 -131
- package/dist/commands.js +17 -4
- package/dist/config.js +218 -63
- package/dist/controller.js +13 -11
- package/dist/i18n.js +64 -20
- package/dist/index.js +5 -2
- package/dist/pricing.js +162 -54
- package/dist/ui/App.js +141 -56
- package/dist/ui/CommandInput.js +42 -17
- package/dist/ui/SettingsPanel.js +153 -31
- package/dist/ui/Wizard.js +33 -3
- package/dist/ui/views.js +15 -6
- package/package.json +10 -1
package/dist/i18n.js
CHANGED
|
@@ -55,6 +55,10 @@ const en = {
|
|
|
55
55
|
'wiz.provider.name.ph': 'e.g. openrouter, mistral, ollama…',
|
|
56
56
|
'wiz.provider.url.title': 'Base URL (OpenAI-compatible endpoint)',
|
|
57
57
|
'wiz.provider.url.ph': 'e.g. https://openrouter.ai/api/v1',
|
|
58
|
+
'wiz.provider.endpoint.title': 'Review endpoint for {name}',
|
|
59
|
+
'wiz.provider.endpoint.model': 'Model: {model}',
|
|
60
|
+
'wiz.provider.endpoint.use': 'Use this endpoint',
|
|
61
|
+
'wiz.provider.endpoint.edit': 'Edit endpoint',
|
|
58
62
|
'wiz.provider.model.title': "Model name — exactly as written in the provider's documentation",
|
|
59
63
|
'wiz.provider.model.ph': 'e.g. deepseek-chat, gpt-4o-mini, qwen2.5-coder…',
|
|
60
64
|
'wiz.provider.key.title': 'API key for {name}',
|
|
@@ -117,7 +121,7 @@ const en = {
|
|
|
117
121
|
'help.l2d': ' for everyone).',
|
|
118
122
|
'help.l3': "Agents see each other's statuses and diffs before every action: they co-edit the same files without blocking and without breaking each other's work.",
|
|
119
123
|
'help.states': 'States: 🔨 working · 👂 listening to other agents (double border) · 🧠 thinking · ✋ waiting for your approval · ⏹ stop. Sounds: 1 beep = agent launched/finished, 2 beeps = approval required (/sound off to mute).',
|
|
120
|
-
'help.keys': 'Esc: back to agents view · Tab: completion · ↑/↓: history · Ctrl+V: paste image',
|
|
124
|
+
'help.keys': 'Esc: back to agents view · Tab: completion · ↑/↓: suggestions, history, or view scroll · Ctrl+V: paste image',
|
|
121
125
|
// commands (descriptions)
|
|
122
126
|
'cmd.ask': 'Ask-only agent: answers and advises without editing',
|
|
123
127
|
'cmd.task': 'Task agent: executes, edits, validates, summarizes',
|
|
@@ -155,6 +159,8 @@ const en = {
|
|
|
155
159
|
'cmd.doctor': 'Check provider/model/API key configuration and repair hints',
|
|
156
160
|
'cmd.settings': 'Global settings — providers, API keys, language, defaults (persisted)',
|
|
157
161
|
'cmd.ssettings': 'Session settings — model, approvals, sound (this session only)',
|
|
162
|
+
'cmd.project': 'Change project folder or reopen folder picker',
|
|
163
|
+
'cmd.wizard': 'Relaunch the setup wizard',
|
|
158
164
|
'cmd.approvals': 'Shell approvals: ask, auto-safe, or yolo (this session)',
|
|
159
165
|
'cmd.sound': 'Sound cues (this session)',
|
|
160
166
|
'cmd.save': 'Save the session now (optionally with a name)',
|
|
@@ -252,7 +258,7 @@ const en = {
|
|
|
252
258
|
'm.usageSession': 'Usage: /sessions to list, then /session <n> or /session latest',
|
|
253
259
|
'm.sessionLoaded': '📂 Session from {date} loaded.',
|
|
254
260
|
'm.missingProvider': 'No provider configured. Open /settings → Add a provider, or restart with a first-run config.',
|
|
255
|
-
'm.missingKey': 'Provider {name} has no API key. Use /
|
|
261
|
+
'm.missingKey': 'Provider {name} has no API key. Use /settings → Providers → API key.',
|
|
256
262
|
'm.missingModel': 'Provider {name} has no default model. Use /settings → Provider models.',
|
|
257
263
|
'm.doctorOk': '✓ Configuration ready: {pm}. Changes: /settings · temporary model: /model [provider:]model',
|
|
258
264
|
'm.spawnFail': 'Cannot launch the agent: no usable provider/model. Configure one via /settings.',
|
|
@@ -330,9 +336,12 @@ const en = {
|
|
|
330
336
|
'set.newSkillName': 'Skill name (a .md template will be created in ~/.parallel/skills)',
|
|
331
337
|
'set.newSpecialistName': 'Specialist name (a .md template will be created in ~/.parallel/specialists)',
|
|
332
338
|
// provider-pick section headers
|
|
333
|
-
'wiz.provider.section.configured': 'Configured',
|
|
334
|
-
'wiz.provider.section.
|
|
335
|
-
'wiz.provider.section.
|
|
339
|
+
'wiz.provider.section.configured': 'Configured Providers',
|
|
340
|
+
'wiz.provider.section.western': 'Western',
|
|
341
|
+
'wiz.provider.section.chinese': 'Chinese',
|
|
342
|
+
'wiz.provider.section.gateways': 'Gateways',
|
|
343
|
+
'wiz.provider.section.inference': 'Inference',
|
|
344
|
+
'wiz.provider.section.local': 'Local Models',
|
|
336
345
|
'wiz.provider.customDetail': 'Configure manually',
|
|
337
346
|
'wiz.provider.ollamaDetail': 'Local — no API key needed',
|
|
338
347
|
'wiz.provider.ollama.checking': 'Checking Ollama at localhost:11434...',
|
|
@@ -347,6 +356,8 @@ const en = {
|
|
|
347
356
|
'set.providers.back': 'Back',
|
|
348
357
|
'set.providerDetail.title': '{name}',
|
|
349
358
|
'set.providerDetail.key': 'Set API Key',
|
|
359
|
+
'set.providerDetail.clearKey': 'Clear API Key',
|
|
360
|
+
'set.providerDetail.endpoint': 'Endpoint',
|
|
350
361
|
'set.providerDetail.models': 'Manage Models',
|
|
351
362
|
'set.providerDetail.pricing': 'Pricing',
|
|
352
363
|
'set.providerDetail.setDefault': 'Set as Default',
|
|
@@ -396,6 +407,10 @@ const fr = {
|
|
|
396
407
|
'wiz.provider.name.ph': 'ex : openrouter, mistral, ollama…',
|
|
397
408
|
'wiz.provider.url.title': 'URL de base (endpoint OpenAI-compatible)',
|
|
398
409
|
'wiz.provider.url.ph': 'ex : https://openrouter.ai/api/v1',
|
|
410
|
+
'wiz.provider.endpoint.title': 'Vérifier l’endpoint de {name}',
|
|
411
|
+
'wiz.provider.endpoint.model': 'Modèle : {model}',
|
|
412
|
+
'wiz.provider.endpoint.use': 'Utiliser cet endpoint',
|
|
413
|
+
'wiz.provider.endpoint.edit': 'Modifier l’endpoint',
|
|
399
414
|
'wiz.provider.model.title': 'Nom du modèle — exactement comme dans la documentation du provider',
|
|
400
415
|
'wiz.provider.model.ph': 'ex : deepseek-chat, gpt-4o-mini, qwen2.5-coder…',
|
|
401
416
|
'wiz.provider.key.title': 'Clef API pour {name}',
|
|
@@ -454,7 +469,7 @@ const fr = {
|
|
|
454
469
|
'help.l2d': ' pour tous).',
|
|
455
470
|
'help.l3': 'Les agents voient mutuellement leurs statuts et leurs diffs avant chaque action : ils co-éditent les mêmes fichiers sans se bloquer et sans casser le travail des autres.',
|
|
456
471
|
'help.states': "États : 🔨 travaille · 👂 écoute les autres agents (double bordure) · 🧠 réfléchit · ✋ attend ton approbation · ⏹ stop. Sons : 1 bip = agent lancé/terminé, 2 bips = approbation requise (/sound off pour couper).",
|
|
457
|
-
'help.keys': 'Esc : revenir à la vue agents · Tab : complétion · ↑/↓ : historique · Ctrl+V : coller une image',
|
|
472
|
+
'help.keys': 'Esc : revenir à la vue agents · Tab : complétion · ↑/↓ : suggestions, historique ou scroll selon la vue · Ctrl+V : coller une image',
|
|
458
473
|
'cmd.ask': 'Agent ask : répond et conseille sans modifier',
|
|
459
474
|
'cmd.task': 'Agent task : exécute, modifie, valide, résume',
|
|
460
475
|
'cmd.agents': 'Vue panneaux agents (temps réel)',
|
|
@@ -491,6 +506,8 @@ const fr = {
|
|
|
491
506
|
'cmd.doctor': 'Vérifier provider/modèle/clef API et afficher les corrections',
|
|
492
507
|
'cmd.settings': 'Réglages globaux — providers, clefs API, langue, défauts (persistés)',
|
|
493
508
|
'cmd.ssettings': 'Réglages de session — modèle, approbations, son (cette session)',
|
|
509
|
+
'cmd.project': 'Changer de dossier projet ou rouvrir le choix de dossier',
|
|
510
|
+
'cmd.wizard': 'Relancer le wizard de configuration',
|
|
494
511
|
'cmd.approvals': 'Approbations shell : ask, auto-safe ou yolo (cette session)',
|
|
495
512
|
'cmd.sound': 'Repères sonores (cette session)',
|
|
496
513
|
'cmd.save': 'Sauvegarder la session maintenant (avec un nom optionnel)',
|
|
@@ -587,7 +604,7 @@ const fr = {
|
|
|
587
604
|
'm.usageSession': 'Usage : /sessions pour lister, puis /session <n> ou /session latest',
|
|
588
605
|
'm.sessionLoaded': '📂 Session du {date} chargée.',
|
|
589
606
|
'm.missingProvider': 'Aucun provider configuré. Ouvre /settings → Ajouter un provider, ou relance une première config.',
|
|
590
|
-
'm.missingKey': 'Le provider {name} n’a pas de clef API. Utilise /
|
|
607
|
+
'm.missingKey': 'Le provider {name} n’a pas de clef API. Utilise /settings → Providers → Clef API.',
|
|
591
608
|
'm.missingModel': 'Le provider {name} n’a pas de modèle par défaut. Utilise /settings → Modèles du provider.',
|
|
592
609
|
'm.doctorOk': '✓ Configuration prête : {pm}. Changements : /settings · modèle temporaire : /model [provider:]modèle',
|
|
593
610
|
'm.spawnFail': "Impossible de lancer l'agent : aucun provider/modèle utilisable. Configure-en un via /settings.",
|
|
@@ -658,9 +675,12 @@ const fr = {
|
|
|
658
675
|
'set.newSkillName': 'Nom du skill (un modèle .md sera créé dans ~/.parallel/skills)',
|
|
659
676
|
'set.newSpecialistName': 'Nom du spécialiste (un modèle .md sera créé dans ~/.parallel/specialists)',
|
|
660
677
|
// provider-pick section headers
|
|
661
|
-
'wiz.provider.section.configured': '
|
|
662
|
-
'wiz.provider.section.
|
|
663
|
-
'wiz.provider.section.
|
|
678
|
+
'wiz.provider.section.configured': 'Providers configurés',
|
|
679
|
+
'wiz.provider.section.western': 'Occidental',
|
|
680
|
+
'wiz.provider.section.chinese': 'Chinois',
|
|
681
|
+
'wiz.provider.section.gateways': 'Passerelles',
|
|
682
|
+
'wiz.provider.section.inference': 'Inférence',
|
|
683
|
+
'wiz.provider.section.local': 'Modèles locaux',
|
|
664
684
|
'wiz.provider.customDetail': 'Configurer manuellement',
|
|
665
685
|
'wiz.provider.ollamaDetail': 'Local — pas de clef API requise',
|
|
666
686
|
'wiz.provider.ollama.checking': 'Vérification de Ollama sur localhost:11434…',
|
|
@@ -675,6 +695,8 @@ const fr = {
|
|
|
675
695
|
'set.providers.back': 'Retour',
|
|
676
696
|
'set.providerDetail.title': '{name}',
|
|
677
697
|
'set.providerDetail.key': 'Définir la clef API',
|
|
698
|
+
'set.providerDetail.clearKey': 'Effacer la clef API',
|
|
699
|
+
'set.providerDetail.endpoint': 'Endpoint',
|
|
678
700
|
'set.providerDetail.models': 'Gérer les modèles',
|
|
679
701
|
'set.providerDetail.pricing': 'Tarifs',
|
|
680
702
|
'set.providerDetail.setDefault': 'Définir par défaut',
|
|
@@ -724,6 +746,10 @@ const es = {
|
|
|
724
746
|
'wiz.provider.name.ph': 'ej.: openrouter, mistral, ollama…',
|
|
725
747
|
'wiz.provider.url.title': 'URL base (endpoint compatible con OpenAI)',
|
|
726
748
|
'wiz.provider.url.ph': 'ej.: https://openrouter.ai/api/v1',
|
|
749
|
+
'wiz.provider.endpoint.title': 'Revisar endpoint de {name}',
|
|
750
|
+
'wiz.provider.endpoint.model': 'Modelo: {model}',
|
|
751
|
+
'wiz.provider.endpoint.use': 'Usar este endpoint',
|
|
752
|
+
'wiz.provider.endpoint.edit': 'Editar endpoint',
|
|
727
753
|
'wiz.provider.model.title': 'Nombre del modelo — exactamente como en la documentación del proveedor',
|
|
728
754
|
'wiz.provider.model.ph': 'ej.: deepseek-chat, gpt-4o-mini, qwen2.5-coder…',
|
|
729
755
|
'wiz.provider.key.title': 'Clave API para {name}',
|
|
@@ -782,7 +808,7 @@ const es = {
|
|
|
782
808
|
'help.l2d': ' para todos).',
|
|
783
809
|
'help.l3': 'Los agentes ven los estados y diffs de los demás antes de cada acción: co-editan los mismos archivos sin bloquearse y sin romper el trabajo ajeno.',
|
|
784
810
|
'help.states': 'Estados: 🔨 trabajando · 👂 escuchando a otros agentes (borde doble) · 🧠 pensando · ✋ esperando tu aprobación · ⏹ stop. Sonidos: 1 bip = agente lanzado/terminado, 2 bips = aprobación requerida (/sound off para silenciar).',
|
|
785
|
-
'help.keys': 'Esc: volver a la vista de agentes · Tab: autocompletar · ↑/↓: historial · Ctrl+V: pegar imagen',
|
|
811
|
+
'help.keys': 'Esc: volver a la vista de agentes · Tab: autocompletar · ↑/↓: sugerencias, historial o scroll de vista · Ctrl+V: pegar imagen',
|
|
786
812
|
'cmd.ask': 'Agente ask: responde y aconseja sin editar',
|
|
787
813
|
'cmd.task': 'Agente task: ejecuta, edita, valida y resume',
|
|
788
814
|
'cmd.agents': 'Vista de paneles de agentes (tiempo real)',
|
|
@@ -819,6 +845,8 @@ const es = {
|
|
|
819
845
|
'cmd.doctor': 'Comprobar proveedor/modelo/clave API y mostrar correcciones',
|
|
820
846
|
'cmd.settings': 'Ajustes globales — proveedores, claves API, idioma, valores por defecto (persistentes)',
|
|
821
847
|
'cmd.ssettings': 'Ajustes de sesión — modelo, aprobaciones, sonido (solo esta sesión)',
|
|
848
|
+
'cmd.project': 'Cambiar carpeta del proyecto o reabrir selector de carpeta',
|
|
849
|
+
'cmd.wizard': 'Relanzar el asistente de configuración',
|
|
822
850
|
'cmd.approvals': 'Aprobaciones shell: ask, auto-safe o yolo (esta sesión)',
|
|
823
851
|
'cmd.sound': 'Señales sonoras (esta sesión)',
|
|
824
852
|
'cmd.save': 'Guardar la sesión ahora (con un nombre opcional)',
|
|
@@ -915,7 +943,7 @@ const es = {
|
|
|
915
943
|
'm.usageSession': 'Uso: /sessions para listar, luego /session <n> o /session latest',
|
|
916
944
|
'm.sessionLoaded': '📂 Sesión del {date} cargada.',
|
|
917
945
|
'm.missingProvider': 'No hay proveedor configurado. Abre /settings → Añadir proveedor, o reinicia con configuración inicial.',
|
|
918
|
-
'm.missingKey': 'El proveedor {name} no tiene clave API. Usa /
|
|
946
|
+
'm.missingKey': 'El proveedor {name} no tiene clave API. Usa /settings → Providers → Clave API.',
|
|
919
947
|
'm.missingModel': 'El proveedor {name} no tiene modelo por defecto. Usa /settings → Modelos del proveedor.',
|
|
920
948
|
'm.doctorOk': '✓ Configuración lista: {pm}. Cambios: /settings · modelo temporal: /model [proveedor:]modelo',
|
|
921
949
|
'm.spawnFail': 'No se puede lanzar el agente: ningún provider/modelo utilizable. Configura uno con /settings.',
|
|
@@ -986,9 +1014,12 @@ const es = {
|
|
|
986
1014
|
'set.newSkillName': 'Nombre del skill (se creará una plantilla .md en ~/.parallel/skills)',
|
|
987
1015
|
'set.newSpecialistName': 'Nombre del especialista (se creará una plantilla .md en ~/.parallel/specialists)',
|
|
988
1016
|
// provider-pick section headers
|
|
989
|
-
'wiz.provider.section.configured': '
|
|
990
|
-
'wiz.provider.section.
|
|
991
|
-
'wiz.provider.section.
|
|
1017
|
+
'wiz.provider.section.configured': 'Proveedores configurados',
|
|
1018
|
+
'wiz.provider.section.western': 'Occidental',
|
|
1019
|
+
'wiz.provider.section.chinese': 'Chino',
|
|
1020
|
+
'wiz.provider.section.gateways': 'Pasarelas',
|
|
1021
|
+
'wiz.provider.section.inference': 'Inferencia',
|
|
1022
|
+
'wiz.provider.section.local': 'Modelos locales',
|
|
992
1023
|
'wiz.provider.customDetail': 'Configurar manualmente',
|
|
993
1024
|
'wiz.provider.ollamaDetail': 'Local — no requiere clave API',
|
|
994
1025
|
'wiz.provider.ollama.checking': 'Comprobando Ollama en localhost:11434…',
|
|
@@ -1003,6 +1034,8 @@ const es = {
|
|
|
1003
1034
|
'set.providers.back': 'Volver',
|
|
1004
1035
|
'set.providerDetail.title': '{name}',
|
|
1005
1036
|
'set.providerDetail.key': 'Establecer clave API',
|
|
1037
|
+
'set.providerDetail.clearKey': 'Borrar clave API',
|
|
1038
|
+
'set.providerDetail.endpoint': 'Endpoint',
|
|
1006
1039
|
'set.providerDetail.models': 'Gestionar modelos',
|
|
1007
1040
|
'set.providerDetail.pricing': 'Precios',
|
|
1008
1041
|
'set.providerDetail.setDefault': 'Establecer como predeterminado',
|
|
@@ -1052,6 +1085,10 @@ const zh = {
|
|
|
1052
1085
|
'wiz.provider.name.ph': '例如 openrouter、mistral、ollama…',
|
|
1053
1086
|
'wiz.provider.url.title': '基础 URL(OpenAI 兼容端点)',
|
|
1054
1087
|
'wiz.provider.url.ph': '例如 https://openrouter.ai/api/v1',
|
|
1088
|
+
'wiz.provider.endpoint.title': '检查 {name} 端点',
|
|
1089
|
+
'wiz.provider.endpoint.model': '模型:{model}',
|
|
1090
|
+
'wiz.provider.endpoint.use': '使用此端点',
|
|
1091
|
+
'wiz.provider.endpoint.edit': '编辑端点',
|
|
1055
1092
|
'wiz.provider.model.title': '模型名称 — 与提供商文档中的写法完全一致',
|
|
1056
1093
|
'wiz.provider.model.ph': '例如 deepseek-chat、gpt-4o-mini、qwen2.5-coder…',
|
|
1057
1094
|
'wiz.provider.key.title': '{name} 的 API 密钥',
|
|
@@ -1110,7 +1147,7 @@ const zh = {
|
|
|
1110
1147
|
'help.l2d': ' 发给所有)。',
|
|
1111
1148
|
'help.l3': '每次行动前,智能体都能看到彼此的状态和差异:它们共同编辑同一批文件,互不阻塞,也不破坏彼此的工作。',
|
|
1112
1149
|
'help.states': '状态:🔨 工作中 · 👂 倾听其他智能体(双边框)· 🧠 思考中 · ✋ 等待你的批准 · ⏹ 停止。声音:1 声 = 智能体启动/完成,2 声 = 需要批准(/sound off 静音)。',
|
|
1113
|
-
'help.keys': 'Esc:返回智能体视图 · Tab:补全 ·
|
|
1150
|
+
'help.keys': 'Esc:返回智能体视图 · Tab:补全 · ↑/↓:建议、历史或视图滚动 · Ctrl+V:粘贴图片',
|
|
1114
1151
|
'cmd.ask': 'Ask 智能体:只回答和建议,不编辑',
|
|
1115
1152
|
'cmd.task': 'Task 智能体:执行、编辑、验证并总结',
|
|
1116
1153
|
'cmd.agents': '智能体面板视图(实时)',
|
|
@@ -1147,6 +1184,8 @@ const zh = {
|
|
|
1147
1184
|
'cmd.doctor': '检查提供商/模型/API 密钥配置并显示修复提示',
|
|
1148
1185
|
'cmd.settings': '全局设置 — 提供商、API 密钥、语言、默认值(持久化)',
|
|
1149
1186
|
'cmd.ssettings': '会话设置 — 模型、批准、声音(仅本会话)',
|
|
1187
|
+
'cmd.project': '更改项目文件夹或重新打开文件夹选择器',
|
|
1188
|
+
'cmd.wizard': '重新启动设置向导',
|
|
1150
1189
|
'cmd.approvals': 'Shell 批准:ask、auto-safe 或 yolo(本会话)',
|
|
1151
1190
|
'cmd.sound': '声音提示(本会话)',
|
|
1152
1191
|
'cmd.save': '立即保存会话(可附加名称)',
|
|
@@ -1243,7 +1282,7 @@ const zh = {
|
|
|
1243
1282
|
'm.usageSession': '用法:先用 /sessions 列出,然后 /session <n> 或 /session latest',
|
|
1244
1283
|
'm.sessionLoaded': '📂 已加载 {date} 的会话。',
|
|
1245
1284
|
'm.missingProvider': '未配置提供商。打开 /settings → 添加提供商,或重新进行首次配置。',
|
|
1246
|
-
'm.missingKey': '提供商 {name} 没有 API 密钥。使用 /
|
|
1285
|
+
'm.missingKey': '提供商 {name} 没有 API 密钥。使用 /settings → Providers → API 密钥。',
|
|
1247
1286
|
'm.missingModel': '提供商 {name} 没有默认模型。使用 /settings → 提供商模型。',
|
|
1248
1287
|
'm.doctorOk': '✓ 配置就绪:{pm}。修改:/settings · 临时模型:/model [提供商:]模型',
|
|
1249
1288
|
'm.spawnFail': '无法启动智能体:没有可用的 provider/模型。请通过 /settings 配置。',
|
|
@@ -1314,9 +1353,12 @@ const zh = {
|
|
|
1314
1353
|
'set.newSkillName': '技能名称(将在 ~/.parallel/skills 创建 .md 模板)',
|
|
1315
1354
|
'set.newSpecialistName': '专家名称(将在 ~/.parallel/specialists 创建 .md 模板)',
|
|
1316
1355
|
// provider-pick section headers
|
|
1317
|
-
'wiz.provider.section.configured': '
|
|
1318
|
-
'wiz.provider.section.
|
|
1319
|
-
'wiz.provider.section.
|
|
1356
|
+
'wiz.provider.section.configured': '已配置的提供商',
|
|
1357
|
+
'wiz.provider.section.western': '西方',
|
|
1358
|
+
'wiz.provider.section.chinese': '中文',
|
|
1359
|
+
'wiz.provider.section.gateways': '网关',
|
|
1360
|
+
'wiz.provider.section.inference': '推理',
|
|
1361
|
+
'wiz.provider.section.local': '本地模型',
|
|
1320
1362
|
'wiz.provider.customDetail': '手动配置',
|
|
1321
1363
|
'wiz.provider.ollamaDetail': '本地 — 无需 API 密钥',
|
|
1322
1364
|
'wiz.provider.ollama.checking': '正在检查 Ollama(localhost:11434)…',
|
|
@@ -1331,6 +1373,8 @@ const zh = {
|
|
|
1331
1373
|
'set.providers.back': '返回',
|
|
1332
1374
|
'set.providerDetail.title': '{name}',
|
|
1333
1375
|
'set.providerDetail.key': '设置 API 密钥',
|
|
1376
|
+
'set.providerDetail.clearKey': '清除 API 密钥',
|
|
1377
|
+
'set.providerDetail.endpoint': '端点',
|
|
1334
1378
|
'set.providerDetail.models': '管理模型',
|
|
1335
1379
|
'set.providerDetail.pricing': '定价',
|
|
1336
1380
|
'set.providerDetail.setDefault': '设为默认',
|
package/dist/index.js
CHANGED
|
@@ -6,7 +6,7 @@ import path from 'node:path';
|
|
|
6
6
|
import { render } from 'ink';
|
|
7
7
|
import { App } from './ui/App.js';
|
|
8
8
|
import { Controller } from './controller.js';
|
|
9
|
-
import { loadConfig, setConfigHome } from './config.js';
|
|
9
|
+
import { loadConfig, providerReady, setConfigHome } from './config.js';
|
|
10
10
|
import { setLang } from './i18n.js';
|
|
11
11
|
const argv = process.argv.slice(2);
|
|
12
12
|
function takeFlagValue(flag) {
|
|
@@ -47,10 +47,13 @@ Environment variables:
|
|
|
47
47
|
PARALLEL_API_KEY / DEEPSEEK_API_KEY API key
|
|
48
48
|
PARALLEL_MODEL Default model (e.g. deepseek-chat)
|
|
49
49
|
PARALLEL_BASE_URL OpenAI-compatible endpoint
|
|
50
|
+
PARALLEL_NO_ALT_SCREEN=1 Disable the alternate terminal screen.
|
|
50
51
|
|
|
51
52
|
Inside the TUI:
|
|
52
53
|
<task> + Enter Launch agent N+1 — even while the others are working
|
|
53
54
|
@a1 <message> Real-time instruction to an agent (@all for everyone)
|
|
55
|
+
/project [folder] Change project folder or reopen the folder picker
|
|
56
|
+
/wizard Relaunch the setup wizard
|
|
54
57
|
/help All commands
|
|
55
58
|
`);
|
|
56
59
|
process.exit(0);
|
|
@@ -104,7 +107,7 @@ if (headless) {
|
|
|
104
107
|
// No human in the loop: commands are auto-approved.
|
|
105
108
|
ctl.setSessionApprovalMode('yolo');
|
|
106
109
|
const provider = ctl.sessionProvider();
|
|
107
|
-
if (!provider || !provider
|
|
110
|
+
if (!provider || !providerReady(provider)) {
|
|
108
111
|
console.error('Headless mode needs a configured provider + API key. Run `parallel` interactively once, or set PARALLEL_API_KEY.');
|
|
109
112
|
process.exit(1);
|
|
110
113
|
}
|
package/dist/pricing.js
CHANGED
|
@@ -5,60 +5,162 @@
|
|
|
5
5
|
* Prices drift over time; overrides always win.
|
|
6
6
|
*/
|
|
7
7
|
const BUILTIN = {
|
|
8
|
-
//
|
|
9
|
-
'deepseek-v4-flash': { input: 0.27, output: 1.1 },
|
|
10
|
-
'deepseek-v4-pro': { input: 0.55, output: 2.19 },
|
|
11
|
-
'deepseek-chat': { input: 0.27, output: 1.1 },
|
|
12
|
-
'deepseek-reasoner': { input: 0.55, output: 2.19 },
|
|
8
|
+
// === Western ===
|
|
13
9
|
// OpenAI
|
|
14
|
-
'gpt-
|
|
15
|
-
'gpt-
|
|
16
|
-
'gpt-4
|
|
17
|
-
'gpt-
|
|
18
|
-
'gpt-
|
|
19
|
-
'
|
|
20
|
-
'o4-mini': { input: 1.
|
|
10
|
+
'gpt-5.5': { input: 5.00, output: 30.00, cacheHit: 0.50 },
|
|
11
|
+
'gpt-5.5-pro': { input: 30.00, output: 180.00, cacheHit: 3.00 },
|
|
12
|
+
'gpt-5.4': { input: 1.25, output: 10.00, cacheHit: 0.125 }, // approx
|
|
13
|
+
'gpt-5.3-codex': { input: 1.25, output: 10.00, cacheHit: 0.125 }, // approx
|
|
14
|
+
'gpt-4o': { input: 2.50, output: 10.00 },
|
|
15
|
+
'gpt-4o-mini': { input: 0.15, output: 0.60 },
|
|
16
|
+
'o4-mini': { input: 1.10, output: 4.40 },
|
|
17
|
+
'o3': { input: 5.00, output: 20.00 },
|
|
18
|
+
'o3-mini': { input: 0.55, output: 2.20 },
|
|
19
|
+
'o1': { input: 15.00, output: 60.00 },
|
|
20
|
+
'o1-mini': { input: 1.10, output: 4.40 },
|
|
21
21
|
// Anthropic
|
|
22
|
-
'claude-opus-4': { input:
|
|
23
|
-
'claude-
|
|
24
|
-
'claude-
|
|
25
|
-
'claude-
|
|
22
|
+
'claude-opus-4-8': { input: 5.00, output: 25.00, cacheHit: 0.50 },
|
|
23
|
+
'claude-opus-4-7': { input: 5.00, output: 25.00, cacheHit: 0.50 },
|
|
24
|
+
'claude-sonnet-4-6': { input: 3.00, output: 15.00, cacheHit: 0.30 },
|
|
25
|
+
'claude-haiku-4-5': { input: 1.00, output: 5.00, cacheHit: 0.10 },
|
|
26
|
+
// Google Gemini
|
|
27
|
+
'gemini-3.1-pro': { input: 2.00, output: 12.00, cacheHit: 0.20 }, // tiered: >200K = 2×/1.5×
|
|
28
|
+
'gemini-3.5-flash': { input: 1.50, output: 9.00, cacheHit: 0.15 },
|
|
29
|
+
'gemini-3-flash': { input: 0.60, output: 3.00, cacheHit: 0.06 }, // approx
|
|
30
|
+
'gemini-3.1-flash-lite': { input: 0.10, output: 0.40, cacheHit: 0.01 },
|
|
31
|
+
// xAI Grok
|
|
32
|
+
'grok-4': { input: 3.00, output: 15.00 }, // approx
|
|
33
|
+
'grok-4-fast-reasoning': { input: 0.20, output: 0.50 }, // approx
|
|
34
|
+
'grok-3': { input: 3.00, output: 15.00 },
|
|
35
|
+
'grok-code-fast-1': { input: 0.20, output: 1.50 }, // approx
|
|
26
36
|
// Mistral
|
|
27
|
-
'mistral-large': { input: 2, output: 6 },
|
|
28
|
-
'
|
|
29
|
-
'
|
|
30
|
-
|
|
31
|
-
'qwen2.5-coder': { input: 0.09, output: 0.09 },
|
|
32
|
-
'qwen-max': { input: 1.6, output: 6.4 },
|
|
33
|
-
// xAI (Grok)
|
|
34
|
-
'grok-4': { input: 4.0, output: 16.0 },
|
|
35
|
-
'grok-3-beta': { input: 3.0, output: 12.0 },
|
|
36
|
-
'grok-3-mini': { input: 0.55, output: 2.2 },
|
|
37
|
-
// Perplexity
|
|
38
|
-
'sonar-pro': { input: 3.0, output: 15.0 },
|
|
39
|
-
'sonar': { input: 1.0, output: 1.0 },
|
|
40
|
-
'sonar-reasoning': { input: 2.0, output: 16.0 },
|
|
37
|
+
'mistral-large-2': { input: 2.00, output: 6.00 },
|
|
38
|
+
'magistral-medium': { input: 2.00, output: 5.00 },
|
|
39
|
+
'codestral-latest': { input: 0.30, output: 0.90 },
|
|
40
|
+
'mistral-small-latest': { input: 0.20, output: 0.60 },
|
|
41
41
|
// Cohere
|
|
42
|
-
'command-a': { input: 2.
|
|
43
|
-
'command-r-plus': { input: 2.
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
'
|
|
47
|
-
|
|
48
|
-
//
|
|
49
|
-
'
|
|
50
|
-
'
|
|
42
|
+
'command-a': { input: 2.50, output: 10.00 },
|
|
43
|
+
'command-r-plus': { input: 2.50, output: 10.00 },
|
|
44
|
+
// Perplexity
|
|
45
|
+
'sonar-pro': { input: 3.00, output: 15.00 },
|
|
46
|
+
'sonar-deep-research': { input: 2.00, output: 8.00 },
|
|
47
|
+
// === Chinese ===
|
|
48
|
+
// DeepSeek
|
|
49
|
+
'deepseek-v4-pro': { input: 0.435, output: 0.87, cacheHit: 0.0036 },
|
|
50
|
+
'deepseek-v4-flash': { input: 0.14, output: 0.28, cacheHit: 0.003 },
|
|
51
|
+
'deepseek-chat': { input: 0.27, output: 1.10, cacheHit: 0.027 },
|
|
52
|
+
'deepseek-reasoner': { input: 0.55, output: 2.19, cacheHit: 0.14 },
|
|
53
|
+
// MiniMax — list pricing
|
|
54
|
+
'MiniMax-M3': { input: 0.60, output: 2.40, cacheHit: 0.12 },
|
|
55
|
+
'MiniMax-M2.7': { input: 0.30, output: 1.20, cacheHit: 0.06 },
|
|
56
|
+
'MiniMax-M2.7-highspeed': { input: 0.60, output: 2.40, cacheHit: 0.06 },
|
|
57
|
+
// Z.ai / GLM
|
|
58
|
+
'glm-5.2': { input: 1.00, output: 3.20 },
|
|
59
|
+
'glm-5.1': { input: 1.00, output: 3.20 },
|
|
60
|
+
'glm-4.7': { input: 0.60, output: 2.20 },
|
|
61
|
+
'glm-4.7-flash': { input: 0.00, output: 0.00 }, // free
|
|
62
|
+
'glm-5v-turbo': { input: 0.30, output: 0.90 },
|
|
63
|
+
// Alibaba / Qwen
|
|
64
|
+
'qwen3.7-max': { input: 1.25, output: 3.75 }, // promo price, cache: yes
|
|
65
|
+
'qwen3.6-max-preview': { input: 1.04, output: 6.24 }, // tiered, lower bound
|
|
66
|
+
'qwen3.6-plus': { input: 0.40, output: 1.20 },
|
|
67
|
+
'qwen3.5-coder': { input: 0.20, output: 0.60 },
|
|
68
|
+
// Moonshot / Kimi
|
|
69
|
+
'kimi-k2.6': { input: 0.95, output: 4.00, cacheHit: 0.16 },
|
|
70
|
+
'kimi-k2.7-code': { input: 0.95, output: 4.00, cacheHit: 0.19 },
|
|
71
|
+
'kimi-k2.5': { input: 0.60, output: 3.00, cacheHit: 0.10 },
|
|
72
|
+
'moonshot-v1-128k': { input: 0.85, output: 1.70 },
|
|
73
|
+
// Xiaomi / MiMo
|
|
74
|
+
'mimo-v2-pro': { input: 0.30, output: 1.00 }, // approx
|
|
75
|
+
'mimo-v2-omni': { input: 0.40, output: 1.50 }, // approx
|
|
76
|
+
// StepFun
|
|
77
|
+
'step-2-16k': { input: 0.50, output: 1.50 }, // approx
|
|
78
|
+
// === Gateways ===
|
|
79
|
+
// OpenRouter
|
|
80
|
+
'openai/gpt-5.5': { input: 5.00, output: 30.00 },
|
|
81
|
+
'anthropic/claude-sonnet-4-6': { input: 3.00, output: 15.00 },
|
|
82
|
+
'google/gemini-3.5-flash': { input: 1.50, output: 9.00 },
|
|
83
|
+
'deepseek/deepseek-v4-pro': { input: 0.435, output: 0.87 },
|
|
84
|
+
'meta-llama/llama-4-maverick': { input: 0.50, output: 1.60 },
|
|
85
|
+
'mistralai/mistral-large-2': { input: 2.00, output: 6.00 },
|
|
86
|
+
// SiliconFlow
|
|
87
|
+
'deepseek-ai/DeepSeek-V4-Pro': { input: 0.435, output: 0.87 },
|
|
88
|
+
'deepseek-ai/DeepSeek-R1': { input: 0.55, output: 2.19 },
|
|
89
|
+
'Qwen/Qwen3-Coder-480B': { input: 0.20, output: 0.60 },
|
|
90
|
+
'glm-4/GLM-5.2': { input: 1.00, output: 3.20 },
|
|
91
|
+
'moonshotai/Kimi-K2.6': { input: 0.95, output: 4.00 },
|
|
92
|
+
// Atlas Cloud
|
|
93
|
+
'deepseek-v4-pro @atlas': { input: 0.435, output: 0.87 },
|
|
94
|
+
'deepseek-r1 @atlas': { input: 0.55, output: 2.19 },
|
|
95
|
+
'qwen3.7-max @atlas': { input: 1.25, output: 3.75 },
|
|
96
|
+
'glm-5.2 @atlas': { input: 1.00, output: 3.20 },
|
|
97
|
+
'kimi-k2.6 @atlas': { input: 0.95, output: 4.00 },
|
|
98
|
+
'llama-4-maverick @atlas': { input: 0.50, output: 1.60 },
|
|
99
|
+
// Requesty — 0% markup, same as direct
|
|
100
|
+
'gpt-5.5 @requesty': { input: 5.00, output: 30.00 },
|
|
101
|
+
'claude-sonnet-4-6 @requesty': { input: 3.00, output: 15.00 },
|
|
102
|
+
'gemini-3.5-flash @requesty': { input: 1.50, output: 9.00 },
|
|
103
|
+
'deepseek-v4-pro @requesty': { input: 0.435, output: 0.87 },
|
|
104
|
+
'llama-4-maverick @requesty': { input: 0.50, output: 1.60 },
|
|
105
|
+
'mistral-large-2 @requesty': { input: 2.00, output: 6.00 },
|
|
106
|
+
// Vercel AI Gateway — list price, no markup
|
|
107
|
+
'gpt-5.5 @vercel': { input: 5.00, output: 30.00 },
|
|
108
|
+
'claude-sonnet-4-6 @vercel': { input: 3.00, output: 15.00 },
|
|
109
|
+
'gemini-3.5-flash @vercel': { input: 1.50, output: 9.00 },
|
|
110
|
+
'deepseek-v4-pro @vercel': { input: 0.435, output: 0.87 },
|
|
111
|
+
'llama-4-maverick @vercel': { input: 0.50, output: 1.60 },
|
|
112
|
+
// === Inference hosts ===
|
|
113
|
+
// Groq
|
|
114
|
+
'qwen-2.5-coder-32b': { input: 0.30, output: 0.50 },
|
|
115
|
+
'deepseek-r1-distill-llama-70b': { input: 0.30, output: 2.00 },
|
|
116
|
+
'kimi-k2.6 @groq': { input: 1.00, output: 3.00 },
|
|
117
|
+
'llama-3.3-70b-versatile': { input: 0.15, output: 0.30 },
|
|
51
118
|
// Cerebras
|
|
52
|
-
'llama-
|
|
53
|
-
'
|
|
119
|
+
'llama-4-maverick-17b-128e-instruct': { input: 0.65, output: 0.85 },
|
|
120
|
+
'qwen3-coder-480b @cerebras': { input: 2.00, output: 2.00 },
|
|
121
|
+
'kimi-k2.6 @cerebras': { input: 1.65, output: 6.50 },
|
|
122
|
+
'llama-3.3-70b @cerebras': { input: 0.10, output: 0.20 },
|
|
123
|
+
// Together AI
|
|
124
|
+
'meta-llama/Llama-4-Maverick-17B-128E-Instruct': { input: 0.27, output: 0.85 },
|
|
125
|
+
'deepseek-ai/DeepSeek-V3 @together': { input: 0.30, output: 0.30 },
|
|
126
|
+
'Qwen/Qwen3-Coder-480B @together': { input: 0.40, output: 1.20 },
|
|
127
|
+
'moonshotai/Kimi-K2.6 @together': { input: 0.60, output: 2.50 },
|
|
128
|
+
// Fireworks
|
|
129
|
+
'accounts/fireworks/models/llama4-maverick-17b': { input: 0.22, output: 0.88 },
|
|
130
|
+
'accounts/fireworks/models/deepseek-v3': { input: 0.90, output: 0.90 },
|
|
131
|
+
'accounts/fireworks/models/qwen3-coder-480b': { input: 0.45, output: 1.80 },
|
|
132
|
+
'accounts/fireworks/models/kimi-k2.6': { input: 0.60, output: 2.50 },
|
|
133
|
+
// DeepInfra
|
|
134
|
+
'meta-llama/Llama-4-Maverick-17B-128E': { input: 0.20, output: 0.60 },
|
|
135
|
+
'deepseek-ai/DeepSeek-V3 @deepinfra': { input: 0.26, output: 0.38 },
|
|
136
|
+
'Qwen/Qwen3-Coder-480B @deepinfra': { input: 0.30, output: 1.00 },
|
|
137
|
+
'moonshotai/Kimi-K2.6 @deepinfra': { input: 0.75, output: 3.50, cacheHit: 0.15 },
|
|
54
138
|
// Novita
|
|
55
|
-
'
|
|
56
|
-
'deepseek-v3': { input:
|
|
57
|
-
'
|
|
139
|
+
'meta-llama/llama-4-maverick-17b-128e': { input: 0.20, output: 0.60 },
|
|
140
|
+
'deepseek/deepseek-v3': { input: 0.10, output: 0.28 },
|
|
141
|
+
'qwen/qwen3-coder-480b': { input: 0.30, output: 1.20 },
|
|
142
|
+
'moonshotai/kimi-k2.6': { input: 0.57, output: 2.30 },
|
|
58
143
|
// Hyperbolic
|
|
59
|
-
'
|
|
60
|
-
|
|
61
|
-
'
|
|
144
|
+
'meta-llama/Llama-4-Maverick-17B-128E @hyperbolic': { input: 0.20, output: 0.60 },
|
|
145
|
+
'deepseek-ai/DeepSeek-V3 @hyperbolic': { input: 0.25, output: 0.85 },
|
|
146
|
+
'Qwen/Qwen3-Coder-480B @hyperbolic': { input: 0.30, output: 1.20 },
|
|
147
|
+
'moonshotai/Kimi-K2.6 @hyperbolic': { input: 0.80, output: 3.00 },
|
|
148
|
+
// SambaNova
|
|
149
|
+
'Meta-Llama-4-Maverick-17B-128E-Instruct': { input: 0.20, output: 0.30 },
|
|
150
|
+
'DeepSeek-V3 @sambanova': { input: 1.00, output: 1.50 },
|
|
151
|
+
'Llama-3.3-70B-Instruct': { input: 0.10, output: 0.20 },
|
|
152
|
+
// === Local (free) ===
|
|
153
|
+
// Ollama
|
|
154
|
+
'qwen3-coder:480b': { input: 0.00, output: 0.00 },
|
|
155
|
+
'glm-4.7 @ollama': { input: 0.00, output: 0.00 },
|
|
156
|
+
'deepseek-v3 @ollama': { input: 0.00, output: 0.00 },
|
|
157
|
+
'kimi-k2 @ollama': { input: 0.00, output: 0.00 },
|
|
158
|
+
'llama3.2': { input: 0.00, output: 0.00 },
|
|
159
|
+
'mistral @ollama': { input: 0.00, output: 0.00 },
|
|
160
|
+
'codellama': { input: 0.00, output: 0.00 },
|
|
161
|
+
'gemma3': { input: 0.00, output: 0.00 },
|
|
162
|
+
// vLLM / SGLang
|
|
163
|
+
'your-model-here': { input: 0.00, output: 0.00 },
|
|
62
164
|
};
|
|
63
165
|
/**
|
|
64
166
|
* Resolve the price of a model: provider override first, then built-in table
|
|
@@ -66,22 +168,28 @@ const BUILTIN = {
|
|
|
66
168
|
* "claude-sonnet-4-20250514" or "openai/gpt-4o-mini"). null = unknown.
|
|
67
169
|
*/
|
|
68
170
|
export function priceFor(provider, model) {
|
|
69
|
-
const
|
|
171
|
+
const overrideKey = provider?.prices
|
|
172
|
+
? Object.keys(provider.prices).find((key) => key.toLowerCase() === model.toLowerCase())
|
|
173
|
+
: undefined;
|
|
174
|
+
const override = overrideKey ? provider?.prices?.[overrideKey] : undefined;
|
|
70
175
|
if (override)
|
|
71
176
|
return override;
|
|
72
177
|
const m = model.toLowerCase();
|
|
73
178
|
// strip an optional "vendor/" prefix (OpenRouter-style ids)
|
|
74
179
|
const bare = m.includes('/') ? m.slice(m.lastIndexOf('/') + 1) : m;
|
|
75
|
-
|
|
76
|
-
|
|
180
|
+
const builtins = Object.entries(BUILTIN).map(([key, price]) => [key.toLowerCase(), price]);
|
|
181
|
+
const exact = builtins.find(([key]) => key === bare);
|
|
182
|
+
if (exact)
|
|
183
|
+
return exact[1];
|
|
77
184
|
// longest prefix wins so "deepseek-chat" beats nothing else
|
|
78
185
|
let best = null;
|
|
79
|
-
for (const
|
|
80
|
-
|
|
81
|
-
|
|
186
|
+
for (const entry of builtins) {
|
|
187
|
+
const [key] = entry;
|
|
188
|
+
if ((bare.startsWith(key) || bare.includes(key)) && (!best || key.length > best[0].length))
|
|
189
|
+
best = entry;
|
|
82
190
|
}
|
|
83
191
|
if (best)
|
|
84
|
-
return
|
|
192
|
+
return best[1];
|
|
85
193
|
// local endpoints (ollama, llama.cpp, vLLM on localhost) → free
|
|
86
194
|
if (provider && /localhost|127\.0\.0\.1|0\.0\.0\.0/.test(provider.baseUrl))
|
|
87
195
|
return { input: 0, output: 0 };
|