symmetry-cli 1.0.4 → 1.0.6

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.
@@ -0,0 +1,31 @@
1
+ # This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node
2
+ # For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-nodejs
3
+
4
+ name: Node.js CI
5
+
6
+ on:
7
+ push:
8
+ branches: [ "master" ]
9
+ pull_request:
10
+ branches: [ "master" ]
11
+
12
+ jobs:
13
+ build:
14
+
15
+ runs-on: ubuntu-latest
16
+
17
+ strategy:
18
+ matrix:
19
+ node-version: [18.x, 20.x, 22.x]
20
+ # See supported Node.js release schedule at https://nodejs.org/en/about/releases/
21
+
22
+ steps:
23
+ - uses: actions/checkout@v4
24
+ - name: Use Node.js ${{ matrix.node-version }}
25
+ uses: actions/setup-node@v4
26
+ with:
27
+ node-version: ${{ matrix.node-version }}
28
+ cache: 'npm'
29
+ - run: npm ci
30
+ - run: npm run build --if-present
31
+ - run: npm test
package/dist/provider.js CHANGED
@@ -50,7 +50,7 @@ class SymmetryProvider {
50
50
  if (this._isPublic) {
51
51
  logger_1.logger.info(chalk_1.default.white(`🔑 Server key: ${this._config.get("serverKey")}`));
52
52
  logger_1.logger.info(chalk_1.default.white("🔗 Joining server, please wait."));
53
- await this.joinServer();
53
+ this.testProviderCall();
54
54
  }
55
55
  process.on("SIGINT", async () => {
56
56
  var _a;
@@ -63,6 +63,50 @@ class SymmetryProvider {
63
63
  }
64
64
  });
65
65
  }
66
+ async testProviderCall() {
67
+ logger_1.logger.info(chalk_1.default.white(`👋 Saying hello to your provider...`));
68
+ const testMessages = [
69
+ { role: "user", content: "Hello, this is a test message." },
70
+ ];
71
+ const req = this.buildStreamRequest(testMessages);
72
+ if (!req) {
73
+ logger_1.logger.error(chalk_1.default.red("❌ Failed to build test request"));
74
+ throw new Error("Failed to build test request");
75
+ }
76
+ const { requestOptions, requestBody } = req;
77
+ const { protocol, hostname, port, path, method, headers } = requestOptions;
78
+ const url = `${protocol}://${hostname}:${port}${path}`;
79
+ logger_1.logger.info(chalk_1.default.white(`🚀 Sending test request to ${url}`));
80
+ try {
81
+ const response = await fetch(url, {
82
+ method,
83
+ headers,
84
+ body: JSON.stringify(requestBody),
85
+ });
86
+ if (!response.ok) {
87
+ logger_1.logger.error(chalk_1.default.red(`❌ Server responded with status code: ${response.status}`));
88
+ throw new Error(`Server responded with status code: ${response.status}`);
89
+ }
90
+ if (!response.body) {
91
+ logger_1.logger.error(chalk_1.default.red("❌ Failed to get a ReadableStream from the response"));
92
+ throw new Error("Failed to get a ReadableStream from the response");
93
+ }
94
+ logger_1.logger.info(chalk_1.default.white(`📡 Got response, checking stream...`));
95
+ const reader = response.body.getReader();
96
+ const { done } = await reader.read();
97
+ if (done) {
98
+ logger_1.logger.error(chalk_1.default.red("❌ Stream ended without data"));
99
+ throw new Error("Stream ended without data");
100
+ }
101
+ logger_1.logger.info(chalk_1.default.green(`✅ Test inference call successful!`));
102
+ }
103
+ catch (error) {
104
+ logger_1.logger.error(chalk_1.default.red(`❌ Error during test inference call: ${error}`));
105
+ throw error;
106
+ }
107
+ logger_1.logger.info(chalk_1.default.white(`🔗 Proceeding to join server...`));
108
+ await this.joinServer();
109
+ }
66
110
  async joinServer() {
67
111
  const serverSwarm = new hyperswarm_1.default();
68
112
  const serverKey = Buffer.from(this._config.get("serverKey"));
@@ -147,16 +191,20 @@ class SymmetryProvider {
147
191
  }
148
192
  });
