USearch

unum-cloudApache-2.0活跃维护

轻量级向量与任意对象相似度搜索聚类引擎,支持十多种编程语言,可做近似最近邻检索、模糊搜索和推荐系统。

Fast Open-Source Search & Clustering engine × for Vectors & Arbitrary Objects × in C++, C, Python, JavaScript, Rust, Java, Objective-C, Swift, C#, GoLang, and Wolfram 🔍

v2.26.6发布于 2026-10-25 01:00 UTC4,379star +7 / 7 天373fork同步于 2026-11-10 11:38 UTC

怎么上手

由 README 提炼,执行前请确认
pip install usearch
硬件要求按 README 说明

README 未说明具体显存或 GPU 型号要求;提到 SIMD 优化、硬件相关的默认量化级别,并推荐现代 CPU 使用 bf16。

支持 Apple Silicon
下载:源码 zip·GitHub Releases(安装包)本站不镜像安装包

项目说明

由 README 自动翻译提炼

单文件 C++11 头文件的 HNSW 向量相似度搜索与聚类引擎,比 FAISS 更快更轻,支持十种语言绑定

轻量级向量与任意对象相似度搜索聚类引擎,支持十多种编程语言,可做近似最近邻检索、模糊搜索和推荐系统。

核心能力

  • 单头文件 C++11 库实现 HNSW 近似最近邻搜索
  • 支持用户自定义度量并带 JIT 编译与 SIMD 优化
  • 支持 bf16、f16、i8 等半精度与量化存储
  • 可将索引以内存映射方式从磁盘直接服务
  • 提供 Python、JS、Rust、Java、Go 等十种语言原生绑定

容易踩的坑

默认存储/量化级别随硬件而变,跨机器复用索引时建议显式指定 dtype;README 未说明默认端口等部署细节。

内容由模型根据 README 生成,可能不完整或不准确,以官方文档为准。看原文 README

最近发版

5 个版本v2.26.6
  1. v2.26.6Release v2.26.6最新正式版2026-10-25 · 2026-10-25 01:00 UTC

    Release: v2.26.6 [skip ci]

    Patch

    • Make: Require kernels that build on GCC 16 and load on macOS 14 (343dc7b)
    • Fix: Reject a zero count in Python search (f6d6f84)
    • Docs: Define the distances built-in metrics return (3ea3624)
    • Make: Install the server image's Python packages in a venv (3a4cb6e)
    • Fix: Keep key lookups usable when the rehash cannot allocate (1633e25)
    • Fix: Validate nested vector batches in JavaScript bindings (8480ece)
    • Fix: Reject out-of-range keys in JavaScript bindings (b65a420)
    • Fix: Bound entry slot and max level from the file header (9c25176)
    • Fix: Pass executor to exact search in C API (f51074d)
    • Improve: Clarify Python worker parallelism (5d3f821)
    • Make: Refresh Python wheels and release publishing (21c44e7)
    • Fix: Preserve Go filter callbacks across C calls (ad77fe7)
  2. v2.26.5Release v2.26.52026-10-18 · 2026-10-18 21:47 UTC
    查看更新说明

    Release: v2.26.5 [skip ci]

    Patch

    • Fix: Avoid aliasing native BF16 values (e05a071)
    • Make: Stabilize release pipelines and adopt NuGet trusted publishing (46a4dcb)
    • Fix: Parenthesize splitmix64_t min and max for windows.h (0f1c5f2)
    • Make: Add install targets for C library and header (4160e47)
    • Make: Support relocatable pkg-config paths with @ONLY substitution (679e190)
    • Make: Use GNUInstallDirs variables for install paths (14f9807)
    • Fix: Preserve top-k neighbors when cropping Python datasets (88faaf2)
    • Fix: Preserve distinct node-level streams across threads and reserves (30d75a4)
  3. v2.26.4Release v2.26.42026-10-05 · 2026-10-05 18:04 UTC
    查看更新说明

    Release: v2.26.4 [skip ci]

    Patch

    • Fix: Treat a zero integer dot product as orthogonal (295485b)
    • Fix: Keep cosine reductions visible to OpenMP (f167681)
    • Fix: Reindex keys after compact permutes slots (0a4baa6)
    • Docs: Broaden the integration list and make the examples runnable (0fd2f32)
    • Fix: Count binary dimensions in Python exact search (0a99f33)
    • Docs: Use ScalarKind::B1 and mark the buffer view unsafe (a692bfc)
  4. v2.26.3Release v2.26.32026-10-02 · 2026-10-02 16:20 UTC
    查看更新说明

    Release: v2.26.3 [skip ci]

    Patch

    • Make: Tune only tests & benchmarks to the host, on every compiler (74576b3)
  5. v2.26.2Release v2.26.22026-08-31 · 2026-08-31 22:40 UTC
    查看更新说明

    Release: v2.26.2 [skip ci]

    Patch

    • Improve: Native enums and PEP 604 unions (a1ca7c3)
    • Make: Ship a Python source distribution (d921aef)
    • Fix: Retry Linux file mapping without O_NOATIME #784 (d532fb3)

