Thomas G. Lopes commited on
Commit
0ff4ef8
·
1 Parent(s): 39318e7

add fuzzy searching

Browse files
src/lib/components/InferencePlayground/InferencePlaygroundModelSelectorModal.svelte CHANGED
@@ -7,6 +7,7 @@
7
  import IconSearch from "../Icons/IconSearch.svelte";
8
  import IconStar from "../Icons/IconStar.svelte";
9
  import { getTrending } from "$lib/utils/model";
 
10
 
11
  export let conversation: Conversation;
12
 
@@ -20,12 +21,8 @@
20
 
21
  $: trendingModels = getTrending($models);
22
 
23
- $: featuredModels = trendingModels.filter(m => {
24
- return m.id.toLocaleLowerCase().includes(query.toLocaleLowerCase().trim());
25
- });
26
- $: otherModels = $models.filter(m => {
27
- return m.id.toLocaleLowerCase().includes(query.toLocaleLowerCase().trim());
28
- });
29
 
30
  onMount(() => {
31
  if (featuredModels.findIndex(model => model.id === conversation.model.id) !== -1) {
 
7
  import IconSearch from "../Icons/IconSearch.svelte";
8
  import IconStar from "../Icons/IconStar.svelte";
9
  import { getTrending } from "$lib/utils/model";
10
+ import fuzzysearch from "$lib/utils/search";
11
 
12
  export let conversation: Conversation;
13
 
 
21
 
22
  $: trendingModels = getTrending($models);
23
 
24
+ $: featuredModels = fuzzysearch({ needle: query, haystack: trendingModels, property: "id" });
25
+ $: otherModels = fuzzysearch({ needle: query, haystack: $models, property: "id" });
 
 
 
 
26
 
27
  onMount(() => {
28
  if (featuredModels.findIndex(model => model.id === conversation.model.id) !== -1) {
src/lib/components/InferencePlayground/InferencePlaygroundProviderSelect.svelte CHANGED
@@ -4,7 +4,6 @@
4
  import { randomPick } from "$lib/utils/array";
5
  import { cn } from "$lib/utils/cn";
6
  import { createSelect, createSync } from "@melt-ui/svelte";
7
- import { onMount } from "svelte";
8
  import IconCaret from "../Icons/IconCaret.svelte";
9
  import IconProvider from "../Icons/IconProvider.svelte";
10
 
 
4
  import { randomPick } from "$lib/utils/array";
5
  import { cn } from "$lib/utils/cn";
6
  import { createSelect, createSync } from "@melt-ui/svelte";
 
7
  import IconCaret from "../Icons/IconCaret.svelte";
8
  import IconProvider from "../Icons/IconProvider.svelte";
9
 
src/lib/components/InferencePlayground/inferencePlaygroundUtils.ts CHANGED
@@ -1,9 +1,8 @@
1
- import { type ChatCompletionOutputMessage } from "@huggingface/tasks";
2
- import type { InferenceSnippet, ModelDataMinimal } from "@huggingface/tasks";
3
  import type { Conversation, ModelWithTokenizer } from "$lib/types";
 
 
4
 
5
  import { HfInference, snippets, type InferenceProvider } from "@huggingface/inference";
6
- import { keys } from "$lib/utils/object";
7
 
8
  export async function handleStreamingResponse(
9
  hf: HfInference,
 
 
 
1
  import type { Conversation, ModelWithTokenizer } from "$lib/types";
2
+ import type { InferenceSnippet } from "@huggingface/tasks";
3
+ import { type ChatCompletionOutputMessage } from "@huggingface/tasks";
4
 
5
  import { HfInference, snippets, type InferenceProvider } from "@huggingface/inference";
 
6
 
7
  export async function handleStreamingResponse(
8
  hf: HfInference,
src/lib/utils/model.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { Model, ModelWithTokenizer } from "$lib/types";
2
 
3
  export function getTrending(models: ModelWithTokenizer[], limit = 5) {
4
  return models.toSorted((a, b) => b.trendingScore - a.trendingScore).slice(0, limit);
 
1
+ import type { ModelWithTokenizer } from "$lib/types";
2
 
3
  export function getTrending(models: ModelWithTokenizer[], limit = 5) {
4
  return models.toSorted((a, b) => b.trendingScore - a.trendingScore).slice(0, limit);
src/lib/utils/search.ts ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Generic fuzzy search function that searches through arrays and returns matching items
3
+ *
4
+ * @param options Configuration object for the fuzzy search
5
+ * @returns Array of items that match the search criteria
6
+ */
7
+ export default function fuzzysearch<T>(options: {
8
+ needle: string;
9
+ haystack: T[];
10
+ property: keyof T | ((item: T) => string);
11
+ }): T[] {
12
+ const { needle, haystack, property } = options;
13
+
14
+ if (!Array.isArray(haystack)) {
15
+ throw new Error("Haystack must be an array");
16
+ }
17
+
18
+ if (!property) {
19
+ throw new Error("Property selector is required");
20
+ }
21
+
22
+ // Convert needle to lowercase for case-insensitive matching
23
+ const lowerNeedle = needle.toLowerCase();
24
+
25
+ // Filter the haystack to find matching items
26
+ return haystack.filter(item => {
27
+ // Extract the string value from the item based on the property selector
28
+ const value = typeof property === "function" ? property(item) : String(item[property]);
29
+
30
+ // Convert to lowercase for case-insensitive matching
31
+ const lowerValue = value.toLowerCase();
32
+
33
+ // Perform the fuzzy search
34
+ return fuzzyMatchString(lowerNeedle, lowerValue);
35
+ });
36
+ }
37
+
38
+ /**
39
+ * Internal helper function that performs the actual fuzzy string matching
40
+ */
41
+ function fuzzyMatchString(needle: string, haystack: string): boolean {
42
+ const hlen = haystack.length;
43
+ const nlen = needle.length;
44
+
45
+ if (nlen > hlen) {
46
+ return false;
47
+ }
48
+
49
+ if (nlen === hlen) {
50
+ return needle === haystack;
51
+ }
52
+
53
+ outer: for (let i = 0, j = 0; i < nlen; i++) {
54
+ const nch = needle.charCodeAt(i);
55
+ while (j < hlen) {
56
+ if (haystack.charCodeAt(j++) === nch) {
57
+ continue outer;
58
+ }
59
+ }
60
+ return false;
61
+ }
62
+
63
+ return true;
64
+ }