@malloy-publisher/server 0.0.235 → 0.0.237
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/app/api-doc.yaml +83 -27
- package/dist/app/assets/{EnvironmentPage-BsAnavYN.js → EnvironmentPage-DaP6CpgK.js} +1 -1
- package/dist/app/assets/{HomePage-CADE138j.js → HomePage-C9yNw3iu.js} +1 -1
- package/dist/app/assets/{LightMode-Cfh7KzN8.js → LightMode-Be4-G-dX.js} +1 -1
- package/dist/app/assets/{MainPage-CO3pRlnV.js → MainPage-J_rU2SgI.js} +2 -2
- package/dist/app/assets/{MaterializationsPage-p9YjkRXZ.js → MaterializationsPage-DHgPI4MO.js} +1 -1
- package/dist/app/assets/ModelPage-BzXfjTu5.js +1 -0
- package/dist/app/assets/{PackagePage-e4kN75YR.js → PackagePage-ByoSTLJ4.js} +1 -1
- package/dist/app/assets/RouteError-CrSeKN2r.js +1 -0
- package/dist/app/assets/{ThemeEditorPage-CciagFTq.js → ThemeEditorPage-Btxnmhtk.js} +1 -1
- package/dist/app/assets/{WorkbookPage-DNWmkCXa.js → WorkbookPage-D6JLPnWO.js} +1 -1
- package/dist/app/assets/{core-Rj_4rRnA.es-BZyvITuO.js → core-BSRgt1mG.es-Bc_D2Lq4.js} +1 -1
- package/dist/app/assets/{index-CH2AcDzc.js → index-BRijWj6K.js} +15 -15
- package/dist/app/assets/{index-DQa463gC.js → index-BX4D94xw.js} +1 -1
- package/dist/app/assets/{index-VBbcc8s6.js → index-Cvy0xtb7.js} +1 -1
- package/dist/app/assets/{index-DQpV7MyA.js → index-DMAhIJNC.js} +1 -1
- package/dist/app/index.html +1 -1
- package/dist/package_load_worker.mjs +59 -20
- package/dist/server.mjs +1342 -616
- package/package.json +8 -2
- package/.eslintrc.json +0 -44
- package/.prettierignore +0 -1
- package/.prettierrc +0 -4
- package/build.ts +0 -97
- package/dist/app/assets/ModelPage-C1OSTv-x.js +0 -1
- package/dist/app/assets/RouteError-CzbfOkng.js +0 -1
- package/eslint.config.mjs +0 -76
- package/k6-tests/README.md +0 -144
- package/k6-tests/bun.lock +0 -797
- package/k6-tests/load-test/load-test-crud-connections.ts +0 -263
- package/k6-tests/load-test/load-test-crud-packages.ts +0 -461
- package/k6-tests/load-test/load-test-crud-projects.ts +0 -160
- package/k6-tests/load-test/load-test-crud.ts +0 -142
- package/k6-tests/load-test/load-test.ts +0 -784
- package/k6-tests/package.json +0 -27
- package/k6-tests/scripts/run-with-otel.sh +0 -50
- package/k6-tests/smoke-test/smoke-test.ts +0 -158
- package/k6-tests/tsconfig.json +0 -29
- package/k6-tests/utils/client_factory.ts +0 -128
- package/k6-tests/utils/common.ts +0 -489
- package/k6-tests/utils/logger.ts +0 -62
- package/k6-tests/utils/types.d.ts +0 -35
- package/malloy_mcp.dxt +0 -0
- package/publisher.config.example.bigquery.json +0 -33
- package/publisher.config.example.duckdb.json +0 -23
- package/publisher.config.json +0 -23
- package/scripts/bake-duckdb-extensions.js +0 -110
- package/src/config.spec.ts +0 -1535
- package/src/config.theme.spec.ts +0 -178
- package/src/config.ts +0 -1142
- package/src/constants.ts +0 -105
- package/src/controller/compile.controller.ts +0 -40
- package/src/controller/connection.controller.spec.ts +0 -849
- package/src/controller/connection.controller.ts +0 -901
- package/src/controller/database.controller.ts +0 -24
- package/src/controller/materialization.controller.spec.ts +0 -293
- package/src/controller/materialization.controller.ts +0 -319
- package/src/controller/model.controller.ts +0 -164
- package/src/controller/package.controller.spec.ts +0 -273
- package/src/controller/package.controller.ts +0 -306
- package/src/controller/query.controller.ts +0 -152
- package/src/controller/theme.controller.ts +0 -83
- package/src/controller/watch-mode.controller.ts +0 -243
- package/src/data_styles.ts +0 -71
- package/src/default-publisher.config.json +0 -23
- package/src/ducklake_version.spec.ts +0 -163
- package/src/ducklake_version.ts +0 -153
- package/src/errors.spec.ts +0 -119
- package/src/errors.ts +0 -237
- package/src/filter_deprecation.spec.ts +0 -64
- package/src/filter_deprecation.ts +0 -42
- package/src/health.spec.ts +0 -123
- package/src/health.ts +0 -233
- package/src/heap_check.spec.ts +0 -144
- package/src/heap_check.ts +0 -144
- package/src/instrumentation.ts +0 -214
- package/src/json_utils.spec.ts +0 -51
- package/src/json_utils.ts +0 -33
- package/src/logger.spec.ts +0 -210
- package/src/logger.ts +0 -251
- package/src/malloy_pin_prereqs.spec.ts +0 -25
- package/src/materialization_metrics.spec.ts +0 -169
- package/src/materialization_metrics.ts +0 -346
- package/src/mcp/error_messages.spec.ts +0 -35
- package/src/mcp/error_messages.ts +0 -183
- package/src/mcp/handler_utils.spec.ts +0 -108
- package/src/mcp/handler_utils.ts +0 -251
- package/src/mcp/mcp_constants.ts +0 -6
- package/src/mcp/query_envelope.spec.ts +0 -229
- package/src/mcp/query_envelope.ts +0 -240
- package/src/mcp/server.protocol.spec.ts +0 -250
- package/src/mcp/server.ts +0 -87
- package/src/mcp/skills/build_skills_bundle.spec.ts +0 -51
- package/src/mcp/skills/build_skills_bundle.ts +0 -176
- package/src/mcp/skills/skills_bundle.json +0 -1
- package/src/mcp/skills/skills_bundle.spec.ts +0 -171
- package/src/mcp/tool_response.spec.ts +0 -108
- package/src/mcp/tool_response.ts +0 -138
- package/src/mcp/tools/compile_tool.spec.ts +0 -315
- package/src/mcp/tools/compile_tool.ts +0 -208
- package/src/mcp/tools/docs_search/build_docs_index.ts +0 -132
- package/src/mcp/tools/docs_search/malloy_docs_index.json +0 -1
- package/src/mcp/tools/docs_search_tool.spec.ts +0 -32
- package/src/mcp/tools/docs_search_tool.ts +0 -128
- package/src/mcp/tools/embedding_index.spec.ts +0 -1236
- package/src/mcp/tools/embedding_index.ts +0 -808
- package/src/mcp/tools/execute_query_tool.spec.ts +0 -294
- package/src/mcp/tools/execute_query_tool.ts +0 -316
- package/src/mcp/tools/get_context_eval.ts +0 -275
- package/src/mcp/tools/get_context_tool.spec.ts +0 -592
- package/src/mcp/tools/get_context_tool.ts +0 -585
- package/src/mcp/tools/reload_package_tool.spec.ts +0 -232
- package/src/mcp/tools/reload_package_tool.ts +0 -132
- package/src/mcp_config.spec.ts +0 -919
- package/src/mcp_config.ts +0 -425
- package/src/oom_guards.integration.spec.ts +0 -269
- package/src/package_load/package_load_pool.spec.ts +0 -252
- package/src/package_load/package_load_pool.ts +0 -931
- package/src/package_load/package_load_worker.ts +0 -1034
- package/src/package_load/protocol.ts +0 -364
- package/src/package_load/rpc_wait_accountant.spec.ts +0 -109
- package/src/package_load/rpc_wait_accountant.ts +0 -76
- package/src/package_load_metrics.spec.ts +0 -114
- package/src/package_load_metrics.ts +0 -127
- package/src/path_safety.spec.ts +0 -158
- package/src/path_safety.ts +0 -146
- package/src/pg_helpers.spec.ts +0 -223
- package/src/pg_helpers.ts +0 -52
- package/src/query_cap_metrics.spec.ts +0 -89
- package/src/query_cap_metrics.ts +0 -116
- package/src/query_concurrency.spec.ts +0 -247
- package/src/query_concurrency.ts +0 -237
- package/src/query_metadata_metrics.ts +0 -49
- package/src/query_param_utils.ts +0 -29
- package/src/query_timeout.spec.ts +0 -224
- package/src/query_timeout.ts +0 -179
- package/src/runtime/publisher.js +0 -328
- package/src/server-old.ts +0 -988
- package/src/server.ts +0 -2059
- package/src/service/annotations.spec.ts +0 -118
- package/src/service/annotations.ts +0 -91
- package/src/service/authorize.spec.ts +0 -154
- package/src/service/authorize.ts +0 -498
- package/src/service/authorize_integration.spec.ts +0 -2041
- package/src/service/build_plan.spec.ts +0 -685
- package/src/service/build_plan.ts +0 -797
- package/src/service/compile_authorize.spec.ts +0 -85
- package/src/service/compile_fragment_techniques.spec.ts +0 -156
- package/src/service/connection.spec.ts +0 -2360
- package/src/service/connection.ts +0 -2187
- package/src/service/connection_config.spec.ts +0 -734
- package/src/service/connection_config.ts +0 -899
- package/src/service/connection_federation.spec.ts +0 -184
- package/src/service/connection_fingerprint.spec.ts +0 -102
- package/src/service/connection_service.spec.ts +0 -711
- package/src/service/connection_service.ts +0 -291
- package/src/service/cron_evaluator.spec.ts +0 -79
- package/src/service/cron_evaluator.ts +0 -105
- package/src/service/db_utils.spec.ts +0 -1085
- package/src/service/db_utils.ts +0 -1502
- package/src/service/duckdb_instance_isolation.spec.ts +0 -137
- package/src/service/ducklake_lazy_attach.spec.ts +0 -110
- package/src/service/embedding_provider.spec.ts +0 -329
- package/src/service/embedding_provider.ts +0 -236
- package/src/service/environment.ts +0 -2191
- package/src/service/environment_admission.spec.ts +0 -344
- package/src/service/environment_compile.spec.ts +0 -197
- package/src/service/environment_store.spec.ts +0 -2274
- package/src/service/environment_store.ts +0 -2434
- package/src/service/environment_store_anchoring.spec.ts +0 -107
- package/src/service/environment_store_clone.spec.ts +0 -350
- package/src/service/explore_visibility.spec.ts +0 -434
- package/src/service/exports_probe.spec.ts +0 -107
- package/src/service/extension_fetch_policy.spec.ts +0 -256
- package/src/service/filter.spec.ts +0 -458
- package/src/service/filter.ts +0 -341
- package/src/service/filter_bypass.spec.ts +0 -418
- package/src/service/filter_integration.spec.ts +0 -1004
- package/src/service/freshness.spec.ts +0 -183
- package/src/service/freshness.ts +0 -112
- package/src/service/gcs_s3_utils.ts +0 -427
- package/src/service/given.ts +0 -105
- package/src/service/givens_integration.spec.ts +0 -219
- package/src/service/manifest_loader.spec.ts +0 -189
- package/src/service/manifest_loader.ts +0 -156
- package/src/service/materialization_build_session.spec.ts +0 -435
- package/src/service/materialization_build_session.ts +0 -681
- package/src/service/materialization_config_validation.spec.ts +0 -99
- package/src/service/materialization_config_validation.ts +0 -120
- package/src/service/materialization_eligibility.spec.ts +0 -158
- package/src/service/materialization_eligibility.ts +0 -305
- package/src/service/materialization_schedule_surface.spec.ts +0 -256
- package/src/service/materialization_scheduler.spec.ts +0 -289
- package/src/service/materialization_scheduler.ts +0 -304
- package/src/service/materialization_serve_transform.spec.ts +0 -1003
- package/src/service/materialization_serve_transform.ts +0 -779
- package/src/service/materialization_service.spec.ts +0 -2373
- package/src/service/materialization_service.ts +0 -2342
- package/src/service/materialization_test_fixtures.ts +0 -249
- package/src/service/model.spec.ts +0 -1157
- package/src/service/model.ts +0 -3370
- package/src/service/model_limits.spec.ts +0 -209
- package/src/service/model_limits.ts +0 -131
- package/src/service/model_storage_serve.spec.ts +0 -193
- package/src/service/model_storage_serve_joins.spec.ts +0 -193
- package/src/service/package.spec.ts +0 -612
- package/src/service/package.ts +0 -1799
- package/src/service/package_manifest.spec.ts +0 -230
- package/src/service/package_manifest.ts +0 -241
- package/src/service/package_memory_governor.spec.ts +0 -173
- package/src/service/package_memory_governor.ts +0 -233
- package/src/service/package_quote_bound_tables.spec.ts +0 -171
- package/src/service/package_race.spec.ts +0 -208
- package/src/service/package_reload_safety.spec.ts +0 -193
- package/src/service/package_rollback.spec.ts +0 -190
- package/src/service/package_worker_path.spec.ts +0 -645
- package/src/service/path_injection.spec.ts +0 -39
- package/src/service/persist_annotation_validation.spec.ts +0 -89
- package/src/service/persist_annotation_validation.ts +0 -59
- package/src/service/persistence_policy.spec.ts +0 -374
- package/src/service/proxy.spec.ts +0 -414
- package/src/service/proxy.ts +0 -248
- package/src/service/query_boundary.spec.ts +0 -470
- package/src/service/query_metadata.spec.ts +0 -408
- package/src/service/query_metadata.ts +0 -492
- package/src/service/query_metadata_identity.spec.ts +0 -149
- package/src/service/query_text.spec.ts +0 -79
- package/src/service/query_text.ts +0 -43
- package/src/service/quoting.spec.ts +0 -135
- package/src/service/quoting.ts +0 -78
- package/src/service/resolve_environment.ts +0 -15
- package/src/service/restricted_mode.spec.ts +0 -299
- package/src/service/source_extraction.ts +0 -225
- package/src/service/theme_store.ts +0 -199
- package/src/storage/DatabaseInterface.ts +0 -198
- package/src/storage/StorageManager.ts +0 -113
- package/src/storage/duckdb/ConnectionRepository.ts +0 -143
- package/src/storage/duckdb/DuckDBConnection.ts +0 -123
- package/src/storage/duckdb/DuckDBRepository.ts +0 -208
- package/src/storage/duckdb/EnvironmentRepository.ts +0 -148
- package/src/storage/duckdb/MaterializationRepository.spec.ts +0 -191
- package/src/storage/duckdb/MaterializationRepository.ts +0 -336
- package/src/storage/duckdb/PackageRepository.ts +0 -135
- package/src/storage/duckdb/schema.ts +0 -229
- package/src/stream_helpers.spec.ts +0 -280
- package/src/stream_helpers.ts +0 -162
- package/src/telemetry.ts +0 -20
- package/src/test_helpers/metrics_harness.ts +0 -166
- package/src/theme_key_parity.spec.ts +0 -57
- package/src/utils.ts +0 -29
- package/tests/fixtures/authorize-compile/model.malloy +0 -9
- package/tests/fixtures/authorize-compile/publisher.json +0 -4
- package/tests/fixtures/html-pages-nopublic/model.malloy +0 -1
- package/tests/fixtures/html-pages-nopublic/publisher.json +0 -5
- package/tests/fixtures/html-pages-test/data.csv +0 -3
- package/tests/fixtures/html-pages-test/public/assets/app.css +0 -3
- package/tests/fixtures/html-pages-test/public/barehtml.html +0 -4
- package/tests/fixtures/html-pages-test/public/bodymeta.html +0 -8
- package/tests/fixtures/html-pages-test/public/data.json +0 -1
- package/tests/fixtures/html-pages-test/public/fitcomment.html +0 -11
- package/tests/fixtures/html-pages-test/public/index.html +0 -9
- package/tests/fixtures/html-pages-test/public/nohead.html +0 -8
- package/tests/fixtures/html-pages-test/public/notfit.html +0 -13
- package/tests/fixtures/html-pages-test/public/slides.html +0 -12
- package/tests/fixtures/html-pages-test/public/sub/page2.html +0 -9
- package/tests/fixtures/html-pages-test/public/unterminated.html +0 -10
- package/tests/fixtures/html-pages-test/publisher.json +0 -5
- package/tests/fixtures/html-pages-test/report.malloy +0 -1
- package/tests/fixtures/persist-multi-level/data/orders.csv +0 -5
- package/tests/fixtures/persist-multi-level/multi_level.malloy +0 -18
- package/tests/fixtures/persist-multi-level/publisher.json +0 -5
- package/tests/fixtures/persist-schedule-test/data/orders.csv +0 -5
- package/tests/fixtures/persist-schedule-test/persist_schedule_test.malloy +0 -11
- package/tests/fixtures/persist-schedule-test/publisher.json +0 -7
- package/tests/fixtures/persist-schedule-warn-test/data/orders.csv +0 -5
- package/tests/fixtures/persist-schedule-warn-test/persist_warn_test.malloy +0 -11
- package/tests/fixtures/persist-schedule-warn-test/publisher.json +0 -6
- package/tests/fixtures/persist-test/data/orders.csv +0 -5
- package/tests/fixtures/persist-test/persist_test.malloy +0 -11
- package/tests/fixtures/persist-test/publisher.json +0 -5
- package/tests/fixtures/publisher.config.json +0 -15
- package/tests/fixtures/query-givens/data/orders.csv +0 -7
- package/tests/fixtures/query-givens/model.malloy +0 -34
- package/tests/fixtures/query-givens/publisher.json +0 -5
- package/tests/fixtures/xlsx/database.xlsx +0 -0
- package/tests/harness/mcp_test_setup.ts +0 -332
- package/tests/harness/rest_e2e.ts +0 -68
- package/tests/integration/authorize/compile_authorize_http.integration.spec.ts +0 -92
- package/tests/integration/concurrent_package/concurrent_package.integration.spec.ts +0 -280
- package/tests/integration/duckdb_storage/duckdb_storage.integration.spec.ts +0 -138
- package/tests/integration/first_boot/readiness_line.integration.spec.ts +0 -177
- package/tests/integration/html_pages/html_pages.integration.spec.ts +0 -440
- package/tests/integration/legacy_routes/legacy_routes.integration.spec.ts +0 -259
- package/tests/integration/materialization/environment_list.integration.spec.ts +0 -133
- package/tests/integration/materialization/freshness_gate.integration.spec.ts +0 -292
- package/tests/integration/materialization/manifest_binding.integration.spec.ts +0 -430
- package/tests/integration/materialization/materialization_lifecycle.integration.spec.ts +0 -441
- package/tests/integration/materialization/orchestrated_rebind.integration.spec.ts +0 -150
- package/tests/integration/materialization/reference_manifest.integration.spec.ts +0 -251
- package/tests/integration/materialization/schedule_edit.integration.spec.ts +0 -126
- package/tests/integration/materialization/scheduler.integration.spec.ts +0 -200
- package/tests/integration/materialization/scheduler_recovery.integration.spec.ts +0 -172
- package/tests/integration/materialization/scheduler_transitions.integration.spec.ts +0 -256
- package/tests/integration/materialization/scheduler_wiring.integration.spec.ts +0 -143
- package/tests/integration/mcp/mcp_execute_query_tool.integration.spec.ts +0 -438
- package/tests/integration/mcp/mcp_get_context_semantic.integration.spec.ts +0 -235
- package/tests/integration/mcp/mcp_transport.integration.spec.ts +0 -98
- package/tests/integration/query_givens/query_givens.integration.spec.ts +0 -146
- package/tests/integration/query_givens/query_givens_authorize.integration.spec.ts +0 -121
- package/tests/integration/sdk_givens/sdk_givens.integration.spec.ts +0 -110
- package/tests/integration/watch-mode/watch_mode.integration.spec.ts +0 -421
- package/tests/unit/controller/theme.controller.spec.ts +0 -141
- package/tests/unit/duckdb/attached_databases.test.ts +0 -1243
- package/tests/unit/duckdb/duckdb_connection.test.ts +0 -181
- package/tests/unit/duckdb/legacy_schema_migration.test.ts +0 -197
- package/tests/unit/duckdb/repositories.test.ts +0 -208
- package/tests/unit/ducklake/ducklake.test.ts +0 -952
- package/tests/unit/service/theme_store.spec.ts +0 -139
- package/tsconfig.json +0 -32
|
@@ -1,236 +0,0 @@
|
|
|
1
|
-
import { EmbeddingConfig, getEmbeddingConfig } from "../config";
|
|
2
|
-
|
|
3
|
-
/** Timeout for bulk (index-build) embedding calls. */
|
|
4
|
-
export const EMBEDDING_BATCH_TIMEOUT_MS = 30_000;
|
|
5
|
-
/**
|
|
6
|
-
* Timeout for the single per-request query embedding. Much shorter than
|
|
7
|
-
* the bulk timeout: this call sits on the latency path of every semantic
|
|
8
|
-
* `malloy_getContext` call, and a slow endpoint must degrade to lexical
|
|
9
|
-
* quickly rather than stall the tool.
|
|
10
|
-
*/
|
|
11
|
-
export const EMBEDDING_QUERY_TIMEOUT_MS = 5_000;
|
|
12
|
-
/** Per-input character cap (matches the hosted indexing pipeline). */
|
|
13
|
-
export const MAX_EMBED_INPUT_CHARS = 1_024;
|
|
14
|
-
/** Inputs per HTTP request; large packages embed in several requests. */
|
|
15
|
-
export const MAX_EMBED_BATCH_SIZE = 512;
|
|
16
|
-
|
|
17
|
-
type FetchFn = typeof fetch;
|
|
18
|
-
|
|
19
|
-
interface EmbeddingResponseItem {
|
|
20
|
-
index?: number;
|
|
21
|
-
embedding?: number[];
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Collapse whitespace (newlines confuse some embedding models) and cap
|
|
26
|
-
* the input length, mirroring the hosted indexing pipeline's input
|
|
27
|
-
* preparation. Never returns an empty string: providers reject empty
|
|
28
|
-
* input items with a 400, which would fail a whole package's batch, so
|
|
29
|
-
* text that collapses to nothing (a whitespace-only backtick identifier)
|
|
30
|
-
* becomes a placeholder token instead. This is the single choke point
|
|
31
|
-
* for that invariant; the index hashes this same function's output, so
|
|
32
|
-
* hash and sent text cannot drift. Exported for tests and for
|
|
33
|
-
* content-hashing: the hash must cover the text actually sent, so a
|
|
34
|
-
* truncation-boundary edit re-embeds.
|
|
35
|
-
*/
|
|
36
|
-
export function prepareEmbeddingInput(text: string): string {
|
|
37
|
-
const cleaned = text.replace(/\s+/g, " ").trim();
|
|
38
|
-
const capped =
|
|
39
|
-
cleaned.length > MAX_EMBED_INPUT_CHARS
|
|
40
|
-
? cleaned.slice(0, MAX_EMBED_INPUT_CHARS)
|
|
41
|
-
: cleaned;
|
|
42
|
-
return capped || "-";
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Minimal client for an OpenAI-compatible `/embeddings` endpoint, called
|
|
47
|
-
* with global fetch (no provider SDK; see fetchFromPublisherDataplane for
|
|
48
|
-
* the outbound-HTTP precedent this follows). The API key travels only in
|
|
49
|
-
* the Authorization header and must never be logged; error messages carry
|
|
50
|
-
* at most a 200-char body excerpt and never echo request headers.
|
|
51
|
-
*/
|
|
52
|
-
export class EmbeddingProvider {
|
|
53
|
-
constructor(
|
|
54
|
-
private config: EmbeddingConfig,
|
|
55
|
-
private fetchFn: FetchFn = fetch,
|
|
56
|
-
) {}
|
|
57
|
-
|
|
58
|
-
get model(): string {
|
|
59
|
-
return this.config.model;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
get dimensions(): number | undefined {
|
|
63
|
-
return this.config.dimensions;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Embed `texts` in order. Inputs are prepared (whitespace-collapsed,
|
|
68
|
-
* capped) and sent in batches of {@link MAX_EMBED_BATCH_SIZE}. Throws
|
|
69
|
-
* on any HTTP, timeout, or malformed-response failure; callers own the
|
|
70
|
-
* fallback-to-lexical decision.
|
|
71
|
-
*/
|
|
72
|
-
async embedBatch(texts: string[], timeoutMs: number): Promise<number[][]> {
|
|
73
|
-
const vectors: number[][] = [];
|
|
74
|
-
for (let i = 0; i < texts.length; i += MAX_EMBED_BATCH_SIZE) {
|
|
75
|
-
const chunk = texts
|
|
76
|
-
.slice(i, i + MAX_EMBED_BATCH_SIZE)
|
|
77
|
-
.map(prepareEmbeddingInput);
|
|
78
|
-
vectors.push(...(await this.embedChunk(chunk, timeoutMs)));
|
|
79
|
-
}
|
|
80
|
-
return vectors;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
private async embedChunk(
|
|
84
|
-
inputs: string[],
|
|
85
|
-
timeoutMs: number,
|
|
86
|
-
): Promise<number[][]> {
|
|
87
|
-
const url = `${this.config.baseUrl}/embeddings`;
|
|
88
|
-
const body: Record<string, unknown> = {
|
|
89
|
-
model: this.config.model,
|
|
90
|
-
input: inputs,
|
|
91
|
-
};
|
|
92
|
-
if (this.config.dimensions !== undefined) {
|
|
93
|
-
body.dimensions = this.config.dimensions;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
let response: Response;
|
|
97
|
-
try {
|
|
98
|
-
response = await this.fetchFn(url, {
|
|
99
|
-
method: "POST",
|
|
100
|
-
headers: {
|
|
101
|
-
"Content-Type": "application/json",
|
|
102
|
-
Authorization: `Bearer ${this.config.apiKey}`,
|
|
103
|
-
},
|
|
104
|
-
body: JSON.stringify(body),
|
|
105
|
-
signal: AbortSignal.timeout(timeoutMs),
|
|
106
|
-
});
|
|
107
|
-
} catch (error) {
|
|
108
|
-
const reason =
|
|
109
|
-
(error as Error)?.name === "TimeoutError"
|
|
110
|
-
? `timed out after ${timeoutMs}ms`
|
|
111
|
-
: (error as Error).message;
|
|
112
|
-
throw new Error(`Embedding request to ${url} failed: ${reason}`);
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
if (!response.ok) {
|
|
116
|
-
// Auth-failure bodies commonly reflect the presented credential
|
|
117
|
-
// (OpenAI's 401 echoes partial key characters; a self-hosted
|
|
118
|
-
// proxy may echo the whole token), and this message is logged
|
|
119
|
-
// by callers. Drop those bodies entirely, and scrub any literal
|
|
120
|
-
// occurrence of the key from the rest.
|
|
121
|
-
let detail: string;
|
|
122
|
-
if (response.status === 401 || response.status === 403) {
|
|
123
|
-
detail = "authentication failed; check EMBEDDING_API_KEY";
|
|
124
|
-
} else {
|
|
125
|
-
const bodyText = await response.text().catch(() => "");
|
|
126
|
-
detail = bodyText
|
|
127
|
-
.split(this.config.apiKey)
|
|
128
|
-
.join("[REDACTED]")
|
|
129
|
-
.slice(0, 200);
|
|
130
|
-
}
|
|
131
|
-
throw new Error(
|
|
132
|
-
`Embedding request to ${url} failed (${response.status}): ${detail}`,
|
|
133
|
-
);
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
const json = (await response.json()) as {
|
|
137
|
-
data?: EmbeddingResponseItem[];
|
|
138
|
-
};
|
|
139
|
-
const data = json?.data;
|
|
140
|
-
if (!Array.isArray(data) || data.length !== inputs.length) {
|
|
141
|
-
throw new Error(
|
|
142
|
-
`Embedding response from ${url} malformed: expected ${inputs.length} embeddings, got ${Array.isArray(data) ? data.length : "none"}`,
|
|
143
|
-
);
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
// The response documents per-item `index` fields; place by index
|
|
147
|
-
// defensively rather than assuming order.
|
|
148
|
-
const vectors = new Array<number[] | undefined>(inputs.length);
|
|
149
|
-
for (let i = 0; i < data.length; i++) {
|
|
150
|
-
const item = data[i];
|
|
151
|
-
const idx = typeof item?.index === "number" ? item.index : i;
|
|
152
|
-
if (
|
|
153
|
-
!Array.isArray(item?.embedding) ||
|
|
154
|
-
item.embedding.length === 0 ||
|
|
155
|
-
// Numeric contents, not just shape: a provider returning
|
|
156
|
-
// [1, null, "x"] would otherwise be stored and misbehave
|
|
157
|
-
// silently (NaN scores) at search time.
|
|
158
|
-
!item.embedding.every(
|
|
159
|
-
(n: unknown) => typeof n === "number" && Number.isFinite(n),
|
|
160
|
-
) ||
|
|
161
|
-
idx < 0 ||
|
|
162
|
-
idx >= inputs.length ||
|
|
163
|
-
vectors[idx] !== undefined
|
|
164
|
-
) {
|
|
165
|
-
throw new Error(
|
|
166
|
-
`Embedding response from ${url} malformed at item ${i}`,
|
|
167
|
-
);
|
|
168
|
-
}
|
|
169
|
-
vectors[idx] = item.embedding;
|
|
170
|
-
}
|
|
171
|
-
return vectors as number[][];
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
// Cached on a config fingerprint, never on null: a call after the env
|
|
176
|
-
// changes (tests, operator restarts with new vars are moot, but the
|
|
177
|
-
// integration suite runs many specs in one process) always sees the
|
|
178
|
-
// current configuration instead of a stale provider or a sticky "off".
|
|
179
|
-
let cached: { fingerprint: string; provider: EmbeddingProvider } | null = null;
|
|
180
|
-
let testOverride: { provider: EmbeddingProvider | null } | null = null;
|
|
181
|
-
|
|
182
|
-
/**
|
|
183
|
-
* Whether the operator has turned the embedding feature on at all.
|
|
184
|
-
* Malformed companion vars still count as configured: the operator
|
|
185
|
-
* clearly intends the feature, so the retrieval marker and a warning
|
|
186
|
-
* must surface rather than silently reporting plain lexical.
|
|
187
|
-
*/
|
|
188
|
-
export function embeddingConfigured(): boolean {
|
|
189
|
-
if (testOverride) {
|
|
190
|
-
return testOverride.provider !== null;
|
|
191
|
-
}
|
|
192
|
-
try {
|
|
193
|
-
return getEmbeddingConfig() !== null;
|
|
194
|
-
} catch {
|
|
195
|
-
return true;
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
/**
|
|
200
|
-
* The process-wide provider for the current embedding configuration, or
|
|
201
|
-
* null when `EMBEDDING_API_KEY` is unset. Throws on malformed companion
|
|
202
|
-
* env vars (see getEmbeddingConfig); callers on the tool path catch and
|
|
203
|
-
* degrade.
|
|
204
|
-
*/
|
|
205
|
-
export function getEmbeddingProvider(): EmbeddingProvider | null {
|
|
206
|
-
if (testOverride) {
|
|
207
|
-
return testOverride.provider;
|
|
208
|
-
}
|
|
209
|
-
const config = getEmbeddingConfig();
|
|
210
|
-
if (!config) {
|
|
211
|
-
cached = null;
|
|
212
|
-
return null;
|
|
213
|
-
}
|
|
214
|
-
const fingerprint = [
|
|
215
|
-
config.baseUrl,
|
|
216
|
-
config.model,
|
|
217
|
-
config.dimensions ?? "",
|
|
218
|
-
config.apiKey,
|
|
219
|
-
].join("\u0000");
|
|
220
|
-
if (!cached || cached.fingerprint !== fingerprint) {
|
|
221
|
-
cached = { fingerprint, provider: new EmbeddingProvider(config) };
|
|
222
|
-
}
|
|
223
|
-
return cached.provider;
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
/** Test seam: force the provider (or null). Undo with _clear...(). */
|
|
227
|
-
export function _setEmbeddingProviderForTests(
|
|
228
|
-
provider: EmbeddingProvider | null,
|
|
229
|
-
): void {
|
|
230
|
-
testOverride = { provider };
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
export function _clearEmbeddingProviderForTests(): void {
|
|
234
|
-
testOverride = null;
|
|
235
|
-
cached = null;
|
|
236
|
-
}
|