@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.
- package/build/.spruce/errors/errors.types.js +0 -1
- package/build/.spruce/errors/options.types.js +0 -1
- package/build/.spruce/errors/sprucebotLlm/callbackError.schema.js +0 -1
- package/build/.spruce/errors/sprucebotLlm/invalidCallback.schema.js +0 -1
- package/build/.spruce/errors/sprucebotLlm/noBotInstanceSet.schema.js +0 -1
- package/build/.spruce/schemas/fields/fieldClassMap.js +0 -1
- package/build/.spruce/schemas/fields/fields.types.js +0 -1
- package/build/bots/PromptGenerator.js +0 -1
- package/build/bots/SprucebotLlmBotImpl.js +0 -1
- package/build/bots/SprucebotLlmFactory.js +0 -1
- package/build/bots/SprucebotLlmSkillImpl.js +0 -1
- package/build/bots/adapters/OpenAi.js +0 -1
- package/build/bots/adapters/OpenAiMessageBuilder.js +0 -1
- package/build/bots/adapters/SpyOpenAiApi.js +0 -1
- package/build/bots/templates.js +0 -1
- package/build/chat.js +0 -1
- package/build/chatWithImages.js +0 -1
- package/build/errors/SpruceError.js +0 -1
- package/build/errors/callbackError.builder.js +0 -1
- package/build/errors/invalidCallback.builder.js +0 -1
- package/build/errors/noBotInstanceSet.builder.js +0 -1
- package/build/esm/.spruce/errors/errors.types.d.ts +52 -0
- package/build/esm/.spruce/errors/errors.types.js +1 -0
- package/build/esm/.spruce/errors/options.types.d.ts +13 -0
- package/build/esm/.spruce/errors/options.types.js +1 -0
- package/build/esm/bots/PromptGenerator.d.ts +22 -0
- package/build/esm/bots/PromptGenerator.js +74 -0
- package/build/esm/bots/SprucebotLlmBotImpl.d.ts +26 -0
- package/build/esm/bots/SprucebotLlmBotImpl.js +163 -0
- package/build/esm/bots/SprucebotLlmFactory.d.ts +15 -0
- package/build/esm/bots/SprucebotLlmFactory.js +41 -0
- package/build/esm/bots/SprucebotLlmSkillImpl.d.ts +12 -0
- package/build/esm/bots/SprucebotLlmSkillImpl.js +47 -0
- package/build/esm/bots/adapters/OpenAi.d.ts +11 -0
- package/build/esm/bots/adapters/OpenAi.js +46 -0
- package/build/esm/bots/adapters/OpenAiMessageBuilder.d.ts +18 -0
- package/build/esm/bots/adapters/OpenAiMessageBuilder.js +153 -0
- package/build/esm/bots/adapters/SpyOpenAiApi.d.ts +19 -0
- package/build/esm/bots/adapters/SpyOpenAiApi.js +49 -0
- package/build/esm/bots/templates.d.ts +4 -0
- package/build/esm/bots/templates.js +68 -0
- package/build/esm/chat.d.ts +1 -0
- package/build/esm/chat.js +53 -0
- package/build/esm/chatWithImages.d.ts +1 -0
- package/build/esm/chatWithImages.js +46 -0
- package/build/esm/errors/SpruceError.d.ts +6 -0
- package/build/esm/errors/SpruceError.js +25 -0
- package/build/esm/errors/callbackError.builder.d.ts +6 -0
- package/build/esm/errors/callbackError.builder.js +6 -0
- package/build/esm/errors/invalidCallback.builder.d.ts +17 -0
- package/build/esm/errors/invalidCallback.builder.js +17 -0
- package/build/esm/errors/noBotInstanceSet.builder.d.ts +6 -0
- package/build/esm/errors/noBotInstanceSet.builder.js +6 -0
- package/build/esm/examples/buildCallbackSkill.d.ts +2 -0
- package/build/esm/examples/buildCallbackSkill.js +57 -0
- package/build/esm/examples/buildFileTransformerSkill.d.ts +2 -0
- package/build/esm/examples/buildFileTransformerSkill.js +25 -0
- package/build/esm/examples/buildJokeSkill.d.ts +2 -0
- package/build/esm/examples/buildJokeSkill.js +12 -0
- package/build/esm/examples/buildProfileSkill.d.ts +2 -0
- package/build/esm/examples/buildProfileSkill.js +30 -0
- package/build/esm/examples/buildReceptionistSkill.d.ts +2 -0
- package/build/esm/examples/buildReceptionistSkill.js +16 -0
- package/build/esm/fineTuningSprucebot/constants/DIRECTORY_SHARES.d.ts +1 -0
- package/build/esm/fineTuningSprucebot/constants/DIRECTORY_SHARES.js +7 -0
- package/build/esm/fineTuningSprucebot/constants/FIRST_MESSAGES.d.ts +1 -0
- package/build/esm/fineTuningSprucebot/constants/FIRST_MESSAGES.js +17 -0
- package/build/esm/fineTuningSprucebot/constants/GREETINGS.d.ts +1 -0
- package/build/esm/fineTuningSprucebot/constants/GREETINGS.js +22 -0
- package/build/esm/fineTuningSprucebot/constants/OFF_THE_RAILS_CONVERSATIONS.d.ts +2 -0
- package/build/esm/fineTuningSprucebot/constants/OFF_THE_RAILS_CONVERSATIONS.js +32 -0
- package/build/esm/fineTuningSprucebot/constants/TOPICS.d.ts +2 -0
- package/build/esm/fineTuningSprucebot/constants/TOPICS.js +314 -0
- package/build/esm/fineTuningSprucebot/generateSamples.d.ts +1 -0
- package/build/esm/fineTuningSprucebot/generateSamples.js +41 -0
- package/build/esm/fineTuningSprucebot/support.d.ts +12 -0
- package/build/esm/fineTuningSprucebot/support.js +60 -0
- package/build/esm/fineTuningSprucebot/types.d.ts +15 -0
- package/build/esm/fineTuningSprucebot/types.js +1 -0
- package/build/esm/index.d.ts +10 -0
- package/build/esm/index.js +10 -0
- package/build/esm/llm.types.d.ts +84 -0
- package/build/esm/llm.types.js +6 -0
- package/build/esm/parsingResponses/ResponseParser.d.ts +18 -0
- package/build/esm/parsingResponses/ResponseParser.js +115 -0
- package/build/esm/parsingResponses/renderPlaceholder.d.ts +1 -0
- package/build/esm/parsingResponses/renderPlaceholder.js +4 -0
- package/build/esm/tests/MockLlmSkill.d.ts +14 -0
- package/build/esm/tests/MockLlmSkill.js +60 -0
- package/build/esm/tests/SpyAdapter.d.ts +9 -0
- package/build/esm/tests/SpyAdapter.js +24 -0
- package/build/esm/tests/SpyLlmBot.d.ts +12 -0
- package/build/esm/tests/SpyLlmBot.js +20 -0
- package/build/examples/buildCallbackSkill.js +0 -1
- package/build/examples/buildFileTransformerSkill.js +0 -1
- package/build/examples/buildJokeSkill.js +0 -1
- package/build/examples/buildProfileSkill.js +0 -1
- package/build/examples/buildReceptionistSkill.js +0 -1
- package/build/fineTuningSprucebot/constants/DIRECTORY_SHARES.js +0 -1
- package/build/fineTuningSprucebot/constants/FIRST_MESSAGES.js +0 -1
- package/build/fineTuningSprucebot/constants/GREETINGS.js +0 -1
- package/build/fineTuningSprucebot/constants/OFF_THE_RAILS_CONVERSATIONS.js +0 -1
- package/build/fineTuningSprucebot/constants/TOPICS.js +0 -1
- package/build/fineTuningSprucebot/generateSamples.js +0 -1
- package/build/fineTuningSprucebot/support.js +0 -1
- package/build/fineTuningSprucebot/types.js +0 -1
- package/build/index.js +0 -1
- package/build/llm.types.js +0 -1
- package/build/parsingResponses/ResponseParser.js +0 -1
- package/build/parsingResponses/renderPlaceholder.js +0 -1
- package/build/tests/MockLlmSkill.js +0 -1
- package/build/tests/SpyAdapter.d.ts +1 -0
- package/build/tests/SpyAdapter.js +3 -1
- package/build/tests/SpyLlmBot.js +0 -1
- package/package.json +1 -1
- package/build/.spruce/errors/errors.types.js.map +0 -1
- package/build/.spruce/errors/options.types.js.map +0 -1
- package/build/.spruce/errors/sprucebotLlm/callbackError.schema.js.map +0 -1
- package/build/.spruce/errors/sprucebotLlm/invalidCallback.schema.js.map +0 -1
- package/build/.spruce/errors/sprucebotLlm/noBotInstanceSet.schema.js.map +0 -1
- package/build/.spruce/event-cache.json +0 -1
- package/build/.spruce/schemas/fields/fieldClassMap.js.map +0 -1
- package/build/.spruce/schemas/fields/fields.types.js.map +0 -1
- package/build/__tests__/behavioral/LlmBot.test.d.ts +0 -55
- package/build/__tests__/behavioral/LlmBot.test.js +0 -607
- package/build/__tests__/behavioral/LlmBot.test.js.map +0 -1
- package/build/__tests__/behavioral/SprucebotLlmFactory.test.d.ts +0 -16
- package/build/__tests__/behavioral/SprucebotLlmFactory.test.js +0 -132
- package/build/__tests__/behavioral/SprucebotLlmFactory.test.js.map +0 -1
- package/build/__tests__/behavioral/adapters/OpenAi.test.d.ts +0 -52
- package/build/__tests__/behavioral/adapters/OpenAi.test.js +0 -699
- package/build/__tests__/behavioral/adapters/OpenAi.test.js.map +0 -1
- package/build/__tests__/behavioral/prompts/PromptGenerator.test.d.ts +0 -20
- package/build/__tests__/behavioral/prompts/PromptGenerator.test.js +0 -211
- package/build/__tests__/behavioral/prompts/PromptGenerator.test.js.map +0 -1
- package/build/__tests__/behavioral/prompts/ResponseParser.test.d.ts +0 -35
- package/build/__tests__/behavioral/prompts/ResponseParser.test.js +0 -312
- package/build/__tests__/behavioral/prompts/ResponseParser.test.js.map +0 -1
- package/build/__tests__/behavioral/skills/Skill.test.d.ts +0 -19
- package/build/__tests__/behavioral/skills/Skill.test.js +0 -188
- package/build/__tests__/behavioral/skills/Skill.test.js.map +0 -1
- package/build/__tests__/behavioral/testing/MockLlmSkill.test.d.ts +0 -37
- package/build/__tests__/behavioral/testing/MockLlmSkill.test.js +0 -340
- package/build/__tests__/behavioral/testing/MockLlmSkill.test.js.map +0 -1
- package/build/__tests__/behavioral/testing/SpyLlmBot.test.d.ts +0 -4
- package/build/__tests__/behavioral/testing/SpyLlmBot.test.js +0 -34
- package/build/__tests__/behavioral/testing/SpyLlmBot.test.js.map +0 -1
- package/build/__tests__/support/AbstractLlmTest.d.ts +0 -14
- package/build/__tests__/support/AbstractLlmTest.js +0 -67
- package/build/__tests__/support/AbstractLlmTest.js.map +0 -1
- package/build/__tests__/support/schemas/carSchema.d.ts +0 -16
- package/build/__tests__/support/schemas/carSchema.js +0 -19
- package/build/__tests__/support/schemas/carSchema.js.map +0 -1
- package/build/__tests__/support/schemas/personSchema.d.ts +0 -23
- package/build/__tests__/support/schemas/personSchema.js +0 -37
- package/build/__tests__/support/schemas/personSchema.js.map +0 -1
- package/build/__tests__/support/schemas/personWithDefaultsSchema.d.ts +0 -13
- package/build/__tests__/support/schemas/personWithDefaultsSchema.js +0 -18
- package/build/__tests__/support/schemas/personWithDefaultsSchema.js.map +0 -1
- package/build/bots/PromptGenerator.js.map +0 -1
- package/build/bots/SprucebotLlmBotImpl.js.map +0 -1
- package/build/bots/SprucebotLlmFactory.js.map +0 -1
- package/build/bots/SprucebotLlmSkillImpl.js.map +0 -1
- package/build/bots/adapters/OpenAi.js.map +0 -1
- package/build/bots/adapters/OpenAiMessageBuilder.js.map +0 -1
- package/build/bots/adapters/SpyOpenAiApi.js.map +0 -1
- package/build/bots/templates.js.map +0 -1
- package/build/chat.js.map +0 -1
- package/build/chatWithImages.js.map +0 -1
- package/build/errors/SpruceError.js.map +0 -1
- package/build/errors/callbackError.builder.js.map +0 -1
- package/build/errors/invalidCallback.builder.js.map +0 -1
- package/build/errors/noBotInstanceSet.builder.js.map +0 -1
- package/build/examples/buildCallbackSkill.js.map +0 -1
- package/build/examples/buildFileTransformerSkill.js.map +0 -1
- package/build/examples/buildJokeSkill.js.map +0 -1
- package/build/examples/buildProfileSkill.js.map +0 -1
- package/build/examples/buildReceptionistSkill.js.map +0 -1
- package/build/fineTuningSprucebot/constants/DIRECTORY_SHARES.js.map +0 -1
- package/build/fineTuningSprucebot/constants/FIRST_MESSAGES.js.map +0 -1
- package/build/fineTuningSprucebot/constants/GREETINGS.js.map +0 -1
- package/build/fineTuningSprucebot/constants/OFF_THE_RAILS_CONVERSATIONS.js.map +0 -1
- package/build/fineTuningSprucebot/constants/TOPICS.js.map +0 -1
- package/build/fineTuningSprucebot/generateSamples.js.map +0 -1
- package/build/fineTuningSprucebot/support.js.map +0 -1
- package/build/fineTuningSprucebot/types.js.map +0 -1
- package/build/index.js.map +0 -1
- package/build/llm.types.js.map +0 -1
- package/build/parsingResponses/ResponseParser.js.map +0 -1
- package/build/parsingResponses/renderPlaceholder.js.map +0 -1
- package/build/tests/MockLlmSkill.js.map +0 -1
- package/build/tests/SpyAdapter.js.map +0 -1
- package/build/tests/SpyLlmBot.js.map +0 -1
package/build/bots/templates.js
CHANGED
package/build/chat.js
CHANGED
package/build/chatWithImages.js
CHANGED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { default as SchemaEntity } from '@sprucelabs/schema';
|
|
2
|
+
import * as SpruceSchema from '@sprucelabs/schema';
|
|
3
|
+
export declare namespace SpruceErrors.SprucebotLlm {
|
|
4
|
+
interface NoBotInstanceSet {
|
|
5
|
+
}
|
|
6
|
+
interface NoBotInstanceSetSchema extends SpruceSchema.Schema {
|
|
7
|
+
id: 'noBotInstanceSet';
|
|
8
|
+
namespace: 'SprucebotLlm';
|
|
9
|
+
name: 'No bot instance set';
|
|
10
|
+
fields: {};
|
|
11
|
+
}
|
|
12
|
+
type NoBotInstanceSetEntity = SchemaEntity<SpruceErrors.SprucebotLlm.NoBotInstanceSetSchema>;
|
|
13
|
+
}
|
|
14
|
+
export declare namespace SpruceErrors.SprucebotLlm {
|
|
15
|
+
interface InvalidCallback {
|
|
16
|
+
'validCallbacks': string[];
|
|
17
|
+
'matchedCallback': string;
|
|
18
|
+
}
|
|
19
|
+
interface InvalidCallbackSchema extends SpruceSchema.Schema {
|
|
20
|
+
id: 'invalidCallback';
|
|
21
|
+
namespace: 'SprucebotLlm';
|
|
22
|
+
name: 'Invalid callback';
|
|
23
|
+
fields: {
|
|
24
|
+
/** . */
|
|
25
|
+
'validCallbacks': {
|
|
26
|
+
type: 'text';
|
|
27
|
+
isRequired: true;
|
|
28
|
+
isArray: true;
|
|
29
|
+
minArrayLength: 0;
|
|
30
|
+
options: undefined;
|
|
31
|
+
};
|
|
32
|
+
/** . */
|
|
33
|
+
'matchedCallback': {
|
|
34
|
+
type: 'text';
|
|
35
|
+
isRequired: true;
|
|
36
|
+
options: undefined;
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
type InvalidCallbackEntity = SchemaEntity<SpruceErrors.SprucebotLlm.InvalidCallbackSchema>;
|
|
41
|
+
}
|
|
42
|
+
export declare namespace SpruceErrors.SprucebotLlm {
|
|
43
|
+
interface CallbackError {
|
|
44
|
+
}
|
|
45
|
+
interface CallbackErrorSchema extends SpruceSchema.Schema {
|
|
46
|
+
id: 'callbackError';
|
|
47
|
+
namespace: 'SprucebotLlm';
|
|
48
|
+
name: 'Callback error';
|
|
49
|
+
fields: {};
|
|
50
|
+
}
|
|
51
|
+
type CallbackErrorEntity = SchemaEntity<SpruceErrors.SprucebotLlm.CallbackErrorSchema>;
|
|
52
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { SpruceErrors } from "./errors.types";
|
|
2
|
+
import { ErrorOptions as ISpruceErrorOptions } from "@sprucelabs/error";
|
|
3
|
+
export interface NoBotInstanceSetErrorOptions extends SpruceErrors.SprucebotLlm.NoBotInstanceSet, ISpruceErrorOptions {
|
|
4
|
+
code: 'NO_BOT_INSTANCE_SET';
|
|
5
|
+
}
|
|
6
|
+
export interface InvalidCallbackErrorOptions extends SpruceErrors.SprucebotLlm.InvalidCallback, ISpruceErrorOptions {
|
|
7
|
+
code: 'INVALID_CALLBACK';
|
|
8
|
+
}
|
|
9
|
+
export interface CallbackErrorErrorOptions extends SpruceErrors.SprucebotLlm.CallbackError, ISpruceErrorOptions {
|
|
10
|
+
code: 'CALLBACK_ERROR';
|
|
11
|
+
}
|
|
12
|
+
type ErrorOptions = NoBotInstanceSetErrorOptions | InvalidCallbackErrorOptions | CallbackErrorErrorOptions;
|
|
13
|
+
export default ErrorOptions;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { LlmMessage, SprucebotLlmBot } from '../llm.types';
|
|
2
|
+
export default class PromptGenerator {
|
|
3
|
+
private bot;
|
|
4
|
+
private eta;
|
|
5
|
+
private log;
|
|
6
|
+
static Class?: typeof PromptGenerator;
|
|
7
|
+
private promptTemplate;
|
|
8
|
+
protected constructor(bot: SprucebotLlmBot, options?: PromptGeneratorOptions);
|
|
9
|
+
static Generator(bot: SprucebotLlmBot, options?: PromptGeneratorOptions): PromptGenerator;
|
|
10
|
+
generate(): Promise<string>;
|
|
11
|
+
private stringifyState;
|
|
12
|
+
}
|
|
13
|
+
export declare function setUndefinedToNull(obj: Record<string, any>): void;
|
|
14
|
+
export interface TemplateContext {
|
|
15
|
+
youAre: string;
|
|
16
|
+
messages: LlmMessage[];
|
|
17
|
+
stateSchemaJson?: string;
|
|
18
|
+
stateJson?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface PromptGeneratorOptions {
|
|
21
|
+
promptTemplate?: string;
|
|
22
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
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, normalizeSchemaValues, } from '@sprucelabs/schema';
|
|
22
|
+
import { Eta } from 'eta';
|
|
23
|
+
import { PROMPT_TEMPLATE } from './templates.js';
|
|
24
|
+
export default class PromptGenerator {
|
|
25
|
+
constructor(bot, options) {
|
|
26
|
+
var _a;
|
|
27
|
+
this.eta = new Eta();
|
|
28
|
+
this.log = process.env.SHOULD_LOG_GENERATED_PROMPTS === 'true'
|
|
29
|
+
? console.info
|
|
30
|
+
: () => { };
|
|
31
|
+
assertOptions({ bot }, ['bot']);
|
|
32
|
+
this.bot = bot;
|
|
33
|
+
this.promptTemplate = (_a = options === null || options === void 0 ? void 0 : options.promptTemplate) !== null && _a !== void 0 ? _a : PROMPT_TEMPLATE;
|
|
34
|
+
}
|
|
35
|
+
static Generator(bot, options) {
|
|
36
|
+
var _a;
|
|
37
|
+
return new ((_a = this.Class) !== null && _a !== void 0 ? _a : PromptGenerator)(bot, options);
|
|
38
|
+
}
|
|
39
|
+
generate() {
|
|
40
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
41
|
+
const _a = this.bot.serialize(), { stateSchema, state } = _a, rest = __rest(_a, ["stateSchema", "state"]);
|
|
42
|
+
const { stateSchemaJson, stateJson } = this.stringifyState(stateSchema, state);
|
|
43
|
+
const rendered = yield this.eta.renderStringAsync(this.promptTemplate, Object.assign({ stateSchemaJson,
|
|
44
|
+
stateJson }, rest));
|
|
45
|
+
this.log('Generated prompt:', rendered);
|
|
46
|
+
return rendered;
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
stringifyState(stateSchema, state) {
|
|
50
|
+
if (!stateSchema) {
|
|
51
|
+
return {
|
|
52
|
+
stateSchemaJson: null,
|
|
53
|
+
stateJson: null,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
const normalizedState = normalizeSchemaValues(stateSchema, state !== null && state !== void 0 ? state : {}, {});
|
|
57
|
+
setUndefinedToNull(normalizedState);
|
|
58
|
+
const stateSchemaJson = JSON.stringify(stateSchema);
|
|
59
|
+
const stateJson = JSON.stringify(normalizedState);
|
|
60
|
+
return { stateSchemaJson, stateJson };
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
export function setUndefinedToNull(obj) {
|
|
64
|
+
for (const key in obj) {
|
|
65
|
+
if (obj.hasOwnProperty(key)) {
|
|
66
|
+
if (obj[key] === undefined) {
|
|
67
|
+
obj[key] = null;
|
|
68
|
+
}
|
|
69
|
+
else if (typeof obj[key] === 'object') {
|
|
70
|
+
setUndefinedToNull(obj[key]);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { AbstractEventEmitter } from '@sprucelabs/mercury-event-emitter';
|
|
2
|
+
import { Schema, SchemaValues } from '@sprucelabs/schema';
|
|
3
|
+
import { BotOptions, LlmAdapter, LlmEventContract, LlmMessage, MessageResponseCallback, SendMessage, SerializedBot, SprucebotLlmBot, SprucebotLLmSkill } from '../llm.types';
|
|
4
|
+
export default class SprucebotLlmBotImpl<StateSchema extends Schema = Schema, State extends SchemaValues<StateSchema> = SchemaValues<StateSchema>> extends AbstractEventEmitter<LlmEventContract> implements SprucebotLlmBot<StateSchema, State> {
|
|
5
|
+
static messageMemoryLimit: number;
|
|
6
|
+
protected adapter: LlmAdapter;
|
|
7
|
+
private youAre;
|
|
8
|
+
private stateSchema?;
|
|
9
|
+
protected state?: Partial<State>;
|
|
10
|
+
private isDone;
|
|
11
|
+
protected messages: LlmMessage[];
|
|
12
|
+
protected skill?: SprucebotLLmSkill;
|
|
13
|
+
constructor(options: BotOptions<StateSchema, State>);
|
|
14
|
+
clearMessageHistory(): void;
|
|
15
|
+
markAsDone(): void;
|
|
16
|
+
getIsDone(): boolean;
|
|
17
|
+
serialize(): SerializedBot<StateSchema, State>;
|
|
18
|
+
sendMessage(message: SendMessage, cb?: MessageResponseCallback): Promise<string>;
|
|
19
|
+
private _sendMessageInternal;
|
|
20
|
+
private optionallyUpdateState;
|
|
21
|
+
private parseResponse;
|
|
22
|
+
private sendMessageToAdapter;
|
|
23
|
+
private trackMessage;
|
|
24
|
+
updateState(newState: Partial<State>): Promise<void>;
|
|
25
|
+
setSkill(skill: SprucebotLLmSkill<any>): void;
|
|
26
|
+
}
|
|
@@ -0,0 +1,163 @@
|
|
|
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 { AbstractEventEmitter } from '@sprucelabs/mercury-event-emitter';
|
|
11
|
+
import { assertOptions, defaultSchemaValues, } from '@sprucelabs/schema';
|
|
12
|
+
import { llmEventContract, } from '../llm.types.js';
|
|
13
|
+
import ResponseParser from '../parsingResponses/ResponseParser.js';
|
|
14
|
+
class SprucebotLlmBotImpl extends AbstractEventEmitter {
|
|
15
|
+
constructor(options) {
|
|
16
|
+
const { adapter, youAre, stateSchema, state, skill } = options;
|
|
17
|
+
super(llmEventContract);
|
|
18
|
+
this.isDone = false;
|
|
19
|
+
this.messages = [];
|
|
20
|
+
this.adapter = adapter;
|
|
21
|
+
this.youAre = youAre;
|
|
22
|
+
this.stateSchema = stateSchema;
|
|
23
|
+
this.skill = skill;
|
|
24
|
+
this.state = stateSchema
|
|
25
|
+
? Object.assign(Object.assign({}, defaultSchemaValues(stateSchema)), state)
|
|
26
|
+
: undefined;
|
|
27
|
+
}
|
|
28
|
+
clearMessageHistory() {
|
|
29
|
+
this.messages = [];
|
|
30
|
+
}
|
|
31
|
+
markAsDone() {
|
|
32
|
+
this.isDone = true;
|
|
33
|
+
}
|
|
34
|
+
getIsDone() {
|
|
35
|
+
return this.isDone;
|
|
36
|
+
}
|
|
37
|
+
serialize() {
|
|
38
|
+
var _a, _b, _c;
|
|
39
|
+
const skill = (_a = this.skill) === null || _a === void 0 ? void 0 : _a.serialize();
|
|
40
|
+
return {
|
|
41
|
+
youAre: this.youAre,
|
|
42
|
+
stateSchema: (_b = this.stateSchema) !== null && _b !== void 0 ? _b : skill === null || skill === void 0 ? void 0 : skill.stateSchema,
|
|
43
|
+
state: (_c = this.state) !== null && _c !== void 0 ? _c : skill === null || skill === void 0 ? void 0 : skill.state,
|
|
44
|
+
messages: this.messages,
|
|
45
|
+
skill,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
sendMessage(message, cb) {
|
|
49
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
50
|
+
assertOptions({ message }, ['message']);
|
|
51
|
+
const llmMessage = {
|
|
52
|
+
from: 'Me',
|
|
53
|
+
message: '',
|
|
54
|
+
};
|
|
55
|
+
if (typeof message === 'string') {
|
|
56
|
+
llmMessage.message = message;
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
llmMessage.message = message.imageDescription;
|
|
60
|
+
llmMessage.imageBase64 = message.imageBase64;
|
|
61
|
+
}
|
|
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,
|
|
98
|
+
});
|
|
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;
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
optionallyUpdateState(state) {
|
|
121
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
122
|
+
var _a;
|
|
123
|
+
if (this.stateSchema && state) {
|
|
124
|
+
yield this.updateState(state);
|
|
125
|
+
}
|
|
126
|
+
else if (state) {
|
|
127
|
+
yield ((_a = this.skill) === null || _a === void 0 ? void 0 : _a.updateState(state));
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
}
|
|
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
|
+
trackMessage(m) {
|
|
146
|
+
if (this.messages.length === SprucebotLlmBotImpl.messageMemoryLimit) {
|
|
147
|
+
this.messages.shift();
|
|
148
|
+
}
|
|
149
|
+
this.messages.push(m);
|
|
150
|
+
}
|
|
151
|
+
updateState(newState) {
|
|
152
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
153
|
+
this.state = Object.assign(Object.assign({}, this.state), newState);
|
|
154
|
+
yield this.emit('did-update-state');
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
setSkill(skill) {
|
|
158
|
+
this.skill = skill;
|
|
159
|
+
this.isDone = false;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
SprucebotLlmBotImpl.messageMemoryLimit = 10;
|
|
163
|
+
export default SprucebotLlmBotImpl;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { BotOptions, LlmAdapter, SkillOptions, SprucebotLlmBot, SprucebotLLmSkill } from '../llm.types';
|
|
2
|
+
export default class SprucebotLlmFactory {
|
|
3
|
+
protected adapter: LlmAdapter;
|
|
4
|
+
private instance?;
|
|
5
|
+
static FactoryClass?: typeof SprucebotLlmFactory;
|
|
6
|
+
static BotClass?: new (options: any) => SprucebotLlmBot;
|
|
7
|
+
static SkillClass?: new (options: any) => SprucebotLLmSkill;
|
|
8
|
+
protected constructor(adapter: LlmAdapter);
|
|
9
|
+
Bot(options: Omit<BotOptions, 'adapter'>): SprucebotLlmBot;
|
|
10
|
+
Skill(options: SkillOptions): SprucebotLLmSkill;
|
|
11
|
+
getBotInstance(): SprucebotLlmBot<import("@sprucelabs/schema").Schema, Pick<import("@sprucelabs/schema").SchemaStaticValues<import("@sprucelabs/schema").Schema, false, never, import("@sprucelabs/schema").StaticSchemaAllValues<import("@sprucelabs/schema").Schema, false>>, never>>;
|
|
12
|
+
setBotInstance(bot: SprucebotLlmBot): void;
|
|
13
|
+
static Factory(adapter: LlmAdapter): SprucebotLlmFactory;
|
|
14
|
+
static reset(): void;
|
|
15
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { assertOptions } from '@sprucelabs/schema';
|
|
2
|
+
import SpruceError from '../errors/SpruceError.js';
|
|
3
|
+
import SprucebotLlmBotImpl from './SprucebotLlmBotImpl.js';
|
|
4
|
+
import SprucebotLlmSkillImpl from './SprucebotLlmSkillImpl.js';
|
|
5
|
+
export default class SprucebotLlmFactory {
|
|
6
|
+
constructor(adapter) {
|
|
7
|
+
this.adapter = adapter;
|
|
8
|
+
}
|
|
9
|
+
Bot(options) {
|
|
10
|
+
var _a;
|
|
11
|
+
assertOptions(options, ['youAre']);
|
|
12
|
+
const { Class } = options;
|
|
13
|
+
return new ((_a = Class !== null && Class !== void 0 ? Class : SprucebotLlmFactory.BotClass) !== null && _a !== void 0 ? _a : SprucebotLlmBotImpl)(Object.assign(Object.assign({}, options), { adapter: this.adapter }));
|
|
14
|
+
}
|
|
15
|
+
Skill(options) {
|
|
16
|
+
var _a;
|
|
17
|
+
assertOptions(options, ['yourJobIfYouChooseToAcceptItIs']);
|
|
18
|
+
return new ((_a = SprucebotLlmFactory.SkillClass) !== null && _a !== void 0 ? _a : SprucebotLlmSkillImpl)(Object.assign({}, options));
|
|
19
|
+
}
|
|
20
|
+
getBotInstance() {
|
|
21
|
+
if (!this.instance) {
|
|
22
|
+
throw new SpruceError({
|
|
23
|
+
code: 'NO_BOT_INSTANCE_SET',
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
return this.instance;
|
|
27
|
+
}
|
|
28
|
+
setBotInstance(bot) {
|
|
29
|
+
this.instance = bot;
|
|
30
|
+
}
|
|
31
|
+
static Factory(adapter) {
|
|
32
|
+
var _a;
|
|
33
|
+
assertOptions({ adapter }, ['adapter']);
|
|
34
|
+
return new ((_a = this.FactoryClass) !== null && _a !== void 0 ? _a : this)(adapter);
|
|
35
|
+
}
|
|
36
|
+
static reset() {
|
|
37
|
+
this.BotClass = undefined;
|
|
38
|
+
this.FactoryClass = undefined;
|
|
39
|
+
this.SkillClass = undefined;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { AbstractEventEmitter } from '@sprucelabs/mercury-event-emitter';
|
|
2
|
+
import { Schema, SchemaValues } from '@sprucelabs/schema';
|
|
3
|
+
import { LlmEventContract, SerializedSkill, SkillOptions, SprucebotLLmSkill } from '../llm.types';
|
|
4
|
+
export default class SprucebotLlmSkillImpl<StateSchema extends Schema = Schema, State extends SchemaValues<StateSchema> = SchemaValues<StateSchema>> extends AbstractEventEmitter<LlmEventContract> implements SprucebotLLmSkill<StateSchema, State> {
|
|
5
|
+
protected options: SkillOptions;
|
|
6
|
+
private state?;
|
|
7
|
+
protected stateSchema?: StateSchema;
|
|
8
|
+
constructor(options: SkillOptions<StateSchema, State>);
|
|
9
|
+
updateState(updates: Partial<State>): Promise<void>;
|
|
10
|
+
getState(): Partial<State> | undefined;
|
|
11
|
+
serialize(): SerializedSkill<StateSchema, State>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
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 { AbstractEventEmitter } from '@sprucelabs/mercury-event-emitter';
|
|
22
|
+
import { defaultSchemaValues } from '@sprucelabs/schema';
|
|
23
|
+
import { llmEventContract, } from '../llm.types.js';
|
|
24
|
+
export default class SprucebotLlmSkillImpl extends AbstractEventEmitter {
|
|
25
|
+
constructor(options) {
|
|
26
|
+
super(llmEventContract);
|
|
27
|
+
this.state = {};
|
|
28
|
+
const _a = options !== null && options !== void 0 ? options : {}, { state, stateSchema } = _a, rest = __rest(_a, ["state", "stateSchema"]);
|
|
29
|
+
this.options = Object.assign(Object.assign({}, rest), { stateSchema });
|
|
30
|
+
this.stateSchema = stateSchema;
|
|
31
|
+
this.state = stateSchema
|
|
32
|
+
? Object.assign(Object.assign({}, defaultSchemaValues(stateSchema)), state)
|
|
33
|
+
: undefined;
|
|
34
|
+
}
|
|
35
|
+
updateState(updates) {
|
|
36
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
37
|
+
yield this.emit('did-update-state');
|
|
38
|
+
this.state = Object.assign(Object.assign({}, this.state), updates);
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
getState() {
|
|
42
|
+
return this.state;
|
|
43
|
+
}
|
|
44
|
+
serialize() {
|
|
45
|
+
return Object.assign(Object.assign({}, this.options), { stateSchema: this.stateSchema, state: this.state });
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import OpenAI from 'openai';
|
|
2
|
+
import { LlmAdapter, SendMessageOptions, SprucebotLlmBot } from '../../llm.types';
|
|
3
|
+
export default class OpenAiAdapter implements LlmAdapter {
|
|
4
|
+
static OpenAI: typeof OpenAI;
|
|
5
|
+
private api;
|
|
6
|
+
private log;
|
|
7
|
+
protected constructor(apiKey: string);
|
|
8
|
+
static Adapter(apiKey: string): OpenAiAdapter;
|
|
9
|
+
sendMessage(bot: SprucebotLlmBot, options?: SendMessageOptions): Promise<string>;
|
|
10
|
+
}
|
|
11
|
+
export declare const MESSAGE_RESPONSE_ERROR_MESSAGE = "Oh no! Something went wrong and I can't talk right now!";
|