用户点评

登录用户的真实使用记录,可按版本和硬件筛选
共 0 条

    还没有人点评。第一个说出真实体验的人最有价值。

    README 原文

    未翻译

    Technical Insights and related articles:

    Comparison with FAISS

    FAISS is a widely recognized standard for high-performance vector search engines. USearch and FAISS both employ the same HNSW algorithm, but they differ significantly in their design principles. USearch is compact and broadly compatible without sacrificing performance, primarily focusing on user-defined metrics and fewer dependencies.

    FAISSUSearchImprovement
    Indexing time ⁰
    100 Million 96d f32, f16, i8 vectors2.6 · 2.6 · 2.6 h0.3 · 0.2 · 0.2 h9.6 · 10.4 · 10.7 x
    100 Million 1536d f32, f16, i8 vectors5.0 · 4.1 · 3.8 h2.1 · 1.1 · 0.8 h2.3 · 3.6 · 4.4 x
    Codebase length ¹84 K SLOC3 K SLOCmaintainable
    Supported metrics ²9 fixed metricsany metricextendible
    Supported languages ³C++, Python10 languagesportable
    Supported ID types ⁴32-bit, 64-bit32-bit, 40-bit, 64-bitefficient
    Filtering ⁵ban-listsany predicatescomposable
    Required dependencies ⁶BLAS, OpenMP-light-weight
    Bindings ⁷SWIGNativelow-latency
    Python binding size ⁸~ 10 MB< 1 MBdeployable

    ⁰ Tested on Intel Sapphire Rapids, with the simplest inner-product distance, equivalent recall, and memory consumption while also providing far superior search speed. ¹ A shorter codebase of usearch/ over faiss/ makes the project easier to maintain and audit. ² User-defined metrics allow you to customize your search for various applications, from GIS to creating custom metrics for composite embeddings from multiple AI models or hybrid full-text and semantic search. ³ With USearch, you can reuse the same preconstructed index in various programming languages. ⁴ The 40-bit integer allows you to store 4B+ vectors without allocating 8 bytes for every neighbor reference in the proximity graph. ⁵ With USearch the index can be combined with arbitrary external containers, like Bloom filters or third-party databases, to filter out irrelevant keys during index traversal. ⁶ Lack of obligatory dependencies makes USearch much more portable. ⁷ Native bindings introduce lower call latencies than more straightforward approaches. ⁸ Lighter bindings make downloads and deployments faster.

    Base functionality is identical to FAISS, and the interface must be familiar if you have ever investigated Approximate Nearest Neighbors search:

    # pip install usearch
    
    import numpy as np
    from usearch.index import Index
    
    index = Index(ndim=3)               # Default settings for 3D vectors
    vector = np.array([0.2, 0.6, 0.4])  # Can be a matrix for batch operations
    index.add(42, vector)               # Add one or many vectors in parallel
    matches = index.search(vector, 10)  # Find 10 nearest neighbors
    
    assert matches[0].key == 42
    assert matches[0].distance <= 0.001
    assert np.allclose(index[42], vector, atol=0.1) # Ensure high tolerance in mixed-precision comparisons
    

    More settings are always available, and the API is designed to be as flexible as possible. The default storage/quantization level is hardware-dependant for efficiency, but bf16 is recommended for most modern CPUs.

    index = Index(
        ndim=3, # Define the number of dimensions in input vectors
        metric='cos', # Choose 'l2sq', 'ip', 'haversine' or other metric, default = 'cos'
        dtype='bf16', # Store as 'f64', 'f32', 'bf16', 'f16', 'e5m2', 'e4m3', 'e3m2', 'e2m3', 'u8', 'i8', 'b1'..., default = None
        connectivity=16, # Optional: Limit number of neighbors per graph node
        expansion_add=128, # Optional: Control the recall of indexing
        expansion_search=64, # Optional: Control the quality of the search
        multi=False, # Optional: Allow multiple vectors per key, default = False
    )
    

    Serialization & Serving Index from Disk

    USearch supports multiple forms of serialization:

    • Into a file defined with a path.
    • Into a stream defined with a callback, serializing or reconstructing incrementally.
    • Into a buffer of fixed length or a memory-mapped file that supports random access.

    The latter allows you to serve indexes from external memory, enabling you to optimize your server choices for indexing speed and serving costs. This can result in 20x cost reduction on AWS and other public clouds.

    index.save("index.usearch")
    
    index.load("index.usearch")
    view = Index.restore("index.usearch", view=True, ...)
    
    other_view = Index(ndim=..., metric=...)
    other_view.view("index.usearch")
    

    Exact vs. Approximate Search

    Approximate search methods, such as HNSW, are predominantly used when an exact brute-force search becomes too resource-intensive. This typically occurs when you have millions of entries in a collection. For smaller collections, we offer a more direct approach with the search method.

    from usearch.index import search, MetricKind, Matches, BatchMatches
    import numpy as np
    
    # Generate 10'000 random vectors with 1024 dimensions
    vectors = np.random.rand(10_000, 1024).astype(np.float32)
    vector = np.random.rand(1024).astype(np.float32)
    
    one_in_many: Matches = search(vectors, vector, 50, MetricKind.L2sq, exact=True)
    many_in_many: BatchMatches = search(vectors, vectors, 50, MetricKind.L2sq, exact=True)
    

    If you pass the exact=True argument, the system bypasses indexing altogether and performs a brute-force search through the entire dataset using SIMD-optimized similarity metrics from NumKong. When compared to FAISS's IndexFlatL2 in Google Colab, USearch may offer up to a 20x performance improvement:

    • faiss.IndexFlatL2: 55.3 ms.
    • usearch.index.search: 2.54 ms.

    User-Defined Metrics

    Built-in metrics return distances, so a smaller Match.distance means closer.

    • cos, the Python default, returns $1 - \frac{a \cdot b}{\lVert a \rVert \lVert b \rVert}$ for vectors of any length.
    • ip returns $1 - a \cdot b$, matching cos only for unit-length vectors and turning negative once $a \cdot b > 1$.
    • l2sq returns the squared Euclidean distance $\sum_i (a_i - b_i)^2$, without the square root.

    While most vector search packages concentrate on just two metrics, "Inner Product distance" and "Euclidean distance", USearch allows arbitrary user-defined metrics. This flexibility allows you to customize your search for various applications, from computing geospatial coordinates with the rare Haversine distance to creating custom metrics for composite embeddings from multiple AI models, like joint image-text embeddings. You can use Numba, Cppyy, or PeachPy to define your custom metric even in Python:

    from numba import cfunc, types, carray
    from usearch.index import Index, MetricKind, MetricSignature, CompiledMetric
    
    ndim = 256
    
    @cfunc(types.float32(types.CPointer(types.float32), types.CPointer(types.float32)))
    def python_inner_product(a, b):
        a_array = carray(a, ndim)
        b_array = carray(b, ndim)
        c = 0.0
        for i in range(ndim):
            c += a_array[i] * b_array[i]
        return 1 - c
    
    metric = CompiledMetric(pointer=python_inner_product.address, kind=MetricKind.IP, signature=MetricSignature.ArrayArray)
    index = Index(ndim=ndim, metric=metric, dtype=np.float32)
    

    Similar effect is even easier to achieve in C, C++, and Rust interfaces. Moreover, unlike older approaches indexing high-dimensional spaces, like KD-Trees and Locality Sensitive Hashing, HNSW doesn't require vectors to be identical in length. They only have to be comparable. So you can apply it in obscure applications, like searching for similar sets or fuzzy text matching, using GZip compression-ratio as a distance function.

    Filtering and Predicate Functions

    Sometimes you may want to cross-reference search-results against some external database or filter them based on some criteria. In most engines, you'd have to manually perform paging requests, successively filtering the results. In USearch you can simply pass a predicate function to the search method, which will be applied directly during graph traversal. In Rust that would look like this:

    let is_odd = |key: Key| key % 2 == 1;
    let query = vec![0.2, 0.1, 0.2, 0.1, 0.3];
    let results = index.filtered_search(&query, 10, is_odd).unwrap();
    assert!(
        results.keys.iter().all(|&key| key % 2 == 1),
        "All keys must be odd"
    );
    

    Memory Efficiency, Downcasting, and Quantization

    Training a quantization model and dimension-reduction is a common approach to accelerate vector search. Those, however, are only sometimes reliable, can significantly affect the statistical properties of your data, and require regular adjustments if your distribution shifts. Instead, we have focused on high-precision arithmetic over low-precision downcasted vectors. The same index, and add and search operations will automatically down-cast or up-cast between f64_t, f32_t, bf16_t, f16_t, e5m2_t, e4m3_t, e3m2_t, e2m3_t, u8_t, i8_t, and single-bit b1x8_t representations. You can use the following command to check, if hardware acceleration is enabled:

    $ python -c 'from usearch.index import Index; print(Index(ndim=768, metric="cos", dtype="f16").hardware_acceleration)'
    > sapphire
    $ python -c 'from usearch.index import Index; print(Index(ndim=166, metric="tanimoto").hardware_acceleration)'
    > ice
    

    In most cases, bf16 is recommended for modern CPUs. For even smaller footprints, USearch supports IEEE & MX-compatible Float8 (e5m2 and e4m3) and Float6 (e3m2 and e2m3) formats. You can pass pre-quantized buffers from NumKong with the explicit dtype= parameter on add and search, or let USearch handle the quantization internally from higher-precision inputs. When quantization is enabled, the "get"-like functions won't be able to recover the original data, so you may want to replicate the original vectors elsewhere. When quantizing to i8_t integers, note that it's only valid for cosine-like metrics. As part of the quantization process, the vectors are normalized to unit length and later scaled to [-127, 127] range to occupy the full 8-bit range. When quantizing to b1x8_t single-bit representations, note that it's only valid for binary metrics like Jaccard, Hamming, etc. As part of the quantization process, the scalar components greater than zero are set to true, and the rest to false.

    USearch uint40_t support

    Using smaller numeric types will save you RAM needed to store the vectors, but you can also compress the neighbors lists forming our proximity graphs. By default, 32-bit uint32_t is used to enumerate those, which is not enough if you need to address over 4 Billion entries. For such cases we provide a custom uint40_t type, that will still be 37.5% more space-efficient than the commonly used 8-byte integers, and will scale up to 1 Trillion entries.

    Indexes for Multi-Index Lookups

    For larger workloads targeting billions or even trillions of vectors, parallel multi-index lookups become invaluable. Instead of constructing one extensive index, you can build multiple smaller ones and view them together.

    from usearch.index import Indexes
    
    multi_index = Indexes(
        indexes: Iterable[usearch.index.Index] = [...],
        paths: Iterable[os.PathLike] = [...],
        view: bool = False,
        threads: int = 0,
    )
    multi_index.search(...)
    

    Clustering

    Once the index is constructed, USearch can perform K-Nearest Neighbors Clustering much faster than standalone clustering libraries, like SciPy, UMap, and tSNE. Same for dimensionality reduction with PCA. Essentially, the Index itself can be seen as a clustering, allowing iterative deepening.

    clustering = index.cluster(
        min_count=10, # Optional
        max_count=15, # Optional
        threads=..., # Optional
    )
    
    # Get the clusters and their sizes
    centroid_keys, sizes = clustering.centroids_popularity
    
    # Use Matplotlib to draw a histogram
    clustering.plot_centroids_popularity()
    
    # Export a NetworkX graph of the clusters
    g = clustering.network
    
    # Get members of a specific cluster
    first_members = clustering.members_of(centroid_keys[0])
    
    # Deepen into that cluster, splitting it into more parts, all the same arguments supported
    sub_clustering = clustering.subcluster(min_count=..., max_count=...)
    

    The resulting clustering isn't identical to K-Means or other conventional approaches but serves the same purpose. Alternatively, using Scikit-Learn on a 1 Million point dataset, one may expect queries to take anywhere from minutes to hours, depending on the number of clusters you want to highlight. For 50'000 clusters, the performance difference between USearch and conventional clustering methods may easily reach 100x.

    Joins, One-to-One, One-to-Many, and Many-to-Many Mappings

    One of the big questions these days is how AI will change the world of databases and data management. Most databases are still struggling to implement high-quality fuzzy search, and the only kind of joins they know are deterministic. A join differs from searching for every entry, requiring a one-to-one mapping banning collisions among separate search results.

    Exact SearchFuzzy SearchSemantic Search ?
    Exact JoinFuzzy Join ?Semantic Join ??

    Using USearch, one can implement sub-quadratic complexity approximate, fuzzy, and semantic joins. This can be useful in any fuzzy-matching tasks common to Database Management Software.

    men = Index(...)
    women = Index(...)
    pairs: dict = men.join(women, max_proposals=0, exact=False)
    

    Read more in the post: Combinatorial Stable Marriages for Semantic Search 💍

    Functionality

    By now, the core functionality is supported across all bindings. Broader functionality is ported per request. In some cases, like Batch operations, feature parity is meaningless, as the host language has full multi-threading capabilities and the USearch index structure is concurrent by design, so the users can implement batching/scheduling/load-balancing in the most optimal way for their applications.

    C++ 11Python 3C 99JavaJavaScriptRustGoSwift
    Add, search, remove✅✅✅✅✅✅✅✅
    Save, load, view✅✅✅✅✅✅✅✅
    User-defined metrics✅✅✅❌❌✅❌❌
    Batch operations❌✅❌✅✅❌❌❌
    Filter predicates✅❌✅❌❌✅❌✅
    Joins✅✅❌❌❌❌❌❌
    Variable-length vectors✅❌❌❌❌❌❌❌
    4B+ capacities✅❌❌❌❌❌❌❌

    Application Examples

    USearch + UForm + UCall = Multimodal Semantic Search

    AI has a growing number of applications, but one of the coolest classic ideas is to use it for Semantic Search. One can take an encoder model, like the multi-modal UForm, and a web-programming framework, like UCall, and build a text-to-image search platform in just 20 lines of Python.

    from ucall import Server
    from uform import get_model, Modality
    from usearch.index import Index
    
    import numpy as np
    import PIL as pil
    
    processors, models = get_model('unum-cloud/uform3-image-text-english-small')
    model_text = models[Modality.TEXT_ENCODER]
    model_image = models[Modality.IMAGE_ENCODER]
    processor_text = processors[Modality.TEXT_ENCODER]
    processor_image = processors[Modality.IMAGE_ENCODER]
    
    server = Server()
    index = Index(ndim=256)
    
    @server
    def add(key: int, photo: pil.Image.Image):
        image = processor_image(photo)
        vector = model_image(image)
        index.add(key, vector.flatten(), copy=True)
    
    @server
    def search(query: str) -> np.ndarray:
        tokens = processor_text(query)
        vector = model_text(tokens)
        matches = index.search(vector.flatten(), 3)
        return matches.keys
    
    server.run()
    

    Similar experiences can also be implemented in other languages and on the client side, removing the network latency. For Swift and iOS, check out the ashvardanian/SwiftSemanticSearch repository.

    A more complete demo with Streamlit is available on GitHub. We have pre-processed some commonly used datasets, cleaned the images, produced the vectors, and pre-built the index.

    DatasetModalitiesImagesDownload
    UnsplashImages & Descriptions25 KHuggingFace / Unum
    Conceptual CaptionsImages & Descriptions3 MHuggingFace / Unum
    ArxivTitles & Abstracts2 MHuggingFace / Unum

    USearch + RDKit = Molecular Search

    Comparing molecule graphs and searching for similar structures is expensive and slow. It can be seen as a special case of the NP-Complete Subgraph Isomorphism problem. Luckily, domain-specific approximate methods exist. The one commonly used in Chemistry is to generate structures from SMILES and later hash them into binary fingerprints. The latter are searchable with binary similarity metrics, like the Tanimoto coefficient. Below is an example using the RDKit package.

    from usearch.index import Index, MetricKind
    from rdkit import Chem
    from rdkit.Chem import AllChem
    
    import numpy as np
    
    molecules = [Chem.MolFromSmiles('CCOC'), Chem.MolFromSmiles('CCO')]
    encoder = AllChem.GetRDKitFPGenerator()
    
    fingerprints = np.vstack([encoder.GetFingerprint(x) for x in molecules])
    fingerprints = np.packbits(fingerprints, axis=1)
    
    index = Index(ndim=2048, metric=MetricKind.Tanimoto)
    keys = np.arange(len(molecules))
    
    index.add(keys, fingerprints)
    matches = index.search(fingerprints, 10)
    

    That method was used to build the "USearch Molecules", one of the largest Chem-Informatics datasets, containing 7 billion small molecules and 28 billion fingerprints.

    USearch + POI Coordinates = GIS Applications

    Similar to Vector and Molecule search, USearch can be used for Geospatial Information Systems. The Haversine distance is available out of the box, but you can also define more complex relationships, like the Vincenty formula, that accounts for the Earth's oblateness.

    from numba import cfunc, types, carray
    import math
    
    ndim = 2
    semi_major, flattening = 6378137.0, 1 / 298.257223563
    semi_minor = (1 - flattening) * semi_major
    
    def vincenty_distance(first_ptr, second_ptr):
        first, second = carray(first_ptr, ndim), carray(second_ptr, ndim)
        lat1, lon1, lat2, lon2 = first[0], first[1], second[0], second[1]
        diff_lon = lon2 - lon1
        rlat1, rlat2 = math.atan((1 - flattening) * math.tan(lat1)), math.atan((1 - flattening) * math.tan(lat2))
        sin_rlat1, cos_rlat1 = math.sin(rlat1), math.cos(rlat1)
        sin_rlat2, cos_rlat2 = math.sin(rlat2), math.cos(rlat2)
        lon_on_sphere = diff_lon
        for _ in range(100):
            sin_lon, cos_lon = math.sin(lon_on_sphere), math.cos(lon_on_sphere)
            sin_ang = math.sqrt((cos_rlat2 * sin_lon) ** 2 + (cos_rlat1 * sin_rlat2 - sin_rlat1 * cos_rlat2 * cos_lon) ** 2)
            if sin_ang == 0: return 0.0
            cos_ang = sin_rlat1 * sin_rlat2 + cos_rlat1 * cos_rlat2 * cos_lon
            ang = math.atan2(sin_ang, cos_ang)
            sin_az = cos_rlat1 * cos_rlat2 * sin_lon / sin_ang
            cos2_az = 1 - sin_az ** 2
            cos2_mid = cos_ang - 2 * sin_rlat1 * sin_rlat2 / cos2_az if cos2_az != 0 else 0.0
            corr = flattening / 16 * cos2_az * (4 + flattening * (4 - 3 * cos2_az))
            prev = lon_on_sphere
            lon_on_sphere = diff_lon + (1 - corr) * flattening * (
                sin_az * (ang + corr * sin_ang * (cos2_mid + corr * cos_ang * (-1 + 2 * cos2_mid ** 2))))
            if abs(lon_on_sphere - prev) <= 1e-12: break
        else:
            return float('nan')
        u_sq = cos2_az * (semi_major ** 2 - semi_minor ** 2) / (semi_minor ** 2)
        ca = 1 + u_sq / 16384 * (4096 + u_sq * (-768 + u_sq * (320 - 175 * u_sq)))
        cb = u_sq / 1024 * (256 + u_sq * (-128 + u_sq * (74 - 47 * u_sq)))
        delta = cb * sin_ang * (cos2_mid + cb / 4 * (cos_ang * (-1 + 2 * cos2_mid ** 2)
            - cb / 6 * cos2_mid * (-3 + 4 * sin_ang ** 2) * (-3 + 4 * cos2_mid ** 2)))
        return semi_minor * ca * (ang - delta) / 1000.0
    
    index = Index(ndim=ndim, metric=CompiledMetric(
        pointer=vincenty_distance.address,
        kind=MetricKind.Haversine,
        signature=MetricSignature.ArrayArray,
    ))
    

    Integrations & Users

    Databases & Query Engines

    AI Frameworks & Memory

    Applications & Products

    • Arm MCP: Python.
    • GPT4All: C++.
    • Ente: Rust, post.
    • Tracy profiler: C++, behind the embeddings index of its LLM assistant.
    • Copilot for Xcode by Intitni: Swift.
    • LLM for Unity: C#, docs.
    • Music Assistant: Python, docs.

    Citations

    @software{Vardanian_USearch,
    doi = {10.5281/zenodo.7949415},
    author = {Vardanian, Ash},
    title = {{USearch by Unum Cloud}},
    url = {https://github.com/unum-cloud/USearch},
    version = {2.26.6},
    year = {2026},
    }