@sprucelabs/sprucebot-llm 13.1.9 → 13.2.0

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.
@@ -0,0 +1,17 @@
1
+ import { Schema } from '@sprucelabs/schema';
2
+ import Anthropic from '@anthropic-ai/sdk';
3
+ import { LlmAdapter, SprucebotLlmBot, SendMessageOptions, LllmReasoningEffort } from '../../llm.types';
4
+ export default class AthropicAdapter implements LlmAdapter {
5
+ static Anthropic: typeof Anthropic;
6
+ private api;
7
+ private model;
8
+ private maxTokens;
9
+ private sender;
10
+ constructor(apiKey: string, options: {
11
+ maxTokens: number;
12
+ });
13
+ sendMessage(bot: SprucebotLlmBot<Schema>, options?: SendMessageOptions): Promise<string>;
14
+ private sendHandler;
15
+ setModel(model: string): void;
16
+ setReasoningEffort(_effort: LllmReasoningEffort): void;
17
+ }
@@ -0,0 +1,50 @@
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 schema_1 = require("@sprucelabs/schema");
7
+ const sdk_1 = __importDefault(require("@anthropic-ai/sdk"));
8
+ const MessageSender_1 = __importDefault(require("./MessageSender"));
9
+ class AthropicAdapter {
10
+ constructor(apiKey, options) {
11
+ this.model = 'claude-sonnet-4-5';
12
+ (0, schema_1.assertOptions)({ apiKey, maxTokens: options?.maxTokens }, [
13
+ 'apiKey',
14
+ 'maxTokens',
15
+ ]);
16
+ this.api = new AthropicAdapter.Anthropic({ apiKey });
17
+ this.maxTokens = options.maxTokens;
18
+ this.sender = MessageSender_1.default.Sender(this.sendHandler.bind(this));
19
+ }
20
+ async sendMessage(bot, options) {
21
+ const text = await this.sender.sendMessage(bot, {
22
+ model: this.model,
23
+ ...options,
24
+ });
25
+ return text;
26
+ }
27
+ async sendHandler(params, sendOptions) {
28
+ const { messages: openAiMessages, model } = params;
29
+ const messages = [];
30
+ for (const msg of openAiMessages) {
31
+ messages.push({
32
+ role: msg.role === 'assistant' ? 'assistant' : 'user',
33
+ content: msg.content,
34
+ });
35
+ }
36
+ const response = await this.api.messages.create({
37
+ max_tokens: this.maxTokens,
38
+ model,
39
+ messages,
40
+ }, sendOptions);
41
+ const text = response.content?.[0]?.text;
42
+ return text;
43
+ }
44
+ setModel(model) {
45
+ this.model = model;
46
+ }
47
+ setReasoningEffort(_effort) { }
48
+ }
49
+ AthropicAdapter.Anthropic = sdk_1.default;
50
+ exports.default = AthropicAdapter;
@@ -0,0 +1,33 @@
1
+ import { Log } from '@sprucelabs/spruce-skill-utils';
2
+ import OpenAI from 'openai';
3
+ import { RequestOptions } from 'openai/internal/request-options';
4
+ import { ReasoningEffort, ChatCompletionCreateParamsNonStreaming } from 'openai/resources';
5
+ import { SprucebotLlmBot, SendMessageOptions } from '../../llm.types';
6
+ export default class MessageSenderImpl implements MessageSender {
7
+ static AbortController: {
8
+ new (): AbortController;
9
+ prototype: AbortController;
10
+ };
11
+ private log?;
12
+ private lastAbortController?;
13
+ private sendHandler;
14
+ private constructor();
15
+ static Sender(send: MessageSenderSendHandler, log?: Log): MessageSender;
16
+ sendMessage(bot: SprucebotLlmBot, options: MessageSenderSendMessageOptions): Promise<string>;
17
+ private send;
18
+ }
19
+ export type MessageSenderSendOptions = SendMessageOptions & {
20
+ messages: OpenAI.Chat.Completions.ChatCompletionMessageParam[];
21
+ reasoningEffort?: ReasoningEffort;
22
+ model: string;
23
+ abortController: AbortController;
24
+ };
25
+ export type MessageSenderSendHandler = (params: ChatCompletionCreateParamsNonStreaming, options: RequestOptions) => Promise<string | undefined>;
26
+ export interface MessageSender {
27
+ sendMessage(bot: SprucebotLlmBot, options: MessageSenderSendMessageOptions): Promise<string>;
28
+ }
29
+ export type MessageSenderSendMessageOptions = SendMessageOptions & {
30
+ memoryLimit?: number;
31
+ reasoningEffort?: ReasoningEffort;
32
+ model: string;
33
+ };
@@ -0,0 +1,60 @@
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 openai_1 = require("openai");
7
+ const OpenAiAdapter_1 = require("./OpenAiAdapter");
8
+ const OpenAiMessageBuilder_1 = __importDefault(require("./OpenAiMessageBuilder"));
9
+ class MessageSenderImpl {
10
+ constructor(send, log) {
11
+ this.log = log;
12
+ this.sendHandler = send;
13
+ }
14
+ static Sender(send, log) {
15
+ return new this(send, log);
16
+ }
17
+ async sendMessage(bot, options) {
18
+ const { memoryLimit, ...rest } = options;
19
+ const messageBuilder = OpenAiMessageBuilder_1.default.Builder(bot, {
20
+ memoryLimit,
21
+ });
22
+ const messages = messageBuilder.buildMessages();
23
+ this.log?.info('Sending message', JSON.stringify(messages, null, 2));
24
+ try {
25
+ this.lastAbortController?.abort('Interrupted by new message');
26
+ this.lastAbortController = new MessageSenderImpl.AbortController();
27
+ const response = await this.send({
28
+ messages,
29
+ ...rest,
30
+ abortController: this.lastAbortController,
31
+ });
32
+ delete this.lastAbortController;
33
+ const message = response ?? OpenAiAdapter_1.MESSAGE_RESPONSE_ERROR_MESSAGE;
34
+ this.log?.info('Received response', message);
35
+ return message;
36
+ }
37
+ catch (err) {
38
+ if (err instanceof openai_1.APIUserAbortError) {
39
+ this.log?.info('Request was aborted');
40
+ return '';
41
+ }
42
+ throw err;
43
+ }
44
+ }
45
+ async send(options) {
46
+ const { abortController, reasoningEffort, ...restOptions } = options;
47
+ const params = {
48
+ ...restOptions,
49
+ };
50
+ if (reasoningEffort) {
51
+ params.reasoning_effort = reasoningEffort;
52
+ }
53
+ const response = await this.sendHandler(params, {
54
+ signal: abortController.signal,
55
+ });
56
+ return response;
57
+ }
58
+ }
59
+ MessageSenderImpl.AbortController = AbortController;
60
+ exports.default = MessageSenderImpl;
@@ -5,19 +5,15 @@ import { LlmAdapter, SendMessageOptions, SprucebotLlmBot } from '../../llm.types
5
5
  export default class OpenAiAdapter implements LlmAdapter {
6
6
  static Class: new (apiKey: string, options?: OpenAiAdapterOptions) => OpenAiAdapter;
7
7
  static OpenAI: typeof OpenAI;
8
- static AbortController: {
9
- new (): AbortController;
10
- prototype: AbortController;
11
- };
12
8
  private api;
13
- private log?;
14
9
  private model;
15
10
  private memoryLimit?;
16
11
  private reasoningEffort?;
17
- private lastAbortController?;
12
+ private sender;
18
13
  protected constructor(apiKey: string, options?: OpenAiAdapterOptions);
19
14
  static Adapter(apiKey: string, options?: OpenAiAdapterOptions): OpenAiAdapter;
20
15
  sendMessage(bot: SprucebotLlmBot, options?: SendMessageOptions): Promise<string>;
16
+ private sendHandler;
21
17
  private getReasoningEffort;
22
18
  setModel(model: string): void;
23
19
  setMessageMemoryLimit(limit: number): void;
@@ -1,93 +1,38 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
36
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
37
4
  };
