@solrouter/sdk 1.0.0 → 1.0.1
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/README.md +72 -0
- package/dist/client.d.ts +4 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +40 -4
- package/dist/client.js.map +1 -1
- package/dist/types.d.ts +27 -1
- package/dist/types.d.ts.map +1 -1
- package/examples/test-connection.ts +135 -0
- package/package.json +9 -3
package/README.md
CHANGED
|
@@ -22,6 +22,78 @@ const response = await client.chat('Explain quantum computing');
|
|
|
22
22
|
console.log(response.message);
|
|
23
23
|
```
|
|
24
24
|
|
|
25
|
+
## Testing Your Setup
|
|
26
|
+
|
|
27
|
+
### Verify API Key
|
|
28
|
+
|
|
29
|
+
Check if your API key is valid by fetching your balance:
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
import { SolRouter } from '@solrouter/sdk';
|
|
33
|
+
|
|
34
|
+
const client = new SolRouter({
|
|
35
|
+
apiKey: 'sk_solrouter_your_key_here',
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
async function main() {
|
|
39
|
+
try {
|
|
40
|
+
const balance = await client.getBalance();
|
|
41
|
+
console.log('API key valid! Balance:', balance.balanceFormatted);
|
|
42
|
+
} catch (error) {
|
|
43
|
+
console.error('Invalid API key');
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
main();
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Test Script
|
|
50
|
+
|
|
51
|
+
The SDK includes a connection test script. After installing, copy it from `node_modules`:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
# Copy the test script
|
|
55
|
+
cp node_modules/@solrouter/sdk/examples/test-connection.ts ./
|
|
56
|
+
|
|
57
|
+
# Run with your API key
|
|
58
|
+
SOLROUTER_API_KEY=sk_solrouter_xxx npx ts-node test-connection.ts
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
The test script will verify:
|
|
62
|
+
1. API key validity
|
|
63
|
+
2. Encrypted chat functionality
|
|
64
|
+
3. Live web search
|
|
65
|
+
|
|
66
|
+
Example output:
|
|
67
|
+
```
|
|
68
|
+
==================================================
|
|
69
|
+
SolRouter SDK Connection Test
|
|
70
|
+
==================================================
|
|
71
|
+
Base URL: https://solrouter-obb4.onrender.com
|
|
72
|
+
API Key: sk_solrouter_xxx****
|
|
73
|
+
|
|
74
|
+
[1/3] Testing API Key...
|
|
75
|
+
✓ API key is valid
|
|
76
|
+
Balance: $10.5000 USDC
|
|
77
|
+
|
|
78
|
+
[2/3] Testing Encrypted Chat...
|
|
79
|
+
✓ Encrypted chat working
|
|
80
|
+
Response: "4"
|
|
81
|
+
Encrypted: true
|
|
82
|
+
|
|
83
|
+
[3/3] Testing Live Search...
|
|
84
|
+
✓ Live search working
|
|
85
|
+
Response: "Bitcoin is currently trading at $95,084 USD."
|
|
86
|
+
|
|
87
|
+
==================================================
|
|
88
|
+
Results
|
|
89
|
+
==================================================
|
|
90
|
+
API Key: ✓
|
|
91
|
+
Encrypted Chat: ✓
|
|
92
|
+
Live Search: ✓
|
|
93
|
+
|
|
94
|
+
3/3 tests passed
|
|
95
|
+
```
|
|
96
|
+
|
|
25
97
|
## How It Works
|
|
26
98
|
|
|
27
99
|
1. **Client-side Encryption**: Your prompt is encrypted using Arcium's RescueCipher before leaving your device
|
package/dist/client.d.ts
CHANGED
|
@@ -17,6 +17,10 @@ export declare class SolRouter {
|
|
|
17
17
|
* @returns The AI response
|
|
18
18
|
*/
|
|
19
19
|
chat(prompt: string, options?: ChatOptions): Promise<ChatResponse>;
|
|
20
|
+
/**
|
|
21
|
+
* BRAID-guided chat — routes to the agent endpoint with reasoning: 'braid'
|
|
22
|
+
*/
|
|
23
|
+
private braidChat;
|
|
20
24
|
/**
|
|
21
25
|
* Encrypted chat - prompt is encrypted client-side
|
|
22
26
|
*/
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EACV,eAAe,EACf,WAAW,EACX,YAAY,EACZ,eAAe,EAChB,MAAM,YAAY,CAAC;AAcpB,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAU;gBAEf,MAAM,EAAE,eAAe;IASnC;;;;;;OAMG;IACG,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EACV,eAAe,EACf,WAAW,EACX,YAAY,EACZ,eAAe,EAChB,MAAM,YAAY,CAAC;AAcpB,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAU;gBAEf,MAAM,EAAE,eAAe;IASnC;;;;;;OAMG;IACG,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,YAAY,CAAC;IAgB5E;;OAEG;YACW,SAAS;IAwCvB;;OAEG;YACW,aAAa;IAgE3B;;OAEG;YACW,SAAS;IAqDvB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAQ3B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,eAAe,CAAC;IAmB5C;;OAEG;IACH,YAAY,IAAI,IAAI;CAGrB"}
|
package/dist/client.js
CHANGED
|
@@ -9,9 +9,9 @@ const DEFAULT_MODEL = 'gpt-oss-20b';
|
|
|
9
9
|
// Model mapping for API
|
|
10
10
|
const MODEL_MAP = {
|
|
11
11
|
'gpt-oss-20b': 'nosana:gpt-oss:20b',
|
|
12
|
-
'qwen3-8b': 'nosana:qwen3:8b',
|
|
13
12
|
'gemini-flash': 'gemini:gemini-2.0-flash-exp',
|
|
14
13
|
'claude-sonnet': 'claude:claude-3-5-sonnet-20241022',
|
|
14
|
+
'claude-sonnet-4': 'claude:claude-sonnet-4-20250514',
|
|
15
15
|
'gpt-4o-mini': 'openai:gpt-4o-mini',
|
|
16
16
|
};
|
|
17
17
|
export class SolRouter {
|
|
@@ -34,6 +34,10 @@ export class SolRouter {
|
|
|
34
34
|
* @returns The AI response
|
|
35
35
|
*/
|
|
36
36
|
async chat(prompt, options = {}) {
|
|
37
|
+
// BRAID reasoning path — routes through the agent endpoint
|
|
38
|
+
if (options.reasoning === 'braid') {
|
|
39
|
+
return this.braidChat(prompt, options);
|
|
40
|
+
}
|
|
37
41
|
const useEncryption = options.encrypted ?? this.encrypted;
|
|
38
42
|
const model = MODEL_MAP[options.model || DEFAULT_MODEL] || options.model || MODEL_MAP[DEFAULT_MODEL];
|
|
39
43
|
if (useEncryption) {
|
|
@@ -43,6 +47,38 @@ export class SolRouter {
|
|
|
43
47
|
return this.plainChat(prompt, model, options);
|
|
44
48
|
}
|
|
45
49
|
}
|
|
50
|
+
/**
|
|
51
|
+
* BRAID-guided chat — routes to the agent endpoint with reasoning: 'braid'
|
|
52
|
+
*/
|
|
53
|
+
async braidChat(prompt, options) {
|
|
54
|
+
const model = MODEL_MAP[options.model || DEFAULT_MODEL] || options.model || MODEL_MAP[DEFAULT_MODEL];
|
|
55
|
+
const response = await fetch(`${this.baseUrl}/agent`, {
|
|
56
|
+
method: 'POST',
|
|
57
|
+
headers: {
|
|
58
|
+
'Content-Type': 'application/json',
|
|
59
|
+
'Authorization': `Bearer ${this.apiKey}`,
|
|
60
|
+
},
|
|
61
|
+
body: JSON.stringify({
|
|
62
|
+
prompt,
|
|
63
|
+
model,
|
|
64
|
+
chatId: options.chatId,
|
|
65
|
+
reasoning: 'braid',
|
|
66
|
+
braidOptions: options.braidOptions,
|
|
67
|
+
}),
|
|
68
|
+
});
|
|
69
|
+
if (!response.ok) {
|
|
70
|
+
const error = await response.json().catch(() => ({ error: 'Unknown error' }));
|
|
71
|
+
throw new Error(`SolRouter API error: ${error.error || error.message || response.statusText}`);
|
|
72
|
+
}
|
|
73
|
+
const data = await response.json();
|
|
74
|
+
return {
|
|
75
|
+
message: data.reply,
|
|
76
|
+
model: data.model || model,
|
|
77
|
+
usage: data.usage,
|
|
78
|
+
encrypted: false,
|
|
79
|
+
braidTrace: data.braidTrace,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
46
82
|
/**
|
|
47
83
|
* Encrypted chat - prompt is encrypted client-side
|
|
48
84
|
*/
|
|
@@ -144,7 +180,7 @@ export class SolRouter {
|
|
|
144
180
|
* Get account balance
|
|
145
181
|
*/
|
|
146
182
|
async getBalance() {
|
|
147
|
-
const response = await fetch(`${this.baseUrl}/
|
|
183
|
+
const response = await fetch(`${this.baseUrl}/api/v1/balance`, {
|
|
148
184
|
headers: {
|
|
149
185
|
'Authorization': `Bearer ${this.apiKey}`,
|
|
150
186
|
},
|
|
@@ -154,8 +190,8 @@ export class SolRouter {
|
|
|
154
190
|
}
|
|
155
191
|
const data = await response.json();
|
|
156
192
|
return {
|
|
157
|
-
balance: data.
|
|
158
|
-
balanceFormatted:
|
|
193
|
+
balance: data.balance_usdc,
|
|
194
|
+
balanceFormatted: data.balance_formatted,
|
|
159
195
|
};
|
|
160
196
|
}
|
|
161
197
|
/**
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAQhF,MAAM,gBAAgB,GAAG,qCAAqC,CAAC;AAC/D,MAAM,aAAa,GAAG,aAAa,CAAC;AAEpC,wBAAwB;AACxB,MAAM,SAAS,GAA2B;IACxC,aAAa,EAAE,oBAAoB;IACnC,
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -11,7 +11,7 @@ export interface SolRouterConfig {
|
|
|
11
11
|
}
|
|
12
12
|
export interface ChatOptions {
|
|
13
13
|
/** Model to use (defaults to gpt-oss-20b) */
|
|
14
|
-
model?: 'gpt-oss-20b' | '
|
|
14
|
+
model?: 'gpt-oss-20b' | 'gemini-flash' | 'claude-sonnet' | 'claude-sonnet-4' | 'gpt-4o-mini';
|
|
15
15
|
/** System prompt */
|
|
16
16
|
systemPrompt?: string;
|
|
17
17
|
/** Enable encryption for this request (overrides client setting) */
|
|
@@ -24,6 +24,15 @@ export interface ChatOptions {
|
|
|
24
24
|
ragCollection?: string;
|
|
25
25
|
/** Enable live web search */
|
|
26
26
|
useLiveSearch?: boolean;
|
|
27
|
+
/** Reasoning mode: 'default' for standard, 'braid' for BRAID-guided reasoning */
|
|
28
|
+
reasoning?: 'default' | 'braid';
|
|
29
|
+
/** BRAID-specific options (only used when reasoning is 'braid') */
|
|
30
|
+
braidOptions?: {
|
|
31
|
+
/** Include GRD execution trace in the response */
|
|
32
|
+
includeTrace?: boolean;
|
|
33
|
+
/** Force a specific GRD by ID */
|
|
34
|
+
forceGrdId?: string;
|
|
35
|
+
};
|
|
27
36
|
}
|
|
28
37
|
export interface ChatResponse {
|
|
29
38
|
/** The AI response message */
|
|
@@ -42,6 +51,23 @@ export interface ChatResponse {
|
|
|
42
51
|
encrypted: boolean;
|
|
43
52
|
/** Privacy attestation ID (if encrypted) */
|
|
44
53
|
privacyAttestationId?: string;
|
|
54
|
+
/** BRAID execution trace (when reasoning: 'braid' and braidOptions.includeTrace: true) */
|
|
55
|
+
braidTrace?: {
|
|
56
|
+
grdId: string;
|
|
57
|
+
grdMermaid: string;
|
|
58
|
+
intent: string;
|
|
59
|
+
nodes: Array<{
|
|
60
|
+
nodeId: string;
|
|
61
|
+
label: string;
|
|
62
|
+
type: string;
|
|
63
|
+
status: string;
|
|
64
|
+
durationMs?: number;
|
|
65
|
+
tokensUsed?: number;
|
|
66
|
+
}>;
|
|
67
|
+
totalDurationMs: number;
|
|
68
|
+
totalTokens: number;
|
|
69
|
+
ppd?: number;
|
|
70
|
+
};
|
|
45
71
|
}
|
|
46
72
|
export interface EncryptedData {
|
|
47
73
|
ciphertext: string;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,eAAe;IAC9B,yDAAyD;IACzD,MAAM,EAAE,MAAM,CAAC;IACf,qEAAqE;IACrE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,6CAA6C;IAC7C,KAAK,CAAC,EAAE,aAAa,GAAG,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,eAAe;IAC9B,yDAAyD;IACzD,MAAM,EAAE,MAAM,CAAC;IACf,qEAAqE;IACrE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,6CAA6C;IAC7C,KAAK,CAAC,EAAE,aAAa,GAAG,cAAc,GAAG,eAAe,GAAG,iBAAiB,GAAG,aAAa,CAAC;IAC7F,oBAAoB;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oEAAoE;IACpE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,mDAAmD;IACnD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,4BAA4B;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,6BAA6B;IAC7B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,iFAAiF;IACjF,SAAS,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;IAChC,mEAAmE;IACnE,YAAY,CAAC,EAAE;QACb,kDAAkD;QAClD,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,iCAAiC;QACjC,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED,MAAM,WAAW,YAAY;IAC3B,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,gCAAgC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,6BAA6B;IAC7B,KAAK,CAAC,EAAE;QACN,YAAY,EAAE,MAAM,CAAC;QACrB,gBAAgB,EAAE,MAAM,CAAC;QACzB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,mCAAmC;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wCAAwC;IACxC,SAAS,EAAE,OAAO,CAAC;IACnB,4CAA4C;IAC5C,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,0FAA0F;IAC1F,UAAU,CAAC,EAAE;QACX,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,KAAK,CAAC;YACX,MAAM,EAAE,MAAM,CAAC;YACf,KAAK,EAAE,MAAM,CAAC;YACd,IAAI,EAAE,MAAM,CAAC;YACb,MAAM,EAAE,MAAM,CAAC;YACf,UAAU,CAAC,EAAE,MAAM,CAAC;YACpB,UAAU,CAAC,EAAE,MAAM,CAAC;SACrB,CAAC,CAAC;QACH,eAAe,EAAE,MAAM,CAAC;QACxB,WAAW,EAAE,MAAM,CAAC;QACpB,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;CAC1B"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SolRouter SDK Connection Test
|
|
3
|
+
*
|
|
4
|
+
* Use this script to verify your API key and test SDK functionality.
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* SOLROUTER_API_KEY=sk_solrouter_xxx npx ts-node examples/test-connection.ts
|
|
8
|
+
*
|
|
9
|
+
* Or set environment variables:
|
|
10
|
+
* export SOLROUTER_API_KEY=sk_solrouter_xxx
|
|
11
|
+
* export SOLROUTER_BASE_URL=https://your-server.com (optional)
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { SolRouter } from '@solrouter/sdk';
|
|
15
|
+
|
|
16
|
+
// Configuration from environment
|
|
17
|
+
const API_KEY = process.env.SOLROUTER_API_KEY;
|
|
18
|
+
const BASE_URL = process.env.SOLROUTER_BASE_URL || 'https://solrouter-obb4.onrender.com';
|
|
19
|
+
|
|
20
|
+
if (!API_KEY) {
|
|
21
|
+
console.error('Error: SOLROUTER_API_KEY environment variable is required');
|
|
22
|
+
console.error('Usage: SOLROUTER_API_KEY=sk_solrouter_xxx npx ts-node examples/test-connection.ts');
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const client = new SolRouter({
|
|
27
|
+
apiKey: API_KEY,
|
|
28
|
+
baseUrl: BASE_URL,
|
|
29
|
+
encrypted: true,
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
// Terminal colors
|
|
33
|
+
const colors = {
|
|
34
|
+
reset: '\x1b[0m',
|
|
35
|
+
green: '\x1b[32m',
|
|
36
|
+
red: '\x1b[31m',
|
|
37
|
+
yellow: '\x1b[33m',
|
|
38
|
+
cyan: '\x1b[36m',
|
|
39
|
+
dim: '\x1b[2m',
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
async function testApiKey(): Promise<boolean> {
|
|
43
|
+
console.log(colors.cyan + '\n[1/3] Testing API Key...' + colors.reset);
|
|
44
|
+
|
|
45
|
+
try {
|
|
46
|
+
const balance = await client.getBalance();
|
|
47
|
+
console.log(colors.green + ' ✓ API key is valid' + colors.reset);
|
|
48
|
+
console.log(colors.dim + ` Balance: ${balance.balanceFormatted}` + colors.reset);
|
|
49
|
+
return true;
|
|
50
|
+
} catch (error: any) {
|
|
51
|
+
console.log(colors.red + ' ✗ API key is invalid or expired' + colors.reset);
|
|
52
|
+
console.log(colors.dim + ` Error: ${error.message}` + colors.reset);
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
async function testEncryptedChat(): Promise<boolean> {
|
|
58
|
+
console.log(colors.cyan + '\n[2/3] Testing Encrypted Chat...' + colors.reset);
|
|
59
|
+
|
|
60
|
+
try {
|
|
61
|
+
const response = await client.chat('What is 2 + 2? Reply with just the number.', {
|
|
62
|
+
model: 'gpt-oss-20b',
|
|
63
|
+
encrypted: true,
|
|
64
|
+
});
|
|
65
|
+
console.log(colors.green + ' ✓ Encrypted chat working' + colors.reset);
|
|
66
|
+
console.log(colors.dim + ` Response: "${response.message}"` + colors.reset);
|
|
67
|
+
console.log(colors.dim + ` Encrypted: ${response.encrypted}` + colors.reset);
|
|
68
|
+
return true;
|
|
69
|
+
} catch (error: any) {
|
|
70
|
+
console.log(colors.red + ' ✗ Encrypted chat failed' + colors.reset);
|
|
71
|
+
console.log(colors.dim + ` Error: ${error.message}` + colors.reset);
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
async function testLiveSearch(): Promise<boolean> {
|
|
77
|
+
console.log(colors.cyan + '\n[3/3] Testing Live Search...' + colors.reset);
|
|
78
|
+
|
|
79
|
+
try {
|
|
80
|
+
const response = await client.chat('What is the current price of Bitcoin? Be brief.', {
|
|
81
|
+
model: 'gpt-oss-20b',
|
|
82
|
+
encrypted: true,
|
|
83
|
+
useLiveSearch: true,
|
|
84
|
+
});
|
|
85
|
+
console.log(colors.green + ' ✓ Live search working' + colors.reset);
|
|
86
|
+
console.log(colors.dim + ` Response: "${response.message}"` + colors.reset);
|
|
87
|
+
return true;
|
|
88
|
+
} catch (error: any) {
|
|
89
|
+
console.log(colors.red + ' ✗ Live search failed' + colors.reset);
|
|
90
|
+
console.log(colors.dim + ` Error: ${error.message}` + colors.reset);
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
async function main() {
|
|
96
|
+
console.log('\n' + '='.repeat(50));
|
|
97
|
+
console.log(colors.cyan + ' SolRouter SDK Connection Test' + colors.reset);
|
|
98
|
+
console.log('='.repeat(50));
|
|
99
|
+
console.log(colors.dim + `Base URL: ${BASE_URL}` + colors.reset);
|
|
100
|
+
console.log(colors.dim + `API Key: ${API_KEY.substring(0, 20)}****` + colors.reset);
|
|
101
|
+
|
|
102
|
+
const results = {
|
|
103
|
+
apiKey: await testApiKey(),
|
|
104
|
+
encryptedChat: false,
|
|
105
|
+
liveSearch: false,
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
// Only continue if API key is valid
|
|
109
|
+
if (results.apiKey) {
|
|
110
|
+
results.encryptedChat = await testEncryptedChat();
|
|
111
|
+
results.liveSearch = await testLiveSearch();
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Summary
|
|
115
|
+
console.log('\n' + '='.repeat(50));
|
|
116
|
+
console.log(colors.cyan + ' Results' + colors.reset);
|
|
117
|
+
console.log('='.repeat(50));
|
|
118
|
+
|
|
119
|
+
const passed = Object.values(results).filter(Boolean).length;
|
|
120
|
+
const total = Object.keys(results).length;
|
|
121
|
+
|
|
122
|
+
console.log(` API Key: ${results.apiKey ? colors.green + '✓' : colors.red + '✗'}` + colors.reset);
|
|
123
|
+
console.log(` Encrypted Chat: ${results.encryptedChat ? colors.green + '✓' : colors.red + '✗'}` + colors.reset);
|
|
124
|
+
console.log(` Live Search: ${results.liveSearch ? colors.green + '✓' : colors.red + '✗'}` + colors.reset);
|
|
125
|
+
console.log();
|
|
126
|
+
console.log(` ${passed}/${total} tests passed`);
|
|
127
|
+
console.log();
|
|
128
|
+
|
|
129
|
+
// Cleanup
|
|
130
|
+
client.clearSession();
|
|
131
|
+
|
|
132
|
+
process.exit(passed === total ? 0 : 1);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
main().catch(console.error);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@solrouter/sdk",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"description": "SolRouter Privacy SDK - End-to-end encrypted AI API calls",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -14,11 +14,15 @@
|
|
|
14
14
|
},
|
|
15
15
|
"files": [
|
|
16
16
|
"dist",
|
|
17
|
+
"examples",
|
|
17
18
|
"README.md"
|
|
18
19
|
],
|
|
19
20
|
"scripts": {
|
|
20
21
|
"build": "tsc",
|
|
21
22
|
"dev": "tsc --watch",
|
|
23
|
+
"test": "vitest run",
|
|
24
|
+
"test:watch": "vitest",
|
|
25
|
+
"test:coverage": "vitest run --coverage",
|
|
22
26
|
"prepublishOnly": "npm run build"
|
|
23
27
|
},
|
|
24
28
|
"keywords": [
|
|
@@ -36,11 +40,13 @@
|
|
|
36
40
|
"url": "https://github.com/solrouter/sdk"
|
|
37
41
|
},
|
|
38
42
|
"dependencies": {
|
|
39
|
-
"@arcium-hq/client": "^0.
|
|
43
|
+
"@arcium-hq/client": "^0.9.2"
|
|
40
44
|
},
|
|
41
45
|
"devDependencies": {
|
|
46
|
+
"@types/node": "^20.0.0",
|
|
47
|
+
"@vitest/coverage-v8": "^2.0.0",
|
|
42
48
|
"typescript": "^5.4.0",
|
|
43
|
-
"
|
|
49
|
+
"vitest": "^2.0.0"
|
|
44
50
|
},
|
|
45
51
|
"engines": {
|
|
46
52
|
"node": ">=18.0.0"
|