@memberjunction/ai-prompts 6.2.0-edge.0 → 6.2.0-edge.2

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 (100) hide show
  1. package/README.md +43 -0
  2. package/dist/AIModelRunner.d.ts +9 -88
  3. package/dist/AIModelRunner.d.ts.map +1 -1
  4. package/dist/AIModelRunner.js +11 -281
  5. package/dist/AIModelRunner.js.map +1 -1
  6. package/dist/AIPromptRunner.d.ts +147 -513
  7. package/dist/AIPromptRunner.d.ts.map +1 -1
  8. package/dist/AIPromptRunner.js +460 -2126
  9. package/dist/AIPromptRunner.js.map +1 -1
  10. package/dist/BaseModelRunner.d.ts +618 -0
  11. package/dist/BaseModelRunner.d.ts.map +1 -0
  12. package/dist/BaseModelRunner.js +1933 -0
  13. package/dist/BaseModelRunner.js.map +1 -0
  14. package/dist/ExecutionPlanner.d.ts +2 -0
  15. package/dist/ExecutionPlanner.d.ts.map +1 -1
  16. package/dist/ExecutionPlanner.js +5 -1
  17. package/dist/ExecutionPlanner.js.map +1 -1
  18. package/dist/ParallelExecution.d.ts +24 -5
  19. package/dist/ParallelExecution.d.ts.map +1 -1
  20. package/dist/ParallelExecutionCoordinator.d.ts +2 -11
  21. package/dist/ParallelExecutionCoordinator.d.ts.map +1 -1
  22. package/dist/ParallelExecutionCoordinator.js +104 -91
  23. package/dist/ParallelExecutionCoordinator.js.map +1 -1
  24. package/dist/audio/AISpeechToTextRunner.d.ts +46 -0
  25. package/dist/audio/AISpeechToTextRunner.d.ts.map +1 -0
  26. package/dist/audio/AISpeechToTextRunner.js +93 -0
  27. package/dist/audio/AISpeechToTextRunner.js.map +1 -0
  28. package/dist/audio/AITextToSpeechRunner.d.ts +43 -0
  29. package/dist/audio/AITextToSpeechRunner.d.ts.map +1 -0
  30. package/dist/audio/AITextToSpeechRunner.js +80 -0
  31. package/dist/audio/AITextToSpeechRunner.js.map +1 -0
  32. package/dist/audio/audio-description.d.ts +22 -0
  33. package/dist/audio/audio-description.d.ts.map +1 -0
  34. package/dist/audio/audio-description.js +52 -0
  35. package/dist/audio/audio-description.js.map +1 -0
  36. package/dist/audio/audio-runner.types.d.ts +46 -0
  37. package/dist/audio/audio-runner.types.d.ts.map +1 -0
  38. package/dist/audio/audio-runner.types.js +7 -0
  39. package/dist/audio/audio-runner.types.js.map +1 -0
  40. package/dist/decision/AIDecisionRunner.d.ts +134 -0
  41. package/dist/decision/AIDecisionRunner.d.ts.map +1 -0
  42. package/dist/decision/AIDecisionRunner.js +498 -0
  43. package/dist/decision/AIDecisionRunner.js.map +1 -0
  44. package/dist/decision/LLMDecision.d.ts +158 -0
  45. package/dist/decision/LLMDecision.d.ts.map +1 -0
  46. package/dist/decision/LLMDecision.js +493 -0
  47. package/dist/decision/LLMDecision.js.map +1 -0
  48. package/dist/decision/decision-questions.d.ts +28 -0
  49. package/dist/decision/decision-questions.d.ts.map +1 -0
  50. package/dist/decision/decision-questions.js +123 -0
  51. package/dist/decision/decision-questions.js.map +1 -0
  52. package/dist/decision/decision-runner.types.d.ts +29 -0
  53. package/dist/decision/decision-runner.types.d.ts.map +1 -0
  54. package/dist/decision/decision-runner.types.js +14 -0
  55. package/dist/decision/decision-runner.types.js.map +1 -0
  56. package/dist/embedding/AIEmbeddingRunner.d.ts +115 -0
  57. package/dist/embedding/AIEmbeddingRunner.d.ts.map +1 -0
  58. package/dist/embedding/AIEmbeddingRunner.js +462 -0
  59. package/dist/embedding/AIEmbeddingRunner.js.map +1 -0
  60. package/dist/embedding/embedding-runner.types.d.ts +72 -0
  61. package/dist/embedding/embedding-runner.types.d.ts.map +1 -0
  62. package/dist/embedding/embedding-runner.types.js +2 -0
  63. package/dist/embedding/embedding-runner.types.js.map +1 -0
  64. package/dist/image/AIImageGenerationRunner.d.ts +101 -0
  65. package/dist/image/AIImageGenerationRunner.d.ts.map +1 -0
  66. package/dist/image/AIImageGenerationRunner.js +355 -0
  67. package/dist/image/AIImageGenerationRunner.js.map +1 -0
  68. package/dist/image/image-runner.types.d.ts +90 -0
  69. package/dist/image/image-runner.types.d.ts.map +1 -0
  70. package/dist/image/image-runner.types.js +7 -0
  71. package/dist/image/image-runner.types.js.map +1 -0
  72. package/dist/index.d.ts +17 -0
  73. package/dist/index.d.ts.map +1 -1
  74. package/dist/index.js +16 -0
  75. package/dist/index.js.map +1 -1
  76. package/dist/linearTextScan.d.ts +20 -0
  77. package/dist/linearTextScan.d.ts.map +1 -0
  78. package/dist/linearTextScan.js +74 -0
  79. package/dist/linearTextScan.js.map +1 -0
  80. package/dist/media/BaseMediaRunner.d.ts +143 -0
  81. package/dist/media/BaseMediaRunner.d.ts.map +1 -0
  82. package/dist/media/BaseMediaRunner.js +448 -0
  83. package/dist/media/BaseMediaRunner.js.map +1 -0
  84. package/dist/media/media-runner.types.d.ts +128 -0
  85. package/dist/media/media-runner.types.d.ts.map +1 -0
  86. package/dist/media/media-runner.types.js +8 -0
  87. package/dist/media/media-runner.types.js.map +1 -0
  88. package/dist/media/media-usage.d.ts +13 -0
  89. package/dist/media/media-usage.d.ts.map +1 -0
  90. package/dist/media/media-usage.js +18 -0
  91. package/dist/media/media-usage.js.map +1 -0
  92. package/dist/video/AIVideoRunner.d.ts +46 -0
  93. package/dist/video/AIVideoRunner.d.ts.map +1 -0
  94. package/dist/video/AIVideoRunner.js +88 -0
  95. package/dist/video/AIVideoRunner.js.map +1 -0
  96. package/dist/video/video-runner.types.d.ts +29 -0
  97. package/dist/video/video-runner.types.d.ts.map +1 -0
  98. package/dist/video/video-runner.types.js +7 -0
  99. package/dist/video/video-runner.types.js.map +1 -0
  100. package/package.json +12 -12