38
5
  Object.defineProperty(exports, "__esModule", { value: true });
39
6
  exports.MESSAGE_RESPONSE_ERROR_MESSAGE = void 0;
40
7
  const schema_1 = require("@sprucelabs/schema");
41
- const openai_1 = __importStar(require("openai"));
42
- const OpenAiMessageBuilder_1 = __importDefault(require("./OpenAiMessageBuilder"));
8
+ const openai_1 = __importDefault(require("openai"));
9
+ const MessageSender_1 = __importDefault(require("./MessageSender"));
43
10
  class OpenAiAdapter {
44
11
  constructor(apiKey, options) {
45
12
  this.model = 'gpt-4o';
46
13
  (0, schema_1.assertOptions)({ apiKey }, ['apiKey']);
47
14
  const { log, memoryLimit, model, reasoningEffort, baseUrl } = options || {};
48
15
  this.api = new OpenAiAdapter.OpenAI({ apiKey, baseURL: baseUrl });
49
- this.log = log;
50
16
  this.memoryLimit = memoryLimit;
51
17
  this.model = model ?? this.model;
52
18
  this.reasoningEffort = reasoningEffort;
19
+ this.sender = MessageSender_1.default.Sender(this.sendHandler.bind(this), log);
53
20
  }
54
21
  static Adapter(apiKey, options) {
55
22
  return new (this.Class ?? this)(apiKey, options);
56
23
  }
57
24
  async sendMessage(bot, options) {
58
- const messageBuilder = OpenAiMessageBuilder_1.default.Builder(bot, {
59
- memoryLimit: this.memoryLimit,
60
- });
61
- const messages = messageBuilder.buildMessages();
62
- this.log?.info('Sending message to OpenAI', JSON.stringify(messages, null, 2));
63
- const params = {
64
- messages,
25
+ return this.sender.sendMessage(bot, {
65
26
  model: this.model,
27
+ memoryLimit: this.memoryLimit,
28
+ reasoningEffort: this.getReasoningEffort(),
66
29
  ...options,
67
- };
68
- const reasoningEffort = this.getReasoningEffort();
69
- if (reasoningEffort) {
70
- params.reasoning_effort = reasoningEffort;
71
- }
72
- try {
73
- this.lastAbortController?.abort('Interrupted by new message');
74
- this.lastAbortController = new OpenAiAdapter.AbortController();
75
- const response = await this.api.chat.completions.create(params, {
76
- signal: this.lastAbortController.signal,
77
- });
78
- delete this.lastAbortController;
79
- const message = response.choices?.[0]?.message?.content?.trim() ??
80
- exports.MESSAGE_RESPONSE_ERROR_MESSAGE;
81
- this.log?.info('Received response from OpenAI', message);
82
- return message;
83
- }
84
- catch (err) {
85
- if (err instanceof openai_1.APIUserAbortError) {
86
- this.log?.info('OpenAI request was aborted');
87
- return '';
88
- }
89
- throw err;
90
- }
30
+ });
31
+ }
32
+ async sendHandler(params, sendOptions) {
33
+ const response = await this.api.chat.completions.create(params, sendOptions);
34
+ const responseMessage = response.choices?.[0]?.message?.content?.trim();
35
+ return responseMessage;
91
36
  }
92
37
  getReasoningEffort() {
93
38
  return (this.reasoningEffort ?? process.env.OPENAI_REASONING_EFFORT);
@@ -103,6 +48,5 @@ class OpenAiAdapter {
103
48
  }
104
49
  }
105
50
  OpenAiAdapter.OpenAI = openai_1.default;
106
- OpenAiAdapter.AbortController = AbortController;
107
51
  exports.default = OpenAiAdapter;
108
52
  exports.MESSAGE_RESPONSE_ERROR_MESSAGE = "Oh no! Something went wrong and I can't talk right now!";
@@ -25,7 +25,7 @@ Next steps:
25
25
 
26
26
  1. Don't just takes stabs at it, review the syntax rules for callbacks and make sure your tags are properly formatted.
27
27
  1a. <<callbackName/>> for callbacks with no arguments.
28
- 1b. <<callbackName>>{{JSON arguments}}<</callbackName>> for callbacks with arguments.
28
+ 1b. <<callbackName>>{"valid": "json"}<</callbackName>> for callbacks with arguments.
29
29
  2. Check the list of valid callbacks (below) below to ensure the callback you are trying to invoke actually exists.
30
30
 
31
31
  Valid callbacks:
@@ -0,0 +1,17 @@
1
+ import { Schema } from '@sprucelabs/schema';
2
+ import Anthropic from '@anthropic-ai/sdk';
3
+ import { LlmAdapter, SprucebotLlmBot, SendMessageOptions, LllmReasoningEffort } from '../../llm.types';
4
+ export default class AthropicAdapter implements LlmAdapter {
5
+ static Anthropic: typeof Anthropic;
6
+ private api;
7
+ private model;
8
+ private maxTokens;
9
+ private sender;
10
+ constructor(apiKey: string, options: {
11
+ maxTokens: number;
12
+ });
13
+ sendMessage(bot: SprucebotLlmBot<Schema>, options?: SendMessageOptions): Promise<string>;
14
+ private sendHandler;
15
+ setModel(model: string): void;
16
+ setReasoningEffort(_effort: LllmReasoningEffort): void;
17
+ }
@@ -0,0 +1,56 @@
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 { assertOptions } from '@sprucelabs/schema';
11
+ import Anthropic from '@anthropic-ai/sdk';
12
+ import MessageSenderImpl from './MessageSender.js';
13
+ class AthropicAdapter {
14
+ constructor(apiKey, options) {
15
+ this.model = 'claude-sonnet-4-5';
16
+ assertOptions({ apiKey, maxTokens: options === null || options === void 0 ? void 0 : options.maxTokens }, [
17
+ 'apiKey',
18
+ 'maxTokens',
19
+ ]);
20
+ this.api = new AthropicAdapter.Anthropic({ apiKey });
21
+ this.maxTokens = options.maxTokens;
22
+ this.sender = MessageSenderImpl.Sender(this.sendHandler.bind(this));
23
+ }
24
+ sendMessage(bot, options) {
25
+ return __awaiter(this, void 0, void 0, function* () {
26
+ const text = yield this.sender.sendMessage(bot, Object.assign({ model: this.model }, options));
27
+ return text;
28
+ });
29
+ }
30
+ sendHandler(params, sendOptions) {
31
+ return __awaiter(this, void 0, void 0, function* () {
32
+ var _a, _b;
33
+ const { messages: openAiMessages, model } = params;
34
+ const messages = [];
35
+ for (const msg of openAiMessages) {
36
+ messages.push({
37
+ role: msg.role === 'assistant' ? 'assistant' : 'user',
38
+ content: msg.content,
39
+ });
40
+ }
41
+ const response = yield this.api.messages.create({
42
+ max_tokens: this.maxTokens,
43
+ model,
44
+ messages,
45
+ }, sendOptions);
46
+ const text = (_b = (_a = response.content) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.text;
47
+ return text;
48
+ });
49
+ }
50
+ setModel(model) {
51
+ this.model = model;
52
+ }
53
+ setReasoningEffort(_effort) { }
54
+ }
55
+ AthropicAdapter.Anthropic = Anthropic;
56
+ export default AthropicAdapter;
@@ -0,0 +1,33 @@
1
+ import { Log } from '@sprucelabs/spruce-skill-utils';
2
+ import OpenAI from 'openai';
3
+ import { RequestOptions } from 'openai/internal/request-options';
4
+ import { ReasoningEffort, ChatCompletionCreateParamsNonStreaming } from 'openai/resources';
5
+ import { SprucebotLlmBot, SendMessageOptions } from '../../llm.types';
6
+ export default class MessageSenderImpl implements MessageSender {
7
+ static AbortController: {
8
+ new (): AbortController;
9
+ prototype: AbortController;
10
+ };
11
+ private log?;
12
+ private lastAbortController?;
13
+ private sendHandler;
14
+ private constructor();
15
+ static Sender(send: MessageSenderSendHandler, log?: Log): MessageSender;
16
+ sendMessage(bot: SprucebotLlmBot, options: MessageSenderSendMessageOptions): Promise<string>;
17
+ private send;
18
+ }
19
+ export type MessageSenderSendOptions = SendMessageOptions & {
20
+ messages: OpenAI.Chat.Completions.ChatCompletionMessageParam[];
21
+ reasoningEffort?: ReasoningEffort;
22
+ model: string;
23
+ abortController: AbortController;
24
+ };
25
+ export type MessageSenderSendHandler = (params: ChatCompletionCreateParamsNonStreaming, options: RequestOptions) => Promise<string | undefined>;
26
+ export interface MessageSender {
27
+ sendMessage(bot: SprucebotLlmBot, options: MessageSenderSendMessageOptions): Promise<string>;
28
+ }
29
+ export type MessageSenderSendMessageOptions = SendMessageOptions & {
30
+ memoryLimit?: number;
31
+ reasoningEffort?: ReasoningEffort;
32
+ model: string;
33
+ };
@@ -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 { APIUserAbortError } from 'openai';
22
+ import { MESSAGE_RESPONSE_ERROR_MESSAGE } from './OpenAiAdapter.js';
23
+ import OpenAiMessageBuilder from './OpenAiMessageBuilder.js';
24
+ class MessageSenderImpl {
25
+ constructor(send, log) {
26
+ this.log = log;
27
+ this.sendHandler = send;
28
+ }
29
+ static Sender(send, log) {
30
+ return new this(send, log);
31
+ }
32
+ sendMessage(bot, options) {
33
+ return __awaiter(this, void 0, void 0, function* () {
34
+ var _a, _b, _c, _d;
35
+ const { memoryLimit } = options, rest = __rest(options, ["memoryLimit"]);
36
+ const messageBuilder = OpenAiMessageBuilder.Builder(bot, {
37
+ memoryLimit,
38
+ });
39
+ const messages = messageBuilder.buildMessages();
40
+ (_a = this.log) === null || _a === void 0 ? void 0 : _a.info('Sending message', JSON.stringify(messages, null, 2));
41
+ try {
42
+ (_b = this.lastAbortController) === null || _b === void 0 ? void 0 : _b.abort('Interrupted by new message');
43
+ this.lastAbortController = new MessageSenderImpl.AbortController();
44
+ const response = yield this.send(Object.assign(Object.assign({ messages }, rest), { abortController: this.lastAbortController }));
45
+ delete this.lastAbortController;
46
+ const message = response !== null && response !== void 0 ? response : MESSAGE_RESPONSE_ERROR_MESSAGE;
47
+ (_c = this.log) === null || _c === void 0 ? void 0 : _c.info('Received response', message);
48
+ return message;
49
+ }
50
+ catch (err) {
51
+ if (err instanceof APIUserAbortError) {
52
+ (_d = this.log) === null || _d === void 0 ? void 0 : _d.info('Request was aborted');
53
+ return '';
54
+ }
55
+ throw err;
56
+ }
57
+ });
58
+ }
59
+ send(options) {
60
+ return __awaiter(this, void 0, void 0, function* () {
61
+ const { abortController, reasoningEffort } = options, restOptions = __rest(options, ["abortController", "reasoningEffort"]);
62
+ const params = Object.assign({}, restOptions);
63
+ if (reasoningEffort) {
64
+ params.reasoning_effort = reasoningEffort;
65
+ }
66
+ const response = yield this.sendHandler(params, {
67
+ signal: abortController.signal,
68
+ });
69
+ return response;
70
+ });
71
+ }
72
+ }
73
+ MessageSenderImpl.AbortController = AbortController;
74
+ export default MessageSenderImpl;
@@ -5,19 +5,15 @@ import { LlmAdapter, SendMessageOptions, SprucebotLlmBot } from '../../llm.types
5
5
  export default class OpenAiAdapter implements LlmAdapter {
6
6
  static Class: new (apiKey: string, options?: OpenAiAdapterOptions) => OpenAiAdapter;
7
7
  static OpenAI: typeof OpenAI;
8
- static AbortController: {
9
- new (): AbortController;
10
- prototype: AbortController;
11
- };
12
8
  private api;
13
- private log?;
14
9
  private model;
15
10
  private memoryLimit?;
16
11
  private reasoningEffort?;
17
- private lastAbortController?;
12
+ private sender;
18
13
  protected constructor(apiKey: string, options?: OpenAiAdapterOptions);
19
14
  static Adapter(apiKey: string, options?: OpenAiAdapterOptions): OpenAiAdapter;
20
15
  sendMessage(bot: SprucebotLlmBot, options?: SendMessageOptions): Promise<string>;
16
+ private sendHandler;
21
17
  private getReasoningEffort;
22
18
  setModel(model: string): void;
23
19
  setMessageMemoryLimit(limit: number): void;
@@ -8,18 +8,18 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
8
  });
9
9
  };
