@sprucelabs/sprucebot-llm 11.1.14 → 11.1.16

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.
Files changed (193) hide show
  1. package/build/.spruce/errors/errors.types.js +0 -1
  2. package/build/.spruce/errors/options.types.js +0 -1
  3. package/build/.spruce/errors/sprucebotLlm/callbackError.schema.js +0 -1
  4. package/build/.spruce/errors/sprucebotLlm/invalidCallback.schema.js +0 -1
  5. package/build/.spruce/errors/sprucebotLlm/noBotInstanceSet.schema.js +0 -1
  6. package/build/.spruce/schemas/fields/fieldClassMap.js +0 -1
  7. package/build/.spruce/schemas/fields/fields.types.js +0 -1
  8. package/build/bots/PromptGenerator.js +0 -1
  9. package/build/bots/SprucebotLlmBotImpl.js +0 -1
  10. package/build/bots/SprucebotLlmFactory.js +0 -1
  11. package/build/bots/SprucebotLlmSkillImpl.js +0 -1
  12. package/build/bots/adapters/OpenAi.js +0 -1
  13. package/build/bots/adapters/OpenAiMessageBuilder.js +0 -1
  14. package/build/bots/adapters/SpyOpenAiApi.js +0 -1
  15. package/build/bots/templates.js +0 -1
  16. package/build/chat.js +0 -1
  17. package/build/chatWithImages.js +0 -1
  18. package/build/errors/SpruceError.js +0 -1
  19. package/build/errors/callbackError.builder.js +0 -1
  20. package/build/errors/invalidCallback.builder.js +0 -1
  21. package/build/errors/noBotInstanceSet.builder.js +0 -1
  22. package/build/esm/.spruce/errors/errors.types.d.ts +52 -0
  23. package/build/esm/.spruce/errors/errors.types.js +1 -0
  24. package/build/esm/.spruce/errors/options.types.d.ts +13 -0
  25. package/build/esm/.spruce/errors/options.types.js +1 -0
  26. package/build/esm/bots/PromptGenerator.d.ts +22 -0
  27. package/build/esm/bots/PromptGenerator.js +74 -0
  28. package/build/esm/bots/SprucebotLlmBotImpl.d.ts +26 -0
  29. package/build/esm/bots/SprucebotLlmBotImpl.js +163 -0
  30. package/build/esm/bots/SprucebotLlmFactory.d.ts +15 -0
  31. package/build/esm/bots/SprucebotLlmFactory.js +41 -0
  32. package/build/esm/bots/SprucebotLlmSkillImpl.d.ts +12 -0
  33. package/build/esm/bots/SprucebotLlmSkillImpl.js +47 -0
  34. package/build/esm/bots/adapters/OpenAi.d.ts +11 -0
  35. package/build/esm/bots/adapters/OpenAi.js +46 -0
  36. package/build/esm/bots/adapters/OpenAiMessageBuilder.d.ts +18 -0
  37. package/build/esm/bots/adapters/OpenAiMessageBuilder.js +153 -0
  38. package/build/esm/bots/adapters/SpyOpenAiApi.d.ts +19 -0
  39. package/build/esm/bots/adapters/SpyOpenAiApi.js +49 -0
  40. package/build/esm/bots/templates.d.ts +4 -0
  41. package/build/esm/bots/templates.js +68 -0
  42. package/build/esm/chat.d.ts +1 -0
  43. package/build/esm/chat.js +53 -0
  44. package/build/esm/chatWithImages.d.ts +1 -0
  45. package/build/esm/chatWithImages.js +46 -0
  46. package/build/esm/errors/SpruceError.d.ts +6 -0
  47. package/build/esm/errors/SpruceError.js +25 -0
  48. package/build/esm/errors/callbackError.builder.d.ts +6 -0
  49. package/build/esm/errors/callbackError.builder.js +6 -0
  50. package/build/esm/errors/invalidCallback.builder.d.ts +17 -0
  51. package/build/esm/errors/invalidCallback.builder.js +17 -0
  52. package/build/esm/errors/noBotInstanceSet.builder.d.ts +6 -0
  53. package/build/esm/errors/noBotInstanceSet.builder.js +6 -0
  54. package/build/esm/examples/buildCallbackSkill.d.ts +2 -0
  55. package/build/esm/examples/buildCallbackSkill.js +57 -0
  56. package/build/esm/examples/buildFileTransformerSkill.d.ts +2 -0
  57. package/build/esm/examples/buildFileTransformerSkill.js +25 -0
  58. package/build/esm/examples/buildJokeSkill.d.ts +2 -0
  59. package/build/esm/examples/buildJokeSkill.js +12 -0
  60. package/build/esm/examples/buildProfileSkill.d.ts +2 -0
  61. package/build/esm/examples/buildProfileSkill.js +30 -0
  62. package/build/esm/examples/buildReceptionistSkill.d.ts +2 -0
  63. package/build/esm/examples/buildReceptionistSkill.js +16 -0
  64. package/build/esm/fineTuningSprucebot/constants/DIRECTORY_SHARES.d.ts +1 -0
  65. package/build/esm/fineTuningSprucebot/constants/DIRECTORY_SHARES.js +7 -0
  66. package/build/esm/fineTuningSprucebot/constants/FIRST_MESSAGES.d.ts +1 -0
  67. package/build/esm/fineTuningSprucebot/constants/FIRST_MESSAGES.js +17 -0
  68. package/build/esm/fineTuningSprucebot/constants/GREETINGS.d.ts +1 -0
  69. package/build/esm/fineTuningSprucebot/constants/GREETINGS.js +22 -0
  70. package/build/esm/fineTuningSprucebot/constants/OFF_THE_RAILS_CONVERSATIONS.d.ts +2 -0
  71. package/build/esm/fineTuningSprucebot/constants/OFF_THE_RAILS_CONVERSATIONS.js +32 -0
  72. package/build/esm/fineTuningSprucebot/constants/TOPICS.d.ts +2 -0
  73. package/build/esm/fineTuningSprucebot/constants/TOPICS.js +314 -0
  74. package/build/esm/fineTuningSprucebot/generateSamples.d.ts +1 -0
  75. package/build/esm/fineTuningSprucebot/generateSamples.js +41 -0
  76. package/build/esm/fineTuningSprucebot/support.d.ts +12 -0
  77. package/build/esm/fineTuningSprucebot/support.js +60 -0
  78. package/build/esm/fineTuningSprucebot/types.d.ts +15 -0
  79. package/build/esm/fineTuningSprucebot/types.js +1 -0
  80. package/build/esm/index.d.ts +10 -0
  81. package/build/esm/index.js +10 -0
  82. package/build/esm/llm.types.d.ts +84 -0
  83. package/build/esm/llm.types.js +6 -0
  84. package/build/esm/parsingResponses/ResponseParser.d.ts +18 -0
  85. package/build/esm/parsingResponses/ResponseParser.js +115 -0
  86. package/build/esm/parsingResponses/renderPlaceholder.d.ts +1 -0
  87. package/build/esm/parsingResponses/renderPlaceholder.js +4 -0
  88. package/build/esm/tests/MockLlmSkill.d.ts +14 -0
  89. package/build/esm/tests/MockLlmSkill.js +60 -0
  90. package/build/esm/tests/SpyAdapter.d.ts +9 -0
  91. package/build/esm/tests/SpyAdapter.js +24 -0
  92. package/build/esm/tests/SpyLlmBot.d.ts +12 -0
  93. package/build/esm/tests/SpyLlmBot.js +20 -0
  94. package/build/examples/buildCallbackSkill.js +0 -1
  95. package/build/examples/buildFileTransformerSkill.js +0 -1
  96. package/build/examples/buildJokeSkill.js +0 -1
  97. package/build/examples/buildProfileSkill.js +0 -1
  98. package/build/examples/buildReceptionistSkill.js +0 -1
  99. package/build/fineTuningSprucebot/constants/DIRECTORY_SHARES.js +0 -1
  100. package/build/fineTuningSprucebot/constants/FIRST_MESSAGES.js +0 -1
  101. package/build/fineTuningSprucebot/constants/GREETINGS.js +0 -1
  102. package/build/fineTuningSprucebot/constants/OFF_THE_RAILS_CONVERSATIONS.js +0 -1
  103. package/build/fineTuningSprucebot/constants/TOPICS.js +0 -1
  104. package/build/fineTuningSprucebot/generateSamples.js +0 -1
  105. package/build/fineTuningSprucebot/support.js +0 -1
  106. package/build/fineTuningSprucebot/types.js +0 -1
  107. package/build/index.js +0 -1
  108. package/build/llm.types.js +0 -1
  109. package/build/parsingResponses/ResponseParser.js +0 -1
  110. package/build/parsingResponses/renderPlaceholder.js +0 -1
  111. package/build/tests/MockLlmSkill.js +0 -1
  112. package/build/tests/SpyAdapter.d.ts +1 -0
  113. package/build/tests/SpyAdapter.js +3 -1
  114. package/build/tests/SpyLlmBot.js +0 -1
  115. package/package.json +1 -1
  116. package/build/.spruce/errors/errors.types.js.map +0 -1
  117. package/build/.spruce/errors/options.types.js.map +0 -1
  118. package/build/.spruce/errors/sprucebotLlm/callbackError.schema.js.map +0 -1
  119. package/build/.spruce/errors/sprucebotLlm/invalidCallback.schema.js.map +0 -1
  120. package/build/.spruce/errors/sprucebotLlm/noBotInstanceSet.schema.js.map +0 -1
  121. package/build/.spruce/event-cache.json +0 -1
  122. package/build/.spruce/schemas/fields/fieldClassMap.js.map +0 -1
  123. package/build/.spruce/schemas/fields/fields.types.js.map +0 -1
  124. package/build/__tests__/behavioral/LlmBot.test.d.ts +0 -55
  125. package/build/__tests__/behavioral/LlmBot.test.js +0 -607
  126. package/build/__tests__/behavioral/LlmBot.test.js.map +0 -1
  127. package/build/__tests__/behavioral/SprucebotLlmFactory.test.d.ts +0 -16
  128. package/build/__tests__/behavioral/SprucebotLlmFactory.test.js +0 -132
  129. package/build/__tests__/behavioral/SprucebotLlmFactory.test.js.map +0 -1
  130. package/build/__tests__/behavioral/adapters/OpenAi.test.d.ts +0 -52
  131. package/build/__tests__/behavioral/adapters/OpenAi.test.js +0 -699
  132. package/build/__tests__/behavioral/adapters/OpenAi.test.js.map +0 -1
  133. package/build/__tests__/behavioral/prompts/PromptGenerator.test.d.ts +0 -20
  134. package/build/__tests__/behavioral/prompts/PromptGenerator.test.js +0 -211
  135. package/build/__tests__/behavioral/prompts/PromptGenerator.test.js.map +0 -1
  136. package/build/__tests__/behavioral/prompts/ResponseParser.test.d.ts +0 -35
  137. package/build/__tests__/behavioral/prompts/ResponseParser.test.js +0 -312
  138. package/build/__tests__/behavioral/prompts/ResponseParser.test.js.map +0 -1
  139. package/build/__tests__/behavioral/skills/Skill.test.d.ts +0 -19
  140. package/build/__tests__/behavioral/skills/Skill.test.js +0 -188
  141. package/build/__tests__/behavioral/skills/Skill.test.js.map +0 -1
  142. package/build/__tests__/behavioral/testing/MockLlmSkill.test.d.ts +0 -37
  143. package/build/__tests__/behavioral/testing/MockLlmSkill.test.js +0 -340
  144. package/build/__tests__/behavioral/testing/MockLlmSkill.test.js.map +0 -1
  145. package/build/__tests__/behavioral/testing/SpyLlmBot.test.d.ts +0 -4
  146. package/build/__tests__/behavioral/testing/SpyLlmBot.test.js +0 -34
  147. package/build/__tests__/behavioral/testing/SpyLlmBot.test.js.map +0 -1
  148. package/build/__tests__/support/AbstractLlmTest.d.ts +0 -14
  149. package/build/__tests__/support/AbstractLlmTest.js +0 -67
  150. package/build/__tests__/support/AbstractLlmTest.js.map +0 -1
  151. package/build/__tests__/support/schemas/carSchema.d.ts +0 -16
  152. package/build/__tests__/support/schemas/carSchema.js +0 -19
  153. package/build/__tests__/support/schemas/carSchema.js.map +0 -1
  154. package/build/__tests__/support/schemas/personSchema.d.ts +0 -23
  155. package/build/__tests__/support/schemas/personSchema.js +0 -37
  156. package/build/__tests__/support/schemas/personSchema.js.map +0 -1
  157. package/build/__tests__/support/schemas/personWithDefaultsSchema.d.ts +0 -13
  158. package/build/__tests__/support/schemas/personWithDefaultsSchema.js +0 -18
  159. package/build/__tests__/support/schemas/personWithDefaultsSchema.js.map +0 -1
  160. package/build/bots/PromptGenerator.js.map +0 -1
  161. package/build/bots/SprucebotLlmBotImpl.js.map +0 -1
  162. package/build/bots/SprucebotLlmFactory.js.map +0 -1
  163. package/build/bots/SprucebotLlmSkillImpl.js.map +0 -1
  164. package/build/bots/adapters/OpenAi.js.map +0 -1
  165. package/build/bots/adapters/OpenAiMessageBuilder.js.map +0 -1
  166. package/build/bots/adapters/SpyOpenAiApi.js.map +0 -1
  167. package/build/bots/templates.js.map +0 -1
  168. package/build/chat.js.map +0 -1
  169. package/build/chatWithImages.js.map +0 -1
  170. package/build/errors/SpruceError.js.map +0 -1
  171. package/build/errors/callbackError.builder.js.map +0 -1
  172. package/build/errors/invalidCallback.builder.js.map +0 -1
  173. package/build/errors/noBotInstanceSet.builder.js.map +0 -1
  174. package/build/examples/buildCallbackSkill.js.map +0 -1
  175. package/build/examples/buildFileTransformerSkill.js.map +0 -1
  176. package/build/examples/buildJokeSkill.js.map +0 -1
  177. package/build/examples/buildProfileSkill.js.map +0 -1
  178. package/build/examples/buildReceptionistSkill.js.map +0 -1
  179. package/build/fineTuningSprucebot/constants/DIRECTORY_SHARES.js.map +0 -1
  180. package/build/fineTuningSprucebot/constants/FIRST_MESSAGES.js.map +0 -1
  181. package/build/fineTuningSprucebot/constants/GREETINGS.js.map +0 -1
  182. package/build/fineTuningSprucebot/constants/OFF_THE_RAILS_CONVERSATIONS.js.map +0 -1
  183. package/build/fineTuningSprucebot/constants/TOPICS.js.map +0 -1
  184. package/build/fineTuningSprucebot/generateSamples.js.map +0 -1
  185. package/build/fineTuningSprucebot/support.js.map +0 -1
  186. package/build/fineTuningSprucebot/types.js.map +0 -1
  187. package/build/index.js.map +0 -1
  188. package/build/llm.types.js.map +0 -1
  189. package/build/parsingResponses/ResponseParser.js.map +0 -1
  190. package/build/parsingResponses/renderPlaceholder.js.map +0 -1
  191. package/build/tests/MockLlmSkill.js.map +0 -1
  192. package/build/tests/SpyAdapter.js.map +0 -1
  193. package/build/tests/SpyLlmBot.js.map +0 -1