149
193
  }
150
- async handleInferenceRequest(data, peer) {
151
- const emitterKey = data.data.key;
152
- const messages = data === null || data === void 0 ? void 0 : data.data.messages;
153
- const req = this.buildStreamRequest(data === null || data === void 0 ? void 0 : data.data.messages);
154
- if (messages.length === 2) {
194
+ getMessagesWithSystem(messages) {
195
+ const systemMessage = this._config.get("systemMessage");
196
+ if (messages.length === 2 && systemMessage) {
155
197
  messages.unshift({
156
198
  role: "system",
157
- content: this._config.get("systemMessage"),
199
+ content: systemMessage,
158
200
  });
159
201
  }
202
+ return messages;
203
+ }
204
+ async handleInferenceRequest(data, peer) {
205
+ const emitterKey = data.data.key;
206
+ const messages = this.getMessagesWithSystem(data === null || data === void 0 ? void 0 : data.data.messages);
207
+ const req = this.buildStreamRequest(messages);
160
208
  if (!req)
161
209
  return;
162
210
  const { requestOptions, requestBody } = req;
@@ -199,7 +247,10 @@ class SymmetryProvider {
199
247
  });
200
248
  await Promise.resolve(peerPipeline);
201
249
  peer.write((0, utils_1.createMessage)(constants_1.serverMessageKeys.inferenceEnded, data === null || data === void 0 ? void 0 : data.data.key));
202
- this.saveCompletion(completion, peer, data.data.messages);
250
+ if (this._config.get("dataCollectionEnabled") &&
251
+ data.data.key === constants_1.serverMessageKeys.inference) {
252
+ this.saveCompletion(completion, peer, data.data.messages);
253
+ }
203
254
  }
204
255
  catch (error) {
205
256
  let errorMessage = "An error occurred during inference";
package/install.ps1 CHANGED
@@ -44,6 +44,7 @@ modelName: llama3.1:latest
44
44
  name: $env:USERNAME
45
45
  path: $config_dir
46
46
  public: true
47
+ systemMessage:
47
48
  serverKey: 4b4a9cc325d134dee6679e9407420023531fd7e96c563f6c5d00fd5549b77435
48
49
  "@ | Set-Content $provider_yaml
49
50
  Print-Color $GREEN "provider.yaml created successfully at $provider_yaml"
package/install.sh CHANGED
@@ -46,7 +46,9 @@ modelName: llama3.1:latest
46
46
  name: $(whoami)
47
47
  path: $config_dir
48
48
  public: true
49
+ systemMessage:
49
50
  serverKey: 4b4a9cc325d134dee6679e9407420023531fd7e96c563f6c5d00fd5549b77435
51
+
50
52
  EOF
51
53
  print_color "$GREEN" "provider.yaml created successfully at $provider_yaml"
52
54
  else
@@ -54,7 +56,4 @@ else
54
56
  fi
55
57
 
56
58
  print_color "$GREEN" "Installation complete! You can now run 'symmetry-cli' to start your node."
57
- print_color "$YELLOW" "Please edit $provider_yaml to customize your provider settings, especially:"
58
- print_color "$YELLOW" " - apiKey: Add your API key if required"
59
- print_color "$YELLOW" " - name: Currently set to your system username, change if needed"
60
- print_color "$YELLOW" " - public: Set to true by default, change to false if you don't want to be publicly accessible"
59
+ print_color "$YELLOW" "Please edit $provider_yaml to customize your provider settings:"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "symmetry-cli",
3
- "version": "1.0.4",
3
+ "version": "1.0.6",
4
4
  "description": "",
5
5
  "main": "dist/symmetry.js",
6
6
  "bin": "dist/symmetry.js",
package/readme.md CHANGED
@@ -58,6 +58,7 @@ name: twinnydotdev # Your chosen name as a provider on the Symmetry network.
58
58
  path: /home/twinnydotdev/.config/symmetry/data # The local path where Symmetry will store its configuration and data files.
59
59
  public: true # Whether this provider is publicly accessible on the Symmetry network.
60
60
  serverKey: 4b4a9cc325d134dee6679e9407420023531fd7e96c563f6c5d00fd5549b77435 # The unique key for connecting to the Symmetry server.
61
+ systemMessage: "I'm a system message" # An optional system message for each conversation.
61
62
  ```
62
63
 
63
64
  Adjust these settings according to your preferences and setup.
package/src/provider.ts CHANGED
@@ -63,7 +63,7 @@ export class SymmetryProvider {
63
63
  chalk.white(`🔑 Server key: ${this._config.get("serverKey")}`)
64
64
  );
65
65
  logger.info(chalk.white("🔗 Joining server, please wait."));
66
- await this.joinServer();
66
+ this.testProviderCall();
67
67
  }
68
68
 
69
69
  process.on("SIGINT", async () => {
@@ -78,6 +78,66 @@ export class SymmetryProvider {
78
78
  });
79
79
  }
80
80
 
81
+ private async testProviderCall(): Promise<void> {
82
+ logger.info(chalk.white(`👋 Saying hello to your provider...`));
83
+ const testMessages: Message[] = [
84
+ { role: "user", content: "Hello, this is a test message." },
85
+ ];
86
+ const req = this.buildStreamRequest(testMessages);
87
+
88
+ if (!req) {
89
+ logger.error(chalk.red("❌ Failed to build test request"));
90
+ throw new Error("Failed to build test request");
91
+ }
92
+
93
+ const { requestOptions, requestBody } = req;
94
+ const { protocol, hostname, port, path, method, headers } = requestOptions;
95
+ const url = `${protocol}://${hostname}:${port}${path}`;
96
+
97
+ logger.info(chalk.white(`🚀 Sending test request to ${url}`));
98
+
99
+ try {
100
+ const response = await fetch(url, {
101
+ method,
102
+ headers,
103
+ body: JSON.stringify(requestBody),
104
+ });
105
+
106
+ if (!response.ok) {
107
+ logger.error(
108
+ chalk.red(`❌ Server responded with status code: ${response.status}`)
109
+ );
110
+ throw new Error(
111
+ `Server responded with status code: ${response.status}`
112
+ );
113
+ }
114
+
115
+ if (!response.body) {
116
+ logger.error(
117
+ chalk.red("❌ Failed to get a ReadableStream from the response")
118
+ );
119
+ throw new Error("Failed to get a ReadableStream from the response");
120
+ }
121
+
122
+ logger.info(chalk.white(`📡 Got response, checking stream...`));
123
+
124
+ const reader = response.body.getReader();
125
+ const { done } = await reader.read();
126
+ if (done) {
127
+ logger.error(chalk.red("❌ Stream ended without data"));
128
+ throw new Error("Stream ended without data");
129
+ }
130
+
131
+ logger.info(chalk.green(`✅ Test inference call successful!`));
132
+ } catch (error) {
133
+ logger.error(chalk.red(`❌ Error during test inference call: ${error}`));
134
+ throw error;
135
+ }
136
+
137
+ logger.info(chalk.white(`🔗 Proceeding to join server...`));
138
+ await this.joinServer();
139
+ }
140
+
81
141
  async joinServer(): Promise<void> {
82
142
  const serverSwarm = new Hyperswarm();
83
143
  const serverKey = Buffer.from(this._config.get("serverKey"));
@@ -191,7 +251,7 @@ export class SymmetryProvider {
191
251
  }
192
252
 
193
253
  private getMessagesWithSystem(messages: Message[]): Message[] {
194
- const systemMessage = this._config.get("systemMessage")
254
+ const systemMessage = this._config.get("systemMessage");
195
255
  if (messages.length === 2 && systemMessage) {
196
256
  messages.unshift({
197
257
  role: "system",