1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
//! Raw declarations for the Needle 3 engine C API (`include/needle.h`).
//!
//! ## Overview
//!
//! Five functions, no handles, no opaque types. They drive one process-global model that the
//! engine owns: weights are loaded once with [`needle_load`], a conversation is configured with
//! [`needle_init`], and then [`needle_complete`] and [`needle_embed`] run against it until
//! [`needle_reset`] rewinds it.
//!
//! The declarations are written by hand rather than generated. Five stable entry points do not
//! justify a `bindgen` build dependency, and hand-written signatures let every function carry the
//! `# Safety` contract that was measured against the shipped archive.
//!
//! Every function returns `-1` on failure. There is no error-string API: when
//! [`needle_complete`] fails it writes a NUL-terminated JSON envelope of the shape
//! `{"type":"error","error":"..."}` into the caller's buffer instead.
//!
//! ## Usage
//!
//! ```no_run
//! use core::ffi::{c_char, c_int, c_ulonglong};
//!
//! use cactus_sys::{needle_complete, needle_init, needle_load};
//!
//! let weights: &[u8] = b"...contents of needle3.cact...";
//! let mut out = [0u8; 64 * 1024];
//!
//! // SAFETY: every call below happens on one thread, in order, and the engine copies the
//! // archive during `needle_load`, so `weights` needs no particular lifetime afterwards.
//! unsafe {
//! assert_eq!(needle_load(weights.as_ptr(), weights.len() as c_ulonglong), 0);
//! assert!(needle_init(c"You are terse.".as_ptr(), c"[]".as_ptr(), core::ptr::null()) > 0);
//!
//! let tokens = needle_complete(
//! c"hello".as_ptr(),
//! 64,
//! out.as_mut_ptr().cast::<c_char>(),
//! out.len() as c_int,
//! );
//! assert!(tokens >= 0);
//! }
//! ```
use ;
/// Commit of the `Cactus-Compute/needle3` Hugging Face repository this crate is pinned to.
///
/// It is the `commit` field of `cactus-sys/prebuilt.toml`, the same revision the
/// `download-binaries` feature fetches archives from, threaded through by the build script so
/// that the pin has exactly one source of truth.
///
/// # Examples
///
/// ```
/// assert_eq!(cactus_sys::NEEDLE_ENGINE_COMMIT.len(), 40);
/// ```
pub const NEEDLE_ENGINE_COMMIT: &str = env!;
unsafe extern "C"