@red-hat-developer-hub/backstage-plugin-lightspeed 0.6.0 → 1.0.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/CHANGELOG.md +12 -0
- package/README.md +40 -58
- package/app-config.yaml +4 -0
- package/config.d.ts +1 -24
- package/dist/alpha.d.ts +111 -0
- package/dist/alpha.esm.js +3 -0
- package/dist/alpha.esm.js.map +1 -0
- package/dist/api/LightspeedApiClient.esm.js +26 -11
- package/dist/api/LightspeedApiClient.esm.js.map +1 -1
- package/dist/api/api.esm.js.map +1 -1
- package/dist/components/LightSpeedChat.esm.js +17 -1
- package/dist/components/LightSpeedChat.esm.js.map +1 -1
- package/dist/components/LightspeedChatBox.esm.js +3 -5
- package/dist/components/LightspeedChatBox.esm.js.map +1 -1
- package/dist/components/LightspeedChatBoxHeader.esm.js +14 -3
- package/dist/components/LightspeedChatBoxHeader.esm.js.map +1 -1
- package/dist/components/LightspeedPage.esm.js +17 -2
- package/dist/components/LightspeedPage.esm.js.map +1 -1
- package/dist/const.esm.js +4 -1
- package/dist/const.esm.js.map +1 -1
- package/dist/hooks/useConversationMessages.esm.js +23 -21
- package/dist/hooks/useConversationMessages.esm.js.map +1 -1
- package/dist/hooks/useCreateCoversationMessage.esm.js +2 -0
- package/dist/hooks/useCreateCoversationMessage.esm.js.map +1 -1
- package/dist/hooks/useQuestionValidation.esm.js +16 -0
- package/dist/hooks/useQuestionValidation.esm.js.map +1 -0
- package/dist/hooks/useTranslation.esm.js +1 -1
- package/dist/hooks/useTranslation.esm.js.map +1 -1
- package/dist/hooks/useWelcomePrompts.esm.js +3 -2
- package/dist/hooks/useWelcomePrompts.esm.js.map +1 -1
- package/dist/index.d.ts +1 -8
- package/dist/index.esm.js +0 -1
- package/dist/index.esm.js.map +1 -1
- package/dist/translations/de.esm.js +1 -1
- package/dist/translations/de.esm.js.map +1 -1
- package/dist/translations/es.esm.js +1 -1
- package/dist/translations/es.esm.js.map +1 -1
- package/dist/translations/fr.esm.js +1 -1
- package/dist/translations/fr.esm.js.map +1 -1
- package/dist/translations/index.esm.js +3 -3
- package/dist/translations/index.esm.js.map +1 -1
- package/dist/translations/{translationRef.esm.js → ref.esm.js} +1 -1
- package/dist/translations/ref.esm.js.map +1 -0
- package/dist/types.esm.js.map +1 -1
- package/dist/utils/lightspeed-chatbox-utils.esm.js +18 -8
- package/dist/utils/lightspeed-chatbox-utils.esm.js.map +1 -1
- package/package.json +32 -16
- package/dist/translations/translationRef.esm.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
## @red-hat-developer-hub/backstage-plugin-lightspeed
|
|
2
2
|
|
|
3
|
+
## 1.0.0
|
|
4
|
+
|
|
5
|
+
### Major Changes
|
|
6
|
+
|
|
7
|
+
- 2204143: Align lightspeed UI with LCS
|
|
8
|
+
|
|
9
|
+
## 0.6.1
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- 51c5897: Export i18n resources from alpha module
|
|
14
|
+
|
|
3
15
|
## 0.6.0
|
|
4
16
|
|
|
5
17
|
### Minor Changes
|
package/README.md
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
# Lightspeed plugin for Backstage
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Red Hat Developer Lightspeed for Red Hat Developer Hub (Developer Lightspeed for RHDH) is a virtual assistant powered by generative AI that offers in-depth insights into Red Hat Developer Hub (RHDH), including its wide range of capabilities. You can interact with this assistant to explore and learn more about RHDH in greater detail.
|
|
4
|
+
|
|
5
|
+
Developer Lightspeed for RHDH provides a natural language interface within the RHDH console, helping you easily find information about the product, understand its features, and get answers to your questions as they come up.
|
|
4
6
|
|
|
5
7
|
## For administrators
|
|
6
8
|
|
|
@@ -93,59 +95,52 @@ global:
|
|
|
93
95
|
includes:
|
|
94
96
|
- dynamic-plugins.default.yaml
|
|
95
97
|
plugins:
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
98
|
+
- package: oci://ghcr.io/redhat-developer/rhdh-plugin-export-overlays/red-hat-developer-hub-backstage-plugin-lightspeed:next__0.6.1!red-hat-developer-hub-backstage-plugin-lightspeed
|
|
99
|
+
disabled: false
|
|
100
|
+
pluginConfig:
|
|
101
|
+
lightspeed:
|
|
102
|
+
# OPTIONAL: Custom users prompts displayed to users
|
|
103
|
+
# If not provided, the plugin uses built-in default prompts
|
|
104
|
+
prompts:
|
|
105
|
+
- title: 'Getting Started with Red Hat Developer Hub'
|
|
106
|
+
message: Can you guide me through the first steps to start using Developer Hub
|
|
107
|
+
as a developer, like exploring the Software Catalog and adding my
|
|
108
|
+
service?
|
|
109
|
+
dynamicPlugins:
|
|
110
|
+
frontend:
|
|
111
|
+
red-hat-developer-hub.backstage-plugin-lightspeed:
|
|
112
|
+
translationResources:
|
|
113
|
+
- importName: lightspeedTranslations
|
|
114
|
+
module: Alpha
|
|
115
|
+
ref: lightspeedTranslationRef
|
|
116
|
+
appIcons:
|
|
117
|
+
- name: LightspeedIcon
|
|
118
|
+
module: LightspeedPlugin
|
|
119
|
+
importName: LightspeedIcon
|
|
120
|
+
dynamicRoutes:
|
|
121
|
+
- path: /lightspeed
|
|
122
|
+
importName: LightspeedPage
|
|
123
|
+
module: LightspeedPlugin
|
|
124
|
+
menuItem:
|
|
125
|
+
icon: LightspeedIcon
|
|
126
|
+
text: Lightspeed
|
|
115
127
|
```
|
|
116
128
|
|
|
117
129
|
- add the lightspeed configuration in the `app-config.yaml`
|
|
118
130
|
|
|
119
131
|
```
|
|
120
|
-
lightspeed:
|
|
121
|
-
servers:
|
|
122
|
-
- id: <server_id>
|
|
123
|
-
url: <server_URL>
|
|
124
|
-
token: <api_key>
|
|
125
|
-
questionValidation: true # Optional - To disable question (prompt) validation set it to false.
|
|
126
132
|
prompts: # optional
|
|
127
133
|
- title: <prompt_title>
|
|
128
|
-
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
`questionValidation` is default to be enabled with topic restriction on RHDH related topics.
|
|
132
|
-
If you want to disable the validation, set the value to be `false`.
|
|
133
|
-
|
|
134
|
-
Example configuration to disable `questionValidation`:
|
|
135
|
-
|
|
136
|
-
```yaml
|
|
137
|
-
lightspeed:
|
|
138
|
-
questionValidation: false
|
|
139
|
-
servers: ... ...
|
|
134
|
+
message: <prompt_message>
|
|
140
135
|
```
|
|
141
136
|
|
|
142
137
|
---
|
|
143
138
|
|
|
144
|
-
#### To install this plugin locally in [
|
|
139
|
+
#### To install this plugin locally in [RHDH](https://github.com/redhat-developer/rhdh) application as a dynamic plugin.
|
|
145
140
|
|
|
146
141
|
Follow the below steps -
|
|
147
142
|
|
|
148
|
-
- Export dynamic plugin assets. This will build and create the static assets for the plugin and put it inside
|
|
143
|
+
- Export dynamic plugin assets. This will build and create the static assets for the plugin and put it inside dynamic-plugins-root folder.
|
|
149
144
|
|
|
150
145
|
`yarn install`
|
|
151
146
|
|
|
@@ -153,32 +148,19 @@ Follow the below steps -
|
|
|
153
148
|
|
|
154
149
|
`yarn build`
|
|
155
150
|
|
|
156
|
-
`
|
|
157
|
-
|
|
158
|
-
- Package and copy dist-scalprum folder assets to dynamic-plugins-root folder in [backstage-showcase](https://github.com/janus-idp/backstage-showcase) application.
|
|
159
|
-
|
|
160
|
-
To Package the plugin, run the below commands.
|
|
161
|
-
|
|
162
|
-
```
|
|
163
|
-
pkg=../plugins/lightspeed
|
|
164
|
-
archive=$(npm pack $pkg)
|
|
165
|
-
tar -xzf "$archive" && rm "$archive"
|
|
166
|
-
mv package $(echo $archive | sed -e 's:\.tgz$::')
|
|
167
|
-
```
|
|
151
|
+
`npx @janus-idp/cli@latest package package-dynamic-plugins --export-to <path-to>/rhdh/dynamic-plugins-root`
|
|
168
152
|
|
|
169
153
|
- Add the extension point inside the `app-config.yaml` or `app-config.local.yaml` file.
|
|
170
154
|
|
|
171
155
|
```
|
|
172
156
|
|
|
173
|
-
lightspeed:
|
|
174
|
-
servers:
|
|
175
|
-
- id: <server id>
|
|
176
|
-
url: <serverURL>
|
|
177
|
-
token: <api key> # dummy token
|
|
178
|
-
|
|
179
157
|
dynamicPlugins:
|
|
180
158
|
frontend:
|
|
181
159
|
red-hat-developer-hub.backstage-plugin-lightspeed:
|
|
160
|
+
translationResources:
|
|
161
|
+
- importName: lightspeedTranslations
|
|
162
|
+
module: Alpha
|
|
163
|
+
ref: lightspeedTranslationRef
|
|
182
164
|
appIcons:
|
|
183
165
|
- name: LightspeedIcon
|
|
184
166
|
module: LightspeedPlugin
|
package/app-config.yaml
CHANGED
package/config.d.ts
CHANGED
|
@@ -19,30 +19,7 @@ export interface Config {
|
|
|
19
19
|
* Configuration required for using lightspeed
|
|
20
20
|
* @visibility frontend
|
|
21
21
|
*/
|
|
22
|
-
lightspeed
|
|
23
|
-
/**
|
|
24
|
-
* @visibility frontend
|
|
25
|
-
*/
|
|
26
|
-
servers: Array</**
|
|
27
|
-
* @visibility frontend
|
|
28
|
-
*/
|
|
29
|
-
{
|
|
30
|
-
/**
|
|
31
|
-
* The id of the server.
|
|
32
|
-
* @visibility frontend
|
|
33
|
-
*/
|
|
34
|
-
id: string;
|
|
35
|
-
/**
|
|
36
|
-
* The url of the server.
|
|
37
|
-
* @visibility frontend
|
|
38
|
-
*/
|
|
39
|
-
url: string;
|
|
40
|
-
}>;
|
|
41
|
-
/**
|
|
42
|
-
* query restriction validation (Enabled by default).
|
|
43
|
-
* @visibility frontend
|
|
44
|
-
*/
|
|
45
|
-
questionValidation?: boolean;
|
|
22
|
+
lightspeed?: {
|
|
46
23
|
prompts?: Array</**
|
|
47
24
|
* @visibility frontend
|
|
48
25
|
*/
|
package/dist/alpha.d.ts
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import * as _backstage_core_plugin_api_alpha from '@backstage/core-plugin-api/alpha';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Translation Reference for Developer Lightspeed
|
|
5
|
+
* @alpha
|
|
6
|
+
**/
|
|
7
|
+
declare const lightspeedTranslationRef: _backstage_core_plugin_api_alpha.TranslationRef<"plugin.lightspeed", {
|
|
8
|
+
readonly "disclaimer.withoutValidation": string;
|
|
9
|
+
readonly "disclaimer.withValidation": string;
|
|
10
|
+
readonly "prompts.codeReadability.title": string;
|
|
11
|
+
readonly "prompts.codeReadability.message": string;
|
|
12
|
+
readonly "prompts.debugging.title": string;
|
|
13
|
+
readonly "prompts.debugging.message": string;
|
|
14
|
+
readonly "prompts.developmentConcept.title": string;
|
|
15
|
+
readonly "prompts.developmentConcept.message": string;
|
|
16
|
+
readonly "prompts.codeOptimization.title": string;
|
|
17
|
+
readonly "prompts.codeOptimization.message": string;
|
|
18
|
+
readonly "prompts.documentation.title": string;
|
|
19
|
+
readonly "prompts.documentation.message": string;
|
|
20
|
+
readonly "prompts.gitWorkflows.title": string;
|
|
21
|
+
readonly "prompts.gitWorkflows.message": string;
|
|
22
|
+
readonly "prompts.testingStrategies.title": string;
|
|
23
|
+
readonly "prompts.testingStrategies.message": string;
|
|
24
|
+
readonly "prompts.sortingAlgorithms.title": string;
|
|
25
|
+
readonly "prompts.sortingAlgorithms.message": string;
|
|
26
|
+
readonly "prompts.eventDriven.title": string;
|
|
27
|
+
readonly "prompts.eventDriven.message": string;
|
|
28
|
+
readonly "prompts.tekton.title": string;
|
|
29
|
+
readonly "prompts.tekton.message": string;
|
|
30
|
+
readonly "prompts.openshift.title": string;
|
|
31
|
+
readonly "prompts.openshift.message": string;
|
|
32
|
+
readonly "prompts.rhdh.title": string;
|
|
33
|
+
readonly "prompts.rhdh.message": string;
|
|
34
|
+
readonly "page.title": string;
|
|
35
|
+
readonly "page.subtitle": string;
|
|
36
|
+
readonly "conversation.history.confirm.title": string;
|
|
37
|
+
readonly "conversation.history.confirm.message": string;
|
|
38
|
+
readonly "conversation.history.confirm.delete": string;
|
|
39
|
+
readonly "permission.required.title": string;
|
|
40
|
+
readonly "permission.required.description": string;
|
|
41
|
+
readonly "footer.accuracy.label": string;
|
|
42
|
+
readonly "footer.accuracy.popover.title": string;
|
|
43
|
+
readonly "footer.accuracy.popover.description": string;
|
|
44
|
+
readonly "footer.accuracy.popover.image.alt": string;
|
|
45
|
+
readonly "footer.accuracy.popover.cta.label": string;
|
|
46
|
+
readonly "footer.accuracy.popover.link.label": string;
|
|
47
|
+
readonly "common.cancel": string;
|
|
48
|
+
readonly "menu.newConversation": string;
|
|
49
|
+
readonly "chatbox.header.title": string;
|
|
50
|
+
readonly "chatbox.search.placeholder": string;
|
|
51
|
+
readonly "chatbox.welcome.greeting": string;
|
|
52
|
+
readonly "chatbox.welcome.description": string;
|
|
53
|
+
readonly "chatbox.message.placeholder": string;
|
|
54
|
+
readonly "chatbox.fileUpload.failed": string;
|
|
55
|
+
readonly "chatbox.fileUpload.infoText": string;
|
|
56
|
+
readonly "aria.chatbotSelector": string;
|
|
57
|
+
readonly "aria.important": string;
|
|
58
|
+
readonly "modal.edit": string;
|
|
59
|
+
readonly "modal.save": string;
|
|
60
|
+
readonly "modal.close": string;
|
|
61
|
+
readonly "modal.cancel": string;
|
|
62
|
+
readonly "conversation.delete": string;
|
|
63
|
+
readonly "conversation.announcement.userMessage": string;
|
|
64
|
+
readonly "user.guest": string;
|
|
65
|
+
readonly "user.loading": string;
|
|
66
|
+
readonly "tooltip.attach": string;
|
|
67
|
+
readonly "tooltip.send": string;
|
|
68
|
+
readonly "tooltip.microphone.active": string;
|
|
69
|
+
readonly "tooltip.microphone.inactive": string;
|
|
70
|
+
readonly "button.newChat": string;
|
|
71
|
+
readonly "modal.title.preview": string;
|
|
72
|
+
readonly "modal.title.edit": string;
|
|
73
|
+
readonly "icon.lightspeed.alt": string;
|
|
74
|
+
readonly "icon.permissionRequired.alt": string;
|
|
75
|
+
readonly "message.options.label": string;
|
|
76
|
+
readonly "file.upload.error.alreadyExists": string;
|
|
77
|
+
readonly "file.upload.error.multipleFiles": string;
|
|
78
|
+
readonly "file.upload.error.unsupportedType": string;
|
|
79
|
+
readonly "file.upload.error.fileTooLarge": string;
|
|
80
|
+
readonly "file.upload.error.readFailed": string;
|
|
81
|
+
readonly "error.context.fileAttachment": string;
|
|
82
|
+
readonly "feedback.form.title": string;
|
|
83
|
+
readonly "feedback.form.textAreaPlaceholder": string;
|
|
84
|
+
readonly "feedback.form.submitWord": string;
|
|
85
|
+
readonly "feedback.tooltips.goodResponse": string;
|
|
86
|
+
readonly "feedback.tooltips.badResponse": string;
|
|
87
|
+
readonly "feedback.tooltips.copied": string;
|
|
88
|
+
readonly "feedback.tooltips.copy": string;
|
|
89
|
+
readonly "feedback.tooltips.listening": string;
|
|
90
|
+
readonly "feedback.tooltips.listen": string;
|
|
91
|
+
readonly "feedback.quickResponses.positive.helpful": string;
|
|
92
|
+
readonly "feedback.quickResponses.positive.easyToUnderstand": string;
|
|
93
|
+
readonly "feedback.quickResponses.positive.resolvedIssue": string;
|
|
94
|
+
readonly "feedback.quickResponses.negative.didntAnswer": string;
|
|
95
|
+
readonly "feedback.quickResponses.negative.hardToUnderstand": string;
|
|
96
|
+
readonly "feedback.quickResponses.negative.notHelpful": string;
|
|
97
|
+
readonly "feedback.completion.title": string;
|
|
98
|
+
readonly "feedback.completion.body": string;
|
|
99
|
+
readonly "conversation.category.today": string;
|
|
100
|
+
readonly "conversation.category.yesterday": string;
|
|
101
|
+
readonly "conversation.category.previous7Days": string;
|
|
102
|
+
readonly "conversation.category.previous30Days": string;
|
|
103
|
+
}>;
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Translation Resource for Developer lightspeed
|
|
107
|
+
* @alpha
|
|
108
|
+
**/
|
|
109
|
+
declare const lightspeedTranslations: _backstage_core_plugin_api_alpha.TranslationResource<"plugin.lightspeed">;
|
|
110
|
+
|
|
111
|
+
export { lightspeedTranslationRef, lightspeedTranslations };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alpha.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { TEMP_CONVERSATION_ID } from '../const.esm.js';
|
|
1
|
+
import { TEMP_CONVERSATION_ID, VALID_TOPIC_RESTRICTION_PROVIDER_IDS } from '../const.esm.js';
|
|
2
2
|
|
|
3
3
|
class LightspeedApiClient {
|
|
4
4
|
configApi;
|
|
@@ -10,10 +10,7 @@ class LightspeedApiClient {
|
|
|
10
10
|
async getBaseUrl() {
|
|
11
11
|
return `${this.configApi.getString("backend.baseUrl")}/api/lightspeed`;
|
|
12
12
|
}
|
|
13
|
-
|
|
14
|
-
return `${this.configApi.getConfigArray("lightspeed.servers")[0].getOptionalString("url")}`;
|
|
15
|
-
}
|
|
16
|
-
async createMessage(prompt, selectedModel, conversation_id, attachments) {
|
|
13
|
+
async createMessage(prompt, selectedModel, selectedProvider, conversation_id, attachments) {
|
|
17
14
|
const baseUrl = await this.getBaseUrl();
|
|
18
15
|
const response = await this.fetchApi.fetch(`${baseUrl}/v1/query`, {
|
|
19
16
|
method: "POST",
|
|
@@ -23,8 +20,7 @@ class LightspeedApiClient {
|
|
|
23
20
|
body: JSON.stringify({
|
|
24
21
|
conversation_id: conversation_id === TEMP_CONVERSATION_ID ? undefined : conversation_id,
|
|
25
22
|
model: selectedModel,
|
|
26
|
-
provider:
|
|
27
|
-
// Currently supports a single llm server
|
|
23
|
+
provider: selectedProvider,
|
|
28
24
|
query: prompt,
|
|
29
25
|
attachments
|
|
30
26
|
})
|
|
@@ -62,6 +58,25 @@ class LightspeedApiClient {
|
|
|
62
58
|
}
|
|
63
59
|
return response;
|
|
64
60
|
}
|
|
61
|
+
async isTopicRestrictionEnabled() {
|
|
62
|
+
const baseUrl = await this.getBaseUrl();
|
|
63
|
+
const result = await this.fetcher(`${baseUrl}/v1/shields`);
|
|
64
|
+
if (!result.ok) {
|
|
65
|
+
throw new Error(
|
|
66
|
+
`failed to get shields, status ${result.status}: ${result.statusText}`
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
const response = await result.json();
|
|
70
|
+
if (!response?.shields || !Array.isArray(response.shields)) {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
return response.shields.some((shield) => {
|
|
74
|
+
const providerId = shield.provider_resource_id;
|
|
75
|
+
return VALID_TOPIC_RESTRICTION_PROVIDER_IDS.some(
|
|
76
|
+
(validId) => providerId.toLowerCase() === validId.toLowerCase()
|
|
77
|
+
);
|
|
78
|
+
});
|
|
79
|
+
}
|
|
65
80
|
async getAllModels() {
|
|
66
81
|
const baseUrl = await this.getBaseUrl();
|
|
67
82
|
const result = await this.fetcher(`${baseUrl}/v1/models`);
|
|
@@ -71,7 +86,7 @@ class LightspeedApiClient {
|
|
|
71
86
|
);
|
|
72
87
|
}
|
|
73
88
|
const response = await result.json();
|
|
74
|
-
return response?.
|
|
89
|
+
return response?.models ? response?.models : [];
|
|
75
90
|
}
|
|
76
91
|
async getConversationMessages(conversation_id) {
|
|
77
92
|
if (conversation_id === TEMP_CONVERSATION_ID) {
|
|
@@ -79,7 +94,7 @@ class LightspeedApiClient {
|
|
|
79
94
|
}
|
|
80
95
|
const baseUrl = await this.getBaseUrl();
|
|
81
96
|
const result = await this.fetcher(
|
|
82
|
-
`${baseUrl}/conversations/${encodeURIComponent(conversation_id)}`
|
|
97
|
+
`${baseUrl}/v2/conversations/${encodeURIComponent(conversation_id)}`
|
|
83
98
|
);
|
|
84
99
|
if (!result.ok) {
|
|
85
100
|
throw new Error(
|
|
@@ -91,7 +106,7 @@ class LightspeedApiClient {
|
|
|
91
106
|
}
|
|
92
107
|
async getConversations() {
|
|
93
108
|
const baseUrl = await this.getBaseUrl();
|
|
94
|
-
const result = await this.fetcher(`${baseUrl}/conversations`);
|
|
109
|
+
const result = await this.fetcher(`${baseUrl}/v2/conversations`);
|
|
95
110
|
if (!result.ok) {
|
|
96
111
|
throw new Error(
|
|
97
112
|
`failed to get conversation, status ${result.status}: ${result.statusText}`
|
|
@@ -103,7 +118,7 @@ class LightspeedApiClient {
|
|
|
103
118
|
async deleteConversation(conversation_id) {
|
|
104
119
|
const baseUrl = await this.getBaseUrl();
|
|
105
120
|
const response = await this.fetchApi.fetch(
|
|
106
|
-
`${baseUrl}/conversations/${encodeURIComponent(conversation_id)}`,
|
|
121
|
+
`${baseUrl}/v2/conversations/${encodeURIComponent(conversation_id)}`,
|
|
107
122
|
{
|
|
108
123
|
method: "DELETE",
|
|
109
124
|
headers: {}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LightspeedApiClient.esm.js","sources":["../../src/api/LightspeedApiClient.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ConfigApi, FetchApi } from '@backstage/core-plugin-api';\n\nimport { TEMP_CONVERSATION_ID } from '../const';\nimport { Attachment, CaptureFeedback } from '../types';\nimport { LightspeedAPI } from './api';\n\nexport type Options = {\n configApi: ConfigApi;\n fetchApi: FetchApi;\n};\n\nexport class LightspeedApiClient implements LightspeedAPI {\n private readonly configApi: ConfigApi;\n private readonly fetchApi: FetchApi;\n\n constructor(options: Options) {\n this.configApi = options.configApi;\n this.fetchApi = options.fetchApi;\n }\n\n async getBaseUrl() {\n return `${this.configApi.getString('backend.baseUrl')}/api/lightspeed`;\n }\n\n getServerUrl() {\n // Currently supports a single llm server\n return `${this.configApi\n .getConfigArray('lightspeed.servers')[0]\n .getOptionalString('url')}`;\n }\n\n async createMessage(\n prompt: string,\n selectedModel: string,\n conversation_id: string,\n attachments: Attachment[],\n ) {\n const baseUrl = await this.getBaseUrl();\n\n const response = await this.fetchApi.fetch(`${baseUrl}/v1/query`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n conversation_id:\n conversation_id === TEMP_CONVERSATION_ID\n ? undefined\n : conversation_id,\n model: selectedModel,\n provider: this.configApi\n .getConfigArray('lightspeed.servers')[0]\n .getOptionalString('id'), // Currently supports a single llm server\n query: prompt,\n attachments,\n }),\n });\n\n if (!response.body) {\n throw new Error('Readable stream is not supported or there is no body.');\n }\n\n if (!response.ok) {\n const body = await response.body.getReader();\n const reader = body.read();\n const decoder = new TextDecoder('utf-8');\n const text = await reader.then(({ done, value }) => {\n if (done) {\n return '';\n }\n return decoder.decode(value);\n });\n const errorMessage = JSON.parse(text);\n if (errorMessage?.error) {\n throw new Error(`failed to create message: ${errorMessage.error}`);\n }\n }\n return response.body.getReader();\n }\n\n private async fetcher(url: string) {\n const response = await this.fetchApi.fetch(url, {\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n if (!response.ok) {\n throw new Error(\n `failed to fetch data, status ${response.status}: ${response.statusText}`,\n );\n }\n return response;\n }\n\n async getAllModels() {\n const baseUrl = await this.getBaseUrl();\n const result = await this.fetcher(`${baseUrl}/v1/models`);\n\n if (!result.ok) {\n throw new Error(\n `failed to get models, status ${result.status}: ${result.statusText}`,\n );\n }\n\n const response = await result.json();\n return response?.data ? response.data : [];\n }\n\n async getConversationMessages(conversation_id: string) {\n if (conversation_id === TEMP_CONVERSATION_ID) {\n return [];\n }\n const baseUrl = await this.getBaseUrl();\n const result = await this.fetcher(\n `${baseUrl}/conversations/${encodeURIComponent(conversation_id)}`,\n );\n if (!result.ok) {\n throw new Error(\n `failed to get conversation messages, status ${result.status}: ${result.statusText}`,\n );\n }\n const response = await result.json();\n return response.chat_history ?? [];\n }\n\n async getConversations() {\n const baseUrl = await this.getBaseUrl();\n const result = await this.fetcher(`${baseUrl}/conversations`);\n\n if (!result.ok) {\n throw new Error(\n `failed to get conversation, status ${result.status}: ${result.statusText}`,\n );\n }\n\n const response = await result.json();\n return response.conversations ?? [];\n }\n\n async deleteConversation(conversation_id: string) {\n const baseUrl = await this.getBaseUrl();\n\n const response = await this.fetchApi.fetch(\n `${baseUrl}/conversations/${encodeURIComponent(conversation_id)}`,\n {\n method: 'DELETE',\n headers: {},\n },\n );\n\n if (!response.ok) {\n throw new Error(\n `failed to delete conversation, status ${response.status}: ${response.statusText}`,\n );\n }\n return { success: true };\n }\n\n getFeedbackStatus = async () => {\n const baseUrl = await this.getBaseUrl();\n\n const response = await this.fetchApi.fetch(\n `${baseUrl}/v1/feedback/status`,\n {\n method: 'GET',\n headers: {},\n },\n );\n\n if (!response.ok) {\n throw new Error(\n `failed to GET feedback status, status ${response.status}: ${response.statusText}`,\n );\n }\n const result = await response.json();\n return result?.status?.enabled ?? false;\n };\n\n captureFeedback = async (payload: CaptureFeedback) => {\n const baseUrl = await this.getBaseUrl();\n\n const response = await this.fetchApi.fetch(`${baseUrl}/v1/feedback`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n accept: 'application/json',\n },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(\n `failed to capture feedback, status ${response.status}: ${response.statusText}`,\n );\n }\n return await response.json();\n };\n}\n"],"names":[],"mappings":";;AA2BO,MAAM,mBAA6C,CAAA;AAAA,EACvC,SAAA;AAAA,EACA,QAAA;AAAA,EAEjB,YAAY,OAAkB,EAAA;AAC5B,IAAA,IAAA,CAAK,YAAY,OAAQ,CAAA,SAAA;AACzB,IAAA,IAAA,CAAK,WAAW,OAAQ,CAAA,QAAA;AAAA;AAC1B,EAEA,MAAM,UAAa,GAAA;AACjB,IAAA,OAAO,CAAG,EAAA,IAAA,CAAK,SAAU,CAAA,SAAA,CAAU,iBAAiB,CAAC,CAAA,eAAA,CAAA;AAAA;AACvD,EAEA,YAAe,GAAA;AAEb,IAAO,OAAA,CAAA,EAAG,IAAK,CAAA,SAAA,CACZ,cAAe,CAAA,oBAAoB,EAAE,CAAC,CAAA,CACtC,iBAAkB,CAAA,KAAK,CAAC,CAAA,CAAA;AAAA;AAC7B,EAEA,MAAM,aAAA,CACJ,MACA,EAAA,aAAA,EACA,iBACA,WACA,EAAA;AACA,IAAM,MAAA,OAAA,GAAU,MAAM,IAAA,CAAK,UAAW,EAAA;AAEtC,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,SAAS,KAAM,CAAA,CAAA,EAAG,OAAO,CAAa,SAAA,CAAA,EAAA;AAAA,MAChE,MAAQ,EAAA,MAAA;AAAA,MACR,OAAS,EAAA;AAAA,QACP,cAAgB,EAAA;AAAA,OAClB;AAAA,MACA,IAAA,EAAM,KAAK,SAAU,CAAA;AAAA,QACnB,eAAA,EACE,eAAoB,KAAA,oBAAA,GAChB,SACA,GAAA,eAAA;AAAA,QACN,KAAO,EAAA,aAAA;AAAA,QACP,QAAA,EAAU,KAAK,SACZ,CAAA,cAAA,CAAe,oBAAoB,CAAE,CAAA,CAAC,CACtC,CAAA,iBAAA,CAAkB,IAAI,CAAA;AAAA;AAAA,QACzB,KAAO,EAAA,MAAA;AAAA,QACP;AAAA,OACD;AAAA,KACF,CAAA;AAED,IAAI,IAAA,CAAC,SAAS,IAAM,EAAA;AAClB,MAAM,MAAA,IAAI,MAAM,uDAAuD,CAAA;AAAA;AAGzE,IAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,MAAA,MAAM,IAAO,GAAA,MAAM,QAAS,CAAA,IAAA,CAAK,SAAU,EAAA;AAC3C,MAAM,MAAA,MAAA,GAAS,KAAK,IAAK,EAAA;AACzB,MAAM,MAAA,OAAA,GAAU,IAAI,WAAA,CAAY,OAAO,CAAA;AACvC,MAAM,MAAA,IAAA,GAAO,MAAM,MAAO,CAAA,IAAA,CAAK,CAAC,EAAE,IAAA,EAAM,OAAY,KAAA;AAClD,QAAA,IAAI,IAAM,EAAA;AACR,UAAO,OAAA,EAAA;AAAA;AAET,QAAO,OAAA,OAAA,CAAQ,OAAO,KAAK,CAAA;AAAA,OAC5B,CAAA;AACD,MAAM,MAAA,YAAA,GAAe,IAAK,CAAA,KAAA,CAAM,IAAI,CAAA;AACpC,MAAA,IAAI,cAAc,KAAO,EAAA;AACvB,QAAA,MAAM,IAAI,KAAA,CAAM,CAA6B,0BAAA,EAAA,YAAA,CAAa,KAAK,CAAE,CAAA,CAAA;AAAA;AACnE;AAEF,IAAO,OAAA,QAAA,CAAS,KAAK,SAAU,EAAA;AAAA;AACjC,EAEA,MAAc,QAAQ,GAAa,EAAA;AACjC,IAAA,MAAM,QAAW,GAAA,MAAM,IAAK,CAAA,QAAA,CAAS,MAAM,GAAK,EAAA;AAAA,MAC9C,OAAS,EAAA;AAAA,QACP,cAAgB,EAAA;AAAA;AAClB,KACD,CAAA;AACD,IAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAgC,6BAAA,EAAA,QAAA,CAAS,MAAM,CAAA,EAAA,EAAK,SAAS,UAAU,CAAA;AAAA,OACzE;AAAA;AAEF,IAAO,OAAA,QAAA;AAAA;AACT,EAEA,MAAM,YAAe,GAAA;AACnB,IAAM,MAAA,OAAA,GAAU,MAAM,IAAA,CAAK,UAAW,EAAA;AACtC,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,OAAQ,CAAA,CAAA,EAAG,OAAO,CAAY,UAAA,CAAA,CAAA;AAExD,IAAI,IAAA,CAAC,OAAO,EAAI,EAAA;AACd,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAgC,6BAAA,EAAA,MAAA,CAAO,MAAM,CAAA,EAAA,EAAK,OAAO,UAAU,CAAA;AAAA,OACrE;AAAA;AAGF,IAAM,MAAA,QAAA,GAAW,MAAM,MAAA,CAAO,IAAK,EAAA;AACnC,IAAA,OAAO,QAAU,EAAA,IAAA,GAAO,QAAS,CAAA,IAAA,GAAO,EAAC;AAAA;AAC3C,EAEA,MAAM,wBAAwB,eAAyB,EAAA;AACrD,IAAA,IAAI,oBAAoB,oBAAsB,EAAA;AAC5C,MAAA,OAAO,EAAC;AAAA;AAEV,IAAM,MAAA,OAAA,GAAU,MAAM,IAAA,CAAK,UAAW,EAAA;AACtC,IAAM,MAAA,MAAA,GAAS,MAAM,IAAK,CAAA,OAAA;AAAA,MACxB,CAAG,EAAA,OAAO,CAAkB,eAAA,EAAA,kBAAA,CAAmB,eAAe,CAAC,CAAA;AAAA,KACjE;AACA,IAAI,IAAA,CAAC,OAAO,EAAI,EAAA;AACd,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAA+C,4CAAA,EAAA,MAAA,CAAO,MAAM,CAAA,EAAA,EAAK,OAAO,UAAU,CAAA;AAAA,OACpF;AAAA;AAEF,IAAM,MAAA,QAAA,GAAW,MAAM,MAAA,CAAO,IAAK,EAAA;AACnC,IAAO,OAAA,QAAA,CAAS,gBAAgB,EAAC;AAAA;AACnC,EAEA,MAAM,gBAAmB,GAAA;AACvB,IAAM,MAAA,OAAA,GAAU,MAAM,IAAA,CAAK,UAAW,EAAA;AACtC,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,OAAQ,CAAA,CAAA,EAAG,OAAO,CAAgB,cAAA,CAAA,CAAA;AAE5D,IAAI,IAAA,CAAC,OAAO,EAAI,EAAA;AACd,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAsC,mCAAA,EAAA,MAAA,CAAO,MAAM,CAAA,EAAA,EAAK,OAAO,UAAU,CAAA;AAAA,OAC3E;AAAA;AAGF,IAAM,MAAA,QAAA,GAAW,MAAM,MAAA,CAAO,IAAK,EAAA;AACnC,IAAO,OAAA,QAAA,CAAS,iBAAiB,EAAC;AAAA;AACpC,EAEA,MAAM,mBAAmB,eAAyB,EAAA;AAChD,IAAM,MAAA,OAAA,GAAU,MAAM,IAAA,CAAK,UAAW,EAAA;AAEtC,IAAM,MAAA,QAAA,GAAW,MAAM,IAAA,CAAK,QAAS,CAAA,KAAA;AAAA,MACnC,CAAG,EAAA,OAAO,CAAkB,eAAA,EAAA,kBAAA,CAAmB,eAAe,CAAC,CAAA,CAAA;AAAA,MAC/D;AAAA,QACE,MAAQ,EAAA,QAAA;AAAA,QACR,SAAS;AAAC;AACZ,KACF;AAEA,IAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAyC,sCAAA,EAAA,QAAA,CAAS,MAAM,CAAA,EAAA,EAAK,SAAS,UAAU,CAAA;AAAA,OAClF;AAAA;AAEF,IAAO,OAAA,EAAE,SAAS,IAAK,EAAA;AAAA;AACzB,EAEA,oBAAoB,YAAY;AAC9B,IAAM,MAAA,OAAA,GAAU,MAAM,IAAA,CAAK,UAAW,EAAA;AAEtC,IAAM,MAAA,QAAA,GAAW,MAAM,IAAA,CAAK,QAAS,CAAA,KAAA;AAAA,MACnC,GAAG,OAAO,CAAA,mBAAA,CAAA;AAAA,MACV;AAAA,QACE,MAAQ,EAAA,KAAA;AAAA,QACR,SAAS;AAAC;AACZ,KACF;AAEA,IAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAyC,sCAAA,EAAA,QAAA,CAAS,MAAM,CAAA,EAAA,EAAK,SAAS,UAAU,CAAA;AAAA,OAClF;AAAA;AAEF,IAAM,MAAA,MAAA,GAAS,MAAM,QAAA,CAAS,IAAK,EAAA;AACnC,IAAO,OAAA,MAAA,EAAQ,QAAQ,OAAW,IAAA,KAAA;AAAA,GACpC;AAAA,EAEA,eAAA,GAAkB,OAAO,OAA6B,KAAA;AACpD,IAAM,MAAA,OAAA,GAAU,MAAM,IAAA,CAAK,UAAW,EAAA;AAEtC,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,SAAS,KAAM,CAAA,CAAA,EAAG,OAAO,CAAgB,YAAA,CAAA,EAAA;AAAA,MACnE,MAAQ,EAAA,MAAA;AAAA,MACR,OAAS,EAAA;AAAA,QACP,cAAgB,EAAA,kBAAA;AAAA,QAChB,MAAQ,EAAA;AAAA,OACV;AAAA,MACA,IAAA,EAAM,IAAK,CAAA,SAAA,CAAU,OAAO;AAAA,KAC7B,CAAA;AAED,IAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAsC,mCAAA,EAAA,QAAA,CAAS,MAAM,CAAA,EAAA,EAAK,SAAS,UAAU,CAAA;AAAA,OAC/E;AAAA;AAEF,IAAO,OAAA,MAAM,SAAS,IAAK,EAAA;AAAA,GAC7B;AACF;;;;"}
|
|
1
|
+
{"version":3,"file":"LightspeedApiClient.esm.js","sources":["../../src/api/LightspeedApiClient.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ConfigApi, FetchApi } from '@backstage/core-plugin-api';\n\nimport {\n TEMP_CONVERSATION_ID,\n VALID_TOPIC_RESTRICTION_PROVIDER_IDS,\n} from '../const';\nimport { Attachment, CaptureFeedback } from '../types';\nimport { LightspeedAPI } from './api';\n\nexport type Options = {\n configApi: ConfigApi;\n fetchApi: FetchApi;\n};\n\nexport class LightspeedApiClient implements LightspeedAPI {\n private readonly configApi: ConfigApi;\n private readonly fetchApi: FetchApi;\n\n constructor(options: Options) {\n this.configApi = options.configApi;\n this.fetchApi = options.fetchApi;\n }\n\n async getBaseUrl() {\n return `${this.configApi.getString('backend.baseUrl')}/api/lightspeed`;\n }\n\n async createMessage(\n prompt: string,\n selectedModel: string,\n selectedProvider: string,\n conversation_id: string,\n attachments: Attachment[],\n ) {\n const baseUrl = await this.getBaseUrl();\n\n const response = await this.fetchApi.fetch(`${baseUrl}/v1/query`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n conversation_id:\n conversation_id === TEMP_CONVERSATION_ID\n ? undefined\n : conversation_id,\n model: selectedModel,\n provider: selectedProvider,\n query: prompt,\n attachments,\n }),\n });\n\n if (!response.body) {\n throw new Error('Readable stream is not supported or there is no body.');\n }\n\n if (!response.ok) {\n const body = await response.body.getReader();\n const reader = body.read();\n const decoder = new TextDecoder('utf-8');\n const text = await reader.then(({ done, value }) => {\n if (done) {\n return '';\n }\n return decoder.decode(value);\n });\n const errorMessage = JSON.parse(text);\n if (errorMessage?.error) {\n throw new Error(`failed to create message: ${errorMessage.error}`);\n }\n }\n return response.body.getReader();\n }\n\n private async fetcher(url: string) {\n const response = await this.fetchApi.fetch(url, {\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n if (!response.ok) {\n throw new Error(\n `failed to fetch data, status ${response.status}: ${response.statusText}`,\n );\n }\n return response;\n }\n\n async isTopicRestrictionEnabled() {\n const baseUrl = await this.getBaseUrl();\n const result = await this.fetcher(`${baseUrl}/v1/shields`);\n\n if (!result.ok) {\n throw new Error(\n `failed to get shields, status ${result.status}: ${result.statusText}`,\n );\n }\n\n const response = await result.json();\n if (!response?.shields || !Array.isArray(response.shields)) {\n return false;\n }\n\n return response.shields.some((shield: any) => {\n const providerId = shield.provider_resource_id;\n\n return VALID_TOPIC_RESTRICTION_PROVIDER_IDS.some(\n validId => providerId.toLowerCase() === validId.toLowerCase(),\n );\n });\n }\n\n async getAllModels() {\n const baseUrl = await this.getBaseUrl();\n const result = await this.fetcher(`${baseUrl}/v1/models`);\n\n if (!result.ok) {\n throw new Error(\n `failed to get models, status ${result.status}: ${result.statusText}`,\n );\n }\n\n const response = await result.json();\n\n return response?.models ? response?.models : [];\n }\n\n async getConversationMessages(conversation_id: string) {\n if (conversation_id === TEMP_CONVERSATION_ID) {\n return [];\n }\n const baseUrl = await this.getBaseUrl();\n const result = await this.fetcher(\n `${baseUrl}/v2/conversations/${encodeURIComponent(conversation_id)}`,\n );\n if (!result.ok) {\n throw new Error(\n `failed to get conversation messages, status ${result.status}: ${result.statusText}`,\n );\n }\n const response = await result.json();\n return response.chat_history ?? [];\n }\n\n async getConversations() {\n const baseUrl = await this.getBaseUrl();\n const result = await this.fetcher(`${baseUrl}/v2/conversations`);\n\n if (!result.ok) {\n throw new Error(\n `failed to get conversation, status ${result.status}: ${result.statusText}`,\n );\n }\n\n const response = await result.json();\n return response.conversations ?? [];\n }\n\n async deleteConversation(conversation_id: string) {\n const baseUrl = await this.getBaseUrl();\n\n const response = await this.fetchApi.fetch(\n `${baseUrl}/v2/conversations/${encodeURIComponent(conversation_id)}`,\n {\n method: 'DELETE',\n headers: {},\n },\n );\n\n if (!response.ok) {\n throw new Error(\n `failed to delete conversation, status ${response.status}: ${response.statusText}`,\n );\n }\n return { success: true };\n }\n\n getFeedbackStatus = async () => {\n const baseUrl = await this.getBaseUrl();\n\n const response = await this.fetchApi.fetch(\n `${baseUrl}/v1/feedback/status`,\n {\n method: 'GET',\n headers: {},\n },\n );\n\n if (!response.ok) {\n throw new Error(\n `failed to GET feedback status, status ${response.status}: ${response.statusText}`,\n );\n }\n const result = await response.json();\n return result?.status?.enabled ?? false;\n };\n\n captureFeedback = async (payload: CaptureFeedback) => {\n const baseUrl = await this.getBaseUrl();\n\n const response = await this.fetchApi.fetch(`${baseUrl}/v1/feedback`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n accept: 'application/json',\n },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(\n `failed to capture feedback, status ${response.status}: ${response.statusText}`,\n );\n }\n return await response.json();\n };\n}\n"],"names":[],"mappings":";;AA8BO,MAAM,mBAA6C,CAAA;AAAA,EACvC,SAAA;AAAA,EACA,QAAA;AAAA,EAEjB,YAAY,OAAkB,EAAA;AAC5B,IAAA,IAAA,CAAK,YAAY,OAAQ,CAAA,SAAA;AACzB,IAAA,IAAA,CAAK,WAAW,OAAQ,CAAA,QAAA;AAAA;AAC1B,EAEA,MAAM,UAAa,GAAA;AACjB,IAAA,OAAO,CAAG,EAAA,IAAA,CAAK,SAAU,CAAA,SAAA,CAAU,iBAAiB,CAAC,CAAA,eAAA,CAAA;AAAA;AACvD,EAEA,MAAM,aACJ,CAAA,MAAA,EACA,aACA,EAAA,gBAAA,EACA,iBACA,WACA,EAAA;AACA,IAAM,MAAA,OAAA,GAAU,MAAM,IAAA,CAAK,UAAW,EAAA;AAEtC,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,SAAS,KAAM,CAAA,CAAA,EAAG,OAAO,CAAa,SAAA,CAAA,EAAA;AAAA,MAChE,MAAQ,EAAA,MAAA;AAAA,MACR,OAAS,EAAA;AAAA,QACP,cAAgB,EAAA;AAAA,OAClB;AAAA,MACA,IAAA,EAAM,KAAK,SAAU,CAAA;AAAA,QACnB,eAAA,EACE,eAAoB,KAAA,oBAAA,GAChB,SACA,GAAA,eAAA;AAAA,QACN,KAAO,EAAA,aAAA;AAAA,QACP,QAAU,EAAA,gBAAA;AAAA,QACV,KAAO,EAAA,MAAA;AAAA,QACP;AAAA,OACD;AAAA,KACF,CAAA;AAED,IAAI,IAAA,CAAC,SAAS,IAAM,EAAA;AAClB,MAAM,MAAA,IAAI,MAAM,uDAAuD,CAAA;AAAA;AAGzE,IAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,MAAA,MAAM,IAAO,GAAA,MAAM,QAAS,CAAA,IAAA,CAAK,SAAU,EAAA;AAC3C,MAAM,MAAA,MAAA,GAAS,KAAK,IAAK,EAAA;AACzB,MAAM,MAAA,OAAA,GAAU,IAAI,WAAA,CAAY,OAAO,CAAA;AACvC,MAAM,MAAA,IAAA,GAAO,MAAM,MAAO,CAAA,IAAA,CAAK,CAAC,EAAE,IAAA,EAAM,OAAY,KAAA;AAClD,QAAA,IAAI,IAAM,EAAA;AACR,UAAO,OAAA,EAAA;AAAA;AAET,QAAO,OAAA,OAAA,CAAQ,OAAO,KAAK,CAAA;AAAA,OAC5B,CAAA;AACD,MAAM,MAAA,YAAA,GAAe,IAAK,CAAA,KAAA,CAAM,IAAI,CAAA;AACpC,MAAA,IAAI,cAAc,KAAO,EAAA;AACvB,QAAA,MAAM,IAAI,KAAA,CAAM,CAA6B,0BAAA,EAAA,YAAA,CAAa,KAAK,CAAE,CAAA,CAAA;AAAA;AACnE;AAEF,IAAO,OAAA,QAAA,CAAS,KAAK,SAAU,EAAA;AAAA;AACjC,EAEA,MAAc,QAAQ,GAAa,EAAA;AACjC,IAAA,MAAM,QAAW,GAAA,MAAM,IAAK,CAAA,QAAA,CAAS,MAAM,GAAK,EAAA;AAAA,MAC9C,OAAS,EAAA;AAAA,QACP,cAAgB,EAAA;AAAA;AAClB,KACD,CAAA;AACD,IAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAgC,6BAAA,EAAA,QAAA,CAAS,MAAM,CAAA,EAAA,EAAK,SAAS,UAAU,CAAA;AAAA,OACzE;AAAA;AAEF,IAAO,OAAA,QAAA;AAAA;AACT,EAEA,MAAM,yBAA4B,GAAA;AAChC,IAAM,MAAA,OAAA,GAAU,MAAM,IAAA,CAAK,UAAW,EAAA;AACtC,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,OAAQ,CAAA,CAAA,EAAG,OAAO,CAAa,WAAA,CAAA,CAAA;AAEzD,IAAI,IAAA,CAAC,OAAO,EAAI,EAAA;AACd,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAiC,8BAAA,EAAA,MAAA,CAAO,MAAM,CAAA,EAAA,EAAK,OAAO,UAAU,CAAA;AAAA,OACtE;AAAA;AAGF,IAAM,MAAA,QAAA,GAAW,MAAM,MAAA,CAAO,IAAK,EAAA;AACnC,IAAI,IAAA,CAAC,UAAU,OAAW,IAAA,CAAC,MAAM,OAAQ,CAAA,QAAA,CAAS,OAAO,CAAG,EAAA;AAC1D,MAAO,OAAA,KAAA;AAAA;AAGT,IAAA,OAAO,QAAS,CAAA,OAAA,CAAQ,IAAK,CAAA,CAAC,MAAgB,KAAA;AAC5C,MAAA,MAAM,aAAa,MAAO,CAAA,oBAAA;AAE1B,MAAA,OAAO,oCAAqC,CAAA,IAAA;AAAA,QAC1C,CAAW,OAAA,KAAA,UAAA,CAAW,WAAY,EAAA,KAAM,QAAQ,WAAY;AAAA,OAC9D;AAAA,KACD,CAAA;AAAA;AACH,EAEA,MAAM,YAAe,GAAA;AACnB,IAAM,MAAA,OAAA,GAAU,MAAM,IAAA,CAAK,UAAW,EAAA;AACtC,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,OAAQ,CAAA,CAAA,EAAG,OAAO,CAAY,UAAA,CAAA,CAAA;AAExD,IAAI,IAAA,CAAC,OAAO,EAAI,EAAA;AACd,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAgC,6BAAA,EAAA,MAAA,CAAO,MAAM,CAAA,EAAA,EAAK,OAAO,UAAU,CAAA;AAAA,OACrE;AAAA;AAGF,IAAM,MAAA,QAAA,GAAW,MAAM,MAAA,CAAO,IAAK,EAAA;AAEnC,IAAA,OAAO,QAAU,EAAA,MAAA,GAAS,QAAU,EAAA,MAAA,GAAS,EAAC;AAAA;AAChD,EAEA,MAAM,wBAAwB,eAAyB,EAAA;AACrD,IAAA,IAAI,oBAAoB,oBAAsB,EAAA;AAC5C,MAAA,OAAO,EAAC;AAAA;AAEV,IAAM,MAAA,OAAA,GAAU,MAAM,IAAA,CAAK,UAAW,EAAA;AACtC,IAAM,MAAA,MAAA,GAAS,MAAM,IAAK,CAAA,OAAA;AAAA,MACxB,CAAG,EAAA,OAAO,CAAqB,kBAAA,EAAA,kBAAA,CAAmB,eAAe,CAAC,CAAA;AAAA,KACpE;AACA,IAAI,IAAA,CAAC,OAAO,EAAI,EAAA;AACd,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAA+C,4CAAA,EAAA,MAAA,CAAO,MAAM,CAAA,EAAA,EAAK,OAAO,UAAU,CAAA;AAAA,OACpF;AAAA;AAEF,IAAM,MAAA,QAAA,GAAW,MAAM,MAAA,CAAO,IAAK,EAAA;AACnC,IAAO,OAAA,QAAA,CAAS,gBAAgB,EAAC;AAAA;AACnC,EAEA,MAAM,gBAAmB,GAAA;AACvB,IAAM,MAAA,OAAA,GAAU,MAAM,IAAA,CAAK,UAAW,EAAA;AACtC,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,OAAQ,CAAA,CAAA,EAAG,OAAO,CAAmB,iBAAA,CAAA,CAAA;AAE/D,IAAI,IAAA,CAAC,OAAO,EAAI,EAAA;AACd,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAsC,mCAAA,EAAA,MAAA,CAAO,MAAM,CAAA,EAAA,EAAK,OAAO,UAAU,CAAA;AAAA,OAC3E;AAAA;AAGF,IAAM,MAAA,QAAA,GAAW,MAAM,MAAA,CAAO,IAAK,EAAA;AACnC,IAAO,OAAA,QAAA,CAAS,iBAAiB,EAAC;AAAA;AACpC,EAEA,MAAM,mBAAmB,eAAyB,EAAA;AAChD,IAAM,MAAA,OAAA,GAAU,MAAM,IAAA,CAAK,UAAW,EAAA;AAEtC,IAAM,MAAA,QAAA,GAAW,MAAM,IAAA,CAAK,QAAS,CAAA,KAAA;AAAA,MACnC,CAAG,EAAA,OAAO,CAAqB,kBAAA,EAAA,kBAAA,CAAmB,eAAe,CAAC,CAAA,CAAA;AAAA,MAClE;AAAA,QACE,MAAQ,EAAA,QAAA;AAAA,QACR,SAAS;AAAC;AACZ,KACF;AAEA,IAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAyC,sCAAA,EAAA,QAAA,CAAS,MAAM,CAAA,EAAA,EAAK,SAAS,UAAU,CAAA;AAAA,OAClF;AAAA;AAEF,IAAO,OAAA,EAAE,SAAS,IAAK,EAAA;AAAA;AACzB,EAEA,oBAAoB,YAAY;AAC9B,IAAM,MAAA,OAAA,GAAU,MAAM,IAAA,CAAK,UAAW,EAAA;AAEtC,IAAM,MAAA,QAAA,GAAW,MAAM,IAAA,CAAK,QAAS,CAAA,KAAA;AAAA,MACnC,GAAG,OAAO,CAAA,mBAAA,CAAA;AAAA,MACV;AAAA,QACE,MAAQ,EAAA,KAAA;AAAA,QACR,SAAS;AAAC;AACZ,KACF;AAEA,IAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAyC,sCAAA,EAAA,QAAA,CAAS,MAAM,CAAA,EAAA,EAAK,SAAS,UAAU,CAAA;AAAA,OAClF;AAAA;AAEF,IAAM,MAAA,MAAA,GAAS,MAAM,QAAA,CAAS,IAAK,EAAA;AACnC,IAAO,OAAA,MAAA,EAAQ,QAAQ,OAAW,IAAA,KAAA;AAAA,GACpC;AAAA,EAEA,eAAA,GAAkB,OAAO,OAA6B,KAAA;AACpD,IAAM,MAAA,OAAA,GAAU,MAAM,IAAA,CAAK,UAAW,EAAA;AAEtC,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,SAAS,KAAM,CAAA,CAAA,EAAG,OAAO,CAAgB,YAAA,CAAA,EAAA;AAAA,MACnE,MAAQ,EAAA,MAAA;AAAA,MACR,OAAS,EAAA;AAAA,QACP,cAAgB,EAAA,kBAAA;AAAA,QAChB,MAAQ,EAAA;AAAA,OACV;AAAA,MACA,IAAA,EAAM,IAAK,CAAA,SAAA,CAAU,OAAO;AAAA,KAC7B,CAAA;AAED,IAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAsC,mCAAA,EAAA,QAAA,CAAS,MAAM,CAAA,EAAA,EAAK,SAAS,UAAU,CAAA;AAAA,OAC/E;AAAA;AAEF,IAAO,OAAA,MAAM,SAAS,IAAK,EAAA;AAAA,GAC7B;AACF;;;;"}
|
package/dist/api/api.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.esm.js","sources":["../../src/api/api.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { createApiRef } from '@backstage/core-plugin-api';\n\nimport
|
|
1
|
+
{"version":3,"file":"api.esm.js","sources":["../../src/api/api.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { createApiRef } from '@backstage/core-plugin-api';\n\nimport {\n Attachment,\n BaseMessage,\n CaptureFeedback,\n ConversationList,\n LCSModel,\n} from '../types';\n\nexport type LightspeedAPI = {\n getAllModels: () => Promise<LCSModel[]>;\n getConversationMessages: (conversation_id: string) => Promise<BaseMessage[]>;\n createMessage: (\n prompt: string,\n selectedModel: string,\n selectedProvider: string,\n conversation_id: string,\n attachments: Attachment[],\n ) => Promise<ReadableStreamDefaultReader>;\n deleteConversation: (\n conversation_id: string,\n ) => Promise<{ success: boolean }>;\n getConversations: () => Promise<ConversationList>;\n getFeedbackStatus: () => Promise<boolean>;\n captureFeedback: (payload: CaptureFeedback) => Promise<{ response: string }>;\n isTopicRestrictionEnabled: () => Promise<boolean>;\n};\n\nexport const lightspeedApiRef = createApiRef<LightspeedAPI>({\n id: 'plugin.lightspeed.service',\n});\n"],"names":[],"mappings":";;AA6CO,MAAM,mBAAmB,YAA4B,CAAA;AAAA,EAC1D,EAAI,EAAA;AACN,CAAC;;;;"}
|
|
@@ -5,6 +5,7 @@ import { makeStyles, Box } from '@material-ui/core';
|
|
|
5
5
|
import { Chatbot, ChatbotDisplayMode, ChatbotHeader, ChatbotHeaderMain, ChatbotHeaderMenu, ChatbotHeaderTitle, FileDropZone, ChatbotAlert, ChatbotContent, ChatbotFooter, MessageBar, ChatbotFootnote } from '@patternfly/chatbot';
|
|
6
6
|
import ChatbotConversationHistoryNav from '@patternfly/chatbot/dist/dynamic/ChatbotConversationHistoryNav';
|
|
7
7
|
import { DropdownItem, Title } from '@patternfly/react-core';
|
|
8
|
+
import { SearchIcon } from '@patternfly/react-icons';
|
|
8
9
|
import { useQueryClient } from '@tanstack/react-query';
|
|
9
10
|
import { TEMP_CONVERSATION_ID, supportedFileTypes } from '../const.esm.js';
|
|
10
11
|
import '@backstage/core-plugin-api';
|
|
@@ -67,6 +68,8 @@ const useStyles = makeStyles((theme) => ({
|
|
|
67
68
|
}));
|
|
68
69
|
const LightspeedChat = ({
|
|
69
70
|
selectedModel,
|
|
71
|
+
topicRestrictionEnabled,
|
|
72
|
+
selectedProvider,
|
|
70
73
|
userName,
|
|
71
74
|
avatar,
|
|
72
75
|
profileLoading,
|
|
@@ -144,6 +147,7 @@ const LightspeedChat = ({
|
|
|
144
147
|
conversationId,
|
|
145
148
|
userName,
|
|
146
149
|
selectedModel,
|
|
150
|
+
selectedProvider,
|
|
147
151
|
avatar,
|
|
148
152
|
onComplete,
|
|
149
153
|
onStart
|
|
@@ -349,6 +353,17 @@ const LightspeedChat = ({
|
|
|
349
353
|
newChatButtonText: t("button.newChat"),
|
|
350
354
|
handleTextInputChange: handleFilter,
|
|
351
355
|
searchInputPlaceholder: t("chatbox.search.placeholder"),
|
|
356
|
+
searchInputProps: {
|
|
357
|
+
value: filterValue,
|
|
358
|
+
onClear: () => {
|
|
359
|
+
setFilterValue("");
|
|
360
|
+
}
|
|
361
|
+
},
|
|
362
|
+
noResultsState: filterValue && Object.keys(filterConversations(filterValue)).length === 0 ? {
|
|
363
|
+
bodyText: "Adjust your search query and try again. Check your spelling or try a more general term.",
|
|
364
|
+
titleText: "No results found",
|
|
365
|
+
icon: SearchIcon
|
|
366
|
+
} : undefined,
|
|
352
367
|
drawerContent: /* @__PURE__ */ jsxs(
|
|
353
368
|
FileDropZone,
|
|
354
369
|
{
|
|
@@ -379,7 +394,8 @@ const LightspeedChat = ({
|
|
|
379
394
|
ref: scrollToBottomRef,
|
|
380
395
|
welcomePrompts,
|
|
381
396
|
conversationId,
|
|
382
|
-
isStreaming: isSendButtonDisabled
|
|
397
|
+
isStreaming: isSendButtonDisabled,
|
|
398
|
+
topicRestrictionEnabled
|
|
383
399
|
}
|
|
384
400
|
) }),
|
|
385
401
|
/* @__PURE__ */ jsxs(ChatbotFooter, { className: classes.footer, children: [
|