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 +16 -12
- package/Response.js +4 -0
- package/Symposium.js +7 -0
- package/Thread.js +4 -0
- package/index.js +0 -1
- package/models/AnthropicModel.js +28 -2
- package/models/OpenAIModel.js +13 -3
- package/package.json +1 -1
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
|
-
|
|
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
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
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
|
|
162
|
-
|
|
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.
|
|
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
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
package/index.js
CHANGED
package/models/AnthropicModel.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
}
|
package/models/OpenAIModel.js
CHANGED
|
@@ -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.
|
|
33
|
-
|
|
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
|
|
45
|
+
return response;
|
|
36
46
|
}
|
|
37
47
|
}
|