@credithub/harlan-components 1.52.2 → 1.53.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.
- package/dist/components/dossie/dossie.js +3 -3
- package/dist/components/dossie/generativeAi/generativeAi.js +102 -194
- package/dist/components/dossie/generativeAi/processStream.d.ts +13 -0
- package/dist/components/dossie/generativeAi/processStream.js +171 -0
- package/dist/components/dossie/generativeAi/queryUtils.js +4 -5
- package/dist/components/streamQuery.d.ts +3 -2
- package/dist/components/streamQuery.js +173 -38
- package/lib/cjs/index.js +7559 -1724
- package/lib/esm/index.js +7559 -1724
- package/package.json +2 -1
|
@@ -24,9 +24,9 @@ import Section from '../section';
|
|
|
24
24
|
import { Queries, RequestStatus } from '../webservice';
|
|
25
25
|
import { Carrousel } from './carrousel/carrousel';
|
|
26
26
|
import { createDossieData } from './dossieData';
|
|
27
|
-
import GenerativeAI from './generativeAi/generativeAi';
|
|
28
27
|
import { Summary } from './summary/summary';
|
|
29
28
|
import { TransactionsTable } from './transactionTable/transactionTable';
|
|
29
|
+
import GenerativeAI from './generativeAi/generativeAi';
|
|
30
30
|
var DossieContent = styled.div(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n display: grid;\n grid-template-columns: 1fr 2fr;\n justify-items: center;\n align-items: flex-start;\n margin-bottom: 20px;\n gap: 20px;\n\n @media screen and (max-width: 992px) {\n grid-template-columns: 1fr;\n }\n"], ["\n display: grid;\n grid-template-columns: 1fr 2fr;\n justify-items: center;\n align-items: flex-start;\n margin-bottom: 20px;\n gap: 20px;\n\n @media screen and (max-width: 992px) {\n grid-template-columns: 1fr;\n }\n"])));
|
|
31
31
|
var DossieContainer = styled.div(templateObject_2 || (templateObject_2 = __makeTemplateObject(["\n padding: 0px 70px;\n\n @media (max-width: 1000px) {\n padding: 0px 30px;\n }\n"], ["\n padding: 0px 70px;\n\n @media (max-width: 1000px) {\n padding: 0px 30px;\n }\n"])));
|
|
32
32
|
var GenerativeAIContainer = styled.div(templateObject_3 || (templateObject_3 = __makeTemplateObject(["\n padding: 32px;\n background-color: ", ";\n"], ["\n padding: 32px;\n background-color: ", ";\n"])), function (_a) {
|
|
@@ -71,8 +71,8 @@ var Dossie = function (_a) {
|
|
|
71
71
|
React.createElement(DossieCarrousel, null),
|
|
72
72
|
React.createElement(Summary, { finderResponse: data, rfbResponse: rfbResponse, document: document })),
|
|
73
73
|
React.createElement(TransactionsTable, { events: XPathUtils.select('//historico/consulta', data) || [] })),
|
|
74
|
-
!printMode && React.createElement(GenerativeAIContainer, null,
|
|
75
|
-
React.createElement(GenerativeAI, { documento: document }))));
|
|
74
|
+
!printMode && (React.createElement(GenerativeAIContainer, null,
|
|
75
|
+
React.createElement(GenerativeAI, { documento: document })))));
|
|
76
76
|
};
|
|
77
77
|
return (React.createElement(Section, { ctx: ctx, hideHeader: true, minimized: false, isError: function (e) { return response(e); }, onSuccess: response }));
|
|
78
78
|
};
|
|
@@ -1,13 +1,38 @@
|
|
|
1
|
-
var
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
11
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
12
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
13
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
14
|
+
function step(op) {
|
|
15
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
16
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
17
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
18
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
19
|
+
switch (op[0]) {
|
|
20
|
+
case 0: case 1: t = op; break;
|
|
21
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
22
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
23
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
24
|
+
default:
|
|
25
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
26
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
27
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
28
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
29
|
+
if (t[2]) _.ops.pop();
|
|
30
|
+
_.trys.pop(); continue;
|
|
31
|
+
}
|
|
32
|
+
op = body.call(thisArg, _);
|
|
33
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
34
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
35
|
+
}
|
|
11
36
|
};
|
|
12
37
|
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
13
38
|
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
@@ -31,7 +56,9 @@ import { useGlobalData } from '../../../contexts/globalDataContext';
|
|
|
31
56
|
import useToggle from '../../../hooks/useToggle';
|
|
32
57
|
import React, { useEffect, useMemo, useRef, useState } from 'react';
|
|
33
58
|
import ReactMarkdown from 'react-markdown';
|
|
59
|
+
import remarkGfm from 'remark-gfm';
|
|
34
60
|
import { flattenData, selectRelevantData } from './dataUtils';
|
|
61
|
+
import { processStream } from './processStream';
|
|
35
62
|
import { createQueryAndMessages } from './queryUtils';
|
|
36
63
|
import { BetaTag, ChatInput, ChatInputContainer, Container, ContainerInput, GenerativeAi, Header, HeaderContent, InitialMessageBox, InitialMessageContent, LoadingDots, Message, MessageHistory, SendButton, Title } from './styles';
|
|
37
64
|
var GenerativeAI = function (_a) {
|
|
@@ -39,187 +66,81 @@ var GenerativeAI = function (_a) {
|
|
|
39
66
|
var documento = _a.documento;
|
|
40
67
|
var globalData = useGlobalData().data;
|
|
41
68
|
var _e = useState('{}'), serializedData = _e[0], setSerializedData = _e[1];
|
|
42
|
-
var _f = useState(
|
|
43
|
-
var _g = useState(
|
|
44
|
-
var _h =
|
|
45
|
-
var _j =
|
|
69
|
+
var _f = useState(''), userInput = _f[0], setUserInput = _f[1];
|
|
70
|
+
var _g = useState([]), messageHistory = _g[0], setMessageHistory = _g[1];
|
|
71
|
+
var _h = useToggle(), isOpen = _h[0], toggleOpen = _h[1];
|
|
72
|
+
var _j = useState('summary'), streamMode = _j[0], setStreamMode = _j[1];
|
|
73
|
+
var _k = useState(null), summaryQueryData = _k[0], setSummaryQueryData = _k[1];
|
|
74
|
+
var _l = useState(null), chatQueryData = _l[0], setChatQueryData = _l[1];
|
|
46
75
|
var messageHistoryRef = useRef(null);
|
|
47
|
-
var incrementalResponseRef = useRef('');
|
|
48
|
-
var abortControllerRef = useRef(null);
|
|
49
|
-
var _k = useState(false), hasMadeInitialRequest = _k[0], setHasMadeInitialRequest = _k[1];
|
|
50
|
-
var _l = useState(false), isProcessing = _l[0], setIsProcessing = _l[1];
|
|
51
|
-
var _m = useState(false), shouldStartTyping = _m[0], setShouldStartTyping = _m[1];
|
|
52
|
-
var _o = useState(''), typingMessage = _o[0], setTypingMessage = _o[1];
|
|
53
|
-
var _p = useState(false), isTyping = _p[0], setIsTyping = _p[1];
|
|
54
|
-
var _q = useState(0), currentMessageIndex = _q[0], setCurrentMessageIndex = _q[1];
|
|
55
|
-
var typingIntervalRef = useRef(null);
|
|
56
|
-
var simulateTyping = function (message, callback) {
|
|
57
|
-
setIsTyping(true);
|
|
58
|
-
var index = typingMessage.length - 1;
|
|
59
|
-
if (typingIntervalRef.current) {
|
|
60
|
-
clearInterval(typingIntervalRef.current);
|
|
61
|
-
}
|
|
62
|
-
typingIntervalRef.current = setInterval(function () {
|
|
63
|
-
if (index < message.length) {
|
|
64
|
-
setTypingMessage(function (prev) { return prev + message[index]; });
|
|
65
|
-
index++;
|
|
66
|
-
}
|
|
67
|
-
else {
|
|
68
|
-
clearInterval(typingIntervalRef.current);
|
|
69
|
-
setIsTyping(false);
|
|
70
|
-
callback();
|
|
71
|
-
}
|
|
72
|
-
}, 25);
|
|
73
|
-
};
|
|
74
|
-
var stopTyping = function () {
|
|
75
|
-
if (typingIntervalRef.current) {
|
|
76
|
-
clearInterval(typingIntervalRef.current);
|
|
77
|
-
typingIntervalRef.current = null;
|
|
78
|
-
setMessageHistory(function (prevMessages) {
|
|
79
|
-
var updatedMessages = __spreadArray([], prevMessages, true);
|
|
80
|
-
if (updatedMessages.length > 0 &&
|
|
81
|
-
updatedMessages[updatedMessages.length - 1].role === 'assistant') {
|
|
82
|
-
updatedMessages[updatedMessages.length - 1] = __assign(__assign({}, updatedMessages[updatedMessages.length - 1]), { content: typingMessage });
|
|
83
|
-
}
|
|
84
|
-
return updatedMessages;
|
|
85
|
-
});
|
|
86
|
-
setIsTyping(false);
|
|
87
|
-
}
|
|
88
|
-
};
|
|
89
|
-
var processMessages = function () {
|
|
90
|
-
var nextMessage = messageHistory[currentMessageIndex];
|
|
91
|
-
if ((nextMessage === null || nextMessage === void 0 ? void 0 : nextMessage.role) === 'assistant') {
|
|
92
|
-
simulateTyping(nextMessage === null || nextMessage === void 0 ? void 0 : nextMessage.content, function () {
|
|
93
|
-
setCurrentMessageIndex(function (prev) { return prev + 1; });
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
else {
|
|
97
|
-
setCurrentMessageIndex(function (prev) { return prev + 1; });
|
|
98
|
-
}
|
|
99
|
-
};
|
|
100
|
-
useEffect(function () {
|
|
101
|
-
if (currentMessageIndex < messageHistory.length && !isTyping) {
|
|
102
|
-
var nextMessage = messageHistory[currentMessageIndex];
|
|
103
|
-
if ((nextMessage === null || nextMessage === void 0 ? void 0 : nextMessage.role) === 'assistant') {
|
|
104
|
-
simulateTyping(nextMessage.content, function () {
|
|
105
|
-
setCurrentMessageIndex(function (prev) { return prev + 1; });
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
}, [currentMessageIndex, messageHistory]);
|
|
110
|
-
var handleIncrementalResponse = function (response) {
|
|
111
|
-
var nonEmptyFragments = response.filter(function (e) { return e.message.content !== ''; });
|
|
112
|
-
if (nonEmptyFragments.length > 0) {
|
|
113
|
-
var newContent = nonEmptyFragments
|
|
114
|
-
.map(function (e) { return e.message.content; })
|
|
115
|
-
.join('');
|
|
116
|
-
incrementalResponseRef.current += newContent;
|
|
117
|
-
setMessageHistory(function (prevMessages) {
|
|
118
|
-
var updatedMessages = __spreadArray([], prevMessages, true);
|
|
119
|
-
var lastMessage = updatedMessages[updatedMessages.length - 1];
|
|
120
|
-
if (lastMessage && lastMessage.role === 'assistant') {
|
|
121
|
-
lastMessage.content = incrementalResponseRef.current;
|
|
122
|
-
}
|
|
123
|
-
else {
|
|
124
|
-
updatedMessages.push({
|
|
125
|
-
role: 'assistant',
|
|
126
|
-
content: incrementalResponseRef.current
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
return updatedMessages;
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
if (response.some(function (e) { return e.done; })) {
|
|
133
|
-
incrementalResponseRef.current = '';
|
|
134
|
-
setQueryEnabled(false);
|
|
135
|
-
}
|
|
136
|
-
};
|
|
137
76
|
var isGlobalDataLoaded = useMemo(function () {
|
|
138
|
-
|
|
139
|
-
globalData.documentHistory !== null;
|
|
140
|
-
return loaded;
|
|
77
|
+
return (globalData.documentHistory !== undefined &&
|
|
78
|
+
globalData.documentHistory !== null);
|
|
141
79
|
}, [globalData]);
|
|
142
80
|
useEffect(function () {
|
|
143
|
-
if (
|
|
81
|
+
if (globalData && documento && isGlobalDataLoaded) {
|
|
144
82
|
try {
|
|
145
83
|
var relevantData = selectRelevantData(globalData);
|
|
146
84
|
var serialized = flattenData(relevantData);
|
|
147
85
|
setSerializedData(serialized);
|
|
148
|
-
setQueryEnabled(true);
|
|
149
|
-
setHasMadeInitialRequest(true);
|
|
150
86
|
}
|
|
151
87
|
catch (error) {
|
|
152
88
|
console.error('Erro ao preparar os dados para a API:', error);
|
|
153
89
|
setSerializedData('{}');
|
|
154
|
-
setQueryEnabled(false);
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
}, [documento, isGlobalDataLoaded, hasMadeInitialRequest]);
|
|
158
|
-
var queryData = useMemo(function () {
|
|
159
|
-
if (!queryEnabled || !serializedData || serializedData === '{}')
|
|
160
|
-
return undefined;
|
|
161
|
-
var generatedQuery = createQueryAndMessages(serializedData, messageHistory, userInput);
|
|
162
|
-
return generatedQuery;
|
|
163
|
-
}, [queryEnabled, serializedData, messageHistory, userInput]);
|
|
164
|
-
var _r = useStreamQuery("SELECT FROM 'LlamaApi'.'Consulta'", queryData, !!queryData), response = _r.response, error = _r.error, isLoading = _r.isLoading, refetch = _r.refetch;
|
|
165
|
-
useEffect(function () {
|
|
166
|
-
abortControllerRef.current = new AbortController();
|
|
167
|
-
return function () {
|
|
168
|
-
if (abortControllerRef.current) {
|
|
169
|
-
abortControllerRef.current.abort();
|
|
170
90
|
}
|
|
171
|
-
if (typingIntervalRef.current) {
|
|
172
|
-
clearInterval(typingIntervalRef.current);
|
|
173
|
-
}
|
|
174
|
-
};
|
|
175
|
-
}, [queryEnabled]);
|
|
176
|
-
useEffect(function () {
|
|
177
|
-
if (response && !isLoading && !error) {
|
|
178
|
-
handleIncrementalResponse(response);
|
|
179
|
-
setIsProcessing(false);
|
|
180
|
-
}
|
|
181
|
-
if (error) {
|
|
182
|
-
console.log('%c Erro ao realizar a consulta:', 'color: red; font-weight: bold;', error);
|
|
183
|
-
setIsProcessing(false);
|
|
184
91
|
}
|
|
185
|
-
}, [
|
|
92
|
+
}, [documento, globalData, isGlobalDataLoaded]);
|
|
186
93
|
useEffect(function () {
|
|
187
|
-
if (
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
94
|
+
if (serializedData &&
|
|
95
|
+
serializedData !== '{}' &&
|
|
96
|
+
streamMode === 'summary' &&
|
|
97
|
+
!summaryQueryData) {
|
|
98
|
+
setSummaryQueryData(createQueryAndMessages(serializedData, []));
|
|
99
|
+
}
|
|
100
|
+
}, [serializedData, streamMode, summaryQueryData]);
|
|
101
|
+
var _m = useStreamQuery("SELECT FROM 'LlamaApi'.'Consulta'", summaryQueryData, streamMode === 'summary' && !!summaryQueryData), summaryIterator = _m.responseIterator, summaryError = _m.error, summaryLoading = _m.isLoading, refetchSummary = _m.refetch, abortSummary = _m.abort;
|
|
102
|
+
var _o = useStreamQuery("SELECT FROM 'LlamaApi'.'Consulta'", chatQueryData, streamMode === 'chat' && !!chatQueryData), chatIterator = _o.responseIterator, chatError = _o.error, chatLoading = _o.isLoading, refetchChat = _o.refetch, abortChat = _o.abort;
|
|
191
103
|
useEffect(function () {
|
|
192
|
-
if (
|
|
193
|
-
|
|
194
|
-
|
|
104
|
+
if (summaryIterator) {
|
|
105
|
+
(function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
106
|
+
return __generator(this, function (_a) {
|
|
107
|
+
switch (_a.label) {
|
|
108
|
+
case 0: return [4 /*yield*/, processStream({
|
|
109
|
+
iterator: summaryIterator,
|
|
110
|
+
mode: 'summary',
|
|
111
|
+
setMessageHistory: setMessageHistory
|
|
112
|
+
})];
|
|
113
|
+
case 1:
|
|
114
|
+
_a.sent();
|
|
115
|
+
setStreamMode('chat');
|
|
116
|
+
return [2 /*return*/];
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
}); })();
|
|
195
120
|
}
|
|
196
|
-
}, [
|
|
121
|
+
}, [summaryIterator]);
|
|
197
122
|
useEffect(function () {
|
|
198
|
-
if (
|
|
199
|
-
|
|
123
|
+
if (chatIterator) {
|
|
124
|
+
processStream({
|
|
125
|
+
iterator: chatIterator,
|
|
126
|
+
mode: 'chat',
|
|
127
|
+
setMessageHistory: setMessageHistory
|
|
128
|
+
});
|
|
200
129
|
}
|
|
201
|
-
}, [
|
|
130
|
+
}, [chatIterator]);
|
|
202
131
|
var handleSendMessage = function () {
|
|
203
132
|
if (userInput.trim()) {
|
|
204
133
|
var newMessage_1 = { role: 'user', content: userInput };
|
|
205
|
-
setMessageHistory(function (
|
|
134
|
+
setMessageHistory(function (prev) { return __spreadArray(__spreadArray([], prev, true), [newMessage_1], false); });
|
|
206
135
|
setUserInput('');
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
setIsProcessing(true);
|
|
212
|
-
incrementalResponseRef.current = '';
|
|
136
|
+
setChatQueryData(createQueryAndMessages(serializedData, __spreadArray(__spreadArray([], messageHistory.slice(1), true), [
|
|
137
|
+
newMessage_1
|
|
138
|
+
], false)));
|
|
139
|
+
refetchChat();
|
|
213
140
|
}
|
|
214
141
|
};
|
|
215
142
|
var handleStopStream = function () {
|
|
216
|
-
|
|
217
|
-
abortControllerRef.current.abort();
|
|
218
|
-
stopTyping();
|
|
219
|
-
setIsProcessing(false);
|
|
220
|
-
setQueryEnabled(false);
|
|
221
|
-
incrementalResponseRef.current = '';
|
|
222
|
-
}
|
|
143
|
+
abortChat();
|
|
223
144
|
};
|
|
224
145
|
var handleKeyPress = function (e) {
|
|
225
146
|
if (e.key === 'Enter') {
|
|
@@ -235,47 +156,34 @@ var GenerativeAI = function (_a) {
|
|
|
235
156
|
React.createElement(BtnWrapper, { onClick: toggleOpen }, isOpen ? React.createElement(ChevronUp, null) : React.createElement(ChevronDown, null)))),
|
|
236
157
|
isOpen && (React.createElement(React.Fragment, null,
|
|
237
158
|
React.createElement(Container, null,
|
|
238
|
-
|
|
159
|
+
(summaryError || chatError) && (React.createElement("div", null,
|
|
239
160
|
React.createElement(StatusMessage, { type: "error" },
|
|
240
|
-
"Erro ao realizar a an\u00E1lise:
|
|
241
|
-
|
|
161
|
+
"Erro ao realizar a an\u00E1lise:",
|
|
162
|
+
' ', (_b = (summaryError || chatError)) === null || _b === void 0 ? void 0 :
|
|
163
|
+
_b.message))),
|
|
242
164
|
React.createElement(InitialMessageBox, null,
|
|
243
165
|
React.createElement(InitialMessageContent, null,
|
|
244
166
|
React.createElement("div", { className: "icon-and-text" },
|
|
245
167
|
React.createElement(Credithub, { size: 18, className: "initial-icon" }),
|
|
246
|
-
React.createElement("span", null,
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
!((_b = messageHistory[0]) === null || _b === void 0 ? void 0 : _b.content)) ? (React.createElement(LoadingDots, null)) : shouldStartTyping &&
|
|
250
|
-
isTyping &&
|
|
251
|
-
currentMessageIndex === 0 ? (typingMessage) : (React.createElement(ReactMarkdown, null, ((_c = messageHistory[0]) === null || _c === void 0 ? void 0 : _c.content) || '')))),
|
|
168
|
+
React.createElement("span", null, streamMode === 'summary' &&
|
|
169
|
+
summaryLoading &&
|
|
170
|
+
!((_c = messageHistory[0]) === null || _c === void 0 ? void 0 : _c.content) ? (React.createElement(LoadingDots, null)) : (React.createElement(ReactMarkdown, { remarkPlugins: [remarkGfm] }, ((_d = messageHistory[0]) === null || _d === void 0 ? void 0 : _d.content) || '')))),
|
|
252
171
|
React.createElement("div", { className: "additional-message" },
|
|
253
172
|
React.createElement("p", null, "Voc\u00EA pode fazer perguntas como:"),
|
|
254
|
-
React.createElement("p", { className: "blue-text" }, "\u00C9 seguro oferecer um cr\u00E9dito de R$ 15.000,00 a uma taxa de
|
|
173
|
+
React.createElement("p", { className: "blue-text" }, "\u00C9 seguro oferecer um cr\u00E9dito de R$ 15.000,00 a uma taxa de 3% em 12x?")),
|
|
255
174
|
React.createElement("div", { className: "final-message" },
|
|
256
175
|
React.createElement(Person, { size: 18 }),
|
|
257
176
|
React.createElement("p", null, "Digite no campo abaixo o que deseja saber sobre esse dossi\u00EA?")))),
|
|
258
|
-
React.createElement(MessageHistory, { ref: messageHistoryRef },
|
|
259
|
-
|
|
260
|
-
.
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
msg.
|
|
264
|
-
React.createElement("span", null,
|
|
265
|
-
React.createElement(ReactMarkdown, null, msg.content))))); }),
|
|
266
|
-
isLoading && ((_d = messageHistory[0]) === null || _d === void 0 ? void 0 : _d.content) !== undefined ? (React.createElement(Message, { role: "assistant" },
|
|
267
|
-
React.createElement("div", { className: "icon-and-message" },
|
|
268
|
-
React.createElement(Credithub, { size: 18, className: "initial-icon" }),
|
|
269
|
-
React.createElement("span", null,
|
|
270
|
-
React.createElement(LoadingDots, null))))) : shouldStartTyping && isTyping && currentMessageIndex > 0 ? (React.createElement(Message, { role: "assistant" },
|
|
271
|
-
React.createElement("div", { className: "icon-and-message" },
|
|
272
|
-
React.createElement(Credithub, { size: 18, className: "initial-icon" }),
|
|
273
|
-
React.createElement("span", null,
|
|
274
|
-
React.createElement(ReactMarkdown, null, typingMessage))))) : null)),
|
|
177
|
+
React.createElement(MessageHistory, { ref: messageHistoryRef }, messageHistory.slice(1).map(function (msg, index) { return (React.createElement(Message, { key: index, role: msg.role },
|
|
178
|
+
React.createElement("div", { className: "icon-and-message" },
|
|
179
|
+
msg.role === 'user' ? (React.createElement(Person, { size: 18 })) : (React.createElement(Credithub, { size: 18, className: "initial-icon" })),
|
|
180
|
+
React.createElement("span", null, msg.role === 'assistant' &&
|
|
181
|
+
chatLoading &&
|
|
182
|
+
!msg.content ? (React.createElement(LoadingDots, null)) : (React.createElement(ReactMarkdown, { remarkPlugins: [remarkGfm] }, msg.content)))))); }))),
|
|
275
183
|
React.createElement(ContainerInput, null,
|
|
276
184
|
React.createElement(ChatInputContainer, null,
|
|
277
|
-
React.createElement(ChatInput, { type: "text", placeholder: "Digite o que deseja saber sobre esse dossi\u00EA", value: userInput, onChange: function (e) { return setUserInput(e.target.value); }, onKeyPress: handleKeyPress, disabled:
|
|
278
|
-
|
|
185
|
+
React.createElement(ChatInput, { type: "text", placeholder: "Digite o que deseja saber sobre esse dossi\u00EA", value: userInput, onChange: function (e) { return setUserInput(e.target.value); }, onKeyPress: handleKeyPress, disabled: chatLoading }),
|
|
186
|
+
chatLoading ? (React.createElement(SendButton, { onClick: handleStopStream },
|
|
279
187
|
React.createElement(StopButton, null))) : (React.createElement(SendButton, { onClick: handleSendMessage },
|
|
280
188
|
React.createElement(BtnSend, null)))))))));
|
|
281
189
|
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { GenerativeAIApiResponse } from './responseUtils';
|
|
2
|
+
export type StreamMode = 'summary' | 'chat';
|
|
3
|
+
interface ProcessStreamParams {
|
|
4
|
+
iterator: AsyncGenerator<GenerativeAIApiResponse>;
|
|
5
|
+
mode: StreamMode;
|
|
6
|
+
setMessageHistory: React.Dispatch<React.SetStateAction<any[]>>;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Processa o stream recebido do iterator e atualiza o estado de messageHistory
|
|
10
|
+
* de acordo com o mode (summary ou chat) em tempo real.
|
|
11
|
+
*/
|
|
12
|
+
export declare const processStream: ({ iterator, mode, setMessageHistory }: ProcessStreamParams) => Promise<void>;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
11
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
12
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
13
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
14
|
+
function step(op) {
|
|
15
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
16
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
17
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
18
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
19
|
+
switch (op[0]) {
|
|
20
|
+
case 0: case 1: t = op; break;
|
|
21
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
22
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
23
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
24
|
+
default:
|
|
25
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
26
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
27
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
28
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
29
|
+
if (t[2]) _.ops.pop();
|
|
30
|
+
_.trys.pop(); continue;
|
|
31
|
+
}
|
|
32
|
+
op = body.call(thisArg, _);
|
|
33
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
34
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
var __asyncValues = (this && this.__asyncValues) || function (o) {
|
|
38
|
+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
|
|
39
|
+
var m = o[Symbol.asyncIterator], i;
|
|
40
|
+
return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
|
|
41
|
+
function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
|
|
42
|
+
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
|
|
43
|
+
};
|
|
44
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
45
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
46
|
+
if (ar || !(i in from)) {
|
|
47
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
48
|
+
ar[i] = from[i];
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
52
|
+
};
|
|
53
|
+
import { flushSync } from 'react-dom';
|
|
54
|
+
/**
|
|
55
|
+
* Processa o stream recebido do iterator e atualiza o estado de messageHistory
|
|
56
|
+
* de acordo com o mode (summary ou chat) em tempo real.
|
|
57
|
+
*/
|
|
58
|
+
export var processStream = function (_a) { return __awaiter(void 0, [_a], void 0, function (_b) {
|
|
59
|
+
var inThinkBlock, accumulatedText, _loop_1, e_1_1;
|
|
60
|
+
var _c, iterator_1, iterator_1_1;
|
|
61
|
+
var _d, e_1, _e, _f;
|
|
62
|
+
var iterator = _b.iterator, mode = _b.mode, setMessageHistory = _b.setMessageHistory;
|
|
63
|
+
return __generator(this, function (_g) {
|
|
64
|
+
switch (_g.label) {
|
|
65
|
+
case 0:
|
|
66
|
+
inThinkBlock = false;
|
|
67
|
+
accumulatedText = '';
|
|
68
|
+
_g.label = 1;
|
|
69
|
+
case 1:
|
|
70
|
+
_g.trys.push([1, 7, 8, 13]);
|
|
71
|
+
_loop_1 = function () {
|
|
72
|
+
var fragment, part, startIndex, endIndex, endIndex, cleaned;
|
|
73
|
+
return __generator(this, function (_h) {
|
|
74
|
+
switch (_h.label) {
|
|
75
|
+
case 0:
|
|
76
|
+
_f = iterator_1_1.value;
|
|
77
|
+
_c = false;
|
|
78
|
+
fragment = _f;
|
|
79
|
+
part = fragment.message.content;
|
|
80
|
+
if (!inThinkBlock) {
|
|
81
|
+
if (part.includes('<think>')) {
|
|
82
|
+
startIndex = part.indexOf('<think>');
|
|
83
|
+
accumulatedText += part.substring(0, startIndex);
|
|
84
|
+
inThinkBlock = true;
|
|
85
|
+
if (part.includes('</think>')) {
|
|
86
|
+
endIndex = part.indexOf('</think>');
|
|
87
|
+
accumulatedText += part.substring(endIndex + '</think>'.length);
|
|
88
|
+
inThinkBlock = false;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
accumulatedText += part;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
if (part.includes('</think>')) {
|
|
97
|
+
endIndex = part.indexOf('</think>');
|
|
98
|
+
accumulatedText += part.substring(endIndex + '</think>'.length);
|
|
99
|
+
inThinkBlock = false;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
cleaned = accumulatedText.replace(/[ \t]+/g, ' ').trim();
|
|
103
|
+
flushSync(function () {
|
|
104
|
+
setMessageHistory(function (prevMessages) {
|
|
105
|
+
if (mode === 'summary') {
|
|
106
|
+
if (prevMessages.length > 0 && prevMessages[0].role === 'assistant') {
|
|
107
|
+
var newMessages = __spreadArray([], prevMessages, true);
|
|
108
|
+
newMessages[0] = { role: 'assistant', content: cleaned };
|
|
109
|
+
return newMessages;
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
return [{ role: 'assistant', content: cleaned }];
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
else if (mode === 'chat') {
|
|
116
|
+
if (prevMessages.length > 0 &&
|
|
117
|
+
prevMessages[prevMessages.length - 1].role === 'assistant') {
|
|
118
|
+
var newMessages = __spreadArray([], prevMessages, true);
|
|
119
|
+
newMessages[newMessages.length - 1] = {
|
|
120
|
+
role: 'assistant',
|
|
121
|
+
content: cleaned
|
|
122
|
+
};
|
|
123
|
+
return newMessages;
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
return __spreadArray(__spreadArray([], prevMessages, true), [{ role: 'assistant', content: cleaned }], false);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return prevMessages;
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, 0); })];
|
|
133
|
+
case 1:
|
|
134
|
+
_h.sent();
|
|
135
|
+
return [2 /*return*/];
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
};
|
|
139
|
+
_c = true, iterator_1 = __asyncValues(iterator);
|
|
140
|
+
_g.label = 2;
|
|
141
|
+
case 2: return [4 /*yield*/, iterator_1.next()];
|
|
142
|
+
case 3:
|
|
143
|
+
if (!(iterator_1_1 = _g.sent(), _d = iterator_1_1.done, !_d)) return [3 /*break*/, 6];
|
|
144
|
+
return [5 /*yield**/, _loop_1()];
|
|
145
|
+
case 4:
|
|
146
|
+
_g.sent();
|
|
147
|
+
_g.label = 5;
|
|
148
|
+
case 5:
|
|
149
|
+
_c = true;
|
|
150
|
+
return [3 /*break*/, 2];
|
|
151
|
+
case 6: return [3 /*break*/, 13];
|
|
152
|
+
case 7:
|
|
153
|
+
e_1_1 = _g.sent();
|
|
154
|
+
e_1 = { error: e_1_1 };
|
|
155
|
+
return [3 /*break*/, 13];
|
|
156
|
+
case 8:
|
|
157
|
+
_g.trys.push([8, , 11, 12]);
|
|
158
|
+
if (!(!_c && !_d && (_e = iterator_1.return))) return [3 /*break*/, 10];
|
|
159
|
+
return [4 /*yield*/, _e.call(iterator_1)];
|
|
160
|
+
case 9:
|
|
161
|
+
_g.sent();
|
|
162
|
+
_g.label = 10;
|
|
163
|
+
case 10: return [3 /*break*/, 12];
|
|
164
|
+
case 11:
|
|
165
|
+
if (e_1) throw e_1.error;
|
|
166
|
+
return [7 /*endfinally*/];
|
|
167
|
+
case 12: return [7 /*endfinally*/];
|
|
168
|
+
case 13: return [2 /*return*/];
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
}); };
|
|
@@ -18,13 +18,12 @@ export var createQueryAndMessages = function (relevantData, messageHistory, user
|
|
|
18
18
|
? "\n Analisar o dossi\u00EA da seguinte pessoa f\u00EDsica:\n - Foco em identificar restri\u00E7\u00F5es financeiras, protestos e riscos pessoais que possam impactar o cr\u00E9dito.\n "
|
|
19
19
|
: "\n Analisar o dossi\u00EA da seguinte empresa:\n - Foco em identificar protestos, processos judiciais e problemas financeiros que possam impactar a empresa.\n ";
|
|
20
20
|
var baseContent = "\n ".concat(analysisHeader, "\n\n ").concat(tipoPessoaMessage, "\n\n ```yaml\n ").concat(stringify(parsedData), "\n ```\n\n **Responda sempre em portugu\u00EAs claro, eliminando dados irrelevantes ou n\u00E3o intelig\u00EDveis.**\n ").trim();
|
|
21
|
-
var messages = __spreadArray([
|
|
22
|
-
|
|
23
|
-
messages.push({
|
|
21
|
+
var messages = __spreadArray([
|
|
22
|
+
{
|
|
24
23
|
role: 'user',
|
|
25
24
|
content: baseContent
|
|
26
|
-
}
|
|
27
|
-
|
|
25
|
+
}
|
|
26
|
+
], messageHistory, true);
|
|
28
27
|
if (userInput) {
|
|
29
28
|
messages.push({
|
|
30
29
|
role: 'user',
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { Client } from '@credithub/webservice';
|
|
2
2
|
export declare function useStreamQuery<R = unknown, T extends Client.Form = Client.Form>(query: string, data?: T, enabled?: boolean): {
|
|
3
|
-
|
|
3
|
+
responseIterator: AsyncGenerator<R, any, any> | null;
|
|
4
4
|
error: Error | null;
|
|
5
5
|
isLoading: boolean;
|
|
6
|
-
refetch: () => void
|
|
6
|
+
refetch: () => Promise<void>;
|
|
7
|
+
abort: () => void;
|
|
7
8
|
};
|