package/README.md CHANGED
@@ -110,6 +110,8 @@ Execution order:
110
110
  3. Child results replace placeholders in parent template
111
111
  4. Final composed prompt executes as a single LLM call
112
112
 
113
+ **Rendering children without executing.** `AIPromptRunner.RenderChildPromptTemplates(childPrompts, params)` renders the child templates and returns `{ renderedTemplates }` keyed by each child's `parentPlaceholder`, with no model call. A caller that needs the rendered text before execution — the loop agent uses it to relocate a volatile specialization into its trailing runtime-state message — passes the map back as `AIPromptParams.PreRenderedChildTemplates`, and `ExecutePrompt` embeds those strings instead of rendering the children a second time. Rendering is deterministic for the same inputs, so both paths produce the same text.
114
+
113
115
  ### Model Selection Strategies
114
116
 
115
117
  Three strategies for selecting which AI model executes a prompt:
@@ -200,6 +202,47 @@ Hierarchical credential resolution for API keys:
200
202
 
201
203
  When a model fails due to rate limiting, authentication errors, or other transient issues, the runner can automatically retry with alternate models from the selection candidates.
202
204
 
205
+ ### Media Runners
206
+
207
+ Non-chat models run through runners built on the same `BaseModelRunner`, so they get the same model selection, credential resolution, failover and `MJ: AI Prompt Runs` row as a chat prompt. Each requires one model type, and uses a default carrier prompt, found by name, unless the caller passes a `PromptID`. A `ModelID` pins the model, and failover then stays within its vendors. The run row never holds media bytes.
208
+
209
+ | Runner | Model type | Method | Default prompt | Usage recorded |
210
+ |---|---|---|---|---|
211
+ | `AIImageGenerationRunner` | `Image Generator` | `RunImageGeneration`, `RunImageEdit` | `Default Image Generation` | the driver's, else images returned (`Images`) |
212
+ | `AITextToSpeechRunner` | `TTS` | `RunTextToSpeech` | `Default Text To Speech` | the driver's, else characters sent (`Characters`) |
213
+ | `AISpeechToTextRunner` | `Speech to Text` | `RunSpeechToText` | `Default Speech To Text` | the driver's: audio seconds (`Seconds`) when reported, otherwise nothing |
214
+ | `AIVideoRunner` | `Video` | `RunAvatarVideo` | `Default Video Generation` | the driver's: video seconds (`Seconds`) when reported, otherwise nothing |
215
+
216
+ The text-to-speech, speech-to-text and video runners share their lifecycle through `BaseMediaRunner`. It follows the carrier prompt's `FailoverStrategy`, narrowing `SameModelDifferentVendor` to the selected model's vendors.
217
+
218
+ Whether a failed call fails over is `ErrorAnalyzer`'s decision, as it is for chat prompts. The shipped audio and video drivers report it on `SpeechResult.errorInfo` / `VideoResult.errorInfo`, from the error their SDK threw, so it keeps the HTTP status:
219
+
220
+ - a rate limit, an outage, a server error or a timeout fails over;
221
+ - a request the vendor rejected as invalid (a 400 or 422, such as an unknown voice or an unsupported audio format) does not, since every other candidate would reject it too;
222
+ - a 400 whose message reads as vendor-specific validation (`required`, `must be`, …) fails over to another vendor, as it does for chat;
223
+ - a 401 stops failover, as it does for chat.
224
+
225
+ A driver that reports only `errorMessage` is classified from the message, which recognizes rate limits, outages and a few malformed requests; any other message reads as `Unknown`, which fails over. A driver should set `errorInfo` with `ErrorAnalyzer.AnalyzeError(error)` on the error it caught.
226
+
227
+ `TimeoutMS` and `CancellationToken` bound each driver call as `timeoutMS` and `cancellationToken` bound a chat call. A call that exceeds `TimeoutMS` fails with an `AIPromptTimeoutError` and fails over. A cancelled call ends at once, never fails over, and its run row is recorded as `Cancelled`. The media drivers take no abort signal, so in both cases the request already sent is abandoned rather than torn down.
228
+
229
+ Video generation is asynchronous at the provider, and the primitive offers no status call, so `AIVideoRunner` does not wait for a render. A successful run means the provider accepted the request; the row records the video ID (for HeyGen, the render job's ID) and records the video's length only if a driver reports it.
230
+
231
+ Usage is recorded with `BaseModelRunner.ApplyUsageToRunRecord`, which writes non-token quantities as `InputUnitsUsed` / `OutputUnitsUsed` with the `MJ: AI Usage Types` row that names their measure. The runners never set a cost. The row's save prices it from the model's cost rows, and declines when no price unit type claims the measure, as none yet does for `Characters`.
232
+
233
+ ```typescript
234
+ import { AITextToSpeechRunner } from '@memberjunction/ai-prompts';
235
+
236
+ const result = await new AITextToSpeechRunner().RunTextToSpeech({
237
+ text: 'Your report is ready.',
238
+ voice: 'alloy',
239
+ ContextUser: contextUser,
240
+ });
241
+ if (result.Success) {
242
+ const audio = result.SpeechResult?.data; // the run row describes the audio but never stores it
243
+ }
244
+ ```
245
+
203
246
  ## Usage
204
247
 
205
248
  ### Basic Prompt Execution
@@ -1,109 +1,30 @@
1
- import { UserInfo, IMetadataProvider } from '@memberjunction/core';
2
- /**
3
- * Result from an embedding execution via AIModelRunner.
4
- */
5
- export interface EmbeddingRunResult {
6
- /** Whether the embedding call succeeded */
7
- Success: boolean;
8
- /** The embedding vectors (one per input text) */
9
- Vectors: number[][];
10
- /** The AIPromptRun ID created for tracking */
11
- PromptRunID: string | null;
12
- /** Total tokens used */
13
- TokensUsed: number;
14
- /** Cost of the call */
15
- Cost: number;
16
- /** Error message if failed */
17
- ErrorMessage: string | null;
18
- /** Execution time in milliseconds */
19
- ExecutionTimeMs: number;
20
- }
21
- /**
22
- * Parameters for running an embedding via AIModelRunner.
23
- */
24
- export interface EmbeddingRunParams {
25
- /** The texts to embed */
26
- Texts: string[];
27
- /** Optional: specific AIPrompt ID for this embedding operation (type=Embedding).
28
- * If not provided, uses the first active Embedding prompt found. */
29
- PromptID?: string;
30
- /** Optional: specific model ID to use. If not provided, uses the prompt's model configuration. */
31
- ModelID?: string;
32
- /** The user context for permissions and audit */
33
- ContextUser: UserInfo;
34
- /** Optional: parent run ID (e.g., agent run, classification run) for hierarchical tracking */
35
- ParentRunID?: string;
36
- /** Optional: human-readable description for the AIPromptRun record */
37
- Description?: string;
38
- /**
39
- * Optional: reduced embedding dimensions. Forwarded to the embedding provider's EmbedTexts call
40
- * for models that support dimension reduction (e.g. OpenAI text-embedding-3-*); ignored by
41
- * models that don't. The authoritative source is `MJ: Vector Indexes.Dimensions` — callers
42
- * should read it from there and pass it here.
43
- */
44
- Dimensions?: number;
45
- }
1
+ import { IMetadataProvider } from '@memberjunction/core';
2
+ import { EmbeddingRunParams, EmbeddingRunResult } from './embedding/embedding-runner.types.js';
3
+ export type { EmbeddingRunResult, EmbeddingRunParams } from './embedding/embedding-runner.types.js';
46
4
  /**
47
5
  * AIModelRunner — Lightweight AI model execution tracker for non-LLM model types.
48
6
  *
49
- * Creates AIPromptRun records for embedding calls (and future: image, audio, video)
50
- * with full token/cost tracking. Uses the same model selection and vendor failover
51
- * infrastructure as AIPromptRunner but without template rendering or validation.
52
- *
53
- * Architecture:
54
- * - @memberjunction/ai (no MJ infra): BaseEmbeddings, ModelUsage
55
- * - @memberjunction/ai-core-plus (this class): AIModelRunner — creates AIPromptRun records
56
- * - @memberjunction/ai-prompts: AIPromptRunner — LLM-specific (template rendering, validation)
57
- *
58
- * Usage:
59
- * ```typescript
60
- * const runner = new AIModelRunner();
61
- * const result = await runner.RunEmbedding({
62
- * Texts: ['Hello world', 'How are you'],
63
- * ContextUser: currentUser,
64
- * Description: 'Content item vectorization'
65
- * });
66
- * // result.PromptRunID links to the AIPromptRun record with token/cost data
67
- * ```
7
+ * @deprecated Use {@link AIEmbeddingRunner} instead. AIModelRunner is retained for backward
8
+ * compatibility and delegates all execution and prompt-run queuing to AIEmbeddingRunner.
68
9
  */
69
10
  export declare class AIModelRunner {
70
- private _provider;
11
+ private _embeddingRunner;
71
12
  /**
72
- * Fire-and-forget AIPromptRun persistence via the shared {@link BaseEntitySaveQueue}. The
73
- * embedding/model run record is observability — the caller gets its vectors regardless of whether
74
- * the tracking row persists — so saves are queued, not awaited, and the embedding call is never
75
- * blocked on a DB round-trip. The queue sequences saves per entity (the initial 'Running' INSERT
76
- * always completes before the 'Completed'/'Failed' UPDATE). `PromptRunID` is returned immediately
77
- * because `NewRecord()` client-generates the UUID.
78
- */
79
- private _promptRunQueue;
80
- /**
81
- * Optional metadata provider override. Callers should set
82
- * `instance.Provider = providerToUse` before invoking run methods
83
- * in multi-provider contexts. Falls back to the global default provider when unset.
13
+ * Optional metadata provider override.
84
14
  */
85
15
  get Provider(): IMetadataProvider;
86
16
  set Provider(value: IMetadataProvider | null);
87
17
  /**
88
18
  * Execute an embedding call with full AIPromptRun tracking.
89
- *
90
- * Creates an AIPromptRun record before the call, invokes the embedding model,
91
- * stores tokens/cost/timing on the run record, and returns the result.
19
+ * Delegates to {@link AIEmbeddingRunner.RunEmbedding}.
92
20
  *
93
21
  * @param params - Embedding execution parameters
94
22
  * @returns Result with vectors, run ID, and usage metrics
95
23
  */
96
24
  RunEmbedding(params: EmbeddingRunParams): Promise<EmbeddingRunResult>;
97
- private resolveEmbeddingModel;
98
- private findBestVendor;
99
- private createRunRecord;
100
25
  /**
101
- * Awaits all in-flight prompt-run saves queued by this runner. The normal path does NOT
102
- * call this — persistence is intentionally fire-and-forget. For tests / durability needs.
26
+ * Awaits all in-flight prompt-run saves queued by this runner.
103
27
  */
104
28
  WaitForPendingPromptRunSaves(): Promise<void>;
105
- private completeRunRecord;
106
- private failRunRecord;
107
- private errorResult;
108
29
  }
109
30
  //# sourceMappingURL=AIModelRunner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AIModelRunner.d.ts","sourceRoot":"","sources":["../src/AIModelRunner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiC,QAAQ,EAAuB,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAMvH;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAC/B,2CAA2C;IAC3C,OAAO,EAAE,OAAO,CAAC;IACjB,iDAAiD;IACjD,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC;IACpB,8CAA8C;IAC9C,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,wBAAwB;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,uBAAuB;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,qCAAqC;IACrC,eAAe,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAC/B,yBAAyB;IACzB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB;yEACqE;IACrE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kGAAkG;IAClG,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iDAAiD;IACjD,WAAW,EAAE,QAAQ,CAAC;IACtB,8FAA8F;IAC9F,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sEAAsE;IACtE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,aAAa;IACtB,OAAO,CAAC,SAAS,CAAkC;IAEnD;;;;;;;OAOG;IACH,OAAO,CAAC,eAAe,CAA6B;IAEpD;;;;OAIG;IACH,IAAW,QAAQ,IAAI,iBAAiB,CAEvC;IACD,IAAW,QAAQ,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,EAElD;IAED;;;;;;;;OAQG;IACU,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC;YA+DpE,qBAAqB;IAyFnC,OAAO,CAAC,cAAc;YAmBR,eAAe;IAgD7B;;;OAGG;IACU,4BAA4B,IAAI,OAAO,CAAC,IAAI,CAAC;YAI5C,iBAAiB;YA0CjB,aAAa;IAsB3B,OAAO,CAAC,WAAW;CAWtB"}
1
+ {"version":3,"file":"AIModelRunner.d.ts","sourceRoot":"","sources":["../src/AIModelRunner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAE5F,YAAY,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAEjG;;;;;GAKG;AACH,qBAAa,aAAa;IACtB,OAAO,CAAC,gBAAgB,CAA2B;IAEnD;;OAEG;IACH,IAAW,QAAQ,IAAI,iBAAiB,CAEvC;IACD,IAAW,QAAQ,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,EAElD;IAED;;;;;;OAMG;IACU,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAIlF;;OAEG;IACU,4BAA4B,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7D"}
@@ -1,308 +1,38 @@
1
- import { BaseEntitySaveQueue, Metadata, LogError } from '@memberjunction/core';
2
- import { MJGlobal, UUIDsEqual } from '@memberjunction/global';
3
- import { BaseEmbeddings, GetAIAPIKey } from '@memberjunction/ai';
4
- import { AIEngineBase } from '@memberjunction/ai-engine-base';
1
+ import { AIEmbeddingRunner } from './embedding/AIEmbeddingRunner.js';
5
2
  /**
6
3
  * AIModelRunner — Lightweight AI model execution tracker for non-LLM model types.
7
4
  *
8
- * Creates AIPromptRun records for embedding calls (and future: image, audio, video)
9
- * with full token/cost tracking. Uses the same model selection and vendor failover
10
- * infrastructure as AIPromptRunner but without template rendering or validation.
11
- *
12
- * Architecture:
13
- * - @memberjunction/ai (no MJ infra): BaseEmbeddings, ModelUsage
14
- * - @memberjunction/ai-core-plus (this class): AIModelRunner — creates AIPromptRun records
15
- * - @memberjunction/ai-prompts: AIPromptRunner — LLM-specific (template rendering, validation)
16
- *
17
- * Usage:
18
- * ```typescript
19
- * const runner = new AIModelRunner();
20
- * const result = await runner.RunEmbedding({
21
- * Texts: ['Hello world', 'How are you'],
22
- * ContextUser: currentUser,
23
- * Description: 'Content item vectorization'
24
- * });
25
- * // result.PromptRunID links to the AIPromptRun record with token/cost data
26
- * ```
5
+ * @deprecated Use {@link AIEmbeddingRunner} instead. AIModelRunner is retained for backward
6
+ * compatibility and delegates all execution and prompt-run queuing to AIEmbeddingRunner.
27
7
  */
28
8
  export class AIModelRunner {
29
9
  constructor() {
30
- this._provider = null;
31
- /**
32
- * Fire-and-forget AIPromptRun persistence via the shared {@link BaseEntitySaveQueue}. The
33
- * embedding/model run record is observability — the caller gets its vectors regardless of whether
34
- * the tracking row persists — so saves are queued, not awaited, and the embedding call is never
35
- * blocked on a DB round-trip. The queue sequences saves per entity (the initial 'Running' INSERT
36
- * always completes before the 'Completed'/'Failed' UPDATE). `PromptRunID` is returned immediately
37
- * because `NewRecord()` client-generates the UUID.
38
- */
39
- this._promptRunQueue = new BaseEntitySaveQueue();
10
+ this._embeddingRunner = new AIEmbeddingRunner();
40
11
  }
41
12
  /**
42
- * Optional metadata provider override. Callers should set
43
- * `instance.Provider = providerToUse` before invoking run methods
44
- * in multi-provider contexts. Falls back to the global default provider when unset.
13
+ * Optional metadata provider override.
45
14
  */
46
15
  get Provider() {
47
- return this._provider ?? new Metadata();
16
+ return this._embeddingRunner.Provider;
48
17
  }
49
18
  set Provider(value) {
50
- this._provider = value;
19
+ this._embeddingRunner.Provider = value;
51
20
  }
52
21
  /**
53
22
  * Execute an embedding call with full AIPromptRun tracking.
54
- *
55
- * Creates an AIPromptRun record before the call, invokes the embedding model,
56
- * stores tokens/cost/timing on the run record, and returns the result.
23
+ * Delegates to {@link AIEmbeddingRunner.RunEmbedding}.
57
24
  *
58
25
  * @param params - Embedding execution parameters
59
26
  * @returns Result with vectors, run ID, and usage metrics
60
27
  */
61
28
  async RunEmbedding(params) {
62
- const startTime = Date.now();
63
- try {
64
- // Ensure AIEngine is loaded
65
- await AIEngineBase.Instance.Config(false, params.ContextUser);
66
- // Resolve the embedding prompt and model
67
- const { prompt, modelInfo } = await this.resolveEmbeddingModel(params);
68
- if (!modelInfo) {
69
- return this.errorResult('No embedding model available', startTime);
70
- }
71
- // Create AIPromptRun record (before the call)
72
- const promptRun = await this.createRunRecord(prompt, modelInfo.ModelID, modelInfo.VendorID, params, startTime);
73
- // Execute the embedding call
74
- const embeddingInstance = MJGlobal.Instance.ClassFactory.CreateInstance(BaseEmbeddings, modelInfo.DriverClass, GetAIAPIKey(modelInfo.DriverClass));
75
- if (!embeddingInstance) {
76
- await this.failRunRecord(promptRun, 'Failed to create embedding instance', startTime);
77
- return this.errorResult(`No embedding provider for driver: ${modelInfo.DriverClass}`, startTime);
78
- }
79
- const embedResult = await embeddingInstance.EmbedTexts({
80
- texts: params.Texts,
81
- model: modelInfo.APIName,
82
- dimensions: params.Dimensions
83
- });
84
- if (!embedResult || !embedResult.vectors || embedResult.vectors.length === 0) {
85
- await this.failRunRecord(promptRun, 'Embedding returned no vectors', startTime);
86
- return this.errorResult('Embedding returned no vectors', startTime);
87
- }
88
- // Update AIPromptRun with usage data
89
- await this.completeRunRecord(promptRun, embedResult, startTime);
90
- return {
91
- Success: true,
92
- Vectors: embedResult.vectors,
93
- PromptRunID: promptRun?.ID ?? null,
94
- TokensUsed: embedResult.ModelUsage?.totalTokens ?? 0,
95
- Cost: embedResult.ModelUsage?.cost ?? 0,
96
- ErrorMessage: null,
97
- ExecutionTimeMs: Date.now() - startTime,
98
- };
99
- }
100
- catch (error) {
101
- const msg = error instanceof Error ? error.message : String(error);
102
- LogError(`AIModelRunner.RunEmbedding failed: ${msg}`);
103
- return this.errorResult(msg, startTime);
104
- }
105
- }
106
- // ================================================================
107
- // Private: Model Resolution
108
- // ================================================================
109
- async resolveEmbeddingModel(params) {
110
- const aiEngine = AIEngineBase.Instance;
111
- // Find the embedding prompt
112
- let prompt = null;
113
- if (params.PromptID) {
114
- prompt = aiEngine.Prompts.find(p => UUIDsEqual(p.ID, params.PromptID)) ?? null;
115
- }
116
- else {
117
- // Find first active Embedding-type prompt
118
- prompt = aiEngine.Prompts.find(p => p.Type?.toLowerCase() === 'embedding' && p.Status === 'Active') ?? null;
119
- }
120
- // If explicit model ID provided, use it directly
121
- if (params.ModelID) {
122
- const model = aiEngine.Models.find(m => UUIDsEqual(m.ID, params.ModelID));
123
- if (model) {
124
- const vendor = this.findBestVendor(model.ID);
125
- if (vendor) {
126
- return {
127
- prompt,
128
- modelInfo: {
129
- ModelID: model.ID,
130
- VendorID: vendor.VendorID,
131
- DriverClass: vendor.DriverClass,
132
- APIName: vendor.APIName ?? model.APIName ?? model.Name,
133
- }
134
- };
135
- }
136
- }
137
- }
138
- // Use prompt's model configuration if available
139
- if (prompt) {
140
- const promptModels = aiEngine.PromptModels
141
- .filter(pm => pm.PromptID === prompt.ID)
142
- .sort((a, b) => (b.Priority ?? 0) - (a.Priority ?? 0));
143
- for (const pm of promptModels) {
144
- // Look up model vendor to get driver class
145
- const vendor = this.findBestVendor(pm.ModelID);
146
- if (vendor) {
147
- return {
148
- prompt,
149
- modelInfo: {
150
- ModelID: pm.ModelID,
151
- VendorID: vendor.VendorID,
152
- DriverClass: vendor.DriverClass,
153
- APIName: vendor.APIName ?? '',
154
- }
155
- };
156
- }
157
- }
158
- }
159
- // Fallback: find smallest active embedding model
160
- const embeddingModels = aiEngine.Models.filter(m => {
161
- const modelType = typeof m.AIModelType === 'string' ? m.AIModelType.trim().toLowerCase() : '';
162
- return modelType === 'embeddings';
163
- });
164
- if (embeddingModels.length === 0)
165
- return { prompt, modelInfo: null };
166
- const sorted = [...embeddingModels].sort((a, b) => (a.InputTokenLimit ?? Number.MAX_SAFE_INTEGER) - (b.InputTokenLimit ?? Number.MAX_SAFE_INTEGER));
167
- for (const model of sorted) {
168
- const vendor = this.findBestVendor(model.ID);
169
- if (vendor) {
170
- return {
171
- prompt,
172
- modelInfo: {
173
- ModelID: model.ID,
174
- VendorID: vendor.VendorID,
175
- DriverClass: vendor.DriverClass,
176
- APIName: vendor.APIName ?? model.APIName ?? model.Name,
177
- }
178
- };
179
- }
180
- }
181
- return { prompt, modelInfo: null };
182
- }
183
- findBestVendor(modelID) {
184
- const aiEngine = AIEngineBase.Instance;
185
- const vendors = aiEngine.ModelVendors
186
- .filter(mv => mv.ModelID === modelID && mv.Status === 'Active' && mv.DriverClass != null)
187
- .sort((a, b) => (b.Priority ?? 0) - (a.Priority ?? 0));
188
- for (const v of vendors) {
189
- const apiKey = GetAIAPIKey(v.DriverClass);
190
- if (apiKey) {
191
- return { VendorID: v.VendorID ?? '', DriverClass: v.DriverClass, APIName: v.APIName };
192
- }
193
- }
194
- return null;
195
- }
196
- // ================================================================
197
- // Private: AIPromptRun CRUD
198
- // ================================================================
199
- async createRunRecord(prompt, modelID, vendorID, params, startTime) {
200
- try {
201
- const md = this.Provider;
202
- const promptRun = await md.GetEntityObject('MJ: AI Prompt Runs', params.ContextUser);
203
- promptRun.NewRecord();
204
- if (prompt) {
205
- promptRun.PromptID = prompt.ID;
206
- }
207
- promptRun.ModelID = modelID;
208
- promptRun.VendorID = vendorID || null;
209
- promptRun.Status = 'Running';
210
- promptRun.RunAt = new Date(startTime);
211
- promptRun.Cancelled = false;
212
- promptRun.CacheHit = false;
213
- promptRun.StreamingEnabled = false;
214
- if (params.ParentRunID) {
215
- promptRun.ParentID = params.ParentRunID;
216
- }
217
- // Store description in Messages field as context
218
- if (params.Description) {
219
- promptRun.Messages = JSON.stringify({
220
- description: params.Description,
221
- textCount: params.Texts.length,
222
- totalChars: params.Texts.reduce((sum, t) => sum + t.length, 0),
223
- });
224
- }
225
- // Fire-and-forget the initial 'Running' INSERT — ID is already assigned by NewRecord()
226
- // so the returned PromptRunID is valid immediately; the UPDATE chains after this.
227
- this._promptRunQueue.Insert(promptRun);
228
- return promptRun;
229
- }
230
- catch (error) {
231
- LogError(`AIModelRunner: Error creating AIPromptRun: ${error}`);
232
- return null;
233
- }
29
+ return this._embeddingRunner.RunEmbedding(params);
234
30
  }
235
31
  /**
236
- * Awaits all in-flight prompt-run saves queued by this runner. The normal path does NOT
237
- * call this — persistence is intentionally fire-and-forget. For tests / durability needs.
32
+ * Awaits all in-flight prompt-run saves queued by this runner.
238
33
  */
239
34
  async WaitForPendingPromptRunSaves() {
240
- await this._promptRunQueue.Flush();
241
- }
242
- async completeRunRecord(promptRun, embedResult, startTime) {
243
- if (!promptRun)
244
- return;
245
- try {
246
- promptRun.Status = 'Completed';
247
- promptRun.Success = true;
248
- promptRun.CompletedAt = new Date();
249
- promptRun.ExecutionTimeMS = Date.now() - startTime;
250
- // Store token/cost from ModelUsage
251
- if (embedResult.ModelUsage) {
252
- // TokensPrompt = UNCACHED ("net-new") input; cache reads/writes tracked separately.
253
- // TokensUsed = totalTokens = promptTokens + completionTokens (EXCLUDES cache), to
254
- // satisfy the AIPromptRun invariant TokensUsed === TokensPrompt + TokensCompletion.
255
- // (Embeddings don't cache, so cache buckets are 0 here regardless.)
256
- promptRun.TokensPrompt = embedResult.ModelUsage.promptTokens ?? 0;
257
- promptRun.TokensCompletion = embedResult.ModelUsage.completionTokens ?? 0;
258
- promptRun.TokensUsed = embedResult.ModelUsage.totalTokens ?? 0;
259
- promptRun.TokensCacheRead = embedResult.ModelUsage.cacheReadTokens ?? 0;
260
- promptRun.TokensCacheWrite = embedResult.ModelUsage.cacheWriteTokens ?? 0;
261
- promptRun.Cost = embedResult.ModelUsage.cost ?? 0;
262
- promptRun.CostCurrency = embedResult.ModelUsage.costCurrency ?? 'USD';
263
- promptRun.QueueTime = embedResult.ModelUsage.queueTime ?? 0;
264
- promptRun.PromptTime = embedResult.ModelUsage.promptTime ?? 0;
265
- promptRun.CompletionTime = embedResult.ModelUsage.completionTime ?? 0;
266
- }
267
- // Store vector count in Result
268
- promptRun.Result = JSON.stringify({
269
- vectorCount: embedResult.vectors?.length ?? 0,
270
- dimensions: embedResult.vectors?.[0]?.length ?? 0,
271
- });
272
- this._promptRunQueue.Update(promptRun); // fire-and-forget UPDATE; the INSERT landed during the embedding call
273
- }
274
- catch (error) {
275
- LogError(`AIModelRunner: Error completing AIPromptRun: ${error}`);
276
- }
277
- }
278
- async failRunRecord(promptRun, errorMessage, startTime) {
279
- if (!promptRun)
280
- return;
281
- try {
282
- promptRun.Status = 'Failed';
283
- promptRun.Success = false;
284
- promptRun.ErrorMessage = errorMessage;
285
- promptRun.CompletedAt = new Date();
286
- promptRun.ExecutionTimeMS = Date.now() - startTime;
287
- this._promptRunQueue.Update(promptRun); // fire-and-forget UPDATE; the INSERT landed during the embedding call
288
- }
289
- catch (error) {
290
- LogError(`AIModelRunner: Error failing AIPromptRun: ${error}`);
291
- }
292
- }
293
- // ================================================================
294
- // Private: Helpers
295
- // ================================================================
296
- errorResult(message, startTime) {
297
- return {
298
- Success: false,
299
- Vectors: [],
300
- PromptRunID: null,
301
- TokensUsed: 0,
302
- Cost: 0,
303
- ErrorMessage: message,
304
- ExecutionTimeMs: Date.now() - startTime,
305
- };
35
+ await this._embeddingRunner.WaitForPendingPromptRunSaves();
306
36
  }
307
37
  }
308
38
  //# sourceMappingURL=AIModelRunner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AIModelRunner.js","sourceRoot":"","sources":["../src/AIModelRunner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,QAAQ,EAAY,QAAQ,EAAgC,MAAM,sBAAsB,CAAC;AACvH,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAoB,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACnF,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAiD9D;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,OAAO,aAAa;IAA1B;QACY,cAAS,GAA6B,IAAI,CAAC;QAEnD;;;;;;;WAOG;QACK,oBAAe,GAAG,IAAI,mBAAmB,EAAE,CAAC;IAqUxD,CAAC;IAnUG;;;;OAIG;IACH,IAAW,QAAQ;QACf,OAAO,IAAI,CAAC,SAAS,IAAK,IAAI,QAAQ,EAAmC,CAAC;IAC9E,CAAC;IACD,IAAW,QAAQ,CAAC,KAA+B;QAC/C,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED;;;;;;;;OAQG;IACI,KAAK,CAAC,YAAY,CAAC,MAA0B;QAChD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,IAAI,CAAC;YACD,4BAA4B;YAC5B,MAAM,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;YAE9D,yCAAyC;YACzC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;YACvE,IAAI,CAAC,SAAS,EAAE,CAAC;gBACb,OAAO,IAAI,CAAC,WAAW,CAAC,8BAA8B,EAAE,SAAS,CAAC,CAAC;YACvE,CAAC;YAED,8CAA8C;YAC9C,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,eAAe,CACxC,MAAM,EAAE,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CACnE,CAAC;YAEF,6BAA6B;YAC7B,MAAM,iBAAiB,GAAG,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,cAAc,CACnE,cAAc,EAAE,SAAS,CAAC,WAAW,EAAE,WAAW,CAAC,SAAS,CAAC,WAAW,CAAC,CAC5E,CAAC;YAEF,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACrB,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,qCAAqC,EAAE,SAAS,CAAC,CAAC;gBACtF,OAAO,IAAI,CAAC,WAAW,CAAC,qCAAqC,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,CAAC,CAAC;YACrG,CAAC;YAED,MAAM,WAAW,GAAG,MAAM,iBAAiB,CAAC,UAAU,CAAC;gBACnD,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,KAAK,EAAE,SAAS,CAAC,OAAO;gBACxB,UAAU,EAAE,MAAM,CAAC,UAAU;aAChC,CAAC,CAAC;YAEH,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW,CAAC,OAAO,IAAI,WAAW,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3E,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,+BAA+B,EAAE,SAAS,CAAC,CAAC;gBAChF,OAAO,IAAI,CAAC,WAAW,CAAC,+BAA+B,EAAE,SAAS,CAAC,CAAC;YACxE,CAAC;YAED,qCAAqC;YACrC,MAAM,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;YAEhE,OAAO;gBACH,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,WAAW,CAAC,OAAO;gBAC5B,WAAW,EAAE,SAAS,EAAE,EAAE,IAAI,IAAI;gBAClC,UAAU,EAAE,WAAW,CAAC,UAAU,EAAE,WAAW,IAAI,CAAC;gBACpD,IAAI,EAAE,WAAW,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC;gBACvC,YAAY,EAAE,IAAI;gBAClB,eAAe,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;aAC1C,CAAC;QAEN,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACnE,QAAQ,CAAC,sCAAsC,GAAG,EAAE,CAAC,CAAC;YACtD,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC5C,CAAC;IACL,CAAC;IAED,mEAAmE;IACnE,4BAA4B;IAC5B,mEAAmE;IAE3D,KAAK,CAAC,qBAAqB,CAAC,MAA0B;QAI1D,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC;QAEvC,4BAA4B;QAC5B,IAAI,MAAM,GAAoC,IAAI,CAAC;QACnD,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,IAAI,CAAC;QACnF,CAAC;aAAM,CAAC;YACJ,0CAA0C;YAC1C,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAC/B,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,WAAW,IAAI,CAAC,CAAC,MAAM,KAAK,QAAQ,CACjE,IAAI,IAAI,CAAC;QACd,CAAC;QAED,iDAAiD;QACjD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;YAC1E,IAAI,KAAK,EAAE,CAAC;gBACR,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBAC7C,IAAI,MAAM,EAAE,CAAC;oBACT,OAAO;wBACH,MAAM;wBACN,SAAS,EAAE;4BACP,OAAO,EAAE,KAAK,CAAC,EAAE;4BACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;4BACzB,WAAW,EAAE,MAAM,CAAC,WAAW;4BAC/B,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI;yBACzD;qBACJ,CAAC;gBACN,CAAC;YACL,CAAC;QACL,CAAC;QAED,gDAAgD;QAChD,IAAI,MAAM,EAAE,CAAC;YACT,MAAM,YAAY,GAAG,QAAQ,CAAC,YAAY;iBACrC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,KAAK,MAAO,CAAC,EAAE,CAAC;iBACxC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC;YAE3D,KAAK,MAAM,EAAE,IAAI,YAAY,EAAE,CAAC;gBAC5B,2CAA2C;gBAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;gBAC/C,IAAI,MAAM,EAAE,CAAC;oBACT,OAAO;wBACH,MAAM;wBACN,SAAS,EAAE;4BACP,OAAO,EAAE,EAAE,CAAC,OAAO;4BACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;4BACzB,WAAW,EAAE,MAAM,CAAC,WAAW;4BAC/B,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE;yBAChC;qBACJ,CAAC;gBACN,CAAC;YACL,CAAC;QACL,CAAC;QAED,iDAAiD;QACjD,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;YAC/C,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9F,OAAO,SAAS,KAAK,YAAY,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAErE,MAAM,MAAM,GAAG,CAAC,GAAG,eAAe,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC9C,CAAC,CAAC,CAAC,eAAe,IAAI,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,eAAe,IAAI,MAAM,CAAC,gBAAgB,CAAC,CAClG,CAAC;QAEF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC7C,IAAI,MAAM,EAAE,CAAC;gBACT,OAAO;oBACH,MAAM;oBACN,SAAS,EAAE;wBACP,OAAO,EAAE,KAAK,CAAC,EAAE;wBACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;wBACzB,WAAW,EAAE,MAAM,CAAC,WAAW;wBAC/B,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI;qBACzD;iBACJ,CAAC;YACN,CAAC;QACL,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACvC,CAAC;IAEO,cAAc,CAAC,OAAe;QAClC,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC;QACvC,MAAM,OAAO,GAAG,QAAQ,CAAC,YAAY;aAChC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,KAAK,OAAO,IAAI,EAAE,CAAC,MAAM,KAAK,QAAQ,IAAI,EAAE,CAAC,WAAW,IAAI,IAAI,CAAC;aACxF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC;QAE3D,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACtB,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,WAAY,CAAC,CAAC;YAC3C,IAAI,MAAM,EAAE,CAAC;gBACT,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC,WAAY,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;YAC3F,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,mEAAmE;IACnE,4BAA4B;IAC5B,mEAAmE;IAE3D,KAAK,CAAC,eAAe,CACzB,MAAuC,EACvC,OAAe,EACf,QAAgB,EAChB,MAA0B,EAC1B,SAAiB;QAEjB,IAAI,CAAC;YACD,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;YACzB,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,eAAe,CACtC,oBAAoB,EAAE,MAAM,CAAC,WAAW,CAC3C,CAAC;YACF,SAAS,CAAC,SAAS,EAAE,CAAC;YAEtB,IAAI,MAAM,EAAE,CAAC;gBACT,SAAS,CAAC,QAAQ,GAAG,MAAM,CAAC,EAAE,CAAC;YACnC,CAAC;YACD,SAAS,CAAC,OAAO,GAAG,OAAO,CAAC;YAC5B,SAAS,CAAC,QAAQ,GAAG,QAAQ,IAAI,IAAI,CAAC;YACtC,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC;YAC7B,SAAS,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;YACtC,SAAS,CAAC,SAAS,GAAG,KAAK,CAAC;YAC5B,SAAS,CAAC,QAAQ,GAAG,KAAK,CAAC;YAC3B,SAAS,CAAC,gBAAgB,GAAG,KAAK,CAAC;YAEnC,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;gBACrB,SAAS,CAAC,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC;YAC5C,CAAC;YAED,iDAAiD;YACjD,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;gBACrB,SAAS,CAAC,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC;oBAChC,WAAW,EAAE,MAAM,CAAC,WAAW;oBAC/B,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM;oBAC9B,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;iBACjE,CAAC,CAAC;YACP,CAAC;YAED,uFAAuF;YACvF,kFAAkF;YAClF,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACvC,OAAO,SAAS,CAAC;QACrB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,QAAQ,CAAC,8CAA8C,KAAK,EAAE,CAAC,CAAC;YAChE,OAAO,IAAI,CAAC;QAChB,CAAC;IACL,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,4BAA4B;QACrC,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;IACvC,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAC3B,SAA6C,EAC7C,WAA6B,EAC7B,SAAiB;QAEjB,IAAI,CAAC,SAAS;YAAE,OAAO;QACvB,IAAI,CAAC;YACD,SAAS,CAAC,MAAM,GAAG,WAAW,CAAC;YAC/B,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC;YACzB,SAAS,CAAC,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC;YACnC,SAAS,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAEnD,mCAAmC;YACnC,IAAI,WAAW,CAAC,UAAU,EAAE,CAAC;gBACzB,oFAAoF;gBACpF,kFAAkF;gBAClF,oFAAoF;gBACpF,oEAAoE;gBACpE,SAAS,CAAC,YAAY,GAAG,WAAW,CAAC,UAAU,CAAC,YAAY,IAAI,CAAC,CAAC;gBAClE,SAAS,CAAC,gBAAgB,GAAG,WAAW,CAAC,UAAU,CAAC,gBAAgB,IAAI,CAAC,CAAC;gBAC1E,SAAS,CAAC,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC,WAAW,IAAI,CAAC,CAAC;gBAC/D,SAAS,CAAC,eAAe,GAAG,WAAW,CAAC,UAAU,CAAC,eAAe,IAAI,CAAC,CAAC;gBACxE,SAAS,CAAC,gBAAgB,GAAG,WAAW,CAAC,UAAU,CAAC,gBAAgB,IAAI,CAAC,CAAC;gBAC1E,SAAS,CAAC,IAAI,GAAG,WAAW,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,CAAC;gBAClD,SAAS,CAAC,YAAY,GAAG,WAAW,CAAC,UAAU,CAAC,YAAY,IAAI,KAAK,CAAC;gBACtE,SAAS,CAAC,SAAS,GAAG,WAAW,CAAC,UAAU,CAAC,SAAS,IAAI,CAAC,CAAC;gBAC5D,SAAS,CAAC,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC,UAAU,IAAI,CAAC,CAAC;gBAC9D,SAAS,CAAC,cAAc,GAAG,WAAW,CAAC,UAAU,CAAC,cAAc,IAAI,CAAC,CAAC;YAC1E,CAAC;YAED,+BAA+B;YAC/B,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC;gBAC9B,WAAW,EAAE,WAAW,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;gBAC7C,UAAU,EAAE,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC;aACpD,CAAC,CAAC;YAEH,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,sEAAsE;QAClH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,QAAQ,CAAC,gDAAgD,KAAK,EAAE,CAAC,CAAC;QACtE,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,aAAa,CACvB,SAA6C,EAC7C,YAAoB,EACpB,SAAiB;QAEjB,IAAI,CAAC,SAAS;YAAE,OAAO;QACvB,IAAI,CAAC;YACD,SAAS,CAAC,MAAM,GAAG,QAAQ,CAAC;YAC5B,SAAS,CAAC,OAAO,GAAG,KAAK,CAAC;YAC1B,SAAS,CAAC,YAAY,GAAG,YAAY,CAAC;YACtC,SAAS,CAAC,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC;YACnC,SAAS,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YACnD,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,sEAAsE;QAClH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,QAAQ,CAAC,6CAA6C,KAAK,EAAE,CAAC,CAAC;QACnE,CAAC;IACL,CAAC;IAED,mEAAmE;IACnE,mBAAmB;IACnB,mEAAmE;IAE3D,WAAW,CAAC,OAAe,EAAE,SAAiB;QAClD,OAAO;YACH,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,EAAE;YACX,WAAW,EAAE,IAAI;YACjB,UAAU,EAAE,CAAC;YACb,IAAI,EAAE,CAAC;YACP,YAAY,EAAE,OAAO;YACrB,eAAe,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;SAC1C,CAAC;IACN,CAAC;CACJ"}
1
+ {"version":3,"file":"AIModelRunner.js","sourceRoot":"","sources":["../src/AIModelRunner.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAKlE;;;;;GAKG;AACH,MAAM,OAAO,aAAa;IAA1B;QACY,qBAAgB,GAAG,IAAI,iBAAiB,EAAE,CAAC;IA6BvD,CAAC;IA3BG;;OAEG;IACH,IAAW,QAAQ;QACf,OAAO,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC;IAC1C,CAAC;IACD,IAAW,QAAQ,CAAC,KAA+B;QAC/C,IAAI,CAAC,gBAAgB,CAAC,QAAQ,GAAG,KAAK,CAAC;IAC3C,CAAC;IAED;;;;;;OAMG;IACI,KAAK,CAAC,YAAY,CAAC,MAA0B;QAChD,OAAO,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IACtD,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,4BAA4B;QACrC,MAAM,IAAI,CAAC,gBAAgB,CAAC,4BAA4B,EAAE,CAAC;IAC/D,CAAC;CACJ"}