@just-every/ensemble 0.2.162 → 0.2.163

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 CHANGED
@@ -34,13 +34,13 @@ See the [demo README](demo/README.md) for detailed information about each demo.
34
34
  - 📊 **Cost & Quota Tracking** - Built-in usage monitoring and cost calculation
35
35
  - 🎯 **Smart Result Processing** - Automatic summarization and truncation for long outputs
36
36
 
37
- ## Model Updates (Nov 2025)
38
- - OpenAI: GPT-5.1 (base + Codex, Codex-Mini, Codex-Max*), GPT-5/4.1/4o lines retained
37
+ ## Model Updates (Dec 2025)
38
+ - OpenAI: Added GPT-5.2 (base + chat-latest + pro) and refreshed GPT-5.1/GPT-5/Codex pricing
39
39
  - Anthropic: Claude 4.5 (Sonnet/Haiku, incl. 1M context) and Claude Opus 4.1
40
40
  - Google: Gemini 3 (Pro/Flash/Ultra) and refreshed Gemini 2.5 pricing incl. image/TTS/native-audio
41
41
  - xAI: Grok 4.1 Fast and Grok 4 Fast with tiered pricing; updated Grok 4/3/mini variants
42
42
 
43
- *Codex-Max pricing reflects current published rates and may change when OpenAI finalizes API pricing.
43
+ *Codex-Max pricing reflects current published rates and may change if OpenAI updates pricing.
44
44
 
45
45
  ## Installation
46
46
 
