weaviate-ruby 0.8.9 → 0.8.11
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -0
- data/Gemfile.lock +14 -10
- data/README.md +73 -4
- data/lib/weaviate/client.rb +1 -0
- data/lib/weaviate/objects.rb +18 -7
- data/lib/weaviate/query.rb +5 -1
- data/lib/weaviate/schema.rb +5 -1
- data/lib/weaviate/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f1533db1f83e65e849863776ab0312149c0e5dcdcbb2c65ea922294ea9af6ee7
|
4
|
+
data.tar.gz: ce9ca1a00db9c4b117a8c19216c9049663f481750b7773bd69a4637f26074282
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8af749e6537bdef2d2c87fdc0b0724e860368f00f37550c94a7b3e0139555c89d624fda050abda601b7c7d317ad9eccdfb01ee654586e6ce038e7048128d37cb
|
7
|
+
data.tar.gz: 4afef756ad24eba7c8fb9314219dda512e49ae2cf0dc07ce9f8cc9ec1269d4b71c7ef738b4f36de780147e9b707f384bf0cb271d7ebf57d3333c2ce9e135ac07
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
weaviate-ruby (0.8.
|
4
|
+
weaviate-ruby (0.8.11)
|
5
5
|
faraday (>= 2.0.1, < 3.0)
|
6
6
|
graphlient (~> 0.7.0)
|
7
7
|
|
8
8
|
GEM
|
9
9
|
remote: https://rubygems.org/
|
10
10
|
specs:
|
11
|
-
activesupport (7.1.
|
11
|
+
activesupport (7.1.3)
|
12
12
|
base64
|
13
13
|
bigdecimal
|
14
14
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
@@ -19,14 +19,14 @@ GEM
|
|
19
19
|
mutex_m
|
20
20
|
tzinfo (~> 2.0)
|
21
21
|
ast (2.4.2)
|
22
|
-
base64 (0.
|
23
|
-
bigdecimal (3.1.
|
22
|
+
base64 (0.2.0)
|
23
|
+
bigdecimal (3.1.6)
|
24
24
|
byebug (11.1.3)
|
25
25
|
coderay (1.1.3)
|
26
|
-
concurrent-ruby (1.2.
|
26
|
+
concurrent-ruby (1.2.3)
|
27
27
|
connection_pool (2.4.1)
|
28
28
|
diff-lcs (1.5.0)
|
29
|
-
drb (2.
|
29
|
+
drb (2.2.0)
|
30
30
|
ruby2_keywords
|
31
31
|
faraday (2.7.10)
|
32
32
|
faraday-net_http (>= 2.0, < 3.1)
|
@@ -35,8 +35,9 @@ GEM
|
|
35
35
|
graphlient (0.7.0)
|
36
36
|
faraday (~> 2.0)
|
37
37
|
graphql-client
|
38
|
-
graphql (2.
|
39
|
-
|
38
|
+
graphql (2.2.6)
|
39
|
+
racc (~> 1.4)
|
40
|
+
graphql-client (0.19.0)
|
40
41
|
activesupport (>= 3.0)
|
41
42
|
graphql
|
42
43
|
i18n (1.14.1)
|
@@ -44,8 +45,8 @@ GEM
|
|
44
45
|
json (2.6.3)
|
45
46
|
language_server-protocol (3.17.0.3)
|
46
47
|
method_source (1.0.0)
|
47
|
-
minitest (5.
|
48
|
-
mutex_m (0.
|
48
|
+
minitest (5.21.2)
|
49
|
+
mutex_m (0.2.0)
|
49
50
|
parallel (1.22.1)
|
50
51
|
parser (3.2.1.1)
|
51
52
|
ast (~> 2.4.1)
|
@@ -55,6 +56,7 @@ GEM
|
|
55
56
|
pry-byebug (3.10.1)
|
56
57
|
byebug (~> 11.0)
|
57
58
|
pry (>= 0.13, < 0.15)
|
59
|
+
racc (1.7.3)
|
58
60
|
rainbow (3.1.1)
|
59
61
|
rake (13.0.6)
|
60
62
|
rdiscount (2.2.7.1)
|
@@ -101,11 +103,13 @@ GEM
|
|
101
103
|
|
102
104
|
PLATFORMS
|
103
105
|
arm64-darwin-21
|
106
|
+
arm64-darwin-23
|
104
107
|
x86_64-darwin-19
|
105
108
|
x86_64-darwin-21
|
106
109
|
x86_64-linux
|
107
110
|
|
108
111
|
DEPENDENCIES
|
112
|
+
graphql-client (~> 0.19.0)
|
109
113
|
pry-byebug (~> 3.9)
|
110
114
|
rake (~> 13.0)
|
111
115
|
rdiscount
|
data/README.md
CHANGED
@@ -10,11 +10,14 @@ Ruby wrapper for the Weaviate.io API.
|
|
10
10
|
|
11
11
|
Part of the [Langchain.rb](https://github.com/andreibondarev/langchainrb) stack.
|
12
12
|
|
13
|
+
Available for paid consulting engagements! [Email me](mailto:andrei@sourcelabs.io).
|
14
|
+
|
13
15
|
![Tests status](https://github.com/andreibondarev/weaviate-ruby/actions/workflows/ci.yml/badge.svg)
|
14
16
|
[![Gem Version](https://badge.fury.io/rb/weaviate-ruby.svg)](https://badge.fury.io/rb/weaviate-ruby)
|
15
17
|
[![Docs](http://img.shields.io/badge/yard-docs-blue.svg)](http://rubydoc.info/gems/weaviate-ruby)
|
16
18
|
[![License](https://img.shields.io/badge/license-MIT-green.svg)](https://github.com/andreibondarev/weaviate-ruby/blob/main/LICENSE.txt)
|
17
19
|
[![](https://dcbadge.vercel.app/api/server/WDARp7J2n8?compact=true&style=flat)](https://discord.gg/WDARp7J2n8)
|
20
|
+
[![X](https://img.shields.io/twitter/url/https/twitter.com/cloudposse.svg?style=social&label=Follow%20%40rushing_andrei)](https://twitter.com/rushing_andrei)
|
18
21
|
|
19
22
|
## Installation
|
20
23
|
|
@@ -63,7 +66,7 @@ client.schema.create(
|
|
63
66
|
"name": "category"
|
64
67
|
}
|
65
68
|
],
|
66
|
-
# Possible values: 'text2vec-cohere', 'text2vec-openai', 'text2vec-huggingface', 'text2vec-transformers', 'text2vec-contextionary', 'img2vec-neural', 'multi2vec-clip', 'ref2vec-centroid'
|
69
|
+
# Possible values: 'text2vec-cohere', 'text2vec-ollama', 'text2vec-openai', 'text2vec-huggingface', 'text2vec-transformers', 'text2vec-contextionary', 'img2vec-neural', 'multi2vec-clip', 'ref2vec-centroid'
|
67
70
|
vectorizer: "text2vec-openai"
|
68
71
|
)
|
69
72
|
|
@@ -73,9 +76,6 @@ client.schema.get(class_name: 'Question')
|
|
73
76
|
# Get the schema
|
74
77
|
client.schema.list()
|
75
78
|
|
76
|
-
# Remove a class (and all data in the instances) from the schema.
|
77
|
-
client.schema.delete(class_name: 'Question')
|
78
|
-
|
79
79
|
# Update settings of an existing schema class.
|
80
80
|
# Does not support modifying existing properties.
|
81
81
|
client.schema.update(
|
@@ -94,6 +94,51 @@ client.schema.add_property(
|
|
94
94
|
|
95
95
|
# Inspect the shards of a class
|
96
96
|
client.schema.shards(class_name: 'Question')
|
97
|
+
|
98
|
+
# Remove a class (and all data in the instances) from the schema.
|
99
|
+
client.schema.delete(class_name: 'Question')
|
100
|
+
|
101
|
+
# Creating a new data object class in the schema while configuring the vectorizer on the schema and on individual properties (Ollama example)
|
102
|
+
client.schema.create(
|
103
|
+
class_name: 'Question',
|
104
|
+
description: 'Information from a Jeopardy! question',
|
105
|
+
properties: [
|
106
|
+
{
|
107
|
+
"dataType": ["text"],
|
108
|
+
"description": "The question",
|
109
|
+
"name": "question"
|
110
|
+
# By default all properties are included in the vector
|
111
|
+
}, {
|
112
|
+
"dataType": ["text"],
|
113
|
+
"description": "The answer",
|
114
|
+
"name": "answer",
|
115
|
+
"moduleConfig": {
|
116
|
+
"text2vec-ollama": {
|
117
|
+
"skip": false,
|
118
|
+
"vectorizePropertyName": true,
|
119
|
+
},
|
120
|
+
},
|
121
|
+
}, {
|
122
|
+
"dataType": ["text"],
|
123
|
+
"description": "The category",
|
124
|
+
"name": "category",
|
125
|
+
"indexFilterable": true,
|
126
|
+
"indexSearchable": false,
|
127
|
+
"moduleConfig": {
|
128
|
+
"text2vec-ollama": {
|
129
|
+
"skip": true, # Don't include in the vector
|
130
|
+
},
|
131
|
+
},
|
132
|
+
}
|
133
|
+
],
|
134
|
+
vectorizer: "text2vec-ollama",
|
135
|
+
module_config: {
|
136
|
+
"text2vec-ollama": {
|
137
|
+
apiEndpoint: "http://localhost:11434",
|
138
|
+
model: "mxbai-embed-large",
|
139
|
+
},
|
140
|
+
},
|
141
|
+
)
|
97
142
|
```
|
98
143
|
|
99
144
|
### Using the Objects endpoint
|
@@ -296,6 +341,30 @@ client.live?
|
|
296
341
|
client.ready?
|
297
342
|
```
|
298
343
|
|
344
|
+
### Tenants
|
345
|
+
|
346
|
+
Any schema can be multi-tenant
|
347
|
+
|
348
|
+
```ruby
|
349
|
+
client.schema.create(
|
350
|
+
# Other keys...
|
351
|
+
mutli_tenant: true, # passes { enabled: true } to weaviate
|
352
|
+
)
|
353
|
+
```
|
354
|
+
|
355
|
+
You can also manually specify your multi tenancy configuration with a hash
|
356
|
+
|
357
|
+
```ruby
|
358
|
+
client.schema.create(
|
359
|
+
# Other keys...
|
360
|
+
mutli_tenant: { enabled: true, autoTenantCreation: true, autoTenantActivation: true },
|
361
|
+
)
|
362
|
+
```
|
363
|
+
|
364
|
+
See [Weaviate Multi-tenancy operations](https://weaviate.io/developers/weaviate/manage-data/multi-tenancy). Note that the mix of snake case(used by Ruby) and lower camel case(used by Weaviate) is intentional as that hash is passed directly to Weaviate.
|
365
|
+
|
366
|
+
All data methods in this library support an optional `tenant` argument which must be passed if multi-tenancy is enabled on the related collection
|
367
|
+
|
299
368
|
## Development
|
300
369
|
|
301
370
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
data/lib/weaviate/client.rb
CHANGED
data/lib/weaviate/objects.rb
CHANGED
@@ -61,13 +61,15 @@ module Weaviate
|
|
61
61
|
# Batch create objects
|
62
62
|
def batch_create(
|
63
63
|
objects:,
|
64
|
-
consistency_level: nil
|
64
|
+
consistency_level: nil,
|
65
|
+
tenant: nil
|
65
66
|
)
|
66
67
|
validate_consistency_level!(consistency_level) unless consistency_level.nil?
|
67
68
|
|
68
69
|
response = client.connection.post("batch/#{PATH}") do |req|
|
69
70
|
req.params["consistency_level"] = consistency_level.to_s.upcase unless consistency_level.nil?
|
70
71
|
req.body = {objects: objects}
|
72
|
+
req.body["tenant"] = tenant unless tenant.nil?
|
71
73
|
end
|
72
74
|
|
73
75
|
response.body
|
@@ -78,12 +80,14 @@ module Weaviate
|
|
78
80
|
class_name:,
|
79
81
|
id:,
|
80
82
|
include: nil,
|
81
|
-
consistency_level: nil
|
83
|
+
consistency_level: nil,
|
84
|
+
tenant: nil
|
82
85
|
)
|
83
86
|
validate_consistency_level!(consistency_level) unless consistency_level.nil?
|
84
87
|
|
85
88
|
response = client.connection.get("#{PATH}/#{class_name}/#{id}") do |req|
|
86
89
|
req.params["consistency_level"] = consistency_level.to_s.upcase unless consistency_level.nil?
|
90
|
+
req.params["tenant"] = tenant unless tenant.nil?
|
87
91
|
req.params["include"] = include unless include.nil?
|
88
92
|
end
|
89
93
|
|
@@ -94,12 +98,14 @@ module Weaviate
|
|
94
98
|
def exists?(
|
95
99
|
class_name:,
|
96
100
|
id:,
|
97
|
-
consistency_level: nil
|
101
|
+
consistency_level: nil,
|
102
|
+
tenant: nil
|
98
103
|
)
|
99
104
|
validate_consistency_level!(consistency_level) unless consistency_level.nil?
|
100
105
|
|
101
106
|
response = client.connection.head("#{PATH}/#{class_name}/#{id}") do |req|
|
102
107
|
req.params["consistency_level"] = consistency_level.to_s.upcase unless consistency_level.nil?
|
108
|
+
req.params["tenant"] = tenant unless tenant.nil?
|
103
109
|
end
|
104
110
|
|
105
111
|
response.status == 204
|
@@ -111,6 +117,7 @@ module Weaviate
|
|
111
117
|
id:,
|
112
118
|
properties:,
|
113
119
|
vector: nil,
|
120
|
+
tenant: nil,
|
114
121
|
consistency_level: nil
|
115
122
|
)
|
116
123
|
validate_consistency_level!(consistency_level) unless consistency_level.nil?
|
@@ -123,6 +130,7 @@ module Weaviate
|
|
123
130
|
req.body["class"] = class_name
|
124
131
|
req.body["properties"] = properties
|
125
132
|
req.body["vector"] = vector unless vector.nil?
|
133
|
+
req.body["tenant"] = tenant unless tenant.nil?
|
126
134
|
end
|
127
135
|
|
128
136
|
response.body
|
@@ -132,12 +140,14 @@ module Weaviate
|
|
132
140
|
def delete(
|
133
141
|
class_name:,
|
134
142
|
id:,
|
135
|
-
consistency_level: nil
|
143
|
+
consistency_level: nil,
|
144
|
+
tenant: nil
|
136
145
|
)
|
137
146
|
validate_consistency_level!(consistency_level) unless consistency_level.nil?
|
138
147
|
|
139
148
|
response = client.connection.delete("#{PATH}/#{class_name}/#{id}") do |req|
|
140
149
|
req.params["consistency_level"] = consistency_level.to_s.upcase unless consistency_level.nil?
|
150
|
+
req.params["tenant"] = tenant unless tenant.nil?
|
141
151
|
end
|
142
152
|
|
143
153
|
if response.success?
|
@@ -152,14 +162,13 @@ module Weaviate
|
|
152
162
|
where:,
|
153
163
|
consistency_level: nil,
|
154
164
|
output: nil,
|
155
|
-
dry_run: nil
|
165
|
+
dry_run: nil,
|
166
|
+
tenant: nil
|
156
167
|
)
|
157
168
|
path = "batch/#{PATH}"
|
158
169
|
|
159
170
|
unless consistency_level.nil?
|
160
171
|
validate_consistency_level!(consistency_level)
|
161
|
-
|
162
|
-
path << "?consistency_level=#{consistency_level.to_s.upcase}"
|
163
172
|
end
|
164
173
|
|
165
174
|
response = client.connection.delete(path) do |req|
|
@@ -171,6 +180,8 @@ module Weaviate
|
|
171
180
|
}
|
172
181
|
req.body["output"] = output unless output.nil?
|
173
182
|
req.body["dryRun"] = dry_run unless dry_run.nil?
|
183
|
+
req.params["consistency_level"] = consistency_level.to_s.upcase unless consistency_level.nil?
|
184
|
+
req.params["tenant"] = tenant unless tenant.nil?
|
174
185
|
end
|
175
186
|
|
176
187
|
response.body
|
data/lib/weaviate/query.rb
CHANGED
@@ -48,6 +48,7 @@ module Weaviate
|
|
48
48
|
def aggs(
|
49
49
|
class_name:,
|
50
50
|
fields: nil,
|
51
|
+
tenant: nil,
|
51
52
|
where: nil,
|
52
53
|
object_limit: nil,
|
53
54
|
near_text: nil,
|
@@ -59,6 +60,7 @@ module Weaviate
|
|
59
60
|
response = client.graphql.execute(
|
60
61
|
aggs_query(
|
61
62
|
class_name: class_name,
|
63
|
+
tenant: tenant,
|
62
64
|
fields: fields,
|
63
65
|
where: where,
|
64
66
|
near_text: near_text,
|
@@ -164,7 +166,7 @@ module Weaviate
|
|
164
166
|
limit: $limit,
|
165
167
|
offset: $offset,
|
166
168
|
#{(!autocut.nil?) ? "autocut: #{autocut}" : ""},
|
167
|
-
#{(!tenant.nil?) ? "tenant: #{tenant}" : ""},
|
169
|
+
#{(!tenant.nil?) ? "tenant: \"#{tenant}\"" : ""},
|
168
170
|
#{(!near_text.nil?) ? "nearText: #{near_text}" : ""},
|
169
171
|
#{(!near_vector.nil?) ? "nearVector: #{near_vector}" : ""},
|
170
172
|
#{(!near_image.nil?) ? "nearImage: #{near_image}" : ""},
|
@@ -185,6 +187,7 @@ module Weaviate
|
|
185
187
|
def aggs_query(
|
186
188
|
class_name:,
|
187
189
|
fields:,
|
190
|
+
tenant: nil,
|
188
191
|
where: nil,
|
189
192
|
near_text: nil,
|
190
193
|
near_vector: nil,
|
@@ -200,6 +203,7 @@ module Weaviate
|
|
200
203
|
#{class_name}(
|
201
204
|
objectLimit: $object_limit,
|
202
205
|
groupBy: $group_by,
|
206
|
+
#{(!tenant.nil?) ? "tenant: \"#{tenant}\"" : ""},
|
203
207
|
#{(!near_text.nil?) ? "nearText: #{near_text}" : ""},
|
204
208
|
#{(!near_vector.nil?) ? "nearVector: #{near_vector}" : ""},
|
205
209
|
#{(!near_image.nil?) ? "nearImage: #{near_image}" : ""},
|
data/lib/weaviate/schema.rb
CHANGED
@@ -43,7 +43,11 @@ module Weaviate
|
|
43
43
|
req.body["vectorizer"] = vectorizer unless vectorizer.nil?
|
44
44
|
req.body["moduleConfig"] = module_config unless module_config.nil?
|
45
45
|
req.body["properties"] = properties unless properties.nil?
|
46
|
-
|
46
|
+
if multi_tenant.is_a?(Hash)
|
47
|
+
req.body["multiTenancyConfig"] = multi_tenant
|
48
|
+
elsif multi_tenant.present?
|
49
|
+
req.body["multiTenancyConfig"] = {enabled: true}
|
50
|
+
end
|
47
51
|
req.body["invertedIndexConfig"] = inverted_index_config unless inverted_index_config.nil?
|
48
52
|
req.body["replicationConfig"] = replication_config unless replication_config.nil?
|
49
53
|
end
|
data/lib/weaviate/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: weaviate-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrei Bondarev
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-07-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
@@ -138,7 +138,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
138
138
|
- !ruby/object:Gem::Version
|
139
139
|
version: '0'
|
140
140
|
requirements: []
|
141
|
-
rubygems_version: 3.
|
141
|
+
rubygems_version: 3.4.1
|
142
142
|
signing_key:
|
143
143
|
specification_version: 4
|
144
144
|
summary: Ruby wrapper for the Weaviate.io API
|