@micrantha/react-native-amaryllis 0.1.0 → 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.
- package/README.md +43 -8
- package/android/src/main/java/com/micrantha/amaryllis/Amaryllis.kt +83 -8
- package/lib/module/Amaryllis.js +75 -20
- package/lib/module/Amaryllis.js.map +1 -1
- package/lib/module/AmaryllisContext.js +14 -4
- package/lib/module/AmaryllisContext.js.map +1 -1
- package/lib/module/AmaryllisHooks.js +87 -4
- package/lib/module/AmaryllisHooks.js.map +1 -1
- package/lib/module/AmaryllisRx.js +15 -14
- package/lib/module/AmaryllisRx.js.map +1 -1
- package/lib/module/ContextEngine.js +87 -0
- package/lib/module/ContextEngine.js.map +1 -0
- package/lib/module/ContextEngineContext.js +22 -0
- package/lib/module/ContextEngineContext.js.map +1 -0
- package/lib/module/ContextPolicies.js +46 -0
- package/lib/module/ContextPolicies.js.map +1 -0
- package/lib/module/ContextTypes.js +4 -0
- package/lib/module/ContextTypes.js.map +1 -0
- package/lib/module/ContextValidation.js +189 -0
- package/lib/module/ContextValidation.js.map +1 -0
- package/lib/module/Errors.js +46 -0
- package/lib/module/Errors.js.map +1 -0
- package/lib/module/NativeAmaryllis.js.map +1 -1
- package/lib/module/TypeConverters.js +80 -0
- package/lib/module/TypeConverters.js.map +1 -0
- package/lib/module/context.js +8 -0
- package/lib/module/context.js.map +1 -0
- package/lib/module/index.js +4 -0
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/src/Amaryllis.d.ts.map +1 -1
- package/lib/typescript/src/AmaryllisContext.d.ts.map +1 -1
- package/lib/typescript/src/AmaryllisHooks.d.ts +8 -1
- package/lib/typescript/src/AmaryllisHooks.d.ts.map +1 -1
- package/lib/typescript/src/AmaryllisRx.d.ts.map +1 -1
- package/lib/typescript/src/ContextEngine.d.ts +19 -0
- package/lib/typescript/src/ContextEngine.d.ts.map +1 -0
- package/lib/typescript/src/ContextEngineContext.d.ts +9 -0
- package/lib/typescript/src/ContextEngineContext.d.ts.map +1 -0
- package/lib/typescript/src/ContextPolicies.d.ts +4 -0
- package/lib/typescript/src/ContextPolicies.d.ts.map +1 -0
- package/lib/typescript/src/ContextTypes.d.ts +92 -0
- package/lib/typescript/src/ContextTypes.d.ts.map +1 -0
- package/lib/typescript/src/ContextValidation.d.ts +9 -0
- package/lib/typescript/src/ContextValidation.d.ts.map +1 -0
- package/lib/typescript/src/Errors.d.ts +22 -0
- package/lib/typescript/src/Errors.d.ts.map +1 -0
- package/lib/typescript/src/NativeAmaryllis.d.ts +24 -4
- package/lib/typescript/src/NativeAmaryllis.d.ts.map +1 -1
- package/lib/typescript/src/TypeConverters.d.ts +43 -0
- package/lib/typescript/src/TypeConverters.d.ts.map +1 -0
- package/lib/typescript/src/Types.d.ts +14 -0
- package/lib/typescript/src/Types.d.ts.map +1 -1
- package/lib/typescript/src/context.d.ts +8 -0
- package/lib/typescript/src/context.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +5 -0
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/package.json +34 -28
- package/src/Amaryllis.ts +75 -24
- package/src/AmaryllisContext.tsx +19 -4
- package/src/AmaryllisHooks.tsx +106 -5
- package/src/AmaryllisRx.ts +13 -9
- package/src/ContextEngine.ts +133 -0
- package/src/ContextEngineContext.tsx +31 -0
- package/src/ContextPolicies.ts +54 -0
- package/src/ContextTypes.ts +122 -0
- package/src/ContextValidation.ts +279 -0
- package/src/Errors.ts +55 -0
- package/src/NativeAmaryllis.ts +18 -4
- package/src/TypeConverters.ts +87 -0
- package/src/Types.ts +9 -0
- package/src/context.ts +14 -0
- 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
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
180
|
-
|
|
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
|
-
|
|
183
|
-
|
|
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()
|
package/lib/module/Amaryllis.js
CHANGED
|
@@ -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
|
-
|
|
14
|
+
const nativeConfig = toNativeEngineConfig(params);
|
|
15
|
+
await this.llmNative.init(nativeConfig);
|
|
14
16
|
}
|
|
15
17
|
newSession(params) {
|
|
16
|
-
|
|
18
|
+
const nativeParams = toNativeSessionParams(params);
|
|
19
|
+
return this.llmNative.newSession(nativeParams);
|
|
17
20
|
}
|
|
18
21
|
async generate(params) {
|
|
19
|
-
|
|
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
|
-
|
|
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
|
|
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.
|
|
38
|
-
|
|
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.
|
|
43
|
-
|
|
44
|
-
|
|
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.
|
|
49
|
-
|
|
50
|
-
|
|
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","
|
|
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
|
-
|
|
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
|
|
39
|
+
await controller.init(config);
|
|
37
40
|
setReady(true);
|
|
38
41
|
} catch (e) {
|
|
39
42
|
console.error('unable to start amaryllis', e);
|
|
40
|
-
|
|
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 () =>
|
|
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;
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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","
|
|
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
|
-
|
|
11
|
-
subscriber
|
|
12
|
-
|
|
13
|
-
|
|
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","
|
|
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":[]}
|