@lastbrain/ai-ui-react 1.0.69 → 1.0.71
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/AiChipLabel.d.ts +1 -0
- package/dist/components/AiChipLabel.d.ts.map +1 -1
- package/dist/components/AiChipLabel.js +4 -1
- package/dist/components/AiContextButton.d.ts +6 -1
- package/dist/components/AiContextButton.d.ts.map +1 -1
- package/dist/components/AiContextButton.js +11 -4
- package/dist/components/AiImageButton.d.ts +1 -0
- package/dist/components/AiImageButton.d.ts.map +1 -1
- package/dist/components/AiImageButton.js +1 -0
- package/dist/components/AiInput.d.ts +1 -0
- package/dist/components/AiInput.d.ts.map +1 -1
- package/dist/components/AiInput.js +1 -0
- package/dist/components/AiModelSelect.d.ts +1 -0
- package/dist/components/AiModelSelect.d.ts.map +1 -1
- package/dist/components/AiModelSelect.js +1 -0
- package/dist/components/AiPromptPanel.d.ts +1 -0
- package/dist/components/AiPromptPanel.d.ts.map +1 -1
- package/dist/components/AiPromptPanel.js +13 -6
- package/dist/components/AiSelect.d.ts +1 -0
- package/dist/components/AiSelect.d.ts.map +1 -1
- package/dist/components/AiSelect.js +1 -0
- package/dist/components/AiSettingsButton.d.ts +1 -0
- package/dist/components/AiSettingsButton.d.ts.map +1 -1
- package/dist/components/AiSettingsButton.js +1 -0
- package/dist/components/AiStatusButton.d.ts +1 -0
- package/dist/components/AiStatusButton.d.ts.map +1 -1
- package/dist/components/AiStatusButton.js +21 -13
- package/dist/components/AiTextarea.d.ts +1 -0
- package/dist/components/AiTextarea.d.ts.map +1 -1
- package/dist/components/AiTextarea.js +1 -0
- package/dist/components/ErrorToast.d.ts +1 -0
- package/dist/components/ErrorToast.d.ts.map +1 -1
- package/dist/components/ErrorToast.js +1 -0
- package/dist/components/LBApiKeySelector.d.ts.map +1 -1
- package/dist/components/LBConnectButton.d.ts +1 -0
- package/dist/components/LBConnectButton.d.ts.map +1 -1
- package/dist/components/LBConnectButton.js +2 -1
- package/dist/components/LBKeyPicker.d.ts +1 -0
- package/dist/components/LBKeyPicker.d.ts.map +1 -1
- package/dist/components/LBKeyPicker.js +1 -0
- package/dist/components/LBSigninModal.d.ts +1 -0
- package/dist/components/LBSigninModal.d.ts.map +1 -1
- package/dist/components/LBSigninModal.js +2 -1
- package/dist/components/UsageToast.d.ts +1 -0
- package/dist/components/UsageToast.d.ts.map +1 -1
- package/dist/components/UsageToast.js +1 -0
- package/dist/context/LBAuthProvider.d.ts +35 -3
- package/dist/context/LBAuthProvider.d.ts.map +1 -1
- package/dist/context/LBAuthProvider.js +2 -0
- package/dist/examples/AiUiPremiumShowcase.d.ts.map +1 -1
- package/dist/hooks/useAiModels.d.ts.map +1 -1
- package/dist/hooks/useModelManagement.d.ts.map +1 -1
- package/dist/styles/register.d.ts +3 -0
- package/dist/styles/register.d.ts.map +1 -0
- package/dist/styles/register.js +1 -0
- package/dist/utils/errorHandler.d.ts +2 -2
- package/dist/utils/errorHandler.d.ts.map +1 -1
- package/dist/utils/errorHandler.js +8 -1
- package/dist/utils/modelManagement.d.ts +13 -10
- package/dist/utils/modelManagement.d.ts.map +1 -1
- package/dist/utils/modelManagement.js +19 -2
- package/package.json +5 -2
- package/src/components/AiChipLabel.tsx +6 -1
- package/src/components/AiContextButton.tsx +51 -23
- package/src/components/AiImageButton.tsx +1 -0
- package/src/components/AiInput.tsx +1 -0
- package/src/components/AiModelSelect.tsx +1 -0
- package/src/components/AiPromptPanel.tsx +20 -15
- package/src/components/AiSelect.tsx +1 -0
- package/src/components/AiSettingsButton.tsx +1 -0
- package/src/components/AiStatusButton.tsx +33 -19
- package/src/components/AiTextarea.tsx +4 -1
- package/src/components/ErrorToast.tsx +1 -0
- package/src/components/LBApiKeySelector.tsx +13 -3
- package/src/components/LBConnectButton.tsx +4 -12
- package/src/components/LBKeyPicker.tsx +1 -0
- package/src/components/LBSigninModal.tsx +21 -10
- package/src/components/UsageToast.tsx +1 -0
- package/src/context/LBAuthProvider.tsx +47 -7
- package/src/examples/AiUiPremiumShowcase.tsx +4 -1
- package/src/hooks/useAiModels.ts +2 -1
- package/src/hooks/useModelManagement.ts +2 -1
- package/src/styles/register.ts +3 -0
- package/src/utils/errorHandler.ts +16 -3
- package/src/utils/modelManagement.ts +53 -15
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LBAuthProvider.d.ts","sourceRoot":"","sources":["../../src/context/LBAuthProvider.tsx"],"names":[],"mappings":"AAEA;;;GAGG;AAEH,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EACV,WAAW,EACX,QAAQ,
|
|
1
|
+
{"version":3,"file":"LBAuthProvider.d.ts","sourceRoot":"","sources":["../../src/context/LBAuthProvider.tsx"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,8 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
7
7
|
import { createContext, useContext, useEffect, useCallback, useMemo, useState, } from "react";
|
|
8
8
|
import { createLBClient } from "@lastbrain/ai-ui-core";
|
|
9
9
|
const LBContext = createContext(undefined);
|
|
10
|
+
// Export pour usage dans d'autres composants
|
|
11
|
+
export { LBContext };
|
|
10
12
|
export function LBProvider({ children, baseUrl: _baseUrl = "/api/lastbrain", proxyUrl = "/api/lastbrain", onStatusChange, onAuthChange, }) {
|
|
11
13
|
const [state, setState] = useState({
|
|
12
14
|
status: "loading",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AiUiPremiumShowcase.d.ts","sourceRoot":"","sources":["../../src/examples/AiUiPremiumShowcase.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AiUiPremiumShowcase.d.ts","sourceRoot":"","sources":["../../src/examples/AiUiPremiumShowcase.tsx"],"names":[],"mappings":"AAsFA,wBAAgB,mBAAmB,4CAOlC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAiModels.d.ts","sourceRoot":"","sources":["../../src/hooks/useAiModels.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAGtD,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,kBAAkB,CAAC;CAC1E;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,iBAAiB,
|
|
1
|
+
{"version":3,"file":"useAiModels.d.ts","sourceRoot":"","sources":["../../src/hooks/useAiModels.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAGtD,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,kBAAkB,CAAC;CAC1E;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,iBAAiB,CA6F3E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useModelManagement.d.ts","sourceRoot":"","sources":["../../src/hooks/useModelManagement.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,0BAA0B,CAAC;AAElC,MAAM,WAAW,yBAA0B,SAAQ,kBAAkB;IACnE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;CACjD;AAED,MAAM,WAAW,wBAAwB;IAEvC,eAAe,EAAE,OAAO,EAAE,CAAC;IAC3B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAGrB,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,aAAa,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,iBAAiB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAGvC,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;IAC5C,eAAe,EAAE,MAAM,OAAO,EAAE,CAAC;IACjC,iBAAiB,EAAE,MAAM,OAAO,EAAE,CAAC;CACpC;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,GAAE,yBAA8B,GACtC,wBAAwB,
|
|
1
|
+
{"version":3,"file":"useModelManagement.d.ts","sourceRoot":"","sources":["../../src/hooks/useModelManagement.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,0BAA0B,CAAC;AAElC,MAAM,WAAW,yBAA0B,SAAQ,kBAAkB;IACnE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;CACjD;AAED,MAAM,WAAW,wBAAwB;IAEvC,eAAe,EAAE,OAAO,EAAE,CAAC;IAC3B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAGrB,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,aAAa,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,iBAAiB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAGvC,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;IAC5C,eAAe,EAAE,MAAM,OAAO,EAAE,CAAC;IACjC,iBAAiB,EAAE,MAAM,OAAO,EAAE,CAAC;CACpC;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,GAAE,yBAA8B,GACtC,wBAAwB,CAgI1B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/styles/register.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;AAEvB,OAAO,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import "../styles.css";
|
|
@@ -6,7 +6,7 @@ export interface ParsedError {
|
|
|
6
6
|
/**
|
|
7
7
|
* Parse et uniformise la gestion des erreurs des composants AI
|
|
8
8
|
*/
|
|
9
|
-
export declare function parseAIError(error:
|
|
9
|
+
export declare function parseAIError(error: unknown): ParsedError;
|
|
10
10
|
/**
|
|
11
11
|
* Interface pour la callback de gestion d'erreur uniforme
|
|
12
12
|
*/
|
|
@@ -23,7 +23,7 @@ export interface ErrorToastCallback {
|
|
|
23
23
|
* @param onToast Callback externe optionnelle fournie par le parent
|
|
24
24
|
* @param showInternalToast Callback interne optionnelle pour afficher un toast dans le composant
|
|
25
25
|
*/
|
|
26
|
-
export declare function handleAIError(error:
|
|
26
|
+
export declare function handleAIError(error: unknown, onToast?: ErrorToastCallback, showInternalToast?: (error: {
|
|
27
27
|
message: string;
|
|
28
28
|
code?: string;
|
|
29
29
|
}) => void): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errorHandler.d.ts","sourceRoot":"","sources":["../../src/utils/errorHandler.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,OAAO,CAAC;CACzB;
|
|
1
|
+
{"version":3,"file":"errorHandler.d.ts","sourceRoot":"","sources":["../../src/utils/errorHandler.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,OAAO,CAAC;CACzB;AAeD;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CA8CxD;AAyFD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAClE;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,OAAO,EACd,OAAO,CAAC,EAAE,kBAAkB,EAC5B,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,KAAK,IAAI,GACtE,IAAI,CAuBN"}
|
|
@@ -1,11 +1,18 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { ErrorCode } from "@lastbrain/ai-ui-core";
|
|
3
|
+
function isNormalizedErrorLike(value) {
|
|
4
|
+
if (!value || typeof value !== "object") {
|
|
5
|
+
return false;
|
|
6
|
+
}
|
|
7
|
+
const v = value;
|
|
8
|
+
return typeof v.code === "string" && typeof v.message === "string";
|
|
9
|
+
}
|
|
3
10
|
/**
|
|
4
11
|
* Parse et uniformise la gestion des erreurs des composants AI
|
|
5
12
|
*/
|
|
6
13
|
export function parseAIError(error) {
|
|
7
14
|
// Si l'erreur est déjà un objet normalisé
|
|
8
|
-
if (error
|
|
15
|
+
if (isNormalizedErrorLike(error)) {
|
|
9
16
|
return {
|
|
10
17
|
message: getUserFriendlyMessage(error.code, error.message),
|
|
11
18
|
code: error.code,
|
|
@@ -5,25 +5,28 @@ export interface ModelToggleOptions {
|
|
|
5
5
|
apiKey?: string;
|
|
6
6
|
baseUrl?: string;
|
|
7
7
|
}
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
*/
|
|
11
|
-
export declare function toggleUserModel(modelId: string, isActive: boolean, options?: ModelToggleOptions): Promise<void>;
|
|
12
|
-
/**
|
|
13
|
-
* Récupère tous les modèles disponibles avec API key ou via proxy
|
|
14
|
-
*/
|
|
15
|
-
export declare function getAvailableModels(options?: ModelToggleOptions): Promise<Array<{
|
|
8
|
+
type ModelCategory = "text" | "image" | "audio" | "video";
|
|
9
|
+
interface ModelInfo {
|
|
16
10
|
id: string;
|
|
17
11
|
name: string;
|
|
18
12
|
description?: string;
|
|
19
13
|
provider: string;
|
|
20
|
-
category:
|
|
14
|
+
category: ModelCategory;
|
|
21
15
|
isActive?: boolean;
|
|
22
16
|
isPro?: boolean;
|
|
23
17
|
costPer1M?: number;
|
|
24
|
-
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Active ou désactive un modèle pour l'utilisateur courant
|
|
21
|
+
*/
|
|
22
|
+
export declare function toggleUserModel(modelId: string, isActive: boolean, options?: ModelToggleOptions): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Récupère tous les modèles disponibles avec API key ou via proxy
|
|
25
|
+
*/
|
|
26
|
+
export declare function getAvailableModels(options?: ModelToggleOptions): Promise<ModelInfo[]>;
|
|
25
27
|
/**
|
|
26
28
|
* Récupère les modèles activés par l'utilisateur avec API key
|
|
27
29
|
*/
|
|
28
30
|
export declare function getUserModels(options?: ModelToggleOptions): Promise<string[]>;
|
|
31
|
+
export {};
|
|
29
32
|
//# sourceMappingURL=modelManagement.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modelManagement.d.ts","sourceRoot":"","sources":["../../src/utils/modelManagement.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;
|
|
1
|
+
{"version":3,"file":"modelManagement.d.ts","sourceRoot":"","sources":["../../src/utils/modelManagement.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAcD,KAAK,aAAa,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AAE1D,UAAU,SAAS;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,aAAa,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA8BD;;GAEG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,OAAO,EACjB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,IAAI,CAAC,CAqCf;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,SAAS,EAAE,CAAC,CA0DtB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,MAAM,EAAE,CAAC,CAkDnB"}
|
|
@@ -1,6 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Utilitaires pour la gestion des modèles IA
|
|
3
3
|
*/
|
|
4
|
+
function isModelCategory(value) {
|
|
5
|
+
return (value === "text" ||
|
|
6
|
+
value === "image" ||
|
|
7
|
+
value === "audio" ||
|
|
8
|
+
value === "video");
|
|
9
|
+
}
|
|
10
|
+
function isModelInfo(value) {
|
|
11
|
+
if (!value || typeof value !== "object")
|
|
12
|
+
return false;
|
|
13
|
+
const v = value;
|
|
14
|
+
return (typeof v.id === "string" &&
|
|
15
|
+
typeof v.name === "string" &&
|
|
16
|
+
typeof v.provider === "string" &&
|
|
17
|
+
isModelCategory(v.category));
|
|
18
|
+
}
|
|
4
19
|
function isAuthTokenCandidate(value) {
|
|
5
20
|
if (!value)
|
|
6
21
|
return false;
|
|
@@ -76,10 +91,12 @@ export async function getAvailableModels(options = {}) {
|
|
|
76
91
|
}
|
|
77
92
|
const data = await response.json();
|
|
78
93
|
if (Array.isArray(data?.models)) {
|
|
79
|
-
return data.models;
|
|
94
|
+
return data.models.filter(isModelInfo);
|
|
80
95
|
}
|
|
81
96
|
if (Array.isArray(data?.providers)) {
|
|
82
|
-
return data.providers
|
|
97
|
+
return (data.providers?.flatMap((provider) => Array.isArray(provider.models)
|
|
98
|
+
? provider.models.filter(isModelInfo)
|
|
99
|
+
: []) || []);
|
|
83
100
|
}
|
|
84
101
|
return [];
|
|
85
102
|
}
|
package/package.json
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lastbrain/ai-ui-react",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.71",
|
|
4
4
|
"description": "Headless React components for LastBrain AI UI Kit",
|
|
5
5
|
"private": false,
|
|
6
6
|
"type": "module",
|
|
7
7
|
"main": "dist/index.js",
|
|
8
|
+
"style": "dist/styles.css",
|
|
8
9
|
"types": "dist/index.d.ts",
|
|
9
10
|
"exports": {
|
|
10
11
|
".": {
|
|
@@ -40,7 +41,9 @@
|
|
|
40
41
|
],
|
|
41
42
|
"sideEffects": [
|
|
42
43
|
"*.css",
|
|
43
|
-
"dist/styles.css"
|
|
44
|
+
"dist/styles.css",
|
|
45
|
+
"dist/index.js",
|
|
46
|
+
"dist/styles/register.js"
|
|
44
47
|
],
|
|
45
48
|
"peerDependencies": {
|
|
46
49
|
"react": ">=18.0.0",
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
|
+
import "../styles/register";
|
|
3
4
|
import React, { useState, useRef, KeyboardEvent } from "react";
|
|
4
5
|
import { X, Sparkles, Lock } from "lucide-react";
|
|
5
6
|
import { AiPromptPanel } from "./AiPromptPanel";
|
|
@@ -218,7 +219,11 @@ Exemple de réponse attendue: javascript, react, frontend, api, development`;
|
|
|
218
219
|
}
|
|
219
220
|
}}
|
|
220
221
|
className={`ai-control-action ai-spark ${sizeClass} ${radiusClass}`}
|
|
221
|
-
aria-label={
|
|
222
|
+
aria-label={
|
|
223
|
+
isAuthenticated
|
|
224
|
+
? "Générer des tags avec l'IA"
|
|
225
|
+
: "Connexion requise"
|
|
226
|
+
}
|
|
222
227
|
title={
|
|
223
228
|
isAuthenticated
|
|
224
229
|
? "Générer des tags avec l'IA"
|
|
@@ -1,14 +1,8 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
|
+
import "../styles/register";
|
|
3
4
|
import { useState, type ButtonHTMLAttributes } from "react";
|
|
4
|
-
import {
|
|
5
|
-
Download,
|
|
6
|
-
FileText,
|
|
7
|
-
Loader2,
|
|
8
|
-
Lock,
|
|
9
|
-
Sparkles,
|
|
10
|
-
X,
|
|
11
|
-
} from "lucide-react";
|
|
5
|
+
import { Download, FileText, Loader2, Lock, Sparkles, X } from "lucide-react";
|
|
12
6
|
import type { BaseAiProps } from "../types";
|
|
13
7
|
import type { AiRadius, AiSize, AiVariant } from "../types";
|
|
14
8
|
import { useAiCallText } from "../hooks/useAiCallText";
|
|
@@ -20,10 +14,20 @@ import { handleAIError } from "../utils/errorHandler";
|
|
|
20
14
|
import { useLB } from "../context/LBAuthProvider";
|
|
21
15
|
import { LBSigninModal } from "./LBSigninModal";
|
|
22
16
|
|
|
17
|
+
// Types pour les données de contexte
|
|
18
|
+
type ContextData =
|
|
19
|
+
| string
|
|
20
|
+
| number
|
|
21
|
+
| boolean
|
|
22
|
+
| object
|
|
23
|
+
| unknown[]
|
|
24
|
+
| { [key: string]: unknown };
|
|
25
|
+
|
|
23
26
|
export interface AiContextButtonProps
|
|
24
|
-
extends
|
|
27
|
+
extends
|
|
28
|
+
Omit<BaseAiProps, "onValue" | "type">,
|
|
25
29
|
Omit<ButtonHTMLAttributes<HTMLButtonElement>, "baseUrl" | "apiKeyId"> {
|
|
26
|
-
contextData:
|
|
30
|
+
contextData: ContextData;
|
|
27
31
|
contextDescription?: string;
|
|
28
32
|
onResult?: (
|
|
29
33
|
result: string,
|
|
@@ -99,7 +103,7 @@ export function AiContextButton({
|
|
|
99
103
|
setIsOpen(true);
|
|
100
104
|
};
|
|
101
105
|
|
|
102
|
-
const formatContextData = (data:
|
|
106
|
+
const formatContextData = (data: ContextData): string => {
|
|
103
107
|
if (typeof data === "string") {
|
|
104
108
|
return data;
|
|
105
109
|
}
|
|
@@ -109,7 +113,10 @@ export function AiContextButton({
|
|
|
109
113
|
return String(data);
|
|
110
114
|
};
|
|
111
115
|
|
|
112
|
-
const handleSubmit = async (
|
|
116
|
+
const handleSubmit = async (
|
|
117
|
+
selectedModel: string,
|
|
118
|
+
selectedPrompt: string
|
|
119
|
+
) => {
|
|
113
120
|
try {
|
|
114
121
|
const contextString = formatContextData(contextData);
|
|
115
122
|
const fullPrompt = `${selectedPrompt}\n\nCONTEXTE (${contextDescription}):\n${contextString}\n\nAnalyse ces données et réponds de manière structurée et claire.`;
|
|
@@ -175,12 +182,17 @@ export function AiContextButton({
|
|
|
175
182
|
return;
|
|
176
183
|
}
|
|
177
184
|
|
|
178
|
-
const currentDate = new Date()
|
|
185
|
+
const currentDate = new Date()
|
|
186
|
+
.toLocaleDateString("fr-FR")
|
|
187
|
+
.replace(/\//g, "-");
|
|
179
188
|
const defaultName = `analyse-${currentDate}.txt`;
|
|
180
189
|
const fileName = prompt("Nom du fichier :", defaultName) || defaultName;
|
|
181
190
|
|
|
182
|
-
const content = `ANALYSE DES DONNÉES - ${new Date().toLocaleString("fr-FR")}\n\nPROMPT UTILISÉ :\n${analysisResult.prompt}\n\nRÉSULTAT DE L'ANALYSE :\n${analysisResult.content}\n\n--- MÉTADONNÉES ---\nTokens utilisés: ${analysisResult.tokens.toLocaleString()}\nCoût: $${(
|
|
183
|
-
|
|
191
|
+
const content = `ANALYSE DES DONNÉES - ${new Date().toLocaleString("fr-FR")}\n\nPROMPT UTILISÉ :\n${analysisResult.prompt}\n\nRÉSULTAT DE L'ANALYSE :\n${analysisResult.content}\n\n--- MÉTADONNÉES ---\nTokens utilisés: ${analysisResult.tokens.toLocaleString()}\nCoût: $${(apiKeyId?.includes(
|
|
192
|
+
"dev"
|
|
193
|
+
)
|
|
194
|
+
? 0
|
|
195
|
+
: analysisResult.cost
|
|
184
196
|
).toFixed(6)}\nID de requête: ${analysisResult.requestId || "N/A"}`;
|
|
185
197
|
|
|
186
198
|
const blob = new Blob([content], { type: "text/plain;charset=utf-8" });
|
|
@@ -206,7 +218,9 @@ export function AiContextButton({
|
|
|
206
218
|
onClick={handleOpenPanel}
|
|
207
219
|
disabled={disabled || loading || !isAuthReady}
|
|
208
220
|
className={`ai-btn ai-context-btn ${variantClass} ${sizeClass} ${radiusClass} ${className || ""}`}
|
|
209
|
-
title={
|
|
221
|
+
title={
|
|
222
|
+
!isAuthReady ? "Authentication required" : "Analyser avec l'IA"
|
|
223
|
+
}
|
|
210
224
|
>
|
|
211
225
|
{loading ? (
|
|
212
226
|
<>
|
|
@@ -251,14 +265,21 @@ export function AiContextButton({
|
|
|
251
265
|
}
|
|
252
266
|
}}
|
|
253
267
|
>
|
|
254
|
-
<div
|
|
268
|
+
<div
|
|
269
|
+
className="ai-popover ai-result-modal"
|
|
270
|
+
onClick={(e) => e.stopPropagation()}
|
|
271
|
+
>
|
|
255
272
|
<div className="ai-result-header">
|
|
256
273
|
<div className="ai-row">
|
|
257
274
|
<FileText size={18} />
|
|
258
275
|
<h2 className="ai-result-title">{resultModalTitle}</h2>
|
|
259
276
|
</div>
|
|
260
277
|
<div className="ai-row">
|
|
261
|
-
<button
|
|
278
|
+
<button
|
|
279
|
+
type="button"
|
|
280
|
+
className={`ai-btn ai-btn--ghost ai-btn--compact ${sizeClass} ${radiusClass}`}
|
|
281
|
+
onClick={saveToFile}
|
|
282
|
+
>
|
|
262
283
|
<Download size={14} />
|
|
263
284
|
Sauvegarder
|
|
264
285
|
</button>
|
|
@@ -284,14 +305,18 @@ export function AiContextButton({
|
|
|
284
305
|
|
|
285
306
|
<div className="ai-result-block">
|
|
286
307
|
<h3 className="ai-result-subtitle">Résultat</h3>
|
|
287
|
-
<div className="ai-result-content">
|
|
308
|
+
<div className="ai-result-content">
|
|
309
|
+
{analysisResult.content}
|
|
310
|
+
</div>
|
|
288
311
|
</div>
|
|
289
312
|
|
|
290
313
|
<div className="ai-result-meta ai-between">
|
|
291
314
|
<span>
|
|
292
|
-
Coût: $
|
|
293
|
-
|
|
294
|
-
|
|
315
|
+
Coût: $
|
|
316
|
+
{(apiKeyId?.includes("dev")
|
|
317
|
+
? 0
|
|
318
|
+
: analysisResult.cost
|
|
319
|
+
).toFixed(6)}
|
|
295
320
|
</span>
|
|
296
321
|
<span>ID: {analysisResult.requestId?.slice(-8) || "N/A"}</span>
|
|
297
322
|
</div>
|
|
@@ -300,7 +325,10 @@ export function AiContextButton({
|
|
|
300
325
|
</div>
|
|
301
326
|
) : null}
|
|
302
327
|
|
|
303
|
-
<LBSigninModal
|
|
328
|
+
<LBSigninModal
|
|
329
|
+
isOpen={showAuthModal}
|
|
330
|
+
onClose={() => setShowAuthModal(false)}
|
|
331
|
+
/>
|
|
304
332
|
<ErrorToast key={errorKey} error={errorData} onComplete={clearError} />
|
|
305
333
|
</>
|
|
306
334
|
);
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
|
+
import "../styles/register";
|
|
3
4
|
import {
|
|
4
5
|
useState,
|
|
5
6
|
useEffect,
|
|
@@ -284,7 +285,9 @@ function AiPromptPanelInternal({
|
|
|
284
285
|
setSelectedModel("");
|
|
285
286
|
return;
|
|
286
287
|
}
|
|
287
|
-
const hasSelected = modelOptions.some(
|
|
288
|
+
const hasSelected = modelOptions.some(
|
|
289
|
+
(model) => model.id === selectedModel
|
|
290
|
+
);
|
|
288
291
|
if (!hasSelected) {
|
|
289
292
|
setSelectedModel(modelOptions[0].id);
|
|
290
293
|
}
|
|
@@ -441,7 +444,8 @@ function AiPromptPanelInternal({
|
|
|
441
444
|
width: "64px",
|
|
442
445
|
height: "64px",
|
|
443
446
|
borderRadius: "999px",
|
|
444
|
-
border:
|
|
447
|
+
border:
|
|
448
|
+
"2px solid color-mix(in srgb, var(--ai-primary) 20%, transparent)",
|
|
445
449
|
borderTopColor: "var(--ai-primary)",
|
|
446
450
|
animation: "ai-spin 1.1s linear infinite",
|
|
447
451
|
display: "flex",
|
|
@@ -873,12 +877,15 @@ function AiPromptPanelInternal({
|
|
|
873
877
|
transition: "all 0.2s",
|
|
874
878
|
}}
|
|
875
879
|
onMouseEnter={(e) => {
|
|
876
|
-
e.currentTarget.style.background =
|
|
877
|
-
|
|
880
|
+
e.currentTarget.style.background =
|
|
881
|
+
"color-mix(in srgb, var(--ai-primary) 10%, transparent)";
|
|
882
|
+
e.currentTarget.style.borderColor =
|
|
883
|
+
"var(--ai-primary)";
|
|
878
884
|
}}
|
|
879
885
|
onMouseLeave={(e) => {
|
|
880
886
|
e.currentTarget.style.background = "transparent";
|
|
881
|
-
e.currentTarget.style.borderColor =
|
|
887
|
+
e.currentTarget.style.borderColor =
|
|
888
|
+
"var(--ai-border)";
|
|
882
889
|
}}
|
|
883
890
|
>
|
|
884
891
|
<div
|
|
@@ -958,12 +965,15 @@ function AiPromptPanelInternal({
|
|
|
958
965
|
transition: "all 0.2s",
|
|
959
966
|
}}
|
|
960
967
|
onMouseEnter={(e) => {
|
|
961
|
-
e.currentTarget.style.background =
|
|
962
|
-
|
|
968
|
+
e.currentTarget.style.background =
|
|
969
|
+
"color-mix(in srgb, var(--ai-primary) 10%, transparent)";
|
|
970
|
+
e.currentTarget.style.borderColor =
|
|
971
|
+
"var(--ai-primary)";
|
|
963
972
|
}}
|
|
964
973
|
onMouseLeave={(e) => {
|
|
965
974
|
e.currentTarget.style.background = "transparent";
|
|
966
|
-
e.currentTarget.style.borderColor =
|
|
975
|
+
e.currentTarget.style.borderColor =
|
|
976
|
+
"var(--ai-border)";
|
|
967
977
|
}}
|
|
968
978
|
>
|
|
969
979
|
<div
|
|
@@ -1020,10 +1030,7 @@ function AiPromptPanelInternal({
|
|
|
1020
1030
|
backdropFilter: "blur(8px)",
|
|
1021
1031
|
}}
|
|
1022
1032
|
>
|
|
1023
|
-
<button
|
|
1024
|
-
onClick={handleClose}
|
|
1025
|
-
className="ai-btn ai-btn--ghost"
|
|
1026
|
-
>
|
|
1033
|
+
<button onClick={handleClose} className="ai-btn ai-btn--ghost">
|
|
1027
1034
|
Cancel
|
|
1028
1035
|
</button>
|
|
1029
1036
|
<button
|
|
@@ -1179,9 +1186,7 @@ function AiPromptPanelInternal({
|
|
|
1179
1186
|
/>
|
|
1180
1187
|
<div style={{ flex: 1 }}>
|
|
1181
1188
|
<div className="ai-model-item-title">
|
|
1182
|
-
<span>
|
|
1183
|
-
{modelData.name}
|
|
1184
|
-
</span>
|
|
1189
|
+
<span>{modelData.name}</span>
|
|
1185
1190
|
{modelData.isPro && (
|
|
1186
1191
|
<span className="ai-pill ai-pill--pro">
|
|
1187
1192
|
PRO
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
3
|
+
import "../styles/register";
|
|
4
|
+
import type { AiStatus, LBUser } from "@lastbrain/ai-ui-core";
|
|
5
|
+
import { useLayoutEffect, useMemo, useRef, useState, useContext } from "react";
|
|
5
6
|
import { createPortal } from "react-dom";
|
|
6
7
|
import {
|
|
7
8
|
ArrowRightLeft,
|
|
@@ -14,8 +15,13 @@ import {
|
|
|
14
15
|
Settings,
|
|
15
16
|
Shield,
|
|
16
17
|
} from "lucide-react";
|
|
17
|
-
import {
|
|
18
|
-
|
|
18
|
+
import {
|
|
19
|
+
LBContext,
|
|
20
|
+
type LBApiKey,
|
|
21
|
+
type BasicStatus,
|
|
22
|
+
type StorageStatus,
|
|
23
|
+
} from "../context/LBAuthProvider";
|
|
24
|
+
import { AiContext } from "../context/AiProvider";
|
|
19
25
|
import { LBApiKeySelector } from "./LBApiKeySelector";
|
|
20
26
|
import { LBSigninModal } from "./LBSigninModal";
|
|
21
27
|
import type { AiRadius, AiSize } from "../types";
|
|
@@ -149,23 +155,23 @@ export function AiStatusButton({
|
|
|
149
155
|
radius = "full",
|
|
150
156
|
}: AiStatusButtonProps) {
|
|
151
157
|
let lbStatus: string | undefined;
|
|
152
|
-
let user:
|
|
158
|
+
let user: LBUser | null = null;
|
|
153
159
|
let logout: (() => Promise<void>) | undefined;
|
|
154
|
-
let apiKeys:
|
|
160
|
+
let apiKeys: LBApiKey[] = [];
|
|
155
161
|
let switchApiKey: ((apiKeyId: string) => Promise<void>) | undefined;
|
|
156
|
-
let lbApiStatus:
|
|
157
|
-
let lbBasicStatus:
|
|
158
|
-
let lbStorageStatus:
|
|
162
|
+
let lbApiStatus: AiStatus | null = null;
|
|
163
|
+
let lbBasicStatus: BasicStatus | null = null;
|
|
164
|
+
let lbStorageStatus: StorageStatus | null = null;
|
|
159
165
|
let lbIsLoadingStatus = false;
|
|
160
166
|
let lbIsLoadingStorage = false;
|
|
161
|
-
let lbSelectedKey:
|
|
167
|
+
let lbSelectedKey: LBApiKey | null = null;
|
|
162
168
|
let lbRefreshBasicStatus: (() => Promise<void>) | undefined;
|
|
163
169
|
let lbRefreshStorageStatus: ((force?: boolean) => Promise<void>) | undefined;
|
|
164
170
|
|
|
165
|
-
|
|
166
|
-
|
|
171
|
+
const lbContext = useContext(LBContext);
|
|
172
|
+
if (lbContext) {
|
|
167
173
|
lbStatus = lbContext.status;
|
|
168
|
-
user = lbContext.user;
|
|
174
|
+
user = lbContext.user ?? null;
|
|
169
175
|
logout = lbContext.logout;
|
|
170
176
|
apiKeys = lbContext.apiKeys || [];
|
|
171
177
|
switchApiKey = lbContext.switchApiKey;
|
|
@@ -177,14 +183,15 @@ export function AiStatusButton({
|
|
|
177
183
|
lbSelectedKey = lbContext.selectedKey || null;
|
|
178
184
|
lbRefreshBasicStatus = lbContext.refreshBasicStatus;
|
|
179
185
|
lbRefreshStorageStatus = lbContext.refreshStorageStatus;
|
|
180
|
-
}
|
|
186
|
+
} else {
|
|
181
187
|
lbStatus = undefined;
|
|
182
188
|
}
|
|
183
189
|
|
|
190
|
+
const aiContext = useContext(AiContext);
|
|
184
191
|
let refetchProviders: (() => Promise<void>) | undefined;
|
|
185
|
-
|
|
186
|
-
refetchProviders =
|
|
187
|
-
}
|
|
192
|
+
if (aiContext) {
|
|
193
|
+
refetchProviders = aiContext.refetchProviders;
|
|
194
|
+
} else {
|
|
188
195
|
refetchProviders = undefined;
|
|
189
196
|
}
|
|
190
197
|
|
|
@@ -214,7 +221,10 @@ export function AiStatusButton({
|
|
|
214
221
|
);
|
|
215
222
|
const requiresApiKeySelection =
|
|
216
223
|
lbStatus === "ready" && !hasApiKeySelected && apiKeys.length > 0;
|
|
217
|
-
const isApiKeyAuthMode =
|
|
224
|
+
const isApiKeyAuthMode =
|
|
225
|
+
effectiveStatus &&
|
|
226
|
+
"authType" in effectiveStatus &&
|
|
227
|
+
effectiveStatus.authType === "api_key";
|
|
218
228
|
|
|
219
229
|
const [tooltipStyle, setTooltipStyle] = useState<Record<string, string>>({});
|
|
220
230
|
|
|
@@ -453,7 +463,11 @@ export function AiStatusButton({
|
|
|
453
463
|
<span className="ai-popover-value">
|
|
454
464
|
{lbIsLoadingStatus
|
|
455
465
|
? "..."
|
|
456
|
-
: effectiveStatus
|
|
466
|
+
: (effectiveStatus &&
|
|
467
|
+
"authType" in effectiveStatus &&
|
|
468
|
+
effectiveStatus.authType) ||
|
|
469
|
+
lbStatus ||
|
|
470
|
+
"unknown"}
|
|
457
471
|
</span>
|
|
458
472
|
</div>
|
|
459
473
|
</div>
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
|
+
import "../styles/register";
|
|
3
4
|
import React, {
|
|
4
5
|
useState,
|
|
5
6
|
useRef,
|
|
@@ -197,7 +198,9 @@ export function AiTextarea({
|
|
|
197
198
|
|
|
198
199
|
return (
|
|
199
200
|
<div className={`ai-control-group ai-glow ${className || ""}`}>
|
|
200
|
-
<div
|
|
201
|
+
<div
|
|
202
|
+
className={`ai-shell ai-shell--textarea ${sizeClass} ${radiusClass}`}
|
|
203
|
+
>
|
|
201
204
|
<textarea
|
|
202
205
|
ref={textareaRef}
|
|
203
206
|
{...textareaProps}
|