@cat-factory/app 0.261.6 → 0.262.0
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/app/components/settings/LocalModelEndpointsPanel.vue +149 -52
- package/app/types/localModels.ts +7 -0
- package/i18n/locales/de.json +10 -0
- package/i18n/locales/en.json +10 -0
- package/i18n/locales/es.json +10 -0
- package/i18n/locales/fr.json +10 -0
- package/i18n/locales/he.json +10 -0
- package/i18n/locales/it.json +10 -0
- package/i18n/locales/ja.json +10 -0
- package/i18n/locales/pl.json +10 -0
- package/i18n/locales/tr.json +10 -0
- package/i18n/locales/uk.json +10 -0
- package/package.json +2 -2
|
@@ -6,9 +6,12 @@
|
|
|
6
6
|
// serves and tick which to enable. Save persists the endpoint; the enabled models then surface
|
|
7
7
|
// automatically in the per-workspace model picker. One endpoint per runner type.
|
|
8
8
|
import { computed, ref, watch } from 'vue'
|
|
9
|
+
|
|
9
10
|
import {
|
|
11
|
+
knownLocalModel,
|
|
10
12
|
LOCAL_RUNNER_DEFAULTS,
|
|
11
13
|
LOCAL_RUNNER_LABELS,
|
|
14
|
+
type LocalModelDeclaration,
|
|
12
15
|
type LocalRunner,
|
|
13
16
|
type LocalRunnerUrlReason,
|
|
14
17
|
} from '~/types/localModels'
|
|
@@ -28,16 +31,6 @@ const open = computed({
|
|
|
28
31
|
})
|
|
29
32
|
const back = useIntegrationBack(open)
|
|
30
33
|
|
|
31
|
-
// Load the user's endpoints whenever the panel opens (loaded independently of the
|
|
32
|
-
// workspace snapshot, like personal subscriptions).
|
|
33
|
-
watch(
|
|
34
|
-
open,
|
|
35
|
-
(isOpen) => {
|
|
36
|
-
if (isOpen) void store.load()
|
|
37
|
-
},
|
|
38
|
-
{ immediate: true },
|
|
39
|
-
)
|
|
40
|
-
|
|
41
34
|
const RUNNERS: { value: LocalRunner; label: string }[] = (
|
|
42
35
|
Object.keys(LOCAL_RUNNER_LABELS) as LocalRunner[]
|
|
43
36
|
).map((value) => ({ value, label: LOCAL_RUNNER_LABELS[value] }))
|
|
@@ -59,14 +52,76 @@ function urlReasonText(reason: LocalRunnerUrlReason): string {
|
|
|
59
52
|
return t(URL_REASON_KEYS[reason])
|
|
60
53
|
}
|
|
61
54
|
|
|
55
|
+
// Whether an enabled model reads IMAGES. Three states, because the runner's `/models` probe cannot
|
|
56
|
+
// tell us and "nobody has said" is not the same answer as "no": undeclared says the platform never
|
|
57
|
+
// asked, while `no` says the model cannot. Mirrors `LocalModelDeclaration.acceptsImages`.
|
|
58
|
+
//
|
|
59
|
+
// For a RECOGNISED family the platform already knows, so leaving this alone is the right answer and
|
|
60
|
+
// the "not set" option says which way that falls: the control is the ESCAPE HATCH for a build the
|
|
61
|
+
// table cannot know about (a text-only quant, a fine-tune, a re-tagged copy), not a step everyone
|
|
62
|
+
// has to take.
|
|
63
|
+
const IMAGE_INPUT_CHOICES = ['unknown', 'yes', 'no'] as const
|
|
64
|
+
type ImageInputChoice = (typeof IMAGE_INPUT_CHOICES)[number]
|
|
65
|
+
|
|
66
|
+
function choiceFor(declared: LocalModelDeclaration): ImageInputChoice {
|
|
67
|
+
return declared.acceptsImages === undefined ? 'unknown' : declared.acceptsImages ? 'yes' : 'no'
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** The declared modality for a choice, as a spread-ready slice (undeclared adds no key at all). */
|
|
71
|
+
function modalityOf(choice: ImageInputChoice | undefined): { acceptsImages?: boolean } {
|
|
72
|
+
if (choice === 'yes') return { acceptsImages: true }
|
|
73
|
+
if (choice === 'no') return { acceptsImages: false }
|
|
74
|
+
return {}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* What "not set" will actually do for one model id: name the recognised family and the modality it
|
|
79
|
+
* implies, else say plainly that nothing has been said. Read from the SAME table the engine folds
|
|
80
|
+
* onto the dispatched ref, so this label cannot promise a picture the run then withholds.
|
|
81
|
+
*/
|
|
82
|
+
function unsetLabelFor(modelId: string): string {
|
|
83
|
+
const known = knownLocalModel(modelId)
|
|
84
|
+
if (!known) return t('settings.localModelEndpoints.imageInput.unknown')
|
|
85
|
+
return t(
|
|
86
|
+
known.acceptsImages
|
|
87
|
+
? 'settings.localModelEndpoints.imageInput.autoYes'
|
|
88
|
+
: 'settings.localModelEndpoints.imageInput.autoNo',
|
|
89
|
+
{ family: known.label },
|
|
90
|
+
)
|
|
91
|
+
}
|
|
92
|
+
|
|
62
93
|
// ---- add / edit draft ------------------------------------------------------
|
|
63
94
|
const provider = ref<LocalRunner>('ollama')
|
|
64
95
|
const label = ref('')
|
|
65
96
|
const baseUrl = ref(LOCAL_RUNNER_DEFAULTS.ollama ?? '')
|
|
66
97
|
const apiKey = ref('')
|
|
67
|
-
// The models discovered by the last "Test connection", plus the user's tick selection
|
|
98
|
+
// The models discovered by the last "Test connection", plus the user's tick selection and what
|
|
99
|
+
// they declared about each ticked one (kept per model id, so un-ticking and re-ticking a model
|
|
100
|
+
// does not silently drop the declaration they already made for it).
|
|
68
101
|
const discovered = ref<string[]>([])
|
|
69
102
|
const selected = ref<string[]>([])
|
|
103
|
+
const imageInput = ref<Record<string, ImageInputChoice>>({})
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* The three options per discovered model: "not set" carries what the recognised-family table will
|
|
107
|
+
* do. Built once per discovered set rather than per row per render, because the "not set" label
|
|
108
|
+
* scans the family table and a fresh array identity each tick also defeats the select's own
|
|
109
|
+
* memoisation (a runner serving forty models re-ran both on every keystroke elsewhere in the form).
|
|
110
|
+
*/
|
|
111
|
+
const imageInputItems = computed<Record<string, { value: ImageInputChoice; label: string }[]>>(() =>
|
|
112
|
+
Object.fromEntries(
|
|
113
|
+
discovered.value.map((modelId) => [
|
|
114
|
+
modelId,
|
|
115
|
+
IMAGE_INPUT_CHOICES.map((value) => ({
|
|
116
|
+
value,
|
|
117
|
+
label:
|
|
118
|
+
value === 'unknown'
|
|
119
|
+
? unsetLabelFor(modelId)
|
|
120
|
+
: t(`settings.localModelEndpoints.imageInput.${value}`),
|
|
121
|
+
})),
|
|
122
|
+
]),
|
|
123
|
+
),
|
|
124
|
+
)
|
|
70
125
|
const testError = ref<string | null>(null)
|
|
71
126
|
// The backend's own wording, kept as DETAIL beside a translated refusal rather than being
|
|
72
127
|
// shown as the description (it names env vars an operator, not this user, acts on).
|
|
@@ -77,25 +132,48 @@ const busy = ref(false)
|
|
|
77
132
|
|
|
78
133
|
const existing = computed(() => store.endpoints.find((e) => e.provider === provider.value))
|
|
79
134
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
135
|
+
/**
|
|
136
|
+
* Point the draft at one runner: its stored config when that runner is already connected (so the
|
|
137
|
+
* ticks and the declarations the user made come back), else the defaults for a fresh one.
|
|
138
|
+
*
|
|
139
|
+
* Called EXPLICITLY from each event that means "start editing this runner", never watched off
|
|
140
|
+
* `provider`, because the commonest of those events does not change it: clicking Edit on the row
|
|
141
|
+
* the form is already showing assigns the same value, which fires no watcher. The draft would then
|
|
142
|
+
* be whatever the empty initial state was, and saving it PUTs every model with no declaration,
|
|
143
|
+
* destroying what the user had recorded with nothing saying so.
|
|
144
|
+
*/
|
|
145
|
+
function seedDraft(p: LocalRunner) {
|
|
83
146
|
const e = store.endpoints.find((x) => x.provider === p)
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
} else {
|
|
90
|
-
label.value = ''
|
|
91
|
-
baseUrl.value = LOCAL_RUNNER_DEFAULTS[p] ?? ''
|
|
92
|
-
discovered.value = []
|
|
93
|
-
selected.value = []
|
|
94
|
-
}
|
|
147
|
+
label.value = e?.label ?? ''
|
|
148
|
+
baseUrl.value = e?.baseUrl ?? LOCAL_RUNNER_DEFAULTS[p] ?? ''
|
|
149
|
+
discovered.value = e?.models.map((m) => m.id) ?? []
|
|
150
|
+
selected.value = e?.models.map((m) => m.id) ?? []
|
|
151
|
+
imageInput.value = Object.fromEntries(e?.models.map((m) => [m.id, choiceFor(m)]) ?? [])
|
|
95
152
|
apiKey.value = ''
|
|
96
153
|
testError.value = null
|
|
154
|
+
testErrorDetail.value = null
|
|
97
155
|
tested.value = false
|
|
98
|
-
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/** Select a runner in the form: the runner-type select and each row's Edit button share this. */
|
|
159
|
+
function selectRunner(p: LocalRunner) {
|
|
160
|
+
provider.value = p
|
|
161
|
+
seedDraft(p)
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// Load the user's endpoints whenever the panel opens (loaded independently of the workspace
|
|
165
|
+
// snapshot, like personal subscriptions), then seed the draft from what arrived. The seed WAITS
|
|
166
|
+
// for the load: the panel mounts against an empty store, so seeding before it resolves would
|
|
167
|
+
// leave a form headed "Edit runner" holding none of that runner's config.
|
|
168
|
+
watch(
|
|
169
|
+
open,
|
|
170
|
+
async (isOpen) => {
|
|
171
|
+
if (!isOpen) return
|
|
172
|
+
await store.load()
|
|
173
|
+
seedDraft(provider.value)
|
|
174
|
+
},
|
|
175
|
+
{ immediate: true },
|
|
176
|
+
)
|
|
99
177
|
|
|
100
178
|
async function test() {
|
|
101
179
|
if (!baseUrl.value.trim()) return
|
|
@@ -147,7 +225,7 @@ async function save() {
|
|
|
147
225
|
label: label.value.trim() || undefined,
|
|
148
226
|
baseUrl: baseUrl.value.trim(),
|
|
149
227
|
apiKey: apiKey.value.trim() || undefined,
|
|
150
|
-
models: selected.value,
|
|
228
|
+
models: selected.value.map((id) => ({ id, ...modalityOf(imageInput.value[id]) })),
|
|
151
229
|
})
|
|
152
230
|
apiKey.value = ''
|
|
153
231
|
toast.add({
|
|
@@ -178,13 +256,9 @@ async function remove(p: LocalRunner) {
|
|
|
178
256
|
busy.value = true
|
|
179
257
|
try {
|
|
180
258
|
await store.remove(p)
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
discovered.value = []
|
|
185
|
-
selected.value = []
|
|
186
|
-
tested.value = false
|
|
187
|
-
}
|
|
259
|
+
// The row is gone from the store, so re-seeding the draft it was showing yields the
|
|
260
|
+
// fresh-runner defaults: the same reset, without a second copy of what a reset means.
|
|
261
|
+
if (provider.value === p) seedDraft(p)
|
|
188
262
|
toast.add({ title: t('settings.localModelEndpoints.toast.removed'), icon: 'i-lucide-check' })
|
|
189
263
|
} catch (e) {
|
|
190
264
|
present(e, 'settings.localModelEndpoints.toast.removeFailed')
|
|
@@ -246,6 +320,12 @@ async function remove(p: LocalRunner) {
|
|
|
246
320
|
{{ t('settings.localModelEndpoints.blocked') }}
|
|
247
321
|
<span class="block text-amber-300/70">{{ urlReasonText(e.urlBlockedReason) }}</span>
|
|
248
322
|
</div>
|
|
323
|
+
<!-- Part of the stored model list could not be read and was discarded. Without this
|
|
324
|
+
the shortened list reads exactly like a runner nothing was ever enabled on, and
|
|
325
|
+
only one of those is fixed by re-ticking. -->
|
|
326
|
+
<div v-if="e.unreadableModels" class="mt-1 text-[11px] text-amber-400">
|
|
327
|
+
{{ t('settings.localModelEndpoints.modelsDiscarded') }}
|
|
328
|
+
</div>
|
|
249
329
|
</div>
|
|
250
330
|
<div class="flex items-center gap-1">
|
|
251
331
|
<UButton
|
|
@@ -255,11 +335,7 @@ async function remove(p: LocalRunner) {
|
|
|
255
335
|
size="xs"
|
|
256
336
|
:disabled="busy"
|
|
257
337
|
:title="t('settings.localModelEndpoints.edit')"
|
|
258
|
-
@click="
|
|
259
|
-
() => {
|
|
260
|
-
provider = e.provider
|
|
261
|
-
}
|
|
262
|
-
"
|
|
338
|
+
@click="selectRunner(e.provider)"
|
|
263
339
|
/>
|
|
264
340
|
<UButton
|
|
265
341
|
icon="i-lucide-trash-2"
|
|
@@ -284,7 +360,13 @@ async function remove(p: LocalRunner) {
|
|
|
284
360
|
|
|
285
361
|
<div class="flex flex-wrap items-end gap-3">
|
|
286
362
|
<UFormField :label="t('settings.localModelEndpoints.runnerType')">
|
|
287
|
-
<USelect
|
|
363
|
+
<USelect
|
|
364
|
+
:model-value="provider"
|
|
365
|
+
:items="RUNNERS"
|
|
366
|
+
value-key="value"
|
|
367
|
+
class="w-48"
|
|
368
|
+
@update:model-value="(v: string) => selectRunner(v as LocalRunner)"
|
|
369
|
+
/>
|
|
288
370
|
</UFormField>
|
|
289
371
|
<UFormField
|
|
290
372
|
:label="t('settings.localModelEndpoints.labelOptional')"
|
|
@@ -349,23 +431,38 @@ async function remove(p: LocalRunner) {
|
|
|
349
431
|
}}</span>
|
|
350
432
|
</div>
|
|
351
433
|
|
|
352
|
-
<!-- discovered models multi-select -->
|
|
434
|
+
<!-- discovered models multi-select, each with its declared image support -->
|
|
353
435
|
<div v-if="discovered.length" class="space-y-1.5">
|
|
354
436
|
<span class="block text-[10px] uppercase tracking-wide text-slate-500">
|
|
355
437
|
{{ t('settings.localModelEndpoints.enableModels') }}
|
|
356
438
|
</span>
|
|
357
|
-
<
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
439
|
+
<p class="text-[11px] text-slate-500">
|
|
440
|
+
{{ t('settings.localModelEndpoints.imageInputHint') }}
|
|
441
|
+
</p>
|
|
442
|
+
<div class="space-y-1.5">
|
|
443
|
+
<div v-for="m in discovered" :key="m" class="flex items-center gap-2">
|
|
444
|
+
<label class="flex min-w-0 flex-1 items-center gap-2 text-sm text-slate-300">
|
|
445
|
+
<UCheckbox
|
|
446
|
+
:model-value="selected.includes(m)"
|
|
447
|
+
@update:model-value="
|
|
448
|
+
(v: boolean | 'indeterminate') => toggleModel(m, v === true)
|
|
449
|
+
"
|
|
450
|
+
/>
|
|
451
|
+
<span class="truncate font-mono text-xs">{{ m }}</span>
|
|
452
|
+
</label>
|
|
453
|
+
<!-- Shown only for a model that is actually enabled: declaring a modality for one
|
|
454
|
+
nothing can run would be a setting with no effect. -->
|
|
455
|
+
<USelect
|
|
456
|
+
v-if="selected.includes(m)"
|
|
457
|
+
:model-value="imageInput[m] ?? 'unknown'"
|
|
458
|
+
:items="imageInputItems[m]"
|
|
459
|
+
value-key="value"
|
|
460
|
+
size="xs"
|
|
461
|
+
class="w-52 shrink-0"
|
|
462
|
+
:aria-label="t('settings.localModelEndpoints.imageInputLabel', { model: m })"
|
|
463
|
+
@update:model-value="(v: string) => (imageInput[m] = v as ImageInputChoice)"
|
|
366
464
|
/>
|
|
367
|
-
|
|
368
|
-
</label>
|
|
465
|
+
</div>
|
|
369
466
|
</div>
|
|
370
467
|
</div>
|
|
371
468
|
|
package/app/types/localModels.ts
CHANGED
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
|
|
14
14
|
export type {
|
|
15
15
|
LocalRunner,
|
|
16
|
+
LocalModelDeclaration,
|
|
16
17
|
LocalModelEndpoint,
|
|
17
18
|
LocalRunnerUrlReason,
|
|
18
19
|
UpsertLocalModelEndpointInput,
|
|
@@ -22,3 +23,9 @@ export type {
|
|
|
22
23
|
|
|
23
24
|
// Value re-exports (the per-runner default base URL + display labels).
|
|
24
25
|
export { LOCAL_RUNNER_DEFAULTS, LOCAL_RUNNER_LABELS } from '@cat-factory/contracts'
|
|
26
|
+
|
|
27
|
+
// What the platform already KNOWS about the popular local model families. The panel reads the same
|
|
28
|
+
// table the engine folds onto a dispatched ref, so the "not set" option can state what will happen
|
|
29
|
+
// instead of implying nothing will.
|
|
30
|
+
export { knownLocalModel } from '@cat-factory/contracts'
|
|
31
|
+
export type { KnownLocalModel } from '@cat-factory/contracts'
|
package/i18n/locales/de.json
CHANGED
|
@@ -1133,6 +1133,15 @@
|
|
|
1133
1133
|
"reachable": "Erreichbar · keine Modelle | Erreichbar · {count} Modell | Erreichbar · {count} Modelle",
|
|
1134
1134
|
"noModels": "Keine Modelle gemeldet.",
|
|
1135
1135
|
"enableModels": "Modelle aktivieren",
|
|
1136
|
+
"imageInputHint": "Manche lokalen Modelle lesen Screenshots und Design-Renderings. Bekannte Modellfamilien werden automatisch erkannt, und die Option Nicht gesetzt zeigt pro Modell, wie es behandelt wird; setzen Sie den Wert selbst für einen Build, den die Plattform nicht kennen kann, etwa eine reine Text-Quantisierung oder ein Fine-Tuning.",
|
|
1137
|
+
"imageInputLabel": "Bildunterstützung für {model}",
|
|
1138
|
+
"imageInput": {
|
|
1139
|
+
"autoYes": "Nicht gesetzt: {family} liest Bilder",
|
|
1140
|
+
"autoNo": "Nicht gesetzt: {family} ist nur Text",
|
|
1141
|
+
"unknown": "Bilder: nicht gesetzt",
|
|
1142
|
+
"yes": "Liest Bilder",
|
|
1143
|
+
"no": "Nur Text"
|
|
1144
|
+
},
|
|
1136
1145
|
"toast": {
|
|
1137
1146
|
"saved": "{name} gespeichert",
|
|
1138
1147
|
"saveFailed": "Runner konnte nicht gespeichert werden",
|
|
@@ -1144,6 +1153,7 @@
|
|
|
1144
1153
|
"body": "\"{name}\" wird entfernt. Dies kann nicht rückgängig gemacht werden."
|
|
1145
1154
|
},
|
|
1146
1155
|
"blocked": "Die URL dieses Runners ist auf dieser Installation nicht erlaubt, daher sind seine Modelle in der Auswahl ausgeblendet.",
|
|
1156
|
+
"modelsDiscarded": "Einige der aktivierten Modelle dieses Runners konnten nicht gelesen werden und wurden verworfen. Wählen Sie die gewünschten erneut aus und speichern Sie.",
|
|
1147
1157
|
"urlReason": {
|
|
1148
1158
|
"invalid_url": "Das ist keine gültige URL.",
|
|
1149
1159
|
"scheme_not_allowed": "Eine Runner-URL muss mit http:// oder https:// beginnen.",
|
package/i18n/locales/en.json
CHANGED
|
@@ -3870,6 +3870,15 @@
|
|
|
3870
3870
|
"reachable": "Reachable · no models | Reachable · {count} model | Reachable · {count} models",
|
|
3871
3871
|
"noModels": "No models reported.",
|
|
3872
3872
|
"enableModels": "Enable models",
|
|
3873
|
+
"imageInputHint": "Some local models read screenshots and design renders. Well-known families are recognised automatically, and the not-set option on each model says which way it falls; set it yourself for a build the platform cannot know about, such as a text-only quant or a fine-tune.",
|
|
3874
|
+
"imageInputLabel": "Image support for {model}",
|
|
3875
|
+
"imageInput": {
|
|
3876
|
+
"autoYes": "Not set: {family} reads images",
|
|
3877
|
+
"autoNo": "Not set: {family} is text only",
|
|
3878
|
+
"unknown": "Images: not set",
|
|
3879
|
+
"yes": "Reads images",
|
|
3880
|
+
"no": "Text only"
|
|
3881
|
+
},
|
|
3873
3882
|
"toast": {
|
|
3874
3883
|
"saved": "{name} saved",
|
|
3875
3884
|
"saveFailed": "Could not save runner",
|
|
@@ -3881,6 +3890,7 @@
|
|
|
3881
3890
|
"body": "\"{name}\" will be removed. This can't be undone."
|
|
3882
3891
|
},
|
|
3883
3892
|
"blocked": "This runner's URL is not allowed on this deployment, so its models are hidden from the picker.",
|
|
3893
|
+
"modelsDiscarded": "Some of this runner's enabled models could not be read and were discarded. Re-select the ones you want and save.",
|
|
3884
3894
|
"urlReason": {
|
|
3885
3895
|
"invalid_url": "That is not a valid URL.",
|
|
3886
3896
|
"scheme_not_allowed": "A runner URL must start with http:// or https://.",
|
package/i18n/locales/es.json
CHANGED
|
@@ -3588,6 +3588,15 @@
|
|
|
3588
3588
|
"reachable": "Accesible · ningún modelo | Accesible · {count} modelo | Accesible · {count} modelos",
|
|
3589
3589
|
"noModels": "No se informó de ningún modelo.",
|
|
3590
3590
|
"enableModels": "Habilitar modelos",
|
|
3591
|
+
"imageInputHint": "Algunos modelos locales leen capturas de pantalla y renders de diseño. Las familias conocidas se reconocen automáticamente, y la opción Sin definir de cada modelo indica cómo se tratará; defínelo tú mismo para una compilación que la plataforma no puede conocer, como una cuantización solo de texto o un ajuste fino.",
|
|
3592
|
+
"imageInputLabel": "Compatibilidad con imágenes de {model}",
|
|
3593
|
+
"imageInput": {
|
|
3594
|
+
"autoYes": "Sin definir: {family} lee imágenes",
|
|
3595
|
+
"autoNo": "Sin definir: {family} es solo texto",
|
|
3596
|
+
"unknown": "Imágenes: sin definir",
|
|
3597
|
+
"yes": "Lee imágenes",
|
|
3598
|
+
"no": "Solo texto"
|
|
3599
|
+
},
|
|
3591
3600
|
"toast": {
|
|
3592
3601
|
"saved": "{name} guardado",
|
|
3593
3602
|
"saveFailed": "No se pudo guardar el runner",
|
|
@@ -3599,6 +3608,7 @@
|
|
|
3599
3608
|
"body": "Se eliminará \"{name}\". Esta acción no se puede deshacer."
|
|
3600
3609
|
},
|
|
3601
3610
|
"blocked": "La URL de este runner no está permitida en esta instalación, por lo que sus modelos están ocultos en el selector.",
|
|
3611
|
+
"modelsDiscarded": "Algunos de los modelos habilitados de este runner no se pudieron leer y se descartaron. Vuelve a seleccionar los que quieras y guarda.",
|
|
3602
3612
|
"urlReason": {
|
|
3603
3613
|
"invalid_url": "Esa URL no es válida.",
|
|
3604
3614
|
"scheme_not_allowed": "La URL de un runner debe empezar por http:// o https://.",
|
package/i18n/locales/fr.json
CHANGED
|
@@ -3588,6 +3588,15 @@
|
|
|
3588
3588
|
"reachable": "Joignable · aucun modèle | Joignable · {count} modèle | Joignable · {count} modèles",
|
|
3589
3589
|
"noModels": "Aucun modèle signalé.",
|
|
3590
3590
|
"enableModels": "Activer les modèles",
|
|
3591
|
+
"imageInputHint": "Certains modèles locaux lisent les captures d'écran et les rendus de design. Les familles connues sont reconnues automatiquement, et l'option Non défini de chaque modèle indique ce qui s'appliquera ; définissez-la vous-même pour une version que la plateforme ne peut pas connaître, comme une quantification texte seulement ou un modèle affiné.",
|
|
3592
|
+
"imageInputLabel": "Prise en charge des images pour {model}",
|
|
3593
|
+
"imageInput": {
|
|
3594
|
+
"autoYes": "Non défini : {family} lit les images",
|
|
3595
|
+
"autoNo": "Non défini : {family} est texte seulement",
|
|
3596
|
+
"unknown": "Images : non défini",
|
|
3597
|
+
"yes": "Lit les images",
|
|
3598
|
+
"no": "Texte seulement"
|
|
3599
|
+
},
|
|
3591
3600
|
"toast": {
|
|
3592
3601
|
"saved": "{name} enregistré",
|
|
3593
3602
|
"saveFailed": "Impossible d'enregistrer le runner",
|
|
@@ -3599,6 +3608,7 @@
|
|
|
3599
3608
|
"body": "\"{name}\" sera supprimé. Cette action est irréversible."
|
|
3600
3609
|
},
|
|
3601
3610
|
"blocked": "L'URL de ce runner n'est pas autorisée sur ce déploiement, ses modèles sont donc masqués dans le sélecteur.",
|
|
3611
|
+
"modelsDiscarded": "Certains modèles activés de ce runner n'ont pas pu être lus et ont été supprimés. Sélectionnez à nouveau ceux que vous voulez, puis enregistrez.",
|
|
3602
3612
|
"urlReason": {
|
|
3603
3613
|
"invalid_url": "Cette URL n'est pas valide.",
|
|
3604
3614
|
"scheme_not_allowed": "L'URL d'un runner doit commencer par http:// ou https://.",
|
package/i18n/locales/he.json
CHANGED
|
@@ -3730,6 +3730,15 @@
|
|
|
3730
3730
|
"reachable": "נגיש · אין מודלים | נגיש · {count} מודל | נגיש · {count} מודלים | נגיש · {count} מודלים",
|
|
3731
3731
|
"noModels": "לא דווחו מודלים.",
|
|
3732
3732
|
"enableModels": "אפשר מודלים",
|
|
3733
|
+
"imageInputHint": "מודלים מקומיים מסוימים קוראים צילומי מסך ורנדרים של עיצוב. משפחות מודלים מוכרות מזוהות אוטומטית, והאפשרות לא הוגדר אצל כל מודל מציינת כיצד הוא יטופל; הגדירו זאת בעצמכם עבור בנייה שהפלטפורמה אינה יכולה להכיר, כמו קוונטיזציה לטקסט בלבד או כיוונון עדין.",
|
|
3734
|
+
"imageInputLabel": "תמיכה בתמונות עבור {model}",
|
|
3735
|
+
"imageInput": {
|
|
3736
|
+
"autoYes": "לא הוגדר: {family} קורא תמונות",
|
|
3737
|
+
"autoNo": "לא הוגדר: {family} הוא טקסט בלבד",
|
|
3738
|
+
"unknown": "תמונות: לא הוגדר",
|
|
3739
|
+
"yes": "קורא תמונות",
|
|
3740
|
+
"no": "טקסט בלבד"
|
|
3741
|
+
},
|
|
3733
3742
|
"toast": {
|
|
3734
3743
|
"saved": "{name} נשמר",
|
|
3735
3744
|
"saveFailed": "לא ניתן היה לשמור מריץ",
|
|
@@ -3741,6 +3750,7 @@
|
|
|
3741
3750
|
"body": "\"{name}\" יימחק. לא ניתן לבטל פעולה זו."
|
|
3742
3751
|
},
|
|
3743
3752
|
"blocked": "כתובת ה-URL של מריץ זה אינה מותרת בפריסה הזו, ולכן הדגמים שלו מוסתרים מהבורר.",
|
|
3753
|
+
"modelsDiscarded": "חלק מהמודלים שהופעלו במריץ הזה לא ניתנו לקריאה והושמטו. בחרו מחדש את אלה שאתם רוצים ושמרו.",
|
|
3744
3754
|
"urlReason": {
|
|
3745
3755
|
"invalid_url": "זו אינה כתובת URL תקפה.",
|
|
3746
3756
|
"scheme_not_allowed": "כתובת URL של מריץ חייבת להתחיל ב-http:// או ב-https://.",
|
package/i18n/locales/it.json
CHANGED
|
@@ -1133,6 +1133,15 @@
|
|
|
1133
1133
|
"reachable": "Raggiungibile · nessun modello | Raggiungibile · {count} modello | Raggiungibile · {count} modelli",
|
|
1134
1134
|
"noModels": "Nessun modello riportato.",
|
|
1135
1135
|
"enableModels": "Abilita i modelli",
|
|
1136
|
+
"imageInputHint": "Alcuni modelli locali leggono screenshot e render di design. Le famiglie note vengono riconosciute automaticamente e l'opzione Non impostato di ogni modello indica come verrà trattato; impostalo tu per una build che la piattaforma non può conoscere, come una quantizzazione solo testo o un fine-tuning.",
|
|
1137
|
+
"imageInputLabel": "Supporto immagini per {model}",
|
|
1138
|
+
"imageInput": {
|
|
1139
|
+
"autoYes": "Non impostato: {family} legge immagini",
|
|
1140
|
+
"autoNo": "Non impostato: {family} è solo testo",
|
|
1141
|
+
"unknown": "Immagini: non impostato",
|
|
1142
|
+
"yes": "Legge immagini",
|
|
1143
|
+
"no": "Solo testo"
|
|
1144
|
+
},
|
|
1136
1145
|
"toast": {
|
|
1137
1146
|
"saved": "{name} salvato",
|
|
1138
1147
|
"saveFailed": "Impossibile salvare il runner",
|
|
@@ -1144,6 +1153,7 @@
|
|
|
1144
1153
|
"body": "\"{name}\" verra rimosso. Questa operazione non puo essere annullata."
|
|
1145
1154
|
},
|
|
1146
1155
|
"blocked": "L'URL di questo runner non è consentito su questo deployment, quindi i suoi modelli sono nascosti nel selettore.",
|
|
1156
|
+
"modelsDiscarded": "Alcuni dei modelli abilitati di questo runner non sono risultati leggibili e sono stati scartati. Riseleziona quelli che vuoi e salva.",
|
|
1147
1157
|
"urlReason": {
|
|
1148
1158
|
"invalid_url": "Questo URL non è valido.",
|
|
1149
1159
|
"scheme_not_allowed": "L'URL di un runner deve iniziare con http:// o https://.",
|
package/i18n/locales/ja.json
CHANGED
|
@@ -3730,6 +3730,15 @@
|
|
|
3730
3730
|
"reachable": "接続可能 · モデルなし | 接続可能 · {count} 個のモデル | 接続可能 · {count} 個のモデル",
|
|
3731
3731
|
"noModels": "報告されたモデルがありません。",
|
|
3732
3732
|
"enableModels": "モデルを有効化",
|
|
3733
|
+
"imageInputHint": "一部のローカルモデルはスクリーンショットやデザインのレンダー画像を読み取れます。よく使われるモデルファミリーは自動的に判別され、各モデルの未設定の選択肢にどちらとして扱われるかが表示されます。テキスト専用の量子化版やファインチューンなど、プラットフォームでは判断できないビルドの場合にご自身で設定してください。",
|
|
3734
|
+
"imageInputLabel": "{model} の画像対応",
|
|
3735
|
+
"imageInput": {
|
|
3736
|
+
"autoYes": "未設定: {family} は画像を読み取る",
|
|
3737
|
+
"autoNo": "未設定: {family} はテキストのみ",
|
|
3738
|
+
"unknown": "画像: 未設定",
|
|
3739
|
+
"yes": "画像を読み取る",
|
|
3740
|
+
"no": "テキストのみ"
|
|
3741
|
+
},
|
|
3733
3742
|
"toast": {
|
|
3734
3743
|
"saved": "{name} を保存しました",
|
|
3735
3744
|
"saveFailed": "ランナーを保存できませんでした",
|
|
@@ -3741,6 +3750,7 @@
|
|
|
3741
3750
|
"body": "「{name}」が削除されます。 この操作は取り消せません。"
|
|
3742
3751
|
},
|
|
3743
3752
|
"blocked": "このランナーの URL はこのデプロイでは許可されていないため、モデルはピッカーに表示されません。",
|
|
3753
|
+
"modelsDiscarded": "このランナーで有効になっていたモデルの一部を読み取れず、破棄しました。必要なものを選び直して保存してください。",
|
|
3744
3754
|
"urlReason": {
|
|
3745
3755
|
"invalid_url": "有効な URL ではありません。",
|
|
3746
3756
|
"scheme_not_allowed": "ランナーの URL は http:// または https:// で始める必要があります。",
|
package/i18n/locales/pl.json
CHANGED
|
@@ -3588,6 +3588,15 @@
|
|
|
3588
3588
|
"reachable": "Osiągalny · {count} model | Osiągalny · {count} modele | Osiągalny · {count} modeli",
|
|
3589
3589
|
"noModels": "Nie zgłoszono żadnych modeli.",
|
|
3590
3590
|
"enableModels": "Włącz modele",
|
|
3591
|
+
"imageInputHint": "Część modeli lokalnych czyta zrzuty ekranu i rendery projektów. Znane rodziny modeli są rozpoznawane automatycznie, a opcja Nie ustawiono przy każdym modelu mówi, jak zostanie potraktowany; ustaw ją samodzielnie dla wersji, której platforma nie może znać, na przykład kwantyzacji tylko tekstowej lub własnego dostrojenia.",
|
|
3592
|
+
"imageInputLabel": "Obsługa obrazów dla {model}",
|
|
3593
|
+
"imageInput": {
|
|
3594
|
+
"autoYes": "Nie ustawiono: {family} czyta obrazy",
|
|
3595
|
+
"autoNo": "Nie ustawiono: {family} obsługuje tylko tekst",
|
|
3596
|
+
"unknown": "Obrazy: nie ustawiono",
|
|
3597
|
+
"yes": "Czyta obrazy",
|
|
3598
|
+
"no": "Tylko tekst"
|
|
3599
|
+
},
|
|
3591
3600
|
"toast": {
|
|
3592
3601
|
"saved": "Zapisano {name}",
|
|
3593
3602
|
"saveFailed": "Nie udało się zapisać runnera",
|
|
@@ -3599,6 +3608,7 @@
|
|
|
3599
3608
|
"body": "\"{name}\" zostanie usunięty. Tej operacji nie można cofnąć."
|
|
3600
3609
|
},
|
|
3601
3610
|
"blocked": "Adres URL tego runnera nie jest dozwolony w tym wdrożeniu, dlatego jego modele są ukryte w selektorze.",
|
|
3611
|
+
"modelsDiscarded": "Części włączonych modeli tego runnera nie udało się odczytać i zostały odrzucone. Wybierz ponownie te, których chcesz, i zapisz.",
|
|
3602
3612
|
"urlReason": {
|
|
3603
3613
|
"invalid_url": "To nie jest prawidłowy adres URL.",
|
|
3604
3614
|
"scheme_not_allowed": "Adres URL runnera musi zaczynać się od http:// lub https://.",
|
package/i18n/locales/tr.json
CHANGED
|
@@ -3730,6 +3730,15 @@
|
|
|
3730
3730
|
"reachable": "Ulaşılabilir · model yok | Ulaşılabilir · {count} model | Ulaşılabilir · {count} model",
|
|
3731
3731
|
"noModels": "Model bildirilmedi.",
|
|
3732
3732
|
"enableModels": "Modelleri etkinleştir",
|
|
3733
|
+
"imageInputHint": "Bazı yerel modeller ekran görüntülerini ve tasarım render'larını okuyabilir. Bilinen model aileleri otomatik olarak tanınır ve her modeldeki Ayarlanmadı seçeneği hangi sonucu vereceğini belirtir; yalnızca metin niceleme ya da ince ayar gibi platformun bilemeyeceği bir yapı için bunu kendiniz ayarlayın.",
|
|
3734
|
+
"imageInputLabel": "{model} için görsel desteği",
|
|
3735
|
+
"imageInput": {
|
|
3736
|
+
"autoYes": "Ayarlanmadı: {family} görsel okur",
|
|
3737
|
+
"autoNo": "Ayarlanmadı: {family} yalnızca metin",
|
|
3738
|
+
"unknown": "Görseller: ayarlanmadı",
|
|
3739
|
+
"yes": "Görsel okur",
|
|
3740
|
+
"no": "Yalnızca metin"
|
|
3741
|
+
},
|
|
3733
3742
|
"toast": {
|
|
3734
3743
|
"saved": "{name} kaydedildi",
|
|
3735
3744
|
"saveFailed": "Çalıştırıcı kaydedilemedi",
|
|
@@ -3741,6 +3750,7 @@
|
|
|
3741
3750
|
"body": "\"{name}\" kaldırılacak. Bu işlem geri alınamaz."
|
|
3742
3751
|
},
|
|
3743
3752
|
"blocked": "Bu çalıştırıcının URL adresi bu kurulumda izinli değil, bu nedenle modelleri seçicide gizlendi.",
|
|
3753
|
+
"modelsDiscarded": "Bu çalıştırıcının etkin modellerinin bir kısmı okunamadı ve atıldı. İstediklerinizi yeniden seçip kaydedin.",
|
|
3744
3754
|
"urlReason": {
|
|
3745
3755
|
"invalid_url": "Bu geçerli bir URL değil.",
|
|
3746
3756
|
"scheme_not_allowed": "Çalıştırıcı URL adresi http:// veya https:// ile başlamalıdır.",
|
package/i18n/locales/uk.json
CHANGED
|
@@ -3588,6 +3588,15 @@
|
|
|
3588
3588
|
"reachable": "Доступний · {count} модель | Доступний · {count} моделі | Доступний · {count} моделей",
|
|
3589
3589
|
"noModels": "Жодної моделі не повідомлено.",
|
|
3590
3590
|
"enableModels": "Увімкнути моделі",
|
|
3591
|
+
"imageInputHint": "Деякі локальні моделі читають знімки екрана та рендери дизайну. Відомі сімейства моделей розпізнаються автоматично, а параметр Не задано біля кожної моделі показує, як її буде оброблено; задайте його самостійно для збірки, про яку платформа не може знати, як-от суто текстова квантизація або власне доналаштування.",
|
|
3592
|
+
"imageInputLabel": "Підтримка зображень для {model}",
|
|
3593
|
+
"imageInput": {
|
|
3594
|
+
"autoYes": "Не задано: {family} читає зображення",
|
|
3595
|
+
"autoNo": "Не задано: {family} лише текст",
|
|
3596
|
+
"unknown": "Зображення: не задано",
|
|
3597
|
+
"yes": "Читає зображення",
|
|
3598
|
+
"no": "Лише текст"
|
|
3599
|
+
},
|
|
3591
3600
|
"toast": {
|
|
3592
3601
|
"saved": "{name} збережено",
|
|
3593
3602
|
"saveFailed": "Не вдалося зберегти раннер",
|
|
@@ -3599,6 +3608,7 @@
|
|
|
3599
3608
|
"body": "\"{name}\" буде видалено. Цю дію не можна скасувати."
|
|
3600
3609
|
},
|
|
3601
3610
|
"blocked": "URL цього раннера не дозволений у цьому розгортанні, тому його моделі приховані у виборі.",
|
|
3611
|
+
"modelsDiscarded": "Частину увімкнених моделей цього раннера не вдалося прочитати, і вони були відкинуті. Виберіть потрібні знову та збережіть.",
|
|
3602
3612
|
"urlReason": {
|
|
3603
3613
|
"invalid_url": "Це недійсний URL.",
|
|
3604
3614
|
"scheme_not_allowed": "URL раннера має починатися з http:// або https://.",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cat-factory/app",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.262.0",
|
|
4
4
|
"description": "Reusable Nuxt layer for the Agent Architecture Board SPA (components, stores, composables, pages). Consume it from a thin deployment app via `extends: ['@cat-factory/app']` and point it at your backend with NUXT_PUBLIC_API_BASE. See deploy/frontend for an example.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"valibot": "^1.4.2",
|
|
41
41
|
"vue": "3.5.41",
|
|
42
42
|
"wretch": "^3.0.9",
|
|
43
|
-
"@cat-factory/contracts": "0.
|
|
43
|
+
"@cat-factory/contracts": "0.297.0"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
46
|
"@toad-contracts/testing": "0.3.2",
|