@@ -0,0 +1,10 @@
1
+ export { default as SprucebotLlmFactory } from './bots/SprucebotLlmFactory';
2
+ export { default as SprucebotLlmBotImpl } from './bots/SprucebotLlmBotImpl';
3
+ export { default as SprucebotLlmSkillImpl } from './bots/SprucebotLlmSkillImpl';
4
+ export { default as OpenAiAdapter } from './bots/adapters/OpenAi';
5
+ export * from './llm.types';
6
+ export { default as SprucebotLlmError } from './errors/SpruceError';
7
+ export { default as MockLlmSkill } from './tests/MockLlmSkill';
8
+ export { default as SpyLllmBot } from './tests/SpyLlmBot';
9
+ export { default as SpyLlmAdapter } from './tests/SpyAdapter';
10
+ export { default as SpyOpenAiApi } from './bots/adapters/SpyOpenAiApi';
@@ -0,0 +1,10 @@
1
+ export { default as SprucebotLlmFactory } from './bots/SprucebotLlmFactory.js';
2
+ export { default as SprucebotLlmBotImpl } from './bots/SprucebotLlmBotImpl.js';
3
+ export { default as SprucebotLlmSkillImpl } from './bots/SprucebotLlmSkillImpl.js';
4
+ export { default as OpenAiAdapter } from './bots/adapters/OpenAi.js';
5
+ export * from './llm.types.js';
6
+ export { default as SprucebotLlmError } from './errors/SpruceError.js';
7
+ export { default as MockLlmSkill } from './tests/MockLlmSkill.js';
8
+ export { default as SpyLllmBot } from './tests/SpyLlmBot.js';
9
+ export { default as SpyLlmAdapter } from './tests/SpyAdapter.js';
10
+ export { default as SpyOpenAiApi } from './bots/adapters/SpyOpenAiApi.js';
@@ -0,0 +1,84 @@
1
+ import { MercuryEventEmitter } from '@sprucelabs/mercury-types';
2
+ import { Schema, SchemaValues, SelectFieldDefinition } from '@sprucelabs/schema';
3
+ export interface BotOptions<StateSchema extends Schema = Schema, State extends SchemaValues<StateSchema> = SchemaValues<StateSchema>> extends Omit<PromptOptions<StateSchema, State>, 'skill'> {
4
+ adapter: LlmAdapter;
5
+ Class?: new (...opts: any[]) => SprucebotLlmBot<Schema, State>;
6
+ skill?: SprucebotLLmSkill<Schema>;
7
+ }
8
+ export interface SprucebotLlmBot<StateSchema extends Schema = Schema, State extends SchemaValues<StateSchema> = SchemaValues<StateSchema>> extends MercuryEventEmitter<LlmEventContract> {
9
+ markAsDone(): void;
10
+ getIsDone(): boolean;
11
+ sendMessage(message: SendMessage, responseCb?: MessageResponseCallback): Promise<string>;
12
+ serialize(): SerializedBot<StateSchema, State>;
13
+ updateState(state: Partial<State>): Promise<void>;
14
+ setSkill(skill: SprucebotLLmSkill<any>): void;
15
+ clearMessageHistory(): void;
16
+ }
17
+ export interface LlmAdapter {
18
+ sendMessage(bot: SprucebotLlmBot<Schema>, options?: SendMessageOptions): Promise<string>;
19
+ }
20
+ export interface PromptOptions<StateSchema extends Schema, State extends SchemaValues<StateSchema> = SchemaValues<StateSchema>> {
21
+ /**
22
+ * Tell the bot who/what it is. Example: youAre: "a super funny comedian. You absolutely love dad jokes!"
23
+ */
24
+ youAre: string;
25
+ stateSchema?: StateSchema;
26
+ state?: Partial<State>;
27
+ skill?: SerializedSkill<Schema>;
28
+ }
29
+ export interface SendMessageOptions {
30
+ model?: string;
31
+ }
32
+ export interface SerializedBot<StateSchema extends Schema = Schema, State extends SchemaValues<StateSchema> = SchemaValues<StateSchema>> extends PromptOptions<Schema, State> {
33
+ messages: LlmMessage[];
34
+ }
35
+ export declare const llmEventContract: {
36
+ eventSignatures: {
37
+ 'did-update-state': {};
38
+ };
39
+ };
40
+ export type LlmEventContract = typeof llmEventContract;
41
+ export type LlmMessageFrom = 'Me' | 'You' | 'Api';
42
+ export interface LlmMessage {
43
+ from: LlmMessageFrom;
44
+ message: string;
45
+ imageBase64?: string;
46
+ }
47
+ export interface SkillOptions<StateSchema extends Schema = Schema, State extends SchemaValues<StateSchema> = SchemaValues<StateSchema>> {
48
+ yourJobIfYouChooseToAcceptItIs: string;
49
+ weAreDoneWhen?: string;
50
+ pleaseKeepInMindThat?: string[];
51
+ stateSchema?: StateSchema;
52
+ state?: Partial<State>;
53
+ callbacks?: LlmCallbackMap;
54
+ model?: string;
55
+ }
56
+ export interface SprucebotLLmSkill<StateSchema extends Schema = Schema, State extends SchemaValues<StateSchema> = SchemaValues<StateSchema>> extends MercuryEventEmitter<LlmEventContract> {
57
+ getState(): Partial<State> | undefined;
58
+ serialize(): SerializedSkill<StateSchema, State>;
59
+ updateState(state: Partial<State>): Promise<void>;
60
+ }
61
+ export interface SerializedSkill<StateSchema extends Schema = Schema, State extends SchemaValues<StateSchema> = SchemaValues<StateSchema>> extends SkillOptions<StateSchema, State> {
62
+ }
63
+ export type LlmCallbackMap = Record<string, LlmCallback>;
64
+ export type LmmCallbackResponse = void | SendMessage;
65
+ export interface LlmCallback {
66
+ cb: (options?: Record<string, any>) => LmmCallbackResponse | Promise<LmmCallbackResponse>;
67
+ useThisWhenever: string;
68
+ parameters?: LlmCallbackParameter[];
69
+ }
70
+ export type LlmCallbackParameter = {
71
+ name: string;
72
+ type: ('text' | 'number' | 'boolean' | 'dateMs' | 'dateTimeMs') | (string & {});
73
+ isRequired?: boolean;
74
+ description?: string;
75
+ } | (SelectFieldDefinition & {
76
+ name: string;
77
+ description?: string;
78
+ });
79
+ export type MessageResponseCallback = (message: string) => any;
80
+ export type SendMessage = string | SendMessageWithImage;
81
+ export interface SendMessageWithImage {
82
+ imageDescription: string;
83
+ imageBase64: string;
84
+ }
@@ -0,0 +1,6 @@
1
+ import { buildEventContract, } from '@sprucelabs/mercury-types';
2
+ export const llmEventContract = buildEventContract({
3
+ eventSignatures: {
4
+ 'did-update-state': {},
5
+ },
6
+ });
@@ -0,0 +1,18 @@
1
+ import { LlmCallbackMap, SendMessage } from '../llm.types';
2
+ export default class ResponseParser {
3
+ private static instance;
4
+ static setInstance(parser: ResponseParser): void;
5
+ static getInstance(): ResponseParser;
6
+ parse(response: string, callbacks?: LlmCallbackMap): Promise<ParsedResponse>;
7
+ private findFirstBadCallback;
8
+ private invokeCallbackAndDropInLegacyResults;
9
+ private doesIncludeDoneToken;
10
+ private parseState;
11
+ private assertAtMostOneCallback;
12
+ }
13
+ export interface ParsedResponse {
14
+ isDone: boolean;
15
+ state?: Record<string, any>;
16
+ message: string;
17
+ callbackResults?: SendMessage;
18
+ }
@@ -0,0 +1,115 @@
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 { DONE_TOKEN, STATE_BOUNDARY } from '../bots/templates.js';
11
+ import SpruceError from '../errors/SpruceError.js';
12
+ import renderPlaceholder from './renderPlaceholder.js';
13
+ class ResponseParser {
14
+ static setInstance(parser) {
15
+ this.instance = parser;
16
+ }
17
+ static getInstance() {
18
+ return this.instance;
19
+ }
20
+ parse(response, callbacks) {
21
+ return __awaiter(this, void 0, void 0, function* () {
22
+ var _a;
23
+ let message = response.replace(DONE_TOKEN, '').trim();
24
+ let state;
25
+ let callbackResults;
26
+ let callbacksInvoked = 0;
27
+ for (const key of Object.keys(callbacks || {})) {
28
+ const match = message.match(renderPlaceholder(key));
29
+ if (match) {
30
+ message = yield this.invokeCallbackAndDropInLegacyResults(callbacks, key, message);
31
+ }
32
+ let xmlCallMatches = message.match(new RegExp(`<<\\s*${key}\\s*\/>>`, 'g'));
33
+ let data;
34
+ if (!xmlCallMatches) {
35
+ const matchWithJson = message
36
+ .matchAll(new RegExp(`<<\\s*${key}\\s*>>(.*?)<<\/\\s*${key}\\s*>>`, 'gs'))
37
+ .next().value;
38
+ xmlCallMatches = (matchWithJson === null || matchWithJson === void 0 ? void 0 : matchWithJson[0])
39
+ ? [matchWithJson === null || matchWithJson === void 0 ? void 0 : matchWithJson[0]]
40
+ : null;
41
+ data = (matchWithJson === null || matchWithJson === void 0 ? void 0 : matchWithJson[1])
42
+ ? JSON.parse(matchWithJson === null || matchWithJson === void 0 ? void 0 : matchWithJson[1])
43
+ : undefined;
44
+ }
45
+ if (xmlCallMatches) {
46
+ this.assertAtMostOneCallback(++callbacksInvoked);
47
+ try {
48
+ callbackResults = yield ((_a = callbacks === null || callbacks === void 0 ? void 0 : callbacks[key]) === null || _a === void 0 ? void 0 : _a.cb(data));
49
+ message = message.replace(xmlCallMatches[0], '').trim();
50
+ }
51
+ catch (error) {
52
+ throw new SpruceError({
53
+ code: 'CALLBACK_ERROR',
54
+ friendlyMessage: `Error while executing callback (${key}). The error is: ${error.message}`,
55
+ originalError: error,
56
+ });
57
+ }
58
+ }
59
+ }
60
+ const matchedCallback = this.findFirstBadCallback(message);
61
+ if (matchedCallback) {
62
+ throw new SpruceError({
63
+ code: 'INVALID_CALLBACK',
64
+ validCallbacks: Object.keys(callbacks !== null && callbacks !== void 0 ? callbacks : {}),
65
+ matchedCallback,
66
+ });
67
+ }
68
+ const { match, fullMatch } = this.parseState(message);
69
+ if (match && fullMatch) {
70
+ message = message.replace(fullMatch, '').trim();
71
+ state = JSON.parse(match);
72
+ }
73
+ return {
74
+ isDone: this.doesIncludeDoneToken(response),
75
+ state,
76
+ message,
77
+ callbackResults: callbackResults !== null && callbackResults !== void 0 ? callbackResults : undefined,
78
+ };
79
+ });
80
+ }
81
+ findFirstBadCallback(message) {
82
+ const simpleMatches = message.match(new RegExp(`<<(.*)\/?>>`, 'g'));
83
+ const extraJsonMatches = message.match(new RegExp(`<<.*?>>(.*?)<<\/.*?>>`, 'gs'));
84
+ const matchedCallback = (extraJsonMatches === null || extraJsonMatches === void 0 ? void 0 : extraJsonMatches[0]) || (simpleMatches === null || simpleMatches === void 0 ? void 0 : simpleMatches[0]);
85
+ return matchedCallback;
86
+ }
87
+ invokeCallbackAndDropInLegacyResults(callbacks, key, message) {
88
+ return __awaiter(this, void 0, void 0, function* () {
89
+ var _a;
90
+ const v = (yield ((_a = callbacks === null || callbacks === void 0 ? void 0 : callbacks[key]) === null || _a === void 0 ? void 0 : _a.cb()));
91
+ message = message.replace(renderPlaceholder(key), v !== null && v !== void 0 ? v : '').trim();
92
+ return message;
93
+ });
94
+ }
95
+ doesIncludeDoneToken(response) {
96
+ return response.includes(DONE_TOKEN);
97
+ }
98
+ parseState(message) {
99
+ const ESCAPED_BOUNDARY = STATE_BOUNDARY.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
100
+ const searchRegex = new RegExp(`${ESCAPED_BOUNDARY}(.*?)${ESCAPED_BOUNDARY}`);
101
+ const stateMatches = message.match(searchRegex);
102
+ const match = stateMatches === null || stateMatches === void 0 ? void 0 : stateMatches[1];
103
+ return { match, fullMatch: stateMatches === null || stateMatches === void 0 ? void 0 : stateMatches[0] };
104
+ }
105
+ assertAtMostOneCallback(invocations) {
106
+ if (invocations > 1) {
107
+ throw new SpruceError({
108
+ code: 'CALLBACK_ERROR',
109
+ friendlyMessage: 'You can only invoke one callback per message.',
110
+ });
111
+ }
112
+ }
113
+ }
114
+ ResponseParser.instance = new ResponseParser();
115
+ export default ResponseParser;
@@ -0,0 +1 @@
1
+ export default function renderPlaceholder(key: string): string;
@@ -0,0 +1,4 @@
1
+ import { CALLBACK_BOUNDARY } from '../bots/templates.js';
2
+ export default function renderPlaceholder(key) {
3
+ return `${CALLBACK_BOUNDARY} ${key} ${CALLBACK_BOUNDARY}`;
4
+ }
@@ -0,0 +1,14 @@
1
+ import { Schema, SchemaValues } from '@sprucelabs/schema';
2
+ import SprucebotLlmSkillImpl from '../bots/SprucebotLlmSkillImpl';
3
+ import { LlmCallback, SkillOptions } from '../llm.types';
4
+ export default class MockLlmSkill<StateSchema extends Schema = Schema, State extends SchemaValues<StateSchema> = SchemaValues<StateSchema>> extends SprucebotLlmSkillImpl<StateSchema, State> {
5
+ static instance: MockLlmSkill;
6
+ constructor(options: SkillOptions<StateSchema, State>);
7
+ assertYourJobEquals(expected: string): void;
8
+ assertWeAreDoneWhenEquals(expected: string | undefined): void;
9
+ assertPleaseKeepInMindEquals(expected: string[] | undefined): void;
10
+ assertModelEquals(model: string | undefined): void;
11
+ assertStateSchemaEquals(expected: Schema | undefined): void;
12
+ assertHasCallback(name: string, expectedOptions?: Omit<LlmCallback, 'cb'>): (options?: Record<string, any>) => import("../llm.types").LmmCallbackResponse | Promise<import("../llm.types").LmmCallbackResponse>;
13
+ invokeCallback(cbName: string, options?: Record<string, any>): Promise<import("../llm.types").LmmCallbackResponse>;
14
+ }
@@ -0,0 +1,60 @@
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
+ var __rest = (this && this.__rest) || function (s, e) {
11
+ var t = {};
12
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
13
+ t[p] = s[p];
14
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
15
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
16
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
17
+ t[p[i]] = s[p[i]];
18
+ }
19
+ return t;
20
+ };
21
+ import { assertOptions } from '@sprucelabs/schema';
22
+ import { assert } from '@sprucelabs/test-utils';
23
+ import SprucebotLlmSkillImpl from '../bots/SprucebotLlmSkillImpl.js';
24
+ export default class MockLlmSkill extends SprucebotLlmSkillImpl {
25
+ constructor(options) {
26
+ super(options);
27
+ assertOptions(options, ['yourJobIfYouChooseToAcceptItIs']);
28
+ MockLlmSkill.instance = this;
29
+ }
30
+ assertYourJobEquals(expected) {
31
+ assert.isEqual(this.options.yourJobIfYouChooseToAcceptItIs, expected, 'yourJobIfYouChooseToAcceptItIs passed to constructor does not equal expected');
32
+ }
33
+ assertWeAreDoneWhenEquals(expected) {
34
+ assert.isEqual(this.options.weAreDoneWhen, expected, 'weAreDoneWhen passed to constructor does not equal expected');
35
+ }
36
+ assertPleaseKeepInMindEquals(expected) {
37
+ assert.isEqualDeep(this.options.pleaseKeepInMindThat, expected, 'pleaseKeepInMindThat passed to constructor does not equal expected');
38
+ }
39
+ assertModelEquals(model) {
40
+ assert.isEqual(this.options.model, model, 'model passed to constructor does not equal expected');
41
+ }
42
+ assertStateSchemaEquals(expected) {
43
+ assert.isEqualDeep(this.stateSchema, expected, 'stateSchema passed to constructor does not equal expected');
44
+ }
45
+ assertHasCallback(name, expectedOptions) {
46
+ var _a, _b;
47
+ const _c = (_b = (_a = this.options.callbacks) === null || _a === void 0 ? void 0 : _a[name]) !== null && _b !== void 0 ? _b : {}, { cb } = _c, options = __rest(_c, ["cb"]);
48
+ assert.isTruthy(cb, 'Could not find callback with name: ' + name);
49
+ if (expectedOptions) {
50
+ assert.isEqualDeep(options, expectedOptions, `the options for the '${name}' callback don\`t match`);
51
+ }
52
+ return cb;
53
+ }
54
+ invokeCallback(cbName, options) {
55
+ return __awaiter(this, void 0, void 0, function* () {
56
+ const cb = this.assertHasCallback(cbName);
57
+ return yield cb(options);
58
+ });
59
+ }
60
+ }
@@ -0,0 +1,9 @@
1
+ import { LlmAdapter, SendMessageOptions, SprucebotLlmBot } from '../llm.types';
2
+ export default class SpyLlmAdapter implements LlmAdapter {
3
+ lastBot?: SprucebotLlmBot;
4
+ lastMessage?: string;
5
+ messageResponse: string;
6
+ lastSendOptions?: SendMessageOptions;
7
+ responseDelayMs?: number;
8
+ sendMessage(bot: SprucebotLlmBot, options?: SendMessageOptions): Promise<string>;
9
+ }
@@ -0,0 +1,24 @@
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
+ export default class SpyLlmAdapter {
11
+ constructor() {
12
+ this.messageResponse = '';
13
+ }
14
+ sendMessage(bot, options) {
15
+ return __awaiter(this, void 0, void 0, function* () {
16
+ this.lastBot = bot;
17
+ this.lastSendOptions = options;
18
+ if (this.responseDelayMs) {
19
+ yield new Promise((resolve) => setTimeout(resolve, this.responseDelayMs));
20
+ }
21
+ return this.messageResponse;
22
+ });
23
+ }
24
+ }
@@ -0,0 +1,12 @@
1
+ import { Schema, SchemaValues } from '@sprucelabs/schema';
2
+ import SprucebotLlmBotImpl from '../bots/SprucebotLlmBotImpl';
3
+ import { BotOptions, LlmMessage, SprucebotLlmBot } from '../llm.types';
4
+ export default class SpyLlmBot<StateSchema extends Schema = Schema, State extends SchemaValues<StateSchema> = SchemaValues<StateSchema>> extends SprucebotLlmBotImpl<StateSchema, State> implements SprucebotLlmBot {
5
+ static instance: SpyLlmBot;
6
+ constructorOptions: BotOptions<StateSchema, State>;
7
+ constructor(options: BotOptions<StateSchema, State>);
8
+ getState(): Partial<State> | undefined;
9
+ getSkill(): import("../llm.types").SprucebotLLmSkill<Schema, Pick<import("@sprucelabs/schema").SchemaStaticValues<Schema, false, never, import("@sprucelabs/schema").StaticSchemaAllValues<Schema, false>>, never>> | undefined;
10
+ setMessages(messages: LlmMessage[]): void;
11
+ getMessages(): LlmMessage[];
12
+ }
@@ -0,0 +1,20 @@
1
+ import SprucebotLlmBotImpl from '../bots/SprucebotLlmBotImpl.js';
2
+ export default class SpyLlmBot extends SprucebotLlmBotImpl {
3
+ constructor(options) {
4
+ super(options);
5
+ SpyLlmBot.instance = this;
6
+ this.constructorOptions = options;
7
+ }
8
+ getState() {
9
+ return this.state;
10
+ }
11
+ getSkill() {
12
+ return this.skill;
13
+ }
14
+ setMessages(messages) {
15
+ this.messages = messages;
16
+ }
17
+ getMessages() {
18
+ return this.messages;
19
+ }
20
+ }
@@ -49,4 +49,3 @@ function buildCallbackSkill(bots) {
49
49
  },
