henryNdubuaku commited on
Commit
52eb6d7
·
verified ·
1 Parent(s): d6c7d6a

Keep model guides concise and use the Cactus package

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. README.md +17 -93
  2. android-arm64/libneedle.a +0 -3
  3. android-arm64/needle +0 -3
  4. android-arm64/needle.h +0 -122
  5. android-armv7/libneedle.a +0 -3
  6. android-armv7/needle +0 -3
  7. android-armv7/needle.h +0 -122
  8. android-riscv64/libneedle.a +0 -3
  9. android-riscv64/needle +0 -3
  10. android-riscv64/needle.h +0 -122
  11. ios-arm64/libneedle.a +0 -3
  12. ios-arm64/needle.h +0 -122
  13. ios-sim-arm64/libneedle.a +0 -3
  14. ios-sim-arm64/needle.h +0 -122
  15. linux-arm64/libneedle.a +0 -3
  16. linux-arm64/needle +0 -3
  17. linux-arm64/needle.h +0 -122
  18. linux-armv7/libneedle.a +0 -3
  19. linux-armv7/needle +0 -3
  20. linux-armv7/needle.h +0 -122
  21. linux-mipsel/libneedle.a +0 -3
  22. linux-mipsel/needle +0 -3
  23. linux-mipsel/needle.h +0 -122
  24. linux-riscv64/libneedle.a +0 -3
  25. linux-riscv64/needle +0 -3
  26. linux-riscv64/needle.h +0 -122
  27. linux-x86_64/libneedle.a +0 -3
  28. linux-x86_64/needle +0 -3
  29. linux-x86_64/needle.h +0 -122
  30. macos-arm64/libneedle.a +0 -3
  31. macos-arm64/needle +0 -3
  32. macos-arm64/needle.h +0 -122
  33. python/cactus_needle-3.0.0-py3-none-macosx_11_0_arm64.whl +0 -3
  34. python/cactus_needle-3.0.0-py3-none-macosx_11_0_x86_64.whl +0 -3
  35. python/cactus_needle-3.0.0-py3-none-manylinux2014_aarch64.whl +0 -3
  36. python/cactus_needle-3.0.0-py3-none-manylinux2014_x86_64.whl +0 -3
  37. python/cactus_needle-3.0.0-py3-none-musllinux_1_2_aarch64.whl +0 -3
  38. python/cactus_needle-3.0.0-py3-none-musllinux_1_2_x86_64.whl +0 -3
  39. python/cactus_needle-3.0.0-py3-none-win_amd64.whl +0 -3
  40. python/cactus_needle-3.0.0-py3-none-win_arm64.whl +0 -3
  41. python/cactus_needle-3.0.1-py3-none-macosx_11_0_arm64.whl +0 -3
  42. python/cactus_needle-3.0.1-py3-none-macosx_11_0_x86_64.whl +0 -3
  43. python/cactus_needle-3.0.1-py3-none-manylinux2014_aarch64.whl +0 -3
  44. python/cactus_needle-3.0.1-py3-none-manylinux2014_x86_64.whl +0 -3
  45. python/cactus_needle-3.0.1-py3-none-musllinux_1_2_aarch64.whl +0 -3
  46. python/cactus_needle-3.0.1-py3-none-musllinux_1_2_x86_64.whl +0 -3
  47. python/cactus_needle-3.0.1-py3-none-win_amd64.whl +0 -3
  48. python/cactus_needle-3.0.1-py3-none-win_arm64.whl +0 -3
  49. python/cactus_needle-3.0.2-py3-none-macosx_11_0_arm64.whl +0 -3
  50. python/cactus_needle-3.0.2-py3-none-macosx_11_0_x86_64.whl +0 -3
README.md CHANGED
@@ -1,5 +1,5 @@
1
  ---
2
- library_name: cactus-needle
3
  pipeline_tag: text-generation
4
  license: apache-2.0
5
  tags:
@@ -11,114 +11,38 @@ tags:
11
  - webassembly
12
  ---
13
 
14
- ![Needle](assets/banner.svg)
15
 
16
- A foundation model for mobiles, wearables, robots, smart home, automotive and microcontrollers. The whole model is a single 8-29 MB file, and we trade general chat capacity to beat models 10x its size on mobile tool calls and match 2-3x bigger models on extraction.
17
 
