symposium 0.4.0 → 0.4.2

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,18 @@ 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
+
155
+ if (completion.function) {
156
+ thread.addAssistantMessage('', {
157
+ name: completion.function.name,
158
+ arguments: JSON.stringify(completion.function_call.args),
159
+ });
159
160
  }
160
161
 
161
- if (completion?.function_call)
162
- return this.callFunction(thread, completion.function_call);
162
+ if (completion.function)
163
+ return this.callFunction(thread, completion.function);
163
164
  else
164
165
  return thread.storeState();
165
166
  }
@@ -195,7 +196,7 @@ export default class Agent {
195
196
  await this.log('function_call', function_call);
196
197
 
197
198
  try {
198
- const response = await functions.get(function_call.name).tool.callFunction(thread, function_call.name, function_call.arguments);
199
+ const response = await functions.get(function_call.name).tool.callFunction(thread, function_call.name, function_call.args);
199
200
  thread.addFunctionMessage(response, function_call.name);
200
201
  await this.log('function_response', response);
201
202
  } 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 "symposium/models/Claude3Haiku.js";
8
+ import Claude3Sonnet from "symposium/models/Claude3Sonnet.js";
9
+ import Claude3Opus from "symposium/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,
@@ -0,0 +1,41 @@
1
+ import Model from "../Model.js";
2
+ import Anthropic from '@anthropic-ai/sdk';
3
+
4
+ export default class AnthropicModel extends Model {
5
+ anthropic;
6
+ supports_tools = false;
7
+
8
+ getAnthropic() {
9
+ if (!this.anthropic)
10
+ this.anthropic = new Anthropic({apiKey: process.env.ANTHROPIC_API_KEY});
11
+
12
+ return this.anthropic;
13
+ }
14
+
15
+ async generate(thread, payload = {}, functions = []) {
16
+ const [system, messages] = this.convertMessages(thread);
17
+
18
+ const completion_payload = {
19
+ model: this.name,
20
+ system,
21
+ max_tokens: 4096,
22
+ messages,
23
+ ...payload,
24
+ };
25
+
26
+ const message = await this.getAnthropic().messages.create(completion_payload);
27
+ return message.content;
28
+ }
29
+
30
+ convertMessages(thread) {
31
+ let system = [], messages = [];
32
+ for (let message of thread.getMessagesJson()) {
33
+ if (message.role === 'system')
34
+ system.push(message.content);
35
+ else
36
+ messages.push(message);
37
+ }
38
+
39
+ return [system.length ? system.join("\n") : undefined, messages];
40
+ }
41
+ }
@@ -0,0 +1,7 @@
1
+ import AnthropicModel from "./AnthropicModel.js";
2
+
3
+ export default class Claude3Haiku extends AnthropicModel {
4
+ name = 'claude-3-haiku-20240307';
5
+ label = 'claude-3-haiku';
6
+ tokens = 200000;
7
+ }
@@ -0,0 +1,7 @@
1
+ import AnthropicModel from "./AnthropicModel.js";
2
+
3
+ export default class Claude3Opus extends AnthropicModel {
4
+ name = 'claude-3-opus-20240229';
5
+ label = 'claude-3-opus';
6
+ tokens = 200000;
7
+ }
@@ -0,0 +1,7 @@
1
+ import AnthropicModel from "./AnthropicModel.js";
2
+
3
+ export default class Claude3Sonnet extends AnthropicModel {
4
+ name = 'claude-3-sonnet-20240229';
5
+ label = 'claude-3-sonnet';
6
+ tokens = 200000;
7
+ }
package/models/Gpt4.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import OpenAIModel from "./OpenAIModel.js";
2
2
 
3
- export default class Gpt4 extends OpenAIModel {
3
+ export default class Gpt4 extends OpenAIModel {
4
4
  name = 'gpt-4';
5
5
  label = 'gpt-4';
6
6
  tokens = 8192;
@@ -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,12 +1,13 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "symposium",
4
- "version": "0.4.0",
4
+ "version": "0.4.2",
5
5
  "description": "Agents",
6
6
  "main": "index.js",
7
7
  "author": "Domenico Giambra",
8
8
  "license": "ISC",
9
9
  "dependencies": {
10
+ "@anthropic-ai/sdk": "^0.19.1",
10
11
  "@travio/redis": "^2.0.0",
11
12
  "openai": "^4.12.1",
12
13
  "tiktoken": "^1.0.10"