Skip to content
Open
Show file tree
Hide file tree
Changes from 10 commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
2fcafc0
Improve settings
flevi29 Feb 4, 2025
9692533
Fix formatting
flevi29 Feb 4, 2025
ab6b24b
Merge branch 'main' into improve-settings
flevi29 Feb 6, 2025
80b6db7
Merge branch 'main' into improve-settings
flevi29 Feb 17, 2025
4c85a6f
Merge branch 'main' into improve-settings
flevi29 Mar 2, 2025
d21ecfd
Merge with main
flevi29 Mar 20, 2025
9a82d5e
Merge with main
flevi29 Mar 21, 2025
83a1b09
Merge with main
flevi29 Mar 26, 2025
d845050
Fix lint issue
flevi29 Mar 26, 2025
12d5c37
Merge with main
flevi29 Apr 1, 2025
b851425
Make adjustments, fixes
flevi29 Apr 10, 2025
86a8f89
Remove unnecessary type params
flevi29 Apr 10, 2025
3095a19
Shorten code
flevi29 Apr 10, 2025
d35cc36
Adjust documentation, fix test
flevi29 Apr 11, 2025
beb41ea
Merge branch 'main' into improve-settings
flevi29 Apr 11, 2025
65fb90e
Documentation
flevi29 Apr 11, 2025
0dfc39f
Merge with main
flevi29 Apr 22, 2025
a8b99d1
Progress
flevi29 Apr 24, 2025
f6dbc99
Refactor settings tests
flevi29 Apr 24, 2025
9e9fd85
Minor changes
flevi29 Apr 25, 2025
7b83644
Improve tests
flevi29 Apr 25, 2025
b523bca
Merge branch 'main' into improve-settings
flevi29 Apr 29, 2025
4dee0f7
Merge with main
flevi29 May 19, 2025
9a95477
Use randomUUID instead of fixed UUID
flevi29 May 19, 2025
c52f078
Merge with main, and add vector store experimental feature
flevi29 Sep 23, 2025
4bda5ad
Fix type issue, temporarily fix test error
flevi29 Sep 23, 2025
32d171c
Fix experimental settings test
flevi29 Sep 23, 2025
5966914
Fix test
flevi29 Sep 23, 2025
ceb2db6
Adjustments, docs
flevi29 Sep 25, 2025
77b0797
Adjustments
flevi29 Sep 25, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
647 changes: 202 additions & 445 deletions src/indexes.ts

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions src/types/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
export * from "./settings.js";
export * from "./task_and_batch.js";
export * from "./token.js";
export * from "./types.js";
127 changes: 127 additions & 0 deletions src/types/settings.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
import type { NonNullableDeepRecordValues } from "./shared.js";

/** {@link https://www.meilisearch.com/docs/reference/api/settings#proximity-precision} */
export type ProximityPrecision = "byWord" | "byAttribute";

/** @see `minWordSizeForTypos` at {@link https://www.meilisearch.com/docs/reference/api/settings#typo-tolerance} */
export type MinWordSizeForTypos = {
oneTypo?: number | null;
twoTypos?: number | null;
};

/** {@link https://www.meilisearch.com/docs/reference/api/settings#typo-tolerance} */
export type TypoTolerance = {
enabled?: boolean | null;
minWordSizeForTypos?: MinWordSizeForTypos | null;
disableOnWords?: string[] | null;
disableOnAttributes?: string[] | null;
};

/** @see `sortFacetValuesBy` at {@link https://www.meilisearch.com/docs/reference/api/settings#faceting} */
export type FacetOrder = "alpha" | "count";

/** {@link https://www.meilisearch.com/docs/reference/api/settings#faceting} */
export type Faceting = {
maxValuesPerFacet?: number | null;
sortFacetValuesBy?: Record<string, FacetOrder> | null;
};

/** {@link https://www.meilisearch.com/docs/reference/api/settings#pagination} */
export type PaginationSettings = { maxTotalHits?: number | null };

/** @see `distribution` at {@link https://www.meilisearch.com/docs/reference/api/settings#embedders-experimental} */
export type Distribution = {
mean: number;
sigma: number;
};

/** @see `source` at {@link https://www.meilisearch.com/docs/reference/api/settings#embedders-experimental} */
export type EmbedderSource =
| "openAi"
| "huggingFace"
| "ollama"
| "userProvided"
| "rest";