10
10
  import { assertOptions } from '@sprucelabs/schema';
11
- import OpenAI, { APIUserAbortError } from 'openai';
12
- import OpenAiMessageBuilder from './OpenAiMessageBuilder.js';
11
+ import OpenAI from 'openai';
12
+ import MessageSenderImpl from './MessageSender.js';
13
13
  class OpenAiAdapter {
14
14
  constructor(apiKey, options) {
15
15
  this.model = 'gpt-4o';
16
16
  assertOptions({ apiKey }, ['apiKey']);
17
17
  const { log, memoryLimit, model, reasoningEffort, baseUrl } = options || {};
18
18
  this.api = new OpenAiAdapter.OpenAI({ apiKey, baseURL: baseUrl });
19
- this.log = log;
20
19
  this.memoryLimit = memoryLimit;
21
20
  this.model = model !== null && model !== void 0 ? model : this.model;
22
21
  this.reasoningEffort = reasoningEffort;
22
+ this.sender = MessageSenderImpl.Sender(this.sendHandler.bind(this), log);
23
23
  }
24
24
  static Adapter(apiKey, options) {
25
25
  var _a;
@@ -27,35 +27,15 @@ class OpenAiAdapter {
27
27
  }
28
28
  sendMessage(bot, options) {
29
29
  return __awaiter(this, void 0, void 0, function* () {
30
- var _a, _b, _c, _d, _e, _f, _g, _h, _j;
31
- const messageBuilder = OpenAiMessageBuilder.Builder(bot, {
32
- memoryLimit: this.memoryLimit,
33
- });
34
- const messages = messageBuilder.buildMessages();
35
- (_a = this.log) === null || _a === void 0 ? void 0 : _a.info('Sending message to OpenAI', JSON.stringify(messages, null, 2));
36
- const params = Object.assign({ messages, model: this.model }, options);
37
- const reasoningEffort = this.getReasoningEffort();
38
- if (reasoningEffort) {
39
- params.reasoning_effort = reasoningEffort;
40
- }
41
- try {
42
- (_b = this.lastAbortController) === null || _b === void 0 ? void 0 : _b.abort('Interrupted by new message');
43
- this.lastAbortController = new OpenAiAdapter.AbortController();
44
- const response = yield this.api.chat.completions.create(params, {
45
- signal: this.lastAbortController.signal,
46
- });
47
- delete this.lastAbortController;
48
- const message = (_g = (_f = (_e = (_d = (_c = response.choices) === null || _c === void 0 ? void 0 : _c[0]) === null || _d === void 0 ? void 0 : _d.message) === null || _e === void 0 ? void 0 : _e.content) === null || _f === void 0 ? void 0 : _f.trim()) !== null && _g !== void 0 ? _g : MESSAGE_RESPONSE_ERROR_MESSAGE;
49
- (_h = this.log) === null || _h === void 0 ? void 0 : _h.info('Received response from OpenAI', message);
50
- return message;
51
- }
52
- catch (err) {
53
- if (err instanceof APIUserAbortError) {
54
- (_j = this.log) === null || _j === void 0 ? void 0 : _j.info('OpenAI request was aborted');
55
- return '';
56
- }
57
- throw err;
58
- }
30
+ return this.sender.sendMessage(bot, Object.assign({ model: this.model, memoryLimit: this.memoryLimit, reasoningEffort: this.getReasoningEffort() }, options));
31
+ });
32
+ }
33
+ sendHandler(params, sendOptions) {
34
+ return __awaiter(this, void 0, void 0, function* () {
35
+ var _a, _b, _c, _d;
36
+ const response = yield this.api.chat.completions.create(params, sendOptions);
37
+ const responseMessage = (_d = (_c = (_b = (_a = response.choices) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.message) === null || _c === void 0 ? void 0 : _c.content) === null || _d === void 0 ? void 0 : _d.trim();
38
+ return responseMessage;
59
39
  });
60
40
  }
61
41
  getReasoningEffort() {
@@ -73,6 +53,5 @@ class OpenAiAdapter {
73
53
  }
74
54
  }
75
55
  OpenAiAdapter.OpenAI = OpenAI;
76
- OpenAiAdapter.AbortController = AbortController;
77
56
  export default OpenAiAdapter;
78
57
  export const MESSAGE_RESPONSE_ERROR_MESSAGE = "Oh no! Something went wrong and I can't talk right now!";
@@ -20,7 +20,7 @@ Next steps:
20
20
 
21
21
  1. Don't just takes stabs at it, review the syntax rules for callbacks and make sure your tags are properly formatted.
22
22
  1a. <<callbackName/>> for callbacks with no arguments.
23
- 1b. <<callbackName>>{{JSON arguments}}<</callbackName>> for callbacks with arguments.
23
+ 1b. <<callbackName>>{"valid": "json"}<</callbackName>> for callbacks with arguments.
24
24
  2. Check the list of valid callbacks (below) below to ensure the callback you are trying to invoke actually exists.
25
25
 
26
26
  Valid callbacks:
@@ -10,3 +10,5 @@ export { default as SpyLlmAdapter } from './tests/SpyAdapter';
10
10
  export { default as SpyOpenAiApi } from './bots/adapters/SpyOpenAiModule';
11
11
  export { default as OllamaAdapter } from './bots/adapters/OllamaAdapter';
12
12
  export * from './bots/adapters/OllamaAdapter';
13
+ export { default as AthropicAdapter } from './bots/adapters/AthropicAdapter';
14
+ export * from './bots/adapters/AthropicAdapter';
@@ -10,3 +10,5 @@ export { default as SpyLlmAdapter } from './tests/SpyAdapter.js';
10
10
  export { default as SpyOpenAiApi } from './bots/adapters/SpyOpenAiModule.js';
11
11
  export { default as OllamaAdapter } from './bots/adapters/OllamaAdapter.js';
12
12
  export * from './bots/adapters/OllamaAdapter.js';
13
+ export { default as AthropicAdapter } from './bots/adapters/AthropicAdapter.js';
14
+ export * from './bots/adapters/AthropicAdapter.js';
package/build/index.d.ts CHANGED
@@ -10,3 +10,5 @@ export { default as SpyLlmAdapter } from './tests/SpyAdapter';
10
10
  export { default as SpyOpenAiApi } from './bots/adapters/SpyOpenAiModule';
11
11
  export { default as OllamaAdapter } from './bots/adapters/OllamaAdapter';
12
12
  export * from './bots/adapters/OllamaAdapter';
13
+ export { default as AthropicAdapter } from './bots/adapters/AthropicAdapter';
14
+ export * from './bots/adapters/AthropicAdapter';
package/build/index.js CHANGED
@@ -17,7 +17,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
17
17
  return (mod && mod.__esModule) ? mod : { "default": mod };
18
18
  };
19
19
  Object.defineProperty(exports, "__esModule", { value: true });
20
- exports.OllamaAdapter = exports.SpyOpenAiApi = exports.SpyLlmAdapter = exports.SpyLllmBot = exports.MockLlmSkill = exports.SprucebotLlmError = exports.OpenAiAdapter = exports.SprucebotLlmSkillImpl = exports.SprucebotLlmBotImpl = exports.SprucebotLlmFactory = void 0;
20
+ exports.AthropicAdapter = exports.OllamaAdapter = exports.SpyOpenAiApi = exports.SpyLlmAdapter = exports.SpyLllmBot = exports.MockLlmSkill = exports.SprucebotLlmError = exports.OpenAiAdapter = exports.SprucebotLlmSkillImpl = exports.SprucebotLlmBotImpl = exports.SprucebotLlmFactory = void 0;
21
21
  var SprucebotLlmFactory_1 = require("./bots/SprucebotLlmFactory");
22
22
  Object.defineProperty(exports, "SprucebotLlmFactory", { enumerable: true, get: function () { return __importDefault(SprucebotLlmFactory_1).default; } });
23
23
  var SprucebotLlmBotImpl_1 = require("./bots/SprucebotLlmBotImpl");
@@ -40,3 +40,6 @@ Object.defineProperty(exports, "SpyOpenAiApi", { enumerable: true, get: function
40
40
  var OllamaAdapter_1 = require("./bots/adapters/OllamaAdapter");
41
41
  Object.defineProperty(exports, "OllamaAdapter", { enumerable: true, get: function () { return __importDefault(OllamaAdapter_1).default; } });
42
42
  __exportStar(require("./bots/adapters/OllamaAdapter"), exports);
43
+ var AthropicAdapter_1 = require("./bots/adapters/AthropicAdapter");
44
+ Object.defineProperty(exports, "AthropicAdapter", { enumerable: true, get: function () { return __importDefault(AthropicAdapter_1).default; } });
45
+ __exportStar(require("./bots/adapters/AthropicAdapter"), exports);
package/package.json CHANGED
@@ -8,7 +8,7 @@
8
8
  "eta"
9
9
  ]
10
10
  },
11
- "version": "13.1.9",
11
+ "version": "13.2.0",
12
12
  "files": [
13
13
  "build"
14
14
  ],
@@ -65,6 +65,7 @@
65
65
  "chat.images": "node ./build/chatWithImages.js"
66
66
  },
67
67
  "dependencies": {
68
+ "@anthropic-ai/sdk": "^0.74.0",
68
69
  "@sprucelabs/error": "^8.1.4",
69
70
  "@sprucelabs/mercury-event-emitter": "^46.1.2",
70
71
  "@sprucelabs/mercury-types": "^49.1.5",