@sprucelabs/sprucebot-llm 15.0.1 → 15.0.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.
@@ -11,7 +11,7 @@
11
11
  "error"
12
12
  ],
13
13
  "regressionproof": {
14
- "enabled": true,
14
+ "enabled": false,
15
15
  "projectName": "sprucebot-llm"
16
16
  }
17
17
  }
@@ -16,7 +16,7 @@ export default class SprucebotLlmBotImpl<StateSchema extends Schema = Schema, St
16
16
  markAsDone(): void;
17
17
  getIsDone(): boolean;
18
18
  serialize(): SerializedBot<StateSchema, State>;
19
- sendMessage(message: SendMessage, cb?: MessageResponseCallback): Promise<string>;
19
+ sendMessage(message: SendMessage, cb?: MessageResponseCallback): Promise<string | null>;
20
20
  private optionallyUpdateState;
21
21
  private trackMessage;
22
22
  updateState(updates: Partial<State>): Promise<void>;
@@ -16,7 +16,7 @@ export default class TurnRequest {
16
16
  optionallyUpdateState: (state?: Record<string, any>) => Promise<void>;
17
17
  });
18
18
  cancel(): void;
19
- sendMessage(llmMessage: LlmMessage, cb?: MessageResponseCallback): Promise<string>;
19
+ sendMessage(llmMessage: LlmMessage, cb?: MessageResponseCallback): Promise<string | null>;
20
20
  private sendMessageToAdapter;
21
21
  private parseResponse;
22
22
  }
@@ -26,7 +26,7 @@ class TurnRequest {
26
26
  if (this.isCancelled) {
27
27
  return '';
28
28
  }
29
- let parsedMessage;
29
+ let parsedMessage = null;
30
30
  let isDone;
31
31
  let state;
32
32
  let callbackResults;
@@ -16,7 +16,7 @@ export default class SprucebotLlmBotImpl<StateSchema extends Schema = Schema, St
16
16
  markAsDone(): void;
17
17
  getIsDone(): boolean;
18
18
  serialize(): SerializedBot<StateSchema, State>;
19
- sendMessage(message: SendMessage, cb?: MessageResponseCallback): Promise<string>;
19
+ sendMessage(message: SendMessage, cb?: MessageResponseCallback): Promise<string | null>;
20
20
  private optionallyUpdateState;
21
21
  private trackMessage;
22
22
  updateState(updates: Partial<State>): Promise<void>;
@@ -16,7 +16,7 @@ export default class TurnRequest {
16
16
  optionallyUpdateState: (state?: Record<string, any>) => Promise<void>;
17
17
  });
18
18
  cancel(): void;
19
- sendMessage(llmMessage: LlmMessage, cb?: MessageResponseCallback): Promise<string>;
19
+ sendMessage(llmMessage: LlmMessage, cb?: MessageResponseCallback): Promise<string | null>;
20
20
  private sendMessageToAdapter;
21
21
  private parseResponse;
22
22
  }
