@micrantha/react-native-amaryllis 0.1.1 → 0.1.5

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 (72) hide show
  1. package/README.md +43 -8
  2. package/android/src/main/java/com/micrantha/amaryllis/Amaryllis.kt +83 -8
  3. package/lib/module/Amaryllis.js +75 -20
  4. package/lib/module/Amaryllis.js.map +1 -1
  5. package/lib/module/AmaryllisContext.js +14 -4
  6. package/lib/module/AmaryllisContext.js.map +1 -1
  7. package/lib/module/AmaryllisHooks.js +87 -4
  8. package/lib/module/AmaryllisHooks.js.map +1 -1
  9. package/lib/module/AmaryllisRx.js +15 -14
  10. package/lib/module/AmaryllisRx.js.map +1 -1
  11. package/lib/module/ContextEngine.js +87 -0
  12. package/lib/module/ContextEngine.js.map +1 -0
  13. package/lib/module/ContextEngineContext.js +22 -0
  14. package/lib/module/ContextEngineContext.js.map +1 -0
  15. package/lib/module/ContextPolicies.js +46 -0
  16. package/lib/module/ContextPolicies.js.map +1 -0
  17. package/lib/module/ContextTypes.js +4 -0
  18. package/lib/module/ContextTypes.js.map +1 -0
  19. package/lib/module/ContextValidation.js +189 -0
  20. package/lib/module/ContextValidation.js.map +1 -0
  21. package/lib/module/Errors.js +46 -0
  22. package/lib/module/Errors.js.map +1 -0
  23. package/lib/module/NativeAmaryllis.js.map +1 -1
  24. package/lib/module/TypeConverters.js +80 -0
  25. package/lib/module/TypeConverters.js.map +1 -0
  26. package/lib/module/context.js +8 -0
  27. package/lib/module/context.js.map +1 -0
  28. package/lib/module/index.js +4 -0
  29. package/lib/module/index.js.map +1 -1
  30. package/lib/typescript/src/Amaryllis.d.ts.map +1 -1
  31. package/lib/typescript/src/AmaryllisContext.d.ts.map +1 -1
  32. package/lib/typescript/src/AmaryllisHooks.d.ts +8 -1
  33. package/lib/typescript/src/AmaryllisHooks.d.ts.map +1 -1
  34. package/lib/typescript/src/AmaryllisRx.d.ts.map +1 -1
  35. package/lib/typescript/src/ContextEngine.d.ts +19 -0
  36. package/lib/typescript/src/ContextEngine.d.ts.map +1 -0
  37. package/lib/typescript/src/ContextEngineContext.d.ts +9 -0
  38. package/lib/typescript/src/ContextEngineContext.d.ts.map +1 -0
  39. package/lib/typescript/src/ContextPolicies.d.ts +4 -0
  40. package/lib/typescript/src/ContextPolicies.d.ts.map +1 -0
  41. package/lib/typescript/src/ContextTypes.d.ts +92 -0
  42. package/lib/typescript/src/ContextTypes.d.ts.map +1 -0
  43. package/lib/typescript/src/ContextValidation.d.ts +9 -0
  44. package/lib/typescript/src/ContextValidation.d.ts.map +1 -0
  45. package/lib/typescript/src/Errors.d.ts +22 -0
  46. package/lib/typescript/src/Errors.d.ts.map +1 -0
  47. package/lib/typescript/src/NativeAmaryllis.d.ts +24 -4
  48. package/lib/typescript/src/NativeAmaryllis.d.ts.map +1 -1
  49. package/lib/typescript/src/TypeConverters.d.ts +43 -0
  50. package/lib/typescript/src/TypeConverters.d.ts.map +1 -0
  51. package/lib/typescript/src/Types.d.ts +14 -0
  52. package/lib/typescript/src/Types.d.ts.map +1 -1
  53. package/lib/typescript/src/context.d.ts +8 -0
  54. package/lib/typescript/src/context.d.ts.map +1 -0
  55. package/lib/typescript/src/index.d.ts +5 -0
  56. package/lib/typescript/src/index.d.ts.map +1 -1
  57. package/package.json +33 -27
  58. package/src/Amaryllis.ts +75 -24
  59. package/src/AmaryllisContext.tsx +19 -4
  60. package/src/AmaryllisHooks.tsx +106 -5
  61. package/src/AmaryllisRx.ts +13 -9
  62. package/src/ContextEngine.ts +133 -0
  63. package/src/ContextEngineContext.tsx +31 -0
  64. package/src/ContextPolicies.ts +54 -0
  65. package/src/ContextTypes.ts +122 -0
  66. package/src/ContextValidation.ts +279 -0
  67. package/src/Errors.ts +55 -0
  68. package/src/NativeAmaryllis.ts +18 -4
  69. package/src/TypeConverters.ts +87 -0
  70. package/src/Types.ts +9 -0
  71. package/src/context.ts +14 -0
  72. package/src/index.tsx +5 -0
package/README.md CHANGED
@@ -171,19 +171,32 @@ amaryllis.generateAsync(
171
171
  images: ['file:///path/to/image.png'],
172
172
  },
173
173
  {
174
- onPartialResult: (partial) => {
175
- console.log('Partial result:', partial);
176
- },
177
- onFinalResult: (final) => {
178
- console.log('Final result:', final);
179
- },
180
- onError: (err) => {
181
- console.error('Error:', err);
174
+ onEvent: (event) => {
175
+ if (event.type === 'partial') {
176
+ console.log('Partial result:', event.text);
177
+ return;
178
+ }
179
+ if (event.type === 'final') {
180
+ console.log('Final result:', event.text);
181
+ return;
182
+ }
183
+ console.error('Error:', event.error);
182
184
  },
183
185
  }
184
186
  );
