red-candle 1.8.0.pre3-aarch64-linux
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/Cargo.lock +5021 -0
- data/Cargo.toml +6 -0
- data/Gemfile +3 -0
- data/LICENSE +22 -0
- data/README.md +1171 -0
- data/Rakefile +167 -0
- data/bin/console +11 -0
- data/bin/setup +17 -0
- data/ext/candle/Cargo.toml +38 -0
- data/ext/candle/build.rs +117 -0
- data/ext/candle/extconf.rb +79 -0
- data/ext/candle/rustfmt.toml +63 -0
- data/ext/candle/src/gvl.rs +58 -0
- data/ext/candle/src/lib.rs +59 -0
- data/ext/candle/src/llm/constrained_generation_test.rs +395 -0
- data/ext/candle/src/llm/gemma.rs +313 -0
- data/ext/candle/src/llm/generation_config.rs +63 -0
- data/ext/candle/src/llm/glm4.rs +236 -0
- data/ext/candle/src/llm/granite.rs +308 -0
- data/ext/candle/src/llm/granitemoehybrid.rs +315 -0
- data/ext/candle/src/llm/llama.rs +396 -0
- data/ext/candle/src/llm/mistral.rs +309 -0
- data/ext/candle/src/llm/mod.rs +49 -0
- data/ext/candle/src/llm/phi.rs +369 -0
- data/ext/candle/src/llm/quantized_gguf.rs +734 -0
- data/ext/candle/src/llm/qwen.rs +261 -0
- data/ext/candle/src/llm/qwen3.rs +257 -0
- data/ext/candle/src/llm/text_generation.rs +284 -0
- data/ext/candle/src/ruby/device.rs +234 -0
- data/ext/candle/src/ruby/dtype.rs +39 -0
- data/ext/candle/src/ruby/embedding_model.rs +477 -0
- data/ext/candle/src/ruby/errors.rs +16 -0
- data/ext/candle/src/ruby/llm.rs +730 -0
- data/ext/candle/src/ruby/mod.rs +24 -0
- data/ext/candle/src/ruby/ner.rs +444 -0
- data/ext/candle/src/ruby/reranker.rs +488 -0
- data/ext/candle/src/ruby/result.rs +3 -0
- data/ext/candle/src/ruby/structured.rs +92 -0
- data/ext/candle/src/ruby/tensor.rs +731 -0
- data/ext/candle/src/ruby/tokenizer.rs +343 -0
- data/ext/candle/src/ruby/utils.rs +96 -0
- data/ext/candle/src/ruby/vlm.rs +330 -0
- data/ext/candle/src/structured/integration_test.rs +130 -0
- data/ext/candle/src/structured/mod.rs +31 -0
- data/ext/candle/src/structured/schema_processor.rs +215 -0
- data/ext/candle/src/structured/vocabulary_adapter.rs +152 -0
- data/ext/candle/src/structured/vocabulary_adapter_real_test.rs +66 -0
- data/ext/candle/src/structured/vocabulary_adapter_simple_test.rs +70 -0
- data/ext/candle/src/tokenizer/loader.rs +108 -0
- data/ext/candle/src/tokenizer/mod.rs +104 -0
- data/ext/candle/tests/device_tests.rs +43 -0
- data/ext/candle/tests/tensor_tests.rs +162 -0
- data/lib/candle/3.1/candle.so +0 -0
- data/lib/candle/3.2/candle.so +0 -0
- data/lib/candle/3.3/candle.so +0 -0
- data/lib/candle/3.4/candle.so +0 -0
- data/lib/candle/4.0/candle.so +0 -0
- data/lib/candle/agent.rb +68 -0
- data/lib/candle/build_info.rb +67 -0
- data/lib/candle/device_utils.rb +10 -0
- data/lib/candle/embedding_model.rb +75 -0
- data/lib/candle/embedding_model_type.rb +31 -0
- data/lib/candle/llm.rb +595 -0
- data/lib/candle/logger.rb +149 -0
- data/lib/candle/ner.rb +368 -0
- data/lib/candle/reranker.rb +45 -0
- data/lib/candle/tensor.rb +99 -0
- data/lib/candle/tokenizer.rb +139 -0
- data/lib/candle/tool.rb +47 -0
- data/lib/candle/tool_call_parser.rb +57 -0
- data/lib/candle/version.rb +5 -0
- data/lib/candle/vlm.rb +31 -0
- data/lib/candle.rb +29 -0
- data/lib/red-candle.rb +1 -0
- metadata +309 -0
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Candle
|
|
4
|
+
# Tokenizer class for text tokenization
|
|
5
|
+
#
|
|
6
|
+
# This class provides methods to encode text into tokens and decode tokens back to text.
|
|
7
|
+
# It supports both single text and batch processing, with options for special tokens,
|
|
8
|
+
# padding, and truncation.
|
|
9
|
+
#
|
|
10
|
+
# @example Create a tokenizer from a pretrained model
|
|
11
|
+
# tokenizer = Candle::Tokenizer.from_pretrained("bert-base-uncased")
|
|
12
|
+
#
|
|
13
|
+
# @example Encode and decode text
|
|
14
|
+
# tokens = tokenizer.encode("Hello, world!")
|
|
15
|
+
# text = tokenizer.decode(tokens)
|
|
16
|
+
#
|
|
17
|
+
# @example Batch encoding
|
|
18
|
+
# texts = ["Hello", "World", "Test"]
|
|
19
|
+
# batch_tokens = tokenizer.encode_batch(texts)
|
|
20
|
+
#
|
|
21
|
+
# @example Configure padding and truncation
|
|
22
|
+
# padded_tokenizer = tokenizer.with_padding(length: 128)
|
|
23
|
+
# truncated_tokenizer = tokenizer.with_truncation(512)
|
|
24
|
+
class Tokenizer
|
|
25
|
+
# These methods are implemented in Rust
|
|
26
|
+
# - from_file(path) - Load tokenizer from a JSON file
|
|
27
|
+
# - from_pretrained(model_id) - Load tokenizer from HuggingFace
|
|
28
|
+
# - encode(text, add_special_tokens = true) - Encode text to token IDs
|
|
29
|
+
# - encode_to_tokens(text, add_special_tokens = true) - Encode text to token strings
|
|
30
|
+
# - encode_with_tokens(text, add_special_tokens = true) - Get both IDs and tokens
|
|
31
|
+
# - encode_batch(texts, add_special_tokens = true) - Encode multiple texts to IDs
|
|
32
|
+
# - encode_batch_to_tokens(texts, add_special_tokens = true) - Encode multiple texts to tokens
|
|
33
|
+
# - decode(token_ids, skip_special_tokens = true) - Decode token IDs to text
|
|
34
|
+
# - id_to_token(token_id) - Get token string for a token ID
|
|
35
|
+
# - get_vocab(with_added_tokens = true) - Get vocabulary as hash
|
|
36
|
+
# - vocab_size(with_added_tokens = true) - Get vocabulary size
|
|
37
|
+
# - with_padding(options) - Create tokenizer with padding enabled
|
|
38
|
+
# - with_truncation(max_length) - Create tokenizer with truncation enabled
|
|
39
|
+
# - get_special_tokens - Get special tokens info
|
|
40
|
+
# - inspect - String representation
|
|
41
|
+
# - to_s - String representation
|
|
42
|
+
|
|
43
|
+
# The native methods accept positional arguments, but we provide keyword argument interfaces
|
|
44
|
+
# for better Ruby ergonomics. We need to call the native methods with positional args.
|
|
45
|
+
|
|
46
|
+
alias_method :_native_encode, :encode
|
|
47
|
+
alias_method :_native_encode_to_tokens, :encode_to_tokens
|
|
48
|
+
alias_method :_native_encode_with_tokens, :encode_with_tokens
|
|
49
|
+
alias_method :_native_encode_batch, :encode_batch
|
|
50
|
+
alias_method :_native_encode_batch_to_tokens, :encode_batch_to_tokens
|
|
51
|
+
alias_method :_native_decode, :decode
|
|
52
|
+
alias_method :_native_get_vocab, :get_vocab
|
|
53
|
+
alias_method :_native_vocab_size, :vocab_size
|
|
54
|
+
alias_method :_native_with_padding, :with_padding
|
|
55
|
+
|
|
56
|
+
# Encode text with convenient keyword arguments
|
|
57
|
+
#
|
|
58
|
+
# @param text [String] The text to encode
|
|
59
|
+
# @param add_special_tokens [Boolean] Whether to add special tokens (default: true)
|
|
60
|
+
# @return [Array<Integer>] Token IDs
|
|
61
|
+
def encode(text, add_special_tokens: true)
|
|
62
|
+
_native_encode(text, add_special_tokens)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# Encode text into token strings (words/subwords)
|
|
66
|
+
#
|
|
67
|
+
# @param text [String] The text to encode
|
|
68
|
+
# @param add_special_tokens [Boolean] Whether to add special tokens (default: true)
|
|
69
|
+
# @return [Array<String>] Token strings
|
|
70
|
+
def encode_to_tokens(text, add_special_tokens: true)
|
|
71
|
+
_native_encode_to_tokens(text, add_special_tokens)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# Encode text and return both IDs and token strings
|
|
75
|
+
#
|
|
76
|
+
# @param text [String] The text to encode
|
|
77
|
+
# @param add_special_tokens [Boolean] Whether to add special tokens (default: true)
|
|
78
|
+
# @return [Hash] Hash with :ids and :tokens arrays
|
|
79
|
+
def encode_with_tokens(text, add_special_tokens: true)
|
|
80
|
+
_native_encode_with_tokens(text, add_special_tokens)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# Encode multiple texts with convenient keyword arguments
|
|
84
|
+
#
|
|
85
|
+
# @param texts [Array<String>] The texts to encode
|
|
86
|
+
# @param add_special_tokens [Boolean] Whether to add special tokens (default: true)
|
|
87
|
+
# @return [Array<Array<Integer>>] Arrays of token IDs
|
|
88
|
+
def encode_batch(texts, add_special_tokens: true)
|
|
89
|
+
_native_encode_batch(texts, add_special_tokens)
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# Encode multiple texts into token strings
|
|
93
|
+
#
|
|
94
|
+
# @param texts [Array<String>] The texts to encode
|
|
95
|
+
# @param add_special_tokens [Boolean] Whether to add special tokens (default: true)
|
|
96
|
+
# @return [Array<Array<String>>] Arrays of token strings
|
|
97
|
+
def encode_batch_to_tokens(texts, add_special_tokens: true)
|
|
98
|
+
_native_encode_batch_to_tokens(texts, add_special_tokens)
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# Decode token IDs with convenient keyword arguments
|
|
102
|
+
#
|
|
103
|
+
# @param token_ids [Array<Integer>] The token IDs to decode
|
|
104
|
+
# @param skip_special_tokens [Boolean] Whether to skip special tokens (default: true)
|
|
105
|
+
# @return [String] Decoded text
|
|
106
|
+
def decode(token_ids, skip_special_tokens: true)
|
|
107
|
+
_native_decode(token_ids, skip_special_tokens)
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
# Get vocabulary with convenient keyword arguments
|
|
111
|
+
#
|
|
112
|
+
# @param with_added_tokens [Boolean] Include added tokens (default: true)
|
|
113
|
+
# @return [Hash<String, Integer>] Token to ID mapping
|
|
114
|
+
def get_vocab(with_added_tokens: true)
|
|
115
|
+
_native_get_vocab(with_added_tokens)
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
# Get vocabulary size with convenient keyword arguments
|
|
119
|
+
#
|
|
120
|
+
# @param with_added_tokens [Boolean] Include added tokens (default: true)
|
|
121
|
+
# @return [Integer] Vocabulary size
|
|
122
|
+
def vocab_size(with_added_tokens: true)
|
|
123
|
+
_native_vocab_size(with_added_tokens)
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
# Create a new tokenizer with padding configuration
|
|
127
|
+
#
|
|
128
|
+
# @param options [Hash] Padding options
|
|
129
|
+
# @option options [Integer] :length Fixed length padding
|
|
130
|
+
# @option options [Boolean] :max_length Use batch longest padding
|
|
131
|
+
# @option options [String] :direction Padding direction ("left" or "right")
|
|
132
|
+
# @option options [Integer] :pad_id Padding token ID
|
|
133
|
+
# @option options [String] :pad_token Padding token string
|
|
134
|
+
# @return [Tokenizer] New tokenizer instance with padding enabled
|
|
135
|
+
def with_padding(**options)
|
|
136
|
+
_native_with_padding(options)
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
end
|
data/lib/candle/tool.rb
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Candle
|
|
4
|
+
class Tool
|
|
5
|
+
attr_reader :name, :description, :parameters
|
|
6
|
+
|
|
7
|
+
def initialize(name:, description:, parameters: {}, &block)
|
|
8
|
+
@name = name
|
|
9
|
+
@description = description
|
|
10
|
+
@parameters = parameters
|
|
11
|
+
@callable = block
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def call(arguments)
|
|
15
|
+
@callable.call(arguments)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def to_tool_definition
|
|
19
|
+
{
|
|
20
|
+
"type" => "function",
|
|
21
|
+
"function" => {
|
|
22
|
+
"name" => @name,
|
|
23
|
+
"description" => @description,
|
|
24
|
+
"parameters" => @parameters
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
ToolCall = Struct.new(:name, :arguments, keyword_init: true)
|
|
31
|
+
|
|
32
|
+
ToolCallResult = Struct.new(
|
|
33
|
+
:tool_calls,
|
|
34
|
+
:tool_results,
|
|
35
|
+
:text_response,
|
|
36
|
+
:raw_response,
|
|
37
|
+
keyword_init: true
|
|
38
|
+
) do
|
|
39
|
+
def has_tool_calls?
|
|
40
|
+
tool_calls && !tool_calls.empty?
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def success?
|
|
44
|
+
tool_results.all? { |r| r[:error].nil? }
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "json"
|
|
4
|
+
|
|
5
|
+
module Candle
|
|
6
|
+
class ToolCallParser
|
|
7
|
+
DEFAULT_PATTERN = /<tool_call>\s*(.*?)\s*<\/tool_call>/m
|
|
8
|
+
|
|
9
|
+
attr_reader :pattern
|
|
10
|
+
|
|
11
|
+
def initialize(pattern: DEFAULT_PATTERN)
|
|
12
|
+
@pattern = pattern
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
ParseResult = Struct.new(:text_response, :tool_calls, keyword_init: true) do
|
|
16
|
+
def has_tool_calls?
|
|
17
|
+
tool_calls && !tool_calls.empty?
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def parse(text, available_tools: [])
|
|
22
|
+
tool_calls = []
|
|
23
|
+
|
|
24
|
+
text.scan(@pattern) do |match|
|
|
25
|
+
json_str = match[0].strip
|
|
26
|
+
begin
|
|
27
|
+
parsed = JSON.parse(json_str)
|
|
28
|
+
name = parsed["name"]
|
|
29
|
+
arguments = parsed["arguments"] || parsed["parameters"] || {}
|
|
30
|
+
|
|
31
|
+
next unless name
|
|
32
|
+
if available_tools.empty? || available_tools.any? { |t| t.name == name }
|
|
33
|
+
tool_calls << ToolCall.new(name: name, arguments: arguments)
|
|
34
|
+
end
|
|
35
|
+
rescue JSON::ParserError
|
|
36
|
+
# Skip malformed tool calls
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Deduplicate identical tool calls (models sometimes repeat the same call)
|
|
41
|
+
tool_calls.uniq! { |tc| [tc.name, tc.arguments] }
|
|
42
|
+
|
|
43
|
+
remaining_text = text.gsub(@pattern, "").strip
|
|
44
|
+
remaining_text = nil if remaining_text.empty?
|
|
45
|
+
|
|
46
|
+
ParseResult.new(
|
|
47
|
+
text_response: remaining_text,
|
|
48
|
+
tool_calls: tool_calls
|
|
49
|
+
)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Convenience class method using the default pattern
|
|
53
|
+
def self.parse(text, available_tools: [])
|
|
54
|
+
new.parse(text, available_tools: available_tools)
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
data/lib/candle/vlm.rb
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Candle
|
|
4
|
+
class VLM
|
|
5
|
+
class << self
|
|
6
|
+
def from_pretrained(model_id, device: nil, **options)
|
|
7
|
+
device_obj = case device
|
|
8
|
+
when "cpu" then Candle::Device.cpu
|
|
9
|
+
when "metal" then Candle::Device.metal
|
|
10
|
+
when "cuda" then Candle::Device.cuda
|
|
11
|
+
when Candle::Device then device
|
|
12
|
+
when nil then nil
|
|
13
|
+
else Candle::Device.best
|
|
14
|
+
end
|
|
15
|
+
_create(model_id, device_obj)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def describe(image_path, max_length: 256)
|
|
20
|
+
_describe(image_path, max_length)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def ask(image_path, question, max_length: 256)
|
|
24
|
+
_ask(image_path, question, max_length)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def inspect
|
|
28
|
+
"#<Candle::VLM model_id=#{model_id.inspect} device=#{device}>"
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
data/lib/candle.rb
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
require_relative "candle/logger"
|
|
2
|
+
|
|
3
|
+
# Load the compiled Rust extension. Precompiled (platform) gems install it into a
|
|
4
|
+
# Ruby-ABI-versioned subdir (lib/candle/<major.minor>/candle.{so,bundle}) so a single
|
|
5
|
+
# fat gem can carry a binary per Ruby version; source/dev builds place it flat at
|
|
6
|
+
# lib/candle/candle.{so,bundle}. Try the versioned path first, fall back to the flat
|
|
7
|
+
# one. Resolution goes through $LOAD_PATH (`require`, never `require_relative`) because
|
|
8
|
+
# RubyGems installs native extensions outside the gem's lib/ dir — see
|
|
9
|
+
# spec/require_spec.rb and Issue #75.
|
|
10
|
+
begin
|
|
11
|
+
RUBY_VERSION =~ /(\d+\.\d+)/
|
|
12
|
+
require "candle/#{Regexp.last_match(1)}/candle"
|
|
13
|
+
rescue LoadError
|
|
14
|
+
require "candle/candle"
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
require_relative "candle/tensor"
|
|
18
|
+
require_relative "candle/device_utils"
|
|
19
|
+
require_relative "candle/embedding_model_type"
|
|
20
|
+
require_relative "candle/embedding_model"
|
|
21
|
+
require_relative "candle/reranker"
|
|
22
|
+
require_relative "candle/tool"
|
|
23
|
+
require_relative "candle/tool_call_parser"
|
|
24
|
+
require_relative "candle/llm"
|
|
25
|
+
require_relative "candle/agent"
|
|
26
|
+
require_relative "candle/tokenizer"
|
|
27
|
+
require_relative "candle/ner"
|
|
28
|
+
require_relative "candle/vlm"
|
|
29
|
+
require_relative "candle/build_info"
|
data/lib/red-candle.rb
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require 'candle'
|
metadata
ADDED
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: red-candle
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 1.8.0.pre3
|
|
5
|
+
platform: aarch64-linux
|
|
6
|
+
authors:
|
|
7
|
+
- Christopher Petersen
|
|
8
|
+
- kojix2
|
|
9
|
+
autorequire:
|
|
10
|
+
bindir: bin
|
|
11
|
+
cert_chain: []
|
|
12
|
+
date: 2026-06-18 00:00:00.000000000 Z
|
|
13
|
+
dependencies:
|
|
14
|
+
- !ruby/object:Gem::Dependency
|
|
15
|
+
name: rb_sys
|
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
|
17
|
+
requirements:
|
|
18
|
+
- - ">="
|
|
19
|
+
- !ruby/object:Gem::Version
|
|
20
|
+
version: '0'
|
|
21
|
+
type: :runtime
|
|
22
|
+
prerelease: false
|
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
24
|
+
requirements:
|
|
25
|
+
- - ">="
|
|
26
|
+
- !ruby/object:Gem::Version
|
|
27
|
+
version: '0'
|
|
28
|
+
- !ruby/object:Gem::Dependency
|
|
29
|
+
name: logger
|
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
|
31
|
+
requirements:
|
|
32
|
+
- - ">="
|
|
33
|
+
- !ruby/object:Gem::Version
|
|
34
|
+
version: '0'
|
|
35
|
+
type: :runtime
|
|
36
|
+
prerelease: false
|
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
38
|
+
requirements:
|
|
39
|
+
- - ">="
|
|
40
|
+
- !ruby/object:Gem::Version
|
|
41
|
+
version: '0'
|
|
42
|
+
- !ruby/object:Gem::Dependency
|
|
43
|
+
name: benchmark
|
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
|
45
|
+
requirements:
|
|
46
|
+
- - ">="
|
|
47
|
+
- !ruby/object:Gem::Version
|
|
48
|
+
version: '0'
|
|
49
|
+
type: :development
|
|
50
|
+
prerelease: false
|
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
52
|
+
requirements:
|
|
53
|
+
- - ">="
|
|
54
|
+
- !ruby/object:Gem::Version
|
|
55
|
+
version: '0'
|
|
56
|
+
- !ruby/object:Gem::Dependency
|
|
57
|
+
name: minitest
|
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
|
59
|
+
requirements:
|
|
60
|
+
- - ">="
|
|
61
|
+
- !ruby/object:Gem::Version
|
|
62
|
+
version: '0'
|
|
63
|
+
type: :development
|
|
64
|
+
prerelease: false
|
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
66
|
+
requirements:
|
|
67
|
+
- - ">="
|
|
68
|
+
- !ruby/object:Gem::Version
|
|
69
|
+
version: '0'
|
|
70
|
+
- !ruby/object:Gem::Dependency
|
|
71
|
+
name: rake
|
|
72
|
+
requirement: !ruby/object:Gem::Requirement
|
|
73
|
+
requirements:
|
|
74
|
+
- - ">="
|
|
75
|
+
- !ruby/object:Gem::Version
|
|
76
|
+
version: '0'
|
|
77
|
+
type: :development
|
|
78
|
+
prerelease: false
|
|
79
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
80
|
+
requirements:
|
|
81
|
+
- - ">="
|
|
82
|
+
- !ruby/object:Gem::Version
|
|
83
|
+
version: '0'
|
|
84
|
+
- !ruby/object:Gem::Dependency
|
|
85
|
+
name: rake-compiler
|
|
86
|
+
requirement: !ruby/object:Gem::Requirement
|
|
87
|
+
requirements:
|
|
88
|
+
- - ">="
|
|
89
|
+
- !ruby/object:Gem::Version
|
|
90
|
+
version: '0'
|
|
91
|
+
type: :development
|
|
92
|
+
prerelease: false
|
|
93
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
94
|
+
requirements:
|
|
95
|
+
- - ">="
|
|
96
|
+
- !ruby/object:Gem::Version
|
|
97
|
+
version: '0'
|
|
98
|
+
- !ruby/object:Gem::Dependency
|
|
99
|
+
name: yard
|
|
100
|
+
requirement: !ruby/object:Gem::Requirement
|
|
101
|
+
requirements:
|
|
102
|
+
- - ">="
|
|
103
|
+
- !ruby/object:Gem::Version
|
|
104
|
+
version: '0'
|
|
105
|
+
type: :development
|
|
106
|
+
prerelease: false
|
|
107
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
108
|
+
requirements:
|
|
109
|
+
- - ">="
|
|
110
|
+
- !ruby/object:Gem::Version
|
|
111
|
+
version: '0'
|
|
112
|
+
- !ruby/object:Gem::Dependency
|
|
113
|
+
name: yard-rustdoc
|
|
114
|
+
requirement: !ruby/object:Gem::Requirement
|
|
115
|
+
requirements:
|
|
116
|
+
- - ">="
|
|
117
|
+
- !ruby/object:Gem::Version
|
|
118
|
+
version: '0'
|
|
119
|
+
type: :development
|
|
120
|
+
prerelease: false
|
|
121
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
122
|
+
requirements:
|
|
123
|
+
- - ">="
|
|
124
|
+
- !ruby/object:Gem::Version
|
|
125
|
+
version: '0'
|
|
126
|
+
- !ruby/object:Gem::Dependency
|
|
127
|
+
name: redcarpet
|
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
|
129
|
+
requirements:
|
|
130
|
+
- - "~>"
|
|
131
|
+
- !ruby/object:Gem::Version
|
|
132
|
+
version: '3.6'
|
|
133
|
+
type: :development
|
|
134
|
+
prerelease: false
|
|
135
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
136
|
+
requirements:
|
|
137
|
+
- - "~>"
|
|
138
|
+
- !ruby/object:Gem::Version
|
|
139
|
+
version: '3.6'
|
|
140
|
+
- !ruby/object:Gem::Dependency
|
|
141
|
+
name: informers
|
|
142
|
+
requirement: !ruby/object:Gem::Requirement
|
|
143
|
+
requirements:
|
|
144
|
+
- - ">="
|
|
145
|
+
- !ruby/object:Gem::Version
|
|
146
|
+
version: '0'
|
|
147
|
+
type: :development
|
|
148
|
+
prerelease: false
|
|
149
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
150
|
+
requirements:
|
|
151
|
+
- - ">="
|
|
152
|
+
- !ruby/object:Gem::Version
|
|
153
|
+
version: '0'
|
|
154
|
+
- !ruby/object:Gem::Dependency
|
|
155
|
+
name: simplecov
|
|
156
|
+
requirement: !ruby/object:Gem::Requirement
|
|
157
|
+
requirements:
|
|
158
|
+
- - ">="
|
|
159
|
+
- !ruby/object:Gem::Version
|
|
160
|
+
version: '0'
|
|
161
|
+
type: :development
|
|
162
|
+
prerelease: false
|
|
163
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
164
|
+
requirements:
|
|
165
|
+
- - ">="
|
|
166
|
+
- !ruby/object:Gem::Version
|
|
167
|
+
version: '0'
|
|
168
|
+
- !ruby/object:Gem::Dependency
|
|
169
|
+
name: rspec
|
|
170
|
+
requirement: !ruby/object:Gem::Requirement
|
|
171
|
+
requirements:
|
|
172
|
+
- - "~>"
|
|
173
|
+
- !ruby/object:Gem::Version
|
|
174
|
+
version: '3.13'
|
|
175
|
+
type: :development
|
|
176
|
+
prerelease: false
|
|
177
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
178
|
+
requirements:
|
|
179
|
+
- - "~>"
|
|
180
|
+
- !ruby/object:Gem::Version
|
|
181
|
+
version: '3.13'
|
|
182
|
+
- !ruby/object:Gem::Dependency
|
|
183
|
+
name: irb
|
|
184
|
+
requirement: !ruby/object:Gem::Requirement
|
|
185
|
+
requirements:
|
|
186
|
+
- - ">="
|
|
187
|
+
- !ruby/object:Gem::Version
|
|
188
|
+
version: '0'
|
|
189
|
+
type: :development
|
|
190
|
+
prerelease: false
|
|
191
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
192
|
+
requirements:
|
|
193
|
+
- - ">="
|
|
194
|
+
- !ruby/object:Gem::Version
|
|
195
|
+
version: '0'
|
|
196
|
+
description: Ruby gem for running state-of-the-art language models locally. Access
|
|
197
|
+
LLMs, embeddings, rerankers, and NER models directly from Ruby using Rust-powered
|
|
198
|
+
Candle with Metal/CUDA acceleration.
|
|
199
|
+
email:
|
|
200
|
+
- chris@petersen.io
|
|
201
|
+
- 2xijok@gmail.com
|
|
202
|
+
executables: []
|
|
203
|
+
extensions: []
|
|
204
|
+
extra_rdoc_files: []
|
|
205
|
+
files:
|
|
206
|
+
- Cargo.lock
|
|
207
|
+
- Cargo.toml
|
|
208
|
+
- Gemfile
|
|
209
|
+
- LICENSE
|
|
210
|
+
- README.md
|
|
211
|
+
- Rakefile
|
|
212
|
+
- bin/console
|
|
213
|
+
- bin/setup
|
|
214
|
+
- ext/candle/Cargo.toml
|
|
215
|
+
- ext/candle/build.rs
|
|
216
|
+
- ext/candle/extconf.rb
|
|
217
|
+
- ext/candle/rustfmt.toml
|
|
218
|
+
- ext/candle/src/gvl.rs
|
|
219
|
+
- ext/candle/src/lib.rs
|
|
220
|
+
- ext/candle/src/llm/constrained_generation_test.rs
|
|
221
|
+
- ext/candle/src/llm/gemma.rs
|
|
222
|
+
- ext/candle/src/llm/generation_config.rs
|
|
223
|
+
- ext/candle/src/llm/glm4.rs
|
|
224
|
+
- ext/candle/src/llm/granite.rs
|
|
225
|
+
- ext/candle/src/llm/granitemoehybrid.rs
|
|
226
|
+
- ext/candle/src/llm/llama.rs
|
|
227
|
+
- ext/candle/src/llm/mistral.rs
|
|
228
|
+
- ext/candle/src/llm/mod.rs
|
|
229
|
+
- ext/candle/src/llm/phi.rs
|
|
230
|
+
- ext/candle/src/llm/quantized_gguf.rs
|
|
231
|
+
- ext/candle/src/llm/qwen.rs
|
|
232
|
+
- ext/candle/src/llm/qwen3.rs
|
|
233
|
+
- ext/candle/src/llm/text_generation.rs
|
|
234
|
+
- ext/candle/src/ruby/device.rs
|
|
235
|
+
- ext/candle/src/ruby/dtype.rs
|
|
236
|
+
- ext/candle/src/ruby/embedding_model.rs
|
|
237
|
+
- ext/candle/src/ruby/errors.rs
|
|
238
|
+
- ext/candle/src/ruby/llm.rs
|
|
239
|
+
- ext/candle/src/ruby/mod.rs
|
|
240
|
+
- ext/candle/src/ruby/ner.rs
|
|
241
|
+
- ext/candle/src/ruby/reranker.rs
|
|
242
|
+
- ext/candle/src/ruby/result.rs
|
|
243
|
+
- ext/candle/src/ruby/structured.rs
|
|
244
|
+
- ext/candle/src/ruby/tensor.rs
|
|
245
|
+
- ext/candle/src/ruby/tokenizer.rs
|
|
246
|
+
- ext/candle/src/ruby/utils.rs
|
|
247
|
+
- ext/candle/src/ruby/vlm.rs
|
|
248
|
+
- ext/candle/src/structured/integration_test.rs
|
|
249
|
+
- ext/candle/src/structured/mod.rs
|
|
250
|
+
- ext/candle/src/structured/schema_processor.rs
|
|
251
|
+
- ext/candle/src/structured/vocabulary_adapter.rs
|
|
252
|
+
- ext/candle/src/structured/vocabulary_adapter_real_test.rs
|
|
253
|
+
- ext/candle/src/structured/vocabulary_adapter_simple_test.rs
|
|
254
|
+
- ext/candle/src/tokenizer/loader.rs
|
|
255
|
+
- ext/candle/src/tokenizer/mod.rs
|
|
256
|
+
- ext/candle/tests/device_tests.rs
|
|
257
|
+
- ext/candle/tests/tensor_tests.rs
|
|
258
|
+
- lib/candle.rb
|
|
259
|
+
- lib/candle/3.1/candle.so
|
|
260
|
+
- lib/candle/3.2/candle.so
|
|
261
|
+
- lib/candle/3.3/candle.so
|
|
262
|
+
- lib/candle/3.4/candle.so
|
|
263
|
+
- lib/candle/4.0/candle.so
|
|
264
|
+
- lib/candle/agent.rb
|
|
265
|
+
- lib/candle/build_info.rb
|
|
266
|
+
- lib/candle/device_utils.rb
|
|
267
|
+
- lib/candle/embedding_model.rb
|
|
268
|
+
- lib/candle/embedding_model_type.rb
|
|
269
|
+
- lib/candle/llm.rb
|
|
270
|
+
- lib/candle/logger.rb
|
|
271
|
+
- lib/candle/ner.rb
|
|
272
|
+
- lib/candle/reranker.rb
|
|
273
|
+
- lib/candle/tensor.rb
|
|
274
|
+
- lib/candle/tokenizer.rb
|
|
275
|
+
- lib/candle/tool.rb
|
|
276
|
+
- lib/candle/tool_call_parser.rb
|
|
277
|
+
- lib/candle/version.rb
|
|
278
|
+
- lib/candle/vlm.rb
|
|
279
|
+
- lib/red-candle.rb
|
|
280
|
+
homepage: https://github.com/scientist-labs/red-candle
|
|
281
|
+
licenses:
|
|
282
|
+
- MIT
|
|
283
|
+
metadata: {}
|
|
284
|
+
post_install_message:
|
|
285
|
+
rdoc_options: []
|
|
286
|
+
require_paths:
|
|
287
|
+
- lib
|
|
288
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
289
|
+
requirements:
|
|
290
|
+
- - ">="
|
|
291
|
+
- !ruby/object:Gem::Version
|
|
292
|
+
version: '3.1'
|
|
293
|
+
- - "<"
|
|
294
|
+
- !ruby/object:Gem::Version
|
|
295
|
+
version: 4.1.dev
|
|
296
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
297
|
+
requirements:
|
|
298
|
+
- - ">="
|
|
299
|
+
- !ruby/object:Gem::Version
|
|
300
|
+
version: '3.3'
|
|
301
|
+
requirements:
|
|
302
|
+
- Rust >= 1.85
|
|
303
|
+
rubygems_version: 3.5.23
|
|
304
|
+
signing_key:
|
|
305
|
+
specification_version: 4
|
|
306
|
+
summary: Ruby gem for running state-of-the-art language models locally. Access LLMs,
|
|
307
|
+
embeddings, rerankers, and NER models directly from Ruby using Rust-powered Candle
|
|
308
|
+
with Metal/CUDA acceleration.
|
|
309
|
+
test_files: []
|