@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.
- package/dist/components/AiPromptPanel.d.ts.map +1 -1
- package/dist/components/AiPromptPanel.js +3 -1
- package/dist/hooks/useModelManagement.d.ts.map +1 -1
- package/dist/hooks/useModelManagement.js +30 -22
- package/package.json +1 -1
- package/src/components/AiPromptPanel.tsx +3 -1
- package/src/hooks/useModelManagement.ts +31 -22
|
@@ -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,
|
|
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 &&
|
|
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":"
|
|
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:
|
|
18
|
-
?
|
|
25
|
+
apiKey: effectiveOptions.apiKey
|
|
26
|
+
? effectiveOptions.apiKey.substring(0, 10) + "..."
|
|
19
27
|
: "none",
|
|
20
|
-
baseUrl:
|
|
28
|
+
baseUrl: effectiveOptions.baseUrl || "default",
|
|
21
29
|
});
|
|
22
|
-
const models = await getAvailableModels(
|
|
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,
|
|
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:
|
|
49
|
-
?
|
|
56
|
+
apiKey: effectiveOptions.apiKey
|
|
57
|
+
? effectiveOptions.apiKey.substring(0, 10) + "..."
|
|
50
58
|
: "none",
|
|
51
|
-
baseUrl:
|
|
59
|
+
baseUrl: effectiveOptions.baseUrl || "default",
|
|
52
60
|
});
|
|
53
|
-
const models = await getUserModels(
|
|
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
|
-
}, [
|
|
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,
|
|
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,
|
|
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 =
|
|
116
|
+
const isExternalProxy = effectiveOptions.baseUrl && effectiveOptions.baseUrl.includes("/api/lastbrain");
|
|
109
117
|
console.log("[useModelManagement] useEffect triggered:", {
|
|
110
118
|
autoFetch,
|
|
111
|
-
hasApiKey: !!
|
|
112
|
-
hasBaseUrl: !!
|
|
119
|
+
hasApiKey: !!effectiveOptions.apiKey,
|
|
120
|
+
hasBaseUrl: !!effectiveOptions.baseUrl,
|
|
113
121
|
isExternalProxy,
|
|
114
|
-
apiKeyPreview:
|
|
115
|
-
?
|
|
122
|
+
apiKeyPreview: effectiveOptions.apiKey
|
|
123
|
+
? effectiveOptions.apiKey.substring(0, 10) + "..."
|
|
116
124
|
: "none",
|
|
117
|
-
baseUrl:
|
|
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 && (
|
|
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 && !
|
|
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
|
-
|
|
132
|
-
|
|
139
|
+
effectiveOptions.apiKey,
|
|
140
|
+
effectiveOptions.baseUrl,
|
|
133
141
|
]);
|
|
134
142
|
return {
|
|
135
143
|
availableModels,
|
package/package.json
CHANGED
|
@@ -102,7 +102,9 @@ export function AiPromptPanel({
|
|
|
102
102
|
baseUrl,
|
|
103
103
|
category: "text", // Par défaut pour AiPromptPanel
|
|
104
104
|
autoFetch:
|
|
105
|
-
enableModelManagement &&
|
|
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:
|
|
65
|
-
?
|
|
73
|
+
apiKey: effectiveOptions.apiKey
|
|
74
|
+
? effectiveOptions.apiKey.substring(0, 10) + "..."
|
|
66
75
|
: "none",
|
|
67
|
-
baseUrl:
|
|
76
|
+
baseUrl: effectiveOptions.baseUrl || "default",
|
|
68
77
|
}
|
|
69
78
|
);
|
|
70
79
|
|
|
71
|
-
const models = await getAvailableModels(
|
|
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,
|
|
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:
|
|
107
|
-
?
|
|
115
|
+
apiKey: effectiveOptions.apiKey
|
|
116
|
+
? effectiveOptions.apiKey.substring(0, 10) + "..."
|
|
108
117
|
: "none",
|
|
109
|
-
baseUrl:
|
|
118
|
+
baseUrl: effectiveOptions.baseUrl || "default",
|
|
110
119
|
});
|
|
111
120
|
|
|
112
|
-
const models = await getUserModels(
|
|
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
|
-
}, [
|
|
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,
|
|
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,
|
|
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
|
-
|
|
190
|
+
effectiveOptions.baseUrl && effectiveOptions.baseUrl.includes("/api/lastbrain");
|
|
182
191
|
|
|
183
192
|
console.log("[useModelManagement] useEffect triggered:", {
|
|
184
193
|
autoFetch,
|
|
185
|
-
hasApiKey: !!
|
|
186
|
-
hasBaseUrl: !!
|
|
194
|
+
hasApiKey: !!effectiveOptions.apiKey,
|
|
195
|
+
hasBaseUrl: !!effectiveOptions.baseUrl,
|
|
187
196
|
isExternalProxy,
|
|
188
|
-
apiKeyPreview:
|
|
189
|
-
?
|
|
197
|
+
apiKeyPreview: effectiveOptions.apiKey
|
|
198
|
+
? effectiveOptions.apiKey.substring(0, 10) + "..."
|
|
190
199
|
: "none",
|
|
191
|
-
baseUrl:
|
|
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 && (
|
|
204
|
+
if (autoFetch && (effectiveOptions.apiKey || isExternalProxy)) {
|
|
196
205
|
console.log("[useModelManagement] Starting auto-fetch...");
|
|
197
206
|
Promise.all([refreshModels(), refreshUserModels()]);
|
|
198
|
-
} else if (autoFetch && !
|
|
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
|
-
|
|
208
|
-
|
|
216
|
+
effectiveOptions.apiKey,
|
|
217
|
+
effectiveOptions.baseUrl,
|
|
209
218
|
]);
|
|
210
219
|
|
|
211
220
|
return {
|