50
50
  });
51
51
  }
52
- //# sourceMappingURL=buildCallbackSkill.js.map
@@ -26,4 +26,3 @@ function buildFileTransformerSkill(bots) {
26
26
  weAreDoneWhen: 'You have converted the input to the desired output format and sent it back to me.',
27
27
  });
28
28
  }
29
- //# sourceMappingURL=buildFileTransformerSkill.js.map
@@ -13,4 +13,3 @@ function buildJokeSkill(bots) {
13
13
  weAreDoneWhen: 'you have told 3 jokes!',
14
14
  });
15
15
  }
16
- //# sourceMappingURL=buildJokeSkill.js.map
@@ -31,4 +31,3 @@ function buildProfileSkill(bots) {
31
31
  }),
32
32
  });
33
33
  }
34
- //# sourceMappingURL=buildProfileSkill.js.map
@@ -17,4 +17,3 @@ So start asking me how you can help.`,
17
17
  weAreDoneWhen: 'i have picked a topic i need help with. At that point, send me the done message and include the topic ID in handlebars format, e.g. {{#1}} or {{#2}} so I can parse it from your response.',
18
18
  });
19
19
  }
20
- //# sourceMappingURL=buildReceptionistSkill.js.map
@@ -8,4 +8,3 @@ exports.DIRECTORY_SHARES = [
8
8
  "Let's get started! Here are some things I can help you with:",
9
9
  'Thanks for reaching out! Here are a few areas I can assist with:',
10
10
  ];
11
- //# sourceMappingURL=DIRECTORY_SHARES.js.map
@@ -18,4 +18,3 @@ exports.FIRST_MESSAGES = [
18
18
  'Welcome!',
19
19
  'Hello there!',
20
20
  ];
21
- //# sourceMappingURL=FIRST_MESSAGES.js.map
@@ -23,4 +23,3 @@ exports.GREETINGS = [
23
23
  'Hey there! My name is Sprucebot 🌲🤖. Here are the things I can help you with:',
24
24
  "Hi! You can call me Sprucebot 🌲🤖!! I can't wait to help you with the following:",
25
25
  ];
26
- //# sourceMappingURL=GREETINGS.js.map
@@ -33,4 +33,3 @@ exports.OFF_THE_RAILS_CONVERSATIONS = [
33
33
  ],
34
34
  },
35
35
  ];
36
- //# sourceMappingURL=OFF_THE_RAILS_CONVERSATIONS.js.map
@@ -315,4 +315,3 @@ exports.TOPICS = [
315
315
  ],
316
316
  },
317
317
  ];
318
- //# sourceMappingURL=TOPICS.js.map
@@ -75,4 +75,3 @@ for (let c = 0; c < 20; c++) {
75
75
  });
76
76
  }
77
77
  fs.writeFileSync(outputPath, JSON.stringify(output, null, 2));
78
- //# sourceMappingURL=generateSamples.js.map
@@ -65,4 +65,3 @@ function render(message, context) {
65
65
  }
66
66
  return prompt;
67
67
  }
68
- //# sourceMappingURL=support.js.map
@@ -1,3 +1,2 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=types.js.map
package/build/index.js CHANGED
@@ -37,4 +37,3 @@ var SpyAdapter_1 = require("./tests/SpyAdapter");
37
37
  Object.defineProperty(exports, "SpyLlmAdapter", { enumerable: true, get: function () { return __importDefault(SpyAdapter_1).default; } });
38
38
  var SpyOpenAiApi_1 = require("./bots/adapters/SpyOpenAiApi");
39
39
  Object.defineProperty(exports, "SpyOpenAiApi", { enumerable: true, get: function () { return __importDefault(SpyOpenAiApi_1).default; } });
40
- //# sourceMappingURL=index.js.map
@@ -7,4 +7,3 @@ exports.llmEventContract = (0, mercury_types_1.buildEventContract)({
7
7
  'did-update-state': {},
8
8
  },
9
9
  });
10
- //# sourceMappingURL=llm.types.js.map
@@ -103,4 +103,3 @@ class ResponseParser {
103
103
  }
104
104
  ResponseParser.instance = new ResponseParser();
105
105
  exports.default = ResponseParser;
106
- //# sourceMappingURL=ResponseParser.js.map
@@ -5,4 +5,3 @@ const templates_1 = require("../bots/templates");
5
5
  function renderPlaceholder(key) {
6
6
  return `${templates_1.CALLBACK_BOUNDARY} ${key} ${templates_1.CALLBACK_BOUNDARY}`;
7
7
  }
8
- //# sourceMappingURL=renderPlaceholder.js.map
@@ -41,4 +41,3 @@ class MockLlmSkill extends SprucebotLlmSkillImpl_1.default {
41
41
  }
42
42
  }
43
43
  exports.default = MockLlmSkill;
44
- //# sourceMappingURL=MockLlmSkill.js.map
@@ -4,5 +4,6 @@ export default class SpyLlmAdapter implements LlmAdapter {
4
4
  lastMessage?: string;
5
5
  messageResponse: string;
6
6
  lastSendOptions?: SendMessageOptions;
7
+ responseDelayMs?: number;
7
8
  sendMessage(bot: SprucebotLlmBot, options?: SendMessageOptions): Promise<string>;
8
9
  }
@@ -7,8 +7,10 @@ class SpyLlmAdapter {
7
7
  async sendMessage(bot, options) {
8
8
  this.lastBot = bot;
9
9
  this.lastSendOptions = options;
10
+ if (this.responseDelayMs) {
11
+ await new Promise((resolve) => setTimeout(resolve, this.responseDelayMs));
12
+ }
10
13
  return this.messageResponse;
11
14
  }
12
15
  }
13
16
  exports.default = SpyLlmAdapter;
14
- //# sourceMappingURL=SpyAdapter.js.map
@@ -24,4 +24,3 @@ class SpyLlmBot extends SprucebotLlmBotImpl_1.default {
24
24
  }
25
25
  }
26
26
  exports.default = SpyLlmBot;
27
- //# sourceMappingURL=SpyLlmBot.js.map
package/package.json CHANGED
@@ -8,7 +8,7 @@
8
8
  "eta"
9
9
  ]
10
10
  },
11
- "version": "11.1.14",
11
+ "version": "11.1.16",
12
12
  "files": [
13
13
  "build"
14
14
  ],
@@ -1 +0,0 @@
1
- {"version":3,"file":"errors.types.js","sourceRoot":"","sources":["../../../src/.spruce/errors/errors.types.ts"],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"options.types.js","sourceRoot":"","sources":["../../../src/.spruce/errors/options.types.ts"],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"callbackError.schema.js","sourceRoot":"","sources":["../../../../src/.spruce/errors/sprucebotLlm/callbackError.schema.ts"],"names":[],"mappings":";;AAAA,+CAAmD;AAKnD,MAAM,mBAAmB,GAAmD;IAC3E,EAAE,EAAE,eAAe;IACnB,SAAS,EAAE,cAAc;IACzB,IAAI,EAAE,gBAAgB;IAClB,MAAM,EAAE,EACP;CACL,CAAA;AAED,uBAAc,CAAC,WAAW,EAAE,CAAC,WAAW,CAAC,mBAAmB,CAAC,CAAA;AAE7D,kBAAe,mBAAmB,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"invalidCallback.schema.js","sourceRoot":"","sources":["../../../../src/.spruce/errors/sprucebotLlm/invalidCallback.schema.ts"],"names":[],"mappings":";;AAAA,+CAAmD;AAKnD,MAAM,qBAAqB,GAAqD;IAC/E,EAAE,EAAE,iBAAiB;IACrB,SAAS,EAAE,cAAc;IACzB,IAAI,EAAE,kBAAkB;IACpB,MAAM,EAAE;QACA,QAAQ;QACR,gBAAgB,EAAE;YACd,IAAI,EAAE,MAAM;YACZ,UAAU,EAAE,IAAI;YAChB,OAAO,EAAE,IAAI;YACb,cAAc,EAAE,CAAC;YACjB,OAAO,EAAE,SAAS;SACrB;QACD,QAAQ;QACR,iBAAiB,EAAE;YACf,IAAI,EAAE,MAAM;YACZ,UAAU,EAAE,IAAI;YAChB,OAAO,EAAE,SAAS;SACrB;KACR;CACL,CAAA;AAED,uBAAc,CAAC,WAAW,EAAE,CAAC,WAAW,CAAC,qBAAqB,CAAC,CAAA;AAE/D,kBAAe,qBAAqB,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"noBotInstanceSet.schema.js","sourceRoot":"","sources":["../../../../src/.spruce/errors/sprucebotLlm/noBotInstanceSet.schema.ts"],"names":[],"mappings":";;AAAA,+CAAmD;AAKnD,MAAM,sBAAsB,GAAsD;IACjF,EAAE,EAAE,kBAAkB;IACtB,SAAS,EAAE,cAAc;IACzB,IAAI,EAAE,qBAAqB;IACvB,MAAM,EAAE,EACP;CACL,CAAA;AAED,uBAAc,CAAC,WAAW,EAAE,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAAA;AAEhE,kBAAe,sBAAsB,CAAA"}
@@ -1 +0,0 @@
1
- {}
@@ -1 +0,0 @@
1
- {"version":3,"file":"fieldClassMap.js","sourceRoot":"","sources":["../../../../src/.spruce/schemas/fields/fieldClassMap.ts"],"names":[],"mappings":";;AAAA,+CAAkD;AAKlD,kBAAe,sBAAa,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"fields.types.js","sourceRoot":"","sources":["../../../../src/.spruce/schemas/fields/fields.types.ts"],"names":[],"mappings":""}