/** {@link https://www.meilisearch.com/docs/reference/api/settings#embedders-experimental} */
export type EmbeddingSettings = {
source?: EmbedderSource | null;
model?: string | null;
revision?: string | null;
apiKey?: string | null;
dimensions?: number | null;
binaryQuantized?: boolean | null;
documentTemplate?: string | null;
documentTemplateMaxBytes?: number | null;
url?: string | null;
request?: unknown;
response?: unknown;
headers?: Record<string, string> | null;
distribution?: Distribution | null;
};

/** {@link https://www.meilisearch.com/docs/reference/api/settings#localized-attributes} */
export type LocalizedAttribute = {
attributePatterns: string[] | null;
locales: string[] | null;
};

/** {@link https://www.meilisearch.com/docs/reference/api/settings#prefix-search} */
export type PrefixSearch = "indexingTime" | "disabled";

/** A version of {@link Settings} that can be used to update the settings. */
export type UpdatableSettings = {
/** {@link https://www.meilisearch.com/docs/reference/api/settings#displayed-attributes} */
displayedAttributes?: string[] | null;
/** {@link https://www.meilisearch.com/docs/reference/api/settings#searchable-attributes} */
searchableAttributes?: string[] | null;
/** {@link https://www.meilisearch.com/docs/reference/api/settings#filterable-attributes} */
filterableAttributes?: string[] | null;
/** {@link https://www.meilisearch.com/docs/reference/api/settings#sortable-attributes} */
sortableAttributes?: string[] | null;
/** {@link https://www.meilisearch.com/docs/reference/api/settings#ranking-rules} */
rankingRules?: string[] | null;
/** {@link https://www.meilisearch.com/docs/reference/api/settings#stop-words} */
stopWords?: string[] | null;
/** {@link https://www.meilisearch.com/docs/reference/api/settings#non-separator-tokens} */
nonSeparatorTokens?: string[] | null;
/** {@link https://www.meilisearch.com/docs/reference/api/settings#separator-tokens} */
separatorTokens?: string[] | null;
/** {@link https://www.meilisearch.com/docs/reference/api/settings#dictionary} */
dictionary?: string[] | null;
/** {@link https://www.meilisearch.com/docs/reference/api/settings#synonyms} */
synonyms?: Record<string, string[]> | null;
/** {@link https://www.meilisearch.com/docs/reference/api/settings#distinct-attribute} */
distinctAttribute?: string | null;
/** {@link https://www.meilisearch.com/docs/reference/api/settings#proximity-precision} */
proximityPrecision?: ProximityPrecision | null;
/** {@link https://www.meilisearch.com/docs/reference/api/settings#typo-tolerance} */
typoTolerance?: TypoTolerance | null;
/** {@link https://www.meilisearch.com/docs/reference/api/settings#faceting} */
faceting?: Faceting | null;
/** {@link https://www.meilisearch.com/docs/reference/api/settings#pagination} */
pagination?: PaginationSettings | null;
/** {@link https://www.meilisearch.com/docs/reference/api/settings#embedders-experimental} */
embedders?: Record<string, EmbeddingSettings> | null;
/** {@link https://www.meilisearch.com/docs/reference/api/settings#search-cutoff} */
searchCutoffMs?: number | null;
/** {@link https://www.meilisearch.com/docs/reference/api/settings#localized-attributes} */
localizedAttributes?: LocalizedAttribute[] | null;
/** {@link https://www.meilisearch.com/docs/reference/api/settings#facet-search} */
facetSearch?: boolean | null;
/** {@link https://www.meilisearch.com/docs/reference/api/settings#prefix-search} */
prefixSearch?: PrefixSearch | null;
};

/**
* A version of {@link UpdatableSettings}, the first layer of properties of which
* is used to update or get individual settings.
*/
export type IndividualSettings = Required<UpdatableSettings>;

/**
* {@link https://www.meilisearch.com/docs/reference/api/settings#body}
*
* @see `meilisearch_types::settings::Settings` at {@link https://github.com/meilisearch/meilisearch}
*/
export type Settings = NonNullableDeepRecordValues<UpdatableSettings>;
2 changes: 1 addition & 1 deletion src/types/task_and_batch.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { Settings } from "./types.js";
import type { Settings } from "./settings.js";
import type { CursorResults } from "./shared.js";
import type { MeiliSearchErrorResponse } from "./types.js";

