@loopstack/ai-module 0.16.3 → 0.18.0-rc.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.
Files changed (52) hide show
  1. package/README.md +33 -31
  2. package/dist/ai.module.js +8 -14
  3. package/dist/ai.module.js.map +1 -1
  4. package/dist/documents/ai-message-document.js +6 -10
  5. package/dist/documents/ai-message-document.js.map +1 -1
  6. package/dist/providers/anthropic.provider.d.ts +2 -1
  7. package/dist/providers/anthropic.provider.js.map +1 -1
  8. package/dist/providers/openai.provider.d.ts +2 -1
  9. package/dist/providers/openai.provider.js.map +1 -1
  10. package/dist/schemas/ai-generate-tool-base.schema.d.ts +9 -46
  11. package/dist/services/ai-messages-helper.service.d.ts +1 -1
  12. package/dist/services/ai-messages-helper.service.js.map +1 -1
  13. package/dist/services/ai-provider-model-helper.service.d.ts +2 -1
  14. package/dist/services/ai-provider-model-helper.service.js.map +1 -1
  15. package/dist/services/ai-provider-registry.service.d.ts +2 -1
  16. package/dist/services/ai-provider-registry.service.js +1 -1
  17. package/dist/services/ai-provider-registry.service.js.map +1 -1
  18. package/dist/services/ai-tools-helper.service.js.map +1 -1
  19. package/dist/tools/ai-generate-document.tool.d.ts +3 -3
  20. package/dist/tools/ai-generate-document.tool.js +1 -1
  21. package/dist/tools/ai-generate-document.tool.js.map +1 -1
  22. package/dist/tools/ai-generate-object.tool.d.ts +11 -63
  23. package/dist/tools/ai-generate-object.tool.js +3 -4
  24. package/dist/tools/ai-generate-object.tool.js.map +1 -1
  25. package/dist/tools/ai-generate-text.tool.d.ts +11 -51
  26. package/dist/tools/ai-generate-text.tool.js +10 -13
  27. package/dist/tools/ai-generate-text.tool.js.map +1 -1
  28. package/dist/tools/delegate-tool-call.tool.d.ts +4 -44
  29. package/dist/tools/delegate-tool-call.tool.js +1 -1
  30. package/dist/tools/delegate-tool-call.tool.js.map +1 -1
  31. package/package.json +35 -66
  32. package/src/ai.module.ts +38 -0
  33. package/src/documents/ai-message-document.ts +22 -0
  34. package/src/documents/ai-message-document.yaml +5 -0
  35. package/src/documents/index.ts +1 -0
  36. package/src/index.ts +3 -0
  37. package/src/providers/anthropic.provider.ts +18 -0
  38. package/src/providers/openai.provider.ts +18 -0
  39. package/src/schemas/ai-generate-tool-base.schema.ts +22 -0
  40. package/src/services/ai-messages-helper.service.ts +25 -0
  41. package/src/services/ai-provider-model-helper.service.ts +61 -0
  42. package/src/services/ai-provider-registry.service.ts +73 -0
  43. package/src/services/ai-tools-helper.service.ts +28 -0
  44. package/src/services/index.ts +4 -0
  45. package/src/tools/ai-generate-document.tool.ts +41 -0
  46. package/src/tools/ai-generate-object.tool.ts +91 -0
  47. package/src/tools/ai-generate-text.tool.ts +110 -0
  48. package/src/tools/delegate-tool-call.tool.ts +72 -0
  49. package/src/tools/index.ts +4 -0
  50. package/.prettierrc +0 -4
  51. package/LICENSE +0 -19
  52. package/tsconfig.build.json +0 -4
@@ -1,70 +1,30 @@
1
1
  import { z } from 'zod';
2
2
  import { ToolResult } from '@loopstack/common';
3
3
  import { ToolBase, WorkflowBase } from '@loopstack/core';
4
+ import { WorkflowExecution } from '@loopstack/core/dist/workflow-processor/interfaces/workflow-execution.interface';
4
5
  import { AiMessagesHelperService } from '../services';
5
6
  import { AiProviderModelHelperService } from '../services';
6
7
  import { AiToolsHelperService } from '../services';
