pgkiln 0.69.0 → 0.70.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/db/migrations/136_vector_search.sql +252 -0
- package/docs/apex-feature-parity.md +5 -4
- package/docs/guide/03-builder.md +69 -0
- package/docs/guide/04-pages-and-regions.md +42 -2
- package/docs/guide/09-reference.md +19 -0
- package/docs/guide/12-development.md +31 -2
- package/docs/guide/15-extensions.md +1 -1
- package/examples/hr/README.md +1 -0
- package/examples/hr/hr_72_vector_search.sql +158 -0
- package/package.json +1 -1
- package/public/builder.css +3 -0
- package/src/ai/embeddings.ts +197 -0
- package/src/ai/service.ts +13 -9
- package/src/app.ts +3 -0
- package/src/builder/advisor.ts +41 -1
- package/src/builder/ai-agents.ts +13 -5
- package/src/builder/components.ts +21 -3
- package/src/builder/home.ts +1 -0
- package/src/builder/i18n/de.ts +34 -0
- package/src/builder/i18n/en.ts +34 -0
- package/src/builder/i18n/es.ts +34 -0
- package/src/builder/i18n/fr.ts +34 -0
- package/src/builder/i18n/it.ts +34 -0
- package/src/builder/i18n/ja.ts +34 -0
- package/src/builder/i18n/ko.ts +34 -0
- package/src/builder/i18n/nl.ts +34 -0
- package/src/builder/i18n/pt.ts +34 -0
- package/src/builder/i18n/zh-cn.ts +34 -0
- package/src/builder/i18n/zh-tw.ts +34 -0
- package/src/builder/object-actions.ts +1 -0
- package/src/builder/shared.ts +1 -1
- package/src/builder/sql.ts +3 -0
- package/src/builder/table-editor.ts +1 -0
- package/src/builder/vector-column.ts +229 -0
- package/src/builder/vector-providers.ts +286 -0
- package/src/cli/replace.ts +3 -1
- package/src/runtime/ai-agents.ts +53 -2
- package/src/runtime/search.ts +116 -12
- package/src/server.ts +3 -0
- package/src/vector.ts +288 -0
package/src/builder/ai-agents.ts
CHANGED
|
@@ -24,6 +24,7 @@ const TOOL_TYPES: [string, string][] = [
|
|
|
24
24
|
['rest', 'REST data source'],
|
|
25
25
|
['javascript', 'JavaScript action in the browser'],
|
|
26
26
|
['navigate', 'Navigate: a link to a page'],
|
|
27
|
+
['retrieve', 'Retrieve (RAG): rows of a search configuration'],
|
|
27
28
|
];
|
|
28
29
|
|
|
29
30
|
const when = (d: Date | string) => new Date(d).toISOString().slice(0, 19).replace('T', ' ');
|
|
@@ -87,6 +88,7 @@ async function agentForm(a: any, s: Session, x: Partial<AiAgent>, original: stri
|
|
|
87
88
|
|
|
88
89
|
async function toolForm(a: any, s: Session, x: Partial<AiTool> & { parameters_text?: string }, original: string, problems: string[]): Promise<Raw> {
|
|
89
90
|
const sources = (await owner.query<{ name: string }>('select name from meta.rest_source where app_id = $1 order by name', [a.id])).rows.map((r) => r.name);
|
|
91
|
+
const configs = (await owner.query<{ name: string; search_type: string }>(`select name, search_type from meta.search_config where app_id = $1 and source_type <> 'list' order by name`, [a.id])).rows;
|
|
90
92
|
const params = x.parameters_text ?? (x.parameters ? JSON.stringify(x.parameters, null, 2) : '');
|
|
91
93
|
const usedBy = original ? ((a.ai_agents ?? []) as AiAgent[]).filter((g) => (g.tools ?? []).includes(original)).map((g) => g.name) : [];
|
|
92
94
|
return html`${problems.length ? html`<div class="alert alert-error" role="alert">${problems.join(' ')}</div>` : ''}
|
|
@@ -100,7 +102,10 @@ async function toolForm(a: any, s: Session, x: Partial<AiTool> & { parameters_te
|
|
|
100
102
|
${select('source', 'REST data source (REST)', x.source ?? '', [['', '-'], ...sources.map((n): [string, string] => [n, n])], 'The parameters become the source\'s parameters.')}
|
|
101
103
|
${input('action', 'Action (JavaScript)', x.action ?? '', { placeholder: 'e.g. highlightOrder', help: 'After the answer the browser calls the function registered with pgkiln.actions.register(name) with {value: the arguments}, and the dynamic actions of the custom event of this name.' })}
|
|
102
104
|
${input('pages', 'Pages (Navigate)', (x.pages ?? []).join(', '), { placeholder: 'e.g. 3, 7', help: 'The page numbers the agent may link to. pgkiln offers only those the user may open and builds the URL (item values with their checksum).' })}
|
|
103
|
-
${
|
|
105
|
+
${select('search_config', 'Search configuration (Retrieve)', x.search_config ?? '', [['', '-'], ...configs.map((c): [string, string] => [c.name, `${c.name} (${c.search_type})`]),
|
|
106
|
+
...(x.search_config && !configs.some((c) => c.name === x.search_config) ? [[x.search_config, `${x.search_config} (does not exist)`] as [string, string]] : [])],
|
|
107
|
+
'The model gives a text; pgkiln runs this search configuration (best: vector or hybrid) as the application\'s role, so row level security applies, and returns the best rows\' title, text and score.')}
|
|
108
|
+
${area('parameters', 'Parameters (JSON; not for Navigate or Retrieve)', params, 6, '{"DNAME": {"type": "string", "description": "A department name"}, "LIMIT": {"type": "integer", "optional": true}}. Types: string, integer, number, boolean, date; "enum" for a list of texts.', true)}
|
|
104
109
|
${input('max_rows', 'Maximum rows', x.max_rows ?? '', { type: 'number', placeholder: '50', help: 'Rows the model gets back (1 – 500).' })}
|
|
105
110
|
${input('timeout_s', 'Time limit (seconds)', x.timeout_s ?? '', { type: 'number', placeholder: '15', help: 'SQL and function tools (1 – 60).' })}
|
|
106
111
|
${authzSelect(await schemes(a.id), x.authz, 'Only users who pass it are offered the tool.')}
|
|
@@ -151,8 +156,9 @@ function toolFrom(b: Body, errors: string[]): AiTool & { parameters_text?: strin
|
|
|
151
156
|
if (type === 'rest') x.source = one(b.source).trim().toUpperCase();
|
|
152
157
|
if (type === 'javascript') x.action = one(b.action).trim();
|
|
153
158
|
if (type === 'navigate') x.pages = one(b.pages).split(/[\s,;]+/).filter(Boolean).map(Number);
|
|
159
|
+
if (type === 'retrieve') x.search_config = one(b.search_config).trim().toUpperCase();
|
|
154
160
|
const params = one(b.parameters).trim();
|
|
155
|
-
if (params && type !== 'navigate') {
|
|
161
|
+
if (params && type !== 'navigate' && type !== 'retrieve') {
|
|
156
162
|
try {
|
|
157
163
|
x.parameters = JSON.parse(params);
|
|
158
164
|
} catch {
|
|
@@ -160,11 +166,11 @@ function toolFrom(b: Body, errors: string[]): AiTool & { parameters_text?: strin
|
|
|
160
166
|
x.parameters_text = params;
|
|
161
167
|
}
|
|
162
168
|
}
|
|
163
|
-
if (type === 'sql' || type === 'function' || type === 'rest') {
|
|
169
|
+
if (type === 'sql' || type === 'function' || type === 'rest' || type === 'retrieve') {
|
|
164
170
|
const rows = intOrUndef(one(b.max_rows), 'Maximum rows', errors);
|
|
165
171
|
if (rows !== undefined) x.max_rows = rows;
|
|
166
172
|
}
|
|
167
|
-
if (type === 'sql' || type === 'function') {
|
|
173
|
+
if (type === 'sql' || type === 'function' || type === 'retrieve') {
|
|
168
174
|
const t = intOrUndef(one(b.timeout_s), 'Time limit', errors);
|
|
169
175
|
if (t !== undefined) x.timeout_s = t;
|
|
170
176
|
}
|
|
@@ -225,7 +231,7 @@ export async function aiAgentRoutes(app: FastifyInstance) {
|
|
|
225
231
|
const problems = definitionProblems(agents, tools);
|
|
226
232
|
const main = html`${appHeader(a, 'shared', s)}
|
|
227
233
|
<div class="title-row"><h1>AI Agents</h1></div>
|
|
228
|
-
<p class="muted u-mt0">An agent answers in an AI assistant region and acts only through the tools you give it: SQL queries (read-only, as the application's database role, so row level security applies), PL/pgSQL functions, REST data sources, JavaScript actions in the browser, and links to pages (pgkiln builds the URL and its checksum, only for pages the user may open). What users type and the tools' results go to the agent's AI service. <a href="${BASE}/apps/${a.id}/ai">AI usage</a> lists every tool call.</p>
|
|
234
|
+
<p class="muted u-mt0">An agent answers in an AI assistant region and acts only through the tools you give it: SQL queries (read-only, as the application's database role, so row level security applies), PL/pgSQL functions, REST data sources, JavaScript actions in the browser, and links to pages (pgkiln builds the URL and its checksum, only for pages the user may open). A Retrieve tool gives the agent the rows of a search configuration that match a text by meaning (RAG), again as the application's role. What users type and the tools' results go to the agent's AI service. <a href="${BASE}/apps/${a.id}/ai">AI usage</a> lists every tool call.</p>
|
|
229
235
|
${problems.length ? html`<div class="alert alert-error" role="alert">${problems.join(' ')}</div>` : ''}
|
|
230
236
|
<div class="columns">
|
|
231
237
|
${region('Agents', html`<div class="table-wrap"><table class="report report-reflow"><thead><tr><th>Agent</th><th>AI service</th><th>Tools</th><th>Authorization</th></tr></thead>
|
|
@@ -322,6 +328,8 @@ export async function aiAgentRoutes(app: FastifyInstance) {
|
|
|
322
328
|
const out = aiToolProblems(tool);
|
|
323
329
|
if (tool.type === 'rest' && tool.source && !(await owner.one('select 1 from meta.rest_source where app_id = $1 and name = $2', [a.id, tool.source])))
|
|
324
330
|
out.push(`There is no REST data source ${tool.source}.`);
|
|
331
|
+
if (tool.type === 'retrieve' && tool.search_config && !(await owner.one(`select 1 from meta.search_config where app_id = $1 and name = $2 and source_type <> 'list'`, [a.id, tool.search_config])))
|
|
332
|
+
out.push(`There is no search configuration ${tool.search_config} with a table or SQL source.`);
|
|
325
333
|
if (tool.type === 'navigate') {
|
|
326
334
|
const known = new Set((await owner.query<{ page_no: number }>('select page_no from meta.page where app_id = $1', [a.id])).rows.map((p) => p.page_no));
|
|
327
335
|
for (const p of tool.pages ?? []) if (!known.has(p)) out.push(`There is no page ${p}.`);
|
|
@@ -722,12 +722,20 @@ export const COMPONENTS: Record<string, ComponentSpec> = {
|
|
|
722
722
|
plural: 'Search configurations',
|
|
723
723
|
icon: 'search',
|
|
724
724
|
summary: (c) => `${c.name} (${c.source_type})`,
|
|
725
|
-
defaults: { source_type: 'table', search_type: 'standard', seq: 10, max_results: 10, searchable_columns: [], did_you_mean: false },
|
|
725
|
+
defaults: { source_type: 'table', search_type: 'standard', seq: 10, max_results: 10, searchable_columns: [], did_you_mean: false, distance: 'cosine' },
|
|
726
726
|
validate: (v) => searchConfigProblems(v as never).join(' ') || null,
|
|
727
727
|
// (135) empty means: built from the searchable columns / the application language's configuration
|
|
728
728
|
beforeSave: async (v) => {
|
|
729
729
|
for (const k of ['fts_vector', 'fts_config'] as const) if (typeof v[k] === 'string' && !(v[k] as string).trim()) v[k] = null;
|
|
730
730
|
if (typeof v.fts_config === 'string') v.fts_config = v.fts_config.trim().toLowerCase();
|
|
731
|
+
// (136) vector and hybrid search
|
|
732
|
+
for (const k of ['vector_column', 'key_column'] as const) if (typeof v[k] === 'string') v[k] = (v[k] as string).trim() || null;
|
|
733
|
+
if (typeof v.vector_provider === 'string') v.vector_provider = v.vector_provider.trim().toUpperCase() || null;
|
|
734
|
+
if (typeof v.min_similarity === 'string') {
|
|
735
|
+
const t = v.min_similarity.trim().replace(',', '.');
|
|
736
|
+
if (t && !Number.isFinite(Number(t))) throw new Error('Minimum similarity must be a number from -1 to 1.');
|
|
737
|
+
v.min_similarity = t ? Number(t) : null;
|
|
738
|
+
}
|
|
731
739
|
},
|
|
732
740
|
fields: [
|
|
733
741
|
{ name: 'name', label: 'Name (static ID)', kind: 'upper', group: 'Identification', help: 'e.g. CUSTOMERS; a search region names it in {"configs": ["CUSTOMERS"]}.' },
|
|
@@ -738,14 +746,24 @@ export const COMPONENTS: Record<string, ComponentSpec> = {
|
|
|
738
746
|
{ name: 'source', label: 'Source', kind: 'code', wide: true, group: 'Source', help: 'table: sales.customers · sql: select id, name, city from sales.customers where active · list: the list\'s name.' },
|
|
739
747
|
{ name: 'searchable_columns', label: 'Searchable columns', kind: 'list', group: 'Source',
|
|
740
748
|
help: 'Comma-separated columns the search text is looked for in (each word must be found in one of them). Empty: the title, subtitle and description columns.' },
|
|
741
|
-
{ name: 'search_type', label: 'Search type', kind: 'select', options: ['standard', 'fulltext'], group: 'Search',
|
|
742
|
-
help: 'standard: each word anywhere in one of the searchable columns (case-insensitive) · fulltext: PostgreSQL full-text search: stemmed words ("running" finds "run"), "quoted phrases", or, -word; the best match first, the matched words highlighted (table, sql).' },
|
|
749
|
+
{ name: 'search_type', label: 'Search type', kind: 'select', options: ['standard', 'fulltext', 'vector', 'hybrid'], group: 'Search',
|
|
750
|
+
help: 'standard: each word anywhere in one of the searchable columns (case-insensitive) · fulltext: PostgreSQL full-text search: stemmed words ("running" finds "run"), "quoted phrases", or, -word; the best match first, the matched words highlighted (table, sql) · vector: by meaning: the rows whose embedding is nearest to the search text\'s (pgvector) · hybrid: full-text and vector together (reciprocal rank fusion).' },
|
|
743
751
|
{ name: 'fts_vector', label: 'tsvector column or expression', kind: 'code', wide: true, group: 'Search',
|
|
744
752
|
help: 'fulltext: a tsvector column of the source (e.g. search_vector, with a GIN index: SQL Workshop › Table Properties › Add full-text search), or an expression, e.g. to_tsvector(\'english\', title || \' \' || body). Empty: to_tsvector over the searchable columns (no index can help).' },
|
|
745
753
|
{ name: 'fts_config', label: 'Text search configuration', kind: 'text', group: 'Search',
|
|
746
754
|
help: 'fulltext: english, dutch, german, french, simple … (pg_ts_config); the same one the tsvector was made with. Empty: the application\'s primary language\'s, else simple.' },
|
|
747
755
|
{ name: 'did_you_mean', label: 'Did you mean', kind: 'bool', group: 'Search',
|
|
748
756
|
help: 'With the pg_trgm extension installed: when nothing is found, suggest the closest words from the searched columns (reads up to 10,000 rows). Without pg_trgm nothing is suggested.' },
|
|
757
|
+
{ name: 'vector_provider', label: 'Vector provider', kind: 'upper', group: 'Vector search',
|
|
758
|
+
help: 'vector, hybrid: the static ID of a vector provider (Shared Components → Vector providers) that embeds the search text, the same one that embedded the rows.' },
|
|
759
|
+
{ name: 'vector_column', label: 'Vector column', kind: 'text', group: 'Vector search',
|
|
760
|
+
help: 'vector, hybrid: the source\'s vector(n) column, e.g. embedding (SQL Workshop › Table Properties › Add vector column adds it, with an HNSW index, and keeps it current); n must be the provider\'s dimensions.' },
|
|
761
|
+
{ name: 'key_column', label: 'Key column', kind: 'text', group: 'Vector search',
|
|
762
|
+
help: 'hybrid: the primary key (e.g. id) that matches the full-text and the vector results. The full-text side uses the tsvector and text search configuration above.' },
|
|
763
|
+
{ name: 'distance', label: 'Distance', kind: 'select', options: ['cosine', 'l2', 'inner_product'], group: 'Vector search',
|
|
764
|
+
help: 'cosine (most embedding models), l2 (Euclidean) or inner_product; the HNSW index must use the same (vector_cosine_ops, vector_l2_ops, vector_ip_ops).' },
|
|
765
|
+
{ name: 'min_similarity', label: 'Minimum similarity', kind: 'text', group: 'Vector search',
|
|
766
|
+
help: 'vector, hybrid: leave out rows less similar than this (cosine: 1 − distance, e.g. 0.3; inner product: the product; l2: 1 / (1 + distance)). Empty: the nearest rows, however far.' },
|
|
749
767
|
{ name: 'title_column', label: 'Title column', kind: 'text', group: 'Result', help: 'Required (table, sql); results are ordered by it.' },
|
|
750
768
|
{ name: 'subtitle_column', label: 'Subtitle column', kind: 'text', group: 'Result' },
|
|
751
769
|
{ name: 'description_column', label: 'Description column', kind: 'text', group: 'Result' },
|
package/src/builder/home.ts
CHANGED
|
@@ -295,6 +295,7 @@ export async function homeRoutes(app: FastifyInstance) {
|
|
|
295
295
|
: s.workspace && (await workspaceAdmin(s.username, s.workspace.id))
|
|
296
296
|
? card(`${BASE}/workspaces/${s.workspace.id}`, icon('layers'), `Workspace ${s.workspace.name}`, 'Its name, developers, preferences and extension links (workspace administrators).')
|
|
297
297
|
: ''}
|
|
298
|
+
${card(`${BASE}/vector-providers`, icon('search'), 'Vector providers', 'Embeddings for search by meaning: the applications\' vector providers, their vector columns, and whether pgvector is installed.')}
|
|
298
299
|
${(await isAdmin(s.username)) ? card(`${BASE}/ai`, icon('bolt'), 'AI services', 'Claude and OpenAI for the applications: models, keys, limits and usage (administrators).') : ''}
|
|
299
300
|
${(await isAdmin(s.username)) ? card(`${BASE}/mail`, icon('send'), 'Mail services', 'SMTP, Microsoft 365, Amazon SES, Resend, Postmark, SendGrid or Mailgun for the applications\' e-mail (administrators).') : ''}
|
|
300
301
|
${(await isAdmin(s.username)) ? card(`${BASE}/installation`, icon('history'), 'Installation', 'Version, install and upgrade runs, applied migrations (administrators).') : ''}
|
package/src/builder/i18n/de.ts
CHANGED
|
@@ -1065,6 +1065,40 @@ export const de: BuilderMessages = {
|
|
|
1065
1065
|
'fts.gin_yes': "GIN-Index",
|
|
1066
1066
|
'fts.gin_no': "kein GIN-Index",
|
|
1067
1067
|
'fts.added': "Volltextsuche zu {table} hinzugefügt: Spalte {column} mit Index {index}.",
|
|
1068
|
+
// (sprint 136, AP-1) Table Properties › Add vector column
|
|
1069
|
+
'vec.add': "Vektorspalte hinzufügen",
|
|
1070
|
+
'vec.title': "Vektorspalte für {table}",
|
|
1071
|
+
'vec.intro': "Fügt eine Embedding-Spalte vector(n) hinzu (n: die Dimensionen des Vektoranbieters), einen HNSW-Index für die Distanz und einen Trigger, der eine Zeile neu einbettet, wenn sich ihre Quellspalten ändern. Eine Suchkonfiguration vom Typ vector oder hybrid oder das Retrieve-Werkzeug eines KI-Agenten findet Zeilen dann nach Bedeutung. Die vorhandenen Zeilen werden sofort für ihre Embeddings eingereiht.",
|
|
1072
|
+
'vec.existing': "Vektorspalten jetzt",
|
|
1073
|
+
'vec.provider': "Vektoranbieter",
|
|
1074
|
+
'vec.provider_help': "Gemeinsame Komponenten › Vektoranbieter der Anwendungen dieses Arbeitsbereichs. Suchen Sie mit demselben Anbieter.",
|
|
1075
|
+
'vec.keep': "Aktuell halten",
|
|
1076
|
+
'vec.keep_help': "Ein Funktionsanbieter kann das Embedding sofort im Trigger setzen. Einen KI-Dienst ruft der Server auf: Der Trigger reiht die Zeile ein, und der Server bettet eingereihte Zeilen stapelweise ein, innerhalb der Anfragen pro Minute des Anbieters und der täglichen KI-Limits der Anwendung.",
|
|
1077
|
+
'vec.mode_set': "vom Trigger gesetzt, sofort",
|
|
1078
|
+
'vec.mode_queue': "für den Server eingereiht",
|
|
1079
|
+
'vec.sources': "Quellspalten",
|
|
1080
|
+
'vec.sources_help': "Der Text, der eingebettet wird: diese Spalten, eine pro Zeile. Eine Änderung an einer davon bettet die Zeile neu ein.",
|
|
1081
|
+
'vec.distance': "Distanz",
|
|
1082
|
+
'vec.distance_help': "cosine für die meisten Embedding-Modelle; die Suchkonfiguration verwendet dieselbe Distanz.",
|
|
1083
|
+
'vec.column': "Vektorspalte",
|
|
1084
|
+
'vec.no_key': "Die Tabelle braucht einen Primärschlüssel aus einer Spalte: Die Warteschlange findet Zeilen darüber.",
|
|
1085
|
+
'vec.pick_provider': "Wählen Sie einen Vektoranbieter.",
|
|
1086
|
+
'vec.no_providers': "Noch keine Anwendung dieses Arbeitsbereichs hat einen Vektoranbieter: Fügen Sie einen unter Gemeinsame Komponenten › Vektoranbieter hinzu.",
|
|
1087
|
+
'vec.missing': "Die Erweiterung pgvector ist in dieser Datenbank nicht installiert, daher kann noch keine Vektorspalte hinzugefügt werden.",
|
|
1088
|
+
'vec.missing_create': "Der Datenbankserver hat pgvector {version}: Erstellen Sie die Erweiterung unter Arbeitsbereich-Dienstprogramme › Vektoranbieter.",
|
|
1089
|
+
'vec.missing_admin': "Der Datenbankserver hat pgvector {version}: Ein Administrator erstellt die Erweiterung (Arbeitsbereich-Dienstprogramme › Vektoranbieter).",
|
|
1090
|
+
'vec.missing_package': "Der Datenbankserver hat das Paket pgvector nicht: Installieren Sie es (z. B. apt install postgresql-17-pgvector oder das Docker-Image pgvector/pgvector) und erstellen Sie dann die Erweiterung.",
|
|
1091
|
+
'vec.utilities': "Arbeitsbereich-Dienstprogramme › Vektoranbieter",
|
|
1092
|
+
'vec.kept_by': "gepflegt von {provider} aus {columns}",
|
|
1093
|
+
'vec.not_kept': "kein Trigger hält sie aktuell",
|
|
1094
|
+
'vec.progress': "Eingebettete Zeilen von {column}",
|
|
1095
|
+
'vec.counts': "{done} von {total} Zeilen eingebettet, {queued} eingereiht",
|
|
1096
|
+
'vec.failing': "{n} fehlgeschlagen",
|
|
1097
|
+
'vec.reembed_all': "alle Zeilen, nicht nur die ohne Embedding",
|
|
1098
|
+
'vec.backfill': "Nachfüllen",
|
|
1099
|
+
'vec.refresh': "Aktualisieren",
|
|
1100
|
+
'vec.backfill_queued': "{n} Zeilen von {column} für ihre Embeddings eingereiht.",
|
|
1101
|
+
'vec.added': "Vektorspalte {column} zu {table} hinzugefügt; {n} Zeilen für ihre Embeddings eingereiht.",
|
|
1068
1102
|
// ------------------------------------------------------------ Shared Components (sprint 124)
|
|
1069
1103
|
'comp.nav_entry': 'Navigationseintrag',
|
|
1070
1104
|
'comp.nav_entry.plural': 'Navigationsmenü',
|
package/src/builder/i18n/en.ts
CHANGED
|
@@ -1069,6 +1069,40 @@ export const en = {
|
|
|
1069
1069
|
'fts.gin_yes': "GIN index",
|
|
1070
1070
|
'fts.gin_no': "no GIN index",
|
|
1071
1071
|
'fts.added': "Added full-text search to {table}: column {column} with index {index}.",
|
|
1072
|
+
// (sprint 136, AP-1) Table Properties › Add vector column
|
|
1073
|
+
'vec.add': "Add vector column",
|
|
1074
|
+
'vec.title': "Vector column on {table}",
|
|
1075
|
+
'vec.intro': "Adds an embedding column vector(n) (n: the vector provider's dimensions), an HNSW index for the distance, and a trigger that re-embeds a row when its source columns change. A search configuration of type vector or hybrid, or an AI agent's Retrieve tool, then finds rows by meaning. The rows there are now are queued for their embeddings at once.",
|
|
1076
|
+
'vec.existing': "Vector columns now",
|
|
1077
|
+
'vec.provider': "Vector provider",
|
|
1078
|
+
'vec.provider_help': "Shared Components › Vector providers of this workspace's applications. Search with the same provider.",
|
|
1079
|
+
'vec.keep': "Keep current",
|
|
1080
|
+
'vec.keep_help': "A function provider can set the embedding in the trigger, at once. An AI service is called by the server: the trigger queues the row and the server embeds queued rows in batches, within the provider's requests per minute and the application's daily AI limits.",
|
|
1081
|
+
'vec.mode_set': "set by the trigger, at once",
|
|
1082
|
+
'vec.mode_queue': "queued for the server",
|
|
1083
|
+
'vec.sources': "Source columns",
|
|
1084
|
+
'vec.sources_help': "The text that is embedded: these columns, one per line. A change to one of them re-embeds the row.",
|
|
1085
|
+
'vec.distance': "Distance",
|
|
1086
|
+
'vec.distance_help': "cosine for most embedding models; the search configuration uses the same distance.",
|
|
1087
|
+
'vec.column': "Vector column",
|
|
1088
|
+
'vec.no_key': "The table needs a primary key of one column: the queue finds rows by it.",
|
|
1089
|
+
'vec.pick_provider': "Choose a vector provider.",
|
|
1090
|
+
'vec.no_providers': "No application of this workspace has a vector provider yet: add one under Shared Components › Vector providers.",
|
|
1091
|
+
'vec.missing': "The pgvector extension is not installed in this database, so a vector column can't be added yet.",
|
|
1092
|
+
'vec.missing_create': "The database server has pgvector {version}: create the extension under Workspace utilities › Vector providers.",
|
|
1093
|
+
'vec.missing_admin': "The database server has pgvector {version}: an administrator creates the extension (Workspace utilities › Vector providers).",
|
|
1094
|
+
'vec.missing_package': "The database server doesn't have the pgvector package: install it (e.g. apt install postgresql-17-pgvector, or the pgvector/pgvector Docker image), then create the extension.",
|
|
1095
|
+
'vec.utilities': "Workspace utilities › Vector providers",
|
|
1096
|
+
'vec.kept_by': "kept by {provider} from {columns}",
|
|
1097
|
+
'vec.not_kept': "no trigger keeps it current",
|
|
1098
|
+
'vec.progress': "Embedded rows of {column}",
|
|
1099
|
+
'vec.counts': "{done} of {total} rows embedded, {queued} queued",
|
|
1100
|
+
'vec.failing': "{n} failing",
|
|
1101
|
+
'vec.reembed_all': "all rows, not only those without an embedding",
|
|
1102
|
+
'vec.backfill': "Backfill",
|
|
1103
|
+
'vec.refresh': "Refresh",
|
|
1104
|
+
'vec.backfill_queued': "{n} rows of {column} queued for their embeddings.",
|
|
1105
|
+
'vec.added': "Added the vector column {column} to {table}; {n} rows queued for their embeddings.",
|
|
1072
1106
|
// ------------------------------------------------------------ Shared Components (sprint 124)
|
|
1073
1107
|
'comp.nav_entry': 'Navigation entry',
|
|
1074
1108
|
'comp.nav_entry.plural': 'Navigation menu',
|
package/src/builder/i18n/es.ts
CHANGED
|
@@ -1065,6 +1065,40 @@ export const es: BuilderMessages = {
|
|
|
1065
1065
|
'fts.gin_yes': "índice GIN",
|
|
1066
1066
|
'fts.gin_no': "sin índice GIN",
|
|
1067
1067
|
'fts.added': "Búsqueda de texto completo añadida a {table}: columna {column} con el índice {index}.",
|
|
1068
|
+
// (sprint 136, AP-1) Table Properties › Add vector column
|
|
1069
|
+
'vec.add': "Añadir columna vectorial",
|
|
1070
|
+
'vec.title': "Columna vectorial en {table}",
|
|
1071
|
+
'vec.intro': "Añade una columna de embedding vector(n) (n: las dimensiones del proveedor de vectores), un índice HNSW para la distancia y un disparador que vuelve a calcular el embedding de una fila cuando cambian sus columnas de origen. Una configuración de búsqueda de tipo vector o hybrid, o la herramienta Retrieve de un agente de IA, encuentra entonces las filas por su significado. Las filas que ya existen se ponen en cola enseguida para sus embeddings.",
|
|
1072
|
+
'vec.existing': "Columnas vectoriales actuales",
|
|
1073
|
+
'vec.provider': "Proveedor de vectores",
|
|
1074
|
+
'vec.provider_help': "Componentes compartidos › Proveedores de vectores de las aplicaciones de este espacio de trabajo. Busque con el mismo proveedor.",
|
|
1075
|
+
'vec.keep': "Mantener al día",
|
|
1076
|
+
'vec.keep_help': "Un proveedor de tipo función puede fijar el embedding en el disparador, enseguida. A un servicio de IA lo llama el servidor: el disparador pone la fila en cola y el servidor calcula los embeddings por lotes, dentro de las solicitudes por minuto del proveedor y los límites diarios de IA de la aplicación.",
|
|
1077
|
+
'vec.mode_set': "fijado por el disparador, enseguida",
|
|
1078
|
+
'vec.mode_queue': "en cola para el servidor",
|
|
1079
|
+
'vec.sources': "Columnas de origen",
|
|
1080
|
+
'vec.sources_help': "El texto del que se calcula el embedding: estas columnas, una por línea. Un cambio en una de ellas vuelve a calcular el embedding de la fila.",
|
|
1081
|
+
'vec.distance': "Distancia",
|
|
1082
|
+
'vec.distance_help': "cosine para la mayoría de los modelos de embedding; la configuración de búsqueda usa la misma distancia.",
|
|
1083
|
+
'vec.column': "Columna vectorial",
|
|
1084
|
+
'vec.no_key': "La tabla necesita una clave primaria de una sola columna: la cola encuentra las filas por ella.",
|
|
1085
|
+
'vec.pick_provider': "Elija un proveedor de vectores.",
|
|
1086
|
+
'vec.no_providers': "Ninguna aplicación de este espacio de trabajo tiene aún un proveedor de vectores: añada uno en Componentes compartidos › Proveedores de vectores.",
|
|
1087
|
+
'vec.missing': "La extensión pgvector no está instalada en esta base de datos, así que todavía no se puede añadir una columna vectorial.",
|
|
1088
|
+
'vec.missing_create': "El servidor de base de datos tiene pgvector {version}: cree la extensión en Utilidades del espacio de trabajo › Proveedores de vectores.",
|
|
1089
|
+
'vec.missing_admin': "El servidor de base de datos tiene pgvector {version}: un administrador crea la extensión (Utilidades del espacio de trabajo › Proveedores de vectores).",
|
|
1090
|
+
'vec.missing_package': "El servidor de base de datos no tiene el paquete pgvector: instálelo (p. ej. apt install postgresql-17-pgvector, o la imagen de Docker pgvector/pgvector) y cree luego la extensión.",
|
|
1091
|
+
'vec.utilities': "Utilidades del espacio de trabajo › Proveedores de vectores",
|
|
1092
|
+
'vec.kept_by': "mantenida por {provider} a partir de {columns}",
|
|
1093
|
+
'vec.not_kept': "ningún disparador la mantiene al día",
|
|
1094
|
+
'vec.progress': "Filas de {column} con embedding",
|
|
1095
|
+
'vec.counts': "{done} de {total} filas con embedding, {queued} en cola",
|
|
1096
|
+
'vec.failing': "{n} con error",
|
|
1097
|
+
'vec.reembed_all': "todas las filas, no solo las que no tienen embedding",
|
|
1098
|
+
'vec.backfill': "Completar",
|
|
1099
|
+
'vec.refresh': "Actualizar",
|
|
1100
|
+
'vec.backfill_queued': "{n} filas de {column} en cola para sus embeddings.",
|
|
1101
|
+
'vec.added': "Columna vectorial {column} añadida a {table}; {n} filas en cola para sus embeddings.",
|
|
1068
1102
|
// ------------------------------------------------------------ Shared Components (sprint 124)
|
|
1069
1103
|
'comp.nav_entry': 'Entrada de navegación',
|
|
1070
1104
|
'comp.nav_entry.plural': 'Menú de navegación',
|
package/src/builder/i18n/fr.ts
CHANGED
|
@@ -1065,6 +1065,40 @@ export const fr: BuilderMessages = {
|
|
|
1065
1065
|
'fts.gin_yes': "index GIN",
|
|
1066
1066
|
'fts.gin_no': "pas d'index GIN",
|
|
1067
1067
|
'fts.added': "Recherche plein texte ajoutée à {table} : colonne {column} avec l'index {index}.",
|
|
1068
|
+
// (sprint 136, AP-1) Table Properties › Add vector column
|
|
1069
|
+
'vec.add': "Ajouter une colonne vectorielle",
|
|
1070
|
+
'vec.title': "Colonne vectorielle sur {table}",
|
|
1071
|
+
'vec.intro': "Ajoute une colonne d'embedding vector(n) (n : les dimensions du fournisseur de vecteurs), un index HNSW pour la distance et un déclencheur qui recalcule l'embedding d'une ligne quand ses colonnes sources changent. Une configuration de recherche de type vector ou hybrid, ou l'outil Retrieve d'un agent IA, trouve alors les lignes par leur sens. Les lignes existantes sont mises en file d'attente tout de suite pour leurs embeddings.",
|
|
1072
|
+
'vec.existing': "Colonnes vectorielles actuelles",
|
|
1073
|
+
'vec.provider': "Fournisseur de vecteurs",
|
|
1074
|
+
'vec.provider_help': "Composants partagés › Fournisseurs de vecteurs des applications de cet espace de travail. Recherchez avec le même fournisseur.",
|
|
1075
|
+
'vec.keep': "Tenir à jour",
|
|
1076
|
+
'vec.keep_help': "Un fournisseur de type fonction peut définir l'embedding dans le déclencheur, tout de suite. Un service IA est appelé par le serveur : le déclencheur met la ligne en file d'attente et le serveur calcule les embeddings par lots, dans la limite des requêtes par minute du fournisseur et des limites IA quotidiennes de l'application.",
|
|
1077
|
+
'vec.mode_set': "défini par le déclencheur, tout de suite",
|
|
1078
|
+
'vec.mode_queue': "en file d'attente pour le serveur",
|
|
1079
|
+
'vec.sources': "Colonnes sources",
|
|
1080
|
+
'vec.sources_help': "Le texte dont on calcule l'embedding : ces colonnes, une par ligne. Une modification de l'une d'elles recalcule l'embedding de la ligne.",
|
|
1081
|
+
'vec.distance': "Distance",
|
|
1082
|
+
'vec.distance_help': "cosine pour la plupart des modèles d'embedding ; la configuration de recherche utilise la même distance.",
|
|
1083
|
+
'vec.column': "Colonne vectorielle",
|
|
1084
|
+
'vec.no_key': "La table a besoin d'une clé primaire d'une seule colonne : la file d'attente retrouve les lignes par elle.",
|
|
1085
|
+
'vec.pick_provider': "Choisissez un fournisseur de vecteurs.",
|
|
1086
|
+
'vec.no_providers': "Aucune application de cet espace de travail n'a encore de fournisseur de vecteurs : ajoutez-en un sous Composants partagés › Fournisseurs de vecteurs.",
|
|
1087
|
+
'vec.missing': "L'extension pgvector n'est pas installée dans cette base de données : impossible d'ajouter une colonne vectorielle pour l'instant.",
|
|
1088
|
+
'vec.missing_create': "Le serveur de base de données dispose de pgvector {version} : créez l'extension sous Utilitaires de l'espace de travail › Fournisseurs de vecteurs.",
|
|
1089
|
+
'vec.missing_admin': "Le serveur de base de données dispose de pgvector {version} : un administrateur crée l'extension (Utilitaires de l'espace de travail › Fournisseurs de vecteurs).",
|
|
1090
|
+
'vec.missing_package': "Le serveur de base de données n'a pas le paquet pgvector : installez-le (p. ex. apt install postgresql-17-pgvector, ou l'image Docker pgvector/pgvector), puis créez l'extension.",
|
|
1091
|
+
'vec.utilities': "Utilitaires de l'espace de travail › Fournisseurs de vecteurs",
|
|
1092
|
+
'vec.kept_by': "tenue par {provider} à partir de {columns}",
|
|
1093
|
+
'vec.not_kept': "aucun déclencheur ne la tient à jour",
|
|
1094
|
+
'vec.progress': "Lignes de {column} avec embedding",
|
|
1095
|
+
'vec.counts': "{done} lignes sur {total} avec embedding, {queued} en file d'attente",
|
|
1096
|
+
'vec.failing': "{n} en échec",
|
|
1097
|
+
'vec.reembed_all': "toutes les lignes, pas seulement celles sans embedding",
|
|
1098
|
+
'vec.backfill': "Compléter",
|
|
1099
|
+
'vec.refresh': "Actualiser",
|
|
1100
|
+
'vec.backfill_queued': "{n} lignes de {column} mises en file d'attente pour leurs embeddings.",
|
|
1101
|
+
'vec.added': "Colonne vectorielle {column} ajoutée à {table} ; {n} lignes en file d'attente pour leurs embeddings.",
|
|
1068
1102
|
// ------------------------------------------------------------ Shared Components (sprint 124)
|
|
1069
1103
|
'comp.nav_entry': 'Entrée de navigation',
|
|
1070
1104
|
'comp.nav_entry.plural': 'Menu de navigation',
|
package/src/builder/i18n/it.ts
CHANGED
|
@@ -1065,6 +1065,40 @@ export const it: BuilderMessages = {
|
|
|
1065
1065
|
'fts.gin_yes': "indice GIN",
|
|
1066
1066
|
'fts.gin_no': "nessun indice GIN",
|
|
1067
1067
|
'fts.added': "Ricerca full-text aggiunta a {table}: colonna {column} con l'indice {index}.",
|
|
1068
|
+
// (sprint 136, AP-1) Table Properties › Add vector column
|
|
1069
|
+
'vec.add': "Aggiungi colonna vettoriale",
|
|
1070
|
+
'vec.title': "Colonna vettoriale su {table}",
|
|
1071
|
+
'vec.intro': "Aggiunge una colonna di embedding vector(n) (n: le dimensioni del provider di vettori), un indice HNSW per la distanza e un trigger che ricalcola l'embedding di una riga quando cambiano le sue colonne di origine. Una configurazione di ricerca di tipo vector o hybrid, o lo strumento Retrieve di un agente IA, trova allora le righe per significato. Le righe già presenti vengono messe subito in coda per i loro embedding.",
|
|
1072
|
+
'vec.existing': "Colonne vettoriali attuali",
|
|
1073
|
+
'vec.provider': "Provider di vettori",
|
|
1074
|
+
'vec.provider_help': "Componenti condivisi › Provider di vettori delle applicazioni di questo workspace. Cerca con lo stesso provider.",
|
|
1075
|
+
'vec.keep': "Mantieni aggiornata",
|
|
1076
|
+
'vec.keep_help': "Un provider di tipo funzione può impostare l'embedding nel trigger, subito. Un servizio IA è chiamato dal server: il trigger mette in coda la riga e il server calcola gli embedding a lotti, entro le richieste al minuto del provider e i limiti IA giornalieri dell'applicazione.",
|
|
1077
|
+
'vec.mode_set': "impostato dal trigger, subito",
|
|
1078
|
+
'vec.mode_queue': "in coda per il server",
|
|
1079
|
+
'vec.sources': "Colonne di origine",
|
|
1080
|
+
'vec.sources_help': "Il testo di cui si calcola l'embedding: queste colonne, una per riga. Una modifica a una di esse ricalcola l'embedding della riga.",
|
|
1081
|
+
'vec.distance': "Distanza",
|
|
1082
|
+
'vec.distance_help': "cosine per la maggior parte dei modelli di embedding; la configurazione di ricerca usa la stessa distanza.",
|
|
1083
|
+
'vec.column': "Colonna vettoriale",
|
|
1084
|
+
'vec.no_key': "La tabella ha bisogno di una chiave primaria di una sola colonna: la coda trova le righe tramite essa.",
|
|
1085
|
+
'vec.pick_provider': "Scegli un provider di vettori.",
|
|
1086
|
+
'vec.no_providers': "Nessuna applicazione di questo workspace ha ancora un provider di vettori: aggiungine uno in Componenti condivisi › Provider di vettori.",
|
|
1087
|
+
'vec.missing': "L'estensione pgvector non è installata in questo database, quindi non è ancora possibile aggiungere una colonna vettoriale.",
|
|
1088
|
+
'vec.missing_create': "Il server del database ha pgvector {version}: crea l'estensione in Utilità del workspace › Provider di vettori.",
|
|
1089
|
+
'vec.missing_admin': "Il server del database ha pgvector {version}: un amministratore crea l'estensione (Utilità del workspace › Provider di vettori).",
|
|
1090
|
+
'vec.missing_package': "Il server del database non ha il pacchetto pgvector: installalo (ad es. apt install postgresql-17-pgvector, o l'immagine Docker pgvector/pgvector), poi crea l'estensione.",
|
|
1091
|
+
'vec.utilities': "Utilità del workspace › Provider di vettori",
|
|
1092
|
+
'vec.kept_by': "mantenuta da {provider} a partire da {columns}",
|
|
1093
|
+
'vec.not_kept': "nessun trigger la mantiene aggiornata",
|
|
1094
|
+
'vec.progress': "Righe di {column} con embedding",
|
|
1095
|
+
'vec.counts': "{done} righe su {total} con embedding, {queued} in coda",
|
|
1096
|
+
'vec.failing': "{n} non riuscite",
|
|
1097
|
+
'vec.reembed_all': "tutte le righe, non solo quelle senza embedding",
|
|
1098
|
+
'vec.backfill': "Completa",
|
|
1099
|
+
'vec.refresh': "Aggiorna",
|
|
1100
|
+
'vec.backfill_queued': "{n} righe di {column} messe in coda per i loro embedding.",
|
|
1101
|
+
'vec.added': "Colonna vettoriale {column} aggiunta a {table}; {n} righe in coda per i loro embedding.",
|
|
1068
1102
|
// ------------------------------------------------------------ Shared Components (sprint 124)
|
|
1069
1103
|
'comp.nav_entry': 'Voce di navigazione',
|
|
1070
1104
|
'comp.nav_entry.plural': 'Menu di navigazione',
|
package/src/builder/i18n/ja.ts
CHANGED
|
@@ -1065,6 +1065,40 @@ export const ja: BuilderMessages = {
|
|
|
1065
1065
|
'fts.gin_yes': "GIN 索引",
|
|
1066
1066
|
'fts.gin_no': "GIN 索引なし",
|
|
1067
1067
|
'fts.added': "{table} に全文検索を追加しました:列 {column}、索引 {index}。",
|
|
1068
|
+
// (sprint 136, AP-1) Table Properties › Add vector column
|
|
1069
|
+
'vec.add': "ベクトル列を追加",
|
|
1070
|
+
'vec.title': "{table} のベクトル列",
|
|
1071
|
+
'vec.intro': "埋め込み列 vector(n)(n はベクトル・プロバイダの次元数)、距離用の HNSW 索引、およびソース列が変わったときに行を再埋め込みするトリガーを追加します。その後、検索タイプ vector または hybrid の検索構成や AI エージェントの Retrieve ツールで、意味によって行を検索できます。既存の行はすぐに埋め込みのキューに入れられます。",
|
|
1072
|
+
'vec.existing': "現在のベクトル列",
|
|
1073
|
+
'vec.provider': "ベクトル・プロバイダ",
|
|
1074
|
+
'vec.provider_help': "このワークスペースのアプリケーションの共有コンポーネント › ベクトル・プロバイダ。検索にも同じプロバイダを使用します。",
|
|
1075
|
+
'vec.keep': "最新に保つ方法",
|
|
1076
|
+
'vec.keep_help': "関数プロバイダは、トリガー内ですぐに埋め込みを設定できます。AI サービスはサーバーが呼び出します。トリガーが行をキューに入れ、サーバーがプロバイダの 1 分あたりのリクエスト数とアプリケーションの 1 日の AI 制限の範囲内で、キューの行をまとめて埋め込みます。",
|
|
1077
|
+
'vec.mode_set': "トリガーがすぐに設定",
|
|
1078
|
+
'vec.mode_queue': "サーバー用のキューに入れる",
|
|
1079
|
+
'vec.sources': "ソース列",
|
|
1080
|
+
'vec.sources_help': "埋め込むテキスト:これらの列を 1 行に 1 つずつ。いずれかが変わると行が再埋め込みされます。",
|
|
1081
|
+
'vec.distance': "距離",
|
|
1082
|
+
'vec.distance_help': "ほとんどの埋め込みモデルでは cosine。検索構成も同じ距離を使用します。",
|
|
1083
|
+
'vec.column': "ベクトル列",
|
|
1084
|
+
'vec.no_key': "表には 1 列の主キーが必要です。キューはそれで行を見つけます。",
|
|
1085
|
+
'vec.pick_provider': "ベクトル・プロバイダを選択してください。",
|
|
1086
|
+
'vec.no_providers': "このワークスペースのアプリケーションにはまだベクトル・プロバイダがありません。共有コンポーネント › ベクトル・プロバイダで追加してください。",
|
|
1087
|
+
'vec.missing': "このデータベースには pgvector 拡張機能がインストールされていないため、まだベクトル列を追加できません。",
|
|
1088
|
+
'vec.missing_create': "データベース・サーバーには pgvector {version} があります:ワークスペース・ユーティリティ › ベクトル・プロバイダで拡張機能を作成してください。",
|
|
1089
|
+
'vec.missing_admin': "データベース・サーバーには pgvector {version} があります:管理者が拡張機能を作成します(ワークスペース・ユーティリティ › ベクトル・プロバイダ)。",
|
|
1090
|
+
'vec.missing_package': "データベース・サーバーに pgvector パッケージがありません:インストールしてから(例:apt install postgresql-17-pgvector、または Docker イメージ pgvector/pgvector)、拡張機能を作成してください。",
|
|
1091
|
+
'vec.utilities': "ワークスペース・ユーティリティ › ベクトル・プロバイダ",
|
|
1092
|
+
'vec.kept_by': "{provider} が {columns} から維持",
|
|
1093
|
+
'vec.not_kept': "最新に保つトリガーはありません",
|
|
1094
|
+
'vec.progress': "{column} の埋め込み済みの行",
|
|
1095
|
+
'vec.counts': "{total} 行中 {done} 行を埋め込み済み、{queued} 行がキュー内",
|
|
1096
|
+
'vec.failing': "{n} 件失敗",
|
|
1097
|
+
'vec.reembed_all': "埋め込みのない行だけでなく、すべての行",
|
|
1098
|
+
'vec.backfill': "埋め戻し",
|
|
1099
|
+
'vec.refresh': "更新",
|
|
1100
|
+
'vec.backfill_queued': "{column} の {n} 行を埋め込みのキューに入れました。",
|
|
1101
|
+
'vec.added': "{table} にベクトル列 {column} を追加しました。{n} 行を埋め込みのキューに入れました。",
|
|
1068
1102
|
// ------------------------------------------------------------ Shared Components (sprint 124)
|
|
1069
1103
|
'comp.nav_entry': 'ナビゲーション・エントリ',
|
|
1070
1104
|
'comp.nav_entry.plural': 'ナビゲーション・メニュー',
|
package/src/builder/i18n/ko.ts
CHANGED
|
@@ -1065,6 +1065,40 @@ export const ko: BuilderMessages = {
|
|
|
1065
1065
|
'fts.gin_yes': "GIN 인덱스",
|
|
1066
1066
|
'fts.gin_no': "GIN 인덱스 없음",
|
|
1067
1067
|
'fts.added': "{table}에 전체 텍스트 검색을 추가했습니다: 열 {column}, 인덱스 {index}.",
|
|
1068
|
+
// (sprint 136, AP-1) Table Properties › Add vector column
|
|
1069
|
+
'vec.add': "벡터 열 추가",
|
|
1070
|
+
'vec.title': "{table}의 벡터 열",
|
|
1071
|
+
'vec.intro': "임베딩 열 vector(n)(n: 벡터 공급자의 차원 수), 거리용 HNSW 인덱스, 그리고 소스 열이 바뀌면 행을 다시 임베딩하는 트리거를 추가합니다. 그러면 검색 유형 vector 또는 hybrid의 검색 구성이나 AI 에이전트의 Retrieve 도구가 의미로 행을 찾습니다. 지금 있는 행은 바로 임베딩 대기열에 들어갑니다.",
|
|
1072
|
+
'vec.existing': "현재 벡터 열",
|
|
1073
|
+
'vec.provider': "벡터 공급자",
|
|
1074
|
+
'vec.provider_help': "이 작업 영역 애플리케이션의 공유 구성 요소 › 벡터 공급자. 검색할 때도 같은 공급자를 사용하십시오.",
|
|
1075
|
+
'vec.keep': "최신 상태 유지",
|
|
1076
|
+
'vec.keep_help': "함수 공급자는 트리거에서 바로 임베딩을 설정할 수 있습니다. AI 서비스는 서버가 호출합니다: 트리거가 행을 대기열에 넣고, 서버가 공급자의 분당 요청 수와 애플리케이션의 일일 AI 한도 안에서 대기열의 행을 일괄로 임베딩합니다.",
|
|
1077
|
+
'vec.mode_set': "트리거가 바로 설정",
|
|
1078
|
+
'vec.mode_queue': "서버용 대기열에 넣음",
|
|
1079
|
+
'vec.sources': "소스 열",
|
|
1080
|
+
'vec.sources_help': "임베딩할 텍스트: 이 열들, 한 줄에 하나씩. 그중 하나가 바뀌면 행을 다시 임베딩합니다.",
|
|
1081
|
+
'vec.distance': "거리",
|
|
1082
|
+
'vec.distance_help': "대부분의 임베딩 모델에는 cosine; 검색 구성도 같은 거리를 사용합니다.",
|
|
1083
|
+
'vec.column': "벡터 열",
|
|
1084
|
+
'vec.no_key': "테이블에 열 하나로 된 기본 키가 필요합니다: 대기열은 그것으로 행을 찾습니다.",
|
|
1085
|
+
'vec.pick_provider': "벡터 공급자를 선택하십시오.",
|
|
1086
|
+
'vec.no_providers': "이 작업 영역의 애플리케이션에는 아직 벡터 공급자가 없습니다: 공유 구성 요소 › 벡터 공급자에서 추가하십시오.",
|
|
1087
|
+
'vec.missing': "이 데이터베이스에 pgvector 확장이 설치되어 있지 않아 아직 벡터 열을 추가할 수 없습니다.",
|
|
1088
|
+
'vec.missing_create': "데이터베이스 서버에 pgvector {version}이(가) 있습니다: 작업 영역 유틸리티 › 벡터 공급자에서 확장을 만드십시오.",
|
|
1089
|
+
'vec.missing_admin': "데이터베이스 서버에 pgvector {version}이(가) 있습니다: 관리자가 확장을 만듭니다(작업 영역 유틸리티 › 벡터 공급자).",
|
|
1090
|
+
'vec.missing_package': "데이터베이스 서버에 pgvector 패키지가 없습니다: 설치한 다음(예: apt install postgresql-17-pgvector 또는 Docker 이미지 pgvector/pgvector) 확장을 만드십시오.",
|
|
1091
|
+
'vec.utilities': "작업 영역 유틸리티 › 벡터 공급자",
|
|
1092
|
+
'vec.kept_by': "{provider}이(가) {columns}에서 유지",
|
|
1093
|
+
'vec.not_kept': "최신 상태로 유지하는 트리거가 없음",
|
|
1094
|
+
'vec.progress': "{column}의 임베딩된 행",
|
|
1095
|
+
'vec.counts': "{total}행 중 {done}행 임베딩됨, {queued}행 대기 중",
|
|
1096
|
+
'vec.failing': "{n}건 실패",
|
|
1097
|
+
'vec.reembed_all': "임베딩이 없는 행만이 아니라 모든 행",
|
|
1098
|
+
'vec.backfill': "채우기",
|
|
1099
|
+
'vec.refresh': "새로 고침",
|
|
1100
|
+
'vec.backfill_queued': "{column}의 {n}행을 임베딩 대기열에 넣었습니다.",
|
|
1101
|
+
'vec.added': "{table}에 벡터 열 {column}을(를) 추가했습니다. {n}행이 임베딩 대기열에 있습니다.",
|
|
1068
1102
|
// ------------------------------------------------------------ Shared Components (sprint 124)
|
|
1069
1103
|
'comp.nav_entry': '탐색 항목',
|
|
1070
1104
|
'comp.nav_entry.plural': '탐색 메뉴',
|
package/src/builder/i18n/nl.ts
CHANGED
|
@@ -1065,6 +1065,40 @@ export const nl: BuilderMessages = {
|
|
|
1065
1065
|
'fts.gin_yes': "GIN-index",
|
|
1066
1066
|
'fts.gin_no': "geen GIN-index",
|
|
1067
1067
|
'fts.added': "Volledige-tekstzoeken toegevoegd aan {table}: kolom {column} met index {index}.",
|
|
1068
|
+
// (sprint 136, AP-1) Table Properties › Add vector column
|
|
1069
|
+
'vec.add': "Vectorkolom toevoegen",
|
|
1070
|
+
'vec.title': "Vectorkolom op {table}",
|
|
1071
|
+
'vec.intro': "Voegt een embeddingkolom vector(n) toe (n: de dimensies van de vectorprovider), een HNSW-index voor de afstand, en een trigger die een rij opnieuw embedt als de bronkolommen veranderen. Een zoekconfiguratie van het type vector of hybrid, of de Retrieve-tool van een AI-agent, vindt rijen dan op betekenis. De rijen die er nu zijn, komen meteen in de wachtrij voor hun embeddings.",
|
|
1072
|
+
'vec.existing': "Vectorkolommen nu",
|
|
1073
|
+
'vec.provider': "Vectorprovider",
|
|
1074
|
+
'vec.provider_help': "Gedeelde componenten › Vectorproviders van de applicaties in deze werkruimte. Zoek met dezelfde provider.",
|
|
1075
|
+
'vec.keep': "Actueel houden",
|
|
1076
|
+
'vec.keep_help': "Een functieprovider kan de embedding meteen in de trigger zetten. Een AI-service wordt door de server aangeroepen: de trigger zet de rij in de wachtrij en de server embedt rijen in batches, binnen de verzoeken per minuut van de provider en de dagelijkse AI-limieten van de applicatie.",
|
|
1077
|
+
'vec.mode_set': "door de trigger gezet, meteen",
|
|
1078
|
+
'vec.mode_queue': "in de wachtrij voor de server",
|
|
1079
|
+
'vec.sources': "Bronkolommen",
|
|
1080
|
+
'vec.sources_help': "De tekst die wordt ge-embed: deze kolommen, één per regel. Een wijziging in een ervan embedt de rij opnieuw.",
|
|
1081
|
+
'vec.distance': "Afstand",
|
|
1082
|
+
'vec.distance_help': "cosine voor de meeste embeddingmodellen; de zoekconfiguratie gebruikt dezelfde afstand.",
|
|
1083
|
+
'vec.column': "Vectorkolom",
|
|
1084
|
+
'vec.no_key': "De tabel heeft een primaire sleutel van één kolom nodig: de wachtrij vindt rijen daarmee.",
|
|
1085
|
+
'vec.pick_provider': "Kies een vectorprovider.",
|
|
1086
|
+
'vec.no_providers': "Nog geen applicatie in deze werkruimte heeft een vectorprovider: voeg er een toe onder Gedeelde componenten › Vectorproviders.",
|
|
1087
|
+
'vec.missing': "De extensie pgvector is niet geïnstalleerd in deze database, dus een vectorkolom kan nog niet worden toegevoegd.",
|
|
1088
|
+
'vec.missing_create': "De databaseserver heeft pgvector {version}: maak de extensie aan onder Werkruimtehulpmiddelen › Vectorproviders.",
|
|
1089
|
+
'vec.missing_admin': "De databaseserver heeft pgvector {version}: een beheerder maakt de extensie aan (Werkruimtehulpmiddelen › Vectorproviders).",
|
|
1090
|
+
'vec.missing_package': "De databaseserver heeft het pakket pgvector niet: installeer het (bijv. apt install postgresql-17-pgvector, of het Docker-image pgvector/pgvector) en maak dan de extensie aan.",
|
|
1091
|
+
'vec.utilities': "Werkruimtehulpmiddelen › Vectorproviders",
|
|
1092
|
+
'vec.kept_by': "bijgehouden door {provider} uit {columns}",
|
|
1093
|
+
'vec.not_kept': "geen trigger houdt hem actueel",
|
|
1094
|
+
'vec.progress': "Ge-embede rijen van {column}",
|
|
1095
|
+
'vec.counts': "{done} van {total} rijen ge-embed, {queued} in de wachtrij",
|
|
1096
|
+
'vec.failing': "{n} mislukt",
|
|
1097
|
+
'vec.reembed_all': "alle rijen, niet alleen die zonder embedding",
|
|
1098
|
+
'vec.backfill': "Aanvullen",
|
|
1099
|
+
'vec.refresh': "Vernieuwen",
|
|
1100
|
+
'vec.backfill_queued': "{n} rijen van {column} in de wachtrij voor hun embeddings.",
|
|
1101
|
+
'vec.added': "Vectorkolom {column} toegevoegd aan {table}; {n} rijen in de wachtrij voor hun embeddings.",
|
|
1068
1102
|
// ------------------------------------------------------------ Shared Components (sprint 124)
|
|
1069
1103
|
'comp.nav_entry': 'Navigatie-item',
|
|
1070
1104
|
'comp.nav_entry.plural': 'Navigatiemenu',
|
package/src/builder/i18n/pt.ts
CHANGED
|
@@ -1065,6 +1065,40 @@ export const pt: BuilderMessages = {
|
|
|
1065
1065
|
'fts.gin_yes': "índice GIN",
|
|
1066
1066
|
'fts.gin_no': "sem índice GIN",
|
|
1067
1067
|
'fts.added': "Pesquisa de texto integral adicionada a {table}: coluna {column} com o índice {index}.",
|
|
1068
|
+
// (sprint 136, AP-1) Table Properties › Add vector column
|
|
1069
|
+
'vec.add': "Adicionar coluna vetorial",
|
|
1070
|
+
'vec.title': "Coluna vetorial em {table}",
|
|
1071
|
+
'vec.intro': "Adiciona uma coluna de embedding vector(n) (n: as dimensões do fornecedor de vetores), um índice HNSW para a distância e um gatilho que recalcula o embedding de uma linha quando as colunas de origem mudam. Uma configuração de pesquisa do tipo vector ou hybrid, ou a ferramenta Retrieve de um agente de IA, encontra então as linhas pelo significado. As linhas que já existem entram logo na fila para os seus embeddings.",
|
|
1072
|
+
'vec.existing': "Colunas vetoriais atuais",
|
|
1073
|
+
'vec.provider': "Fornecedor de vetores",
|
|
1074
|
+
'vec.provider_help': "Componentes partilhados › Fornecedores de vetores das aplicações deste espaço de trabalho. Pesquise com o mesmo fornecedor.",
|
|
1075
|
+
'vec.keep': "Manter atualizada",
|
|
1076
|
+
'vec.keep_help': "Um fornecedor do tipo função pode definir o embedding no gatilho, de imediato. Um serviço de IA é chamado pelo servidor: o gatilho põe a linha na fila e o servidor calcula os embeddings em lotes, dentro dos pedidos por minuto do fornecedor e dos limites diários de IA da aplicação.",
|
|
1077
|
+
'vec.mode_set': "definido pelo gatilho, de imediato",
|
|
1078
|
+
'vec.mode_queue': "na fila para o servidor",
|
|
1079
|
+
'vec.sources': "Colunas de origem",
|
|
1080
|
+
'vec.sources_help': "O texto de que se calcula o embedding: estas colunas, uma por linha. Uma alteração numa delas recalcula o embedding da linha.",
|
|
1081
|
+
'vec.distance': "Distância",
|
|
1082
|
+
'vec.distance_help': "cosine para a maioria dos modelos de embedding; a configuração de pesquisa usa a mesma distância.",
|
|
1083
|
+
'vec.column': "Coluna vetorial",
|
|
1084
|
+
'vec.no_key': "A tabela precisa de uma chave primária de uma só coluna: a fila encontra as linhas por ela.",
|
|
1085
|
+
'vec.pick_provider': "Escolha um fornecedor de vetores.",
|
|
1086
|
+
'vec.no_providers': "Nenhuma aplicação deste espaço de trabalho tem ainda um fornecedor de vetores: adicione um em Componentes partilhados › Fornecedores de vetores.",
|
|
1087
|
+
'vec.missing': "A extensão pgvector não está instalada nesta base de dados, por isso ainda não é possível adicionar uma coluna vetorial.",
|
|
1088
|
+
'vec.missing_create': "O servidor de base de dados tem o pgvector {version}: crie a extensão em Utilitários do espaço de trabalho › Fornecedores de vetores.",
|
|
1089
|
+
'vec.missing_admin': "O servidor de base de dados tem o pgvector {version}: um administrador cria a extensão (Utilitários do espaço de trabalho › Fornecedores de vetores).",
|
|
1090
|
+
'vec.missing_package': "O servidor de base de dados não tem o pacote pgvector: instale-o (p. ex. apt install postgresql-17-pgvector, ou a imagem Docker pgvector/pgvector) e depois crie a extensão.",
|
|
1091
|
+
'vec.utilities': "Utilitários do espaço de trabalho › Fornecedores de vetores",
|
|
1092
|
+
'vec.kept_by': "mantida por {provider} a partir de {columns}",
|
|
1093
|
+
'vec.not_kept': "nenhum gatilho a mantém atualizada",
|
|
1094
|
+
'vec.progress': "Linhas de {column} com embedding",
|
|
1095
|
+
'vec.counts': "{done} de {total} linhas com embedding, {queued} na fila",
|
|
1096
|
+
'vec.failing': "{n} com erro",
|
|
1097
|
+
'vec.reembed_all': "todas as linhas, não só as que não têm embedding",
|
|
1098
|
+
'vec.backfill': "Completar",
|
|
1099
|
+
'vec.refresh': "Atualizar",
|
|
1100
|
+
'vec.backfill_queued': "{n} linhas de {column} na fila para os seus embeddings.",
|
|
1101
|
+
'vec.added': "Coluna vetorial {column} adicionada a {table}; {n} linhas na fila para os seus embeddings.",
|
|
1068
1102
|
// ------------------------------------------------------------ Shared Components (sprint 124)
|
|
1069
1103
|
'comp.nav_entry': 'Entrada de navegação',
|
|
1070
1104
|
'comp.nav_entry.plural': 'Menu de navegação',
|
|
@@ -1065,6 +1065,40 @@ export const zhCN: BuilderMessages = {
|
|
|
1065
1065
|
'fts.gin_yes': "GIN 索引",
|
|
1066
1066
|
'fts.gin_no': "无 GIN 索引",
|
|
1067
1067
|
'fts.added': "已为 {table} 添加全文搜索:列 {column},索引 {index}。",
|
|
1068
|
+
// (sprint 136, AP-1) Table Properties › Add vector column
|
|
1069
|
+
'vec.add': "添加向量列",
|
|
1070
|
+
'vec.title': "{table} 的向量列",
|
|
1071
|
+
'vec.intro': "添加一个嵌入列 vector(n)(n:向量提供者的维数)、一个用于该距离的 HNSW 索引,以及在源列变化时重新嵌入该行的触发器。之后,搜索类型为 vector 或 hybrid 的搜索配置,或 AI 代理的 Retrieve 工具,就能按含义找到行。现有的行会立即进入嵌入队列。",
|
|
1072
|
+
'vec.existing': "当前的向量列",
|
|
1073
|
+
'vec.provider': "向量提供者",
|
|
1074
|
+
'vec.provider_help': "此工作区应用程序的共享组件 › 向量提供者。搜索时使用同一个提供者。",
|
|
1075
|
+
'vec.keep': "保持最新",
|
|
1076
|
+
'vec.keep_help': "函数提供者可以在触发器中立即设置嵌入。AI 服务由服务器调用:触发器把行放入队列,服务器在提供者的每分钟请求数和应用程序的每日 AI 限额内批量嵌入队列中的行。",
|
|
1077
|
+
'vec.mode_set': "由触发器立即设置",
|
|
1078
|
+
'vec.mode_queue': "放入服务器的队列",
|
|
1079
|
+
'vec.sources': "源列",
|
|
1080
|
+
'vec.sources_help': "要嵌入的文本:这些列,每行一个。其中任一列变化时会重新嵌入该行。",
|
|
1081
|
+
'vec.distance': "距离",
|
|
1082
|
+
'vec.distance_help': "大多数嵌入模型使用 cosine;搜索配置使用相同的距离。",
|
|
1083
|
+
'vec.column': "向量列",
|
|
1084
|
+
'vec.no_key': "该表需要一个单列主键:队列据此查找行。",
|
|
1085
|
+
'vec.pick_provider': "请选择一个向量提供者。",
|
|
1086
|
+
'vec.no_providers': "此工作区的应用程序还没有向量提供者:请在共享组件 › 向量提供者中添加。",
|
|
1087
|
+
'vec.missing': "此数据库未安装 pgvector 扩展,因此暂时无法添加向量列。",
|
|
1088
|
+
'vec.missing_create': "数据库服务器有 pgvector {version}:请在工作区实用工具 › 向量提供者中创建该扩展。",
|
|
1089
|
+
'vec.missing_admin': "数据库服务器有 pgvector {version}:由管理员创建该扩展(工作区实用工具 › 向量提供者)。",
|
|
1090
|
+
'vec.missing_package': "数据库服务器没有 pgvector 软件包:请先安装(例如 apt install postgresql-17-pgvector,或 Docker 镜像 pgvector/pgvector),再创建该扩展。",
|
|
1091
|
+
'vec.utilities': "工作区实用工具 › 向量提供者",
|
|
1092
|
+
'vec.kept_by': "由 {provider} 根据 {columns} 维护",
|
|
1093
|
+
'vec.not_kept': "没有触发器保持其最新",
|
|
1094
|
+
'vec.progress': "{column} 已嵌入的行",
|
|
1095
|
+
'vec.counts': "{total} 行中已嵌入 {done} 行,{queued} 行在队列中",
|
|
1096
|
+
'vec.failing': "{n} 行失败",
|
|
1097
|
+
'vec.reembed_all': "所有行,而不仅是没有嵌入的行",
|
|
1098
|
+
'vec.backfill': "回填",
|
|
1099
|
+
'vec.refresh': "刷新",
|
|
1100
|
+
'vec.backfill_queued': "已将 {column} 的 {n} 行放入嵌入队列。",
|
|
1101
|
+
'vec.added': "已为 {table} 添加向量列 {column};{n} 行已进入嵌入队列。",
|
|
1068
1102
|
// ------------------------------------------------------------ Shared Components (sprint 124)
|
|
1069
1103
|
'comp.nav_entry': '导航条目',
|
|
1070
1104
|
'comp.nav_entry.plural': '导航菜单',
|