185
187
  ```
186
188
 
189
+ Note: `onPartialResult`, `onFinalResult`, and `onError` are deprecated and will be removed in a future release. Use `onEvent` instead.
190
+
191
+ `onEvent` receives a discriminated union:
192
+
193
+ ```ts
194
+ type LlmEvent =
195
+ | { type: 'partial'; text: string }
196
+ | { type: 'final'; text: string }
197
+ | { type: 'error'; error: Error };
198
+ ```
199
+
187
200
  You can cancel an async generate if needed.
188
201
 
189
202
  ```javascript
@@ -192,9 +205,31 @@ amaryllis.cancelAsync();
192
205
 
193
206
  ---
194
207
 
208
+ ## 🧠 Context Engine
209
+
210
+ The Context Engine is an interface-first layer for memory and retrieval. You bring your own `ContextStore` (SQLite, files, or custom DB) while the engine handles validation, policy bounds, and optional scoring.
211
+ Context APIs are also available via the `react-native-amaryllis/context` subpath.
212
+
213
+ ```ts
214
+ import { ContextEngine } from 'react-native-amaryllis/context';
215
+
216
+ const engine = new ContextEngine({
217
+ store: myStore,
218
+ policy: { maxItems: 1000, defaultTtlSeconds: 60 * 60 * 24 },
219
+ });
220
+
221
+ await engine.add([{ id: 'mem-1', text: 'Quest started', createdAt: Date.now() }]);
222
+ const results = await engine.search({ text: 'quest', limit: 5 });
223
+ ```
224
+
225
+ See `docs/context-engine.md` for details.
226
+
227
+ ---
228
+
195
229
  ## 📚 Documentation
196
230
 
197
231
  - [API Reference](src/Types.ts)
232
+ - [Context Engine](docs/context-engine.md)
198
233
  - [Example App](example/)
199
234
  - [Demo Video](docs/demo.mp4)
200
235
  - [Development workflow](CONTRIBUTING.md)
@@ -6,6 +6,7 @@ import android.util.Log
6
6
  import androidx.core.graphics.scale
7
7
  import androidx.core.net.toFile
8
8
  import androidx.core.net.toUri
9
+ import java.io.File as JavaFile
9
10
  import com.facebook.react.bridge.ReadableArray
10
11
  import com.facebook.react.bridge.ReadableMap
11
12
  import com.google.mediapipe.framework.image.BitmapImageBuilder
@@ -33,6 +34,9 @@ import com.micrantha.amaryllis.AmaryllisModule.Companion.PARAM_VISION_ENCODER
33
34
  import java.io.File
34
35
  import java.io.FileOutputStream
35
36
  import java.io.IOException
37
+ import java.net.URI
38
+ import java.net.URISyntaxException
39
+ import android.os.Build
36
40
 
37
41
 