7
- import { WorkflowExecution } from '@loopstack/core/dist/workflow-processor/interfaces/workflow-execution.interface';
8
8
  export declare const AiGenerateTextSchema: z.ZodObject<{
9
9
  llm: z.ZodOptional<z.ZodObject<{
10
10
  model: z.ZodOptional<z.ZodString>;
11
11
  provider: z.ZodOptional<z.ZodString>;
12
12
  envApiKey: z.ZodOptional<z.ZodString>;
13
13
  cacheResponse: z.ZodOptional<z.ZodBoolean>;
14
- }, "strip", z.ZodTypeAny, {
15
- model?: string | undefined;
16
- provider?: string | undefined;
17
- envApiKey?: string | undefined;
18
- cacheResponse?: boolean | undefined;
19
- }, {
20
- model?: string | undefined;
21
- provider?: string | undefined;
22
- envApiKey?: string | undefined;
23
- cacheResponse?: boolean | undefined;
24
- }>>;
14
+ }, z.core.$strip>>;
25
15
  messages: z.ZodOptional<z.ZodArray<z.ZodObject<{
26
- role: z.ZodEnum<["system", "assistant", "user", "tool"]>;
16
+ role: z.ZodEnum<{
17
+ system: "system";
18
+ user: "user";
19
+ assistant: "assistant";
20
+ tool: "tool";
21
+ }>;
27
22
  content: z.ZodAny;
28
- }, "strip", z.ZodTypeAny, {
29
- role: "system" | "assistant" | "user" | "tool";
30
- content?: any;
31
- }, {
32
- role: "system" | "assistant" | "user" | "tool";
33
- content?: any;
34
- }>, "many">>;
23
+ }, z.core.$strip>>>;
35
24
  prompt: z.ZodOptional<z.ZodString>;
36
25
  messagesSearchTag: z.ZodOptional<z.ZodString>;
37
- } & {
38
- tools: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
39
- }, "strict", z.ZodTypeAny, {
40
- llm?: {
41
- model?: string | undefined;
42
- provider?: string | undefined;
43
- envApiKey?: string | undefined;
44
- cacheResponse?: boolean | undefined;
45
- } | undefined;
46
- messages?: {
47
- role: "system" | "assistant" | "user" | "tool";
48
- content?: any;
49
- }[] | undefined;
50
- prompt?: string | undefined;
51
- messagesSearchTag?: string | undefined;
52
- tools?: string[] | undefined;
53
- }, {
54
- llm?: {
55
- model?: string | undefined;
56
- provider?: string | undefined;
57
- envApiKey?: string | undefined;
58
- cacheResponse?: boolean | undefined;
59
- } | undefined;
60
- messages?: {
61
- role: "system" | "assistant" | "user" | "tool";
62
- content?: any;
63
- }[] | undefined;
64
- prompt?: string | undefined;
65
- messagesSearchTag?: string | undefined;
66
- tools?: string[] | undefined;
67
- }>;
26
+ tools: z.ZodOptional<z.ZodArray<z.ZodString>>;
27
+ }, z.core.$strict>;
68
28
  type AiGenerateTextArgsType = z.infer<typeof AiGenerateTextSchema>;