Expand Down
150 changes: 0 additions & 150 deletions src/types/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -492,156 +492,6 @@ export type UpdateDocumentsByFunctionOptions = {
context?: RecordAny;
};

/*
** Settings
*/

export type FilterableAttributes = string[] | null;
export type DistinctAttribute = string | null;
export type SearchableAttributes = string[] | null;
export type SortableAttributes = string[] | null;
export type DisplayedAttributes = string[] | null;
export type RankingRules = string[] | null;
export type StopWords = string[] | null;
export type Synonyms = Record<string, string[]> | null;
export type TypoTolerance = {
enabled?: boolean | null;
disableOnAttributes?: string[] | null;
disableOnWords?: string[] | null;
minWordSizeForTypos?: {
oneTypo?: number | null;
twoTypos?: number | null;
};
} | null;
export type SeparatorTokens = string[] | null;
export type NonSeparatorTokens = string[] | null;
export type Dictionary = string[] | null;
export type ProximityPrecision = "byWord" | "byAttribute";

export type Distribution = {
mean: number;
sigma: number;
};

export type OpenAiEmbedder = {
source: "openAi";
model?: string;
apiKey?: string;
documentTemplate?: string;
dimensions?: number;
distribution?: Distribution;
url?: string;
documentTemplateMaxBytes?: number;
binaryQuantized?: boolean;
};

export type HuggingFaceEmbedder = {
source: "huggingFace";
model?: string;
revision?: string;
documentTemplate?: string;
distribution?: Distribution;
documentTemplateMaxBytes?: number;
binaryQuantized?: boolean;
};

export type UserProvidedEmbedder = {
source: "userProvided";
dimensions: number;
distribution?: Distribution;
binaryQuantized?: boolean;
};

export type RestEmbedder = {
source: "rest";
url: string;
apiKey?: string;
dimensions?: number;
documentTemplate?: string;
distribution?: Distribution;
request: RecordAny;
response: RecordAny;
headers?: Record<string, string>;
documentTemplateMaxBytes?: number;
binaryQuantized?: boolean;
};

export type OllamaEmbedder = {
source: "ollama";
url?: string;
apiKey?: string;
model?: string;
documentTemplate?: string;
distribution?: Distribution;
dimensions?: number;
documentTemplateMaxBytes?: number;
binaryQuantized?: boolean;
};

export type Embedder =
| OpenAiEmbedder
| HuggingFaceEmbedder
| UserProvidedEmbedder
| RestEmbedder
| OllamaEmbedder
| null;

export type Embedders = Record<string, Embedder> | null;

export type FacetOrder = "alpha" | "count";

export type Faceting = {
maxValuesPerFacet?: number | null;
sortFacetValuesBy?: Record<string, FacetOrder> | null;
};

export type PaginationSettings = {
maxTotalHits?: number | null;
};

export type SearchCutoffMs = number | null;

export type LocalizedAttribute = {
attributePatterns: string[];
locales: Locale[];
};

export type LocalizedAttributes = LocalizedAttribute[] | null;

export type PrefixSearch = "indexingTime" | "disabled";

export type Settings = {
filterableAttributes?: FilterableAttributes;
distinctAttribute?: DistinctAttribute;
sortableAttributes?: SortableAttributes;
searchableAttributes?: SearchableAttributes;
displayedAttributes?: DisplayedAttributes;
rankingRules?: RankingRules;
stopWords?: StopWords;
synonyms?: Synonyms;
typoTolerance?: TypoTolerance;
faceting?: Faceting;
pagination?: PaginationSettings;
separatorTokens?: SeparatorTokens;
nonSeparatorTokens?: NonSeparatorTokens;
dictionary?: Dictionary;
proximityPrecision?: ProximityPrecision;
embedders?: Embedders;
searchCutoffMs?: SearchCutoffMs;
localizedAttributes?: LocalizedAttributes;

/**
* Enable facet searching on all the filters of an index (requires Meilisearch
* 1.12.0 or later)
*/
facetSearch?: boolean;
/**
* Enable the ability to search a word by prefix on an index (requires
* Meilisearch 1.12.0 or later)
*/
prefixSearch?: "indexingTime" | "disabled";
};

