@anvaka/vue-llm 0.1.1 → 0.1.2
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/core/LLMClient.js +4 -4
- package/dist/providers/AnthropicProvider.js +1 -1
- package/dist/providers/CustomProvider.js +1 -1
- package/dist/providers/GeminiProvider.js +1 -1
- package/dist/providers/GrokProvider.js +1 -1
- package/dist/providers/LlamaServerProvider.js +1 -1
- package/dist/providers/OllamaProvider.js +1 -1
- package/dist/providers/OpenAIProvider.js +1 -1
- package/dist/providers/OpenRouterProvider.js +1 -1
- package/dist/vue/components/LLMConfigModal.vue.js +94 -90
- package/dist/vue-llm.css +1 -1
- package/package.json +1 -1
package/dist/core/LLMClient.js
CHANGED
|
@@ -25,7 +25,7 @@ class A {
|
|
|
25
25
|
], n = this.validateCapabilities({
|
|
26
26
|
model: this.config.model,
|
|
27
27
|
enableThinking: !1,
|
|
28
|
-
temperature: 0.1,
|
|
28
|
+
temperature: t.temperature ?? 0.1,
|
|
29
29
|
maxTokens: 10,
|
|
30
30
|
stream: !1
|
|
31
31
|
}), o = this.provider.prepareRequest(e, n), a = await this.provider.makeRequest(o);
|
|
@@ -66,7 +66,7 @@ class A {
|
|
|
66
66
|
{ role: "user", content: "ping" }
|
|
67
67
|
], s = this.validateCapabilities({
|
|
68
68
|
model: this.config.model,
|
|
69
|
-
temperature: 0.1,
|
|
69
|
+
temperature: this.config.temperature ?? 0.1,
|
|
70
70
|
maxTokens: 10,
|
|
71
71
|
stream: !1
|
|
72
72
|
}), i = this.provider.prepareRequest(t, s), r = await this.provider.makeRequest(i);
|
|
@@ -218,8 +218,8 @@ class S {
|
|
|
218
218
|
let a = "", h = null, u = 0;
|
|
219
219
|
try {
|
|
220
220
|
return await i.streamRequest(t, s, (l) => {
|
|
221
|
-
var
|
|
222
|
-
l.content && (a = l.fullContent, (
|
|
221
|
+
var x, C, R;
|
|
222
|
+
l.content && (a = l.fullContent, (x = e.setText) == null || x.call(e, a)), (C = l.usage) != null && C.tokens && (u += l.usage.tokens), l.finishReason && (h = l.finishReason), l.done && ((R = e.setStreamingState) == null || R.call(e, !1), e._activeRequestId = null);
|
|
223
223
|
}), (g = e.addLLMLog) == null || g.call(e, (this.operationName || "streaming-request") + "-response", { requestId: s.requestId }, { content: a, usage: { tokens: u } }), h === "length" ? ((d = e.setAttribute) == null || d.call(e, "_truncated", !0), (v = e.addLog) == null || v.call(e, "Response truncated. Increase Max Tokens.", "warn", { finish_reason: "length" })) : (b = e.setAttribute) == null || b.call(e, "_truncated", !1), await ((_ = e.persistNow) == null ? void 0 : _.call(e)), e;
|
|
224
224
|
} catch (l) {
|
|
225
225
|
throw (w = e.addLLMLog) == null || w.call(e, (this.operationName || "streaming-request") + "-error", { requestId: s.requestId }, null, l), (y = e.setStreamingState) == null || y.call(e, !1), e._activeRequestId = null, (k = e.setText) == null || k.call(e, `Error: ${l.message}`), (T = e.setAttribute) == null || T.call(e, "_truncated", !1), await ((q = e.persistNow) == null ? void 0 : q.call(e)), l;
|
|
@@ -8,7 +8,7 @@ class d extends c {
|
|
|
8
8
|
const n = {
|
|
9
9
|
model: t.model || this.config.model || "claude-3-sonnet-20240229",
|
|
10
10
|
max_tokens: t.maxTokens || 1e3,
|
|
11
|
-
temperature: t.temperature
|
|
11
|
+
temperature: t.temperature ?? 0.7,
|
|
12
12
|
messages: e.filter((s) => s.role !== "system"),
|
|
13
13
|
stream: t.stream || !1
|
|
14
14
|
}, r = e.find((s) => s.role === "system");
|
|
@@ -7,7 +7,7 @@ class _ extends A {
|
|
|
7
7
|
const n = this.processMessages(e, t), s = {
|
|
8
8
|
contents: this.convertToGeminiFormat(n),
|
|
9
9
|
generationConfig: {
|
|
10
|
-
temperature: t.temperature
|
|
10
|
+
temperature: t.temperature ?? this.config.temperature ?? 0.7,
|
|
11
11
|
maxOutputTokens: t.maxTokens || this.config.maxTokens || 1e3,
|
|
12
12
|
topP: 0.8,
|
|
13
13
|
topK: 10
|
|
@@ -9,7 +9,7 @@ class u extends c {
|
|
|
9
9
|
const s = {
|
|
10
10
|
model: t.model || this.config.model || "grok-beta",
|
|
11
11
|
messages: this.processMessages(e, t),
|
|
12
|
-
temperature: t.temperature
|
|
12
|
+
temperature: t.temperature ?? 0.7,
|
|
13
13
|
max_tokens: t.maxTokens || 1e3,
|
|
14
14
|
stream: t.stream || !1
|
|
15
15
|
};
|
|
@@ -26,7 +26,7 @@ class l extends r {
|
|
|
26
26
|
messages: this.processMessages(e, t),
|
|
27
27
|
stream: t.stream || !1,
|
|
28
28
|
think: t.enableThinking || !1,
|
|
29
|
-
options: { temperature: t.temperature
|
|
29
|
+
options: { temperature: t.temperature ?? 0.7, num_predict: t.maxTokens || 1e3 }
|
|
30
30
|
};
|
|
31
31
|
return t.enableThinking && this.capabilities.has("thinking") && (n.options.enable_thinking = !0), n;
|
|
32
32
|
}
|
|
@@ -20,7 +20,7 @@ class k extends m {
|
|
|
20
20
|
const i = e.model || this.config.model || "gpt-3.5-turbo", s = {
|
|
21
21
|
model: i,
|
|
22
22
|
messages: this.processMessages(t, e),
|
|
23
|
-
temperature: e.temperature
|
|
23
|
+
temperature: e.temperature ?? 0.7,
|
|
24
24
|
stream: e.stream || !1
|
|
25
25
|
};
|
|
26
26
|
return g(this, c, d).call(this, i) ? (s.max_completion_tokens = e.maxTokens || 1e3, s.temperature = 1) : s.max_tokens = e.maxTokens || 1e3, e.enableThinking && this.capabilities.has("thinking") && (s.reasoning_effort = e.reasoningEffort || "medium"), e.tools && this.capabilities.has("tools") && (s.tools = e.tools), s;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ref as u, computed as L, watch as G, onMounted as Ne, onUnmounted as Je, createElementBlock as o, createCommentVNode as r, openBlock as n, createElementVNode as s, withModifiers as J, createTextVNode as R, toDisplayString as d, withDirectives as
|
|
1
|
+
import { ref as u, computed as L, watch as G, onMounted as Ne, onUnmounted as Je, createElementBlock as o, createCommentVNode as r, openBlock as n, createElementVNode as s, withModifiers as J, createTextVNode as R, toDisplayString as d, withDirectives as y, Fragment as S, renderList as z, unref as re, vModelSelect as ue, vModelText as I, vModelCheckbox as Re, normalizeClass as Y, createVNode as je, nextTick as qe } from "vue";
|
|
2
2
|
import { useLLM as Oe, createDefaultConfig as de } from "../useLLM.js";
|
|
3
3
|
import { DEFAULT_CONFIGS as Be, createProvider as We } from "../../providers/factory.js";
|
|
4
4
|
import Ge from "./StoredKeysManager.vue.js";
|
|
@@ -31,7 +31,7 @@ const Ye = { class: "llm-modal-header" }, He = { key: 0 }, Qe = { class: "llm-mo
|
|
|
31
31
|
}, Ul = { class: "llm-provider-details-row" }, Al = ["onClick", "disabled"], El = { class: "llm-provider-details" }, Ll = ["onClick", "title"], Il = ["onClick", "title"], xl = ["onClick"], Vl = ["onClick"], $l = {
|
|
32
32
|
key: 1,
|
|
33
33
|
class: "llm-empty-state"
|
|
34
|
-
}, Dl = { class: "llm-modal-footer" }, Fl = ["disabled"],
|
|
34
|
+
}, Dl = { class: "llm-modal-footer" }, Fl = ["disabled"], H = "judge-provider", Nl = {
|
|
35
35
|
__name: "LLMConfigModal",
|
|
36
36
|
props: {
|
|
37
37
|
isVisible: Boolean,
|
|
@@ -42,32 +42,32 @@ const Ye = { class: "llm-modal-header" }, He = { key: 0 }, Qe = { class: "llm-mo
|
|
|
42
42
|
},
|
|
43
43
|
emits: ["close", "configChanged"],
|
|
44
44
|
setup(x, { emit: ve }) {
|
|
45
|
-
const
|
|
45
|
+
const g = x, j = ve, V = Be, {
|
|
46
46
|
client: Jl,
|
|
47
47
|
configStore: Rl,
|
|
48
48
|
getEnabledConfigs: jl,
|
|
49
49
|
getAllConfigs: ce,
|
|
50
|
-
getActiveProviderId:
|
|
51
|
-
setActiveProviderId:
|
|
50
|
+
getActiveProviderId: Q,
|
|
51
|
+
setActiveProviderId: X,
|
|
52
52
|
saveConfig: me,
|
|
53
53
|
deleteConfig: fe,
|
|
54
54
|
enableProvider: be,
|
|
55
55
|
disableProvider: ge,
|
|
56
56
|
getAvailableModels: pe,
|
|
57
|
-
testConnection:
|
|
57
|
+
testConnection: Z,
|
|
58
58
|
refresh: $,
|
|
59
|
-
getStoredKey:
|
|
60
|
-
hasStoredKey:
|
|
59
|
+
getStoredKey: ee,
|
|
60
|
+
hasStoredKey: le,
|
|
61
61
|
getAllStoredKeys: ye,
|
|
62
62
|
storeKey: ql
|
|
63
|
-
} = Oe(), t = u(de("")), T = u([]), M = u(null),
|
|
63
|
+
} = Oe(), t = u(de("")), T = u([]), M = u(null), k = u(null), v = u(!1), f = u(null), K = u(!1), c = u(null), U = u([]), _ = u(!1), h = u(null), C = u(/* @__PURE__ */ new Map()), q = u(!1), te = u(0), P = u(null), A = L(
|
|
64
64
|
() => t.value.provider ? V[t.value.provider] : null
|
|
65
|
-
),
|
|
65
|
+
), b = u(/* @__PURE__ */ new Set()), ke = L(() => t.value.model && b.value.has("thinking")), D = L(() => {
|
|
66
66
|
var e, i;
|
|
67
67
|
if (!((e = t.value) != null && e.provider) || !((i = t.value) != null && i.model) || t.value.provider !== "openai") return !1;
|
|
68
68
|
const l = String(t.value.model).toLowerCase();
|
|
69
|
-
return
|
|
70
|
-
}), he = L(() =>
|
|
69
|
+
return b.value.has("thinking") || l.startsWith("o1") || l.startsWith("o2") || l.startsWith("o3") || l.startsWith("o-") || l.includes("gpt-5") || l === "gpt5" || l.includes("reasoning");
|
|
70
|
+
}), he = L(() => te.value > 0), se = L(() => {
|
|
71
71
|
var l;
|
|
72
72
|
return !(!t.value.name || !t.value.provider || !t.value.baseUrl || (l = A.value) != null && l.requiresApiKey && !t.value.apiKey);
|
|
73
73
|
}), Ce = (l) => {
|
|
@@ -82,23 +82,23 @@ const Ye = { class: "llm-modal-header" }, He = { key: 0 }, Qe = { class: "llm-mo
|
|
|
82
82
|
"llm-test-default": !e || e === "default"
|
|
83
83
|
};
|
|
84
84
|
}, F = () => {
|
|
85
|
-
if (T.value = ce(), M.value =
|
|
85
|
+
if (T.value = ce(), M.value = Q() || "", g.showJudge)
|
|
86
86
|
try {
|
|
87
|
-
|
|
87
|
+
k.value = localStorage.getItem("llm:" + H) || null;
|
|
88
88
|
} catch {
|
|
89
|
-
|
|
89
|
+
k.value = null;
|
|
90
90
|
}
|
|
91
91
|
}, O = () => {
|
|
92
92
|
const l = ye();
|
|
93
|
-
|
|
93
|
+
te.value = Object.keys(l).length;
|
|
94
94
|
}, Pe = async () => {
|
|
95
95
|
const l = A.value;
|
|
96
96
|
if (l) {
|
|
97
|
-
t.value.baseUrl = l.baseUrl, t.value.model = "", t.value.enableThinking = !1,
|
|
98
|
-
const e =
|
|
97
|
+
t.value.baseUrl = l.baseUrl, t.value.model = "", t.value.enableThinking = !1, b.value.clear(), f.value || (t.value.name = "");
|
|
98
|
+
const e = ee(t.value.provider);
|
|
99
99
|
e && !t.value.apiKey && (t.value.apiKey = e), await B();
|
|
100
100
|
}
|
|
101
|
-
|
|
101
|
+
c.value = null, h.value = null;
|
|
102
102
|
}, B = async () => {
|
|
103
103
|
if (!t.value.provider || !t.value.baseUrl) {
|
|
104
104
|
U.value = [], h.value = null;
|
|
@@ -115,14 +115,14 @@ const Ye = { class: "llm-modal-header" }, He = { key: 0 }, Qe = { class: "llm-mo
|
|
|
115
115
|
}
|
|
116
116
|
}, W = async () => {
|
|
117
117
|
if (!t.value.provider || !t.value.model) {
|
|
118
|
-
|
|
118
|
+
b.value.clear();
|
|
119
119
|
return;
|
|
120
120
|
}
|
|
121
121
|
try {
|
|
122
122
|
const l = { ...t.value }, e = We(l.provider, l);
|
|
123
|
-
await e.initialize(),
|
|
123
|
+
await e.initialize(), b.value = new Set(e.capabilities), b.value.has("thinking") || (t.value.enableThinking = !1);
|
|
124
124
|
} catch (l) {
|
|
125
|
-
console.warn("Failed to detect model capabilities:", l),
|
|
125
|
+
console.warn("Failed to detect model capabilities:", l), b.value.clear();
|
|
126
126
|
}
|
|
127
127
|
}, we = () => `provider_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`, Se = () => {
|
|
128
128
|
if (!t.value.provider) return "";
|
|
@@ -132,52 +132,52 @@ const Ye = { class: "llm-modal-header" }, He = { key: 0 }, Qe = { class: "llm-mo
|
|
|
132
132
|
if (!t.value.provider || !t.value.model) return "";
|
|
133
133
|
const l = V[t.value.provider], e = (l == null ? void 0 : l.name) || "Provider";
|
|
134
134
|
let i = t.value.model;
|
|
135
|
-
return i.includes("/") && (i = i.split("/").pop()), i = i.replace(/-(instruct|chat|base|completion)$/i, "").replace(/^(gpt-|claude-|llama-|gemini-)/i, "").replace(/-vision$/, "").replace(/-\d+b?$/i, ""), i = i.split("-").map((
|
|
135
|
+
return i.includes("/") && (i = i.split("/").pop()), i = i.replace(/-(instruct|chat|base|completion)$/i, "").replace(/^(gpt-|claude-|llama-|gemini-)/i, "").replace(/-vision$/, "").replace(/-\d+b?$/i, ""), i = i.split("-").map((m) => m.charAt(0).toUpperCase() + m.slice(1)).join(" ").substring(0, 20), `${e} ${i}`.trim();
|
|
136
136
|
}, Me = async () => {
|
|
137
|
-
if (
|
|
138
|
-
K.value = !0,
|
|
137
|
+
if (se.value) {
|
|
138
|
+
K.value = !0, c.value = null;
|
|
139
139
|
try {
|
|
140
|
-
await
|
|
141
|
-
const l = v.value &&
|
|
142
|
-
me(l, t.value) ? (
|
|
140
|
+
await Z(t.value);
|
|
141
|
+
const l = v.value && f.value ? f.value : we();
|
|
142
|
+
me(l, t.value) ? (Q() || (X(l), M.value = l), await $(), c.value = {
|
|
143
143
|
success: !0,
|
|
144
144
|
message: v.value ? "Provider updated!" : "Provider added!"
|
|
145
|
-
}, F(), w(), E(), setTimeout(() => j("close"), 1500)) :
|
|
145
|
+
}, F(), w(), E(), setTimeout(() => j("close"), 1500)) : c.value = { success: !1, message: "Failed to save configuration." };
|
|
146
146
|
} catch (l) {
|
|
147
|
-
console.error("LLM connection test failed:", l),
|
|
147
|
+
console.error("LLM connection test failed:", l), c.value = { success: !1, message: `Connection failed: ${l.message}` };
|
|
148
148
|
} finally {
|
|
149
149
|
K.value = !1;
|
|
150
150
|
}
|
|
151
151
|
}
|
|
152
152
|
}, Ke = (l) => {
|
|
153
|
-
|
|
153
|
+
X(l) && (M.value = l, $(), E());
|
|
154
154
|
}, Ue = async (l) => {
|
|
155
155
|
C.value.set(l.id, "testing");
|
|
156
156
|
try {
|
|
157
|
-
await
|
|
157
|
+
await Z(l), C.value.set(l.id, "success"), setTimeout(() => C.value.set(l.id, "default"), 3e3);
|
|
158
158
|
} catch (e) {
|
|
159
159
|
console.error("LLM connection test failed:", e), C.value.set(l.id, "failed"), setTimeout(() => C.value.set(l.id, "default"), 5e3);
|
|
160
160
|
}
|
|
161
|
-
},
|
|
161
|
+
}, ae = (l) => {
|
|
162
162
|
var e;
|
|
163
|
-
t.value = { ...l }, v.value = !0,
|
|
163
|
+
t.value = { ...l }, v.value = !0, f.value = l.id, c.value = null, B().then(() => {
|
|
164
164
|
t.value.model && W();
|
|
165
|
-
}), (e =
|
|
166
|
-
var i,
|
|
167
|
-
|
|
165
|
+
}), (e = g.editTarget) != null && e.focusField && qe(() => {
|
|
166
|
+
var i, m;
|
|
167
|
+
g.editTarget.focusField === "maxTokens" && (P != null && P.value) && (P.value.focus(), (m = (i = P.value).select) == null || m.call(i));
|
|
168
168
|
});
|
|
169
169
|
}, Ae = () => {
|
|
170
|
-
w(), v.value = !0,
|
|
170
|
+
w(), v.value = !0, f.value = null;
|
|
171
171
|
}, Ee = () => w(), Le = (l) => {
|
|
172
|
-
confirm("Are you sure you want to delete this provider?") && fe(l) && (F(), l ===
|
|
172
|
+
confirm("Are you sure you want to delete this provider?") && fe(l) && (F(), l === f.value && w(), $(), E());
|
|
173
173
|
}, Ie = (l) => {
|
|
174
174
|
(l.enabled !== !1 ? ge(l.id) : be(l.id)) && (F(), $(), E());
|
|
175
175
|
}, w = () => {
|
|
176
|
-
t.value = de(""), v.value = !1,
|
|
176
|
+
t.value = de(""), v.value = !1, f.value = null, c.value = null, U.value = [], h.value = null, b.value.clear();
|
|
177
177
|
}, N = () => {
|
|
178
178
|
w(), j("close");
|
|
179
|
-
},
|
|
180
|
-
|
|
179
|
+
}, oe = (l) => {
|
|
180
|
+
g.isVisible && l.key === "Escape" && (l.preventDefault(), N());
|
|
181
181
|
}, E = () => {
|
|
182
182
|
j("configChanged");
|
|
183
183
|
try {
|
|
@@ -185,47 +185,47 @@ const Ye = { class: "llm-modal-header" }, He = { key: 0 }, Qe = { class: "llm-mo
|
|
|
185
185
|
} catch {
|
|
186
186
|
}
|
|
187
187
|
};
|
|
188
|
-
G(() =>
|
|
188
|
+
G(() => g.isVisible, (l) => {
|
|
189
189
|
var e;
|
|
190
|
-
if (l && (F(), O(), w(), (e =
|
|
191
|
-
const i = T.value.find((
|
|
192
|
-
i &&
|
|
190
|
+
if (l && (F(), O(), w(), (e = g.editTarget) != null && e.name && T.value.length > 0)) {
|
|
191
|
+
const i = T.value.find((m) => m.name === g.editTarget.name);
|
|
192
|
+
i && ae(i);
|
|
193
193
|
}
|
|
194
194
|
}), G(() => t.value.model, (l) => {
|
|
195
195
|
if (l) {
|
|
196
|
-
if (W(), !
|
|
196
|
+
if (W(), !f.value) {
|
|
197
197
|
const e = Te();
|
|
198
198
|
e && (t.value.name = e);
|
|
199
199
|
}
|
|
200
200
|
D.value && (t.value.temperature = 1);
|
|
201
201
|
} else
|
|
202
|
-
|
|
202
|
+
b.value.clear(), t.value.enableThinking = !1;
|
|
203
203
|
}), G(() => t.value.temperature, (l) => {
|
|
204
204
|
D.value && l !== 1 && (t.value.temperature = 1);
|
|
205
205
|
});
|
|
206
206
|
const xe = () => {
|
|
207
207
|
q.value = !0;
|
|
208
|
-
},
|
|
208
|
+
}, ne = () => {
|
|
209
209
|
q.value = !1;
|
|
210
210
|
}, Ve = () => {
|
|
211
211
|
O();
|
|
212
|
-
}, $e = () => t.value.provider === "custom" ? "Enter your API key (optional)" :
|
|
213
|
-
const l =
|
|
212
|
+
}, $e = () => t.value.provider === "custom" ? "Enter your API key (optional)" : le(t.value.provider) ? "Using stored key (or enter new)" : "Enter your API key", De = () => {
|
|
213
|
+
const l = ee(t.value.provider);
|
|
214
214
|
l && (t.value.apiKey = l);
|
|
215
215
|
}, Fe = (l) => {
|
|
216
|
-
if (!
|
|
217
|
-
const e = l.id ===
|
|
216
|
+
if (!g.showJudge) return;
|
|
217
|
+
const e = l.id === k.value ? null : l.id;
|
|
218
218
|
try {
|
|
219
|
-
e ? localStorage.setItem("llm:" +
|
|
219
|
+
e ? localStorage.setItem("llm:" + H, e) : localStorage.removeItem("llm:" + H), k.value = e, E();
|
|
220
220
|
} catch {
|
|
221
221
|
}
|
|
222
222
|
};
|
|
223
223
|
return Ne(() => {
|
|
224
|
-
document.addEventListener("keydown",
|
|
224
|
+
document.addEventListener("keydown", oe), O();
|
|
225
225
|
}), Je(() => {
|
|
226
|
-
document.removeEventListener("keydown",
|
|
226
|
+
document.removeEventListener("keydown", oe);
|
|
227
227
|
}), (l, e) => {
|
|
228
|
-
var i,
|
|
228
|
+
var i, m, ie;
|
|
229
229
|
return x.isVisible ? (n(), o("div", {
|
|
230
230
|
key: 0,
|
|
231
231
|
class: "llm-modal-overlay",
|
|
@@ -239,7 +239,7 @@ const Ye = { class: "llm-modal-header" }, He = { key: 0 }, Qe = { class: "llm-mo
|
|
|
239
239
|
s("div", Ye, [
|
|
240
240
|
s("h2", null, [
|
|
241
241
|
e[12] || (e[12] = R(" Manage LLM Providers ", -1)),
|
|
242
|
-
v.value ? (n(), o("span", He, d(
|
|
242
|
+
v.value ? (n(), o("span", He, d(f.value ? " - Edit" : " - Add"), 1)) : r("", !0)
|
|
243
243
|
]),
|
|
244
244
|
s("button", {
|
|
245
245
|
class: "llm-btn llm-btn--ghost llm-btn--sm llm-close-btn",
|
|
@@ -250,22 +250,22 @@ const Ye = { class: "llm-modal-header" }, He = { key: 0 }, Qe = { class: "llm-mo
|
|
|
250
250
|
v.value ? (n(), o("div", Xe, [
|
|
251
251
|
s("div", Ze, [
|
|
252
252
|
e[22] || (e[22] = s("label", { class: "llm-field-label" }, "Provider Type:", -1)),
|
|
253
|
-
|
|
253
|
+
y(s("select", {
|
|
254
254
|
"onUpdate:modelValue": e[0] || (e[0] = (a) => t.value.provider = a),
|
|
255
255
|
onChange: Pe,
|
|
256
256
|
class: "llm-form-control"
|
|
257
257
|
}, [
|
|
258
258
|
e[13] || (e[13] = s("option", { value: "" }, "Select a provider...", -1)),
|
|
259
|
-
(n(!0), o(S, null, z(
|
|
260
|
-
key:
|
|
261
|
-
value:
|
|
259
|
+
(n(!0), o(S, null, z(re(V), (a, p) => (n(), o("option", {
|
|
260
|
+
key: p,
|
|
261
|
+
value: p
|
|
262
262
|
}, d(a.name), 9, el))), 128))
|
|
263
263
|
], 544), [
|
|
264
|
-
[
|
|
264
|
+
[ue, t.value.provider]
|
|
265
265
|
]),
|
|
266
266
|
t.value.provider ? (n(), o(S, { key: 0 }, [
|
|
267
267
|
e[14] || (e[14] = s("label", { class: "llm-field-label" }, "Provider Name:", -1)),
|
|
268
|
-
|
|
268
|
+
y(s("input", {
|
|
269
269
|
"onUpdate:modelValue": e[1] || (e[1] = (a) => t.value.name = a),
|
|
270
270
|
type: "text",
|
|
271
271
|
placeholder: Se(),
|
|
@@ -277,7 +277,7 @@ const Ye = { class: "llm-modal-header" }, He = { key: 0 }, Qe = { class: "llm-mo
|
|
|
277
277
|
], 64)) : r("", !0),
|
|
278
278
|
t.value.provider ? (n(), o(S, { key: 1 }, [
|
|
279
279
|
e[18] || (e[18] = s("label", { class: "llm-field-label" }, "Base URL:", -1)),
|
|
280
|
-
|
|
280
|
+
y(s("input", {
|
|
281
281
|
"onUpdate:modelValue": e[2] || (e[2] = (a) => t.value.baseUrl = a),
|
|
282
282
|
type: "url",
|
|
283
283
|
placeholder: (i = A.value) == null ? void 0 : i.baseUrl,
|
|
@@ -286,20 +286,20 @@ const Ye = { class: "llm-modal-header" }, He = { key: 0 }, Qe = { class: "llm-mo
|
|
|
286
286
|
}, null, 8, tl), [
|
|
287
287
|
[I, t.value.baseUrl]
|
|
288
288
|
]),
|
|
289
|
-
(
|
|
289
|
+
(m = A.value) != null && m.requiresApiKey || t.value.provider === "custom" ? (n(), o(S, { key: 0 }, [
|
|
290
290
|
e[16] || (e[16] = s("label", { class: "llm-field-label" }, "API Key:", -1)),
|
|
291
291
|
s("div", sl, [
|
|
292
292
|
s("div", al, [
|
|
293
|
-
|
|
293
|
+
y(s("input", {
|
|
294
294
|
"onUpdate:modelValue": e[3] || (e[3] = (a) => t.value.apiKey = a),
|
|
295
295
|
type: "password",
|
|
296
296
|
placeholder: $e(),
|
|
297
297
|
class: "llm-form-control",
|
|
298
|
-
required: (
|
|
298
|
+
required: (ie = A.value) == null ? void 0 : ie.requiresApiKey
|
|
299
299
|
}, null, 8, ol), [
|
|
300
300
|
[I, t.value.apiKey]
|
|
301
301
|
]),
|
|
302
|
-
|
|
302
|
+
re(le)(t.value.provider) ? (n(), o("button", {
|
|
303
303
|
key: 0,
|
|
304
304
|
type: "button",
|
|
305
305
|
class: "llm-btn llm-btn--ghost llm-btn--sm",
|
|
@@ -315,7 +315,7 @@ const Ye = { class: "llm-modal-header" }, He = { key: 0 }, Qe = { class: "llm-mo
|
|
|
315
315
|
], 64)) : r("", !0),
|
|
316
316
|
e[19] || (e[19] = s("label", { class: "llm-field-label" }, "Model:", -1)),
|
|
317
317
|
s("div", rl, [
|
|
318
|
-
|
|
318
|
+
y(s("select", {
|
|
319
319
|
"onUpdate:modelValue": e[4] || (e[4] = (a) => t.value.model = a),
|
|
320
320
|
disabled: _.value,
|
|
321
321
|
class: "llm-form-control"
|
|
@@ -326,7 +326,7 @@ const Ye = { class: "llm-modal-header" }, He = { key: 0 }, Qe = { class: "llm-mo
|
|
|
326
326
|
value: a
|
|
327
327
|
}, d(a), 9, vl))), 128))
|
|
328
328
|
], 8, ul), [
|
|
329
|
-
[
|
|
329
|
+
[ue, t.value.model]
|
|
330
330
|
]),
|
|
331
331
|
s("button", {
|
|
332
332
|
class: "llm-btn llm-btn--ghost llm-btn--sm llm-refresh-btn",
|
|
@@ -337,7 +337,7 @@ const Ye = { class: "llm-modal-header" }, He = { key: 0 }, Qe = { class: "llm-mo
|
|
|
337
337
|
h.value ? (n(), o("div", ml, d(h.value), 1)) : r("", !0),
|
|
338
338
|
ke.value ? (n(), o("div", fl, [
|
|
339
339
|
s("label", bl, [
|
|
340
|
-
|
|
340
|
+
y(s("input", {
|
|
341
341
|
type: "checkbox",
|
|
342
342
|
"onUpdate:modelValue": e[5] || (e[5] = (a) => t.value.enableThinking = a),
|
|
343
343
|
class: "llm-checkbox"
|
|
@@ -350,7 +350,7 @@ const Ye = { class: "llm-modal-header" }, He = { key: 0 }, Qe = { class: "llm-mo
|
|
|
350
350
|
]),
|
|
351
351
|
e[20] || (e[20] = s("label", { class: "llm-field-label" }, "Temperature:", -1)),
|
|
352
352
|
s("div", gl, [
|
|
353
|
-
|
|
353
|
+
y(s("input", {
|
|
354
354
|
"onUpdate:modelValue": e[6] || (e[6] = (a) => t.value.temperature = a),
|
|
355
355
|
type: "number",
|
|
356
356
|
min: "0",
|
|
@@ -369,7 +369,7 @@ const Ye = { class: "llm-modal-header" }, He = { key: 0 }, Qe = { class: "llm-mo
|
|
|
369
369
|
D.value ? (n(), o("small", kl, " This model uses a fixed temperature of 1. ")) : (n(), o("small", yl, " Controls randomness: 0 = deterministic, 2 = very creative "))
|
|
370
370
|
]),
|
|
371
371
|
e[21] || (e[21] = s("label", { class: "llm-field-label" }, "Max Tokens:", -1)),
|
|
372
|
-
|
|
372
|
+
y(s("input", {
|
|
373
373
|
"onUpdate:modelValue": e[7] || (e[7] = (a) => t.value.maxTokens = a),
|
|
374
374
|
type: "number",
|
|
375
375
|
min: "1",
|
|
@@ -386,17 +386,21 @@ const Ye = { class: "llm-modal-header" }, He = { key: 0 }, Qe = { class: "llm-mo
|
|
|
386
386
|
]
|
|
387
387
|
])
|
|
388
388
|
], 64)) : r("", !0)
|
|
389
|
-
])
|
|
389
|
+
]),
|
|
390
|
+
c.value ? (n(), o("div", {
|
|
391
|
+
key: 0,
|
|
392
|
+
class: Y(["llm-test-result", c.value.success ? "llm-test-result--success" : "llm-test-result--error"])
|
|
393
|
+
}, d(c.value.message), 3)) : r("", !0)
|
|
390
394
|
])) : (n(), o("div", hl, [
|
|
391
395
|
T.value.length > 0 ? (n(), o("div", Cl, [
|
|
392
396
|
e[23] || (e[23] = s("h3", null, "Configured Providers", -1)),
|
|
393
397
|
(n(!0), o(S, null, z(T.value, (a) => (n(), o("div", {
|
|
394
398
|
key: a.id,
|
|
395
|
-
class:
|
|
399
|
+
class: Y(["llm-provider-item", {
|
|
396
400
|
active: a.id === M.value,
|
|
397
401
|
disabled: a.enabled === !1
|
|
398
402
|
}]),
|
|
399
|
-
onClick: (
|
|
403
|
+
onClick: (p) => a.enabled !== !1 ? Ke(a.id) : null
|
|
400
404
|
}, [
|
|
401
405
|
s("div", Pl, [
|
|
402
406
|
s("div", wl, [
|
|
@@ -405,12 +409,12 @@ const Ye = { class: "llm-modal-header" }, He = { key: 0 }, Qe = { class: "llm-mo
|
|
|
405
409
|
a.enabled === !1 ? (n(), o("span", Tl, "Disabled")) : r("", !0)
|
|
406
410
|
]),
|
|
407
411
|
a.id === M.value ? (n(), o("span", Ml, "Active")) : r("", !0),
|
|
408
|
-
x.showJudge && a.id ===
|
|
412
|
+
x.showJudge && a.id === k.value ? (n(), o("span", Kl, "Judge")) : r("", !0)
|
|
409
413
|
]),
|
|
410
414
|
s("div", Ul, [
|
|
411
415
|
s("button", {
|
|
412
|
-
class:
|
|
413
|
-
onClick: J((
|
|
416
|
+
class: Y(["llm-test-status-btn", _e(a.id)]),
|
|
417
|
+
onClick: J((p) => Ue(a), ["stop"]),
|
|
414
418
|
disabled: K.value
|
|
415
419
|
}, d(Ce(a.id)), 11, Al),
|
|
416
420
|
s("div", El, d(a.provider) + " • " + d(a.baseUrl), 1)
|
|
@@ -424,21 +428,21 @@ const Ye = { class: "llm-modal-header" }, He = { key: 0 }, Qe = { class: "llm-mo
|
|
|
424
428
|
x.showJudge && a.enabled !== !1 ? (n(), o("button", {
|
|
425
429
|
key: 0,
|
|
426
430
|
class: "llm-btn llm-btn--ghost llm-btn--sm",
|
|
427
|
-
onClick: (
|
|
428
|
-
title: a.id ===
|
|
429
|
-
}, d(a.id ===
|
|
431
|
+
onClick: (p) => Fe(a),
|
|
432
|
+
title: a.id === k.value ? "Unset as judge" : "Set as judge"
|
|
433
|
+
}, d(a.id === k.value ? "Unmark Judge" : "Mark Judge"), 9, Ll)) : r("", !0),
|
|
430
434
|
s("button", {
|
|
431
435
|
class: "llm-btn llm-btn--ghost llm-btn--sm",
|
|
432
|
-
onClick: (
|
|
436
|
+
onClick: (p) => Ie(a),
|
|
433
437
|
title: a.enabled === !1 ? "Enable provider" : "Disable provider"
|
|
434
438
|
}, d(a.enabled === !1 ? "Enable" : "Disable"), 9, Il),
|
|
435
439
|
s("button", {
|
|
436
440
|
class: "llm-btn llm-btn--ghost llm-btn--sm",
|
|
437
|
-
onClick: (
|
|
441
|
+
onClick: (p) => ae(a)
|
|
438
442
|
}, " Edit ", 8, xl),
|
|
439
443
|
s("button", {
|
|
440
444
|
class: "llm-btn llm-btn--sm llm-btn--danger",
|
|
441
|
-
onClick: (
|
|
445
|
+
onClick: (p) => Le(a.id)
|
|
442
446
|
}, " Delete ", 8, Vl)
|
|
443
447
|
])
|
|
444
448
|
], 10, _l))), 128))
|
|
@@ -451,7 +455,7 @@ const Ye = { class: "llm-modal-header" }, He = { key: 0 }, Qe = { class: "llm-mo
|
|
|
451
455
|
q.value ? (n(), o("div", {
|
|
452
456
|
key: 2,
|
|
453
457
|
class: "llm-keys-manager-overlay",
|
|
454
|
-
onClick:
|
|
458
|
+
onClick: ne
|
|
455
459
|
}, [
|
|
456
460
|
s("div", {
|
|
457
461
|
class: "llm-keys-manager-content",
|
|
@@ -459,7 +463,7 @@ const Ye = { class: "llm-modal-header" }, He = { key: 0 }, Qe = { class: "llm-mo
|
|
|
459
463
|
}, ["stop"]))
|
|
460
464
|
}, [
|
|
461
465
|
je(Ge, {
|
|
462
|
-
onClose:
|
|
466
|
+
onClose: ne,
|
|
463
467
|
onKeysUpdated: Ve
|
|
464
468
|
})
|
|
465
469
|
])
|
|
@@ -485,14 +489,14 @@ const Ye = { class: "llm-modal-header" }, He = { key: 0 }, Qe = { class: "llm-mo
|
|
|
485
489
|
key: 2,
|
|
486
490
|
class: "llm-btn llm-btn--primary",
|
|
487
491
|
onClick: Me,
|
|
488
|
-
disabled: !
|
|
492
|
+
disabled: !se.value || K.value
|
|
489
493
|
}, d(K.value ? "Testing..." : "Save"), 9, Fl)) : r("", !0)
|
|
490
494
|
])
|
|
491
495
|
])
|
|
492
496
|
])) : r("", !0);
|
|
493
497
|
};
|
|
494
498
|
}
|
|
495
|
-
}, Hl = /* @__PURE__ */ ze(Nl, [["__scopeId", "data-v-
|
|
499
|
+
}, Hl = /* @__PURE__ */ ze(Nl, [["__scopeId", "data-v-0835d20f"]]);
|
|
496
500
|
export {
|
|
497
501
|
Hl as default
|
|
498
502
|
};
|
package/dist/vue-llm.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
.llm-provider-selector[data-v-9fd186c2]{font-size:var(--llm-font-size-sm, .85rem)}.llm-provider-select[data-v-9fd186c2]{padding:var(--llm-spacing-xs, .25rem) var(--llm-spacing-sm, .5rem);border:1px solid var(--llm-border, #444);border-radius:var(--llm-radius-sm, 4px);background:var(--llm-bg, #111);color:var(--llm-text, #ddd);font-family:inherit;font-size:inherit;cursor:pointer;min-width:120px;max-width:180px}.llm-provider-select[data-v-9fd186c2]:focus{outline:none;border-color:var(--llm-accent, #6c7cff)}.llm-provider-select[data-v-9fd186c2]:hover{border-color:var(--llm-border-hover, #666)}.config-option[data-v-9fd186c2]{font-style:italic;border-top:1px solid var(--llm-border, #444)}.llm-stored-keys-manager[data-v-dd3230e5]{background:var(--llm-bg, #181a1f);border-radius:var(--llm-radius-md, 8px);max-height:80vh;display:flex;flex-direction:column;color:var(--llm-text, #e6e8ea)}.llm-manager-header[data-v-dd3230e5]{display:flex;justify-content:space-between;align-items:center;padding:1.5rem;border-bottom:1px solid var(--llm-border, #33383f);flex-shrink:0}.llm-manager-header h3[data-v-dd3230e5]{margin:0;font-size:1.25rem;font-weight:600;color:var(--llm-text, #e6e8ea)}.llm-close-btn[data-v-dd3230e5]{font-size:1.5rem;line-height:1}.llm-close-btn[data-v-dd3230e5]:hover{opacity:.7}.llm-manager-body[data-v-dd3230e5]{flex:1;overflow:hidden;min-height:0;display:flex;flex-direction:column}.llm-scrollable-content[data-v-dd3230e5]{flex:1;overflow-y:auto;padding:1.5rem;min-height:0}.llm-empty-keys[data-v-dd3230e5]{text-align:center;padding:2rem 1rem;color:var(--llm-text-dim, #9aa0a6)}.llm-empty-keys p[data-v-dd3230e5]{margin:0 0 .5rem;font-size:1rem;font-weight:500}.llm-empty-keys small[data-v-dd3230e5]{font-size:.9rem;opacity:.7}.llm-keys-list[data-v-dd3230e5]{margin-bottom:1rem}.llm-key-item[data-v-dd3230e5]{border:1px solid var(--llm-border, #33383f);border-radius:var(--llm-radius-sm, 6px);margin-bottom:.75rem;background:var(--llm-bg-soft, #1f2228);overflow:hidden}.llm-key-header[data-v-dd3230e5]{display:flex;justify-content:space-between;align-items:flex-start;padding:.75rem}.llm-provider-info[data-v-dd3230e5]{flex:1;display:flex;flex-direction:column;gap:.5rem}.llm-provider-header[data-v-dd3230e5]{display:flex;justify-content:space-between;align-items:center}.llm-provider-name[data-v-dd3230e5]{font-weight:600;font-size:.9rem;color:var(--llm-text, #e6e8ea)}.llm-service-endpoint[data-v-dd3230e5]{margin-top:.25rem}.llm-service-endpoint small[data-v-dd3230e5]{color:var(--llm-text-dim, #9aa0a6);font-family:SF Mono,Monaco,Inconsolata,Roboto Mono,monospace;font-size:.75rem}.llm-provider-select[data-v-dd3230e5]{font-weight:600;font-size:.9rem;min-width:200px}.llm-key-input-row[data-v-dd3230e5]{display:flex;gap:.5rem;align-items:center}.llm-key-input-inline[data-v-dd3230e5]{flex:1;font-family:SF Mono,Monaco,Inconsolata,Roboto Mono,monospace;font-size:.8rem;padding:.4rem .6rem}.llm-stored-date[data-v-dd3230e5]{font-size:.75rem;color:var(--llm-text-dim, #9aa0a6)}.llm-manager-footer[data-v-dd3230e5]{display:flex;align-items:center;gap:.5rem;padding:1.5rem;border-top:1px solid var(--llm-border, #33383f);flex-shrink:0}.llm-footer-spacer[data-v-dd3230e5]{flex:1}.llm-btn[data-v-dd3230e5]{padding:.5rem 1rem;border-radius:var(--llm-radius-sm, 4px);border:1px solid var(--llm-border, #33383f);background:var(--llm-bg-soft, #1f2228);color:var(--llm-text, #e6e8ea);cursor:pointer;font-size:var(--llm-font-size-sm, .85rem);transition:all .15s ease}.llm-btn[data-v-dd3230e5]:hover:not(:disabled){border-color:var(--llm-border-hover, #4b525c);background:var(--llm-bg-mute, #242830)}.llm-btn--sm[data-v-dd3230e5]{padding:.25rem .5rem;font-size:var(--llm-font-size-xs, .75rem)}.llm-btn--secondary[data-v-dd3230e5]{background:var(--llm-bg-mute, #242830);border-color:var(--llm-accent, #6366f1);color:var(--llm-accent, #6366f1)}.llm-btn--ghost[data-v-dd3230e5]{background:transparent;border-color:transparent}.llm-btn--ghost[data-v-dd3230e5]:hover:not(:disabled){background:var(--llm-bg-mute, #242830)}.llm-btn--danger[data-v-dd3230e5]{background:var(--llm-error, #ef4444);border-color:var(--llm-error, #ef4444);color:#fff}.llm-form-control[data-v-dd3230e5]{width:100%;padding:.5rem .75rem;border:1px solid var(--llm-border, #33383f);border-radius:var(--llm-radius-sm, 4px);background:var(--llm-bg, #181a1f);color:var(--llm-text, #e6e8ea);font-size:var(--llm-font-size-sm, .85rem)}.llm-form-control[data-v-dd3230e5]:focus{outline:none;border-color:var(--llm-accent, #6366f1)}@media(max-width:768px){.llm-manager-header[data-v-dd3230e5],.llm-manager-footer[data-v-dd3230e5],.llm-scrollable-content[data-v-dd3230e5]{padding:1rem}.llm-key-header[data-v-dd3230e5]{flex-direction:column;align-items:stretch;gap:1rem;padding:.75rem}.llm-key-input-row[data-v-dd3230e5]{flex-direction:column;align-items:stretch}.llm-provider-select[data-v-dd3230e5]{min-width:auto}}@media(max-width:480px){.llm-manager-header h3[data-v-dd3230e5]{font-size:1.1rem}}.llm-modal-overlay[data-v-a26b0717]{position:fixed;top:0;left:0;right:0;bottom:0;background:#000000b3;display:flex;align-items:center;justify-content:center;z-index:1000}.llm-modal[data-v-a26b0717]{background:var(--llm-bg, #181a1f);border:2px solid var(--llm-border, #33383f);border-radius:var(--llm-radius-md, 8px);width:90%;max-width:700px;max-height:90%;position:relative;display:flex;flex-direction:column;color:var(--llm-text, #e6e8ea)}.llm-modal-header[data-v-a26b0717]{display:flex;justify-content:space-between;align-items:center;padding:1.5rem;border-bottom:1px solid var(--llm-border, #33383f);flex-shrink:0}.llm-modal-header h2[data-v-a26b0717]{margin:0;color:var(--llm-text, #e6e8ea);font-size:1.25rem}.llm-close-btn[data-v-a26b0717]{font-size:1.5rem;line-height:1}.llm-close-btn[data-v-a26b0717]:hover{opacity:.7}.llm-modal-body[data-v-a26b0717]{padding:1.5rem;flex:1;overflow-y:auto;min-height:0}.llm-btn[data-v-a26b0717]{padding:.5rem 1rem;border-radius:var(--llm-radius-sm, 4px);border:1px solid var(--llm-border, #33383f);background:var(--llm-bg-soft, #1f2228);color:var(--llm-text, #e6e8ea);cursor:pointer;font-size:var(--llm-font-size-sm, .85rem);transition:all .15s ease}.llm-btn[data-v-a26b0717]:hover:not(:disabled){border-color:var(--llm-border-hover, #4b525c);background:var(--llm-bg-mute, #242830)}.llm-btn[data-v-a26b0717]:disabled{opacity:.5;cursor:not-allowed}.llm-btn--sm[data-v-a26b0717]{padding:.25rem .5rem;font-size:var(--llm-font-size-xs, .75rem)}.llm-btn--primary[data-v-a26b0717]{background:var(--llm-accent, #6366f1);border-color:var(--llm-accent, #6366f1);color:var(--llm-bg, #181a1f)}.llm-btn--primary[data-v-a26b0717]:hover:not(:disabled){filter:brightness(1.1)}.llm-btn--secondary[data-v-a26b0717]{background:var(--llm-bg-mute, #242830);border-color:var(--llm-accent, #6366f1);color:var(--llm-accent, #6366f1)}.llm-btn--ghost[data-v-a26b0717]{background:transparent;border-color:transparent}.llm-btn--ghost[data-v-a26b0717]:hover:not(:disabled){background:var(--llm-bg-mute, #242830)}.llm-btn--danger[data-v-a26b0717]{background:var(--llm-error, #ef4444);border-color:var(--llm-error, #ef4444);color:#fff}.llm-btn--danger[data-v-a26b0717]:hover:not(:disabled){filter:brightness(1.1)}.llm-form-control[data-v-a26b0717]{width:100%;padding:.5rem .75rem;border:1px solid var(--llm-border, #33383f);border-radius:var(--llm-radius-sm, 4px);background:var(--llm-bg, #181a1f);color:var(--llm-text, #e6e8ea);font-size:var(--llm-font-size-sm, .85rem)}.llm-form-control[data-v-a26b0717]:focus{outline:none;border-color:var(--llm-accent, #6366f1)}.llm-form-control[data-v-a26b0717]:disabled{opacity:.6;cursor:not-allowed}.llm-provider-list[data-v-a26b0717]{margin-bottom:2rem;padding-bottom:1.5rem}.llm-provider-list[data-v-a26b0717]:not(:last-child){border-bottom:1px solid var(--llm-border, #33383f)}.llm-provider-list h3[data-v-a26b0717]{margin:0 0 1rem;color:var(--llm-text, #e6e8ea);font-size:1rem}.llm-provider-item[data-v-a26b0717]{display:flex;justify-content:space-between;align-items:center;padding:1rem;border:1px solid var(--llm-border, #33383f);border-radius:var(--llm-radius-sm, 4px);margin-bottom:.5rem;background:var(--llm-bg-soft, #1f2228);cursor:pointer;transition:all .15s ease;position:relative}.llm-provider-item[data-v-a26b0717]:hover{background:var(--llm-bg-mute, #242830);border-color:var(--llm-border-hover, #4b525c)}.llm-provider-item.active[data-v-a26b0717]{border-color:var(--llm-accent, #6366f1);background:var(--llm-bg, #181a1f);box-shadow:0 0 0 1px var(--llm-border, #33383f)}.llm-provider-item.disabled[data-v-a26b0717]{opacity:.6;cursor:not-allowed}.llm-provider-info[data-v-a26b0717]{flex:1}.llm-provider-name-row[data-v-a26b0717]{display:flex;align-items:center;margin-bottom:.25rem}.llm-provider-name[data-v-a26b0717]{font-weight:500;color:var(--llm-text, #e6e8ea);font-size:.95rem}.llm-active-badge[data-v-a26b0717],.llm-judge-badge[data-v-a26b0717]{position:absolute;top:-12px;background:var(--llm-accent, #6366f1);color:var(--llm-bg, #181a1f);font-size:.6rem;font-weight:700;padding:.2rem .5rem;border-radius:3px;text-transform:uppercase;letter-spacing:.5px;z-index:1}.llm-active-badge[data-v-a26b0717]{left:16px}.llm-judge-badge[data-v-a26b0717]{left:80px}.llm-disabled-badge[data-v-a26b0717]{background:var(--llm-border, #33383f);color:var(--llm-text, #e6e8ea);font-size:.65rem;font-weight:500;padding:.1rem .4rem;border-radius:2px;margin-left:.5rem;text-transform:uppercase}.llm-provider-details-row[data-v-a26b0717]{display:flex;align-items:center;gap:.75rem}.llm-test-status-btn[data-v-a26b0717]{background:none;border:1px solid var(--llm-border, #33383f);color:var(--llm-text, #e6e8ea);font-size:.7rem;font-weight:500;padding:.25rem .5rem;border-radius:3px;cursor:pointer;transition:all .15s ease;min-width:60px;text-align:center}.llm-test-status-btn.llm-test-default[data-v-a26b0717]:hover:not(:disabled){background:var(--llm-bg-mute, #242830);border-color:var(--llm-accent, #6366f1)}.llm-test-status-btn.llm-test-testing[data-v-a26b0717]{border-color:var(--llm-border-hover, #4b525c)}.llm-test-status-btn.llm-test-success[data-v-a26b0717]{border-color:var(--llm-success, #10b981);color:var(--llm-success, #10b981)}.llm-test-status-btn.llm-test-failed[data-v-a26b0717]{border-color:var(--llm-error, #ef4444);color:var(--llm-error, #ef4444)}.llm-provider-details[data-v-a26b0717]{font-size:.8rem;color:var(--llm-text-dim, #9aa0a6);flex:1}.llm-provider-actions[data-v-a26b0717]{display:flex;gap:.5rem;align-items:center}.llm-form-grid[data-v-a26b0717]{display:grid;grid-template-columns:auto 1fr;gap:1rem;align-items:center}.llm-field-label[data-v-a26b0717]{margin-bottom:0;white-space:nowrap;color:var(--llm-text, #e6e8ea);font-size:var(--llm-font-size-sm, .85rem)}.llm-api-key-field[data-v-a26b0717]{display:flex;flex-direction:column}.llm-api-key-input-row[data-v-a26b0717]{display:flex;gap:.5rem;align-items:stretch}.llm-api-key-input-row .llm-form-control[data-v-a26b0717]{flex:1}.llm-api-key-field .llm-security-note[data-v-a26b0717]{margin-top:.5rem}.llm-model-selector[data-v-a26b0717]{display:flex;gap:.5rem;align-items:stretch;flex-wrap:wrap}.llm-model-selector .llm-form-control[data-v-a26b0717]{flex:1}.llm-refresh-btn[data-v-a26b0717]{min-width:4rem;flex-shrink:0}.llm-model-error[data-v-a26b0717]{width:100%;font-size:.75rem;color:var(--llm-error, #ef4444)}.llm-thinking-toggle[data-v-a26b0717]{display:block;width:100%;margin-top:.5rem}.llm-temperature-field[data-v-a26b0717]{display:flex;flex-direction:column}.llm-field-note[data-v-a26b0717]{display:block;margin-top:.5rem;font-size:.75rem;color:var(--llm-text-dim, #9aa0a6);font-style:italic}.llm-checkbox-label[data-v-a26b0717]{display:flex;align-items:center;gap:.5rem;cursor:pointer;font-weight:500;color:var(--llm-text, #e6e8ea);font-size:var(--llm-font-size-sm, .85rem)}.llm-checkbox[data-v-a26b0717]{width:1rem;height:1rem;cursor:pointer}.llm-security-note[data-v-a26b0717]{display:block;font-size:.75rem;color:var(--llm-text-dim, #9aa0a6)}.llm-modal-footer[data-v-a26b0717]{display:flex;align-items:center;gap:.5rem;padding:1.5rem;border-top:1px solid var(--llm-border, #33383f);flex-shrink:0}.llm-footer-spacer[data-v-a26b0717]{flex:1}.llm-empty-state[data-v-a26b0717]{text-align:center;padding:2rem;color:var(--llm-text-dim, #9aa0a6)}.llm-empty-state p[data-v-a26b0717]{margin:.5rem 0;font-size:.9rem}.llm-keys-manager-overlay[data-v-a26b0717]{position:fixed;top:0;left:0;right:0;bottom:0;background:#000c;display:flex;align-items:center;justify-content:center;z-index:1001}.llm-keys-manager-content[data-v-a26b0717]{width:90%;max-width:600px;max-height:80vh;border:2px solid var(--llm-border, #33383f);border-radius:var(--llm-radius-md, 8px);overflow:hidden}@media(max-width:768px){.llm-modal[data-v-a26b0717]{width:95%;margin:1rem}.llm-modal-body[data-v-a26b0717],.llm-modal-header[data-v-a26b0717],.llm-modal-footer[data-v-a26b0717]{padding:1rem}.llm-provider-item[data-v-a26b0717]{flex-direction:column;align-items:stretch;gap:.75rem;padding:.75rem}.llm-provider-actions[data-v-a26b0717]{width:100%;justify-content:flex-end}.llm-form-grid[data-v-a26b0717]{grid-template-columns:1fr;gap:.5rem}.llm-field-label[data-v-a26b0717]{padding-top:0;margin-top:.5rem}.llm-active-badge[data-v-a26b0717],.llm-judge-badge[data-v-a26b0717]{top:-8px;font-size:.55rem;padding:.15rem .4rem}.llm-judge-badge[data-v-a26b0717]{left:66px}}@media(max-width:480px){.llm-modal[data-v-a26b0717]{width:98%;margin:.5rem}.llm-modal-body[data-v-a26b0717],.llm-modal-header[data-v-a26b0717],.llm-modal-footer[data-v-a26b0717]{padding:.75rem}}
|
|
1
|
+
.llm-provider-selector[data-v-9fd186c2]{font-size:var(--llm-font-size-sm, .85rem)}.llm-provider-select[data-v-9fd186c2]{padding:var(--llm-spacing-xs, .25rem) var(--llm-spacing-sm, .5rem);border:1px solid var(--llm-border, #444);border-radius:var(--llm-radius-sm, 4px);background:var(--llm-bg, #111);color:var(--llm-text, #ddd);font-family:inherit;font-size:inherit;cursor:pointer;min-width:120px;max-width:180px}.llm-provider-select[data-v-9fd186c2]:focus{outline:none;border-color:var(--llm-accent, #6c7cff)}.llm-provider-select[data-v-9fd186c2]:hover{border-color:var(--llm-border-hover, #666)}.config-option[data-v-9fd186c2]{font-style:italic;border-top:1px solid var(--llm-border, #444)}.llm-stored-keys-manager[data-v-dd3230e5]{background:var(--llm-bg, #181a1f);border-radius:var(--llm-radius-md, 8px);max-height:80vh;display:flex;flex-direction:column;color:var(--llm-text, #e6e8ea)}.llm-manager-header[data-v-dd3230e5]{display:flex;justify-content:space-between;align-items:center;padding:1.5rem;border-bottom:1px solid var(--llm-border, #33383f);flex-shrink:0}.llm-manager-header h3[data-v-dd3230e5]{margin:0;font-size:1.25rem;font-weight:600;color:var(--llm-text, #e6e8ea)}.llm-close-btn[data-v-dd3230e5]{font-size:1.5rem;line-height:1}.llm-close-btn[data-v-dd3230e5]:hover{opacity:.7}.llm-manager-body[data-v-dd3230e5]{flex:1;overflow:hidden;min-height:0;display:flex;flex-direction:column}.llm-scrollable-content[data-v-dd3230e5]{flex:1;overflow-y:auto;padding:1.5rem;min-height:0}.llm-empty-keys[data-v-dd3230e5]{text-align:center;padding:2rem 1rem;color:var(--llm-text-dim, #9aa0a6)}.llm-empty-keys p[data-v-dd3230e5]{margin:0 0 .5rem;font-size:1rem;font-weight:500}.llm-empty-keys small[data-v-dd3230e5]{font-size:.9rem;opacity:.7}.llm-keys-list[data-v-dd3230e5]{margin-bottom:1rem}.llm-key-item[data-v-dd3230e5]{border:1px solid var(--llm-border, #33383f);border-radius:var(--llm-radius-sm, 6px);margin-bottom:.75rem;background:var(--llm-bg-soft, #1f2228);overflow:hidden}.llm-key-header[data-v-dd3230e5]{display:flex;justify-content:space-between;align-items:flex-start;padding:.75rem}.llm-provider-info[data-v-dd3230e5]{flex:1;display:flex;flex-direction:column;gap:.5rem}.llm-provider-header[data-v-dd3230e5]{display:flex;justify-content:space-between;align-items:center}.llm-provider-name[data-v-dd3230e5]{font-weight:600;font-size:.9rem;color:var(--llm-text, #e6e8ea)}.llm-service-endpoint[data-v-dd3230e5]{margin-top:.25rem}.llm-service-endpoint small[data-v-dd3230e5]{color:var(--llm-text-dim, #9aa0a6);font-family:SF Mono,Monaco,Inconsolata,Roboto Mono,monospace;font-size:.75rem}.llm-provider-select[data-v-dd3230e5]{font-weight:600;font-size:.9rem;min-width:200px}.llm-key-input-row[data-v-dd3230e5]{display:flex;gap:.5rem;align-items:center}.llm-key-input-inline[data-v-dd3230e5]{flex:1;font-family:SF Mono,Monaco,Inconsolata,Roboto Mono,monospace;font-size:.8rem;padding:.4rem .6rem}.llm-stored-date[data-v-dd3230e5]{font-size:.75rem;color:var(--llm-text-dim, #9aa0a6)}.llm-manager-footer[data-v-dd3230e5]{display:flex;align-items:center;gap:.5rem;padding:1.5rem;border-top:1px solid var(--llm-border, #33383f);flex-shrink:0}.llm-footer-spacer[data-v-dd3230e5]{flex:1}.llm-btn[data-v-dd3230e5]{padding:.5rem 1rem;border-radius:var(--llm-radius-sm, 4px);border:1px solid var(--llm-border, #33383f);background:var(--llm-bg-soft, #1f2228);color:var(--llm-text, #e6e8ea);cursor:pointer;font-size:var(--llm-font-size-sm, .85rem);transition:all .15s ease}.llm-btn[data-v-dd3230e5]:hover:not(:disabled){border-color:var(--llm-border-hover, #4b525c);background:var(--llm-bg-mute, #242830)}.llm-btn--sm[data-v-dd3230e5]{padding:.25rem .5rem;font-size:var(--llm-font-size-xs, .75rem)}.llm-btn--secondary[data-v-dd3230e5]{background:var(--llm-bg-mute, #242830);border-color:var(--llm-accent, #6366f1);color:var(--llm-accent, #6366f1)}.llm-btn--ghost[data-v-dd3230e5]{background:transparent;border-color:transparent}.llm-btn--ghost[data-v-dd3230e5]:hover:not(:disabled){background:var(--llm-bg-mute, #242830)}.llm-btn--danger[data-v-dd3230e5]{background:var(--llm-error, #ef4444);border-color:var(--llm-error, #ef4444);color:#fff}.llm-form-control[data-v-dd3230e5]{width:100%;padding:.5rem .75rem;border:1px solid var(--llm-border, #33383f);border-radius:var(--llm-radius-sm, 4px);background:var(--llm-bg, #181a1f);color:var(--llm-text, #e6e8ea);font-size:var(--llm-font-size-sm, .85rem)}.llm-form-control[data-v-dd3230e5]:focus{outline:none;border-color:var(--llm-accent, #6366f1)}@media(max-width:768px){.llm-manager-header[data-v-dd3230e5],.llm-manager-footer[data-v-dd3230e5],.llm-scrollable-content[data-v-dd3230e5]{padding:1rem}.llm-key-header[data-v-dd3230e5]{flex-direction:column;align-items:stretch;gap:1rem;padding:.75rem}.llm-key-input-row[data-v-dd3230e5]{flex-direction:column;align-items:stretch}.llm-provider-select[data-v-dd3230e5]{min-width:auto}}@media(max-width:480px){.llm-manager-header h3[data-v-dd3230e5]{font-size:1.1rem}}.llm-modal-overlay[data-v-0835d20f]{position:fixed;top:0;left:0;right:0;bottom:0;background:#000000b3;display:flex;align-items:center;justify-content:center;z-index:1000}.llm-modal[data-v-0835d20f]{background:var(--llm-bg, #181a1f);border:2px solid var(--llm-border, #33383f);border-radius:var(--llm-radius-md, 8px);width:90%;max-width:700px;max-height:90%;position:relative;display:flex;flex-direction:column;color:var(--llm-text, #e6e8ea)}.llm-modal-header[data-v-0835d20f]{display:flex;justify-content:space-between;align-items:center;padding:1.5rem;border-bottom:1px solid var(--llm-border, #33383f);flex-shrink:0}.llm-modal-header h2[data-v-0835d20f]{margin:0;color:var(--llm-text, #e6e8ea);font-size:1.25rem}.llm-close-btn[data-v-0835d20f]{font-size:1.5rem;line-height:1}.llm-close-btn[data-v-0835d20f]:hover{opacity:.7}.llm-modal-body[data-v-0835d20f]{padding:1.5rem;flex:1;overflow-y:auto;min-height:0}.llm-btn[data-v-0835d20f]{padding:.5rem 1rem;border-radius:var(--llm-radius-sm, 4px);border:1px solid var(--llm-border, #33383f);background:var(--llm-bg-soft, #1f2228);color:var(--llm-text, #e6e8ea);cursor:pointer;font-size:var(--llm-font-size-sm, .85rem);transition:all .15s ease}.llm-btn[data-v-0835d20f]:hover:not(:disabled){border-color:var(--llm-border-hover, #4b525c);background:var(--llm-bg-mute, #242830)}.llm-btn[data-v-0835d20f]:disabled{opacity:.5;cursor:not-allowed}.llm-btn--sm[data-v-0835d20f]{padding:.25rem .5rem;font-size:var(--llm-font-size-xs, .75rem)}.llm-btn--primary[data-v-0835d20f]{background:var(--llm-accent, #6366f1);border-color:var(--llm-accent, #6366f1);color:var(--llm-bg, #181a1f)}.llm-btn--primary[data-v-0835d20f]:hover:not(:disabled){filter:brightness(1.1)}.llm-btn--secondary[data-v-0835d20f]{background:var(--llm-bg-mute, #242830);border-color:var(--llm-accent, #6366f1);color:var(--llm-accent, #6366f1)}.llm-btn--ghost[data-v-0835d20f]{background:transparent;border-color:transparent}.llm-btn--ghost[data-v-0835d20f]:hover:not(:disabled){background:var(--llm-bg-mute, #242830)}.llm-btn--danger[data-v-0835d20f]{background:var(--llm-error, #ef4444);border-color:var(--llm-error, #ef4444);color:#fff}.llm-btn--danger[data-v-0835d20f]:hover:not(:disabled){filter:brightness(1.1)}.llm-form-control[data-v-0835d20f]{width:100%;padding:.5rem .75rem;border:1px solid var(--llm-border, #33383f);border-radius:var(--llm-radius-sm, 4px);background:var(--llm-bg, #181a1f);color:var(--llm-text, #e6e8ea);font-size:var(--llm-font-size-sm, .85rem)}.llm-form-control[data-v-0835d20f]:focus{outline:none;border-color:var(--llm-accent, #6366f1)}.llm-form-control[data-v-0835d20f]:disabled{opacity:.6;cursor:not-allowed}.llm-provider-list[data-v-0835d20f]{margin-bottom:2rem;padding-bottom:1.5rem}.llm-provider-list[data-v-0835d20f]:not(:last-child){border-bottom:1px solid var(--llm-border, #33383f)}.llm-provider-list h3[data-v-0835d20f]{margin:0 0 1rem;color:var(--llm-text, #e6e8ea);font-size:1rem}.llm-provider-item[data-v-0835d20f]{display:flex;justify-content:space-between;align-items:center;padding:1rem;border:1px solid var(--llm-border, #33383f);border-radius:var(--llm-radius-sm, 4px);margin-bottom:.5rem;background:var(--llm-bg-soft, #1f2228);cursor:pointer;transition:all .15s ease;position:relative}.llm-provider-item[data-v-0835d20f]:hover{background:var(--llm-bg-mute, #242830);border-color:var(--llm-border-hover, #4b525c)}.llm-provider-item.active[data-v-0835d20f]{border-color:var(--llm-accent, #6366f1);background:var(--llm-bg, #181a1f);box-shadow:0 0 0 1px var(--llm-border, #33383f)}.llm-provider-item.disabled[data-v-0835d20f]{opacity:.6;cursor:not-allowed}.llm-provider-info[data-v-0835d20f]{flex:1}.llm-provider-name-row[data-v-0835d20f]{display:flex;align-items:center;margin-bottom:.25rem}.llm-provider-name[data-v-0835d20f]{font-weight:500;color:var(--llm-text, #e6e8ea);font-size:.95rem}.llm-active-badge[data-v-0835d20f],.llm-judge-badge[data-v-0835d20f]{position:absolute;top:-12px;background:var(--llm-accent, #6366f1);color:var(--llm-bg, #181a1f);font-size:.6rem;font-weight:700;padding:.2rem .5rem;border-radius:3px;text-transform:uppercase;letter-spacing:.5px;z-index:1}.llm-active-badge[data-v-0835d20f]{left:16px}.llm-judge-badge[data-v-0835d20f]{left:80px}.llm-disabled-badge[data-v-0835d20f]{background:var(--llm-border, #33383f);color:var(--llm-text, #e6e8ea);font-size:.65rem;font-weight:500;padding:.1rem .4rem;border-radius:2px;margin-left:.5rem;text-transform:uppercase}.llm-provider-details-row[data-v-0835d20f]{display:flex;align-items:center;gap:.75rem}.llm-test-status-btn[data-v-0835d20f]{background:none;border:1px solid var(--llm-border, #33383f);color:var(--llm-text, #e6e8ea);font-size:.7rem;font-weight:500;padding:.25rem .5rem;border-radius:3px;cursor:pointer;transition:all .15s ease;min-width:60px;text-align:center}.llm-test-status-btn.llm-test-default[data-v-0835d20f]:hover:not(:disabled){background:var(--llm-bg-mute, #242830);border-color:var(--llm-accent, #6366f1)}.llm-test-status-btn.llm-test-testing[data-v-0835d20f]{border-color:var(--llm-border-hover, #4b525c)}.llm-test-status-btn.llm-test-success[data-v-0835d20f]{border-color:var(--llm-success, #10b981);color:var(--llm-success, #10b981)}.llm-test-status-btn.llm-test-failed[data-v-0835d20f]{border-color:var(--llm-error, #ef4444);color:var(--llm-error, #ef4444)}.llm-provider-details[data-v-0835d20f]{font-size:.8rem;color:var(--llm-text-dim, #9aa0a6);flex:1}.llm-provider-actions[data-v-0835d20f]{display:flex;gap:.5rem;align-items:center}.llm-form-grid[data-v-0835d20f]{display:grid;grid-template-columns:auto 1fr;gap:1rem;align-items:center}.llm-field-label[data-v-0835d20f]{margin-bottom:0;white-space:nowrap;color:var(--llm-text, #e6e8ea);font-size:var(--llm-font-size-sm, .85rem)}.llm-api-key-field[data-v-0835d20f]{display:flex;flex-direction:column}.llm-api-key-input-row[data-v-0835d20f]{display:flex;gap:.5rem;align-items:stretch}.llm-api-key-input-row .llm-form-control[data-v-0835d20f]{flex:1}.llm-api-key-field .llm-security-note[data-v-0835d20f]{margin-top:.5rem}.llm-model-selector[data-v-0835d20f]{display:flex;gap:.5rem;align-items:stretch;flex-wrap:wrap}.llm-model-selector .llm-form-control[data-v-0835d20f]{flex:1}.llm-refresh-btn[data-v-0835d20f]{min-width:4rem;flex-shrink:0}.llm-model-error[data-v-0835d20f]{width:100%;font-size:.75rem;color:var(--llm-error, #ef4444)}.llm-thinking-toggle[data-v-0835d20f]{display:block;width:100%;margin-top:.5rem}.llm-temperature-field[data-v-0835d20f]{display:flex;flex-direction:column}.llm-field-note[data-v-0835d20f]{display:block;margin-top:.5rem;font-size:.75rem;color:var(--llm-text-dim, #9aa0a6);font-style:italic}.llm-checkbox-label[data-v-0835d20f]{display:flex;align-items:center;gap:.5rem;cursor:pointer;font-weight:500;color:var(--llm-text, #e6e8ea);font-size:var(--llm-font-size-sm, .85rem)}.llm-checkbox[data-v-0835d20f]{width:1rem;height:1rem;cursor:pointer}.llm-security-note[data-v-0835d20f]{display:block;font-size:.75rem;color:var(--llm-text-dim, #9aa0a6)}.llm-modal-footer[data-v-0835d20f]{display:flex;align-items:center;gap:.5rem;padding:1.5rem;border-top:1px solid var(--llm-border, #33383f);flex-shrink:0}.llm-footer-spacer[data-v-0835d20f]{flex:1}.llm-empty-state[data-v-0835d20f]{text-align:center;padding:2rem;color:var(--llm-text-dim, #9aa0a6)}.llm-empty-state p[data-v-0835d20f]{margin:.5rem 0;font-size:.9rem}.llm-keys-manager-overlay[data-v-0835d20f]{position:fixed;top:0;left:0;right:0;bottom:0;background:#000c;display:flex;align-items:center;justify-content:center;z-index:1001}.llm-keys-manager-content[data-v-0835d20f]{width:90%;max-width:600px;max-height:80vh;border:2px solid var(--llm-border, #33383f);border-radius:var(--llm-radius-md, 8px);overflow:hidden}.llm-test-result[data-v-0835d20f]{margin-top:1rem;padding:.75rem 1rem;border-radius:var(--llm-radius-sm, 4px);font-size:var(--llm-font-size-sm, .85rem)}.llm-test-result--success[data-v-0835d20f]{background:color-mix(in srgb,var(--llm-success, #10b981) 15%,transparent);border:1px solid var(--llm-success, #10b981);color:var(--llm-success, #10b981)}.llm-test-result--error[data-v-0835d20f]{background:color-mix(in srgb,var(--llm-error, #ef4444) 15%,transparent);border:1px solid var(--llm-error, #ef4444);color:var(--llm-error, #ef4444)}@media(max-width:768px){.llm-modal[data-v-0835d20f]{width:95%;margin:1rem}.llm-modal-body[data-v-0835d20f],.llm-modal-header[data-v-0835d20f],.llm-modal-footer[data-v-0835d20f]{padding:1rem}.llm-provider-item[data-v-0835d20f]{flex-direction:column;align-items:stretch;gap:.75rem;padding:.75rem}.llm-provider-actions[data-v-0835d20f]{width:100%;justify-content:flex-end}.llm-form-grid[data-v-0835d20f]{grid-template-columns:1fr;gap:.5rem}.llm-field-label[data-v-0835d20f]{padding-top:0;margin-top:.5rem}.llm-active-badge[data-v-0835d20f],.llm-judge-badge[data-v-0835d20f]{top:-8px;font-size:.55rem;padding:.15rem .4rem}.llm-judge-badge[data-v-0835d20f]{left:66px}}@media(max-width:480px){.llm-modal[data-v-0835d20f]{width:98%;margin:.5rem}.llm-modal-body[data-v-0835d20f],.llm-modal-header[data-v-0835d20f],.llm-modal-footer[data-v-0835d20f]{padding:.75rem}}
|