@@ -229,7 +229,7 @@ for await (const event of ensembleVoice('Long text...', {
229
229
 
230
230
  ### Image generation
231
231
 
232
- Use OpenAI GPT-Image-1 or Google Gemini 2.5 Flash Image (Preview):
232
+ Use OpenAI GPT-Image-1 (or the new cost-efficient GPT-Image-1 Mini) or Google Gemini 2.5 Flash Image (Preview):
233
233
 
234
234
  ```ts
235
235
  import { ensembleImage } from '@just-every/ensemble';
@@ -31,8 +31,9 @@ exports.MODEL_CLASSES = {
31
31
  },
32
32
  reasoning: {
33
33
  models: [
34
- 'gpt-5-max',
34
+ 'gpt-5.2',
35
35
  'gpt-5.1',
36
+ 'gpt-5',
36
37
  'gemini-2.5-pro-preview-06-05',
37
38
  'gemini-2.5-pro',
38
39
  'gemini-3-pro',
@@ -57,7 +58,7 @@ exports.MODEL_CLASSES = {
57
58
  },
58
59
  monologue: {
59
60
  models: [
60
- 'gpt-5-chat-latest',
61
+ 'gpt-5.2-chat-latest',
61
62
  'gemini-2.5-pro-preview-06-05',
62
63
  'gemini-2.5-flash-preview-05-20-medium',
63
64
  'o3-medium',
@@ -67,6 +68,7 @@ exports.MODEL_CLASSES = {
67
68
  },
68
69
  metacognition: {
69
70
  models: [
71
+ 'gpt-5.2',
70
72
  'gpt-5',
71
73
  'gpt-5-mini',
72
74
  'gemini-2.5-pro-preview-06-05',
@@ -81,6 +83,7 @@ exports.MODEL_CLASSES = {
81
83
  'gpt-5',
82
84
  'gpt-5.1-codex',
83
85
  'gpt-5.1-codex-mini',
86
+ 'gpt-5.1-codex-max',
84
87
  'o3-high',
85
88
  'gemini-2.5-pro-preview-06-05-medium',
86
89
  'gemini-2.5-flash-preview-05-20-max',
@@ -119,7 +122,7 @@ exports.MODEL_CLASSES = {
119
122
  },
120
123
  vision_mini: {
121
124
  models: [
122
- 'gpt-5-mini-medium',
125
+ 'gpt-5-mini',
123
126
  'o3-low',
124
127
  'gemini-2.5-flash-lite-preview-06-17',
125
128
  'gemini-2.5-flash-preview-05-20',
@@ -156,6 +159,7 @@ exports.MODEL_CLASSES = {
156
159
  image_generation: {
157
160
  models: [
158
161
  'gpt-image-1',
162
+ 'gpt-image-1-mini',
159
163
  'gemini-2.5-flash-image-preview',
160
164
  'gemini-2.5-flash-image',
161
165
  'gemini-3-pro-image-preview',
@@ -840,19 +844,89 @@ exports.MODEL_REGISTRY = [
840
844
  class: 'standard',
841
845
  description: 'Latest premium GPT model from OpenAI',
842
846
  },
847
+ {
848
+ id: 'gpt-5.2',
849
+ aliases: ['gpt-5.2-2025-12-11'],
850
+ provider: 'openai',
851
+ cost: {
852
+ input_per_million: 1.75,
853
+ cached_input_per_million: 0.175,
854
+ output_per_million: 14.0,
855
+ },
856
+ features: {
857
+ context_length: 400000,
858
+ max_output_tokens: 128000,
859
+ input_modality: ['text', 'image'],
860
+ output_modality: ['text'],
861
+ tool_use: true,
862
+ streaming: true,
863
+ json_output: true,
864
+ },
865
+ class: 'reasoning',
866
+ score: 96,
867
+ scores: {
868
+ monologue: 97,
869
+ code: 95,
870
+ reasoning: 94,
871
+ },
872
+ description: 'Frontier flagship model for complex, multi-step tasks (400k/128k).',
873
+ },
874
+ {
875
+ id: 'gpt-5.2-pro',
876
+ aliases: ['gpt-5.2-pro-2025-12-11'],
877
+ provider: 'openai',
878
+ cost: {
879
+ input_per_million: 21.0,
880
+ output_per_million: 168.0,
881
+ },
882
+ features: {
883
+ context_length: 400000,
884
+ max_output_tokens: 128000,
885
+ input_modality: ['text', 'image'],
886
+ output_modality: ['text'],
887
+ tool_use: true,
888
+ streaming: true,
889
+ json_output: true,
890
+ },
891
+ class: 'reasoning',
892
+ score: 99,
893
+ description: 'Highest-accuracy GPT-5.2 variant for the hardest problems (400k/128k).',
894
+ },
895
+ {
896
+ id: 'gpt-5.2-chat-latest',
897
+ provider: 'openai',
898
+ cost: {
899
+ input_per_million: 1.75,
900
+ cached_input_per_million: 0.175,
901
+ output_per_million: 14.0,
902
+ },
903
+ features: {
904
+ context_length: 128000,
905
+ max_output_tokens: 16384,
906
+ input_modality: ['text', 'image'],
907
+ output_modality: ['text'],
908
+ tool_use: true,
909
+ streaming: true,
910
+ json_output: true,
911
+ },
912
+ class: 'standard',
913
+ score: 94,
914
+ description: 'ChatGPT-optimized GPT-5.2 chat model (128k/16k).',
915
+ },
843
916
  {
844
917
  id: 'gpt-5',
845
918
  aliases: ['gpt-5-2025-08-07'],
846
919
  provider: 'openai',
847
920
  cost: {
848
921
  input_per_million: 1.25,
849
- cached_input_per_million: 0.13,
922
+ cached_input_per_million: 0.125,
850
923
  output_per_million: 10.0,
851
924
  },
852
925
  features: {
853
926
  context_length: 400000,
854
- input_modality: ['text', 'image', 'audio'],
855
- output_modality: ['text', 'image', 'audio'],
927
+ max_output_tokens: 128000,
928
+ input_modality: ['text', 'image'],
929
+ output_modality: ['text'],
856
930
  tool_use: true,
857
931
  streaming: true,
858
932
  json_output: true,
@@ -860,11 +934,54 @@ exports.MODEL_REGISTRY = [
860
934
  class: 'reasoning',
861
935
  score: 95,
862
936
  scores: {
863
- monologue: 98,
937
+ monologue: 96,
864
938
  code: 95,
865
939
  reasoning: 92,
866
940
  },
867
- description: 'The best model for coding and agentic tasks across domains',
941
+ description: 'Frontier flagship model for complex, multi-step tasks (400k/128k).',
942
+ },
943
+ {
944
+ id: 'gpt-5-pro',
945
+ aliases: ['gpt-5-pro-2025-10-06'],
946
+ provider: 'openai',
947
+ cost: {
948
+ input_per_million: 15.0,
949
+ output_per_million: 120.0,
950
+ },
951
+ features: {
952
+ context_length: 400000,
953
+ max_output_tokens: 272000,
954
+ input_modality: ['text', 'image'],
955
+ output_modality: ['text'],
956
+ tool_use: true,
957
+ streaming: true,
958
+ json_output: true,
959
+ },
960
+ class: 'reasoning',
961
+ score: 98,
962
+ description: 'High-accuracy GPT-5 variant for the hardest problems (400k/128k).',
963
+ },
964
+ {
965
+ id: 'gpt-5-chat-latest',
966
+ aliases: ['gpt-5-chat'],
967
+ provider: 'openai',
968
+ cost: {
969
+ input_per_million: 1.25,
970
+ cached_input_per_million: 0.125,
971
+ output_per_million: 10.0,
972
+ },
973
+ features: {
974
+ context_length: 128000,
975
+ max_output_tokens: 16384,
976
+ input_modality: ['text', 'image'],
977
+ output_modality: ['text'],
978
+ tool_use: true,
979
+ streaming: true,
980
+ json_output: true,
981
+ },
982
+ class: 'standard',
983
+ score: 92,
984
+ description: 'ChatGPT-optimized GPT-5 chat model (128k/16k).',
868
985
  },
869
986
  {
870
987
  id: 'gpt-5-mini',
@@ -872,13 +989,14 @@ exports.MODEL_REGISTRY = [
872
989
  provider: 'openai',
873
990
  cost: {
874
991
  input_per_million: 0.25,
875
- cached_input_per_million: 0.03,
992
+ cached_input_per_million: 0.025,
876
993
  output_per_million: 2.0,
877
994
  },
878
995
  features: {
879
996
  context_length: 400000,
880
- input_modality: ['text', 'image', 'audio'],
881
- output_modality: ['text', 'image', 'audio'],
997
+ max_output_tokens: 128000,
998
+ input_modality: ['text', 'image'],
999
+ output_modality: ['text'],
882
1000
  tool_use: true,
883
1001
  streaming: true,
884
1002
  json_output: true,
@@ -886,11 +1004,11 @@ exports.MODEL_REGISTRY = [
886
1004
  class: 'standard',
887
1005
  score: 88,
888
1006
  scores: {
889
- monologue: 90,
1007
+ monologue: 88,
890
1008
  code: 87,
891
1009
  reasoning: 85,
892
1010
  },
893
- description: 'A faster, more cost-efficient version of GPT-5 for well-defined tasks',
1011
+ description: 'A faster, more cost-efficient version of GPT-5 (400k/128k).',
894
1012
  },
895
1013
  {
896
1014
  id: 'gpt-5-nano',
@@ -898,13 +1016,14 @@ exports.MODEL_REGISTRY = [
898
1016
  provider: 'openai',
899
1017
  cost: {
900
1018
  input_per_million: 0.05,
901
- cached_input_per_million: 0.01,
1019
+ cached_input_per_million: 0.005,
902
1020
  output_per_million: 0.4,
903
1021
  },
904
1022
  features: {
905
1023
  context_length: 400000,
906
- input_modality: ['text', 'image', 'audio'],
907
- output_modality: ['text', 'image', 'audio'],
1024
+ max_output_tokens: 128000,
1025
+ input_modality: ['text', 'image'],
1026
+ output_modality: ['text'],
908
1027
  tool_use: true,
909
1028
  streaming: true,
910
1029
  json_output: true,
@@ -912,75 +1031,93 @@ exports.MODEL_REGISTRY = [
912
1031
  class: 'mini',
913
1032
  score: 78,
914
1033
  scores: {
915
- monologue: 80,
1034
+ monologue: 78,
916
1035
  code: 76,
917
1036
  reasoning: 75,
918
1037
  },
919
- description: 'Fastest, most cost-efficient version of GPT-5',
1038
+ description: 'Fastest, most cost-efficient GPT-5 model (400k/128k).',
920
1039
  },
921
1040
  {
922
- id: 'gpt-5-chat-latest',
923
- aliases: ['gpt-5-chat'],
1041
+ id: 'gpt-5.1',
1042
+ aliases: ['gpt-5.1-2025-11-13'],
924
1043
  provider: 'openai',
925
1044
  cost: {
926
1045
  input_per_million: 1.25,
927
- cached_input_per_million: 0.13,
1046
+ cached_input_per_million: 0.125,
928
1047
  output_per_million: 10.0,
929
1048
  },
930
1049
  features: {
931
1050
  context_length: 400000,
932
- input_modality: ['text', 'image', 'audio'],
933
- output_modality: ['text', 'image', 'audio'],
1051
+ max_output_tokens: 128000,
1052
+ input_modality: ['text', 'image'],
1053
+ output_modality: ['text'],
934
1054
  tool_use: true,
935
1055
  streaming: true,
936
1056
  json_output: true,
937
1057
  },
938
1058
  class: 'reasoning',
939
1059
  score: 95,
940
- scores: {
941
- monologue: 98,
942
- code: 95,
943
- reasoning: 92,
944
- },
945
- description: 'GPT-5 model used in ChatGPT',
1060
+ description: 'Prior-gen GPT-5.1 flagship model (400k/128k).',
946
1061
  },
947
1062
  {
948
- id: 'gpt-5.1',
949
- aliases: ['gpt-5.1-chat-latest'],
1063
+ id: 'gpt-5.1-chat-latest',
950
1064
  provider: 'openai',
951
1065
  cost: {
952
1066
  input_per_million: 1.25,
1067
+ cached_input_per_million: 0.125,
953
1068
  output_per_million: 10.0,
1069
+ },
1070
+ features: {
1071
+ context_length: 128000,
1072
+ max_output_tokens: 16384,
1073
+ input_modality: ['text', 'image'],
1074
+ output_modality: ['text'],
1075
+ tool_use: true,
1076
+ streaming: true,
1077
+ json_output: true,
1078
+ },
1079
+ class: 'standard',
1080
+ score: 91,
1081
+ description: 'ChatGPT-optimized GPT-5.1 chat model (128k/16k).',
1082
+ },
1083
+ {
1084
+ id: 'gpt-5-codex',
1085
+ aliases: ['gpt-5-codex-2025-09-15'],
1086
+ provider: 'openai',
1087
+ cost: {
1088
+ input_per_million: 1.25,
954
1089
  cached_input_per_million: 0.125,
1090
+ output_per_million: 10.0,
955
1091
  },
956
1092
  features: {
957
- context_length: 256000,
958
- input_modality: ['text', 'image', 'audio', 'video'],
959
- output_modality: ['text', 'image', 'audio'],
1093
+ context_length: 400000,
1094
+ max_output_tokens: 128000,
1095
+ input_modality: ['text', 'image'],
1096
+ output_modality: ['text'],
960
1097
  tool_use: true,
961
1098
  streaming: true,
962
1099
  json_output: true,
963
1100
  },
964
- class: 'reasoning',
965
- score: 96,
966
- description: 'GPT-5.1 flagship multimodal model (Instant/Thinking modes, pricing TBD).',
1101
+ class: 'code',
1102
+ score: 90,
1103
+ description: 'Prior-gen Codex model for agentic coding (400k/128k).',
967
1104
  },
968
1105
  {
969
1106
  id: 'gpt-5.1-codex',
970
1107
  provider: 'openai',
971
1108
  cost: {
972
1109
  input_per_million: 1.25,
973
- output_per_million: 10.0,
974
1110
  cached_input_per_million: 0.125,
1111
+ output_per_million: 10.0,
975
1112
  },
976
1113
  features: {
977
1114
  context_length: 400000,
978
- input_modality: ['text'],
1115
+ max_output_tokens: 128000,
1116
+ input_modality: ['text', 'image'],
979
1117
  output_modality: ['text'],
980
1118
  tool_use: true,
981
1119
  streaming: true,
982
1120
  json_output: true,
983
- max_output_tokens: 128000,
984
1121
  },
985
1122
  class: 'code',
986
1123
  score: 92,
@@ -991,17 +1128,17 @@ exports.MODEL_REGISTRY = [
991
1128
  provider: 'openai',
992
1129
  cost: {
993
1130
  input_per_million: 0.25,
994
- output_per_million: 2.0,
995
1131
  cached_input_per_million: 0.025,
1132
+ output_per_million: 2.0,
996
1133
  },
997
1134
  features: {
998
1135
  context_length: 400000,
999
- input_modality: ['text'],
1136
+ max_output_tokens: 128000,
1137
+ input_modality: ['text', 'image'],
1000
1138
  output_modality: ['text'],
1001
1139
  tool_use: true,
1002
1140
  streaming: true,
1003
1141
  json_output: true,
1004
- max_output_tokens: 128000,
1005
1142
  },
1006
1143
  class: 'code',
1007
1144
  score: 86,
@@ -1011,21 +1148,22 @@ exports.MODEL_REGISTRY = [
1011
1148
  id: 'gpt-5.1-codex-max',
1012
1149
  provider: 'openai',
1013
1150
  cost: {
1014
- input_per_million: 5.0,
1015
- output_per_million: 15.0,
1151
+ input_per_million: 1.25,
1152
+ cached_input_per_million: 0.125,
1153
+ output_per_million: 10.0,
1016
1154
  },
1017
1155
  features: {
1018
- context_length: 10_000_000,
1019
- input_modality: ['text'],
1156
+ context_length: 400000,
1157
+ max_output_tokens: 128000,
1158
+ input_modality: ['text', 'image'],
1020
1159
  output_modality: ['text'],
1021
1160
  tool_use: true,
1022
1161
  streaming: true,
1023
1162
  json_output: true,
1024
- max_output_tokens: 128000,
1025
1163
  },
1026
1164
  class: 'code',
1027
1165
  score: 95,
1028
- description: 'GPT-5.1 Codex Max — multi-million context (IDE-only for now), pricing TBD.',
1166
+ description: 'GPT-5.1 Codex Max — most capable Codex model for coding agents (400k/128k).',
1029
1167
  },
1030
1168
  {
1031
1169
  id: 'gpt-4o',
@@ -1625,6 +1763,20 @@ exports.MODEL_REGISTRY = [
1625
1763
  class: 'image_generation',
1626
1764
  description: "OpenAI's GPT-Image-1 model for text-to-image generation. Supports quality levels (low: $0.011-0.016, medium: $0.042-0.063, high: $0.167-0.25) and sizes (1024x1024, 1024x1536, 1536x1024).",
1627
1765
  },
1766
+ {
1767
+ id: 'gpt-image-1-mini',
1768
+ provider: 'openai',
1769
+ cost: {
1770
+ per_image: 0.011,
1771
+ },
1772
+ features: {
1773
+ input_modality: ['text', 'image'],
1774
+ output_modality: ['image'],
1775
+ streaming: false,
1776
+ },
1777
+ class: 'image_generation',
1778
+ description: "OpenAI's GPT-Image-1 Mini model. Cost-efficient variant with lower per-image pricing (low: $0.005-0.006, medium: $0.011-0.015) across sizes (1024x1024, 1024x1536, 1536x1024).",
1779
+ },
1628
1780
  {
1629
1781
  id: 'gpt-4o-mini-tts',
1630
1782
  provider: 'openai',
@@ -2354,7 +2506,7 @@ function findModel(modelId) {
2354
2506
  const aliasMatch = exports.MODEL_REGISTRY.find(model => model.aliases?.includes(modelId));
2355
2507
  if (aliasMatch)
2356
2508
  return aliasMatch;
2357
- const suffixes = ['-low', '-medium', '-high', '-max'];
2509
+ const suffixes = ['-xhigh', '-minimal', '-low', '-medium', '-high', '-none', '-max'];
2358
2510
  for (const suffix of suffixes) {
2359
2511
  if (modelId.endsWith(suffix)) {
2360
2512
  const baseName = modelId.slice(0, -suffix.length);
@@ -1 +1 @@
1
- {"version":3,"file":"model_data.d.ts","sourceRoot":"","sources":["../../../data/model_data.ts"],"names":[],"mappings":"AAYA,OAAO,EACH,YAAY,EACZ,eAAe,EACf,WAAW,EACX,cAAc,EACd,aAAa,EACb,SAAS,EACT,aAAa,EACb,UAAU,EACV,UAAU,EACV,UAAU,EACb,MAAM,mBAAmB,CAAC;AAM3B,YAAY,EACR,YAAY,EACZ,eAAe,EACf,WAAW,EACX,cAAc,EACd,aAAa,EACb,SAAS,EACT,aAAa,EACb,UAAU,EACV,UAAU,EACV,UAAU,GACb,CAAC;AAOF,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsOzB,CAAC;AAGF,eAAO,MAAM,cAAc,EAAE,UAAU,EAmvEtC,CAAC;AAQF,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAuBjE"}
1
+ {"version":3,"file":"model_data.d.ts","sourceRoot":"","sources":["../../../data/model_data.ts"],"names":[],"mappings":"AAYA,OAAO,EACH,YAAY,EACZ,eAAe,EACf,WAAW,EACX,cAAc,EACd,aAAa,EACb,SAAS,EACT,aAAa,EACb,UAAU,EACV,UAAU,EACV,UAAU,EACb,MAAM,mBAAmB,CAAC;AAM3B,YAAY,EACR,YAAY,EACZ,eAAe,EACf,WAAW,EACX,cAAc,EACd,aAAa,EACb,SAAS,EACT,aAAa,EACb,UAAU,EACV,UAAU,EACV,UAAU,GACb,CAAC;AAOF,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0OzB,CAAC;AAGF,eAAO,MAAM,cAAc,EAAE,UAAU,EA24EtC,CAAC;AAQF,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAuBjE"}