symposium 2.1.3 → 2.1.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/Model.js CHANGED
@@ -1,9 +1,12 @@
1
1
  export default class Model {
2
2
  type = 'llm';
3
- models = new Map();
4
3
  tokens;
5
4
  system_role_name = 'system';
6
5
 
6
+ async getModels() {
7
+ return new Map();
8
+ }
9
+
7
10
  async generate(model, thread, functions = [], options = {}) {
8
11
  return null;
9
12
  }
@@ -4,33 +4,36 @@ import Message from "../Message.js";
4
4
 
5
5
  export default class AnthropicModel extends Model {
6
6
  anthropic;
7
- models = new Map([
8
- ['claude-3.7-sonnet', {
9
- name: 'claude-3-7-sonnet-latest',
10
- tokens: 200000,
11
- tools: true,
12
- }],
13
- ['claude-4-opus', {
14
- name: 'claude-opus-4-20250514',
15
- tokens: 200000,
16
- tools: true,
17
- }],
18
- ['claude-4-sonnet', {
19
- name: 'claude-sonnet-4-20250514',
20
- tokens: 200000,
21
- tools: true,
22
- }],
23
- ['claude-4.5-haiku', {
24
- name: 'claude-haiku-4-5-20251001',
25
- tokens: 200000,
26
- tools: true,
27
- }],
28
- ['claude-4.5-sonnet', {
29
- name: 'claude-sonnet-4-5-20250929',
30
- tokens: 200000,
31
- tools: true,
32
- }],
33
- ]);
7
+
8
+ async getModels() {
9
+ return new Map([
10
+ ['claude-3.7-sonnet', {
11
+ name: 'claude-3-7-sonnet-latest',
12
+ tokens: 200000,
13
+ tools: true,
14
+ }],
15
+ ['claude-4-opus', {
16
+ name: 'claude-opus-4-20250514',
17
+ tokens: 200000,
18
+ tools: true,
19
+ }],
20
+ ['claude-4-sonnet', {
21
+ name: 'claude-sonnet-4-20250514',
22
+ tokens: 200000,
23
+ tools: true,
24
+ }],
25
+ ['claude-4.5-haiku', {
26
+ name: 'claude-haiku-4-5-20251001',
27
+ tokens: 200000,
28
+ tools: true,
29
+ }],
30
+ ['claude-4.5-sonnet', {
31
+ name: 'claude-sonnet-4-5-20250929',
32
+ tokens: 200000,
33
+ tools: true,
34
+ }],
35
+ ]);
36
+ }
34
37
 
35
38
  getAnthropic() {
36
39
  if (!this.anthropic)
@@ -2,16 +2,18 @@ import OpenAIModel from "./OpenAIModel.js";
2
2
  import OpenAI from "openai";
3
3
 
4
4
  export default class DeepSeekModel extends OpenAIModel {
5
- models = new Map([
6
- ['deepseek-chat', {
7
- name: 'deepseek-chat',
8
- tokens: 64000,
9
- }],
10
- ['deepseek-reasoner', {
11
- name: 'deepseek-reasoner',
12
- tokens: 64000,
13
- }],
14
- ]);
5
+ async getModels() {
6
+ return new Map([
7
+ ['deepseek-chat', {
8
+ name: 'deepseek-chat',
9
+ tokens: 64000,
10
+ }],
11
+ ['deepseek-reasoner', {
12
+ name: 'deepseek-reasoner',
13
+ tokens: 64000,
14
+ }],
15
+ ]);
16
+ }
15
17
 
16
18
  getOpenAi() {
17
19
  if (!this.openai) {
@@ -2,12 +2,14 @@ import OpenAIModel from "./OpenAIModel.js";
2
2
  import OpenAI from "openai";
3
3
 
4
4
  export default class GrokModel extends OpenAIModel {
5
- models = new Map([
6
- ['grok-4', {
7
- name: 'grok-4',
8
- tokens: 256000,
9
- }],
10
- ]);
5
+ async getModels() {
6
+ return new Map([
7
+ ['grok-4', {
8
+ name: 'grok-4',
9
+ tokens: 256000,
10
+ }],
11
+ ]);
12
+ }
11
13
 
12
14
  getOpenAi() {
13
15
  if (!this.openai) {
@@ -4,18 +4,21 @@ import Message from "../Message.js";
4
4
 
5
5
  export default class GroqModel extends Model {
6
6
  groq;
7
- models = new Map([
8
- ['llama-3', {
9
- name: 'llama-3.3-70b-versatile',
10
- tokens: 128000,
11
- tools: true,
12
- }],
13
- ['mixtral-8', {
14
- name: 'mixtral-8x7b-32768',
15
- tokens: 32768,
16
- tools: true,
17
- }],
18
- ]);
7
+
8
+ async getModels() {
9
+ return new Map([
10
+ ['llama-3', {
11
+ name: 'llama-3.3-70b-versatile',
12
+ tokens: 128000,
13
+ tools: true,
14
+ }],
15
+ ['mixtral-8', {
16
+ name: 'mixtral-8x7b-32768',
17
+ tokens: 32768,
18
+ tools: true,
19
+ }],
20
+ ]);
21
+ }
19
22
 
20
23
  getGroq() {
21
24
  if (!this.groq)
@@ -3,14 +3,22 @@ import Model from "../Model.js";
3
3
  import Message from "../Message.js";
4
4
 
5
5
  export default class OllamaModel extends Model {
6
- models = new Map([ // TODO: dynamic models (via ollama API?)
7
- ['gpt-oss-20b', {
8
- name: 'gpt-oss:20b',
9
- tokens: 32768,
10
- tools: true,
11
- structured_output: true,
12
- }]
13
- ]);
6
+ async getModels() {
7
+ const {models} = await ollama.list();
8
+
9
+ const map = new Map();
10
+
11
+ for (let m of models) {
12
+ map.set(m.name, {
13
+ name: m.name,
14
+ tokens: null, // TODO
15
+ tools: true,
16
+ structured_output: true,
17
+ })
18
+ }
19
+
20
+ return map;
21
+ }
14
22
 
15
23
  async generate(model, thread, functions = [], options = {}) {
16
24
  const parsed = this.parseOptions(options, functions);
@@ -2,10 +2,13 @@ import OpenAIModel from "./OpenAIModel.js";
2
2
 
3
3
  export default class OpenAIEmbedding extends OpenAIModel {
4
4
  type = 'embedding';
5
- models = new Map([
6
- ['openai-text-embedding-3-large', {name: 'text-embedding-3-large'}],
7
- ['openai-text-embedding-3-small', {name: 'text-embedding-3-small'}],
8
- ]);
5
+
6
+ async getModels() {
7
+ return new Map([
8
+ ['openai-text-embedding-3-large', {name: 'text-embedding-3-large'}],
9
+ ['openai-text-embedding-3-small', {name: 'text-embedding-3-small'}],
10
+ ]);
11
+ }
9
12
 
10
13
  async embed(input, model) {
11
14
  const response = await this.getOpenAi().embeddings.create({
@@ -5,30 +5,33 @@ import {encoding_for_model} from "tiktoken";
5
5
 
6
6
  export default class OpenAIModel extends Model {
7
7
  openai;
8
- models = new Map([
9
- ['gpt-4o', {
10
- name: 'gpt-4o',
11
- tiktoken: 'gpt-4',
12
- tokens: 128000,
13
- tools: true,
14
- structured_output: true,
15
- }],
16
- ['gpt-5', {
17
- name: 'gpt-5',
18
- tiktoken: 'gpt-4',
19
- tokens: 400000,
20
- tools: true,
21
- structured_output: true,
22
- audio: true,
23
- }],
24
- ['gpt-5-mini', {
25
- name: 'gpt-5-mini',
26
- tiktoken: 'gpt-4',
27
- tokens: 400000,
28
- tools: true,
29
- structured_output: true,
30
- }]
31
- ]);
8
+
9
+ async getModels() {
10
+ return new Map([
11
+ ['gpt-4o', {
12
+ name: 'gpt-4o',
13
+ tiktoken: 'gpt-4',
14
+ tokens: 128000,
15
+ tools: true,
16
+ structured_output: true,
17
+ }],
18
+ ['gpt-5', {
19
+ name: 'gpt-5',
20
+ tiktoken: 'gpt-4',
21
+ tokens: 400000,
22
+ tools: true,
23
+ structured_output: true,
24
+ audio: true,
25
+ }],
26
+ ['gpt-5-mini', {
27
+ name: 'gpt-5-mini',
28
+ tiktoken: 'gpt-4',
29
+ tokens: 400000,
30
+ tools: true,
31
+ structured_output: true,
32
+ }],
33
+ ]);
34
+ }
32
35
 
33
36
  getOpenAi() {
34
37
  if (!this.openai)
@@ -120,7 +123,7 @@ export default class OpenAIModel extends Model {
120
123
 
121
124
  async countTokens(thread) {
122
125
  try {
123
- const model = this.models.get(thread.state.model);
126
+ const model = (await this.getModels()).get(thread.state.model);
124
127
  const encoder = encoding_for_model(model.tiktoken || model.name);
125
128
 
126
129
  const texts = [];
@@ -188,7 +191,7 @@ export default class OpenAIModel extends Model {
188
191
  content: '[transcribed] ' + c.content.transcription,
189
192
  name: message.name,
190
193
  });
191
- } else{
194
+ } else {
192
195
  throw new Error('Audio content is not supported by this model');
193
196
  }
194
197
  break;
@@ -2,9 +2,12 @@ import OpenAIModel from "./OpenAIModel.js";
2
2
 
3
3
  export default class OpenAITranscribe extends OpenAIModel {
4
4
  type = 'stt';
5
- models = new Map([
6
- ['gpt-4o-transcribe', {name: 'gpt-4o-transcribe'}],
7
- ]);
5
+
6
+ async getModels() {
7
+ return new Map([
8
+ ['gpt-4o-transcribe', {name: 'gpt-4o-transcribe'}],
9
+ ]);
10
+ }
8
11
 
9
12
  async transcribe(file, model, prompt = null) {
10
13
  const response = await this.getOpenAi().audio.transcriptions.create({
package/Symposium.js CHANGED
@@ -29,7 +29,7 @@ export default class Symposium {
29
29
  const module = await import(`./Models/${file}`);
30
30
  const ModelClass = module.default;
31
31
  if (ModelClass)
32
- this.loadModel(new ModelClass());
32
+ await this.loadModel(new ModelClass());
33
33
  }
34
34
 
35
35
  if (storage) {
@@ -38,8 +38,9 @@ export default class Symposium {
38
38
  }
39
39
  }
40
40
 
41
- static loadModel(model_class) {
42
- for (let [key, model] of model_class.models.entries()) {
41
+ static async loadModel(model_class) {
42
+ const models = (await model_class.getModels()).entries();
43
+ for (let [key, model] of models) {
43
44
  if (this.models.has(key))
44
45
  throw new Error(`Duplicate model with key "${key}"`);
45
46
 
package/package.json CHANGED
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "symposium",
4
- "version": "2.1.3",
4
+ "version": "2.1.5",
5
5
  "description": "Agents",
6
6
  "main": "index.js",
7
7
  "author": "Domenico Giambra",
8
8
  "license": "ISC",
9
9
  "dependencies": {
10
10
  "@anthropic-ai/sdk": "^0.67.0",
11
- "groq-sdk": "^0.33.0",
11
+ "groq-sdk": "^0.34.0",
12
12
  "ollama": "^0.6.0",
13
13
  "openai": "^6.0.0",
14
14
  "tiktoken": "^1.0.10",