@lastbrain/ai-ui-react 1.0.26 → 1.0.27

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.
@@ -1 +1 @@
1
- {"version":3,"file":"AiContextButton.d.ts","sourceRoot":"","sources":["../../src/components/AiContextButton.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAY,KAAK,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAE5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAQ5C,MAAM,WAAW,oBACf,SACE,IAAI,CAAC,WAAW,EAAE,SAAS,GAAG,MAAM,CAAC,EACrC,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,SAAS,GAAG,UAAU,CAAC;IAEvE,WAAW,EAAE,GAAG,CAAC;IACjB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,EAAE,CACT,MAAM,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,KAC7C,IAAI,CAAC;IACV,MAAM,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,eAAe,CAAC,EAC9B,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,YAAY,EACtB,MAAgB,EAChB,WAAW,EACX,kBAAyC,EACzC,QAAQ,EACR,OAAO,EACP,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,gBAA0C,EAC1C,YAAY,EACZ,aAAa,EACb,OAAO,EAAE,QAAQ,EACjB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,OAAO,EACf,GAAG,WAAW,EACf,EAAE,oBAAoB,2CAsftB"}
1
+ {"version":3,"file":"AiContextButton.d.ts","sourceRoot":"","sources":["../../src/components/AiContextButton.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAY,KAAK,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAE5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAQ5C,MAAM,WAAW,oBACf,SACE,IAAI,CAAC,WAAW,EAAE,SAAS,GAAG,MAAM,CAAC,EACrC,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,SAAS,GAAG,UAAU,CAAC;IAEvE,WAAW,EAAE,GAAG,CAAC;IACjB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,EAAE,CACT,MAAM,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,KAC7C,IAAI,CAAC;IACV,MAAM,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,eAAe,CAAC,EAC9B,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,YAAY,EACtB,MAAgB,EAChB,WAAW,EACX,kBAAyC,EACzC,QAAQ,EACR,OAAO,EACP,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,gBAA0C,EAC1C,YAAY,EACZ,aAAa,EACb,OAAO,EAAE,QAAQ,EACjB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,OAAO,EACf,GAAG,WAAW,EACf,EAAE,oBAAoB,2CAshBtB"}
@@ -153,10 +153,40 @@ Analyse ces données et réponds de manière structurée et claire.`;
153
153
  }
154
154
  }
155
155
  catch (error) {
156
+ console.error("AiContextButton error:", error);
157
+ // Gestion spécifique des erreurs d'API
158
+ let errorMessage = "Erreur lors de l'analyse";
159
+ let errorCode;
160
+ if (error instanceof Error) {
161
+ try {
162
+ // Tenter de parser l'erreur JSON si c'est une erreur API
163
+ const errorData = JSON.parse(error.message);
164
+ if (errorData.error?.code === "INSUFFICIENT_TOKENS") {
165
+ errorMessage =
166
+ "Crédits insuffisants pour cette analyse. Veuillez recharger votre compte.";
167
+ errorCode = "INSUFFICIENT_TOKENS";
168
+ }
169
+ else if (errorData.error?.message) {
170
+ errorMessage = errorData.error.message;
171
+ errorCode = errorData.error.code;
172
+ }
173
+ }
174
+ catch {
175
+ // Si ce n'est pas du JSON, utiliser le message d'erreur direct
176
+ if (error.message.includes("INSUFFICIENT_TOKENS")) {
177
+ errorMessage =
178
+ "Crédits insuffisants pour cette analyse. Veuillez recharger votre compte.";
179
+ errorCode = "INSUFFICIENT_TOKENS";
180
+ }
181
+ else {
182
+ errorMessage = error.message;
183
+ }
184
+ }
185
+ }
156
186
  onToast?.({
157
187
  type: "error",
158
- message: "Erreur lors de l'analyse",
159
- code: error instanceof Error ? error.message : undefined,
188
+ message: errorMessage,
189
+ code: errorCode,
160
190
  });
161
191
  }
162
192
  finally {
@@ -217,7 +247,7 @@ Analyse ces données et réponds de manière structurée et claire.`;
217
247
  } }), _jsx("span", { style: { letterSpacing: "0.025em" }, children: "Analyse..." })] })) : (_jsx(_Fragment, { children: _jsx(Sparkle, { size: 18, style: {
218
248
  color: "white",
219
249
  filter: "drop-shadow(0 0 2px rgba(255,255,255,0.2))",
220
- } }) })) }), isOpen && (_jsx(AiPromptPanel, { isOpen: isOpen, onClose: handleClosePanel, onSubmit: handleSubmit, uiMode: uiMode, models: models?.filter((m) => m.type === "language") || [], enableModelManagement: true }))] }), isResultOpen && analysisResult && (_jsx("div", { style: {
250
+ } }) })) }), isOpen && (_jsx(AiPromptPanel, { isOpen: isOpen, onClose: handleClosePanel, onSubmit: handleSubmit, uiMode: uiMode, models: models?.filter((m) => m.type === "language") || [], enableModelManagement: true, baseUrl: baseUrl, apiKey: apiKeyId }))] }), isResultOpen && analysisResult && (_jsx("div", { style: {
221
251
  position: "fixed",
222
252
  top: 0,
223
253
  left: 0,
@@ -33,5 +33,5 @@ export interface AiPromptPanelRenderProps {
33
33
  setShowAllModels?: (show: boolean) => void;
34
34
  onModelToggle?: (modelId: string, isActive: boolean) => Promise<void>;
35
35
  }
36
- export declare function AiPromptPanel({ isOpen, onClose, onSubmit, uiMode: _uiMode, models, sourceText, children, enableModelManagement, availableModels, userModels, onModelToggle, apiKey, baseUrl, }: AiPromptPanelProps): import("react/jsx-runtime").JSX.Element | null;
36
+ export declare function AiPromptPanel(props: AiPromptPanelProps): import("react/jsx-runtime").JSX.Element;
37
37
  //# sourceMappingURL=AiPromptPanel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AiPromptPanel.d.ts","sourceRoot":"","sources":["../../src/components/AiPromptPanel.tsx"],"names":[],"mappings":"AAEA,OAAO,EAKL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAOvC,OAAO,EAAsB,KAAK,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAE/E,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACrE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,wBAAwB,KAAK,SAAS,CAAC;IAE1D,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,eAAe,CAAC,EAAE,OAAO,EAAE,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,IAAI,CAAC;IAExB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,eAAe,CAAC,EAAE,OAAO,EAAE,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3C,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvE;AAED,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,OAAO,EACP,QAAQ,EACR,MAAM,EAAE,OAAiB,EACzB,MAAW,EACX,UAAU,EACV,QAAQ,EACR,qBAA6B,EAC7B,eAAoB,EACpB,UAAe,EACf,aAAa,EACb,MAAM,EACN,OAAO,GACR,EAAE,kBAAkB,kDAupCpB"}
1
+ {"version":3,"file":"AiPromptPanel.d.ts","sourceRoot":"","sources":["../../src/components/AiPromptPanel.tsx"],"names":[],"mappings":"AAEA,OAAO,EAKL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAOvC,OAAO,EAAsB,KAAK,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAG/E,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACrE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,wBAAwB,KAAK,SAAS,CAAC;IAE1D,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,eAAe,CAAC,EAAE,OAAO,EAAE,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,IAAI,CAAC;IAExB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,eAAe,CAAC,EAAE,OAAO,EAAE,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3C,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,2CActD"}
@@ -5,7 +5,17 @@ import { BookOpen, Search, Sparkles, Star, Tag, Settings } from "lucide-react";
5
5
  import { aiStyles } from "../styles/inline";
6
6
  import { usePrompts, } from "../hooks/usePrompts";
7
7
  import { useModelManagement } from "../hooks/useModelManagement";
8
- export function AiPromptPanel({ isOpen, onClose, onSubmit, uiMode: _uiMode = "modal", models = [], sourceText, children, enableModelManagement = false, availableModels = [], userModels = [], onModelToggle, apiKey, baseUrl, }) {
8
+ import { AiProvider } from "../context/AiProvider";
9
+ export function AiPromptPanel(props) {
10
+ const { apiKey, baseUrl } = props;
11
+ // Si apiKey et baseUrl sont fournis, wrapper avec AiProvider
12
+ if (apiKey || baseUrl) {
13
+ return (_jsx(AiProvider, { baseUrl: baseUrl || "", apiKeyId: apiKey || "", children: _jsx(AiPromptPanelInternal, { ...props }) }));
14
+ }
15
+ // Sinon, utiliser le contexte existant
16
+ return _jsx(AiPromptPanelInternal, { ...props });
17
+ }
18
+ function AiPromptPanelInternal({ isOpen, onClose, onSubmit, uiMode: _uiMode = "modal", models = [], sourceText, children, enableModelManagement = false, availableModels = [], userModels = [], onModelToggle, apiKey, baseUrl, }) {
9
19
  const [selectedModel, setSelectedModel] = useState("");
10
20
  const [prompt, setPrompt] = useState("");
11
21
  const [promptId, setPromptId] = useState(undefined);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lastbrain/ai-ui-react",
3
- "version": "1.0.26",
3
+ "version": "1.0.27",
4
4
  "description": "Headless React components for LastBrain AI UI Kit",
5
5
  "private": false,
6
6
  "type": "module",
@@ -221,10 +221,40 @@ Analyse ces données et réponds de manière structurée et claire.`;
221
221
  });
222
222
  }
223
223
  } catch (error) {
224
+ console.error("AiContextButton error:", error);
225
+
226
+ // Gestion spécifique des erreurs d'API
227
+ let errorMessage = "Erreur lors de l'analyse";
228
+ let errorCode: string | undefined;
229
+
230
+ if (error instanceof Error) {
231
+ try {
232
+ // Tenter de parser l'erreur JSON si c'est une erreur API
233
+ const errorData = JSON.parse(error.message);
234
+ if (errorData.error?.code === "INSUFFICIENT_TOKENS") {
235
+ errorMessage =
236
+ "Crédits insuffisants pour cette analyse. Veuillez recharger votre compte.";
237
+ errorCode = "INSUFFICIENT_TOKENS";
238
+ } else if (errorData.error?.message) {
239
+ errorMessage = errorData.error.message;
240
+ errorCode = errorData.error.code;
241
+ }
242
+ } catch {
243
+ // Si ce n'est pas du JSON, utiliser le message d'erreur direct
244
+ if (error.message.includes("INSUFFICIENT_TOKENS")) {
245
+ errorMessage =
246
+ "Crédits insuffisants pour cette analyse. Veuillez recharger votre compte.";
247
+ errorCode = "INSUFFICIENT_TOKENS";
248
+ } else {
249
+ errorMessage = error.message;
250
+ }
251
+ }
252
+ }
253
+
224
254
  onToast?.({
225
255
  type: "error",
226
- message: "Erreur lors de l'analyse",
227
- code: error instanceof Error ? error.message : undefined,
256
+ message: errorMessage,
257
+ code: errorCode,
228
258
  });
229
259
  } finally {
230
260
  setIsOpen(false);
@@ -328,6 +358,8 @@ Analyse ces données et réponds de manière structurée et claire.`;
328
358
  uiMode={uiMode}
329
359
  models={models?.filter((m) => m.type === "language") || []}
330
360
  enableModelManagement={true}
361
+ baseUrl={baseUrl}
362
+ apiKey={apiKeyId}
331
363
  />
332
364
  )}
333
365
  </div>
@@ -17,6 +17,7 @@ import {
17
17
  type PublicPrompt,
18
18
  } from "../hooks/usePrompts";
19
19
  import { useModelManagement, type AIModel } from "../hooks/useModelManagement";
20
+ import { AiProvider } from "../context/AiProvider";
20
21
 
21
22
  export interface AiPromptPanelProps {
22
23
  isOpen: boolean;
@@ -53,7 +54,23 @@ export interface AiPromptPanelRenderProps {
53
54
  onModelToggle?: (modelId: string, isActive: boolean) => Promise<void>;
54
55
  }
55
56
 
56
- export function AiPromptPanel({
57
+ export function AiPromptPanel(props: AiPromptPanelProps) {
58
+ const { apiKey, baseUrl } = props;
59
+
60
+ // Si apiKey et baseUrl sont fournis, wrapper avec AiProvider
61
+ if (apiKey || baseUrl) {
62
+ return (
63
+ <AiProvider baseUrl={baseUrl || ""} apiKeyId={apiKey || ""}>
64
+ <AiPromptPanelInternal {...props} />
65
+ </AiProvider>
66
+ );
67
+ }
68
+
69
+ // Sinon, utiliser le contexte existant
70
+ return <AiPromptPanelInternal {...props} />;
71
+ }
72
+
73
+ function AiPromptPanelInternal({
57
74
  isOpen,
58
75
  onClose,
59
76
  onSubmit,