@micrantha/react-native-amaryllis 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/Amaryllis.podspec +22 -0
  2. package/LICENSE +21 -0
  3. package/README.md +213 -0
  4. package/android/build.gradle +81 -0
  5. package/android/gradle.properties +5 -0
  6. package/android/src/main/AndroidManifest.xml +2 -0
  7. package/android/src/main/java/com/micrantha/amaryllis/Amaryllis.kt +198 -0
  8. package/android/src/main/java/com/micrantha/amaryllis/AmaryllisModule.kt +165 -0
  9. package/android/src/main/java/com/micrantha/amaryllis/AmaryllisPackage.kt +32 -0
  10. package/ios/Amaryllis.h +49 -0
  11. package/ios/Amaryllis.m +201 -0
  12. package/ios/AmaryllisModule.h +6 -0
  13. package/ios/AmaryllisModule.mm +166 -0
  14. package/lib/module/Amaryllis.js +56 -0
  15. package/lib/module/Amaryllis.js.map +1 -0
  16. package/lib/module/AmaryllisContext.js +56 -0
  17. package/lib/module/AmaryllisContext.js.map +1 -0
  18. package/lib/module/AmaryllisHooks.js +78 -0
  19. package/lib/module/AmaryllisHooks.js.map +1 -0
  20. package/lib/module/AmaryllisRx.js +31 -0
  21. package/lib/module/AmaryllisRx.js.map +1 -0
  22. package/lib/module/NativeAmaryllis.js +5 -0
  23. package/lib/module/NativeAmaryllis.js.map +1 -0
  24. package/lib/module/NativePipe.js +9 -0
  25. package/lib/module/NativePipe.js.map +1 -0
  26. package/lib/module/Types.js +4 -0
  27. package/lib/module/Types.js.map +1 -0
  28. package/lib/module/index.js +7 -0
  29. package/lib/module/index.js.map +1 -0
  30. package/lib/module/package.json +1 -0
  31. package/lib/typescript/package.json +1 -0
  32. package/lib/typescript/src/Amaryllis.d.ts +16 -0
  33. package/lib/typescript/src/Amaryllis.d.ts.map +1 -0
  34. package/lib/typescript/src/AmaryllisContext.d.ts +8 -0
  35. package/lib/typescript/src/AmaryllisContext.d.ts.map +1 -0
  36. package/lib/typescript/src/AmaryllisHooks.d.ts +4 -0
  37. package/lib/typescript/src/AmaryllisHooks.d.ts.map +1 -0
  38. package/lib/typescript/src/AmaryllisRx.d.ts +3 -0
  39. package/lib/typescript/src/AmaryllisRx.d.ts.map +1 -0
  40. package/lib/typescript/src/NativeAmaryllis.d.ts +12 -0
  41. package/lib/typescript/src/NativeAmaryllis.d.ts.map +1 -0
  42. package/lib/typescript/src/NativePipe.d.ts +3 -0
  43. package/lib/typescript/src/NativePipe.d.ts.map +1 -0
  44. package/lib/typescript/src/Types.d.ts +87 -0
  45. package/lib/typescript/src/Types.d.ts.map +1 -0
  46. package/lib/typescript/src/index.d.ts +6 -0
  47. package/lib/typescript/src/index.d.ts.map +1 -0
  48. package/package.json +185 -0
  49. package/src/Amaryllis.ts +91 -0
  50. package/src/AmaryllisContext.tsx +53 -0
  51. package/src/AmaryllisHooks.tsx +78 -0
  52. package/src/AmaryllisRx.ts +24 -0
  53. package/src/NativeAmaryllis.ts +18 -0
  54. package/src/NativePipe.ts +8 -0
  55. package/src/Types.ts +115 -0
  56. package/src/index.tsx +5 -0
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+
3
+ import { createContext, useContext, useEffect, useMemo, useState } from 'react';
4
+ import { newLlmPipe } from "./NativePipe.js";
5
+ import { jsx as _jsx } from "react/jsx-runtime";
6
+ const LLMContext = /*#__PURE__*/createContext({
7
+ config: null,
8
+ controller: null,
9
+ error: undefined,
10
+ isReady: false
11
+ });
12
+ export const useLLMContext = () => useContext(LLMContext);
13
+
14
+ /**
15
+ * Provides LLM configuration state to child components.
16
+ * Configures LLM once on mount.
17
+ */
18
+ export const LLMProvider = ({
19
+ config,
20
+ llmPipe,
21
+ children
22
+ }) => {
23
+ const [error, setError] = useState();
24
+ const [ready, setReady] = useState(false);
25
+ const controller = useMemo(() => {
26
+ try {
27
+ return llmPipe ?? newLlmPipe();
28
+ } catch (e) {
29
+ setError(e);
30
+ return null;
31
+ }
32
+ }, [llmPipe]);
33
+ useEffect(() => {
34
+ const start = async () => {
35
+ try {
36
+ await controller?.init(config);
37
+ setReady(true);
38
+ } catch (e) {
39
+ console.error('unable to start amaryllis', e);
40
+ setError(e);
41
+ }
42
+ };
43
+ start();
44
+ return () => controller?.close();
45
+ }, [config, controller]);
46
+ return /*#__PURE__*/_jsx(LLMContext.Provider, {
47
+ value: {
48
+ config,
49
+ controller,
50
+ isReady: ready,
51
+ error
52
+ },
53
+ children: children
54
+ });
55
+ };
56
+ //# sourceMappingURL=AmaryllisContext.js.map
@@ -0,0 +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":[]}
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+
3
+ import { useCallback, useMemo, useEffect } from 'react';
4
+ import { useLLMContext } from "./AmaryllisContext.js";
5
+ import { createLLMObservable } from "./AmaryllisRx.js";
6
+ export const useInferenceAsync = (props = {}) => {
7
+ const {
8
+ controller
9
+ } = useLLMContext();
10
+ const {
11
+ onResult,
12
+ onGenerate,
13
+ onError,
14
+ onComplete
15
+ } = props;
16
+ const llm$ = useMemo(() => createLLMObservable(), []);
17
+ const generate = useCallback(async params => {
18
+ try {
19
+ onGenerate?.();
20
+ await controller?.generateAsync(params, llm$.callbacks);
21
+ } catch (err) {
22
+ onError?.(err instanceof Error ? err : new Error('An unknown error occurred'));
23
+ }
24
+ return () => {
25
+ controller?.cancelAsync();
26
+ onComplete?.();
27
+ };
28
+ }, [controller, llm$.callbacks, onComplete, onGenerate, onError]);
29
+ useEffect(() => {
30
+ const sub = llm$.observable.subscribe({
31
+ next: ({
32
+ text,
33
+ isFinal
34
+ }) => {
35
+ onResult?.(text, isFinal);
36
+ },
37
+ complete: () => onComplete?.(),
38
+ error: err => onError?.(err)
39
+ });
40
+ return () => {
41
+ sub.unsubscribe();
42
+ controller?.cancelAsync();
43
+ };
44
+ }, [llm$.observable, controller, onResult, onComplete, onError]);
45
+ return generate;
46
+ };
47
+ export const useInference = (props = {}) => {
48
+ const {
49
+ controller,
50
+ error: contextError
51
+ } = useLLMContext();
52
+ const {
53
+ onResult,
54
+ onError,
55
+ onGenerate,
56
+ onComplete
57
+ } = props;
58
+ useEffect(() => {
59
+ if (contextError) {
60
+ onError?.(contextError);
61
+ }
62
+ }, [contextError, onError]);
63
+ const generate = useCallback(async params => {
64
+ try {
65
+ onGenerate?.();
66
+ const response = await controller?.generate(params);
67
+ onResult?.(response ?? '', true);
68
+ } catch (err) {
69
+ onError?.(err instanceof Error ? err : new Error('An unknown error occurred'));
70
+ }
71
+ return () => {
72
+ controller?.cancelAsync();
73
+ onComplete?.();
74
+ };
75
+ }, [onGenerate, controller, onResult, onError, onComplete]);
76
+ return generate;
77
+ };
78
+ //# sourceMappingURL=AmaryllisHooks.js.map
@@ -0,0 +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":[]}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+
3
+ import { Observable } from 'rxjs';
4
+ export function createLLMObservable() {
5
+ let subscriber;
6
+ const observable = new Observable(sub => {
7
+ subscriber = sub;
8
+ });
9
+ const callbacks = {
10
+ onPartialResult: partial => {
11
+ subscriber?.next({
12
+ text: partial,
13
+ isFinal: false
14
+ });
15
+ },
16
+ onFinalResult: final => {
17
+ subscriber?.next({
18
+ text: final,
19
+ isFinal: true
20
+ });
21
+ },
22
+ onError: error => {
23
+ subscriber?.error(error);
24
+ }
25
+ };
26
+ return {
27
+ observable,
28
+ callbacks
29
+ };
30
+ }
31
+ //# sourceMappingURL=AmaryllisRx.js.map
@@ -0,0 +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":[]}
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ import { TurboModuleRegistry } from 'react-native';
4
+ export default TurboModuleRegistry.getEnforcing('Amaryllis');
5
+ //# sourceMappingURL=NativeAmaryllis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../src","sources":["NativeAmaryllis.ts"],"mappings":";;AACA,SAASA,mBAAmB,QAAQ,cAAc;AAgBlD,eAAeA,mBAAmB,CAACC,YAAY,CAAO,WAAW,CAAC","ignoreList":[]}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+
3
+ import { NativeModules, NativeEventEmitter } from 'react-native';
4
+ import { LlmPipe } from "./Amaryllis.js";
5
+ export const newLlmPipe = () => new LlmPipe({
6
+ nativeModule: NativeModules.Amaryllis,
7
+ eventEmitter: new NativeEventEmitter()
8
+ });
9
+ //# sourceMappingURL=NativePipe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["NativeModules","NativeEventEmitter","LlmPipe","newLlmPipe","nativeModule","Amaryllis","eventEmitter"],"sourceRoot":"../../src","sources":["NativePipe.ts"],"mappings":";;AAAA,SAASA,aAAa,EAAEC,kBAAkB,QAAQ,cAAc;AAChE,SAASC,OAAO,QAAQ,gBAAa;AAErC,OAAO,MAAMC,UAAU,GAAGA,CAAA,KACxB,IAAID,OAAO,CAAC;EACVE,YAAY,EAAEJ,aAAa,CAACK,SAAS;EACrCC,YAAY,EAAE,IAAIL,kBAAkB,CAAC;AACvC,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+
3
+ export {};
4
+ //# sourceMappingURL=Types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../src","sources":["Types.ts"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+
3
+ export { default as Amaryllis, LlmPipe } from "./Amaryllis.js";
4
+ export * from "./AmaryllisHooks.js";
5
+ export * from "./AmaryllisContext.js";
6
+ export * from "./AmaryllisRx.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["default","Amaryllis","LlmPipe"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,SAASA,OAAO,IAAIC,SAAS,EAAEC,OAAO,QAAQ,gBAAa;AAC3D,cAAc,qBAAkB;AAChC,cAAc,uBAAoB;AAClC,cAAc,kBAAe","ignoreList":[]}
@@ -0,0 +1 @@
1
+ {"type":"module"}
@@ -0,0 +1 @@
1
+ {"type":"module"}
@@ -0,0 +1,16 @@
1
+ import type { LlmEngine, LlmEngineConfig, LlmSessionParams, LlmCallbacks, LlmRequestParams, LlmEventEmitter, LlmEventSubscription, LlmPipeParams, LlmNativeEngine } from './Types';
2
+ export declare class LlmPipe implements LlmEngine {
3
+ subscriptions: LlmEventSubscription[];
4
+ llmEmitter: LlmEventEmitter;
5
+ llmNative: LlmNativeEngine;
6
+ constructor(params: LlmPipeParams);
7
+ init(params: LlmEngineConfig): Promise<void>;
8
+ newSession(params: LlmSessionParams): Promise<void>;
9
+ generate(params: LlmRequestParams): Promise<string>;
10
+ generateAsync(params: LlmRequestParams, callbacks?: LlmCallbacks): Promise<void>;
11
+ close(): void;
12
+ cancelAsync(): void;
13
+ setupAsyncCallbacks(callbacks: LlmCallbacks): void;
14
+ }
15
+ export default LlmPipe;
16
+ //# sourceMappingURL=Amaryllis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Amaryllis.d.ts","sourceRoot":"","sources":["../../../src/Amaryllis.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,oBAAoB,EACpB,aAAa,EACb,eAAe,EAChB,MAAM,SAAS,CAAC;AAMjB,qBAAa,OAAQ,YAAW,SAAS;IACvC,aAAa,EAAE,oBAAoB,EAAE,CAAM;IAC3C,UAAU,EAAE,eAAe,CAAC;IAC5B,SAAS,EAAE,eAAe,CAAC;gBAEf,MAAM,EAAE,aAAa;IAK3B,IAAI,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlD,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7C,QAAQ,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC;IAInD,aAAa,CACjB,MAAM,EAAE,gBAAgB,EACxB,SAAS,CAAC,EAAE,YAAY,GACvB,OAAO,CAAC,IAAI,CAAC;IAQhB,KAAK,IAAI,IAAI;IAKb,WAAW,IAAI,IAAI;IAKnB,mBAAmB,CAAC,SAAS,EAAE,YAAY,GAAG,IAAI;CA6BnD;AAED,eAAe,OAAO,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { LLMContextValue, LLMProviderProps } from './Types';
2
+ export declare const useLLMContext: () => LLMContextValue;
3
+ /**
4
+ * Provides LLM configuration state to child components.
5
+ * Configures LLM once on mount.
6
+ */
7
+ export declare const LLMProvider: ({ config, llmPipe, children, }: LLMProviderProps) => import("react/jsx-runtime").JSX.Element;
8
+ //# sourceMappingURL=AmaryllisContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AmaryllisContext.d.ts","sourceRoot":"","sources":["../../../src/AmaryllisContext.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAUjE,eAAO,MAAM,aAAa,uBAA+B,CAAC;AAE1D;;;GAGG;AACH,eAAO,MAAM,WAAW,GAAI,gCAIzB,gBAAgB,4CA+BlB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { LlmRequestParams, InferenceProps } from './Types';
2
+ export declare const useInferenceAsync: (props?: InferenceProps) => (params: LlmRequestParams) => Promise<() => void>;
3
+ export declare const useInference: (props?: InferenceProps) => (params: LlmRequestParams) => Promise<() => void>;
4
+ //# sourceMappingURL=AmaryllisHooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AmaryllisHooks.d.ts","sourceRoot":"","sources":["../../../src/AmaryllisHooks.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAIhE,eAAO,MAAM,iBAAiB,GAAI,QAAO,cAAmB,cAOzC,gBAAgB,wBAgClC,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,QAAO,cAAmB,cAWpC,gBAAgB,wBAoBlC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { LLMObservableResult } from './Types';
2
+ export declare function createLLMObservable(): LLMObservableResult;
3
+ //# sourceMappingURL=AmaryllisRx.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AmaryllisRx.d.ts","sourceRoot":"","sources":["../../../src/AmaryllisRx.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgB,mBAAmB,EAAa,MAAM,SAAS,CAAC;AAG5E,wBAAgB,mBAAmB,IAAI,mBAAmB,CAoBzD"}
@@ -0,0 +1,12 @@
1
+ import type { TurboModule } from 'react-native';
2
+ export interface Spec extends TurboModule {
3
+ init(params: Object): Promise<void>;
4
+ newSession(params: Object): Promise<void>;
5
+ generate(params: Object): Promise<string>;
6
+ generateAsync(params: Object): Promise<void>;
7
+ close(): void;
8
+ cancelAsync(): void;
9
+ }
10
+ declare const _default: Spec;
11
+ export default _default;
12
+ //# sourceMappingURL=NativeAmaryllis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NativeAmaryllis.d.ts","sourceRoot":"","sources":["../../../src/NativeAmaryllis.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,MAAM,WAAW,IAAK,SAAQ,WAAW;IACvC,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpC,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1C,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAE1C,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7C,KAAK,IAAI,IAAI,CAAC;IAEd,WAAW,IAAI,IAAI,CAAC;CACrB;;AAED,wBAAmE"}
@@ -0,0 +1,3 @@
1
+ import { LlmPipe } from './Amaryllis';
2
+ export declare const newLlmPipe: () => LlmPipe;
3
+ //# sourceMappingURL=NativePipe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NativePipe.d.ts","sourceRoot":"","sources":["../../../src/NativePipe.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,eAAO,MAAM,UAAU,eAInB,CAAC"}
@@ -0,0 +1,87 @@
1
+ import type { Spec } from './NativeAmaryllis';
2
+ import type { Observable } from 'rxjs';
3
+ export type LlmNativeEngine = Spec;
4
+ export type LlmCallbacks = {
5
+ onPartialResult?: (result: string) => void;
6
+ onFinalResult?: (result: string) => void;
7
+ onError?: (err: Error) => void;
8
+ };
9
+ export type LlmRequestParams = {
10
+ prompt: string;
11
+ images?: string[];
12
+ };
13
+ export type LlmSessionParams = {
14
+ topK?: number;
15
+ topP?: number;
16
+ temperature?: number;
17
+ randomSeed?: number;
18
+ loraPath?: string;
19
+ enableVisionModality?: boolean;
20
+ };
21
+ export type LlmEngineConfig = {
22
+ modelPath: string;
23
+ maxTopK?: number;
24
+ maxNumImages?: number;
25
+ maxTokens?: number;
26
+ visionEncoderPath?: string;
27
+ visionAdapterPath?: string;
28
+ };
29
+ export type LlmEngine = {
30
+ /**
31
+ * Initialize the engine (creates LlmInference and LlmInferenceSession internally).
32
+ */
33
+ init(config: LlmEngineConfig): Promise<void>;
34
+ /**
35
+ * Start a new session.
36
+ */
37
+ newSession(params: LlmSessionParams): Promise<void>;
38
+ /**
39
+ * Generate a response synchronously (blocking).
40
+ */
41
+ generate(params: LlmRequestParams): Promise<string>;
42
+ /**
43
+ * Generate a response asynchronously (streaming).
44
+ */
45
+ generateAsync(params: LlmRequestParams, callbacks?: LlmCallbacks): Promise<void>;
46
+ /**
47
+ * Clean up resources.
48
+ */
49
+ close(): void;
50
+ cancelAsync(): void;
51
+ };
52
+ export interface LlmEventSubscription {
53
+ remove: () => void;
54
+ }
55
+ export interface LlmEventEmitter {
56
+ addListener(event: string, cb: (result: any) => void): LlmEventSubscription;
57
+ }
58
+ export interface LlmPipeParams {
59
+ nativeModule: LlmNativeEngine;
60
+ eventEmitter: LlmEventEmitter;
61
+ }
62
+ export interface LLMContextValue {
63
+ config: LlmEngineConfig | null;
64
+ controller: LlmEngine | null;
65
+ error: Error | undefined;
66
+ isReady: boolean;
67
+ }
68
+ export interface LLMProviderProps {
69
+ config: LlmEngineConfig;
70
+ llmPipe?: LlmEngine;
71
+ children: React.ReactNode;
72
+ }
73
+ export type InferenceProps = {
74
+ onGenerate?: () => void;
75
+ onResult?: (result: string, isFinal: boolean) => void;
76
+ onError?: (error: Error) => void;
77
+ onComplete?: () => void;
78
+ };
79
+ export interface LLMResult {
80
+ text: string;
81
+ isFinal: boolean;
82
+ }
83
+ export interface LLMObservableResult {
84
+ callbacks: LlmCallbacks;
85
+ observable: Observable<LLMResult>;
86
+ }
87
+ //# sourceMappingURL=Types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Types.d.ts","sourceRoot":"","sources":["../../../src/Types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export { default as Amaryllis, LlmPipe } from './Amaryllis';
2
+ export * from './AmaryllisHooks';
3
+ export * from './AmaryllisContext';
4
+ export * from './AmaryllisRx';
5
+ export type * from './Types';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC5D,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,mBAAmB,SAAS,CAAC"}
package/package.json ADDED
@@ -0,0 +1,185 @@
1
+ {
2
+ "name": "@micrantha/react-native-amaryllis",
3
+ "version": "0.1.0",
4
+ "description": "A AI module for native mobile in react",
5
+ "main": "./lib/module/index.js",
6
+ "types": "./lib/typescript/src/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "source": "./src/index.tsx",
10
+ "types": "./lib/typescript/src/index.d.ts",
11
+ "default": "./lib/module/index.js"
12
+ },
13
+ "./package.json": "./package.json"
14
+ },
15
+ "files": [
16
+ "src",
17
+ "lib",
18
+ "android",
19
+ "ios",
20
+ "cpp",
21
+ "*.podspec",
22
+ "react-native.config.js",
23
+ "!ios/build",
24
+ "!android/build",
25
+ "!android/gradle",
26
+ "!android/gradlew",
27
+ "!android/gradlew.bat",
28
+ "!android/local.properties",
29
+ "!**/__tests__",
30
+ "!**/__fixtures__",
31
+ "!**/__mocks__",
32
+ "!**/.*",
33
+ "!docs"
34
+ ],
35
+ "scripts": {
36
+ "example": "yarn workspace react-native-amaryllis-example",
37
+ "test": "jest",
38
+ "typecheck": "tsc",
39
+ "lint": "eslint \"**/*.{js,ts,tsx}\"",
40
+ "clean": "del-cli android/build example/android/build example/android/app/build example/ios/build lib",
41
+ "prepare": "bob build",
42
+ "release": "release-it --only-version"
43
+ },
44
+ "keywords": [
45
+ "react-native",
46
+ "ios",
47
+ "android"
48
+ ],
49
+ "repository": {
50
+ "type": "git",
51
+ "url": "git+https://github.com/hackelia-micrantha/react-native-amaryllis.git"
52
+ },
53
+ "author": "Ryan Jennings <ryan.jennings@micrantha.com> (https://github.com/hackelia-micrantha)",
54
+ "license": "MIT",
55
+ "bugs": {
56
+ "url": "https://github.com/hackelia-micrantha/react-native-amaryllis/issues"
57
+ },
58
+ "homepage": "https://github.com/hackelia-micrantha/react-native-amaryllis#readme",
59
+ "publishConfig": {
60
+ "registry": "https://registry.npmjs.org/"
61
+ },
62
+ "devDependencies": {
63
+ "@commitlint/config-conventional": "^19.8.1",
64
+ "@eslint/compat": "^1.3.2",
65
+ "@eslint/eslintrc": "^3.3.1",
66
+ "@eslint/js": "^9.35.0",
67
+ "@evilmartians/lefthook": "^1.12.3",
68
+ "@react-native-community/cli": "20.0.1",
69
+ "@react-native/babel-preset": "0.81.1",
70
+ "@react-native/eslint-config": "^0.81.1",
71
+ "@release-it/conventional-changelog": "^10.0.1",
72
+ "@testing-library/react-native": "^13.3.3",
73
+ "@types/jest": "^30.0.0",
74
+ "@types/react": "^19.1.12",
75
+ "commitlint": "^19.8.1",
76
+ "del-cli": "^6.0.0",
77
+ "eslint": "^9.35.0",
78
+ "eslint-config-prettier": "^10.1.8",
79
+ "eslint-plugin-prettier": "^5.5.4",
80
+ "jest": "^30.1.3",
81
+ "prettier": "^3.6.2",
82
+ "react": "19.1.1",
83
+ "react-native": "0.81.1",
84
+ "react-native-builder-bob": "^0.40.13",
85
+ "react-test-renderer": "19.1.1",
86
+ "release-it": "^19.0.4",
87
+ "turbo": "^2.5.6",
88
+ "typescript": "^5.9.2"
89
+ },
90
+ "peerDependencies": {
91
+ "react": "*",
92
+ "react-native": "*"
93
+ },
94
+ "workspaces": [
95
+ "example"
96
+ ],
97
+ "packageManager": "yarn@3.6.1",
98
+ "jest": {
99
+ "preset": "react-native",
100
+ "modulePathIgnorePatterns": [
101
+ "<rootDir>/example/node_modules",
102
+ "<rootDir>/lib/"
103
+ ],
104
+ "testPathIgnorePatterns": [
105
+ "<rootDir>/src/__tests__/test-utils.tsx"
106
+ ],
107
+ "setupFiles": [
108
+ "<rootDir>/jest.setup.js"
109
+ ],
110
+ "transformIgnorePatterns": [
111
+ "node_modules/(?!react-native|@react-native|react-clone-referenced-element)"
112
+ ],
113
+ "moduleFileExtensions": [
114
+ "ts",
115
+ "tsx",
116
+ "js",
117
+ "jsx",
118
+ "json",
119
+ "node"
120
+ ]
121
+ },
122
+ "commitlint": {
123
+ "extends": [
124
+ "@commitlint/config-conventional"
125
+ ]
126
+ },
127
+ "release-it": {
128
+ "git": {
129
+ "commitMessage": "chore: release ${version}",
130
+ "tagName": "v${version}"
131
+ },
132
+ "npm": {
133
+ "publish": true
134
+ },
135
+ "github": {
136
+ "release": true
137
+ },
138
+ "plugins": {
139
+ "@release-it/conventional-changelog": {
140
+ "preset": {
141
+ "name": "angular"
142
+ }
143
+ }
144
+ }
145
+ },
146
+ "prettier": {
147
+ "quoteProps": "consistent",
148
+ "singleQuote": true,
149
+ "tabWidth": 2,
150
+ "trailingComma": "es5",
151
+ "useTabs": false,
152
+ "endOfLine": "lf"
153
+ },
154
+ "react-native-builder-bob": {
155
+ "source": "src",
156
+ "output": "lib",
157
+ "targets": [
158
+ [
159
+ "module",
160
+ {
161
+ "esm": true
162
+ }
163
+ ],
164
+ [
165
+ "typescript",
166
+ {
167
+ "project": "tsconfig.build.json"
168
+ }
169
+ ]
170
+ ]
171
+ },
172
+ "codegenConfig": {
173
+ "name": "AmaryllisSpec",
174
+ "type": "modules",
175
+ "jsSrcsDir": "src",
176
+ "android": {
177
+ "javaPackageName": "com.micrantha.amaryllis"
178
+ }
179
+ },
180
+ "create-react-native-library": {
181
+ "languages": "kotlin-objc",
182
+ "type": "turbo-module",
183
+ "version": "0.52.1"
184
+ }
185
+ }