18
- Needle does three jobs, all of them on the device:
19
-
20
- - **Tool calls**: given the functions your app exposes, Needle picks the right ones and fills every argument from what the user said. Ask for two things and you get two calls in order; ask for something no tool covers and you get an empty list, not a guess.
21
- - **Structured extraction**: declare a shape, hand over messy text, get typed fields back: an invoice, a booking, a notification, a form. The decode grammar guarantees the output parses, and extraction generalises to classification.
22
- - **Text embedding**: the same model returns a vector for a sentence, so an app can search, match and route locally.
23
-
24
- The same engine also runs [Whistle](https://huggingface.co/Cactus-Compute/whistle), our 16.9 MB speech-to-text model in seven languages. Load `whistle.cact` beside `needle3.cact` and the one binary transcribes a clip on its own, or answers it against your tools in a single call and returns the calls and the transcript in one JSON object.
25
-
26
- ## Model
27
-
28
- ![Needle 3 at a glance](assets/model.svg)
29
-
30
- Needle 3 is a Laddered Simple Attention Network, our small-model recipe: a Monarch Hadamard MLP in place of the FFN, GQA attention with causal conv taps, engram n-gram memory read by gather, and multi-lane hyper-connections, trained so that every depth from 2 to 20 layers is a deployable model. Most of its parameters sit in the engram, so the 121M model does the arithmetic of a 50M one. The weights are compressed to CQ2-bit with Cactus Quants; a byte-level grammar compiled from your schemas constrains every token, and every response carries a calibrated confidence score from a learned head. The architecture diagram is on the [release page](https://cactuscompute.com/needle). The repo holds the 20-layer `needle3.cact`, the `needle3.safetensors` checkpoint to fine-tune, and an engine per platform.
31
-
32
- ## Benchmarks
33
-
34
- Tool calling is exact-match accuracy on the full test splits, extraction is field micro-F1 on the full test splits.
35
-
36
- ![Needle 3 against baselines on six benchmarks](assets/benchmarks.svg)
37
-
38
- The interactive frontier plot, the architecture and the fine-tuning results are at [cactuscompute.com/needle](https://cactuscompute.com/needle).
39
 
40
  ## Get started
41
 
42
  ```sh
43
- pip install cactus-needle
44
  ```
45
 
46
- Try it in the browser at [cactuscompute.com/needle](https://cactuscompute.com/needle); the Python package and the source are on [GitHub](https://github.com/cactus-compute/needle).
47
-
48
  ```python
49
- import needle
50
 
51
- @needle.tool
52
  def get_weather(city: str):
53
  "Get the current weather for a city."
54
  return {"city": city, "temp_c": 27, "sky": "clear"}
55
 
56
- agent = needle.Needle(tools=[get_weather])
57
- print(agent.run("what's it like in Lagos right now?")["results"])
58
- # [{'city': 'Lagos', 'temp_c': 27, 'sky': 'clear'}]
59
  ```
60
 
61
- Every turn returns one JSON object with `function_calls`, the model's `reasoning` and a calibrated `confidence`; an off-topic request returns an empty list rather than a guess. The engine and the weights are fetched from this repo once and cached.
 
 
62
 
63
  ## Guides
64
 
65
- - [How to design tools for Needle 3](https://cactuscompute.com/blog/designing-tools-for-needle): one tool per action, names users would say, formats in descriptions, constraints in the grammar, triggers.
66
- - [Leveraging Needle's confidence](https://cactuscompute.com/blog/needle-confidence): what the score measures, what the engine withholds, and routing on act, confirm or refuse.
67
- - [Structured JSON extraction with Needle](https://cactuscompute.com/blog/structured-extraction-with-needle): the record as the only tool, typed results, classification with enums.
68
- - [Fine-tuning Needle](https://cactuscompute.com/blog/finetuning-needle): the data format, the commands, reading the loss, sizing the dataset.
69
- - [Needle Python docs](https://cactuscompute.com/blog/needle-python-docs): the API, the response shape, the behaviour contract, system facts, tool retrieval, offline devices, environments, the CLI.
70
- - [What devices are supported on Needle](https://cactuscompute.com/blog/needle-supported-devices): every platform folder, the CLI runner, the C API, the browser, WASI, air-gapped setup.
71
- - [The .cact format](https://cactuscompute.com/blog/cact-format): the file the engine maps and reads in place, Cactus Quants at 2.125 bits per weight, and how to parse it yourself.
72
- - [Porting Needle 3](https://cactuscompute.com/blog/porting-needle): notes for writing your own runtime, the oracle to test against, the tensor order the container promises, the prompt on the wire, the ladder rule, retrieval with `needle_embed`.
73
-
74
- ## Customisation
75
-
76
- Needle was designed to be customised. Its capacity is a ladder, and a subnetwork as small as 2 layers, fine-tuned on one product's tools, runs optimally on devices far smaller than the full model needs. Fine-tuning on DroidCall lifts every subnetwork by 18 to 36 points, and from 4 layers up the tuned subnetwork passes DeepSeek V4 Flash, starting at 29M parameters.
77
-
78
- ![Every subnetwork before and after fine-tuning on DroidCall and on Mobile Actions](assets/finetune.svg)
79
-
80
- The Python package fine-tunes with LoRA on the frozen base at the full 20 layers, then `needle build [--layers N]` merges the adapter, slices any subnetwork from 2 to 20 layers and exports a 4-bit `.cact` that runs on the same engine. The 2-bit post-training and quantisation behind the shipped model, enriched with Cactus proprietary datasets, run on the [Cactus Platform](https://cactuscompute.com/dashboard).
81
-
82
- ## Deploy
83
-
84
- Every platform folder in this repo holds an engine that loads `needle3.cact` at start. `needle build --platform <folder> [--layers N]` fetches the engine and header and puts the weights beside them at any depth, or download the folder here:
85
-
86
- ![One engine per platform folder](assets/deploy.svg)
87
-
88
- ```sh
89
- ./needle --model needle3.cact --tools tools.json --prompt "dim the living room to 30"
90
- ./needle --model needle3.cact --tools tools.json --serve
91
-
92
- # speech to text, live from a stream, and speech straight to tool calls
93
- ./needle --model whistle.cact --audio clip.wav
94
- ./needle --model whistle.cact --audio talk.wav --audio-stream
95
- ./needle --model needle3.cact --model whistle.cact --tools tools.json --audio clip.wav
96
- ```
97
-
98
- Tool schemas share the model context with the system prompt and conversation.
99
- `needle_init` returns the tokenized static-prefix length on success and fails
100
- when that prefix does not fit the model context. In the C API, call
101
- `needle_last_error()` after a negative return to get the measured prefix tokens
102
- and context limit. Reduce tool descriptions/schema text, split large catalogues,
103
- or declare more than five tools so Needle can keep only retrieved tools in the
104
- per-turn prefix. At completion time, `max_new_tokens` also reserves context room,
105
- so larger generation caps leave less space for the current turn and history.
106
-
107
- The [devices guide](https://cactuscompute.com/blog/needle-supported-devices) covers the runner flags, the C API, the WASI component and air-gapped setup.
108
-
109
- ## Citation
110
-
111
- Needle 3 is built by the Cactus Compute team. If you use it in your work, please cite:
112
-
113
- ```bibtex
114
- @misc{needle3_2026,
115
- title = {Needle: Foundation Tool-Calling Model for Tiny Devices},
116
- author = {Ndubuaku, Henry and Mosoyan, Karen and Mroz, Jakub and Cylich, Noah and
117
- Kumar, Satyajit and Sandhu, Parkirat and Shemet, Roman and Lee, Justin H.},
118
- year = {2026},
119
- organization = {Cactus Compute, Inc.},
120
- howpublished = {\url{https://github.com/cactus-compute/needle}}
121
- }
122
- ```
123
-
124
- Reach out on founders@cactuscompute.com for partnerships, collaborations, synergies and deploying Needle in your product.
 
1
  ---
2
+ library_name: cactus-compute
3
  pipeline_tag: text-generation
4
  license: apache-2.0
5
  tags:
 
11
  - webassembly
12
  ---
13
 
14
+ ![Needle 3](assets/banner.svg)
15
 
16
+ # Needle 3
17
 
18
+ An on-device model for tool calling, structured extraction and text embeddings.
19
+ See the [Needle website](https://cactuscompute.com/needle) for model details, benchmarks and the browser demo.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
 
21
  ## Get started
22
 
23
  ```sh
24
+ pip install -U cactus-compute
25
  ```
26
 
 
 
27
  ```python
28
+ import cactus
29
 
30
+ @cactus.tool
31
  def get_weather(city: str):
32
  "Get the current weather for a city."
33
  return {"city": city, "temp_c": 27, "sky": "clear"}
34
 
35
+ with cactus.Cactus(tools=[get_weather]) as agent:
36
+ print(agent.run("What's the weather in Lagos?")["results"])
 
37
  ```
38
 
39
+ The package downloads and caches the engine and weights on first use.
40
+ This repository provides `needle3.cact` and `checkpoints/needle3.safetensors`.
41
+ [Runtime binaries and supported platforms](https://huggingface.co/Cactus-Compute/cactus) live in the Cactus repository.
42
 
43
  ## Guides
44
 
45
+ - [Python API](https://cactuscompute.com/blog/needle-python-docs)
46
+ - [Designing tools](https://cactuscompute.com/blog/designing-tools-for-needle) and [structured extraction](https://cactuscompute.com/blog/structured-extraction-with-needle)
47
+ - [Fine-tuning](https://cactuscompute.com/blog/finetuning-needle)
48
+ - [Source code](https://github.com/cactus-compute/cactus)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
android-arm64/libneedle.a DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:7aa6de6132a22bf45f5e903425feb66f159ad46f47fa558921bc4fd02c3a2fa0
3
- size 2177676
 
 
 
 
android-arm64/needle DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:02a044e15489e19fa9f4f1cd1d5943d39dc0eefc08e0ba99d36279daf2351d46
3
- size 1586416
 
 
 
 
android-arm64/needle.h DELETED
@@ -1,122 +0,0 @@
1
- #ifndef NEEDLE_H
2
- #define NEEDLE_H
3
-
4
- #ifndef NEEDLE_API
5
- #define NEEDLE_API __attribute__((visibility("default")))
6
- #endif
7
-
8
- #define NEEDLE_TEXT 1
9
- #define NEEDLE_SPEECH 2
10
-
11
- #ifdef __cplusplus
12
- extern "C" {
13
- #endif
14
-
15
- /* One process-global, non-thread-safe model per kind, text and speech.
16
- Negative returns indicate failure; call needle_last_error() for the specific
17
- reason. needle_load reads whichever kind the .cact holds and keeps the other,
18
- so a build with both models takes one call per model. */
19
- NEEDLE_API int needle_load(
20
- const unsigned char* cact,
21
- unsigned long long n
22
- );
23
-
24
- /* NEEDLE_TEXT, NEEDLE_SPEECH or both, for the models this process has loaded. */
25
- NEEDLE_API int needle_models(void);
26
-
27
- /* Last process-global error, owned by the runtime and valid until the next API call. */
28
- NEEDLE_API const char* needle_last_error(void);
29
-
30
- /* needle_init returns the tokenized static-prefix length on success. It can fail
31
- when the system prompt plus statically-declared tools exceed the context
32
- window, and reports the measured token count when it does. */
33
- NEEDLE_API int needle_init(
34
- const char* system_prompt,
35
- const char* tools_json,
36
- const char* tool_index_path
37
- );
38
-
39
- /* Answers text or speech: exactly one of input and pcm is non-null. Given pcm,
40
- the engine transcribes the clip with the loaded speech model, answers the
41
- transcript, and merges the speech fields into the same JSON object under an
42
- audio_ prefix. needle_set_audio chooses how that transcription runs. */
43
- NEEDLE_API int needle_complete(
44
- const char* input,
45
- const float* pcm,
46
- int samples,
47
- int max_new_tokens,
48
- char* out,
49
- int out_capacity
50
- );
51
-
52
- /* Language, keywords and word timestamps for the transcription needle_complete
53
- runs for itself, with the meanings they have in needle_transcribe. The
54
- strings are copied. Defaults: detect the language, no keywords, no times. */
55
- NEEDLE_API void needle_set_audio(
56
- const char* language,
57
- const char* keywords,
58
- int word_timestamps
59
- );
60
-
61
- NEEDLE_API void needle_reset(void);
62
-
63
- /* Transcribes 16 kHz mono float PCM in [-1, 1] of any length and returns the
64
- number of tokens in the transcript. Up to 30 s runs as one pass; longer audio
65
- runs as consecutive 30 s windows, each decoded once and cut at its last
66
- sentence end, with word times counted from the start of the clip. language is "en", "de", "fr", "es", "it", "nl" or
67
- "pl", or NULL to detect it. keywords is NULL or newline-separated words and
68
- phrases for keyword biasing. out receives JSON with the transcript, the
69
- language used, the milliseconds to the first token and the decoder's tokens
70
- per second after it; silence and steady noise give an empty text and language:
71
- {"text":"...","language":"en","ttft_ms":0.0,"decode_tps":0.0}
72
- A non-zero word_timestamps adds each word with times in seconds:
73
- "words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}] */
74
- NEEDLE_API int needle_transcribe(
75
- const float* pcm,
76
- int samples,
77
- const char* language,
78
- const char* keywords,
79
- int word_timestamps,
80
- char* out,
81
- int out_capacity
82
- );
83
-
84
- /* Live transcription: appends 16 kHz mono float PCM, about one second at a
85
- time, re-transcribes the buffered audio and commits the words two consecutive
86
- passes agree on; a feed longer than 30 s is taken in one-second pieces. language and keywords are as in
87
- needle_transcribe. out receives the words this call committed, with times in
88
- seconds from the start of the stream, and the unconfirmed tail; returns the
89
- number of words committed:
90
- {"text":"...","words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}],
91
- "pending":"...","language":"en","received":0.00,"pass_ms":0.0} */
92
- NEEDLE_API int needle_stream_transcribe_process(
93
- const float* pcm,
94
- int samples,
95
- const char* language,
96
- const char* keywords,
97
- char* out,
98
- int out_capacity
99
- );
100
-
101
- /* Ends the stream: the tail becomes the committed words of out, and the next
102
- needle_stream_transcribe_process starts a new stream. */
103
- NEEDLE_API int needle_stream_transcribe_stop(
104
- char* out,
105
- int out_capacity
106
- );
107
-
108
- /* Embeds text or speech: exactly one of input and pcm is non-null. Text returns
109
- the model's embedding dimension, speech one row of that width per 80 ms frame,
110
- flattened. A null output returns the float count without computing. */
111
- NEEDLE_API int needle_embed(
112
- const char* input,
113
- const float* pcm,
114
- int samples,
115
- float* out,
116
- int out_capacity
117
- );
118
-
119
- #ifdef __cplusplus
120
- }
121
- #endif
122
- #endif
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
android-armv7/libneedle.a DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:9f559a287b201c213e5c753d3cd1076a1849c73f94b445c85d11e4969422a135
3
- size 1700760
 
 
 
 
android-armv7/needle DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:8de71d0a00538ff3a64c2023f9d27121148295e50d414de284ac86586336127f
3
- size 967396
 
 
 
 
android-armv7/needle.h DELETED
@@ -1,122 +0,0 @@
1
- #ifndef NEEDLE_H
2
- #define NEEDLE_H
3
-
4
- #ifndef NEEDLE_API
5
- #define NEEDLE_API __attribute__((visibility("default")))
6
- #endif
7
-
8
- #define NEEDLE_TEXT 1
9
- #define NEEDLE_SPEECH 2
10
-
11
- #ifdef __cplusplus
12
- extern "C" {
13
- #endif
14
-
15
- /* One process-global, non-thread-safe model per kind, text and speech.
16
- Negative returns indicate failure; call needle_last_error() for the specific
17
- reason. needle_load reads whichever kind the .cact holds and keeps the other,
18
- so a build with both models takes one call per model. */
19
- NEEDLE_API int needle_load(
20
- const unsigned char* cact,
21
- unsigned long long n
22
- );
23
-
24
- /* NEEDLE_TEXT, NEEDLE_SPEECH or both, for the models this process has loaded. */
25
- NEEDLE_API int needle_models(void);
26
-
27
- /* Last process-global error, owned by the runtime and valid until the next API call. */
28
- NEEDLE_API const char* needle_last_error(void);
29
-
30
- /* needle_init returns the tokenized static-prefix length on success. It can fail
31
- when the system prompt plus statically-declared tools exceed the context
32
- window, and reports the measured token count when it does. */
33
- NEEDLE_API int needle_init(
34
- const char* system_prompt,
35
- const char* tools_json,
36
- const char* tool_index_path
37
- );
38
-
39
- /* Answers text or speech: exactly one of input and pcm is non-null. Given pcm,
40
- the engine transcribes the clip with the loaded speech model, answers the
41
- transcript, and merges the speech fields into the same JSON object under an
42
- audio_ prefix. needle_set_audio chooses how that transcription runs. */
43
- NEEDLE_API int needle_complete(
44
- const char* input,
45
- const float* pcm,
46
- int samples,
47
- int max_new_tokens,
48
- char* out,
49
- int out_capacity
50
- );
51
-
52
- /* Language, keywords and word timestamps for the transcription needle_complete
53
- runs for itself, with the meanings they have in needle_transcribe. The
54
- strings are copied. Defaults: detect the language, no keywords, no times. */
55
- NEEDLE_API void needle_set_audio(
56
- const char* language,
57
- const char* keywords,
58
- int word_timestamps
59
- );
60
-
61
- NEEDLE_API void needle_reset(void);
62
-
63
- /* Transcribes 16 kHz mono float PCM in [-1, 1] of any length and returns the
64
- number of tokens in the transcript. Up to 30 s runs as one pass; longer audio
65
- runs as consecutive 30 s windows, each decoded once and cut at its last
66
- sentence end, with word times counted from the start of the clip. language is "en", "de", "fr", "es", "it", "nl" or
67
- "pl", or NULL to detect it. keywords is NULL or newline-separated words and
68
- phrases for keyword biasing. out receives JSON with the transcript, the
69
- language used, the milliseconds to the first token and the decoder's tokens
70
- per second after it; silence and steady noise give an empty text and language:
71
- {"text":"...","language":"en","ttft_ms":0.0,"decode_tps":0.0}
72
- A non-zero word_timestamps adds each word with times in seconds:
73
- "words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}] */
74
- NEEDLE_API int needle_transcribe(
75
- const float* pcm,
76
- int samples,
77
- const char* language,
78
- const char* keywords,
79
- int word_timestamps,
80
- char* out,
81
- int out_capacity
82
- );
83
-
84
- /* Live transcription: appends 16 kHz mono float PCM, about one second at a
85
- time, re-transcribes the buffered audio and commits the words two consecutive
86
- passes agree on; a feed longer than 30 s is taken in one-second pieces. language and keywords are as in
87
- needle_transcribe. out receives the words this call committed, with times in
88
- seconds from the start of the stream, and the unconfirmed tail; returns the
89
- number of words committed:
90
- {"text":"...","words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}],
91
- "pending":"...","language":"en","received":0.00,"pass_ms":0.0} */
92
- NEEDLE_API int needle_stream_transcribe_process(
93
- const float* pcm,
94
- int samples,
95
- const char* language,
96
- const char* keywords,
97
- char* out,
98
- int out_capacity
99
- );
100
-
101
- /* Ends the stream: the tail becomes the committed words of out, and the next
102
- needle_stream_transcribe_process starts a new stream. */
103
- NEEDLE_API int needle_stream_transcribe_stop(
104
- char* out,
105
- int out_capacity
106
- );
107
-
108
- /* Embeds text or speech: exactly one of input and pcm is non-null. Text returns
109
- the model's embedding dimension, speech one row of that width per 80 ms frame,
110
- flattened. A null output returns the float count without computing. */
111
- NEEDLE_API int needle_embed(
112
- const char* input,
113
- const float* pcm,
114
- int samples,
115
- float* out,
116
- int out_capacity
117
- );
118
-
119
- #ifdef __cplusplus
120
- }
121
- #endif
122
- #endif
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
android-riscv64/libneedle.a DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:a8eb2313c04b113b774794cfe0aa5361ecdc6f17bc4930deebbb1b924a891a8e
3
- size 5092414
 
 
 
 
android-riscv64/needle DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:7bdf932bd9eed6c2f49d5b83e6c3061766b49738ddfeb8a88b3d113b318630ab
3
- size 1431792
 
 
 
 
android-riscv64/needle.h DELETED
@@ -1,122 +0,0 @@
1
- #ifndef NEEDLE_H
2
- #define NEEDLE_H
3
-
4
- #ifndef NEEDLE_API
5
- #define NEEDLE_API __attribute__((visibility("default")))
6
- #endif
7
-
8
- #define NEEDLE_TEXT 1
9
- #define NEEDLE_SPEECH 2
10
-
11
- #ifdef __cplusplus
12
- extern "C" {
13
- #endif
14
-
15
- /* One process-global, non-thread-safe model per kind, text and speech.
16
- Negative returns indicate failure; call needle_last_error() for the specific
17
- reason. needle_load reads whichever kind the .cact holds and keeps the other,
18
- so a build with both models takes one call per model. */
19
- NEEDLE_API int needle_load(
20
- const unsigned char* cact,
21
- unsigned long long n
22
- );
23
-
24
- /* NEEDLE_TEXT, NEEDLE_SPEECH or both, for the models this process has loaded. */
25
- NEEDLE_API int needle_models(void);
26
-
27
- /* Last process-global error, owned by the runtime and valid until the next API call. */
28
- NEEDLE_API const char* needle_last_error(void);
29
-
30
- /* needle_init returns the tokenized static-prefix length on success. It can fail
31
- when the system prompt plus statically-declared tools exceed the context
32
- window, and reports the measured token count when it does. */
33
- NEEDLE_API int needle_init(
34
- const char* system_prompt,
35
- const char* tools_json,
36
- const char* tool_index_path
37
- );
38
-
39
- /* Answers text or speech: exactly one of input and pcm is non-null. Given pcm,
40
- the engine transcribes the clip with the loaded speech model, answers the
41
- transcript, and merges the speech fields into the same JSON object under an
42
- audio_ prefix. needle_set_audio chooses how that transcription runs. */
43
- NEEDLE_API int needle_complete(
44
- const char* input,
45
- const float* pcm,
46
- int samples,
47
- int max_new_tokens,
48
- char* out,
49
- int out_capacity
50
- );
51
-
52
- /* Language, keywords and word timestamps for the transcription needle_complete
53
- runs for itself, with the meanings they have in needle_transcribe. The
54
- strings are copied. Defaults: detect the language, no keywords, no times. */
55
- NEEDLE_API void needle_set_audio(
56
- const char* language,
57
- const char* keywords,
58
- int word_timestamps
59
- );
60
-
61
- NEEDLE_API void needle_reset(void);
62
-
63
- /* Transcribes 16 kHz mono float PCM in [-1, 1] of any length and returns the
64
- number of tokens in the transcript. Up to 30 s runs as one pass; longer audio
65
- runs as consecutive 30 s windows, each decoded once and cut at its last
66
- sentence end, with word times counted from the start of the clip. language is "en", "de", "fr", "es", "it", "nl" or
67
- "pl", or NULL to detect it. keywords is NULL or newline-separated words and
68
- phrases for keyword biasing. out receives JSON with the transcript, the
69
- language used, the milliseconds to the first token and the decoder's tokens
70
- per second after it; silence and steady noise give an empty text and language:
71
- {"text":"...","language":"en","ttft_ms":0.0,"decode_tps":0.0}
72
- A non-zero word_timestamps adds each word with times in seconds:
73
- "words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}] */
74
- NEEDLE_API int needle_transcribe(
75
- const float* pcm,
76
- int samples,
77
- const char* language,
78
- const char* keywords,
79
- int word_timestamps,
80
- char* out,
81
- int out_capacity
82
- );
83
-
84
- /* Live transcription: appends 16 kHz mono float PCM, about one second at a
85
- time, re-transcribes the buffered audio and commits the words two consecutive
86
- passes agree on; a feed longer than 30 s is taken in one-second pieces. language and keywords are as in
87
- needle_transcribe. out receives the words this call committed, with times in
88
- seconds from the start of the stream, and the unconfirmed tail; returns the
89
- number of words committed:
90
- {"text":"...","words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}],
91
- "pending":"...","language":"en","received":0.00,"pass_ms":0.0} */
92
- NEEDLE_API int needle_stream_transcribe_process(
93
- const float* pcm,
94
- int samples,
95
- const char* language,
96
- const char* keywords,
97
- char* out,
98
- int out_capacity
99
- );
100
-
101
- /* Ends the stream: the tail becomes the committed words of out, and the next
102
- needle_stream_transcribe_process starts a new stream. */
103
- NEEDLE_API int needle_stream_transcribe_stop(
104
- char* out,
105
- int out_capacity
106
- );
107
-
108
- /* Embeds text or speech: exactly one of input and pcm is non-null. Text returns
109
- the model's embedding dimension, speech one row of that width per 80 ms frame,
110
- flattened. A null output returns the float count without computing. */
111
- NEEDLE_API int needle_embed(
112
- const char* input,
113
- const float* pcm,
114
- int samples,
115
- float* out,
116
- int out_capacity
117
- );
118
-
119
- #ifdef __cplusplus
120
- }
121
- #endif
122
- #endif
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ios-arm64/libneedle.a DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:3e931f1d52319c1396901f3a16244ea47776d18acbf28543b62da408de45158a
3
- size 1501688
 
 
 
 
ios-arm64/needle.h DELETED
@@ -1,122 +0,0 @@
1
- #ifndef NEEDLE_H
2
- #define NEEDLE_H
3
-
4
- #ifndef NEEDLE_API
5
- #define NEEDLE_API __attribute__((visibility("default")))
6
- #endif
7
-
8
- #define NEEDLE_TEXT 1
9
- #define NEEDLE_SPEECH 2
10
-
11
- #ifdef __cplusplus
12
- extern "C" {
13
- #endif
14
-
15
- /* One process-global, non-thread-safe model per kind, text and speech.
16
- Negative returns indicate failure; call needle_last_error() for the specific
17
- reason. needle_load reads whichever kind the .cact holds and keeps the other,
18
- so a build with both models takes one call per model. */
19
- NEEDLE_API int needle_load(
20
- const unsigned char* cact,
21
- unsigned long long n
22
- );
23
-
24
- /* NEEDLE_TEXT, NEEDLE_SPEECH or both, for the models this process has loaded. */
25
- NEEDLE_API int needle_models(void);
26
-
27
- /* Last process-global error, owned by the runtime and valid until the next API call. */
28
- NEEDLE_API const char* needle_last_error(void);
29
-
30
- /* needle_init returns the tokenized static-prefix length on success. It can fail
31
- when the system prompt plus statically-declared tools exceed the context
32
- window, and reports the measured token count when it does. */
33
- NEEDLE_API int needle_init(
34
- const char* system_prompt,
35
- const char* tools_json,
36
- const char* tool_index_path
37
- );
38
-
39
- /* Answers text or speech: exactly one of input and pcm is non-null. Given pcm,
40
- the engine transcribes the clip with the loaded speech model, answers the
41
- transcript, and merges the speech fields into the same JSON object under an
42
- audio_ prefix. needle_set_audio chooses how that transcription runs. */
43
- NEEDLE_API int needle_complete(
44
- const char* input,
45
- const float* pcm,
46
- int samples,
47
- int max_new_tokens,
48
- char* out,
49
- int out_capacity
50
- );
51
-
52
- /* Language, keywords and word timestamps for the transcription needle_complete
53
- runs for itself, with the meanings they have in needle_transcribe. The
54
- strings are copied. Defaults: detect the language, no keywords, no times. */
55
- NEEDLE_API void needle_set_audio(
56
- const char* language,
57
- const char* keywords,
58
- int word_timestamps
59
- );
60
-
61
- NEEDLE_API void needle_reset(void);
62
-
63
- /* Transcribes 16 kHz mono float PCM in [-1, 1] of any length and returns the
64
- number of tokens in the transcript. Up to 30 s runs as one pass; longer audio
65
- runs as consecutive 30 s windows, each decoded once and cut at its last
66
- sentence end, with word times counted from the start of the clip. language is "en", "de", "fr", "es", "it", "nl" or
67
- "pl", or NULL to detect it. keywords is NULL or newline-separated words and
68
- phrases for keyword biasing. out receives JSON with the transcript, the
69
- language used, the milliseconds to the first token and the decoder's tokens
70
- per second after it; silence and steady noise give an empty text and language:
71
- {"text":"...","language":"en","ttft_ms":0.0,"decode_tps":0.0}
72
- A non-zero word_timestamps adds each word with times in seconds:
73
- "words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}] */
74
- NEEDLE_API int needle_transcribe(
75
- const float* pcm,
76
- int samples,
77
- const char* language,
78
- const char* keywords,
79
- int word_timestamps,
80
- char* out,
81
- int out_capacity
82
- );
83
-
84
- /* Live transcription: appends 16 kHz mono float PCM, about one second at a
85
- time, re-transcribes the buffered audio and commits the words two consecutive
86
- passes agree on; a feed longer than 30 s is taken in one-second pieces. language and keywords are as in
87
- needle_transcribe. out receives the words this call committed, with times in
88
- seconds from the start of the stream, and the unconfirmed tail; returns the
89
- number of words committed:
90
- {"text":"...","words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}],
91
- "pending":"...","language":"en","received":0.00,"pass_ms":0.0} */
92
- NEEDLE_API int needle_stream_transcribe_process(
93
- const float* pcm,
94
- int samples,
95
- const char* language,
96
- const char* keywords,
97
- char* out,
98
- int out_capacity
99
- );
100
-
101
- /* Ends the stream: the tail becomes the committed words of out, and the next
102
- needle_stream_transcribe_process starts a new stream. */
103
- NEEDLE_API int needle_stream_transcribe_stop(
104
- char* out,
105
- int out_capacity
106
- );
107
-
108
- /* Embeds text or speech: exactly one of input and pcm is non-null. Text returns
109
- the model's embedding dimension, speech one row of that width per 80 ms frame,
110
- flattened. A null output returns the float count without computing. */
111
- NEEDLE_API int needle_embed(
112
- const char* input,
113
- const float* pcm,
114
- int samples,
115
- float* out,
116
- int out_capacity
117
- );
118
-
119
- #ifdef __cplusplus
120
- }
121
- #endif
122
- #endif
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ios-sim-arm64/libneedle.a DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:75f836ada53fc55cd27a30e0edaea8bf5dcbcca6e30c9f0202fa192db20cea80
3
- size 1535472
 
 
 
 
ios-sim-arm64/needle.h DELETED
@@ -1,122 +0,0 @@
1
- #ifndef NEEDLE_H
2
- #define NEEDLE_H
3
-
4
- #ifndef NEEDLE_API
5
- #define NEEDLE_API __attribute__((visibility("default")))
6
- #endif
7
-
8
- #define NEEDLE_TEXT 1
9
- #define NEEDLE_SPEECH 2
10
-
11
- #ifdef __cplusplus
12
- extern "C" {
13
- #endif
14
-
15
- /* One process-global, non-thread-safe model per kind, text and speech.
16
- Negative returns indicate failure; call needle_last_error() for the specific
17
- reason. needle_load reads whichever kind the .cact holds and keeps the other,
18
- so a build with both models takes one call per model. */
19
- NEEDLE_API int needle_load(
20
- const unsigned char* cact,
21
- unsigned long long n
22
- );
23
-
24
- /* NEEDLE_TEXT, NEEDLE_SPEECH or both, for the models this process has loaded. */
25
- NEEDLE_API int needle_models(void);
26
-
27
- /* Last process-global error, owned by the runtime and valid until the next API call. */
28
- NEEDLE_API const char* needle_last_error(void);
29
-
30
- /* needle_init returns the tokenized static-prefix length on success. It can fail
31
- when the system prompt plus statically-declared tools exceed the context
32
- window, and reports the measured token count when it does. */
33
- NEEDLE_API int needle_init(
34
- const char* system_prompt,
35
- const char* tools_json,
36
- const char* tool_index_path
37
- );
38
-
39
- /* Answers text or speech: exactly one of input and pcm is non-null. Given pcm,
40
- the engine transcribes the clip with the loaded speech model, answers the
41
- transcript, and merges the speech fields into the same JSON object under an
42
- audio_ prefix. needle_set_audio chooses how that transcription runs. */
43
- NEEDLE_API int needle_complete(
44
- const char* input,
45
- const float* pcm,
46
- int samples,
47
- int max_new_tokens,
48
- char* out,
49
- int out_capacity
50
- );
51
-
52
- /* Language, keywords and word timestamps for the transcription needle_complete
53
- runs for itself, with the meanings they have in needle_transcribe. The
54
- strings are copied. Defaults: detect the language, no keywords, no times. */
55
- NEEDLE_API void needle_set_audio(
56
- const char* language,
57
- const char* keywords,
58
- int word_timestamps
59
- );
60
-
61
- NEEDLE_API void needle_reset(void);
62
-
63
- /* Transcribes 16 kHz mono float PCM in [-1, 1] of any length and returns the
64
- number of tokens in the transcript. Up to 30 s runs as one pass; longer audio
65
- runs as consecutive 30 s windows, each decoded once and cut at its last
66
- sentence end, with word times counted from the start of the clip. language is "en", "de", "fr", "es", "it", "nl" or
67
- "pl", or NULL to detect it. keywords is NULL or newline-separated words and
68
- phrases for keyword biasing. out receives JSON with the transcript, the
69
- language used, the milliseconds to the first token and the decoder's tokens
70
- per second after it; silence and steady noise give an empty text and language:
71
- {"text":"...","language":"en","ttft_ms":0.0,"decode_tps":0.0}
72
- A non-zero word_timestamps adds each word with times in seconds:
73
- "words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}] */
74
- NEEDLE_API int needle_transcribe(
75
- const float* pcm,
76
- int samples,
77
- const char* language,
78
- const char* keywords,
79
- int word_timestamps,
80
- char* out,
81
- int out_capacity
82
- );
83
-
84
- /* Live transcription: appends 16 kHz mono float PCM, about one second at a
85
- time, re-transcribes the buffered audio and commits the words two consecutive
86
- passes agree on; a feed longer than 30 s is taken in one-second pieces. language and keywords are as in
87
- needle_transcribe. out receives the words this call committed, with times in
88
- seconds from the start of the stream, and the unconfirmed tail; returns the
89
- number of words committed:
90
- {"text":"...","words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}],
91
- "pending":"...","language":"en","received":0.00,"pass_ms":0.0} */
92
- NEEDLE_API int needle_stream_transcribe_process(
93
- const float* pcm,
94
- int samples,
95
- const char* language,
96
- const char* keywords,
97
- char* out,
98
- int out_capacity
99
- );
100
-
101
- /* Ends the stream: the tail becomes the committed words of out, and the next
102
- needle_stream_transcribe_process starts a new stream. */
103
- NEEDLE_API int needle_stream_transcribe_stop(
104
- char* out,
105
- int out_capacity
106
- );
107
-
108
- /* Embeds text or speech: exactly one of input and pcm is non-null. Text returns
109
- the model's embedding dimension, speech one row of that width per 80 ms frame,
110
- flattened. A null output returns the float count without computing. */
111
- NEEDLE_API int needle_embed(
112
- const char* input,
113
- const float* pcm,
114
- int samples,
115
- float* out,
116
- int out_capacity
117
- );
118
-
119
- #ifdef __cplusplus
120
- }
121
- #endif
122
- #endif
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
linux-arm64/libneedle.a DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:d54f0d83963c56eb79181929827c9f9ff405891d50cd12974c2b0f6485dd07af
3
- size 2024824
 
 
 
 
linux-arm64/needle DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:a7dd07f740763507edbca760dc7e7065b6da6b6bd6c3a05288ca974f14ce0fcb
3
- size 1439720
 
 
 
 
linux-arm64/needle.h DELETED
@@ -1,122 +0,0 @@
1
- #ifndef NEEDLE_H
2
- #define NEEDLE_H
3
-
4
- #ifndef NEEDLE_API
5
- #define NEEDLE_API __attribute__((visibility("default")))
6
- #endif
7
-
8
- #define NEEDLE_TEXT 1
9
- #define NEEDLE_SPEECH 2
10
-
11
- #ifdef __cplusplus
12
- extern "C" {
13
- #endif
14
-
15
- /* One process-global, non-thread-safe model per kind, text and speech.
16
- Negative returns indicate failure; call needle_last_error() for the specific
17
- reason. needle_load reads whichever kind the .cact holds and keeps the other,
18
- so a build with both models takes one call per model. */
19
- NEEDLE_API int needle_load(
20
- const unsigned char* cact,
21
- unsigned long long n
22
- );
23
-
24
- /* NEEDLE_TEXT, NEEDLE_SPEECH or both, for the models this process has loaded. */
25
- NEEDLE_API int needle_models(void);
26
-
27
- /* Last process-global error, owned by the runtime and valid until the next API call. */
28
- NEEDLE_API const char* needle_last_error(void);
29
-
30
- /* needle_init returns the tokenized static-prefix length on success. It can fail
31
- when the system prompt plus statically-declared tools exceed the context
32
- window, and reports the measured token count when it does. */
33
- NEEDLE_API int needle_init(
34
- const char* system_prompt,
35
- const char* tools_json,
36
- const char* tool_index_path
37
- );
38
-
39
- /* Answers text or speech: exactly one of input and pcm is non-null. Given pcm,
40
- the engine transcribes the clip with the loaded speech model, answers the
41
- transcript, and merges the speech fields into the same JSON object under an
42
- audio_ prefix. needle_set_audio chooses how that transcription runs. */
43
- NEEDLE_API int needle_complete(
44
- const char* input,
45
- const float* pcm,
46
- int samples,
47
- int max_new_tokens,
48
- char* out,
49
- int out_capacity
50
- );
51
-
52
- /* Language, keywords and word timestamps for the transcription needle_complete
53
- runs for itself, with the meanings they have in needle_transcribe. The
54
- strings are copied. Defaults: detect the language, no keywords, no times. */
55
- NEEDLE_API void needle_set_audio(
56
- const char* language,
57
- const char* keywords,
58
- int word_timestamps
59
- );
60
-
61
- NEEDLE_API void needle_reset(void);
62
-
63
- /* Transcribes 16 kHz mono float PCM in [-1, 1] of any length and returns the
64
- number of tokens in the transcript. Up to 30 s runs as one pass; longer audio
65
- runs as consecutive 30 s windows, each decoded once and cut at its last
66
- sentence end, with word times counted from the start of the clip. language is "en", "de", "fr", "es", "it", "nl" or
67
- "pl", or NULL to detect it. keywords is NULL or newline-separated words and
68
- phrases for keyword biasing. out receives JSON with the transcript, the
69
- language used, the milliseconds to the first token and the decoder's tokens
70
- per second after it; silence and steady noise give an empty text and language:
71
- {"text":"...","language":"en","ttft_ms":0.0,"decode_tps":0.0}
72
- A non-zero word_timestamps adds each word with times in seconds:
73
- "words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}] */
74
- NEEDLE_API int needle_transcribe(
75
- const float* pcm,
76
- int samples,
77
- const char* language,
78
- const char* keywords,
79
- int word_timestamps,
80
- char* out,
81
- int out_capacity
82
- );
83
-
84
- /* Live transcription: appends 16 kHz mono float PCM, about one second at a
85
- time, re-transcribes the buffered audio and commits the words two consecutive
86
- passes agree on; a feed longer than 30 s is taken in one-second pieces. language and keywords are as in
87
- needle_transcribe. out receives the words this call committed, with times in
88
- seconds from the start of the stream, and the unconfirmed tail; returns the
89
- number of words committed:
90
- {"text":"...","words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}],
91
- "pending":"...","language":"en","received":0.00,"pass_ms":0.0} */
92
- NEEDLE_API int needle_stream_transcribe_process(
93
- const float* pcm,
94
- int samples,
95
- const char* language,
96
- const char* keywords,
97
- char* out,
98
- int out_capacity
99
- );
100
-
101
- /* Ends the stream: the tail becomes the committed words of out, and the next
102
- needle_stream_transcribe_process starts a new stream. */
103
- NEEDLE_API int needle_stream_transcribe_stop(
104
- char* out,
105
- int out_capacity
106
- );
107
-
108
- /* Embeds text or speech: exactly one of input and pcm is non-null. Text returns
109
- the model's embedding dimension, speech one row of that width per 80 ms frame,
110
- flattened. A null output returns the float count without computing. */
111
- NEEDLE_API int needle_embed(
112
- const char* input,
113
- const float* pcm,
114
- int samples,
115
- float* out,
116
- int out_capacity
117
- );
118
-
119
- #ifdef __cplusplus
120
- }
121
- #endif
122
- #endif
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
linux-armv7/libneedle.a DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:972ce9802664307b681ef39dd86e0aa0164b4c3380d195476fe9e954b7804130
3
- size 1783478
 
 
 
 
linux-armv7/needle DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:1200e2b2d5005f969c30f321df72f0eff24b51a2862059b666da3f2dfef9ad2f
3
- size 1247772
 
 
 
 
linux-armv7/needle.h DELETED
@@ -1,122 +0,0 @@
1
- #ifndef NEEDLE_H
2
- #define NEEDLE_H
3
-
4
- #ifndef NEEDLE_API
5
- #define NEEDLE_API __attribute__((visibility("default")))
6
- #endif
7
-
8
- #define NEEDLE_TEXT 1
9
- #define NEEDLE_SPEECH 2
10
-
11
- #ifdef __cplusplus
12
- extern "C" {
13
- #endif
14
-
15
- /* One process-global, non-thread-safe model per kind, text and speech.
16
- Negative returns indicate failure; call needle_last_error() for the specific
17
- reason. needle_load reads whichever kind the .cact holds and keeps the other,
18
- so a build with both models takes one call per model. */
19
- NEEDLE_API int needle_load(
20
- const unsigned char* cact,
21
- unsigned long long n
22
- );
23
-
24
- /* NEEDLE_TEXT, NEEDLE_SPEECH or both, for the models this process has loaded. */
25
- NEEDLE_API int needle_models(void);
26
-
27
- /* Last process-global error, owned by the runtime and valid until the next API call. */
28
- NEEDLE_API const char* needle_last_error(void);
29
-
30
- /* needle_init returns the tokenized static-prefix length on success. It can fail
31
- when the system prompt plus statically-declared tools exceed the context
32
- window, and reports the measured token count when it does. */
33
- NEEDLE_API int needle_init(
34
- const char* system_prompt,
35
- const char* tools_json,
36
- const char* tool_index_path
37
- );
38
-
39
- /* Answers text or speech: exactly one of input and pcm is non-null. Given pcm,
40
- the engine transcribes the clip with the loaded speech model, answers the
41
- transcript, and merges the speech fields into the same JSON object under an
42
- audio_ prefix. needle_set_audio chooses how that transcription runs. */
43
- NEEDLE_API int needle_complete(
44
- const char* input,
45
- const float* pcm,
46
- int samples,
47
- int max_new_tokens,
48
- char* out,
49
- int out_capacity
50
- );
51
-
52
- /* Language, keywords and word timestamps for the transcription needle_complete
53
- runs for itself, with the meanings they have in needle_transcribe. The
54
- strings are copied. Defaults: detect the language, no keywords, no times. */
55
- NEEDLE_API void needle_set_audio(
56
- const char* language,
57
- const char* keywords,
58
- int word_timestamps
59
- );
60
-
61
- NEEDLE_API void needle_reset(void);
62
-
63
- /* Transcribes 16 kHz mono float PCM in [-1, 1] of any length and returns the
64
- number of tokens in the transcript. Up to 30 s runs as one pass; longer audio
65
- runs as consecutive 30 s windows, each decoded once and cut at its last
66
- sentence end, with word times counted from the start of the clip. language is "en", "de", "fr", "es", "it", "nl" or
67
- "pl", or NULL to detect it. keywords is NULL or newline-separated words and
68
- phrases for keyword biasing. out receives JSON with the transcript, the
69
- language used, the milliseconds to the first token and the decoder's tokens
70
- per second after it; silence and steady noise give an empty text and language:
71
- {"text":"...","language":"en","ttft_ms":0.0,"decode_tps":0.0}
72
- A non-zero word_timestamps adds each word with times in seconds:
73
- "words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}] */
74
- NEEDLE_API int needle_transcribe(
75
- const float* pcm,
76
- int samples,
77
- const char* language,
78
- const char* keywords,
79
- int word_timestamps,
80
- char* out,
81
- int out_capacity
82
- );
83
-
84
- /* Live transcription: appends 16 kHz mono float PCM, about one second at a
85
- time, re-transcribes the buffered audio and commits the words two consecutive
86
- passes agree on; a feed longer than 30 s is taken in one-second pieces. language and keywords are as in
87
- needle_transcribe. out receives the words this call committed, with times in
88
- seconds from the start of the stream, and the unconfirmed tail; returns the
89
- number of words committed:
90
- {"text":"...","words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}],
91
- "pending":"...","language":"en","received":0.00,"pass_ms":0.0} */
92
- NEEDLE_API int needle_stream_transcribe_process(
93
- const float* pcm,
94
- int samples,
95
- const char* language,
96
- const char* keywords,
97
- char* out,
98
- int out_capacity
99
- );
100
-
101
- /* Ends the stream: the tail becomes the committed words of out, and the next
102
- needle_stream_transcribe_process starts a new stream. */
103
- NEEDLE_API int needle_stream_transcribe_stop(
104
- char* out,
105
- int out_capacity
106
- );
107
-
108
- /* Embeds text or speech: exactly one of input and pcm is non-null. Text returns
109
- the model's embedding dimension, speech one row of that width per 80 ms frame,
110
- flattened. A null output returns the float count without computing. */
111
- NEEDLE_API int needle_embed(
112
- const char* input,
113
- const float* pcm,
114
- int samples,
115
- float* out,
116
- int out_capacity
117
- );
118
-
119
- #ifdef __cplusplus
120
- }
121
- #endif
122
- #endif
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
linux-mipsel/libneedle.a DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:6f071b386e187b3b4905274f67e026d3ccecc3e2bebf7d49bd4d31616e593d6a
3
- size 1689382
 
 
 
 
linux-mipsel/needle DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:b3d6abd16a1ba41870c1e4a1134cf4ffc0060eb66e9181e180882008063fe549
3
- size 1745296
 
 
 
 
linux-mipsel/needle.h DELETED
@@ -1,122 +0,0 @@
1
- #ifndef NEEDLE_H
2
- #define NEEDLE_H
3
-
4
- #ifndef NEEDLE_API
5
- #define NEEDLE_API __attribute__((visibility("default")))
6
- #endif
7
-
8
- #define NEEDLE_TEXT 1
9
- #define NEEDLE_SPEECH 2
10
-
11
- #ifdef __cplusplus
12
- extern "C" {
13
- #endif
14
-
15
- /* One process-global, non-thread-safe model per kind, text and speech.
16
- Negative returns indicate failure; call needle_last_error() for the specific
17
- reason. needle_load reads whichever kind the .cact holds and keeps the other,
18
- so a build with both models takes one call per model. */
19
- NEEDLE_API int needle_load(
20
- const unsigned char* cact,
21
- unsigned long long n
22
- );
23
-
24
- /* NEEDLE_TEXT, NEEDLE_SPEECH or both, for the models this process has loaded. */
25
- NEEDLE_API int needle_models(void);
26
-
27
- /* Last process-global error, owned by the runtime and valid until the next API call. */
28
- NEEDLE_API const char* needle_last_error(void);
29
-
30
- /* needle_init returns the tokenized static-prefix length on success. It can fail
31
- when the system prompt plus statically-declared tools exceed the context
32
- window, and reports the measured token count when it does. */
33
- NEEDLE_API int needle_init(
34
- const char* system_prompt,
35
- const char* tools_json,
36
- const char* tool_index_path
37
- );
38
-
39
- /* Answers text or speech: exactly one of input and pcm is non-null. Given pcm,
40
- the engine transcribes the clip with the loaded speech model, answers the
41
- transcript, and merges the speech fields into the same JSON object under an
42
- audio_ prefix. needle_set_audio chooses how that transcription runs. */
43
- NEEDLE_API int needle_complete(
44
- const char* input,
45
- const float* pcm,
46
- int samples,
47
- int max_new_tokens,
48
- char* out,
49
- int out_capacity
50
- );
51
-
52
- /* Language, keywords and word timestamps for the transcription needle_complete
53
- runs for itself, with the meanings they have in needle_transcribe. The
54
- strings are copied. Defaults: detect the language, no keywords, no times. */
55
- NEEDLE_API void needle_set_audio(
56
- const char* language,
57
- const char* keywords,
58
- int word_timestamps
59
- );
60
-
61
- NEEDLE_API void needle_reset(void);
62
-
63
- /* Transcribes 16 kHz mono float PCM in [-1, 1] of any length and returns the
64
- number of tokens in the transcript. Up to 30 s runs as one pass; longer audio
65
- runs as consecutive 30 s windows, each decoded once and cut at its last
66
- sentence end, with word times counted from the start of the clip. language is "en", "de", "fr", "es", "it", "nl" or
67
- "pl", or NULL to detect it. keywords is NULL or newline-separated words and
68
- phrases for keyword biasing. out receives JSON with the transcript, the
69
- language used, the milliseconds to the first token and the decoder's tokens
70
- per second after it; silence and steady noise give an empty text and language:
71
- {"text":"...","language":"en","ttft_ms":0.0,"decode_tps":0.0}
72
- A non-zero word_timestamps adds each word with times in seconds:
73
- "words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}] */
74
- NEEDLE_API int needle_transcribe(
75
- const float* pcm,
76
- int samples,
77
- const char* language,
78
- const char* keywords,
79
- int word_timestamps,
80
- char* out,
81
- int out_capacity
82
- );
83
-
84
- /* Live transcription: appends 16 kHz mono float PCM, about one second at a
85
- time, re-transcribes the buffered audio and commits the words two consecutive
86
- passes agree on; a feed longer than 30 s is taken in one-second pieces. language and keywords are as in
87
- needle_transcribe. out receives the words this call committed, with times in
88
- seconds from the start of the stream, and the unconfirmed tail; returns the
89
- number of words committed:
90
- {"text":"...","words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}],
91
- "pending":"...","language":"en","received":0.00,"pass_ms":0.0} */
92
- NEEDLE_API int needle_stream_transcribe_process(
93
- const float* pcm,
94
- int samples,
95
- const char* language,
96
- const char* keywords,
97
- char* out,
98
- int out_capacity
99
- );
100
-
101
- /* Ends the stream: the tail becomes the committed words of out, and the next
102
- needle_stream_transcribe_process starts a new stream. */
103
- NEEDLE_API int needle_stream_transcribe_stop(
104
- char* out,
105
- int out_capacity
106
- );
107
-
108
- /* Embeds text or speech: exactly one of input and pcm is non-null. Text returns
109
- the model's embedding dimension, speech one row of that width per 80 ms frame,
110
- flattened. A null output returns the float count without computing. */
111
- NEEDLE_API int needle_embed(
112
- const char* input,
113
- const float* pcm,
114
- int samples,
115
- float* out,
116
- int out_capacity
117
- );
118
-
119
- #ifdef __cplusplus
120
- }
121
- #endif
122
- #endif
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
linux-riscv64/libneedle.a DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:e0bb8e19fae59b0f969c5fad999a020817f8d2081773329c9651f7701f9e4dfa
3
- size 1939344
 
 
 
 
linux-riscv64/needle DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:c87d816358cefbd12a2dd33ea8cc0767a9b361a1a1ed138eaf3006ed3845d5b2
3
- size 1186320
 
 
 
 
linux-riscv64/needle.h DELETED
@@ -1,122 +0,0 @@
1
- #ifndef NEEDLE_H
2
- #define NEEDLE_H
3
-
4
- #ifndef NEEDLE_API
5
- #define NEEDLE_API __attribute__((visibility("default")))
6
- #endif
7
-
8
- #define NEEDLE_TEXT 1
9
- #define NEEDLE_SPEECH 2
10
-
11
- #ifdef __cplusplus
12
- extern "C" {
13
- #endif
14
-
15
- /* One process-global, non-thread-safe model per kind, text and speech.
16
- Negative returns indicate failure; call needle_last_error() for the specific
17
- reason. needle_load reads whichever kind the .cact holds and keeps the other,
18
- so a build with both models takes one call per model. */
19
- NEEDLE_API int needle_load(
20
- const unsigned char* cact,
21
- unsigned long long n
22
- );
23
-
24
- /* NEEDLE_TEXT, NEEDLE_SPEECH or both, for the models this process has loaded. */
25
- NEEDLE_API int needle_models(void);
26
-
27
- /* Last process-global error, owned by the runtime and valid until the next API call. */
28
- NEEDLE_API const char* needle_last_error(void);
29
-
30
- /* needle_init returns the tokenized static-prefix length on success. It can fail
31
- when the system prompt plus statically-declared tools exceed the context
32
- window, and reports the measured token count when it does. */
33
- NEEDLE_API int needle_init(
34
- const char* system_prompt,
35
- const char* tools_json,
36
- const char* tool_index_path
37
- );
38
-
39
- /* Answers text or speech: exactly one of input and pcm is non-null. Given pcm,
40
- the engine transcribes the clip with the loaded speech model, answers the
41
- transcript, and merges the speech fields into the same JSON object under an
42
- audio_ prefix. needle_set_audio chooses how that transcription runs. */
43
- NEEDLE_API int needle_complete(
44
- const char* input,
45
- const float* pcm,
46
- int samples,
47
- int max_new_tokens,
48
- char* out,
49
- int out_capacity
50
- );
51
-
52
- /* Language, keywords and word timestamps for the transcription needle_complete
53
- runs for itself, with the meanings they have in needle_transcribe. The
54
- strings are copied. Defaults: detect the language, no keywords, no times. */
55
- NEEDLE_API void needle_set_audio(
56
- const char* language,
57
- const char* keywords,
58
- int word_timestamps
59
- );
60
-
61
- NEEDLE_API void needle_reset(void);
62
-
63
- /* Transcribes 16 kHz mono float PCM in [-1, 1] of any length and returns the
64
- number of tokens in the transcript. Up to 30 s runs as one pass; longer audio
65
- runs as consecutive 30 s windows, each decoded once and cut at its last
66
- sentence end, with word times counted from the start of the clip. language is "en", "de", "fr", "es", "it", "nl" or
67
- "pl", or NULL to detect it. keywords is NULL or newline-separated words and
68
- phrases for keyword biasing. out receives JSON with the transcript, the
69
- language used, the milliseconds to the first token and the decoder's tokens
70
- per second after it; silence and steady noise give an empty text and language:
71
- {"text":"...","language":"en","ttft_ms":0.0,"decode_tps":0.0}
72
- A non-zero word_timestamps adds each word with times in seconds:
73
- "words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}] */
74
- NEEDLE_API int needle_transcribe(
75
- const float* pcm,
76
- int samples,
77
- const char* language,
78
- const char* keywords,
79
- int word_timestamps,
80
- char* out,
81
- int out_capacity
82
- );
83
-
84
- /* Live transcription: appends 16 kHz mono float PCM, about one second at a
85
- time, re-transcribes the buffered audio and commits the words two consecutive
86
- passes agree on; a feed longer than 30 s is taken in one-second pieces. language and keywords are as in
87
- needle_transcribe. out receives the words this call committed, with times in
88
- seconds from the start of the stream, and the unconfirmed tail; returns the
89
- number of words committed:
90
- {"text":"...","words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}],
91
- "pending":"...","language":"en","received":0.00,"pass_ms":0.0} */
92
- NEEDLE_API int needle_stream_transcribe_process(
93
- const float* pcm,
94
- int samples,
95
- const char* language,
96
- const char* keywords,
97
- char* out,
98
- int out_capacity
99
- );
100
-
101
- /* Ends the stream: the tail becomes the committed words of out, and the next
102
- needle_stream_transcribe_process starts a new stream. */
103
- NEEDLE_API int needle_stream_transcribe_stop(
104
- char* out,
105
- int out_capacity
106
- );
107
-
108
- /* Embeds text or speech: exactly one of input and pcm is non-null. Text returns
109
- the model's embedding dimension, speech one row of that width per 80 ms frame,
110
- flattened. A null output returns the float count without computing. */
111
- NEEDLE_API int needle_embed(
112
- const char* input,
113
- const float* pcm,
114
- int samples,
115
- float* out,
116
- int out_capacity
117
- );
118
-
119
- #ifdef __cplusplus
120
- }
121
- #endif
122
- #endif
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
linux-x86_64/libneedle.a DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:2f281877e24fed2658187a32d9a26e74c32d4f273ac9a2b36180b3a6e85942da
3
- size 2204068
 
 
 
 
linux-x86_64/needle DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:77cd35ee75c53df8532b397e11ed7cf94a45d89a9f14f50881fd9c68ba54a2d0
3
- size 1550176
 
 
 
 
linux-x86_64/needle.h DELETED
@@ -1,122 +0,0 @@
1
- #ifndef NEEDLE_H
2
- #define NEEDLE_H
3
-
4
- #ifndef NEEDLE_API
5
- #define NEEDLE_API __attribute__((visibility("default")))
6
- #endif
7
-
8
- #define NEEDLE_TEXT 1
9
- #define NEEDLE_SPEECH 2
10
-
11
- #ifdef __cplusplus
12
- extern "C" {
13
- #endif
14
-
15
- /* One process-global, non-thread-safe model per kind, text and speech.
16
- Negative returns indicate failure; call needle_last_error() for the specific
17
- reason. needle_load reads whichever kind the .cact holds and keeps the other,
18
- so a build with both models takes one call per model. */
19
- NEEDLE_API int needle_load(
20
- const unsigned char* cact,
21
- unsigned long long n
22
- );
23
-
24
- /* NEEDLE_TEXT, NEEDLE_SPEECH or both, for the models this process has loaded. */
25
- NEEDLE_API int needle_models(void);
26
-
27
- /* Last process-global error, owned by the runtime and valid until the next API call. */
28
- NEEDLE_API const char* needle_last_error(void);
29
-
30
- /* needle_init returns the tokenized static-prefix length on success. It can fail
31
- when the system prompt plus statically-declared tools exceed the context
32
- window, and reports the measured token count when it does. */
33
- NEEDLE_API int needle_init(
34
- const char* system_prompt,
35
- const char* tools_json,
36
- const char* tool_index_path
37
- );
38
-
39
- /* Answers text or speech: exactly one of input and pcm is non-null. Given pcm,
40
- the engine transcribes the clip with the loaded speech model, answers the
41
- transcript, and merges the speech fields into the same JSON object under an
42
- audio_ prefix. needle_set_audio chooses how that transcription runs. */
43
- NEEDLE_API int needle_complete(
44
- const char* input,
45
- const float* pcm,
46
- int samples,
47
- int max_new_tokens,
48
- char* out,
49
- int out_capacity
50
- );
51
-
52
- /* Language, keywords and word timestamps for the transcription needle_complete
53
- runs for itself, with the meanings they have in needle_transcribe. The
54
- strings are copied. Defaults: detect the language, no keywords, no times. */
55
- NEEDLE_API void needle_set_audio(
56
- const char* language,
57
- const char* keywords,
58
- int word_timestamps
59
- );
60
-
61
- NEEDLE_API void needle_reset(void);
62
-
63
- /* Transcribes 16 kHz mono float PCM in [-1, 1] of any length and returns the
64
- number of tokens in the transcript. Up to 30 s runs as one pass; longer audio
65
- runs as consecutive 30 s windows, each decoded once and cut at its last
66
- sentence end, with word times counted from the start of the clip. language is "en", "de", "fr", "es", "it", "nl" or
67
- "pl", or NULL to detect it. keywords is NULL or newline-separated words and
68
- phrases for keyword biasing. out receives JSON with the transcript, the
69
- language used, the milliseconds to the first token and the decoder's tokens
70
- per second after it; silence and steady noise give an empty text and language:
71
- {"text":"...","language":"en","ttft_ms":0.0,"decode_tps":0.0}
72
- A non-zero word_timestamps adds each word with times in seconds:
73
- "words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}] */
74
- NEEDLE_API int needle_transcribe(
75
- const float* pcm,
76
- int samples,
77
- const char* language,
78
- const char* keywords,
79
- int word_timestamps,
80
- char* out,
81
- int out_capacity
82
- );
83
-
84
- /* Live transcription: appends 16 kHz mono float PCM, about one second at a
85
- time, re-transcribes the buffered audio and commits the words two consecutive
86
- passes agree on; a feed longer than 30 s is taken in one-second pieces. language and keywords are as in
87
- needle_transcribe. out receives the words this call committed, with times in
88
- seconds from the start of the stream, and the unconfirmed tail; returns the
89
- number of words committed:
90
- {"text":"...","words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}],
91
- "pending":"...","language":"en","received":0.00,"pass_ms":0.0} */
92
- NEEDLE_API int needle_stream_transcribe_process(
93
- const float* pcm,
94
- int samples,
95
- const char* language,
96
- const char* keywords,
97
- char* out,
98
- int out_capacity
99
- );
100
-
101
- /* Ends the stream: the tail becomes the committed words of out, and the next
102
- needle_stream_transcribe_process starts a new stream. */
103
- NEEDLE_API int needle_stream_transcribe_stop(
104
- char* out,
105
- int out_capacity
106
- );
107
-
108
- /* Embeds text or speech: exactly one of input and pcm is non-null. Text returns
109
- the model's embedding dimension, speech one row of that width per 80 ms frame,
110
- flattened. A null output returns the float count without computing. */
111
- NEEDLE_API int needle_embed(
112
- const char* input,
113
- const float* pcm,
114
- int samples,
115
- float* out,
116
- int out_capacity
117
- );
118
-
119
- #ifdef __cplusplus
120
- }
121
- #endif
122
- #endif
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
macos-arm64/libneedle.a DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:7d1368a4a42a745aba055f310913c3ed6d929dee98a89dcb955b9032b2335700
3
- size 1534472
 
 
 
 
macos-arm64/needle DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:0a480f7e01d1fcf9df2e6dbc29af29411406720a5c5cb73024fcd6d16aa25b60
3
- size 1107096
 
 
 
 
macos-arm64/needle.h DELETED
@@ -1,122 +0,0 @@
1
- #ifndef NEEDLE_H
2
- #define NEEDLE_H
3
-
4
- #ifndef NEEDLE_API
5
- #define NEEDLE_API __attribute__((visibility("default")))
6
- #endif
7
-
8
- #define NEEDLE_TEXT 1
9
- #define NEEDLE_SPEECH 2
10
-
11
- #ifdef __cplusplus
12
- extern "C" {
13
- #endif
14
-
15
- /* One process-global, non-thread-safe model per kind, text and speech.
16
- Negative returns indicate failure; call needle_last_error() for the specific
17
- reason. needle_load reads whichever kind the .cact holds and keeps the other,
18
- so a build with both models takes one call per model. */
19
- NEEDLE_API int needle_load(
20
- const unsigned char* cact,
21
- unsigned long long n
22
- );
23
-
24
- /* NEEDLE_TEXT, NEEDLE_SPEECH or both, for the models this process has loaded. */
25
- NEEDLE_API int needle_models(void);
26
-
27
- /* Last process-global error, owned by the runtime and valid until the next API call. */
28
- NEEDLE_API const char* needle_last_error(void);
29
-
30
- /* needle_init returns the tokenized static-prefix length on success. It can fail
31
- when the system prompt plus statically-declared tools exceed the context
32
- window, and reports the measured token count when it does. */
33
- NEEDLE_API int needle_init(
34
- const char* system_prompt,
35
- const char* tools_json,
36
- const char* tool_index_path
37
- );
38
-
39
- /* Answers text or speech: exactly one of input and pcm is non-null. Given pcm,
40
- the engine transcribes the clip with the loaded speech model, answers the
41
- transcript, and merges the speech fields into the same JSON object under an
42
- audio_ prefix. needle_set_audio chooses how that transcription runs. */
43
- NEEDLE_API int needle_complete(
44
- const char* input,
45
- const float* pcm,
46
- int samples,
47
- int max_new_tokens,
48
- char* out,
49
- int out_capacity
50
- );
51
-
52
- /* Language, keywords and word timestamps for the transcription needle_complete
53
- runs for itself, with the meanings they have in needle_transcribe. The
54
- strings are copied. Defaults: detect the language, no keywords, no times. */
55
- NEEDLE_API void needle_set_audio(
56
- const char* language,
57
- const char* keywords,
58
- int word_timestamps
59
- );
60
-
61
- NEEDLE_API void needle_reset(void);
62
-
63
- /* Transcribes 16 kHz mono float PCM in [-1, 1] of any length and returns the
64
- number of tokens in the transcript. Up to 30 s runs as one pass; longer audio
65
- runs as consecutive 30 s windows, each decoded once and cut at its last
66
- sentence end, with word times counted from the start of the clip. language is "en", "de", "fr", "es", "it", "nl" or
67
- "pl", or NULL to detect it. keywords is NULL or newline-separated words and
68
- phrases for keyword biasing. out receives JSON with the transcript, the
69
- language used, the milliseconds to the first token and the decoder's tokens
70
- per second after it; silence and steady noise give an empty text and language:
71
- {"text":"...","language":"en","ttft_ms":0.0,"decode_tps":0.0}
72
- A non-zero word_timestamps adds each word with times in seconds:
73
- "words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}] */
74
- NEEDLE_API int needle_transcribe(
75
- const float* pcm,
76
- int samples,
77
- const char* language,
78
- const char* keywords,
79
- int word_timestamps,
80
- char* out,
81
- int out_capacity
82
- );
83
-
84
- /* Live transcription: appends 16 kHz mono float PCM, about one second at a
85
- time, re-transcribes the buffered audio and commits the words two consecutive
86
- passes agree on; a feed longer than 30 s is taken in one-second pieces. language and keywords are as in
87
- needle_transcribe. out receives the words this call committed, with times in
88
- seconds from the start of the stream, and the unconfirmed tail; returns the
89
- number of words committed:
90
- {"text":"...","words":[{"word":"...","start":0.00,"end":0.00,"probability":0.000}],
91
- "pending":"...","language":"en","received":0.00,"pass_ms":0.0} */
92
- NEEDLE_API int needle_stream_transcribe_process(
93
- const float* pcm,
94
- int samples,
95
- const char* language,
96
- const char* keywords,
97
- char* out,
98
- int out_capacity
99
- );
100
-
101
- /* Ends the stream: the tail becomes the committed words of out, and the next
102
- needle_stream_transcribe_process starts a new stream. */
103
- NEEDLE_API int needle_stream_transcribe_stop(
104
- char* out,
105
- int out_capacity
106
- );
107
-
108
- /* Embeds text or speech: exactly one of input and pcm is non-null. Text returns
109
- the model's embedding dimension, speech one row of that width per 80 ms frame,
110
- flattened. A null output returns the float count without computing. */
111
- NEEDLE_API int needle_embed(
112
- const char* input,
113
- const float* pcm,
114
- int samples,
115
- float* out,
116
- int out_capacity
117
- );
118
-
119
- #ifdef __cplusplus
120
- }
121
- #endif
122
- #endif
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
python/cactus_needle-3.0.0-py3-none-macosx_11_0_arm64.whl DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:f5c05efdd195c92effd8507d1259d6e509b9c5a8823939e67f2be4e83811b44b
3
- size 376196
 
 
 
 
python/cactus_needle-3.0.0-py3-none-macosx_11_0_x86_64.whl DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:01c1d8874266013e32b539c7b154b811f8268a01e7ea992eea40e5e1d541c55a
3
- size 430782
 
 
 
 
python/cactus_needle-3.0.0-py3-none-manylinux2014_aarch64.whl DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:653f41d440f14ad53cf0c4597fc9d960cbf059ae51a38ec0fb4f54a8873d5c0c
3
- size 500887
 
 
 
 
python/cactus_needle-3.0.0-py3-none-manylinux2014_x86_64.whl DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:a1eae4b94675ae025ebdb380401e0d9cab1d1f6c34d4fe1251166f1ba2faf16e
3
- size 530108
 
 
 
 
python/cactus_needle-3.0.0-py3-none-musllinux_1_2_aarch64.whl DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:4f826703197c3654ec426b3a2651057eb07496afb669c7d46f0aacf7844478a4
3
- size 500458
 
 
 
 
python/cactus_needle-3.0.0-py3-none-musllinux_1_2_x86_64.whl DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:f2b132474722ac032269782c2fa7ec459758ab43624843be4e3b16bf7cf7abee
3
- size 530918
 
 
 
 
python/cactus_needle-3.0.0-py3-none-win_amd64.whl DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:06fde9731929f53a7033e57f037f9262f99a3cdc2758d8d7bffae91404fb8665
3
- size 547384
 
 
 
 
python/cactus_needle-3.0.0-py3-none-win_arm64.whl DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:5b1da56516304bbc2ba6ec819ab9e6f72aad2525f14d9327f15d2d5edc1f9423
3
- size 477839
 
 
 
 
python/cactus_needle-3.0.1-py3-none-macosx_11_0_arm64.whl DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:161c3aacfb6e54443925b389a69eb58a1861e60af19bbdf8f39d89992c5d7436
3
- size 387232
 
 
 
 
python/cactus_needle-3.0.1-py3-none-macosx_11_0_x86_64.whl DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:941883e51fb2530706f1a115a0ea0062bb37501edaad8a6f08b85e12c4f5ca76
3
- size 431615
 
 
 
 
python/cactus_needle-3.0.1-py3-none-manylinux2014_aarch64.whl DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:fc0c550b64627ed20101d1ac6de736bf0d15fb592d649f24bacba4e7340fc3df
3
- size 517746
 
 
 
 
python/cactus_needle-3.0.1-py3-none-manylinux2014_x86_64.whl DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:05770ef9a85686583968ea15f62f9ad44217e078efdaa99559d3208bb8a369b0
3
- size 536871
 
 
 
 
python/cactus_needle-3.0.1-py3-none-musllinux_1_2_aarch64.whl DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:ec307274ed14d8a11be448e1546d3a330704a8d76a96a2f99de12ca14ed8ee64
3
- size 517367
 
 
 
 
python/cactus_needle-3.0.1-py3-none-musllinux_1_2_x86_64.whl DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:1b2f5f560fcf8d2033c0ade7ea48d8f2f228cb17f53331bf844fcceb955440e0
3
- size 537929
 
 
 
 
python/cactus_needle-3.0.1-py3-none-win_amd64.whl DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:7d4467726814ab18d9ce32a8a5cc23d1198a2c0557c613a00bef738121903e2f
3
- size 553581
 
 
 
 
python/cactus_needle-3.0.1-py3-none-win_arm64.whl DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:dfa6f8c15ca979bbe7c3e0579efdd8bf7b7afc75355e063cd00e6ac7732c9896
3
- size 493234
 
 
 
 
python/cactus_needle-3.0.2-py3-none-macosx_11_0_arm64.whl DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:aa6e730f3b3b46f103ba2bc1b268c402d497086030cce735846bee4d3abbf3d3
3
- size 387420
 
 
 
 
python/cactus_needle-3.0.2-py3-none-macosx_11_0_x86_64.whl DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:cdec5cd39868f51204671cff18ca82d79de2809819f83284abade16088b1b779
3
- size 431850