/*
*** HEALTH
*/
Expand Down
2 changes: 1 addition & 1 deletion tests/displayed_attributes.test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { afterAll, expect, test, describe, beforeEach } from "vitest";
import { ErrorStatusCode } from "../src/types/index.js";
import { ErrorStatusCode } from "../src/index.js";
import {
clearAllIndexes,
config,
Expand Down
2 changes: 1 addition & 1 deletion tests/distinct_attribute.test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { afterAll, expect, test, describe, beforeEach } from "vitest";
import { ErrorStatusCode } from "../src/types/index.js";
import { ErrorStatusCode } from "../src/index.js";
import {
clearAllIndexes,
config,
Expand Down
2 changes: 1 addition & 1 deletion tests/dump.test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { expect, test, describe, beforeEach, assert } from "vitest";
import { ErrorStatusCode } from "../src/types/index.js";
import { ErrorStatusCode } from "../src/index.js";
import {
clearAllIndexes,
config,
Expand Down
16 changes: 8 additions & 8 deletions tests/embedders.test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { afterAll, expect, test, describe, beforeEach } from "vitest";
import type { Embedders } from "../src/types/index.js";
import type { IndividualSettings } from "../src/index.js";
import {
clearAllIndexes,
config,
Expand Down Expand Up @@ -68,7 +68,7 @@ describe.each([{ permission: "Master" }, { permission: "Admin" }])(

test(`${permission} key: Update embedders with 'userProvided' source`, async () => {
const client = await getClient(permission);
const newEmbedder: Embedders = {
const newEmbedder: IndividualSettings["embedders"] = {
default: {
source: "userProvided",
dimensions: 1,
Expand All @@ -89,7 +89,7 @@ describe.each([{ permission: "Master" }, { permission: "Admin" }])(

test(`${permission} key: Update embedders with 'openAi' source`, async () => {
const client = await getClient(permission);
const newEmbedder: Embedders = {
const newEmbedder: IndividualSettings["embedders"] = {
default: {
source: "openAi",
apiKey: "<your-OpenAI-API-key>",
Expand Down Expand Up @@ -120,7 +120,7 @@ describe.each([{ permission: "Master" }, { permission: "Admin" }])(

test(`${permission} key: Update embedders with 'huggingFace' source`, async () => {
const client = await getClient(permission);
const newEmbedder: Embedders = {
const newEmbedder: IndividualSettings["embedders"] = {
default: {
source: "huggingFace",
model: "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2",
Expand All @@ -146,7 +146,7 @@ describe.each([{ permission: "Master" }, { permission: "Admin" }])(

test(`${permission} key: Update embedders with 'rest' source`, async () => {
const client = await getClient(permission);
const newEmbedder: Embedders = {
const newEmbedder: IndividualSettings["embedders"] = {
default: {
source: "rest",
url: "https://api.openai.com/v1/embeddings",
Expand Down Expand Up @@ -191,7 +191,7 @@ describe.each([{ permission: "Master" }, { permission: "Admin" }])(

test(`${permission} key: Update embedders with 'ollama' source`, async () => {
const client = await getClient(permission);
const newEmbedder: Embedders = {
const newEmbedder: IndividualSettings["embedders"] = {
default: {
source: "ollama",
url: "http://localhost:11434/api/embeddings",
Expand Down Expand Up @@ -222,7 +222,7 @@ describe.each([{ permission: "Master" }, { permission: "Admin" }])(
test(`${permission} key: Update embedders with a specific name`, async () => {
const client = await getClient(permission);

const newEmbedder: Embedders = {
const newEmbedder: IndividualSettings["embedders"] = {
image: {
source: "userProvided",
dimensions: 512,
Expand Down Expand Up @@ -303,7 +303,7 @@ describe.each([{ permission: "Master" }, { permission: "Admin" }])(
test(`${permission} key: search for similar documents`, async () => {
const client = await getClient(permission);

const newEmbedder: Embedders = {
const newEmbedder: IndividualSettings["embedders"] = {
manual: {
source: "userProvided",
dimensions: 3,
Expand Down
2 changes: 1 addition & 1 deletion tests/facet_search_settings.test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { afterAll, expect, test, describe, beforeEach } from "vitest";
import { ErrorStatusCode } from "../src/types/index.js";
import { ErrorStatusCode } from "../src/index.js";
import {
clearAllIndexes,
config,
Expand Down
Loading