@absolutejs/absolute 0.19.0-beta.436 → 0.19.0-beta.438
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/dist/ai/client/index.js +74 -1
- package/dist/ai/client/index.js.map +3 -3
- package/dist/ai/index.js +234 -2
- package/dist/ai/index.js.map +4 -4
- package/dist/ai-client/angular/ai/index.js +73 -0
- package/dist/ai-client/react/ai/index.js +369 -126
- package/dist/ai-client/vue/ai/index.js +73 -0
- package/dist/angular/ai/index.js +74 -1
- package/dist/angular/ai/index.js.map +3 -3
- package/dist/angular/index.js +4 -3
- package/dist/angular/index.js.map +4 -4
- package/dist/angular/server.js +2 -2
- package/dist/angular/server.js.map +1 -1
- package/dist/build.js +2 -2
- package/dist/build.js.map +1 -1
- package/dist/client/index.js +2 -1
- package/dist/client/index.js.map +3 -3
- package/dist/index.js +4 -3
- package/dist/index.js.map +4 -4
- package/dist/react/ai/index.js +623 -294
- package/dist/react/ai/index.js.map +12 -8
- package/dist/react/index.js +3 -2
- package/dist/react/index.js.map +4 -4
- package/dist/src/ai/client/ragClient.d.ts +8 -1
- package/dist/src/ai/rag/chat.d.ts +134 -2
- package/dist/src/react/ai/index.d.ts +3 -0
- package/dist/src/react/ai/useRAG.d.ts +45 -0
- package/dist/src/react/ai/useRAGChunkPreview.d.ts +11 -0
- package/dist/src/react/ai/useRAGDocuments.d.ts +10 -0
- package/dist/src/react/ai/useRAGIndexAdmin.d.ts +30 -0
- package/dist/svelte/ai/index.js +74 -1
- package/dist/svelte/ai/index.js.map +3 -3
- package/dist/svelte/index.js +3 -2
- package/dist/svelte/index.js.map +4 -4
- package/dist/types/ai.d.ts +74 -0
- package/dist/vue/ai/index.js +74 -1
- package/dist/vue/ai/index.js.map +3 -3
- package/dist/vue/components/index.js +11 -2
- package/dist/vue/components/index.js.map +3 -3
- package/dist/vue/index.js +13 -3
- package/dist/vue/index.js.map +5 -5
- package/package.json +1 -1
|
@@ -740,6 +740,79 @@ var createRAGClient = (options) => {
|
|
|
740
740
|
}
|
|
741
741
|
return parseJson(response);
|
|
742
742
|
},
|
|
743
|
+
async documents(kind) {
|
|
744
|
+
const query = kind ? `?kind=${encodeURIComponent(kind)}` : "";
|
|
745
|
+
const response = await fetchImpl(`${basePath}/documents${query}`);
|
|
746
|
+
if (!response.ok) {
|
|
747
|
+
throw new Error(await toErrorMessage(response));
|
|
748
|
+
}
|
|
749
|
+
return parseJson(response);
|
|
750
|
+
},
|
|
751
|
+
async createDocument(input) {
|
|
752
|
+
const response = await fetchImpl(`${basePath}/documents`, {
|
|
753
|
+
body: JSON.stringify(input),
|
|
754
|
+
headers: jsonHeaders,
|
|
755
|
+
method: "POST"
|
|
756
|
+
});
|
|
757
|
+
if (!response.ok) {
|
|
758
|
+
return {
|
|
759
|
+
ok: false,
|
|
760
|
+
error: await toErrorMessage(response)
|
|
761
|
+
};
|
|
762
|
+
}
|
|
763
|
+
return parseJson(response);
|
|
764
|
+
},
|
|
765
|
+
async documentChunks(id) {
|
|
766
|
+
const response = await fetchImpl(`${basePath}/documents/${encodeURIComponent(id)}/chunks`);
|
|
767
|
+
if (!response.ok) {
|
|
768
|
+
const error = await toErrorMessage(response);
|
|
769
|
+
return { ok: false, error };
|
|
770
|
+
}
|
|
771
|
+
return parseJson(response);
|
|
772
|
+
},
|
|
773
|
+
async deleteDocument(id) {
|
|
774
|
+
const response = await fetchImpl(`${basePath}/documents/${encodeURIComponent(id)}`, {
|
|
775
|
+
method: "DELETE"
|
|
776
|
+
});
|
|
777
|
+
if (!response.ok) {
|
|
778
|
+
return {
|
|
779
|
+
ok: false,
|
|
780
|
+
error: await toErrorMessage(response)
|
|
781
|
+
};
|
|
782
|
+
}
|
|
783
|
+
return parseJson(response);
|
|
784
|
+
},
|
|
785
|
+
async reseed() {
|
|
786
|
+
const response = await fetchImpl(`${basePath}/reseed`, {
|
|
787
|
+
method: "POST"
|
|
788
|
+
});
|
|
789
|
+
if (!response.ok) {
|
|
790
|
+
return {
|
|
791
|
+
ok: false,
|
|
792
|
+
error: await toErrorMessage(response)
|
|
793
|
+
};
|
|
794
|
+
}
|
|
795
|
+
return parseJson(response);
|
|
796
|
+
},
|
|
797
|
+
async reset() {
|
|
798
|
+
const response = await fetchImpl(`${basePath}/reset`, {
|
|
799
|
+
method: "POST"
|
|
800
|
+
});
|
|
801
|
+
if (!response.ok) {
|
|
802
|
+
return {
|
|
803
|
+
ok: false,
|
|
804
|
+
error: await toErrorMessage(response)
|
|
805
|
+
};
|
|
806
|
+
}
|
|
807
|
+
return parseJson(response);
|
|
808
|
+
},
|
|
809
|
+
async backends() {
|
|
810
|
+
const response = await fetchImpl(`${basePath}/backends`);
|
|
811
|
+
if (!response.ok) {
|
|
812
|
+
throw new Error(await toErrorMessage(response));
|
|
813
|
+
}
|
|
814
|
+
return parseJson(response);
|
|
815
|
+
},
|
|
743
816
|
async clearIndex() {
|
|
744
817
|
const response = await fetchImpl(`${basePath}/index`, {
|
|
745
818
|
method: "DELETE"
|
|
@@ -629,11 +629,206 @@ var useAIStream = (path, conversationId) => {
|
|
|
629
629
|
send
|
|
630
630
|
};
|
|
631
631
|
};
|
|
632
|
+
// src/react/ai/useRAGChunkPreview.ts
|
|
633
|
+
import { useCallback as useCallback2, useMemo, useState } from "react";
|
|
634
|
+
// src/ai/client/ragClient.ts
|
|
635
|
+
var jsonHeaders = {
|
|
636
|
+
"Content-Type": "application/json"
|
|
637
|
+
};
|
|
638
|
+
var normalizeBasePath = (path) => path.endsWith("/") ? path.slice(0, -1) : path;
|
|
639
|
+
var parseJson = async (response) => {
|
|
640
|
+
const payload = await response.json();
|
|
641
|
+
return payload;
|
|
642
|
+
};
|
|
643
|
+
var toErrorMessage = async (response) => {
|
|
644
|
+
try {
|
|
645
|
+
const payload = await response.json();
|
|
646
|
+
if (typeof payload.error === "string" && payload.error) {
|
|
647
|
+
return payload.error;
|
|
648
|
+
}
|
|
649
|
+
} catch {}
|
|
650
|
+
return `Request failed with status ${response.status}`;
|
|
651
|
+
};
|
|
652
|
+
var createRAGClient = (options) => {
|
|
653
|
+
const basePath = normalizeBasePath(options.path);
|
|
654
|
+
const fetchImpl = options.fetch ?? fetch;
|
|
655
|
+
return {
|
|
656
|
+
async ingest(chunks) {
|
|
657
|
+
const response = await fetchImpl(`${basePath}/ingest`, {
|
|
658
|
+
body: JSON.stringify({ chunks }),
|
|
659
|
+
headers: jsonHeaders,
|
|
660
|
+
method: "POST"
|
|
661
|
+
});
|
|
662
|
+
if (!response.ok) {
|
|
663
|
+
return {
|
|
664
|
+
ok: false,
|
|
665
|
+
error: await toErrorMessage(response)
|
|
666
|
+
};
|
|
667
|
+
}
|
|
668
|
+
return parseJson(response);
|
|
669
|
+
},
|
|
670
|
+
async ingestDocuments(input) {
|
|
671
|
+
const response = await fetchImpl(`${basePath}/ingest`, {
|
|
672
|
+
body: JSON.stringify(input),
|
|
673
|
+
headers: jsonHeaders,
|
|
674
|
+
method: "POST"
|
|
675
|
+
});
|
|
676
|
+
if (!response.ok) {
|
|
677
|
+
return {
|
|
678
|
+
ok: false,
|
|
679
|
+
error: await toErrorMessage(response)
|
|
680
|
+
};
|
|
681
|
+
}
|
|
682
|
+
return parseJson(response);
|
|
683
|
+
},
|
|
684
|
+
async search(input) {
|
|
685
|
+
const response = await fetchImpl(`${basePath}/search`, {
|
|
686
|
+
body: JSON.stringify(input),
|
|
687
|
+
headers: jsonHeaders,
|
|
688
|
+
method: "POST"
|
|
689
|
+
});
|
|
690
|
+
if (!response.ok) {
|
|
691
|
+
throw new Error(await toErrorMessage(response));
|
|
692
|
+
}
|
|
693
|
+
const payload = await parseJson(response);
|
|
694
|
+
if (!payload.ok) {
|
|
695
|
+
throw new Error(payload.error ?? "RAG search failed");
|
|
696
|
+
}
|
|
697
|
+
return payload.results ?? [];
|
|
698
|
+
},
|
|
699
|
+
async status() {
|
|
700
|
+
const response = await fetchImpl(`${basePath}/status`);
|
|
701
|
+
if (!response.ok) {
|
|
702
|
+
throw new Error(await toErrorMessage(response));
|
|
703
|
+
}
|
|
704
|
+
return parseJson(response);
|
|
705
|
+
},
|
|
706
|
+
async documents(kind) {
|
|
707
|
+
const query = kind ? `?kind=${encodeURIComponent(kind)}` : "";
|
|
708
|
+
const response = await fetchImpl(`${basePath}/documents${query}`);
|
|
709
|
+
if (!response.ok) {
|
|
710
|
+
throw new Error(await toErrorMessage(response));
|
|
711
|
+
}
|
|
712
|
+
return parseJson(response);
|
|
713
|
+
},
|
|
714
|
+
async createDocument(input) {
|
|
715
|
+
const response = await fetchImpl(`${basePath}/documents`, {
|
|
716
|
+
body: JSON.stringify(input),
|
|
717
|
+
headers: jsonHeaders,
|
|
718
|
+
method: "POST"
|
|
719
|
+
});
|
|
720
|
+
if (!response.ok) {
|
|
721
|
+
return {
|
|
722
|
+
ok: false,
|
|
723
|
+
error: await toErrorMessage(response)
|
|
724
|
+
};
|
|
725
|
+
}
|
|
726
|
+
return parseJson(response);
|
|
727
|
+
},
|
|
728
|
+
async documentChunks(id) {
|
|
729
|
+
const response = await fetchImpl(`${basePath}/documents/${encodeURIComponent(id)}/chunks`);
|
|
730
|
+
if (!response.ok) {
|
|
731
|
+
const error = await toErrorMessage(response);
|
|
732
|
+
return { ok: false, error };
|
|
733
|
+
}
|
|
734
|
+
return parseJson(response);
|
|
735
|
+
},
|
|
736
|
+
async deleteDocument(id) {
|
|
737
|
+
const response = await fetchImpl(`${basePath}/documents/${encodeURIComponent(id)}`, {
|
|
738
|
+
method: "DELETE"
|
|
739
|
+
});
|
|
740
|
+
if (!response.ok) {
|
|
741
|
+
return {
|
|
742
|
+
ok: false,
|
|
743
|
+
error: await toErrorMessage(response)
|
|
744
|
+
};
|
|
745
|
+
}
|
|
746
|
+
return parseJson(response);
|
|
747
|
+
},
|
|
748
|
+
async reseed() {
|
|
749
|
+
const response = await fetchImpl(`${basePath}/reseed`, {
|
|
750
|
+
method: "POST"
|
|
751
|
+
});
|
|
752
|
+
if (!response.ok) {
|
|
753
|
+
return {
|
|
754
|
+
ok: false,
|
|
755
|
+
error: await toErrorMessage(response)
|
|
756
|
+
};
|
|
757
|
+
}
|
|
758
|
+
return parseJson(response);
|
|
759
|
+
},
|
|
760
|
+
async reset() {
|
|
761
|
+
const response = await fetchImpl(`${basePath}/reset`, {
|
|
762
|
+
method: "POST"
|
|
763
|
+
});
|
|
764
|
+
if (!response.ok) {
|
|
765
|
+
return {
|
|
766
|
+
ok: false,
|
|
767
|
+
error: await toErrorMessage(response)
|
|
768
|
+
};
|
|
769
|
+
}
|
|
770
|
+
return parseJson(response);
|
|
771
|
+
},
|
|
772
|
+
async backends() {
|
|
773
|
+
const response = await fetchImpl(`${basePath}/backends`);
|
|
774
|
+
if (!response.ok) {
|
|
775
|
+
throw new Error(await toErrorMessage(response));
|
|
776
|
+
}
|
|
777
|
+
return parseJson(response);
|
|
778
|
+
},
|
|
779
|
+
async clearIndex() {
|
|
780
|
+
const response = await fetchImpl(`${basePath}/index`, {
|
|
781
|
+
method: "DELETE"
|
|
782
|
+
});
|
|
783
|
+
if (!response.ok) {
|
|
784
|
+
throw new Error(await toErrorMessage(response));
|
|
785
|
+
}
|
|
786
|
+
return parseJson(response);
|
|
787
|
+
}
|
|
788
|
+
};
|
|
789
|
+
};
|
|
790
|
+
// src/react/ai/useRAGChunkPreview.ts
|
|
791
|
+
var useRAGChunkPreview = (path) => {
|
|
792
|
+
const client = useMemo(() => createRAGClient({ path }), [path]);
|
|
793
|
+
const [preview, setPreview] = useState(null);
|
|
794
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
795
|
+
const [error, setError] = useState(null);
|
|
796
|
+
const inspect = useCallback2(async (id) => {
|
|
797
|
+
setIsLoading(true);
|
|
798
|
+
setError(null);
|
|
799
|
+
try {
|
|
800
|
+
const response = await client.documentChunks(id);
|
|
801
|
+
if (!response.ok) {
|
|
802
|
+
throw new Error(response.error);
|
|
803
|
+
}
|
|
804
|
+
setPreview(response);
|
|
805
|
+
return response;
|
|
806
|
+
} catch (err) {
|
|
807
|
+
const message = err instanceof Error ? err.message : "Failed to load RAG chunk preview";
|
|
808
|
+
setError(message);
|
|
809
|
+
throw err;
|
|
810
|
+
} finally {
|
|
811
|
+
setIsLoading(false);
|
|
812
|
+
}
|
|
813
|
+
}, [client]);
|
|
814
|
+
const clear = useCallback2(() => {
|
|
815
|
+
setPreview(null);
|
|
816
|
+
setError(null);
|
|
817
|
+
setIsLoading(false);
|
|
818
|
+
}, []);
|
|
819
|
+
return {
|
|
820
|
+
clear,
|
|
821
|
+
error,
|
|
822
|
+
inspect,
|
|
823
|
+
isLoading,
|
|
824
|
+
preview
|
|
825
|
+
};
|
|
826
|
+
};
|
|
632
827
|
// src/react/ai/useRAG.ts
|
|
633
|
-
import { useMemo as
|
|
828
|
+
import { useMemo as useMemo10 } from "react";
|
|
634
829
|
|
|
635
830
|
// src/react/ai/useRAGCitations.ts
|
|
636
|
-
import { useMemo } from "react";
|
|
831
|
+
import { useMemo as useMemo2 } from "react";
|
|
637
832
|
|
|
638
833
|
// src/ai/rag/presentation.ts
|
|
639
834
|
var buildSourceGroupKey = (source) => source.source ?? source.title ?? source.chunkId;
|
|
@@ -727,8 +922,8 @@ var resolveRAGStreamStage = ({
|
|
|
727
922
|
|
|
728
923
|
// src/react/ai/useRAGCitations.ts
|
|
729
924
|
var useRAGCitations = (sources) => {
|
|
730
|
-
const citations =
|
|
731
|
-
const sourceGroups =
|
|
925
|
+
const citations = useMemo2(() => buildRAGCitations(sources), [sources]);
|
|
926
|
+
const sourceGroups = useMemo2(() => buildRAGSourceGroups(sources), [sources]);
|
|
732
927
|
return {
|
|
733
928
|
citations,
|
|
734
929
|
hasCitations: citations.length > 0,
|
|
@@ -736,102 +931,56 @@ var useRAGCitations = (sources) => {
|
|
|
736
931
|
};
|
|
737
932
|
};
|
|
738
933
|
|
|
739
|
-
// src/react/ai/
|
|
740
|
-
import { useCallback as
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
934
|
+
// src/react/ai/useRAGDocuments.ts
|
|
935
|
+
import { useCallback as useCallback3, useMemo as useMemo3, useState as useState2 } from "react";
|
|
936
|
+
var useRAGDocuments = (path) => {
|
|
937
|
+
const client = useMemo3(() => createRAGClient({ path }), [path]);
|
|
938
|
+
const [documents, setDocuments] = useState2([]);
|
|
939
|
+
const [isLoading, setIsLoading] = useState2(false);
|
|
940
|
+
const [error, setError] = useState2(null);
|
|
941
|
+
const [lastResponse, setLastResponse] = useState2(null);
|
|
942
|
+
const load = useCallback3(async (kind) => {
|
|
943
|
+
setIsLoading(true);
|
|
944
|
+
setError(null);
|
|
945
|
+
try {
|
|
946
|
+
const response = await client.documents(kind);
|
|
947
|
+
setDocuments(response.documents);
|
|
948
|
+
setLastResponse(response);
|
|
949
|
+
return response;
|
|
950
|
+
} catch (err) {
|
|
951
|
+
const message = err instanceof Error ? err.message : "Failed to load RAG documents";
|
|
952
|
+
setError(message);
|
|
953
|
+
throw err;
|
|
954
|
+
} finally {
|
|
955
|
+
setIsLoading(false);
|
|
756
956
|
}
|
|
757
|
-
}
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
957
|
+
}, [client]);
|
|
958
|
+
const reset = useCallback3(() => {
|
|
959
|
+
setDocuments([]);
|
|
960
|
+
setError(null);
|
|
961
|
+
setLastResponse(null);
|
|
962
|
+
setIsLoading(false);
|
|
963
|
+
}, []);
|
|
763
964
|
return {
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
if (!response.ok) {
|
|
771
|
-
return {
|
|
772
|
-
ok: false,
|
|
773
|
-
error: await toErrorMessage(response)
|
|
774
|
-
};
|
|
775
|
-
}
|
|
776
|
-
return parseJson(response);
|
|
777
|
-
},
|
|
778
|
-
async ingestDocuments(input) {
|
|
779
|
-
const response = await fetchImpl(`${basePath}/ingest`, {
|
|
780
|
-
body: JSON.stringify(input),
|
|
781
|
-
headers: jsonHeaders,
|
|
782
|
-
method: "POST"
|
|
783
|
-
});
|
|
784
|
-
if (!response.ok) {
|
|
785
|
-
return {
|
|
786
|
-
ok: false,
|
|
787
|
-
error: await toErrorMessage(response)
|
|
788
|
-
};
|
|
789
|
-
}
|
|
790
|
-
return parseJson(response);
|
|
791
|
-
},
|
|
792
|
-
async search(input) {
|
|
793
|
-
const response = await fetchImpl(`${basePath}/search`, {
|
|
794
|
-
body: JSON.stringify(input),
|
|
795
|
-
headers: jsonHeaders,
|
|
796
|
-
method: "POST"
|
|
797
|
-
});
|
|
798
|
-
if (!response.ok) {
|
|
799
|
-
throw new Error(await toErrorMessage(response));
|
|
800
|
-
}
|
|
801
|
-
const payload = await parseJson(response);
|
|
802
|
-
if (!payload.ok) {
|
|
803
|
-
throw new Error(payload.error ?? "RAG search failed");
|
|
804
|
-
}
|
|
805
|
-
return payload.results ?? [];
|
|
806
|
-
},
|
|
807
|
-
async status() {
|
|
808
|
-
const response = await fetchImpl(`${basePath}/status`);
|
|
809
|
-
if (!response.ok) {
|
|
810
|
-
throw new Error(await toErrorMessage(response));
|
|
811
|
-
}
|
|
812
|
-
return parseJson(response);
|
|
813
|
-
},
|
|
814
|
-
async clearIndex() {
|
|
815
|
-
const response = await fetchImpl(`${basePath}/index`, {
|
|
816
|
-
method: "DELETE"
|
|
817
|
-
});
|
|
818
|
-
if (!response.ok) {
|
|
819
|
-
throw new Error(await toErrorMessage(response));
|
|
820
|
-
}
|
|
821
|
-
return parseJson(response);
|
|
822
|
-
}
|
|
965
|
+
documents,
|
|
966
|
+
error,
|
|
967
|
+
isLoading,
|
|
968
|
+
lastResponse,
|
|
969
|
+
load,
|
|
970
|
+
reset
|
|
823
971
|
};
|
|
824
972
|
};
|
|
825
973
|
|
|
826
974
|
// src/react/ai/useRAGIngest.ts
|
|
975
|
+
import { useCallback as useCallback4, useMemo as useMemo4, useState as useState3 } from "react";
|
|
827
976
|
var useRAGIngest = (path) => {
|
|
828
|
-
const client =
|
|
829
|
-
const [error, setError] =
|
|
830
|
-
const [isIngesting, setIsIngesting] =
|
|
831
|
-
const [lastIngestCount, setLastIngestCount] =
|
|
832
|
-
const [lastDocumentCount, setLastDocumentCount] =
|
|
833
|
-
const [lastResponse, setLastResponse] =
|
|
834
|
-
const ingestChunks =
|
|
977
|
+
const client = useMemo4(() => createRAGClient({ path }), [path]);
|
|
978
|
+
const [error, setError] = useState3(null);
|
|
979
|
+
const [isIngesting, setIsIngesting] = useState3(false);
|
|
980
|
+
const [lastIngestCount, setLastIngestCount] = useState3(null);
|
|
981
|
+
const [lastDocumentCount, setLastDocumentCount] = useState3(null);
|
|
982
|
+
const [lastResponse, setLastResponse] = useState3(null);
|
|
983
|
+
const ingestChunks = useCallback4(async (chunks) => {
|
|
835
984
|
setIsIngesting(true);
|
|
836
985
|
setError(null);
|
|
837
986
|
try {
|
|
@@ -851,7 +1000,7 @@ var useRAGIngest = (path) => {
|
|
|
851
1000
|
setIsIngesting(false);
|
|
852
1001
|
}
|
|
853
1002
|
}, [client]);
|
|
854
|
-
const ingestDocuments =
|
|
1003
|
+
const ingestDocuments = useCallback4(async (input) => {
|
|
855
1004
|
setIsIngesting(true);
|
|
856
1005
|
setError(null);
|
|
857
1006
|
try {
|
|
@@ -871,7 +1020,7 @@ var useRAGIngest = (path) => {
|
|
|
871
1020
|
setIsIngesting(false);
|
|
872
1021
|
}
|
|
873
1022
|
}, [client]);
|
|
874
|
-
const clearIndex =
|
|
1023
|
+
const clearIndex = useCallback4(async () => {
|
|
875
1024
|
setIsIngesting(true);
|
|
876
1025
|
setError(null);
|
|
877
1026
|
try {
|
|
@@ -887,7 +1036,7 @@ var useRAGIngest = (path) => {
|
|
|
887
1036
|
setIsIngesting(false);
|
|
888
1037
|
}
|
|
889
1038
|
}, [client]);
|
|
890
|
-
const reset =
|
|
1039
|
+
const reset = useCallback4(() => {
|
|
891
1040
|
setError(null);
|
|
892
1041
|
setLastDocumentCount(null);
|
|
893
1042
|
setLastIngestCount(null);
|
|
@@ -907,16 +1056,101 @@ var useRAGIngest = (path) => {
|
|
|
907
1056
|
};
|
|
908
1057
|
};
|
|
909
1058
|
|
|
1059
|
+
// src/react/ai/useRAGIndexAdmin.ts
|
|
1060
|
+
import { useCallback as useCallback5, useMemo as useMemo5, useState as useState4 } from "react";
|
|
1061
|
+
var useRAGIndexAdmin = (path) => {
|
|
1062
|
+
const client = useMemo5(() => createRAGClient({ path }), [path]);
|
|
1063
|
+
const [isLoading, setIsLoading] = useState4(false);
|
|
1064
|
+
const [error, setError] = useState4(null);
|
|
1065
|
+
const [lastMutation, setLastMutation] = useState4(null);
|
|
1066
|
+
const [backends, setBackends] = useState4(null);
|
|
1067
|
+
const run = useCallback5(async (operation) => {
|
|
1068
|
+
setIsLoading(true);
|
|
1069
|
+
setError(null);
|
|
1070
|
+
try {
|
|
1071
|
+
return await operation();
|
|
1072
|
+
} catch (err) {
|
|
1073
|
+
const message = err instanceof Error ? err.message : "RAG index administration failed";
|
|
1074
|
+
setError(message);
|
|
1075
|
+
throw err;
|
|
1076
|
+
} finally {
|
|
1077
|
+
setIsLoading(false);
|
|
1078
|
+
}
|
|
1079
|
+
}, []);
|
|
1080
|
+
const deleteDocument = useCallback5(async (id) => run(async () => {
|
|
1081
|
+
const response = await client.deleteDocument(id);
|
|
1082
|
+
setLastMutation(response);
|
|
1083
|
+
if (!response.ok) {
|
|
1084
|
+
throw new Error(response.error ?? "Failed to delete document");
|
|
1085
|
+
}
|
|
1086
|
+
return response;
|
|
1087
|
+
}), [client, run]);
|
|
1088
|
+
const createDocument = useCallback5(async (input) => run(async () => {
|
|
1089
|
+
const response = await client.createDocument(input);
|
|
1090
|
+
setLastMutation(response);
|
|
1091
|
+
if (!response.ok) {
|
|
1092
|
+
throw new Error(response.error ?? "Failed to create document");
|
|
1093
|
+
}
|
|
1094
|
+
return response;
|
|
1095
|
+
}), [client, run]);
|
|
1096
|
+
const reseed = useCallback5(async () => run(async () => {
|
|
1097
|
+
const response = await client.reseed();
|
|
1098
|
+
setLastMutation(response);
|
|
1099
|
+
if (!response.ok) {
|
|
1100
|
+
throw new Error(response.error ?? "Failed to reseed index");
|
|
1101
|
+
}
|
|
1102
|
+
return response;
|
|
1103
|
+
}), [client, run]);
|
|
1104
|
+
const reset = useCallback5(async () => run(async () => {
|
|
1105
|
+
const response = await client.reset();
|
|
1106
|
+
setLastMutation(response);
|
|
1107
|
+
if (!response.ok) {
|
|
1108
|
+
throw new Error(response.error ?? "Failed to reset index");
|
|
1109
|
+
}
|
|
1110
|
+
return response;
|
|
1111
|
+
}), [client, run]);
|
|
1112
|
+
const loadBackends = useCallback5(async () => run(async () => {
|
|
1113
|
+
const response = await client.backends();
|
|
1114
|
+
setBackends(response);
|
|
1115
|
+
return response;
|
|
1116
|
+
}), [client, run]);
|
|
1117
|
+
const clearIndex = useCallback5(async () => run(async () => {
|
|
1118
|
+
const response = await client.clearIndex();
|
|
1119
|
+
const mutation = { ok: response.ok };
|
|
1120
|
+
setLastMutation(mutation);
|
|
1121
|
+
return mutation;
|
|
1122
|
+
}), [client, run]);
|
|
1123
|
+
const resetState = useCallback5(() => {
|
|
1124
|
+
setIsLoading(false);
|
|
1125
|
+
setError(null);
|
|
1126
|
+
setLastMutation(null);
|
|
1127
|
+
setBackends(null);
|
|
1128
|
+
}, []);
|
|
1129
|
+
return {
|
|
1130
|
+
backends,
|
|
1131
|
+
clearIndex,
|
|
1132
|
+
createDocument,
|
|
1133
|
+
deleteDocument,
|
|
1134
|
+
error,
|
|
1135
|
+
isLoading,
|
|
1136
|
+
lastMutation,
|
|
1137
|
+
loadBackends,
|
|
1138
|
+
reseed,
|
|
1139
|
+
reset,
|
|
1140
|
+
resetState
|
|
1141
|
+
};
|
|
1142
|
+
};
|
|
1143
|
+
|
|
910
1144
|
// src/react/ai/useRAGSearch.ts
|
|
911
|
-
import { useCallback as
|
|
1145
|
+
import { useCallback as useCallback6, useMemo as useMemo6, useState as useState5 } from "react";
|
|
912
1146
|
var useRAGSearch = (path) => {
|
|
913
|
-
const client =
|
|
914
|
-
const [results, setResults] =
|
|
915
|
-
const [error, setError] =
|
|
916
|
-
const [isSearching, setIsSearching] =
|
|
917
|
-
const [hasSearched, setHasSearched] =
|
|
918
|
-
const [lastRequest, setLastRequest] =
|
|
919
|
-
const search =
|
|
1147
|
+
const client = useMemo6(() => createRAGClient({ path }), [path]);
|
|
1148
|
+
const [results, setResults] = useState5([]);
|
|
1149
|
+
const [error, setError] = useState5(null);
|
|
1150
|
+
const [isSearching, setIsSearching] = useState5(false);
|
|
1151
|
+
const [hasSearched, setHasSearched] = useState5(false);
|
|
1152
|
+
const [lastRequest, setLastRequest] = useState5(null);
|
|
1153
|
+
const search = useCallback6(async (input) => {
|
|
920
1154
|
setIsSearching(true);
|
|
921
1155
|
setError(null);
|
|
922
1156
|
setLastRequest(input);
|
|
@@ -933,7 +1167,7 @@ var useRAGSearch = (path) => {
|
|
|
933
1167
|
setIsSearching(false);
|
|
934
1168
|
}
|
|
935
1169
|
}, [client]);
|
|
936
|
-
const reset =
|
|
1170
|
+
const reset = useCallback6(() => {
|
|
937
1171
|
setError(null);
|
|
938
1172
|
setHasSearched(false);
|
|
939
1173
|
setLastRequest(null);
|
|
@@ -952,11 +1186,11 @@ var useRAGSearch = (path) => {
|
|
|
952
1186
|
};
|
|
953
1187
|
|
|
954
1188
|
// src/react/ai/useRAGSources.ts
|
|
955
|
-
import { useMemo as
|
|
1189
|
+
import { useMemo as useMemo7 } from "react";
|
|
956
1190
|
var useRAGSources = (messages) => {
|
|
957
|
-
const latestAssistantMessage =
|
|
958
|
-
const sources =
|
|
959
|
-
const sourceGroups =
|
|
1191
|
+
const latestAssistantMessage = useMemo7(() => getLatestAssistantMessage(messages), [messages]);
|
|
1192
|
+
const sources = useMemo7(() => getLatestRAGSources(messages), [messages]);
|
|
1193
|
+
const sourceGroups = useMemo7(() => buildRAGSourceGroups(sources), [sources]);
|
|
960
1194
|
return {
|
|
961
1195
|
hasSources: sources.length > 0,
|
|
962
1196
|
latestAssistantMessage,
|
|
@@ -966,14 +1200,14 @@ var useRAGSources = (messages) => {
|
|
|
966
1200
|
};
|
|
967
1201
|
|
|
968
1202
|
// src/react/ai/useRAGStatus.ts
|
|
969
|
-
import { useCallback as
|
|
1203
|
+
import { useCallback as useCallback7, useEffect as useEffect3, useMemo as useMemo8, useState as useState6 } from "react";
|
|
970
1204
|
var useRAGStatus = (path, autoLoad = true) => {
|
|
971
|
-
const client =
|
|
972
|
-
const [status, setStatus] =
|
|
973
|
-
const [capabilities, setCapabilities] =
|
|
974
|
-
const [error, setError] =
|
|
975
|
-
const [isLoading, setIsLoading] =
|
|
976
|
-
const refresh =
|
|
1205
|
+
const client = useMemo8(() => createRAGClient({ path }), [path]);
|
|
1206
|
+
const [status, setStatus] = useState6();
|
|
1207
|
+
const [capabilities, setCapabilities] = useState6();
|
|
1208
|
+
const [error, setError] = useState6(null);
|
|
1209
|
+
const [isLoading, setIsLoading] = useState6(autoLoad);
|
|
1210
|
+
const refresh = useCallback7(async () => {
|
|
977
1211
|
setIsLoading(true);
|
|
978
1212
|
setError(null);
|
|
979
1213
|
try {
|
|
@@ -989,7 +1223,7 @@ var useRAGStatus = (path, autoLoad = true) => {
|
|
|
989
1223
|
setIsLoading(false);
|
|
990
1224
|
}
|
|
991
1225
|
}, [client]);
|
|
992
|
-
const reset =
|
|
1226
|
+
const reset = useCallback7(() => {
|
|
993
1227
|
setCapabilities(undefined);
|
|
994
1228
|
setError(null);
|
|
995
1229
|
setIsLoading(false);
|
|
@@ -1013,19 +1247,19 @@ var useRAGStatus = (path, autoLoad = true) => {
|
|
|
1013
1247
|
};
|
|
1014
1248
|
|
|
1015
1249
|
// src/react/ai/useRAGStream.ts
|
|
1016
|
-
import { useCallback as
|
|
1250
|
+
import { useCallback as useCallback8, useMemo as useMemo9 } from "react";
|
|
1017
1251
|
var useRAGStream = (path, conversationId) => {
|
|
1018
1252
|
const stream = useAIStream(path, conversationId);
|
|
1019
|
-
const latestAssistantMessage =
|
|
1020
|
-
const sources =
|
|
1021
|
-
const sourceGroups =
|
|
1022
|
-
const citations =
|
|
1023
|
-
const stage =
|
|
1253
|
+
const latestAssistantMessage = useMemo9(() => getLatestAssistantMessage(stream.messages), [stream.messages]);
|
|
1254
|
+
const sources = useMemo9(() => getLatestRAGSources(stream.messages), [stream.messages]);
|
|
1255
|
+
const sourceGroups = useMemo9(() => buildRAGSourceGroups(sources), [sources]);
|
|
1256
|
+
const citations = useMemo9(() => buildRAGCitations(sources), [sources]);
|
|
1257
|
+
const stage = useMemo9(() => resolveRAGStreamStage({
|
|
1024
1258
|
error: stream.error,
|
|
1025
1259
|
isStreaming: stream.isStreaming,
|
|
1026
1260
|
messages: stream.messages
|
|
1027
1261
|
}), [stream.error, stream.isStreaming, stream.messages]);
|
|
1028
|
-
const query =
|
|
1262
|
+
const query = useCallback8((content, attachments) => {
|
|
1029
1263
|
stream.send(content, attachments);
|
|
1030
1264
|
}, [stream]);
|
|
1031
1265
|
return {
|
|
@@ -1045,17 +1279,23 @@ var useRAG = (path, options = {}) => {
|
|
|
1045
1279
|
const search = useRAGSearch(path);
|
|
1046
1280
|
const ingest = useRAGIngest(path);
|
|
1047
1281
|
const status = useRAGStatus(path, options.autoLoadStatus ?? true);
|
|
1282
|
+
const documents = useRAGDocuments(path);
|
|
1283
|
+
const chunkPreview = useRAGChunkPreview(path);
|
|
1284
|
+
const index = useRAGIndexAdmin(path);
|
|
1048
1285
|
const stream = useRAGStream(options.streamPath ?? path, options.conversationId);
|
|
1049
1286
|
const sources = useRAGSources(stream.messages);
|
|
1050
1287
|
const citations = useRAGCitations(sources.sources);
|
|
1051
|
-
return
|
|
1288
|
+
return useMemo10(() => ({
|
|
1052
1289
|
citations,
|
|
1290
|
+
chunkPreview,
|
|
1291
|
+
documents,
|
|
1053
1292
|
ingest,
|
|
1293
|
+
index,
|
|
1054
1294
|
search,
|
|
1055
1295
|
sources,
|
|
1056
1296
|
status,
|
|
1057
1297
|
stream
|
|
1058
|
-
}), [citations, ingest, search, sources, status, stream]);
|
|
1298
|
+
}), [citations, chunkPreview, documents, ingest, index, search, sources, status, stream]);
|
|
1059
1299
|
};
|
|
1060
1300
|
export {
|
|
1061
1301
|
useRAGStream,
|
|
@@ -1063,7 +1303,10 @@ export {
|
|
|
1063
1303
|
useRAGSources,
|
|
1064
1304
|
useRAGSearch,
|
|
1065
1305
|
useRAGIngest,
|
|
1306
|
+
useRAGIndexAdmin,
|
|
1307
|
+
useRAGDocuments,
|
|
1066
1308
|
useRAGCitations,
|
|
1309
|
+
useRAGChunkPreview,
|
|
1067
1310
|
useRAG,
|
|
1068
1311
|
useAIStream,
|
|
1069
1312
|
AIStreamProvider
|