symposium 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/Agent.js CHANGED
@@ -107,7 +107,8 @@ export default class Agent {
107
107
 
108
108
  const completion = await this.generateCompletion(thread);
109
109
 
110
- await this.handleCompletion(thread, completion);
110
+ if (completion)
111
+ await this.handleCompletion(thread, completion);
111
112
 
112
113
  const reversedMiddlewares = [...this.middlewares.values()];
113
114
  reversedMiddlewares.reverse();
@@ -148,18 +149,21 @@ export default class Agent {
148
149
  }
149
150
 
150
151
  async handleCompletion(thread, completion) {
151
- thread.addAssistantMessage(completion.content, completion.function_call ? {
152
- ...completion.function_call,
153
- arguments: JSON.stringify(completion.function_call.arguments),
154
- } : null);
155
-
156
- if (completion.content) {
157
- await this.log('ai_message', completion.content);
158
- await thread.reply(completion.content);
152
+ for (let message of completion.messages) {
153
+ thread.addMessage(message);
154
+ await this.log('ai_message', message.text);
155
+ await thread.reply(message.text);
159
156
  }
160
157
 
161
- if (completion?.function_call)
162
- return this.callFunction(thread, completion.function_call);
158
+ if (completion.function) {
159
+ thread.addAssistantMessage('', {
160
+ name: completion.function.name,
161
+ arguments: JSON.stringify(completion.function_call.args),
162
+ });
163
+ }
164
+
165
+ if (completion.function)
166
+ return this.callFunction(thread, completion.function);
163
167
  else
164
168
  return thread.storeState();
165
169
  }
@@ -195,7 +199,7 @@ export default class Agent {
195
199
  await this.log('function_call', function_call);
196
200
 
197
201
  try {
198
- const response = await functions.get(function_call.name).tool.callFunction(thread, function_call.name, function_call.arguments);
202
+ const response = await functions.get(function_call.name).tool.callFunction(thread, function_call.name, function_call.args);
199
203
  thread.addFunctionMessage(response, function_call.name);
200
204
  await this.log('function_response', response);
201
205
  } catch (error) {
package/Response.js ADDED
@@ -0,0 +1,4 @@
1
+ export default class Response {
2
+ messages = [];
3
+ function = null;
4
+ }
package/Symposium.js CHANGED
@@ -4,6 +4,9 @@ import Gpt4 from "./models/Gpt4.js";
4
4
  import Gpt4Turbo from "./models/Gpt4Turbo.js";
5
5
  import Gpt4Vision from "./models/Gpt4Vision.js";
6
6
  import Whisper from "./models/Whisper.js";
7
+ import Claude3Haiku from "./models/Claude3Haiku.js";
8
+ import Claude3Sonnet from "./models/Claude3Sonnet.js";
9
+ import Claude3Opus from "./models/Claude3Opus.js";
7
10
 
8
11
  export default class Symposium {
9
12
  static models = new Map();
@@ -15,6 +18,10 @@ export default class Symposium {
15
18
  this.loadModel(new Gpt4Vision());
16
19
  this.loadModel(new Whisper());
17
20
 
21
+ this.loadModel(new Claude3Haiku());
22
+ this.loadModel(new Claude3Sonnet());
23
+ this.loadModel(new Claude3Opus());
24
+
18
25
  return Redis.init();
19
26
  }
20
27
 
package/Thread.js CHANGED
@@ -62,6 +62,10 @@ export default class Thread {
62
62
  }));
63
63
  }
64
64
 
65
+ addMessage(message) {
66
+ this.messages.push(message);
67
+ }
68
+
65
69
  addSystemMessage(text, tags = []) {
66
70
  this.messages.push(new Message('system', text, null, null, tags));
67
71
  }
package/index.js CHANGED
@@ -14,7 +14,6 @@ export {
14
14
  Symposium,
15
15
  Agent,
16
16
  Thread,
17
- Message,
18
17
  Tool,
19
18
  Logger,
20
19
  MemoryHandler,
@@ -1,5 +1,7 @@
1
1
  import Model from "../Model.js";
2
2
  import Anthropic from '@anthropic-ai/sdk';
3
+ import Response from "../Response.js";
4
+ import Message from "../Message.js";
3
5
 
4
6
  export default class AnthropicModel extends Model {
5
7
  anthropic;
@@ -13,13 +15,37 @@ export default class AnthropicModel extends Model {
13
15
  }
14
16
 
15
17
  async generate(thread, payload = {}, functions = []) {
18
+ const [system, messages] = this.convertMessages(thread);
19
+
16
20
  const completion_payload = {
17
21
  model: this.name,
18
- messages: thread.getMessagesJson(),
22
+ system,
23
+ max_tokens: 4096,
24
+ messages,
19
25
  ...payload,
20
26
  };
21
27
 
22
28
  const message = await this.getAnthropic().messages.create(completion_payload);
23
- return message.content;
29
+
30
+ const response = new Response;
31
+ if (message.content) {
32
+ for (let m of message.content)
33
+ // TODO: supporto ad altri tipi oltre a text (m.type)
34
+ response.messages.push(new Message('assistant', m.text));
35
+ }
36
+
37
+ return response;
38
+ }
39
+
40
+ convertMessages(thread) {
41
+ let system = [], messages = [];
42
+ for (let message of thread.getMessagesJson()) {
43
+ if (message.role === 'system')
44
+ system.push(message.content);
45
+ else
46
+ messages.push(message);
47
+ }
48
+
49
+ return [system.length ? system.join("\n") : undefined, messages];
24
50
  }
25
51
  }
@@ -1,5 +1,7 @@
1
+ import Response from "../Response.js";
1
2
  import Model from "../Model.js";
2
3
  import OpenAI from "openai";
4
+ import Message from "../Message.js";
3
5
 
4
6
  export default class OpenAIModel extends Model {
5
7
  openai;
@@ -28,10 +30,18 @@ export default class OpenAIModel extends Model {
28
30
 
29
31
  const chatCompletion = await this.getOpenAi().chat.completions.create(completion_payload);
30
32
 
33
+ const response = new Response;
31
34
  const completion = chatCompletion.choices[0].message;
32
- if (completion.function_call && completion.function_call.arguments)
33
- completion.function_call.arguments = JSON.parse(completion.function_call.arguments);
35
+ if (completion.content)
36
+ response.messages.push(new Message('assistant', completion.content));
37
+
38
+ if (completion.function_call && completion.function_call.arguments) {
39
+ response.function = {
40
+ name: completion.function_call.name,
41
+ args: JSON.parse(completion.function_call.arguments),
42
+ };
43
+ }
34
44
 
35
- return completion;
45
+ return response;
36
46
  }
37
47
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "symposium",
4
- "version": "0.4.1",
4
+ "version": "0.4.3",
5
5
  "description": "Agents",
6
6
  "main": "index.js",
7
7
  "author": "Domenico Giambra",