@lastbrain/ai-ui-react 1.0.16 → 1.0.18

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":"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,kDAmpCpB"}
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,kDAqpCpB"}
@@ -31,7 +31,9 @@ export function AiPromptPanel({ isOpen, onClose, onSubmit, uiMode: _uiMode = "mo
31
31
  apiKey,
32
32
  baseUrl,
33
33
  category: "text", // Par défaut pour AiPromptPanel
34
- autoFetch: enableModelManagement && availableModels.length === 0 && !!apiKey,
34
+ autoFetch: enableModelManagement &&
35
+ availableModels.length === 0 &&
36
+ (!!apiKey || !!baseUrl),
35
37
  });
36
38
  // Utiliser soit les props externes soit la gestion automatique
37
39
  const effectiveAvailableModels = availableModels.length > 0
@@ -1 +1 @@
1
- {"version":3,"file":"useModelManagement.d.ts","sourceRoot":"","sources":["../../src/hooks/useModelManagement.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,kBAAkB,EACxB,MAAM,0BAA0B,CAAC;AAElC,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;IAC/C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,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;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,GAAE,yBAA8B,GACtC,wBAAwB,CA+K1B"}
1
+ {"version":3,"file":"useModelManagement.d.ts","sourceRoot":"","sources":["../../src/hooks/useModelManagement.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,kBAAkB,EACxB,MAAM,0BAA0B,CAAC;AAElC,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;IAC/C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,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;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,GAAE,yBAA8B,GACtC,wBAAwB,CAuL1B"}
@@ -1,25 +1,33 @@
1
1
  import { useState, useCallback, useEffect } from "react";
2
+ import { useAiContext } from "../context/AiProvider";
2
3
  import { toggleUserModel, getAvailableModels, getUserModels, } from "../utils/modelManagement";
3
4
  /**
4
5
  * Hook pour gérer les modèles IA d'un utilisateur
5
6
  */
6
7
  export function useModelManagement(options = {}) {
7
8
  const { autoFetch = false, category, ...apiOptions } = options;
9
+ const { baseUrl, apiKeyId } = useAiContext();
8
10
  const [availableModels, setAvailableModels] = useState([]);
9
11
  const [userModels, setUserModels] = useState([]);
10
12
  const [loading, setLoading] = useState(false);
11
13
  const [error, setError] = useState(null);
14
+ // Utiliser baseUrl et apiKey du contexte
15
+ const effectiveOptions = {
16
+ ...apiOptions,
17
+ baseUrl: apiOptions.baseUrl || baseUrl,
18
+ apiKey: apiOptions.apiKey || apiKeyId,
19
+ };
12
20
  const refreshModels = useCallback(async () => {
13
21
  try {
14
22
  setLoading(true);
15
23
  setError(null);
16
24
  console.log("[useModelManagement] Fetching available models with options:", {
17
- apiKey: apiOptions.apiKey
18
- ? apiOptions.apiKey.substring(0, 10) + "..."
25
+ apiKey: effectiveOptions.apiKey
26
+ ? effectiveOptions.apiKey.substring(0, 10) + "..."
19
27
  : "none",
20
- baseUrl: apiOptions.baseUrl || "default",
28
+ baseUrl: effectiveOptions.baseUrl || "default",
21
29
  });
22
- const models = await getAvailableModels(apiOptions);
30
+ const models = await getAvailableModels(effectiveOptions);
23
31
  console.log("[useModelManagement] Got available models:", models.length);
24
32
  const filteredModels = category
25
33
  ? models.filter((m) => m.category === category)
@@ -39,18 +47,18 @@ export function useModelManagement(options = {}) {
39
47
  finally {
40
48
  setLoading(false);
41
49
  }
42
- }, [category, apiOptions]);
50
+ }, [category, effectiveOptions]);
43
51
  const refreshUserModels = useCallback(async () => {
44
52
  try {
45
53
  setLoading(true);
46
54
  setError(null);
47
55
  console.log("[useModelManagement] Fetching user models with options:", {
48
- apiKey: apiOptions.apiKey
49
- ? apiOptions.apiKey.substring(0, 10) + "..."
56
+ apiKey: effectiveOptions.apiKey
57
+ ? effectiveOptions.apiKey.substring(0, 10) + "..."
50
58
  : "none",
51
- baseUrl: apiOptions.baseUrl || "default",
59
+ baseUrl: effectiveOptions.baseUrl || "default",
52
60
  });
53
- const models = await getUserModels(apiOptions);
61
+ const models = await getUserModels(effectiveOptions);
54
62
  console.log("[useModelManagement] Got user models:", models);
55
63
  setUserModels(models);
56
64
  }
@@ -66,14 +74,14 @@ export function useModelManagement(options = {}) {
66
74
  finally {
67
75
  setLoading(false);
68
76
  }
69
- }, [apiOptions]);
77
+ }, [effectiveOptions]);
70
78
  const toggleModel = useCallback(async (modelId, isActive) => {
71
79
  const currentlyActive = userModels.includes(modelId);
72
80
  const targetState = isActive !== undefined ? isActive : !currentlyActive;
73
81
  try {
74
82
  setLoading(true);
75
83
  setError(null);
76
- await toggleUserModel(modelId, targetState, apiOptions);
84
+ await toggleUserModel(modelId, targetState, effectiveOptions);
77
85
  // Mise à jour optimiste
78
86
  if (targetState) {
79
87
  setUserModels((prev) => [
@@ -92,7 +100,7 @@ export function useModelManagement(options = {}) {
92
100
  finally {
93
101
  setLoading(false);
94
102
  }
95
- }, [userModels, apiOptions]);
103
+ }, [userModels, effectiveOptions]);
96
104
  // Helpers
97
105
  const isModelActive = useCallback((modelId) => {
98
106
  return userModels.includes(modelId);
@@ -105,31 +113,31 @@ export function useModelManagement(options = {}) {
105
113
  }, [availableModels, userModels]);
106
114
  // Auto-fetch au mount - si autoFetch ET (apiKey OU baseUrl avec proxy externe)
107
115
  useEffect(() => {
108
- const isExternalProxy = apiOptions.baseUrl && apiOptions.baseUrl.includes("/api/lastbrain");
116
+ const isExternalProxy = effectiveOptions.baseUrl && effectiveOptions.baseUrl.includes("/api/lastbrain");
109
117
  console.log("[useModelManagement] useEffect triggered:", {
110
118
  autoFetch,
111
- hasApiKey: !!apiOptions.apiKey,
112
- hasBaseUrl: !!apiOptions.baseUrl,
119
+ hasApiKey: !!effectiveOptions.apiKey,
120
+ hasBaseUrl: !!effectiveOptions.baseUrl,
113
121
  isExternalProxy,
114
- apiKeyPreview: apiOptions.apiKey
115
- ? apiOptions.apiKey.substring(0, 10) + "..."
122
+ apiKeyPreview: effectiveOptions.apiKey
123
+ ? effectiveOptions.apiKey.substring(0, 10) + "..."
116
124
  : "none",
117
- baseUrl: apiOptions.baseUrl || "none",
125
+ baseUrl: effectiveOptions.baseUrl || "none",
118
126
  });
119
127
  // Auto-fetch si autoFetch est activé ET qu'on a soit une apiKey soit un proxy externe
120
- if (autoFetch && (apiOptions.apiKey || isExternalProxy)) {
128
+ if (autoFetch && (effectiveOptions.apiKey || isExternalProxy)) {
121
129
  console.log("[useModelManagement] Starting auto-fetch...");
122
130
  Promise.all([refreshModels(), refreshUserModels()]);
123
131
  }
124
- else if (autoFetch && !apiOptions.apiKey && !isExternalProxy) {
132
+ else if (autoFetch && !effectiveOptions.apiKey && !isExternalProxy) {
125
133
  console.warn("[useModelManagement] autoFetch is enabled but no apiKey or baseUrl provided. Skipping automatic fetch.");
126
134
  }
127
135
  }, [
128
136
  autoFetch,
129
137
  refreshModels,
130
138
  refreshUserModels,
131
- apiOptions.apiKey,
132
- apiOptions.baseUrl,
139
+ effectiveOptions.apiKey,
140
+ effectiveOptions.baseUrl,
133
141
  ]);
134
142
  return {
135
143
  availableModels,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lastbrain/ai-ui-react",
3
- "version": "1.0.16",
3
+ "version": "1.0.18",
4
4
  "description": "Headless React components for LastBrain AI UI Kit",
5
5
  "private": false,
6
6
  "type": "module",
@@ -102,7 +102,9 @@ export function AiPromptPanel({
102
102
  baseUrl,
103
103
  category: "text", // Par défaut pour AiPromptPanel
104
104
  autoFetch:
105
- enableModelManagement && availableModels.length === 0 && !!apiKey,
105
+ enableModelManagement &&
106
+ availableModels.length === 0 &&
107
+ (!!apiKey || !!baseUrl),
106
108
  });
107
109
 
108
110
  // Utiliser soit les props externes soit la gestion automatique
@@ -1,4 +1,5 @@
1
1
  import { useState, useCallback, useEffect } from "react";
2
+ import { useAiContext } from "../context/AiProvider";
2
3
  import {
3
4
  toggleUserModel,
4
5
  getAvailableModels,
@@ -47,12 +48,20 @@ export function useModelManagement(
47
48
  options: UseModelManagementOptions = {}
48
49
  ): UseModelManagementReturn {
49
50
  const { autoFetch = false, category, ...apiOptions } = options;
51
+ const { baseUrl, apiKeyId } = useAiContext();
50
52
 
51
53
  const [availableModels, setAvailableModels] = useState<AIModel[]>([]);
52
54
  const [userModels, setUserModels] = useState<string[]>([]);
53
55
  const [loading, setLoading] = useState(false);
54
56
  const [error, setError] = useState<string | null>(null);
55
57
 
58
+ // Utiliser baseUrl et apiKey du contexte
59
+ const effectiveOptions = {
60
+ ...apiOptions,
61
+ baseUrl: apiOptions.baseUrl || baseUrl,
62
+ apiKey: apiOptions.apiKey || apiKeyId,
63
+ };
64
+
56
65
  const refreshModels = useCallback(async () => {
57
66
  try {
58
67
  setLoading(true);
@@ -61,14 +70,14 @@ export function useModelManagement(
61
70
  console.log(
62
71
  "[useModelManagement] Fetching available models with options:",
63
72
  {
64
- apiKey: apiOptions.apiKey
65
- ? apiOptions.apiKey.substring(0, 10) + "..."
73
+ apiKey: effectiveOptions.apiKey
74
+ ? effectiveOptions.apiKey.substring(0, 10) + "..."
66
75
  : "none",
67
- baseUrl: apiOptions.baseUrl || "default",
76
+ baseUrl: effectiveOptions.baseUrl || "default",
68
77
  }
69
78
  );
70
79
 
71
- const models = await getAvailableModels(apiOptions);
80
+ const models = await getAvailableModels(effectiveOptions);
72
81
  console.log("[useModelManagement] Got available models:", models.length);
73
82
 
74
83
  const filteredModels = category
@@ -95,7 +104,7 @@ export function useModelManagement(
95
104
  } finally {
96
105
  setLoading(false);
97
106
  }
98
- }, [category, apiOptions]);
107
+ }, [category, effectiveOptions]);
99
108
 
100
109
  const refreshUserModels = useCallback(async () => {
101
110
  try {
@@ -103,13 +112,13 @@ export function useModelManagement(
103
112
  setError(null);
104
113
 
105
114
  console.log("[useModelManagement] Fetching user models with options:", {
106
- apiKey: apiOptions.apiKey
107
- ? apiOptions.apiKey.substring(0, 10) + "..."
115
+ apiKey: effectiveOptions.apiKey
116
+ ? effectiveOptions.apiKey.substring(0, 10) + "..."
108
117
  : "none",
109
- baseUrl: apiOptions.baseUrl || "default",
118
+ baseUrl: effectiveOptions.baseUrl || "default",
110
119
  });
111
120
 
112
- const models = await getUserModels(apiOptions);
121
+ const models = await getUserModels(effectiveOptions);
113
122
  console.log("[useModelManagement] Got user models:", models);
114
123
  setUserModels(models);
115
124
  } catch (err) {
@@ -127,7 +136,7 @@ export function useModelManagement(
127
136
  } finally {
128
137
  setLoading(false);
129
138
  }
130
- }, [apiOptions]);
139
+ }, [effectiveOptions]);
131
140
 
132
141
  const toggleModel = useCallback(
133
142
  async (modelId: string, isActive?: boolean) => {
@@ -138,7 +147,7 @@ export function useModelManagement(
138
147
  setLoading(true);
139
148
  setError(null);
140
149
 
141
- await toggleUserModel(modelId, targetState, apiOptions);
150
+ await toggleUserModel(modelId, targetState, effectiveOptions);
142
151
 
143
152
  // Mise à jour optimiste
144
153
  if (targetState) {
@@ -156,7 +165,7 @@ export function useModelManagement(
156
165
  setLoading(false);
157
166
  }
158
167
  },
159
- [userModels, apiOptions]
168
+ [userModels, effectiveOptions]
160
169
  );
161
170
 
162
171
  // Helpers
@@ -178,24 +187,24 @@ export function useModelManagement(
178
187
  // Auto-fetch au mount - si autoFetch ET (apiKey OU baseUrl avec proxy externe)
179
188
  useEffect(() => {
180
189
  const isExternalProxy =
181
- apiOptions.baseUrl && apiOptions.baseUrl.includes("/api/lastbrain");
190
+ effectiveOptions.baseUrl && effectiveOptions.baseUrl.includes("/api/lastbrain");
182
191
 
183
192
  console.log("[useModelManagement] useEffect triggered:", {
184
193
  autoFetch,
185
- hasApiKey: !!apiOptions.apiKey,
186
- hasBaseUrl: !!apiOptions.baseUrl,
194
+ hasApiKey: !!effectiveOptions.apiKey,
195
+ hasBaseUrl: !!effectiveOptions.baseUrl,
187
196
  isExternalProxy,
188
- apiKeyPreview: apiOptions.apiKey
189
- ? apiOptions.apiKey.substring(0, 10) + "..."
197
+ apiKeyPreview: effectiveOptions.apiKey
198
+ ? effectiveOptions.apiKey.substring(0, 10) + "..."
190
199
  : "none",
191
- baseUrl: apiOptions.baseUrl || "none",
200
+ baseUrl: effectiveOptions.baseUrl || "none",
192
201
  });
193
202
 
194
203
  // Auto-fetch si autoFetch est activé ET qu'on a soit une apiKey soit un proxy externe
195
- if (autoFetch && (apiOptions.apiKey || isExternalProxy)) {
204
+ if (autoFetch && (effectiveOptions.apiKey || isExternalProxy)) {
196
205
  console.log("[useModelManagement] Starting auto-fetch...");
197
206
  Promise.all([refreshModels(), refreshUserModels()]);
198
- } else if (autoFetch && !apiOptions.apiKey && !isExternalProxy) {
207
+ } else if (autoFetch && !effectiveOptions.apiKey && !isExternalProxy) {
199
208
  console.warn(
200
209
  "[useModelManagement] autoFetch is enabled but no apiKey or baseUrl provided. Skipping automatic fetch."
201
210
  );
@@ -204,8 +213,8 @@ export function useModelManagement(
204
213
  autoFetch,
205
214
  refreshModels,
206
215
  refreshUserModels,
207
- apiOptions.apiKey,
208
- apiOptions.baseUrl,
216
+ effectiveOptions.apiKey,
217
+ effectiveOptions.baseUrl,
209
218
  ]);
210
219
 
211
220
  return {