38
42
  class Amaryllis {
@@ -42,6 +46,10 @@ class Amaryllis {
42
46
 
43
47
  fun init(context: Context, config: ReadableMap) {
44
48
  val modelPath = config.getString(PARAM_MODEL_PATH) ?: throw InvalidModelPathException()
49
+
50
+ if (!isValidFilePath(modelPath)) {
51
+ throw InvalidModelPathException()
52
+ }
45
53
 
46
54
  val taskOptions = LlmInference.LlmInferenceOptions.builder()
47
55
  .setModelPath(modelPath).apply {
@@ -168,19 +176,73 @@ class Amaryllis {
168
176
  targetWidth: Int = 512,
169
177
  targetHeight: Int = 512
170
178
  ): MPImage? {
171
- val file = uri.toUri().toFile()
179
+ if (!isValidFilePath(uri)) {
180
+ Log.w(NAME, "Invalid file URI: $uri")
181
+ return null
182
+ }
183
+
184
+ val file: File
185
+ try {
186
+ val parsedUri = uri.toUri()
187
+ if (parsedUri.scheme != "file") {
188
+ Log.w(NAME, "Only file:// URIs are supported: $uri")
189
+ return null
190
+ }
191
+ file = parsedUri.toFile()
192
+ } catch (e: Exception) {
193
+ Log.w(NAME, "Failed to parse URI: $uri", e)
194
+ return null
195
+ }
196
+
197
+ if (!file.exists()) {
198
+ Log.w(NAME, "File does not exist: ${file.absolutePath}")
199
+ return null
200
+ }
172
201
 
173
- if (!file.exists()) return null
202
+ // Check file size to prevent memory exhaustion (max 10MB)
203
+ val fileSize = file.length()
204
+ val maxFileSize = 10 * 1024 * 1024 // 10MB
205
+ if (fileSize > maxFileSize) {
206
+ Log.w(NAME, "File too large: ${fileSize} bytes, max allowed: $maxFileSize bytes")
207
+ return null
208
+ }
174
209
 
175
- // Decode bitmap
176
- val bitmap = BitmapFactory.decodeFile(file.absolutePath)
210
+ // Decode bitmap with options to limit memory usage
211
+ val options = BitmapFactory.Options().apply {
212
+ inJustDecodeBounds = true
213
+ }
214
+
215
+ BitmapFactory.decodeFile(file.absolutePath, options)
216
+
217
+ // Calculate sample size to reduce memory usage if image is too large
218
+ val maxSize = 2048
219
+ var sampleSize = 1
220
+ while (options.outWidth / sampleSize > maxSize || options.outHeight / sampleSize > maxSize) {
221
+ sampleSize *= 2
222
+ }
223
+
224
+ options.inJustDecodeBounds = false
225
+ options.inSampleSize = sampleSize
226
+
227
+ val bitmap = BitmapFactory.decodeFile(file.absolutePath, options)
177
228
  ?: return null
178
229
 
179
- // Resize bitmap
180
- val resized = bitmap.scale(targetWidth, targetHeight)
230
+ try {
231
+ // Resize bitmap
232
+ val resized = bitmap.scale(targetWidth, targetHeight)
233
+
234
+ // Clean up original bitmap
235
+ if (resized != bitmap) {
236
+ bitmap.recycle()
237
+ }
181
238
 
182
- // Convert to MPImage
183
- return BitmapImageBuilder(resized).build()
239
+ // Convert to MPImage
240
+ return BitmapImageBuilder(resized).build()
241
+ } catch (e: OutOfMemoryError) {
242
+ Log.w(NAME, "Out of memory when processing image: $uri", e)
243
+ bitmap.recycle()
244
+ return null
245
+ }
184
246
  }
185
247
 
186
248
  internal fun preprocessImages(
@@ -192,6 +254,19 @@ class Amaryllis {
192
254
  preprocessImage(uri, targetWidth, targetHeight)
193
255
  }
194
256
 
257
+ private fun isValidFilePath(path: String): Boolean {
258
+ if (path.isBlank()) return false
259
+
260
+ // Check for path traversal attempts
261
+ if (path.contains("..") || path.contains("~")) return false
262
+
263
+ // Check for invalid characters
264
+ val invalidChars = setOf('|', '<', '>', '"', '?', '*')
265
+ if (invalidChars.any { char -> path.contains(char) }) return false
266
+
267
+ return true
268
+ }
269
+
195
270
  inner class NotInitializedException : Exception()
196
271
  inner class SessionRequiredException : Exception()
197
272
  inner class InvalidModelPathException : Exception()
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
 
3
+ import { toNativeEngineConfig, toNativeSessionParams, toNativeRequestParams } from "./TypeConverters.js";
3
4
  const EVENT_ON_PARTIAL_RESULT = 'onPartialResult';
4
5
  const EVENT_ON_FINAL_RESULT = 'onFinalResult';
5
6
  const EVENT_ON_ERROR = 'onError';
@@ -10,45 +11,99 @@ export class LlmPipe {
10
11
  this.llmEmitter = params.eventEmitter;
11
12
  }
12
13
  async init(params) {
13
- await this.llmNative.init(params);
14
+ const nativeConfig = toNativeEngineConfig(params);
15
+ await this.llmNative.init(nativeConfig);
14
16
  }
15
17
  newSession(params) {
16
- return this.llmNative.newSession(params);
18
+ const nativeParams = toNativeSessionParams(params);
19
+ return this.llmNative.newSession(nativeParams);
17
20
  }
18
21
  async generate(params) {
19
- return await this.llmNative.generate(params);
22
+ const nativeParams = toNativeRequestParams(params);
23
+ return await this.llmNative.generate(nativeParams);
20
24
  }
21
25
  async generateAsync(params, callbacks) {
22
26
  if (callbacks) {
23
27
  this.setupAsyncCallbacks(callbacks);
24
28
  }
25
- return await this.llmNative.generateAsync(params);
29
+ const nativeParams = toNativeRequestParams(params);
30
+ return await this.llmNative.generateAsync(nativeParams);
26
31
  }
27
32
  close() {
28
- this.llmNative.close();
29
33
  this.cancelAsync();
34
+ this.llmNative.close();
30
35
  }
31
36
  cancelAsync() {
32
37
  this.llmNative.cancelAsync();
33
- this.subscriptions.forEach(sub => sub.remove());
38
+ const subsToRemove = [...this.subscriptions];
39
+ this.subscriptions = [];
40
+ subsToRemove.forEach(sub => {
41
+ try {
42
+ sub.remove();
43
+ } catch (error) {
44
+ console.warn('Failed to remove subscription:', error);
45
+ }
46
+ });
34
47
  }
35
48
  setupAsyncCallbacks(callbacks) {
36
- if (callbacks.onPartialResult) {
37
- this.subscriptions.push(this.llmEmitter.addListener(EVENT_ON_PARTIAL_RESULT, result => {
38
- callbacks.onPartialResult?.(result);
39
- }));
49
+ if (callbacks.onPartialResult || callbacks.onEvent) {
50
+ const subscription = this.llmEmitter.addListener(EVENT_ON_PARTIAL_RESULT, result => {
51
+ try {
52
+ callbacks.onEvent?.({
53
+ type: 'partial',
54
+ text: result
55
+ });
56
+ } catch (error) {
57
+ console.error('Error in onEvent callback:', error);
58
+ }
59
+ try {
60
+ callbacks.onPartialResult?.(result);
61
+ } catch (error) {
62
+ console.error('Error in onPartialResult callback:', error);
63
+ }
64
+ });
65
+ this.subscriptions.push(subscription);
40
66
  }
41
- if (callbacks.onFinalResult) {
42
- this.subscriptions.push(this.llmEmitter.addListener(EVENT_ON_FINAL_RESULT, result => {
43
- callbacks.onFinalResult?.(result);
44
- this.cancelAsync();
45
- }));
67
+ if (callbacks.onFinalResult || callbacks.onEvent) {
68
+ const subscription = this.llmEmitter.addListener(EVENT_ON_FINAL_RESULT, result => {
69
+ try {
70
+ callbacks.onEvent?.({
71
+ type: 'final',
72
+ text: result
73
+ });
74
+ } catch (error) {
75
+ console.error('Error in onEvent callback:', error);
76
+ }
77
+ try {
78
+ callbacks.onFinalResult?.(result);
79
+ } catch (error) {
80
+ console.error('Error in onFinalResult callback:', error);
81
+ } finally {
82
+ this.cancelAsync();
83
+ }
84
+ });
85
+ this.subscriptions.push(subscription);
46
86
  }
47
- if (callbacks.onError) {
48
- this.subscriptions.push(this.llmEmitter.addListener(EVENT_ON_ERROR, error => {
49
- callbacks.onError?.(new Error(error));
50
- this.cancelAsync();
51
- }));
87
+ if (callbacks.onError || callbacks.onEvent) {
88
+ const subscription = this.llmEmitter.addListener(EVENT_ON_ERROR, error => {
89
+ const errorObj = new Error(error);
90
+ try {
91
+ callbacks.onEvent?.({
92
+ type: 'error',
93
+ error: errorObj
94
+ });
95
+ } catch (callbackError) {
96
+ console.error('Error in onEvent callback:', callbackError);
97
+ }
98
+ try {
99
+ callbacks.onError?.(errorObj);
100
+ } catch (callbackError) {
101
+ console.error('Error in onError callback:', callbackError);
102
+ } finally {
103
+ this.cancelAsync();
104
+ }
105
+ });
106
+ this.subscriptions.push(subscription);
52
107
  }
53
108
  }
54
109
  }
@@ -1 +1 @@
1
- {"version":3,"names":["EVENT_ON_PARTIAL_RESULT","EVENT_ON_FINAL_RESULT","EVENT_ON_ERROR","LlmPipe","subscriptions","constructor","params","llmNative","nativeModule","llmEmitter","eventEmitter","init","newSession","generate","generateAsync","callbacks","setupAsyncCallbacks","close","cancelAsync","forEach","sub","remove","onPartialResult","push","addListener","result","onFinalResult","onError","error","Error"],"sourceRoot":"../../src","sources":["Amaryllis.ts"],"mappings":";;AAYA,MAAMA,uBAAuB,GAAG,iBAAiB;AACjD,MAAMC,qBAAqB,GAAG,eAAe;AAC7C,MAAMC,cAAc,GAAG,SAAS;AAEhC,OAAO,MAAMC,OAAO,CAAsB;EACxCC,aAAa,GAA2B,EAAE;EAI1CC,WAAWA,CAACC,MAAqB,EAAE;IACjC,IAAI,CAACC,SAAS,GAAGD,MAAM,CAACE,YAAY;IACpC,IAAI,CAACC,UAAU,GAAGH,MAAM,CAACI,YAAY;EACvC;EAEA,MAAMC,IAAIA,CAACL,MAAuB,EAAiB;IACjD,MAAM,IAAI,CAACC,SAAS,CAACI,IAAI,CAACL,MAAM,CAAC;EACnC;EAEAM,UAAUA,CAACN,MAAwB,EAAiB;IAClD,OAAO,IAAI,CAACC,SAAS,CAACK,UAAU,CAACN,MAAM,CAAC;EAC1C;EAEA,MAAMO,QAAQA,CAACP,MAAwB,EAAmB;IACxD,OAAO,MAAM,IAAI,CAACC,SAAS,CAACM,QAAQ,CAACP,MAAM,CAAC;EAC9C;EAEA,MAAMQ,aAAaA,CACjBR,MAAwB,EACxBS,SAAwB,EACT;IACf,IAAIA,SAAS,EAAE;MACb,IAAI,CAACC,mBAAmB,CAACD,SAAS,CAAC;IACrC;IAEA,OAAO,MAAM,IAAI,CAACR,SAAS,CAACO,aAAa,CAACR,MAAM,CAAC;EACnD;EAEAW,KAAKA,CAAA,EAAS;IACZ,IAAI,CAACV,SAAS,CAACU,KAAK,CAAC,CAAC;IACtB,IAAI,CAACC,WAAW,CAAC,CAAC;EACpB;EAEAA,WAAWA,CAAA,EAAS;IAClB,IAAI,CAACX,SAAS,CAACW,WAAW,CAAC,CAAC;IAC5B,IAAI,CAACd,aAAa,CAACe,OAAO,CAAEC,GAAG,IAAKA,GAAG,CAACC,MAAM,CAAC,CAAC,CAAC;EACnD;EAEAL,mBAAmBA,CAACD,SAAuB,EAAQ;IACjD,IAAIA,SAAS,CAACO,eAAe,EAAE;MAC7B,IAAI,CAAClB,aAAa,CAACmB,IAAI,CACrB,IAAI,CAACd,UAAU,CAACe,WAAW,CACzBxB,uBAAuB,EACtByB,MAAc,IAAK;QAClBV,SAAS,CAACO,eAAe,GAAGG,MAAM,CAAC;MACrC,CACF,CACF,CAAC;IACH;IAEA,IAAIV,SAAS,CAACW,aAAa,EAAE;MAC3B,IAAI,CAACtB,aAAa,CAACmB,IAAI,CACrB,IAAI,CAACd,UAAU,CAACe,WAAW,CAACvB,qBAAqB,EAAGwB,MAAc,IAAK;QACrEV,SAAS,CAACW,aAAa,GAAGD,MAAM,CAAC;QACjC,IAAI,CAACP,WAAW,CAAC,CAAC;MACpB,CAAC,CACH,CAAC;IACH;IACA,IAAIH,SAAS,CAACY,OAAO,EAAE;MACrB,IAAI,CAACvB,aAAa,CAACmB,IAAI,CACrB,IAAI,CAACd,UAAU,CAACe,WAAW,CAACtB,cAAc,EAAG0B,KAAa,IAAK;QAC7Db,SAAS,CAACY,OAAO,GAAG,IAAIE,KAAK,CAACD,KAAK,CAAC,CAAC;QACrC,IAAI,CAACV,WAAW,CAAC,CAAC;MACpB,CAAC,CACH,CAAC;IACH;EACF;AACF;AAEA,eAAef,OAAO","ignoreList":[]}
1
+ {"version":3,"names":["toNativeEngineConfig","toNativeSessionParams","toNativeRequestParams","EVENT_ON_PARTIAL_RESULT","EVENT_ON_FINAL_RESULT","EVENT_ON_ERROR","LlmPipe","subscriptions","constructor","params","llmNative","nativeModule","llmEmitter","eventEmitter","init","nativeConfig","newSession","nativeParams","generate","generateAsync","callbacks","setupAsyncCallbacks","close","cancelAsync","subsToRemove","forEach","sub","remove","error","console","warn","onPartialResult","onEvent","subscription","addListener","result","type","text","push","onFinalResult","onError","errorObj","Error","callbackError"],"sourceRoot":"../../src","sources":["Amaryllis.ts"],"mappings":"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","ignoreList":[]}
@@ -2,6 +2,7 @@
2
2
 
3
3
  import { createContext, useContext, useEffect, useMemo, useState } from 'react';
4
4
  import { newLlmPipe } from "./NativePipe.js";
5
+ import { InitializationError, isAmaryllisError } from "./Errors.js";
5
6
  import { jsx as _jsx } from "react/jsx-runtime";
6
7
  const LLMContext = /*#__PURE__*/createContext({
7
8
  config: null,
@@ -26,22 +27,31 @@ export const LLMProvider = ({
26
27
  try {
27
28
  return llmPipe ?? newLlmPipe();
28
29
  } catch (e) {
29
- setError(e);
30
+ const initError = isAmaryllisError(e) ? e : new InitializationError(e?.message || 'Failed to create LLM pipe');
31
+ setError(initError);
30
32
  return null;
31
33
  }
32
34
  }, [llmPipe]);
33
35
  useEffect(() => {
34
36
  const start = async () => {
37
+ if (!controller) return;
35
38
  try {
36
- await controller?.init(config);
39
+ await controller.init(config);
37
40
  setReady(true);
38
41
  } catch (e) {
39
42
  console.error('unable to start amaryllis', e);
40
- setError(e);
43
+ const initError = isAmaryllisError(e) ? e : new InitializationError(e?.message || 'Failed to initialize LLM');
44
+ setError(initError);
41
45
  }
42
46
  };
43
47
  start();
44
- return () => controller?.close();
48
+ return () => {
49
+ try {
50
+ controller?.close();
51
+ } catch (e) {
52
+ console.warn('Error closing LLM controller:', e);
53
+ }
54
+ };
45
55
  }, [config, controller]);
46
56
  return /*#__PURE__*/_jsx(LLMContext.Provider, {
47
57
  value: {
@@ -1 +1 @@
1
- {"version":3,"names":["createContext","useContext","useEffect","useMemo","useState","newLlmPipe","jsx","_jsx","LLMContext","config","controller","error","undefined","isReady","useLLMContext","LLMProvider","llmPipe","children","setError","ready","setReady","e","start","init","console","close","Provider","value"],"sourceRoot":"../../src","sources":["AmaryllisContext.tsx"],"mappings":";;AAAA,SAASA,aAAa,EAAEC,UAAU,EAAEC,SAAS,EAAEC,OAAO,EAAEC,QAAQ,QAAQ,OAAO;AAE/E,SAASC,UAAU,QAAQ,iBAAc;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAE1C,MAAMC,UAAU,gBAAGR,aAAa,CAAkB;EAChDS,MAAM,EAAE,IAAI;EACZC,UAAU,EAAE,IAAI;EAChBC,KAAK,EAAEC,SAAS;EAChBC,OAAO,EAAE;AACX,CAAC,CAAC;AAEF,OAAO,MAAMC,aAAa,GAAGA,CAAA,KAAMb,UAAU,CAACO,UAAU,CAAC;;AAEzD;AACA;AACA;AACA;AACA,OAAO,MAAMO,WAAW,GAAGA,CAAC;EAC1BN,MAAM;EACNO,OAAO;EACPC;AACgB,CAAC,KAAK;EACtB,MAAM,CAACN,KAAK,EAAEO,QAAQ,CAAC,GAAGd,QAAQ,CAAoB,CAAC;EACvD,MAAM,CAACe,KAAK,EAAEC,QAAQ,CAAC,GAAGhB,QAAQ,CAAC,KAAK,CAAC;EACzC,MAAMM,UAAU,GAAGP,OAAO,CAAC,MAAM;IAC/B,IAAI;MACF,OAAOa,OAAO,IAAIX,UAAU,CAAC,CAAC;IAChC,CAAC,CAAC,OAAOgB,CAAM,EAAE;MACfH,QAAQ,CAACG,CAAC,CAAC;MACX,OAAO,IAAI;IACb;EACF,CAAC,EAAE,CAACL,OAAO,CAAC,CAAC;EAEbd,SAAS,CAAC,MAAM;IACd,MAAMoB,KAAK,GAAG,MAAAA,CAAA,KAAY;MACxB,IAAI;QACF,MAAMZ,UAAU,EAAEa,IAAI,CAACd,MAAM,CAAC;QAC9BW,QAAQ,CAAC,IAAI,CAAC;MAChB,CAAC,CAAC,OAAOC,CAAM,EAAE;QACfG,OAAO,CAACb,KAAK,CAAC,2BAA2B,EAAEU,CAAC,CAAC;QAC7CH,QAAQ,CAACG,CAAC,CAAC;MACb;IACF,CAAC;IACDC,KAAK,CAAC,CAAC;IACP,OAAO,MAAMZ,UAAU,EAAEe,KAAK,CAAC,CAAC;EAClC,CAAC,EAAE,CAAChB,MAAM,EAAEC,UAAU,CAAC,CAAC;EAExB,oBACEH,IAAA,CAACC,UAAU,CAACkB,QAAQ;IAACC,KAAK,EAAE;MAAElB,MAAM;MAAEC,UAAU;MAAEG,OAAO,EAAEM,KAAK;MAAER;IAAM,CAAE;IAAAM,QAAA,EACvEA;EAAQ,CACU,CAAC;AAE1B,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["createContext","useContext","useEffect","useMemo","useState","newLlmPipe","InitializationError","isAmaryllisError","jsx","_jsx","LLMContext","config","controller","error","undefined","isReady","useLLMContext","LLMProvider","llmPipe","children","setError","ready","setReady","e","initError","message","start","init","console","close","warn","Provider","value"],"sourceRoot":"../../src","sources":["AmaryllisContext.tsx"],"mappings":";;AAAA,SAASA,aAAa,EAAEC,UAAU,EAAEC,SAAS,EAAEC,OAAO,EAAEC,QAAQ,QAAQ,OAAO;AAE/E,SAASC,UAAU,QAAQ,iBAAc;AACzC,SAASC,mBAAmB,EAAEC,gBAAgB,QAAQ,aAAU;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAEjE,MAAMC,UAAU,gBAAGV,aAAa,CAAkB;EAChDW,MAAM,EAAE,IAAI;EACZC,UAAU,EAAE,IAAI;EAChBC,KAAK,EAAEC,SAAS;EAChBC,OAAO,EAAE;AACX,CAAC,CAAC;AAEF,OAAO,MAAMC,aAAa,GAAGA,CAAA,KAAMf,UAAU,CAACS,UAAU,CAAC;;AAEzD;AACA;AACA;AACA;AACA,OAAO,MAAMO,WAAW,GAAGA,CAAC;EAC1BN,MAAM;EACNO,OAAO;EACPC;AACgB,CAAC,KAAK;EACtB,MAAM,CAACN,KAAK,EAAEO,QAAQ,CAAC,GAAGhB,QAAQ,CAAoB,CAAC;EACvD,MAAM,CAACiB,KAAK,EAAEC,QAAQ,CAAC,GAAGlB,QAAQ,CAAC,KAAK,CAAC;EACzC,MAAMQ,UAAU,GAAGT,OAAO,CAAC,MAAM;IAC/B,IAAI;MACF,OAAOe,OAAO,IAAIb,UAAU,CAAC,CAAC;IAChC,CAAC,CAAC,OAAOkB,CAAM,EAAE;MACf,MAAMC,SAAS,GAAGjB,gBAAgB,CAACgB,CAAC,CAAC,GACjCA,CAAC,GACD,IAAIjB,mBAAmB,CAACiB,CAAC,EAAEE,OAAO,IAAI,2BAA2B,CAAC;MACtEL,QAAQ,CAACI,SAAS,CAAC;MACnB,OAAO,IAAI;IACb;EACF,CAAC,EAAE,CAACN,OAAO,CAAC,CAAC;EAEbhB,SAAS,CAAC,MAAM;IACd,MAAMwB,KAAK,GAAG,MAAAA,CAAA,KAAY;MACxB,IAAI,CAACd,UAAU,EAAE;MAEjB,IAAI;QACF,MAAMA,UAAU,CAACe,IAAI,CAAChB,MAAM,CAAC;QAC7BW,QAAQ,CAAC,IAAI,CAAC;MAChB,CAAC,CAAC,OAAOC,CAAM,EAAE;QACfK,OAAO,CAACf,KAAK,CAAC,2BAA2B,EAAEU,CAAC,CAAC;QAC7C,MAAMC,SAAS,GAAGjB,gBAAgB,CAACgB,CAAC,CAAC,GACjCA,CAAC,GACD,IAAIjB,mBAAmB,CAACiB,CAAC,EAAEE,OAAO,IAAI,0BAA0B,CAAC;QACrEL,QAAQ,CAACI,SAAS,CAAC;MACrB;IACF,CAAC;IACDE,KAAK,CAAC,CAAC;IACP,OAAO,MAAM;MACX,IAAI;QACFd,UAAU,EAAEiB,KAAK,CAAC,CAAC;MACrB,CAAC,CAAC,OAAON,CAAM,EAAE;QACfK,OAAO,CAACE,IAAI,CAAC,+BAA+B,EAAEP,CAAC,CAAC;MAClD;IACF,CAAC;EACH,CAAC,EAAE,CAACZ,MAAM,EAAEC,UAAU,CAAC,CAAC;EAExB,oBACEH,IAAA,CAACC,UAAU,CAACqB,QAAQ;IAACC,KAAK,EAAE;MAAErB,MAAM;MAAEC,UAAU;MAAEG,OAAO,EAAEM,KAAK;MAAER;IAAM,CAAE;IAAAM,QAAA,EACvEA;EAAQ,CACU,CAAC;AAE1B,CAAC","ignoreList":[]}
@@ -3,6 +3,27 @@
3
3
  import { useCallback, useMemo, useEffect } from 'react';
4
4
  import { useLLMContext } from "./AmaryllisContext.js";
5
5
  import { createLLMObservable } from "./AmaryllisRx.js";
6
+ import { useContextEngine } from "./ContextEngineContext.js";
7
+ const useContextAugmentation = (contextEngine, query) => {
8
+ const engineFromProvider = useContextEngine();
9
+ const engine = contextEngine ?? engineFromProvider;
10
+ return useCallback(async params => {
11
+ if (!engine) {
12
+ return params;
13
+ }
14
+ const resolvedQuery = query ?? engine.deriveQuery(params.prompt, params);
15
+ if (!resolvedQuery) {
16
+ return params;
17
+ }
18
+ const items = await engine.search(resolvedQuery);
19
+ return engine.formatRequest({
20
+ prompt: params.prompt,
21
+ items,
22
+ query: resolvedQuery,
23
+ request: params
24
+ });
25
+ }, [engine, query]);
26
+ };
6
27
  export const useInferenceAsync = (props = {}) => {
7
28
  const {
8
29
  controller
@@ -15,14 +36,20 @@ export const useInferenceAsync = (props = {}) => {
15
36
  } = props;
16
37
  const llm$ = useMemo(() => createLLMObservable(), []);
17
38
  const generate = useCallback(async params => {
39
+ if (!controller) {
40
+ onError?.(new Error('Controller not initialized'));
41
+ return () => {
42
+ onComplete?.();
43
+ };
44
+ }
18
45
  try {
19
46
  onGenerate?.();
20
- await controller?.generateAsync(params, llm$.callbacks);
47
+ await controller.generateAsync(params, llm$.callbacks);
21
48
  } catch (err) {
22
49
  onError?.(err instanceof Error ? err : new Error('An unknown error occurred'));
23
50
  }
24
51
  return () => {
25
- controller?.cancelAsync();
52
+ controller.cancelAsync();
26
53
  onComplete?.();
27
54
  };
28
55
  }, [controller, llm$.callbacks, onComplete, onGenerate, onError]);
@@ -61,18 +88,74 @@ export const useInference = (props = {}) => {
61
88
  }
62
89
  }, [contextError, onError]);
63
90
  const generate = useCallback(async params => {
91
+ if (!controller) {
92
+ onError?.(new Error('Controller not initialized'));
93
+ return () => {
94
+ onComplete?.();
95
+ };
96
+ }
64
97
  try {
65
98
  onGenerate?.();
66
- const response = await controller?.generate(params);
99
+ const response = await controller.generate(params);
67
100
  onResult?.(response ?? '', true);
68
101
  } catch (err) {
69
102
  onError?.(err instanceof Error ? err : new Error('An unknown error occurred'));
70
103
  }
71
104
  return () => {
72
- controller?.cancelAsync();
105
+ controller.cancelAsync();
73
106
  onComplete?.();
74
107
  };
75
108
  }, [onGenerate, controller, onResult, onError, onComplete]);
76
109
  return generate;
77
110
  };
111
+ export const useContextInferenceAsync = (props = {}) => {
112
+ const {
113
+ contextEngine,
114
+ query,
115
+ ...inferenceProps
116
+ } = props;
117
+ const {
118
+ onComplete,
119
+ onError
120
+ } = inferenceProps;
121
+ const augmentRequest = useContextAugmentation(contextEngine, query);
122
+ const generateBase = useInferenceAsync(inferenceProps);
123
+ const generate = useCallback(async params => {
124
+ try {
125
+ const augmented = await augmentRequest(params);
126
+ return await generateBase(augmented);
127
+ } catch (err) {
128
+ onError?.(err instanceof Error ? err : new Error('An unknown error occurred'));
129
+ return () => {
130
+ onComplete?.();
131
+ };
132
+ }
133
+ }, [augmentRequest, generateBase, onComplete, onError]);
134
+ return generate;
135
+ };
136
+ export const useContextInference = (props = {}) => {
137
+ const {
138
+ contextEngine,
139
+ query,
140
+ ...inferenceProps
141
+ } = props;
142
+ const {
143
+ onComplete,
144
+ onError
145
+ } = inferenceProps;
146
+ const augmentRequest = useContextAugmentation(contextEngine, query);
147
+ const generateBase = useInference(inferenceProps);
148
+ const generate = useCallback(async params => {
149
+ try {
150
+ const augmented = await augmentRequest(params);
151
+ return await generateBase(augmented);
152
+ } catch (err) {
153
+ onError?.(err instanceof Error ? err : new Error('An unknown error occurred'));
154
+ return () => {
155
+ onComplete?.();
156
+ };
157
+ }
158
+ }, [augmentRequest, generateBase, onComplete, onError]);
159
+ return generate;
160
+ };
78
161
  //# sourceMappingURL=AmaryllisHooks.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["useCallback","useMemo","useEffect","useLLMContext","createLLMObservable","useInferenceAsync","props","controller","onResult","onGenerate","onError","onComplete","llm$","generate","params","generateAsync","callbacks","err","Error","cancelAsync","sub","observable","subscribe","next","text","isFinal","complete","error","unsubscribe","useInference","contextError","response"],"sourceRoot":"../../src","sources":["AmaryllisHooks.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["useCallback","useMemo","useEffect","useLLMContext","createLLMObservable","useContextEngine","useContextAugmentation","contextEngine","query","engineFromProvider","engine","params","resolvedQuery","deriveQuery","prompt","items","search","formatRequest","request","useInferenceAsync","props","controller","onResult","onGenerate","onError","onComplete","llm$","generate","Error","generateAsync","callbacks","err","cancelAsync","sub","observable","subscribe","next","text","isFinal","complete","error","unsubscribe","useInference","contextError","response","useContextInferenceAsync","inferenceProps","augmentRequest","generateBase","augmented","useContextInference"],"sourceRoot":"../../src","sources":["AmaryllisHooks.tsx"],"mappings":"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","ignoreList":[]}
@@ -2,25 +2,26 @@
2
2
 
3
3
  import { Observable } from 'rxjs';
4
4
  export function createLLMObservable() {
5
- let subscriber;
5
+ let subscriber = null;
6
6
  const observable = new Observable(sub => {
7
7
  subscriber = sub;
8
+ return () => {
9
+ subscriber = null;
10
+ };
8
11
  });
9
12
  const callbacks = {
10
- onPartialResult: partial => {
11
- subscriber?.next({
12
- text: partial,
13
- isFinal: false
13
+ onEvent: event => {
14
+ if (!subscriber) {
15
+ return;
16
+ }
17
+ if (event.type === 'error') {
18
+ subscriber.error(event.error);
19
+ return;
20
+ }
21
+ subscriber.next({
22
+ text: event.text,
23
+ isFinal: event.type === 'final'
14
24
  });
15
- },
16
- onFinalResult: final => {
17
- subscriber?.next({
18
- text: final,
19
- isFinal: true
20
- });
21
- },
22
- onError: error => {
23
- subscriber?.error(error);
24
25
  }
25
26
  };
26
27
  return {
@@ -1 +1 @@
1
- {"version":3,"names":["Observable","createLLMObservable","subscriber","observable","sub","callbacks","onPartialResult","partial","next","text","isFinal","onFinalResult","final","onError","error"],"sourceRoot":"../../src","sources":["AmaryllisRx.ts"],"mappings":";;AACA,SAASA,UAAU,QAAoB,MAAM;AAE7C,OAAO,SAASC,mBAAmBA,CAAA,EAAwB;EACzD,IAAIC,UAAiC;EAErC,MAAMC,UAAU,GAAG,IAAIH,UAAU,CAAaI,GAAG,IAAK;IACpDF,UAAU,GAAGE,GAAG;EAClB,CAAC,CAAC;EAEF,MAAMC,SAAuB,GAAG;IAC9BC,eAAe,EAAGC,OAAO,IAAK;MAC5BL,UAAU,EAAEM,IAAI,CAAC;QAAEC,IAAI,EAAEF,OAAO;QAAEG,OAAO,EAAE;MAAM,CAAC,CAAC;IACrD,CAAC;IACDC,aAAa,EAAGC,KAAK,IAAK;MACxBV,UAAU,EAAEM,IAAI,CAAC;QAAEC,IAAI,EAAEG,KAAK;QAAEF,OAAO,EAAE;MAAK,CAAC,CAAC;IAClD,CAAC;IACDG,OAAO,EAAGC,KAAK,IAAK;MAClBZ,UAAU,EAAEY,KAAK,CAACA,KAAK,CAAC;IAC1B;EACF,CAAC;EAED,OAAO;IAAEX,UAAU;IAAEE;EAAU,CAAC;AAClC","ignoreList":[]}
1
+ {"version":3,"names":["Observable","createLLMObservable","subscriber","observable","sub","callbacks","onEvent","event","type","error","next","text","isFinal"],"sourceRoot":"../../src","sources":["AmaryllisRx.ts"],"mappings":";;AACA,SAASA,UAAU,QAAoB,MAAM;AAE7C,OAAO,SAASC,mBAAmBA,CAAA,EAAwB;EACzD,IAAIC,UAAwC,GAAG,IAAI;EAEnD,MAAMC,UAAU,GAAG,IAAIH,UAAU,CAAaI,GAAG,IAAK;IACpDF,UAAU,GAAGE,GAAG;IAChB,OAAO,MAAM;MACXF,UAAU,GAAG,IAAI;IACnB,CAAC;EACH,CAAC,CAAC;EAEF,MAAMG,SAAuB,GAAG;IAC9BC,OAAO,EAAGC,KAAK,IAAK;MAClB,IAAI,CAACL,UAAU,EAAE;QACf;MACF;MACA,IAAIK,KAAK,CAACC,IAAI,KAAK,OAAO,EAAE;QAC1BN,UAAU,CAACO,KAAK,CAACF,KAAK,CAACE,KAAK,CAAC;QAC7B;MACF;MACAP,UAAU,CAACQ,IAAI,CAAC;QAAEC,IAAI,EAAEJ,KAAK,CAACI,IAAI;QAAEC,OAAO,EAAEL,KAAK,CAACC,IAAI,KAAK;MAAQ,CAAC,CAAC;IACxE;EACF,CAAC;EAED,OAAO;IAAEL,UAAU;IAAEE;EAAU,CAAC;AAClC","ignoreList":[]}