@sprucelabs/sprucebot-llm 11.1.16 → 11.1.18

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.
@@ -1,25 +1,23 @@
1
1
  import { AbstractEventEmitter } from '@sprucelabs/mercury-event-emitter';
2
2
  import { Schema, SchemaValues } from '@sprucelabs/schema';
3
- import { BotOptions, LlmAdapter, LlmEventContract, LlmMessage, MessageResponseCallback, SendMessage, SerializedBot, SprucebotLlmBot, SprucebotLLmSkill } from '../llm.types';
3
+ import { BotOptions, LlmEventContract, LlmMessage, MessageResponseCallback, SendMessage, SerializedBot, SprucebotLlmBot, SprucebotLLmSkill } from '../llm.types';
4
4
  export default class SprucebotLlmBotImpl<StateSchema extends Schema = Schema, State extends SchemaValues<StateSchema> = SchemaValues<StateSchema>> extends AbstractEventEmitter<LlmEventContract> implements SprucebotLlmBot<StateSchema, State> {
5
5
  static messageMemoryLimit: number;
6
- protected adapter: LlmAdapter;
6
+ private adapter;
7
7
  private youAre;
8
8
  private stateSchema?;
9
9
  protected state?: Partial<State>;
10
10
  private isDone;
11
11
  protected messages: LlmMessage[];
12
12
  protected skill?: SprucebotLLmSkill;
13
+ private activeTurn?;
13
14
  constructor(options: BotOptions<StateSchema, State>);
14
15
  clearMessageHistory(): void;
15
16
  markAsDone(): void;
16
17
  getIsDone(): boolean;
17
18
  serialize(): SerializedBot<StateSchema, State>;
18
19
  sendMessage(message: SendMessage, cb?: MessageResponseCallback): Promise<string>;
19
- private _sendMessageInternal;
20
20
  private optionallyUpdateState;
21
- private parseResponse;
22
- private sendMessageToAdapter;
23
21
  private trackMessage;
24
22
  updateState(newState: Partial<State>): Promise<void>;
25
23
  setSkill(skill: SprucebotLLmSkill<any>): void;
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const mercury_event_emitter_1 = require("@sprucelabs/mercury-event-emitter");
7
7
  const schema_1 = require("@sprucelabs/schema");
8
8
  const llm_types_1 = require("../llm.types");
9
- const ResponseParser_1 = __importDefault(require("../parsingResponses/ResponseParser"));
9
+ const TurnRequest_1 = __importDefault(require("./TurnRequest"));
10
10
  class SprucebotLlmBotImpl extends mercury_event_emitter_1.AbstractEventEmitter {
11
11
  constructor(options) {
12
12
  const { adapter, youAre, stateSchema, state, skill } = options;
@@ -56,59 +56,16 @@ class SprucebotLlmBotImpl extends mercury_event_emitter_1.AbstractEventEmitter {
56
56
  llmMessage.message = message.imageDescription;
57
57
  llmMessage.imageBase64 = message.imageBase64;
58
58
  }
59
- return this._sendMessageInternal(llmMessage, cb);
60
- }
61
- async _sendMessageInternal(llmMessage, cb) {
62
- this.trackMessage(llmMessage);
63
- const { model, callbacks } = this.skill?.serialize() ?? {};
64
- const llmResponse = await this.sendMessageToAdapter(model);
65
- let parsedMessage;
66
- let isDone;
67
- let state;
68
- let callbackResults;
69
- try {
70
- const parsed = await this.parseResponse(llmResponse, callbacks);
71
- parsedMessage = parsed.message;
72
- isDone = parsed.isDone;
73
- state = parsed.state;
74
- callbackResults = parsed.callbackResults;
75
- }
76
- catch (err) {
77
- this.trackMessage({
78
- from: 'You',
79
- message: llmResponse,
80
- });
81
- if (err.options?.code === 'INVALID_CALLBACK' ||
82
- err.options?.code === 'CALLBACK_ERROR') {
83
- return this._sendMessageInternal({ from: 'Api', message: `Error: ${err.message}` }, cb);
84
- }
85
- throw err;
86
- }
87
- this.isDone = isDone;
88
- await this.optionallyUpdateState(state);
89
- this.trackMessage({
90
- from: 'You',
91
- message: llmResponse,
59
+ this.activeTurn?.cancel();
60
+ this.activeTurn = new TurnRequest_1.default({
61
+ adapter: this.adapter,
62
+ bot: this,
63
+ optionallyUpdateState: this.optionallyUpdateState.bind(this),
64
+ setDone: (isDone) => (this.isDone = isDone),
65
+ skill: this.skill,
66
+ trackMessage: this.trackMessage.bind(this),
92
67
  });
93
- cb?.(parsedMessage);
94
- if (callbackResults) {
95
- let message;
96
- if (typeof callbackResults === 'string') {
97
- message = {
98
- from: 'Api',
99
- message: `API Results: ${callbackResults}`,
100
- };
101
- }
102
- else {
103
- message = {
104
- from: 'Api',
105
- imageBase64: callbackResults.imageBase64,
106
- message: `API Results: ${callbackResults.imageDescription}`,
107
- };
108
- }
109
- await this._sendMessageInternal(message, cb);
110
- }
111
- return parsedMessage;
68
+ return this.activeTurn.sendMessage(llmMessage, cb);
112
69
  }
113
70
  async optionallyUpdateState(state) {
114
71
  if (this.stateSchema && state) {
@@ -118,16 +75,6 @@ class SprucebotLlmBotImpl extends mercury_event_emitter_1.AbstractEventEmitter {
118
75
  await this.skill?.updateState(state);
119
76
  }
120
77
  }
121
- async parseResponse(response, callbacks) {
122
- const parser = ResponseParser_1.default.getInstance();
123
- const parsed = await parser.parse(response, callbacks);
124
- return parsed;
125
- }
126
- async sendMessageToAdapter(model) {
127
- return await this.adapter.sendMessage(this, {
128
- model,
129
- });
130
- }
131
78
  trackMessage(m) {
132
79
  if (this.messages.length === SprucebotLlmBotImpl.messageMemoryLimit) {
133
80
  this.messages.shift();
@@ -0,0 +1,22 @@
1
+ import { LlmAdapter, LlmMessage, MessageResponseCallback, SprucebotLlmBot, SprucebotLLmSkill } from '../llm.types';
2
+ export default class TurnRequest {
3
+ private trackMessage;
4
+ private skill?;
5
+ private adapter;
6
+ private setDone;
7
+ private optionallyUpdateState;
8
+ private bot;
9
+ private isCancelled;
10
+ constructor(options: {
11
+ trackMessage: (message: LlmMessage) => void;
12
+ setDone: (isDone: boolean) => void;
13
+ bot: SprucebotLlmBot;
14
+ skill?: SprucebotLLmSkill;
15
+ adapter: LlmAdapter;
16
+ optionallyUpdateState: (state?: Record<string, any>) => Promise<void>;
17
+ });
18
+ cancel(): void;
19
+ sendMessage(llmMessage: LlmMessage, cb?: MessageResponseCallback): Promise<string>;
20
+ private sendMessageToAdapter;
21
+ private parseResponse;
22
+ }
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const ResponseParser_1 = __importDefault(require("../parsingResponses/ResponseParser"));
7
+ class TurnRequest {
8
+ constructor(options) {
9
+ this.isCancelled = false;
10
+ const { trackMessage, skill, bot, adapter, setDone, optionallyUpdateState, } = options;
11
+ this.trackMessage = trackMessage;
12
+ this.skill = skill;
13
+ this.adapter = adapter;
14
+ this.setDone = setDone;
15
+ this.bot = bot;
16
+ this.optionallyUpdateState = optionallyUpdateState;
17
+ }
18
+ cancel() {
19
+ this.isCancelled = true;
20
+ }
21
+ async sendMessage(llmMessage, cb) {
22
+ this.trackMessage(llmMessage);
23
+ const { model, callbacks } = this.skill?.serialize() ?? {};
24
+ const llmResponse = await this.sendMessageToAdapter(model);
25
+ if (this.isCancelled) {
26
+ return '';
27
+ }
28
+ let parsedMessage;
29
+ let isDone;
30
+ let state;
31
+ let callbackResults;
32
+ try {
33
+ const parsed = await this.parseResponse(llmResponse, callbacks);
34
+ parsedMessage = parsed.message;
35
+ isDone = parsed.isDone;
36
+ state = parsed.state;
37
+ callbackResults = parsed.callbackResults;
38
+ }
39
+ catch (err) {
40
+ this.trackMessage({
41
+ from: 'You',
42
+ message: llmResponse,
43
+ });
44
+ if (err.options?.code === 'INVALID_CALLBACK' ||
45
+ err.options?.code === 'CALLBACK_ERROR') {
46
+ return this.sendMessage({ from: 'Api', message: `Error: ${err.message}` }, cb);
47
+ }
48
+ throw err;
49
+ }
50
+ this.setDone(isDone);
51
+ await this.optionallyUpdateState(state);
52
+ this.trackMessage({
53
+ from: 'You',
54
+ message: llmResponse,
55
+ });
56
+ cb?.(parsedMessage);
57
+ if (callbackResults) {
58
+ let message;
59
+ if (typeof callbackResults === 'string') {
60
+ message = {
61
+ from: 'Api',
62
+ message: `API Results: ${callbackResults}`,
63
+ };
64
+ }
65
+ else {
66
+ message = {
67
+ from: 'Api',
68
+ imageBase64: callbackResults.imageBase64,
69
+ message: `API Results: ${callbackResults.imageDescription}`,
70
+ };
71
+ }
72
+ await this.sendMessage(message, cb);
73
+ }
74
+ return parsedMessage;
75
+ }
76
+ async sendMessageToAdapter(model) {
77
+ return await this.adapter.sendMessage(this.bot, {
78
+ model,
79
+ });
80
+ }
81
+ async parseResponse(response, callbacks) {
82
+ const parser = ResponseParser_1.default.getInstance();
83
+ const parsed = await parser.parse(response, callbacks);
84
+ return parsed;
85
+ }
86
+ }
87
+ exports.default = TurnRequest;
@@ -1,25 +1,23 @@
1
1
  import { AbstractEventEmitter } from '@sprucelabs/mercury-event-emitter';
2
2
  import { Schema, SchemaValues } from '@sprucelabs/schema';
3
- import { BotOptions, LlmAdapter, LlmEventContract, LlmMessage, MessageResponseCallback, SendMessage, SerializedBot, SprucebotLlmBot, SprucebotLLmSkill } from '../llm.types';
3
+ import { BotOptions, LlmEventContract, LlmMessage, MessageResponseCallback, SendMessage, SerializedBot, SprucebotLlmBot, SprucebotLLmSkill } from '../llm.types';
4
4
  export default class SprucebotLlmBotImpl<StateSchema extends Schema = Schema, State extends SchemaValues<StateSchema> = SchemaValues<StateSchema>> extends AbstractEventEmitter<LlmEventContract> implements SprucebotLlmBot<StateSchema, State> {
5
5
  static messageMemoryLimit: number;
6
- protected adapter: LlmAdapter;
6
+ private adapter;
7
7
  private youAre;
8
8
  private stateSchema?;
9
9
  protected state?: Partial<State>;
10
10
  private isDone;
11
11
  protected messages: LlmMessage[];
12
12
  protected skill?: SprucebotLLmSkill;
13
+ private activeTurn?;
13
14
  constructor(options: BotOptions<StateSchema, State>);
14
15
  clearMessageHistory(): void;
15
16
  markAsDone(): void;
16
17
  getIsDone(): boolean;
17
18
  serialize(): SerializedBot<StateSchema, State>;
18
19
  sendMessage(message: SendMessage, cb?: MessageResponseCallback): Promise<string>;
19
- private _sendMessageInternal;
20
20
  private optionallyUpdateState;
21
- private parseResponse;
22
- private sendMessageToAdapter;
23
21
  private trackMessage;
24
22
  updateState(newState: Partial<State>): Promise<void>;
25
23
  setSkill(skill: SprucebotLLmSkill<any>): void;
@@ -10,7 +10,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
10
10
  import { AbstractEventEmitter } from '@sprucelabs/mercury-event-emitter';
11
11
  import { assertOptions, defaultSchemaValues, } from '@sprucelabs/schema';
12
12
  import { llmEventContract, } from '../llm.types.js';
13
- import ResponseParser from '../parsingResponses/ResponseParser.js';
13
+ import TurnRequest from './TurnRequest.js';
14
14
  class SprucebotLlmBotImpl extends AbstractEventEmitter {
15
15
  constructor(options) {
16
16
  const { adapter, youAre, stateSchema, state, skill } = options;
@@ -47,6 +47,7 @@ class SprucebotLlmBotImpl extends AbstractEventEmitter {
47
47
  }
48
48
  sendMessage(message, cb) {
49
49
  return __awaiter(this, void 0, void 0, function* () {
50
+ var _a;
50
51
  assertOptions({ message }, ['message']);
51
52
  const llmMessage = {
52
53
  from: 'Me',
@@ -59,62 +60,16 @@ class SprucebotLlmBotImpl extends AbstractEventEmitter {
59
60
  llmMessage.message = message.imageDescription;
60
61
  llmMessage.imageBase64 = message.imageBase64;
61
62
  }
62
- return this._sendMessageInternal(llmMessage, cb);
63
- });
64
- }
65
- _sendMessageInternal(llmMessage, cb) {
66
- return __awaiter(this, void 0, void 0, function* () {
67
- var _a, _b, _c, _d;
68
- this.trackMessage(llmMessage);
69
- const { model, callbacks } = (_b = (_a = this.skill) === null || _a === void 0 ? void 0 : _a.serialize()) !== null && _b !== void 0 ? _b : {};
70
- const llmResponse = yield this.sendMessageToAdapter(model);
71
- let parsedMessage;
72
- let isDone;
73
- let state;
74
- let callbackResults;
75
- try {
76
- const parsed = yield this.parseResponse(llmResponse, callbacks);
77
- parsedMessage = parsed.message;
78
- isDone = parsed.isDone;
79
- state = parsed.state;
80
- callbackResults = parsed.callbackResults;
81
- }
82
- catch (err) {
83
- this.trackMessage({
84
- from: 'You',
85
- message: llmResponse,
86
- });
87
- if (((_c = err.options) === null || _c === void 0 ? void 0 : _c.code) === 'INVALID_CALLBACK' ||
88
- ((_d = err.options) === null || _d === void 0 ? void 0 : _d.code) === 'CALLBACK_ERROR') {
89
- return this._sendMessageInternal({ from: 'Api', message: `Error: ${err.message}` }, cb);
90
- }
91
- throw err;
92
- }
93
- this.isDone = isDone;
94
- yield this.optionallyUpdateState(state);
95
- this.trackMessage({
96
- from: 'You',
97
- message: llmResponse,
63
+ (_a = this.activeTurn) === null || _a === void 0 ? void 0 : _a.cancel();
64
+ this.activeTurn = new TurnRequest({
65
+ adapter: this.adapter,
66
+ bot: this,
67
+ optionallyUpdateState: this.optionallyUpdateState.bind(this),
68
+ setDone: (isDone) => (this.isDone = isDone),
69
+ skill: this.skill,
70
+ trackMessage: this.trackMessage.bind(this),
98
71
  });
99
- cb === null || cb === void 0 ? void 0 : cb(parsedMessage);
100
- if (callbackResults) {
101
- let message;
102
- if (typeof callbackResults === 'string') {
103
- message = {
104
- from: 'Api',
105
- message: `API Results: ${callbackResults}`,
106
- };
107
- }
108
- else {
109
- message = {
110
- from: 'Api',
111
- imageBase64: callbackResults.imageBase64,
112
- message: `API Results: ${callbackResults.imageDescription}`,
113
- };
114
- }
115
- yield this._sendMessageInternal(message, cb);
116
- }
117
- return parsedMessage;
72
+ return this.activeTurn.sendMessage(llmMessage, cb);
118
73
  });
119
74
  }
120
75
  optionallyUpdateState(state) {
@@ -128,20 +83,6 @@ class SprucebotLlmBotImpl extends AbstractEventEmitter {
128
83
  }
129
84
  });
130
85
  }
131
- parseResponse(response, callbacks) {
132
- return __awaiter(this, void 0, void 0, function* () {
133
- const parser = ResponseParser.getInstance();
134
- const parsed = yield parser.parse(response, callbacks);
135
- return parsed;
136
- });
137
- }
138
- sendMessageToAdapter(model) {
139
- return __awaiter(this, void 0, void 0, function* () {
140
- return yield this.adapter.sendMessage(this, {
141
- model,
142
- });
143
- });
144
- }
145
86
  trackMessage(m) {
146
87
  if (this.messages.length === SprucebotLlmBotImpl.messageMemoryLimit) {
147
88
  this.messages.shift();
@@ -0,0 +1,22 @@
1
+ import { LlmAdapter, LlmMessage, MessageResponseCallback, SprucebotLlmBot, SprucebotLLmSkill } from '../llm.types';
2
+ export default class TurnRequest {
3
+ private trackMessage;
4
+ private skill?;
5
+ private adapter;
6
+ private setDone;
7
+ private optionallyUpdateState;
8
+ private bot;
9
+ private isCancelled;
10
+ constructor(options: {
11
+ trackMessage: (message: LlmMessage) => void;
12
+ setDone: (isDone: boolean) => void;
13
+ bot: SprucebotLlmBot;
14
+ skill?: SprucebotLLmSkill;
15
+ adapter: LlmAdapter;
16
+ optionallyUpdateState: (state?: Record<string, any>) => Promise<void>;
17
+ });
18
+ cancel(): void;
19
+ sendMessage(llmMessage: LlmMessage, cb?: MessageResponseCallback): Promise<string>;
20
+ private sendMessageToAdapter;
21
+ private parseResponse;
22
+ }
@@ -0,0 +1,97 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import ResponseParser from '../parsingResponses/ResponseParser.js';
11
+ export default class TurnRequest {
12
+ constructor(options) {
13
+ this.isCancelled = false;
14
+ const { trackMessage, skill, bot, adapter, setDone, optionallyUpdateState, } = options;
15
+ this.trackMessage = trackMessage;
16
+ this.skill = skill;
17
+ this.adapter = adapter;
18
+ this.setDone = setDone;
19
+ this.bot = bot;
20
+ this.optionallyUpdateState = optionallyUpdateState;
21
+ }
22
+ cancel() {
23
+ this.isCancelled = true;
24
+ }
25
+ sendMessage(llmMessage, cb) {
26
+ return __awaiter(this, void 0, void 0, function* () {
27
+ var _a, _b, _c, _d;
28
+ this.trackMessage(llmMessage);
29
+ const { model, callbacks } = (_b = (_a = this.skill) === null || _a === void 0 ? void 0 : _a.serialize()) !== null && _b !== void 0 ? _b : {};
30
+ const llmResponse = yield this.sendMessageToAdapter(model);
31
+ if (this.isCancelled) {
32
+ return '';
33
+ }
34
+ let parsedMessage;
35
+ let isDone;
36
+ let state;
37
+ let callbackResults;
38
+ try {
39
+ const parsed = yield this.parseResponse(llmResponse, callbacks);
40
+ parsedMessage = parsed.message;
41
+ isDone = parsed.isDone;
42
+ state = parsed.state;
43
+ callbackResults = parsed.callbackResults;
44
+ }
45
+ catch (err) {
46
+ this.trackMessage({
47
+ from: 'You',
48
+ message: llmResponse,
49
+ });
50
+ if (((_c = err.options) === null || _c === void 0 ? void 0 : _c.code) === 'INVALID_CALLBACK' ||
51
+ ((_d = err.options) === null || _d === void 0 ? void 0 : _d.code) === 'CALLBACK_ERROR') {
52
+ return this.sendMessage({ from: 'Api', message: `Error: ${err.message}` }, cb);
53
+ }
54
+ throw err;
55
+ }
56
+ this.setDone(isDone);
57
+ yield this.optionallyUpdateState(state);
58
+ this.trackMessage({
59
+ from: 'You',
60
+ message: llmResponse,
61
+ });
62
+ cb === null || cb === void 0 ? void 0 : cb(parsedMessage);
63
+ if (callbackResults) {
64
+ let message;
65
+ if (typeof callbackResults === 'string') {
66
+ message = {
67
+ from: 'Api',
68
+ message: `API Results: ${callbackResults}`,
69
+ };
70
+ }
71
+ else {
72
+ message = {
73
+ from: 'Api',
74
+ imageBase64: callbackResults.imageBase64,
75
+ message: `API Results: ${callbackResults.imageDescription}`,
76
+ };
77
+ }
78
+ yield this.sendMessage(message, cb);
79
+ }
80
+ return parsedMessage;
81
+ });
82
+ }
83
+ sendMessageToAdapter(model) {
84
+ return __awaiter(this, void 0, void 0, function* () {
85
+ return yield this.adapter.sendMessage(this.bot, {
86
+ model,
87
+ });
88
+ });
89
+ }
90
+ parseResponse(response, callbacks) {
91
+ return __awaiter(this, void 0, void 0, function* () {
92
+ const parser = ResponseParser.getInstance();
93
+ const parsed = yield parser.parse(response, callbacks);
94
+ return parsed;
95
+ });
96
+ }
97
+ }
package/package.json CHANGED
@@ -8,7 +8,7 @@
8
8
  "eta"
9
9
  ]
10
10
  },
11
- "version": "11.1.16",
11
+ "version": "11.1.18",
12
12
  "files": [
13
13
  "build"
14
14
  ],