42 lines
1.3 KiB
Markdown
42 lines
1.3 KiB
Markdown
```zig title="Zig"
|
|
const std = @import("std");
|
|
const kreuzberg = @import("kreuzberg");
|
|
|
|
const MyEmbedder = struct {
|
|
pub fn dimensions(self: *MyEmbedder) usize {
|
|
_ = self;
|
|
return 768;
|
|
}
|
|
|
|
pub fn embed(self: *MyEmbedder, texts: [*c]const u8) ![]u8 {
|
|
_ = self;
|
|
_ = texts;
|
|
// `texts` is a JSON-encoded array of strings. Return a JSON-encoded
|
|
// 2D float array of shape [n_texts, dimensions]; the dispatcher
|
|
// validates the shape on the Rust side.
|
|
return error.Plugin;
|
|
}
|
|
};
|
|
|
|
pub fn main() !void {
|
|
var instance = MyEmbedder{};
|
|
var vtable = kreuzberg.make_embedding_backend_vtable(MyEmbedder, &instance);
|
|
|
|
vtable.name_fn = struct {
|
|
fn thunk(user_data: ?*anyopaque, out_name: ?*?[*c]u8) callconv(.C) void {
|
|
_ = user_data;
|
|
if (out_name) |ptr| ptr.* = @constCast("my-embedder");
|
|
}
|
|
}.thunk;
|
|
vtable.version_fn = struct {
|
|
fn thunk(user_data: ?*anyopaque, out_version: ?*?[*c]u8) callconv(.C) void {
|
|
_ = user_data;
|
|
if (out_version) |ptr| ptr.* = @constCast("1.0.0");
|
|
}
|
|
}.thunk;
|
|
|
|
var out_error: ?[*c]u8 = null;
|
|
_ = kreuzberg.register_embedding_backend("my-embedder", vtable, &instance, &out_error);
|
|
}
|
|
```
|