symposium 0.4.3 → 0.4.4

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
@@ -123,7 +123,7 @@ export default class Agent {
123
123
  async generateCompletion(thread, payload = {}, retry_counter = 1) {
124
124
  try {
125
125
  const model = Symposium.getModelByName(thread.state.model);
126
- return model.generate(thread, payload, await this.getFunctions())
126
+ return model.generate(thread, payload, await this.getFunctions());
127
127
  } catch (error) {
128
128
  if (error.response) {
129
129
  console.error(error.response.status);
package/Model.js CHANGED
@@ -4,7 +4,7 @@ export default class Model {
4
4
  name_for_tiktoken;
5
5
  label;
6
6
  tokens;
7
- supports_tools = false;
7
+ supports_functions = false;
8
8
 
9
9
  constructor() {
10
10
  if (!this.label)
@@ -13,7 +13,29 @@ export default class Model {
13
13
  this.name_for_tiktoken = this.name;
14
14
  }
15
15
 
16
- async generate(thread) {
16
+ async generate(thread, payload = {}, functions = []) {
17
17
  return null;
18
18
  }
19
+
20
+ promptFromFunctions(functions) {
21
+ if (!functions.length)
22
+ return null;
23
+
24
+ let message = "Hai a disposizione le seguenti funzioni, per chiamare una funzione scrivi un messaggio che inizia con CALL nome_funzione e a capo inserisci il JSON con gli argomenti, ad esempio:\n" +
25
+ "CALL create_user\n" +
26
+ '{"name":"test"}' + "\n\n" +
27
+ "Lista funzioni:\n";
28
+
29
+ for (let f of functions)
30
+ message += '- ' + f.name + "\n " + f.description + "\n";
31
+
32
+ message += "\nOpenAPI specs:\n\n";
33
+ for (let f of functions) {
34
+ if (!f.parameters)
35
+ continue;
36
+ message += '=== ' + f.name + " ===\n" + JSON.stringify(f.parameters.properties) + "\n\n";
37
+ }
38
+
39
+ return message;
40
+ }
19
41
  }
@@ -5,7 +5,7 @@ import Message from "../Message.js";
5
5
 
6
6
  export default class AnthropicModel extends Model {
7
7
  anthropic;
8
- supports_tools = false;
8
+ supports_functions = false;
9
9
 
10
10
  getAnthropic() {
11
11
  if (!this.anthropic)
@@ -15,7 +15,14 @@ export default class AnthropicModel extends Model {
15
15
  }
16
16
 
17
17
  async generate(thread, payload = {}, functions = []) {
18
- const [system, messages] = this.convertMessages(thread);
18
+ let [system, messages] = this.convertMessages(thread);
19
+
20
+ if (functions.length && !this.supports_functions) {
21
+ // Se il modello non supporta nativamente le funzioni, aggiungo il prompt al messaggio di sistema
22
+ const functions_prompt = this.promptFromFunctions(functions);
23
+ system += functions_prompt;
24
+ functions = [];
25
+ }
19
26
 
20
27
  const completion_payload = {
21
28
  model: this.name,
@@ -5,5 +5,5 @@ export default class Gpt4Vision extends OpenAIModel {
5
5
  label = 'gpt-4-vision';
6
6
  name_for_tiktoken = 'gpt-4';
7
7
  tokens = 128000;
8
- supports_tools = false;
8
+ supports_functions = false;
9
9
  }
@@ -5,7 +5,7 @@ import Message from "../Message.js";
5
5
 
6
6
  export default class OpenAIModel extends Model {
7
7
  openai;
8
- supports_tools = true;
8
+ supports_functions = true;
9
9
 
10
10
  getOpenAi() {
11
11
  if (!this.openai)
@@ -15,9 +15,31 @@ export default class OpenAIModel extends Model {
15
15
  }
16
16
 
17
17
  async generate(thread, payload = {}, functions = []) {
18
+ let messages = thread.getMessagesJson();
19
+
20
+ if (functions.length && !this.supports_functions) {
21
+ // Se il modello non supporta nativamente le funzioni, inserisco il prompt ad hoc come ultimo messaggio di sistema
22
+ const functions_prompt = this.promptFromFunctions(functions);
23
+ let system_messages = [], other_messages = [], first_found = false;
24
+ for (let message of messages) {
25
+ if (!first_found && message.role !== 'system')
26
+ first_found = true;
27
+
28
+ if (!first_found)
29
+ system_messages.push(message);
30
+ else
31
+ other_messages.push(message);
32
+ }
33
+
34
+ system_messages.push({role: 'system', content: functions_prompt});
35
+
36
+ messages = [...system_messages, ...other_messages];
37
+ functions = [];
38
+ }
39
+
18
40
  const completion_payload = {
19
41
  model: this.name,
20
- messages: thread.getMessagesJson(),
42
+ messages,
21
43
  functions,
22
44
  ...payload,
23
45
  };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "symposium",
4
- "version": "0.4.3",
4
+ "version": "0.4.4",
5
5
  "description": "Agents",
6
6
  "main": "index.js",
7
7
  "author": "Domenico Giambra",