@@ -32,7 +32,7 @@ export default class TurnRequest {
32
32
  if (this.isCancelled) {
33
33
  return '';
34
34
  }
35
- let parsedMessage;
35
+ let parsedMessage = null;
36
36
  let isDone;
37
37
  let state;
38
38
  let callbackResults;
@@ -9,7 +9,7 @@ export interface BotOptions<StateSchema extends Schema = Schema, State extends S
9
9
  export interface SprucebotLlmBot<StateSchema extends Schema = Schema, State extends SchemaValues<StateSchema> = SchemaValues<StateSchema>> extends MercuryEventEmitter<LlmEventContract> {
10
10
  markAsDone(): void;
11
11
  getIsDone(): boolean;
12
- sendMessage(message: SendMessage, responseCb?: MessageResponseCallback): Promise<string>;
12
+ sendMessage(message: SendMessage, responseCb?: MessageResponseCallback): Promise<string | null>;
13
13
  serialize(): SerializedBot<StateSchema, State>;
14
14
  updateState(state: Partial<State>): Promise<void>;
15
15
  setSkill(skill: SprucebotLLmSkill<any>): void;
@@ -96,7 +96,7 @@ export type LlmCallbackParameter = {
96
96
  name: string;
97
97
  description?: string;
98
98
  });
99
- export type MessageResponseCallback = (message: string) => void;
99
+ export type MessageResponseCallback = (message: string | null) => void;
100
100
  export type SendMessage = string | SendMessageWithImage;
101
101
  export interface SendMessageWithImage {
102
102
  imageDescription: string;
@@ -111,6 +111,6 @@ export interface ResponseParser {
111
111
  export interface ParsedResponse {
112
112
  isDone: boolean;
113
113
  state?: Record<string, any>;
114
- message: string;
114
+ message: string | null;
115
115
  callbackResults?: SendMessage;
116
116
  }
@@ -17,10 +17,12 @@ export default class ResponseParserV2 {
17
17
  let callbackResults = undefined;
18
18
  const hasCallbacks = message.includes('@callback');
19
19
  if (hasCallbacks) {
20
- callbackResults = yield this.invokeCallbacks(message, callbacks);
20
+ const { callbackResults: c, message: m } = yield this.invokeCallbacks(message, callbacks);
21
+ callbackResults = c;
22
+ message = m;
21
23
  }
22
24
  const hasState = response.includes('@updateState');
23
- if (hasState) {
25
+ if (hasState && message) {
24
26
  const stateMatch = message.match(/@updateState\s+({[\s\S]*?})\n?/);
25
27
  if (stateMatch && stateMatch[1]) {
26
28
  state = JSON.parse(stateMatch[1]);
@@ -37,11 +39,20 @@ export default class ResponseParserV2 {
37
39
  }
38
40
  invokeCallbacks(message, callbacks) {
39
41
  return __awaiter(this, void 0, void 0, function* () {
42
+ let callbackStrippedMessage = message;
40
43
  let callbackResults = '';
41
44
  const matches = [...message.matchAll(/^@callback\s+({.*})$/gm)];
42
45
  for (const match of matches) {
43
46
  const callbackData = match && match[1] ? JSON.parse(match[1]) : null;
44
47
  const { name, options } = callbackData || {};
48
+ debugger;
49
+ if (match) {
50
+ const parts = callbackStrippedMessage.split(match[0]);
51
+ callbackStrippedMessage = parts
52
+ .map((s) => s.trim())
53
+ .join('')
54
+ .trim();
55
+ }
45
56
  try {
46
57
  const callback = callbacks === null || callbacks === void 0 ? void 0 : callbacks[name];
47
58
  if (callback === null || callback === void 0 ? void 0 : callback.parameters) {
@@ -61,7 +72,12 @@ export default class ResponseParserV2 {
61
72
  }
62
73
  }
63
74
  callbackResults = callbackResults.trim();
64
- return callbackResults;
75
+ return {
76
+ callbackResults,
77
+ message: callbackStrippedMessage.length > 0
78
+ ? callbackStrippedMessage
79
+ : null,
80
+ };
65
81
  });
66
82
  }
67
83
  getStateUpdateInstructions() {
@@ -9,7 +9,7 @@ export interface BotOptions<StateSchema extends Schema = Schema, State extends S
9
9
  export interface SprucebotLlmBot<StateSchema extends Schema = Schema, State extends SchemaValues<StateSchema> = SchemaValues<StateSchema>> extends MercuryEventEmitter<LlmEventContract> {
10
10
  markAsDone(): void;
11
11
  getIsDone(): boolean;
12
- sendMessage(message: SendMessage, responseCb?: MessageResponseCallback): Promise<string>;
12
+ sendMessage(message: SendMessage, responseCb?: MessageResponseCallback): Promise<string | null>;
13
13
  serialize(): SerializedBot<StateSchema, State>;
14
14
  updateState(state: Partial<State>): Promise<void>;
15
15
  setSkill(skill: SprucebotLLmSkill<any>): void;
@@ -96,7 +96,7 @@ export type LlmCallbackParameter = {
96
96
  name: string;
97
97
  description?: string;
98
98
  });
99
- export type MessageResponseCallback = (message: string) => void;
99
+ export type MessageResponseCallback = (message: string | null) => void;
100
100
  export type SendMessage = string | SendMessageWithImage;
101
101
  export interface SendMessageWithImage {
102
102
  imageDescription: string;
@@ -111,6 +111,6 @@ export interface ResponseParser {
111
111
  export interface ParsedResponse {
112
112
  isDone: boolean;
113
113
  state?: Record<string, any>;
114
- message: string;
114
+ message: string | null;
115
115
  callbackResults?: SendMessage;
116
116
  }
@@ -12,10 +12,12 @@ class ResponseParserV2 {
12
12
  let callbackResults = undefined;
13
13
  const hasCallbacks = message.includes('@callback');
14
14
  if (hasCallbacks) {
15
- callbackResults = await this.invokeCallbacks(message, callbacks);
15
+ const { callbackResults: c, message: m } = await this.invokeCallbacks(message, callbacks);
16
+ callbackResults = c;
17
+ message = m;
16
18
  }
17
19
  const hasState = response.includes('@updateState');
18
- if (hasState) {
20
+ if (hasState && message) {
19
21
  const stateMatch = message.match(/@updateState\s+({[\s\S]*?})\n?/);
20
22
  if (stateMatch && stateMatch[1]) {
21
23
  state = JSON.parse(stateMatch[1]);
@@ -30,11 +32,20 @@ class ResponseParserV2 {
30
32
  };
31
33
  }
32
34
  async invokeCallbacks(message, callbacks) {
35
+ let callbackStrippedMessage = message;
33
36
  let callbackResults = '';
34
37
  const matches = [...message.matchAll(/^@callback\s+({.*})$/gm)];
35
38
  for (const match of matches) {
36
39
  const callbackData = match && match[1] ? JSON.parse(match[1]) : null;
37
40
  const { name, options } = callbackData || {};
41
+ debugger;
42
+ if (match) {
43
+ const parts = callbackStrippedMessage.split(match[0]);
44
+ callbackStrippedMessage = parts
45
+ .map((s) => s.trim())
46
+ .join('')
47
+ .trim();
48
+ }
38
49
  try {
39
50
  const callback = callbacks?.[name];
40
51
  if (callback?.parameters) {
@@ -54,7 +65,12 @@ class ResponseParserV2 {
54
65
  }
55
66
  }
56
67
  callbackResults = callbackResults.trim();
57
- return callbackResults;
68
+ return {
69
+ callbackResults,
70
+ message: callbackStrippedMessage.length > 0
71
+ ? callbackStrippedMessage
72
+ : null,
73
+ };
58
74
  }
59
75
  getStateUpdateInstructions() {
60
76
  return 'Updating state works similar to all function calls. Use the following syntax:\n@updateState { "updates": "here" }\n. Make sure to json encode only the fields you want to change. You can update state once and do it at the end of any messages you send.';
package/package.json CHANGED
@@ -8,7 +8,7 @@
8
8
  "eta"
9
9
  ]
10
10
  },
11
- "version": "15.0.1",
11
+ "version": "15.0.3",
12
12
  "files": [
13
13
  "build"
14
14
  ],
@@ -66,11 +66,11 @@
66
66
  },
67
67
  "dependencies": {
68
68
  "@anthropic-ai/sdk": "^0.78.0",
69
- "@sprucelabs/error": "^8.1.13",
70
- "@sprucelabs/mercury-event-emitter": "^46.1.12",
71
- "@sprucelabs/mercury-types": "^49.1.14",
72
- "@sprucelabs/schema": "^34.0.1",
73
- "@sprucelabs/spruce-skill-utils": "^34.0.20",
69
+ "@sprucelabs/error": "^8.1.14",
70
+ "@sprucelabs/mercury-event-emitter": "^46.1.13",
71
+ "@sprucelabs/mercury-types": "^49.1.15",
72
+ "@sprucelabs/schema": "^34.0.2",
73
+ "@sprucelabs/spruce-skill-utils": "^34.0.21",
74
74
  "eta": "3.5.0",
75
75
  "openai": "^6.27.0"
76
76
  },
@@ -81,11 +81,11 @@
81
81
  "@regressionproof/cli": "^0.9.4",
82
82
  "@regressionproof/jest-reporter": "^0.9.4",
83
83
  "@sprucelabs/esm-postbuild": "^9.0.23",
84
- "@sprucelabs/jest-json-reporter": "^10.0.30",
84
+ "@sprucelabs/jest-json-reporter": "^10.0.31",
85
85
  "@sprucelabs/resolve-path-aliases": "^4.0.22",
86
86
  "@sprucelabs/semantic-release": "^6.0.0",
87
87
  "@sprucelabs/test": "^11.1.6",
88
- "@sprucelabs/test-utils": "^7.2.16",
88
+ "@sprucelabs/test-utils": "^7.2.17",
89
89
  "@types/node": "^25.5.0",
90
90
  "chokidar-cli": "^3.0.0",
91
91
  "dotenv": "^17.3.1",