69
29
  export declare class AiGenerateText extends ToolBase<AiGenerateTextArgsType> {
70
30
  private readonly aiMessagesHelperService;
@@ -10,14 +10,15 @@ var __metadata = (this && this.__metadata) || function (k, v) {
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.AiGenerateText = exports.AiGenerateTextSchema = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const ai_1 = require("ai");
13
15
  const zod_1 = require("zod");
14
- const common_1 = require("@loopstack/common");
16
+ const common_2 = require("@loopstack/common");
15
17
  const core_1 = require("@loopstack/core");
18
+ const ai_generate_tool_base_schema_1 = require("../schemas/ai-generate-tool-base.schema");
16
19
  const services_1 = require("../services");
17
20
  const services_2 = require("../services");
18
21
  const services_3 = require("../services");
19
- const ai_1 = require("ai");
20
- const ai_generate_tool_base_schema_1 = require("../schemas/ai-generate-tool-base.schema");
21
22
  exports.AiGenerateTextSchema = ai_generate_tool_base_schema_1.AiGenerateToolBaseSchema.extend({
22
23
  tools: zod_1.z.array(zod_1.z.string()).optional(),
23
24
  }).strict();
@@ -34,20 +35,15 @@ let AiGenerateText = class AiGenerateText extends core_1.ToolBase {
34
35
  async execute(args, ctx, parent) {
35
36
  const model = this.aiProviderModelHelperService.getProviderModel(args.llm);
36
37
  const options = {};
37
- options.tools = args.tools
38
- ? this.aiToolsHelperService.getTools(args.tools, parent)
39
- : undefined;
38
+ options.tools = args.tools ? this.aiToolsHelperService.getTools(args.tools, parent) : undefined;
40
39
  if (args.prompt) {
41
40
  options.prompt = args.prompt;
42
41
  }
43
42
  else {
44
- const messages = this.aiMessagesHelperService.getMessages(ctx.state.getMetadata('documents'), {
43
+ options.messages = this.aiMessagesHelperService.getMessages(ctx.state.getMetadata('documents'), {
45
44
  messages: args.messages,
46
45
  messagesSearchTag: args.messagesSearchTag,
47
46
  });
48
- options.messages = (0, ai_1.convertToModelMessages)(messages, {
49
- tools: options.tools,
50
- });
51
47
  }
52
48
  const uiMessage = await this.handleGenerateText(model, options);
53
49
  return {
@@ -72,7 +68,7 @@ let AiGenerateText = class AiGenerateText extends core_1.ToolBase {
72
68
  resolve(data.responseMessage);
73
69
  },
74
70
  });
75
- (async () => {
71
+ void (async () => {
76
72
  try {
77
73
  const reader = stream.getReader();
78
74
  while (true) {
@@ -96,12 +92,13 @@ let AiGenerateText = class AiGenerateText extends core_1.ToolBase {
96
92
  };
97
93
  exports.AiGenerateText = AiGenerateText;
98
94
  exports.AiGenerateText = AiGenerateText = __decorate([
99
- (0, common_1.BlockConfig)({
95
+ (0, common_1.Injectable)(),
96
+ (0, common_2.BlockConfig)({
100
97
  config: {
101
98
  description: 'Generates text using a LLM',
102
99
  },
103
100
  }),
104
- (0, common_1.WithArguments)(exports.AiGenerateTextSchema),
101
+ (0, common_2.WithArguments)(exports.AiGenerateTextSchema),
105
102
  __metadata("design:paramtypes", [services_1.AiMessagesHelperService,
106
103
  services_3.AiToolsHelperService,
107
104
  services_2.AiProviderModelHelperService])
@@ -1 +1 @@
1
- {"version":3,"file":"ai-generate-text.tool.js","sourceRoot":"","sources":["../../src/tools/ai-generate-text.tool.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ai-generate-text.tool.js","sourceRoot":"","sources":["../../src/tools/ai-generate-text.tool.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { ToolResult } from '@loopstack/common';
2
1
  import { z } from 'zod';
2
+ import { ToolResult } from '@loopstack/common';
3
3
  import { ToolBase, WorkflowBase } from '@loopstack/core';
4
4
  import { WorkflowExecution } from '@loopstack/core/dist/workflow-processor/interfaces/workflow-execution.interface';
5
5
  declare const DelegateToolCallsToolSchema: z.ZodObject<{
@@ -9,49 +9,9 @@ declare const DelegateToolCallsToolSchema: z.ZodObject<{
9
9
  type: z.ZodString;
10
10
  input: z.ZodOptional<z.ZodAny>;
11
11
  toolCallId: z.ZodOptional<z.ZodString>;
12
- }, "strip", z.ZodTypeAny, {
13
- type: string;
14
- input?: any;
15
- toolCallId?: string | undefined;
16
- }, {
17
- type: string;
18
- input?: any;
19
- toolCallId?: string | undefined;
20
- }>, "many">;
21
- }, "strip", z.ZodTypeAny, {
22
- id: string;
23
- parts: {
24
- type: string;
25
- input?: any;
26
- toolCallId?: string | undefined;
27
- }[];
28
- }, {
29
- id: string;
30
- parts: {
31
- type: string;
32
- input?: any;
33
- toolCallId?: string | undefined;
34
- }[];
35
- }>;
36
- }, "strip", z.ZodTypeAny, {
37
- message: {
38
- id: string;
39
- parts: {
40
- type: string;
41
- input?: any;
42
- toolCallId?: string | undefined;
43
- }[];
44
- };
45
- }, {
46
- message: {
47
- id: string;
48
- parts: {
49
- type: string;
50
- input?: any;
51
- toolCallId?: string | undefined;
52
- }[];
53
- };
54
- }>;
12
+ }, z.core.$strip>>;
13
+ }, z.core.$strip>;
14
+ }, z.core.$strip>;
55
15
  type DelegateToolCallsToolArgs = z.infer<typeof DelegateToolCallsToolSchema>;
56
16
  export declare class DelegateToolCall extends ToolBase<DelegateToolCallsToolArgs> {
57
17
  execute(args: DelegateToolCallsToolArgs, ctx: WorkflowExecution, parent: WorkflowBase): Promise<ToolResult>;
@@ -7,8 +7,8 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
7
7
  };
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.DelegateToolCall = void 0;
10
- const common_1 = require("@loopstack/common");
11
10
  const zod_1 = require("zod");
11
+ const common_1 = require("@loopstack/common");
12
12
  const core_1 = require("@loopstack/core");
13
13
  const DelegateToolCallsToolSchema = zod_1.z.object({
14
14
  message: zod_1.z.object({
@@ -1 +1 @@
1
- {"version":3,"file":"delegate-tool-call.tool.js","sourceRoot":"","sources":["../../src/tools/delegate-tool-call.tool.ts"],"names":[],"mappings":";;;;;;;;;AAAA,8CAA2E;AAC3E,6BAAwB;AACxB,0CAAyD;AAIzD,MAAM,2BAA2B,GAAG,OAAC,CAAC,MAAM,CAAC;IAC3C,OAAO,EAAE,OAAC,CAAC,MAAM,CAAC;QAChB,EAAE,EAAE,OAAC,CAAC,MAAM,EAAE;QACd,KAAK,EAAE,OAAC,CAAC,KAAK,CACZ,OAAC,CAAC,MAAM,CAAC;YACP,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE;YAChB,KAAK,EAAE,OAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;YACzB,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;SAClC,CAAC,CACH;KACF,CAAC;CACH,CAAC,CAAC;AAUI,IAAM,gBAAgB,GAAtB,MAAM,gBAAiB,SAAQ,eAAmC;IACvE,KAAK,CAAC,OAAO,CACX,IAA+B,EAC/B,GAAsB,EACtB,MAAoB;QAEpB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;QACjC,MAAM,WAAW,GAAiB,EAAE,CAAC;QAErC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBACnC,SAAS;YACX,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;gBACrB,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;YAC5C,CAAC;YAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAEjD,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACtC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,aAAa,CAAC,CAAC;YACjD,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;YAE3D,WAAW,CAAC,IAAI,CAAC;gBACf,IAAI,EAAE,IAAI,CAAC,IAAW;gBACtB,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,MAAM,EAAE;oBACN,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,MAAM;oBAC3B,KAAK,EAAE,MAAM,CAAC,IAAI;iBACnB;gBACD,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,KAAK,EAAE,kBAAkB;aACL,CAAC,CAAC;QAC1B,CAAC;QAED,MAAM,aAAa,GAAG;YACpB,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE;YACnB,IAAI,EAAE,WAAW;YACjB,KAAK,EAAE,WAAW;SACC,CAAC;QAEtB,OAAO;YACL,IAAI,EAAE,aAAa;SACpB,CAAC;IACJ,CAAC;CACF,CAAA;AAhDY,4CAAgB;2BAAhB,gBAAgB;IAN5B,IAAA,oBAAW,EAAC;QACX,MAAM,EAAE;YACN,WAAW,EAAE,uBAAuB;SACrC;KACF,CAAC;IACD,IAAA,sBAAa,EAAC,2BAA2B,CAAC;GAC9B,gBAAgB,CAgD5B"}
1
+ {"version":3,"file":"delegate-tool-call.tool.js","sourceRoot":"","sources":["../../src/tools/delegate-tool-call.tool.ts"],"names":[],"mappings":";;;;;;;;;AACA,6BAAwB;AACxB,8CAA2E;AAC3E,0CAAyD;AAGzD,MAAM,2BAA2B,GAAG,OAAC,CAAC,MAAM,CAAC;IAC3C,OAAO,EAAE,OAAC,CAAC,MAAM,CAAC;QAChB,EAAE,EAAE,OAAC,CAAC,MAAM,EAAE;QACd,KAAK,EAAE,OAAC,CAAC,KAAK,CACZ,OAAC,CAAC,MAAM,CAAC;YACP,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE;YAChB,KAAK,EAAE,OAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;YACzB,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;SAClC,CAAC,CACH;KACF,CAAC;CACH,CAAC,CAAC;AAUI,IAAM,gBAAgB,GAAtB,MAAM,gBAAiB,SAAQ,eAAmC;IACvE,KAAK,CAAC,OAAO,CAAC,IAA+B,EAAE,GAAsB,EAAE,MAAoB;QACzF,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;QACjC,MAAM,WAAW,GAAiB,EAAE,CAAC;QAErC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBACnC,SAAS;YACX,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;gBACrB,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;YAC5C,CAAC;YAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAEjD,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACtC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,aAAa,CAAC,CAAC;YACjD,CAAC;YACD,MAAM,MAAM,GAAe,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAgC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;YAElG,WAAW,CAAC,IAAI,CAAC;gBACf,IAAI,EAAE,IAAI,CAAC,IAA0B;gBACrC,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,MAAM,EAAE;oBACN,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,MAAM;oBAC3B,KAAK,EAAE,MAAM,CAAC,IAAe;iBAC9B;gBACD,KAAK,EAAE,IAAI,CAAC,KAAgC;gBAC5C,KAAK,EAAE,kBAAkB;aACL,CAAC,CAAC;QAC1B,CAAC;QAED,MAAM,aAAa,GAAc;YAC/B,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE;YACnB,IAAI,EAAE,WAAW;YACjB,KAAK,EAAE,WAAW;SACnB,CAAC;QAEF,OAAO;YACL,IAAI,EAAE,aAAa;SACpB,CAAC;IACJ,CAAC;CACF,CAAA;AA5CY,4CAAgB;2BAAhB,gBAAgB;IAN5B,IAAA,oBAAW,EAAC;QACX,MAAM,EAAE;YACN,WAAW,EAAE,uBAAuB;SACrC;KACF,CAAC;IACD,IAAA,sBAAa,EAAC,2BAA2B,CAAC;GAC9B,gBAAgB,CA4C5B"}
package/package.json CHANGED
@@ -2,84 +2,52 @@
2
2
  "name": "@loopstack/ai-module",
3
3
  "displayName": "Loopstack Ai Module",
4
4
  "description": "A collection of useful tools for performing AI actions using model provider APIs such as OpenAI and Anthropic",
5
- "version": "0.16.3",
6
- "author": {
7
- "name": "Jakob Klippel",
8
- "url": "https://www.linkedin.com/in/jakob-klippel/"
9
- },
10
5
  "keywords": [
11
- "loopstack",
12
- "tool",
13
6
  "ai",
7
+ "anthropic",
14
8
  "llm",
9
+ "loopstack",
15
10
  "openai",
16
- "anthropic"
11
+ "tool"
17
12
  ],
13
+ "version": "0.18.0-rc.0",
18
14
  "license": "Apache-2.0",
15
+ "author": {
16
+ "name": "Jakob Klippel",
17
+ "url": "https://www.linkedin.com/in/jakob-klippel/"
18
+ },
19
19
  "main": "dist/index.js",
20
20
  "types": "dist/index.d.ts",
21
+ "exports": {
22
+ ".": "./dist/index.js",
23
+ "./src/*": "./src/*"
24
+ },
21
25
  "scripts": {
22
26
  "build": "nest build",
23
- "watch": "nest build --watch",
24
27
  "compile": "tsc --noEmit",
25
- "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
26
- "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
27
- "test": "jest",
28
- "test:watch": "jest --watch",
29
- "test:cov": "jest --coverage",
30
- "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
31
- "test:e2e": "jest --config ./test/jest-e2e.json"
32
- },
33
- "peerDependencies": {
34
- "@nestjs/common": "^11.0.0",
35
- "@nestjs/config": "^4.0.1",
36
- "@nestjs/core": "^11.0.0",
37
- "@nestjs/platform-express": "^11.0.0",
38
- "rxjs": "^7.8.0"
28
+ "format": "prettier --write .",
29
+ "lint": "eslint .",
30
+ "test": "jest --passWithNoTests",
31
+ "watch": "nest build --watch"
39
32
  },
40
33
  "dependencies": {
41
- "@ai-sdk/anthropic": "^2.0.1",
42
- "@ai-sdk/openai": "^2.0.4",
43
- "@ai-sdk/provider-utils": "^3.0.8",
44
- "@loopstack/common": "^0.16.0",
45
- "@loopstack/core": "^0.16.0",
46
- "@loopstack/core-ui-module": "^0.16.0",
47
- "ai": "^5.0.6",
48
- "lodash": "^4.17.21",
49
- "zod": "^3.24.1"
50
- },
51
- "devDependencies": {
52
- "@eslint/eslintrc": "^3.3.0",
53
- "@eslint/js": "^9.22.0",
54
- "@nestjs/cli": "^11.0.5",
55
- "@nestjs/common": "^11.0.12",
56
- "@nestjs/config": "^4.0.1",
57
- "@nestjs/core": "^11.0.12",
58
- "@nestjs/platform-express": "^11.0.12",
59
- "@nestjs/schematics": "^11.0.2",
60
- "@nestjs/testing": "^11.0.12",
61
- "@swc/cli": "^0.6.0",
62
- "@swc/core": "^1.11.11",
63
- "@types/express": "^5.0.1",
64
- "@types/jest": "^29.5.14",
65
- "@types/node": "^22.13.10",
66
- "@types/supertest": "^6.0.2",
67
- "eslint": "^9.22.0",
68
- "eslint-config-prettier": "^10.1.1",
69
- "eslint-plugin-prettier": "^5.2.3",
70
- "globals": "^16.0.0",
71
- "jest": "^29.7.0",
72
- "prettier": "^3.5.3",
73
- "rxjs": "^7.8.2",
74
- "source-map-support": "^0.5.21",
75
- "supertest": "^7.0.0",
76
- "ts-jest": "^29.2.6",
77
- "ts-loader": "^9.5.2",
78
- "ts-node": "^10.9.2",
79
- "tsconfig-paths": "^4.2.0",
80
- "typescript": "^5.8.3",
81
- "typescript-eslint": "^8.38.0"
34
+ "@ai-sdk/anthropic": "^3.0.23",
35
+ "@ai-sdk/openai": "^3.0.19",
36
+ "@ai-sdk/provider-utils": "^4.0.9",
37
+ "@loopstack/common": "^0.18.0-rc.1",
38
+ "@loopstack/core": "^0.18.0-rc.1",
39
+ "@loopstack/core-ui-module": "^0.18.0-rc.0",
40
+ "@nestjs/common": "^11.1.12",
41
+ "@nestjs/config": "^4.0.2",
42
+ "@nestjs/core": "^11.1.12",
43
+ "ai": "^6.0.48",
44
+ "lodash": "^4.17.23",
45
+ "zod": "^4.3.5"
82
46
  },
47
+ "files": [
48
+ "dist",
49
+ "src"
50
+ ],
83
51
  "jest": {
84
52
  "moduleFileExtensions": [
85
53
  "js",
@@ -89,12 +57,13 @@
89
57
  "rootDir": "src",
90
58
  "testRegex": ".*\\.spec\\.ts$",
91
59
  "transform": {
92
- "^.+\\.(t|j)s$": "ts-jest"
60
+ "^.+\\.ts$": "ts-jest"
93
61
  },
94
62
  "collectCoverageFrom": [
95
63
  "**/*.(t|j)s"
96
64
  ],
97
65
  "coverageDirectory": "../coverage",
98
- "testEnvironment": "node"
66
+ "testEnvironment": "node",
67
+ "maxWorkers": 1
99
68
  }
100
69
  }
@@ -0,0 +1,38 @@
1
+ import { Module } from '@nestjs/common';
2
+ import { DiscoveryModule } from '@nestjs/core';
3
+ import { LoopCoreModule } from '@loopstack/core';
4
+ import { CoreUiModule } from '@loopstack/core-ui-module';
5
+ import { AiMessageDocument } from './documents';
6
+ import { AnthropicProviderService } from './providers/anthropic.provider';
7
+ import { OpenAiProviderService } from './providers/openai.provider';
8
+ import { AiMessagesHelperService } from './services';
9
+ import { AiProviderModelHelperService } from './services';
10
+ import { AiToolsHelperService } from './services';
11
+ import { AiProviderRegistryService } from './services/ai-provider-registry.service';
12
+ import { AiGenerateDocument, AiGenerateObject, AiGenerateText, DelegateToolCall } from './tools';
13
+
14
+ @Module({
15
+ imports: [LoopCoreModule, CoreUiModule, DiscoveryModule],
16
+ providers: [
17
+ // services
18
+ AiMessagesHelperService,
19
+ AiProviderModelHelperService,
20
+ AiToolsHelperService,
21
+ AiProviderRegistryService,
22
+
23
+ // ai providers
24
+ OpenAiProviderService,
25
+ AnthropicProviderService,
26
+
27
+ // tools
28
+ AiGenerateDocument,
29
+ AiGenerateObject,
30
+ AiGenerateText,
31
+ DelegateToolCall,
32
+
33
+ // documents
34
+ AiMessageDocument,
35
+ ],
36
+ exports: [AiGenerateDocument, AiGenerateObject, AiGenerateText, DelegateToolCall, AiMessageDocument],
37
+ })
38
+ export class AiModule {}
@@ -0,0 +1,22 @@
1
+ import { Injectable } from '@nestjs/common';
2
+ import { z } from 'zod';
3
+ import { BlockConfig, WithArguments } from '@loopstack/common';
4
+ import { DocumentBase } from '@loopstack/core';
5
+
6
+ const AiMessageDocumentSchema = z.object({
7
+ id: z.string().optional(),
8
+ role: z.union([z.literal('system'), z.literal('user'), z.literal('assistant')]),
9
+ metadata: z.any().optional(),
10
+ parts: z.array(z.any()),
11
+ });
12
+
13
+ @Injectable()
14
+ @BlockConfig({
15
+ config: {
16
+ type: 'document',
17
+ description: 'Ai Message Document.',
18
+ },
19
+ configFile: __dirname + '/ai-message-document.yaml',
20
+ })
21
+ @WithArguments(AiMessageDocumentSchema)
22
+ export class AiMessageDocument extends DocumentBase {}
@@ -0,0 +1,5 @@
1
+ tags:
2
+ - message
3
+ ui:
4
+ form:
5
+ widget: ai-message
@@ -0,0 +1 @@
1
+ export * from './ai-message-document';
package/src/index.ts ADDED
@@ -0,0 +1,3 @@
1
+ export * from './ai.module';
2
+ export * from './tools';
3
+ export * from './documents';
@@ -0,0 +1,18 @@
1
+ import { createAnthropic } from '@ai-sdk/anthropic';
2
+ import { AiProvider, AiProviderInterface, AiProviderOptions } from '@loopstack/common';
3
+
4
+ @AiProvider({
5
+ name: 'anthropic',
6
+ })
7
+ export class AnthropicProviderService implements AiProviderInterface {
8
+ createClient(options: AiProviderOptions) {
9
+ return createAnthropic({
10
+ apiKey: options.apiKey,
11
+ baseURL: options.baseURL,
12
+ });
13
+ }
14
+
15
+ getModel(client: ReturnType<typeof createAnthropic>, model: string) {
16
+ return client(model);
17
+ }
18
+ }
@@ -0,0 +1,18 @@
1
+ import { createOpenAI } from '@ai-sdk/openai';
2
+ import { AiProvider, AiProviderInterface, AiProviderOptions } from '@loopstack/common';
3
+
4
+ @AiProvider({
5
+ name: 'openai',
6
+ })
7
+ export class OpenAiProviderService implements AiProviderInterface {
8
+ createClient(options: AiProviderOptions) {
9
+ return createOpenAI({
10
+ apiKey: options.apiKey,
11
+ baseURL: options.baseURL,
12
+ });
13
+ }
14
+
15
+ getModel(client: ReturnType<typeof createOpenAI>, model: string) {
16
+ return client(model);
17
+ }
18
+ }
@@ -0,0 +1,22 @@
1
+ import { z } from 'zod';
2
+
3
+ export const AiGenerateToolBaseSchema = z.object({
4
+ llm: z
5
+ .object({
6
+ model: z.string().optional(),
7
+ provider: z.string().optional(),
8
+ envApiKey: z.string().optional(),
9
+ cacheResponse: z.boolean().optional(),
10
+ })
11
+ .optional(),
12
+ messages: z
13
+ .array(
14
+ z.object({
15
+ role: z.enum(['system', 'assistant', 'user', 'tool']),
16
+ content: z.any(),
17
+ }),
18
+ )
19
+ .optional(),
20
+ prompt: z.string().optional(),
21
+ messagesSearchTag: z.string().optional(),
22
+ });
@@ -0,0 +1,25 @@
1
+ import { ModelMessage } from '@ai-sdk/provider-utils';
2
+ import { Injectable } from '@nestjs/common';
3
+ import { DocumentEntity } from '@loopstack/common';
4
+
5
+ @Injectable()
6
+ export class AiMessagesHelperService {
7
+ private searchMessages(documents: DocumentEntity[], tag: string): ModelMessage[] {
8
+ return documents
9
+ .filter((document) => document.tags?.includes(tag))
10
+ .sort((a, b) => a.createdAt.valueOf() - b.createdAt.valueOf())
11
+ .map((document) => document.content as ModelMessage);
12
+ }
13
+
14
+ getMessages(
15
+ documents: DocumentEntity[],
16
+ args: { messages?: ModelMessage[]; messagesSearchTag?: string },
17
+ ): ModelMessage[] {
18
+ let messages: ModelMessage[] | undefined = args.messages;
19
+ if (!messages?.length) {
20
+ messages = this.searchMessages(documents, args.messagesSearchTag ?? 'message');
21
+ }
22
+
23
+ return messages;
24
+ }
25
+ }
@@ -0,0 +1,61 @@
1
+ import { Injectable } from '@nestjs/common';
2
+ import { LanguageModel } from 'ai';
3
+ import { AiProviderRegistryService } from './ai-provider-registry.service';
4
+
5
+ export interface AiProviderModelConfig {
6
+ model?: string;
7
+ provider?: string;
8
+ envApiKey?: string;
9
+ cacheResponse?: boolean;
10
+ }
11
+
12
+ @Injectable()
13
+ export class AiProviderModelHelperService {
14
+ constructor(private readonly aiProviderRegistry: AiProviderRegistryService) {}
15
+
16
+ private getApiKey(envApiKey: string | undefined, providerName: string): string {
17
+ const defaultKey = `${providerName.toUpperCase()}_API_KEY`;
18
+ const apiKey = envApiKey ? process.env[envApiKey] : process.env[defaultKey];
19
+
20
+ if (!apiKey) {
21
+ throw new Error(`No API key found! Please make sure to provide "${envApiKey ?? defaultKey}" in your .env file.`);
22
+ }
23
+
24
+ return apiKey;
25
+ }
26
+
27
+ private getModel(modelName: string | undefined): string {
28
+ const model = modelName ?? process.env['DEFAULT_MODEL'];
29
+
30
+ if (!model) {
31
+ throw new Error(
32
+ `No Model defined. Please provide DEFAULT_MODEL or set the model parameter in the completion service call.`,
33
+ );
34
+ }
35
+
36
+ return model;
37
+ }
38
+
39
+ private getProvider(name: string | undefined): string {
40
+ const provider = name ?? process.env['DEFAULT_PROVIDER'];
41
+
42
+ if (!provider) {
43
+ throw new Error(
44
+ `No Provider defined. Please provide DEFAULT_PROVIDER or set the provider parameter in the completion service call.`,
45
+ );
46
+ }
47
+
48
+ return provider;
49
+ }
50
+
51
+ getProviderModel(config?: AiProviderModelConfig): LanguageModel {
52
+ const modelName = this.getModel(config?.model);
53
+ const providerName = this.getProvider(config?.provider);
54
+ const apiKey = this.getApiKey(config?.envApiKey, providerName);
55
+
56
+ return this.aiProviderRegistry.createModel(providerName, {
57
+ apiKey: apiKey,
58
+ model: modelName,
59
+ });
60
+ }
61
+ }