langchainrb_rails 0.1.11 → 0.1.12

Sign up to get free protection for your applications and to get access to all the features.
Files changed (25) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +4 -0
  3. data/Gemfile +2 -1
  4. data/Gemfile.lock +91 -103
  5. data/README.md +22 -0
  6. data/lib/langchainrb_overrides/assistant.rb +78 -0
  7. data/lib/langchainrb_overrides/message.rb +7 -0
  8. data/lib/langchainrb_rails/generators/langchainrb_rails/assistant_generator.rb +71 -0
  9. data/lib/langchainrb_rails/generators/langchainrb_rails/base_generator.rb +25 -4
  10. data/lib/langchainrb_rails/generators/langchainrb_rails/chroma_generator.rb +1 -2
  11. data/lib/langchainrb_rails/generators/langchainrb_rails/pgvector_generator.rb +2 -2
  12. data/lib/langchainrb_rails/generators/langchainrb_rails/pinecone_generator.rb +1 -2
  13. data/lib/langchainrb_rails/generators/langchainrb_rails/prompt_generator.rb +31 -0
  14. data/lib/langchainrb_rails/generators/langchainrb_rails/qdrant_generator.rb +0 -1
  15. data/lib/langchainrb_rails/generators/langchainrb_rails/templates/assistant/migrations/create_assistants.rb.tt +10 -0
  16. data/lib/langchainrb_rails/generators/langchainrb_rails/templates/assistant/migrations/create_messages.rb.tt +12 -0
  17. data/lib/langchainrb_rails/generators/langchainrb_rails/templates/assistant/models/assistant.rb.tt +9 -0
  18. data/lib/langchainrb_rails/generators/langchainrb_rails/templates/assistant/models/message.rb.tt +5 -0
  19. data/lib/langchainrb_rails/generators/langchainrb_rails/templates/create_prompts.rb.tt +9 -0
  20. data/lib/langchainrb_rails/generators/langchainrb_rails/templates/prompt_model.rb.tt +5 -0
  21. data/lib/langchainrb_rails/prompting.rb +22 -0
  22. data/lib/langchainrb_rails/railtie.rb +2 -0
  23. data/lib/langchainrb_rails/version.rb +1 -1
  24. data/lib/langchainrb_rails.rb +9 -2
  25. metadata +28 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ac7837afbfe4347fbafa41c1cec9f9c6c14a3efe938e75ae611a2ec986a5fe64
4
- data.tar.gz: 55b1a04a984a306d1fdea91c0975b0b4f14a91f0035848032c573f2defdc1b6f
3
+ metadata.gz: 8f7c8d8bece5767488618f3707e15d6df1582c767d72ecfea63511bbf94f5b28
4
+ data.tar.gz: 95ab1ee21ea0dd9dfb35051d6b4e95cd19bfebc0cc789dc6132decb63b4c8b39
5
5
  SHA512:
6
- metadata.gz: 795dd248bf74cfa20e45d2457d43e1833a538a5c399854f41fede624c82fe44d1c7f8e9d7a877776492770910e2431293ab8ab824e447ff2c37aebddc0bef1ac
7
- data.tar.gz: ed8a5c720b6420e5ae8bb9a51b51c11909afd32e6e1726a084554609096a9d051d7da59df4bb06f0fb343f18540843c375a6840db685f3774ccb82e926c2314b
6
+ metadata.gz: 4791c533d1c67ee0f0b4fb49bc6b7cde0c523af86ec9d24d1a121ef7a8050b28cc782be97d8939f69c0b90784920d4df8935bf91715fd261b9d553d222d4c373
7
+ data.tar.gz: 502c1f1b25a3dc257e537fc4b6a37df74a366efe0f357ec245c509f42faa2e92f54b40b0f8992e66f5c40a2ee4f8c0f5c4fd2321651123dbf3baaf89fc341a6d
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.1.12] - 2024-09-20
4
+ - Adding `rails g langchainrb_rails:assistant --llm=...` generator
5
+ - Adding `rails g langchainrb_rails:prompt` generator
6
+
3
7
  ## [0.1.11] - 2024-06-16
4
8
  - Add destroy_from_vectorsearch hook
5
9
 
data/Gemfile CHANGED
@@ -9,10 +9,11 @@ gem "rake", "~> 13.2"
9
9
 
10
10
  gem "rspec", "~> 3.13"
11
11
 
12
- gem "bundler-audit", require: false
13
12
  gem "brakeman", require: false
13
+ gem "bundler-audit", require: false
14
14
  gem "rubocop", require: false
15
15
 
16
16
  gem "standardrb"
17
17
 
18
+ gem "generator_spec"
18
19
  gem "langchainrb"
data/Gemfile.lock CHANGED
@@ -1,41 +1,41 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- langchainrb_rails (0.1.11)
5
- langchainrb (>= 0.7, < 0.14)
4
+ langchainrb_rails (0.1.12)
5
+ langchainrb (>= 0.7, < 0.17)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- actioncable (7.1.3.4)
11
- actionpack (= 7.1.3.4)
12
- activesupport (= 7.1.3.4)
10
+ actioncable (7.1.4)
11
+ actionpack (= 7.1.4)
12
+ activesupport (= 7.1.4)
13
13
  nio4r (~> 2.0)
14
14
  websocket-driver (>= 0.6.1)
15
15
  zeitwerk (~> 2.6)
16
- actionmailbox (7.1.3.4)
17
- actionpack (= 7.1.3.4)
18
- activejob (= 7.1.3.4)
19
- activerecord (= 7.1.3.4)
20
- activestorage (= 7.1.3.4)
21
- activesupport (= 7.1.3.4)
16
+ actionmailbox (7.1.4)
17
+ actionpack (= 7.1.4)
18
+ activejob (= 7.1.4)
19
+ activerecord (= 7.1.4)
20
+ activestorage (= 7.1.4)
21
+ activesupport (= 7.1.4)
22
22
  mail (>= 2.7.1)
23
23
  net-imap
24
24
  net-pop
25
25
  net-smtp
26
- actionmailer (7.1.3.4)
27
- actionpack (= 7.1.3.4)
28
- actionview (= 7.1.3.4)
29
- activejob (= 7.1.3.4)
30
- activesupport (= 7.1.3.4)
26
+ actionmailer (7.1.4)
27
+ actionpack (= 7.1.4)
28
+ actionview (= 7.1.4)
29
+ activejob (= 7.1.4)
30
+ activesupport (= 7.1.4)
31
31
  mail (~> 2.5, >= 2.5.4)
32
32
  net-imap
33
33
  net-pop
34
34
  net-smtp
35
35
  rails-dom-testing (~> 2.2)
36
- actionpack (7.1.3.4)
37
- actionview (= 7.1.3.4)
38
- activesupport (= 7.1.3.4)
36
+ actionpack (7.1.4)
37
+ actionview (= 7.1.4)
38
+ activesupport (= 7.1.4)
39
39
  nokogiri (>= 1.8.5)
40
40
  racc
41
41
  rack (>= 2.2.4)
@@ -43,35 +43,35 @@ GEM
43
43
  rack-test (>= 0.6.3)
44
44
  rails-dom-testing (~> 2.2)
45
45
  rails-html-sanitizer (~> 1.6)
46
- actiontext (7.1.3.4)
47
- actionpack (= 7.1.3.4)
48
- activerecord (= 7.1.3.4)
49
- activestorage (= 7.1.3.4)
50
- activesupport (= 7.1.3.4)
46
+ actiontext (7.1.4)
47
+ actionpack (= 7.1.4)
48
+ activerecord (= 7.1.4)
49
+ activestorage (= 7.1.4)
50
+ activesupport (= 7.1.4)
51
51
  globalid (>= 0.6.0)
52
52
  nokogiri (>= 1.8.5)
53
- actionview (7.1.3.4)
54
- activesupport (= 7.1.3.4)
53
+ actionview (7.1.4)
54
+ activesupport (= 7.1.4)
55
55
  builder (~> 3.1)
56
56
  erubi (~> 1.11)
57
57
  rails-dom-testing (~> 2.2)
58
58
  rails-html-sanitizer (~> 1.6)
59
- activejob (7.1.3.4)
60
- activesupport (= 7.1.3.4)
59
+ activejob (7.1.4)
60
+ activesupport (= 7.1.4)
61
61
  globalid (>= 0.3.6)
62
- activemodel (7.1.3.4)
63
- activesupport (= 7.1.3.4)
64
- activerecord (7.1.3.4)
65
- activemodel (= 7.1.3.4)
66
- activesupport (= 7.1.3.4)
62
+ activemodel (7.1.4)
63
+ activesupport (= 7.1.4)
64
+ activerecord (7.1.4)
65
+ activemodel (= 7.1.4)
66
+ activesupport (= 7.1.4)
67
67
  timeout (>= 0.4.0)
68
- activestorage (7.1.3.4)
69
- actionpack (= 7.1.3.4)
70
- activejob (= 7.1.3.4)
71
- activerecord (= 7.1.3.4)
72
- activesupport (= 7.1.3.4)
68
+ activestorage (7.1.4)
69
+ actionpack (= 7.1.4)
70
+ activejob (= 7.1.4)
71
+ activerecord (= 7.1.4)
72
+ activesupport (= 7.1.4)
73
73
  marcel (~> 1.0)
74
- activesupport (7.1.3.4)
74
+ activesupport (7.1.4)
75
75
  base64
76
76
  bigdecimal
77
77
  concurrent-ruby (~> 1.0, >= 1.0.2)
@@ -81,48 +81,47 @@ GEM
81
81
  minitest (>= 5.1)
82
82
  mutex_m
83
83
  tzinfo (~> 2.0)
84
- addressable (2.8.6)
85
- public_suffix (>= 2.0.2, < 6.0)
84
+ addressable (2.8.7)
85
+ public_suffix (>= 2.0.2, < 7.0)
86
86
  ast (2.4.2)
87
- baran (0.1.11)
87
+ baran (0.1.12)
88
88
  base64 (0.2.0)
89
89
  bigdecimal (3.1.8)
90
- brakeman (6.1.2)
90
+ brakeman (6.2.1)
91
91
  racc
92
92
  builder (3.3.0)
93
- bundler-audit (0.9.1)
93
+ bundler-audit (0.9.2)
94
94
  bundler (>= 1.2.0, < 3)
95
95
  thor (~> 1.0)
96
96
  byebug (11.1.3)
97
97
  coderay (1.1.3)
98
- colorize (1.1.0)
99
- concurrent-ruby (1.3.3)
98
+ concurrent-ruby (1.3.4)
100
99
  connection_pool (2.4.1)
101
100
  crass (1.0.6)
102
101
  date (3.3.4)
103
102
  diff-lcs (1.5.1)
104
103
  drb (2.2.1)
105
- erubi (1.12.0)
104
+ erubi (1.13.0)
105
+ generator_spec (0.10.0)
106
+ activesupport (>= 3.0.0)
107
+ railties (>= 3.0.0)
106
108
  globalid (1.2.1)
107
109
  activesupport (>= 6.1)
108
- i18n (1.14.5)
110
+ i18n (1.14.6)
109
111
  concurrent-ruby (~> 1.0)
110
112
  io-console (0.7.2)
111
- irb (1.13.1)
113
+ irb (1.14.0)
112
114
  rdoc (>= 4.0.0)
113
115
  reline (>= 0.4.2)
114
116
  json (2.7.2)
115
- json-schema (4.3.0)
117
+ json-schema (4.3.1)
116
118
  addressable (>= 2.8)
117
- langchainrb (0.11.4)
118
- activesupport (>= 7.0.8)
119
+ langchainrb (0.16.0)
119
120
  baran (~> 0.1.9)
120
- colorize (~> 1.1.0)
121
121
  json-schema (~> 4)
122
122
  matrix
123
123
  pragmatic_segmenter (~> 0.3.0)
124
- tiktoken_ruby (~> 0.0.8)
125
- to_bool (~> 2.0.0)
124
+ rainbow (~> 3.1.0)
126
125
  zeitwerk (~> 2.5)
127
126
  language_server-protocol (3.17.0.3)
128
127
  lint_roller (1.1.0)
@@ -139,9 +138,9 @@ GEM
139
138
  method_source (1.0.0)
140
139
  mini_mime (1.1.5)
141
140
  mini_portile2 (2.8.7)
142
- minitest (5.23.1)
141
+ minitest (5.25.1)
143
142
  mutex_m (0.2.0)
144
- net-imap (0.4.12)
143
+ net-imap (0.4.16)
145
144
  date
146
145
  net-protocol
147
146
  net-pop (0.1.2)
@@ -151,19 +150,18 @@ GEM
151
150
  net-smtp (0.5.0)
152
151
  net-protocol
153
152
  nio4r (2.7.3)
154
- nokogiri (1.16.5)
153
+ nokogiri (1.16.7)
155
154
  mini_portile2 (~> 2.8.2)
156
155
  racc (~> 1.4)
157
- nokogiri (1.16.5-x86_64-darwin)
156
+ nokogiri (1.16.7-x86_64-darwin)
158
157
  racc (~> 1.4)
159
- nokogiri (1.16.5-x86_64-linux)
158
+ nokogiri (1.16.7-x86_64-linux)
160
159
  racc (~> 1.4)
161
- parallel (1.24.0)
162
- parser (3.3.1.0)
160
+ parallel (1.26.3)
161
+ parser (3.3.5.0)
163
162
  ast (~> 2.4.1)
164
163
  racc
165
- pragmatic_segmenter (0.3.23)
166
- unicode
164
+ pragmatic_segmenter (0.3.24)
167
165
  pry (0.14.2)
168
166
  coderay (~> 1.1)
169
167
  method_source (~> 1.0)
@@ -172,9 +170,9 @@ GEM
172
170
  pry (>= 0.13, < 0.15)
173
171
  psych (5.1.2)
174
172
  stringio
175
- public_suffix (5.0.5)
176
- racc (1.8.0)
177
- rack (3.0.11)
173
+ public_suffix (6.0.1)
174
+ racc (1.8.1)
175
+ rack (3.1.7)
178
176
  rack-session (2.0.0)
179
177
  rack (>= 3.0.0)
180
178
  rack-test (2.1.0)
@@ -182,20 +180,20 @@ GEM
182
180
  rackup (2.1.0)
183
181
  rack (>= 3)
184
182
  webrick (~> 1.8)
185
- rails (7.1.3.4)
186
- actioncable (= 7.1.3.4)
187
- actionmailbox (= 7.1.3.4)
188
- actionmailer (= 7.1.3.4)
189
- actionpack (= 7.1.3.4)
190
- actiontext (= 7.1.3.4)
191
- actionview (= 7.1.3.4)
192
- activejob (= 7.1.3.4)
193
- activemodel (= 7.1.3.4)
194
- activerecord (= 7.1.3.4)
195
- activestorage (= 7.1.3.4)
196
- activesupport (= 7.1.3.4)
183
+ rails (7.1.4)
184
+ actioncable (= 7.1.4)
185
+ actionmailbox (= 7.1.4)
186
+ actionmailer (= 7.1.4)
187
+ actionpack (= 7.1.4)
188
+ actiontext (= 7.1.4)
189
+ actionview (= 7.1.4)
190
+ activejob (= 7.1.4)
191
+ activemodel (= 7.1.4)
192
+ activerecord (= 7.1.4)
193
+ activestorage (= 7.1.4)
194
+ activesupport (= 7.1.4)
197
195
  bundler (>= 1.15.0)
198
- railties (= 7.1.3.4)
196
+ railties (= 7.1.4)
199
197
  rails-dom-testing (2.2.0)
200
198
  activesupport (>= 5.0.0)
201
199
  minitest
@@ -203,9 +201,9 @@ GEM
203
201
  rails-html-sanitizer (1.6.0)
204
202
  loofah (~> 2.21)
205
203
  nokogiri (~> 1.14)
206
- railties (7.1.3.4)
207
- actionpack (= 7.1.3.4)
208
- activesupport (= 7.1.3.4)
204
+ railties (7.1.4)
205
+ actionpack (= 7.1.4)
206
+ activesupport (= 7.1.4)
209
207
  irb
210
208
  rackup (>= 1.0.0)
211
209
  rake (>= 12.2)
@@ -213,14 +211,11 @@ GEM
213
211
  zeitwerk (~> 2.6)
214
212
  rainbow (3.1.1)
215
213
  rake (13.2.1)
216
- rb_sys (0.9.96)
217
214
  rdoc (6.7.0)
218
215
  psych (>= 4.0.0)
219
216
  regexp_parser (2.9.2)
220
- reline (0.5.8)
217
+ reline (0.5.10)
221
218
  io-console (~> 0.5)
222
- rexml (3.2.8)
223
- strscan (>= 3.0.9)
224
219
  rspec (3.13.0)
225
220
  rspec-core (~> 3.13.0)
226
221
  rspec-expectations (~> 3.13.0)
@@ -234,18 +229,17 @@ GEM
234
229
  diff-lcs (>= 1.2.0, < 2.0)
235
230
  rspec-support (~> 3.13.0)
236
231
  rspec-support (3.13.0)
237
- rubocop (1.64.0)
232
+ rubocop (1.66.1)
238
233
  json (~> 2.3)
239
234
  language_server-protocol (>= 3.17.0)
240
235
  parallel (~> 1.10)
241
236
  parser (>= 3.3.0.2)
242
237
  rainbow (>= 2.2.2, < 4.0)
243
- regexp_parser (>= 1.8, < 3.0)
244
- rexml (>= 3.2.5, < 4.0)
245
- rubocop-ast (>= 1.31.1, < 2.0)
238
+ regexp_parser (>= 2.4, < 3.0)
239
+ rubocop-ast (>= 1.32.2, < 2.0)
246
240
  ruby-progressbar (~> 1.7)
247
241
  unicode-display_width (>= 2.4.0, < 3.0)
248
- rubocop-ast (1.31.3)
242
+ rubocop-ast (1.32.3)
249
243
  parser (>= 3.3.1.0)
250
244
  rubocop-performance (1.20.1)
251
245
  rubocop (>= 1.48.1, < 2.0)
@@ -265,25 +259,18 @@ GEM
265
259
  rubocop-performance (~> 1.20.1)
266
260
  standardrb (1.0.1)
267
261
  standard
268
- stringio (3.1.0)
269
- strscan (3.1.0)
270
- thor (1.3.1)
271
- tiktoken_ruby (0.0.8)
272
- rb_sys (>= 0.9.86)
273
- tiktoken_ruby (0.0.8-x86_64-darwin)
274
- tiktoken_ruby (0.0.8-x86_64-linux)
262
+ stringio (3.1.1)
263
+ thor (1.3.2)
275
264
  timeout (0.4.1)
276
- to_bool (2.0.0)
277
265
  tzinfo (2.0.6)
278
266
  concurrent-ruby (~> 1.0)
279
- unicode (0.4.4.4)
280
267
  unicode-display_width (2.5.0)
281
268
  webrick (1.8.1)
282
269
  websocket-driver (0.7.6)
283
270
  websocket-extensions (>= 0.1.0)
284
271
  websocket-extensions (0.1.5)
285
- yard (0.9.36)
286
- zeitwerk (2.6.15)
272
+ yard (0.9.37)
273
+ zeitwerk (2.6.18)
287
274
 
288
275
  PLATFORMS
289
276
  ruby
@@ -294,6 +281,7 @@ PLATFORMS
294
281
  DEPENDENCIES
295
282
  brakeman
296
283
  bundler-audit
284
+ generator_spec
297
285
  langchainrb
298
286
  langchainrb_rails!
299
287
  pry-byebug (~> 3.10.0)
data/README.md CHANGED
@@ -129,3 +129,25 @@ Pinecone Generator does the following:
129
129
  2. Adds necessary code to the ActiveRecord model to enable vectorsearch
130
130
  3. Adds `pinecone` gem to the Gemfile
131
131
 
132
+ ### Prompt Generator - adds prompt templating capabilities to your ActiveRecord model
133
+ ```bash
134
+ rails generate langchainrb_rails:prompt
135
+ ```
136
+
137
+ This generator adds the following files to your Rails project:
138
+ 1. An ActiveRecord `Prompt` model at `app/models/prompt.rb`
139
+ 2. A rails migration to create the `prompts` table
140
+
141
+ You can then use the `Prompt` model to create and manage prompts for your model.
142
+
143
+ Example usage:
144
+ ```ruby
145
+ prompt = Prompt.create!(template: "Tell me a {adjective} joke about {subject}.")
146
+ prompt.render(adjective: "funny", subject: "elephants")
147
+ # => "Tell me a funny joke about elephants."
148
+ ```
149
+
150
+ ### Assistant Generator - adds assistant capabilities to your ActiveRecord model
151
+ ```bash
152
+ rails generate langchainrb_rails:assistant
153
+ ```
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record"
4
+
5
+ module Langchain
6
+ class Assistant
7
+ attr_accessor :id
8
+
9
+ alias_method :original_initialize, :initialize
10
+
11
+ def initialize(id: nil, **kwargs) # rubocop:disable Style/ArgumentsForwarding
12
+ @id = id
13
+ original_initialize(**kwargs) # rubocop:disable Style/ArgumentsForwarding
14
+ end
15
+
16
+ def save
17
+ ::ActiveRecord::Base.transaction do
18
+ ar_assistant = if id
19
+ self.class.find_assistant(id)
20
+ else
21
+ ::Assistant.new
22
+ end
23
+
24
+ ar_assistant.update!(
25
+ instructions: instructions,
26
+ tool_choice: tool_choice,
27
+ tools: tools.map(&:class).map(&:name)
28
+ )
29
+
30
+ messages.each do |message|
31
+ ar_message = ar_assistant.messages.find_or_initialize_by(id: message.id)
32
+ ar_message.update!(
33
+ role: message.role,
34
+ content: message.content,
35
+ tool_calls: message.tool_calls,
36
+ tool_call_id: message.tool_call_id
37
+ )
38
+ message.id = ar_message.id
39
+ end
40
+
41
+ @id = ar_assistant.id
42
+ true
43
+ end
44
+ end
45
+
46
+ class << self
47
+ def find_assistant(id)
48
+ ::Assistant.find(id)
49
+ end
50
+
51
+ def load(id)
52
+ ar_assistant = find_assistant(id)
53
+
54
+ tools = ar_assistant.tools.map { |tool_name| Object.const_get(tool_name).new }
55
+
56
+ assistant = Langchain::Assistant.new(
57
+ id: ar_assistant.id,
58
+ llm: ar_assistant.llm,
59
+ tools: tools,
60
+ instructions: ar_assistant.instructions,
61
+ tool_choice: ar_assistant.tool_choice
62
+ )
63
+
64
+ ar_assistant.messages.each do |ar_message|
65
+ messages = assistant.add_message(
66
+ role: ar_message.role,
67
+ content: ar_message.content,
68
+ tool_calls: ar_message.tool_calls,
69
+ tool_call_id: ar_message.tool_call_id
70
+ )
71
+ messages.last.id = ar_message.id
72
+ end
73
+
74
+ assistant
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,7 @@
1
+ module Langchain
2
+ module Messages
3
+ class Base
4
+ attr_accessor :id
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails/generators"
4
+ require "rails/generators/active_record"
5
+
6
+ module LangchainrbRails
7
+ module Generators
8
+ #
9
+ # Usage:
10
+ # rails generate langchainrb_rails:assistant --llm=openai
11
+ #
12
+ class AssistantGenerator < Rails::Generators::Base
13
+ include ::ActiveRecord::Generators::Migration
14
+
15
+ # TODO: Move constant this to a shared place
16
+ LLMS = {
17
+ "anthropic" => "Langchain::LLM::Anthropic",
18
+ "cohere" => "Langchain::LLM::Cohere",
19
+ "google_palm" => "Langchain::LLM::GooglePalm",
20
+ "google_gemini" => "Langchain::LLM::GoogleGemini",
21
+ "google_vertex_ai" => "Langchain::LLM::GoogleVertexAI",
22
+ "hugging_face" => "Langchain::LLM::HuggingFace",
23
+ "llama_cpp" => "Langchain::LLM::LlamaCpp",
24
+ "mistral_ai" => "Langchain::LLM::MistralAI",
25
+ "ollama" => "Langchain::LLM::Ollama",
26
+ "openai" => "Langchain::LLM::OpenAI",
27
+ "replicate" => "Langchain::LLM::Replicate"
28
+ }.freeze
29
+
30
+ class_option :llm,
31
+ type: :string,
32
+ required: true,
33
+ default: "openai",
34
+ desc: "LLM provider that will be used to generate embeddings and completions",
35
+ enum: LLMS.keys
36
+
37
+ desc "This generator adds Assistant and Message models and tables to your Rails app"
38
+ source_root File.join(__dir__, "templates")
39
+
40
+ def copy_migration
41
+ migration_template "assistant/migrations/create_assistants.rb", "db/migrate/create_assistants.rb", migration_version: migration_version
42
+ migration_template "assistant/migrations/create_messages.rb", "db/migrate/create_messages.rb", migration_version: migration_version
43
+ end
44
+
45
+ def create_model_file
46
+ template "assistant/models/assistant.rb", "app/models/assistant.rb"
47
+ template "assistant/models/message.rb", "app/models/message.rb"
48
+ end
49
+
50
+ def migration_version
51
+ "[#{::ActiveRecord::VERSION::MAJOR}.#{::ActiveRecord::VERSION::MINOR}]"
52
+ end
53
+
54
+ # TODO: Depending on the LLM provider, we may need to add additional gems
55
+ # def add_to_gemfile
56
+ # end
57
+
58
+ private
59
+
60
+ # @return [String] LLM provider to use
61
+ def llm
62
+ options["llm"]
63
+ end
64
+
65
+ # @return [Langchain::LLM::*] LLM class
66
+ def llm_class
67
+ Langchain::LLM.const_get(LLMS[llm])
68
+ end
69
+ end
70
+ end
71
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "rails/generators"
2
4
  require "rails/generators/active_record"
3
5
 
@@ -6,19 +8,38 @@ module LangchainrbRails
6
8
  class BaseGenerator < Rails::Generators::Base
7
9
  include ::ActiveRecord::Generators::Migration
8
10
 
9
- class_option :model, type: :string, required: true, desc: "ActiveRecord Model to add vectorsearch to", aliases: "-m"
10
- class_option :llm, type: :string, required: true, desc: "LLM provider that will be used to generate embeddings and completions"
11
-
12
11
  # Available LLM providers to be passed in as --llm option
13
12
  LLMS = {
13
+ "anthropic" => "Langchain::LLM::Anthropic",
14
14
  "cohere" => "Langchain::LLM::Cohere",
15
15
  "google_palm" => "Langchain::LLM::GooglePalm",
16
+ "google_gemini" => "Langchain::LLM::GoogleGemini",
17
+ "google_vertex_ai" => "Langchain::LLM::GoogleVertexAI",
16
18
  "hugging_face" => "Langchain::LLM::HuggingFace",
17
19
  "llama_cpp" => "Langchain::LLM::LlamaCpp",
20
+ "mistral_ai" => "Langchain::LLM::MistralAI",
18
21
  "ollama" => "Langchain::LLM::Ollama",
19
22
  "openai" => "Langchain::LLM::OpenAI",
20
23
  "replicate" => "Langchain::LLM::Replicate"
21
- }
24
+ }.freeze
25
+
26
+ class_option :model,
27
+ type: :string,
28
+ required: true,
29
+ aliases: "-m",
30
+ desc: "ActiveRecord Model to add vectorsearch to"
31
+
32
+ class_option :llm,
33
+ type: :string,
34
+ required: true,
35
+ default: "openai",
36
+ desc: "LLM provider that will be used to generate embeddings and completions",
37
+ enum: LLMS.keys
38
+
39
+ # Run bundle install after running the generator
40
+ def after_generate
41
+ run "bundle install"
42
+ end
22
43
 
23
44
  def post_install_message
24
45
  say "Please do the following to start Q&A with your #{model_name} records:", :green
@@ -28,9 +28,8 @@ module LangchainrbRails
28
28
  end
29
29
 
30
30
  # Adds `chroma-db` gem to the Gemfile
31
- # TODO: Can we automatically run `bundle install`?
32
31
  def add_to_gemfile
33
- gem "chroma-db", version: "~> 0.6.0"
32
+ gem "chroma-db"
34
33
  end
35
34
 
36
35
  private
@@ -24,7 +24,7 @@ module LangchainrbRails
24
24
  end
25
25
 
26
26
  def add_to_model
27
- inject_into_class "app/models/#{model_name.downcase}.rb", model_name do
27
+ inject_into_class "app/models/#{model_name.underscore}.rb", model_name do
28
28
  " vectorsearch\n\n after_save :upsert_to_vectorsearch\n\n"
29
29
  end
30
30
  end
@@ -44,7 +44,7 @@ module LangchainrbRails
44
44
 
45
45
  # @return [String] Table name of the model
46
46
  def table_name
47
- model_name.downcase.pluralize
47
+ model_name.tableize
48
48
  end
49
49
 
50
50
  # @return [String] LLM provider to use
@@ -28,9 +28,8 @@ module LangchainrbRails
28
28
  end
29
29
 
30
30
  # Adds `pinecone` gem to the Gemfile
31
- # TODO: Can we automatically run `bundle install`?
32
31
  def add_to_gemfile
33
- gem "pinecone", version: "~> 0.1.6"
32
+ gem "pinecone"
34
33
  end
35
34
 
36
35
  private
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails/generators"
4
+ require "rails/generators/active_record"
5
+
6
+ module LangchainrbRails
7
+ module Generators
8
+ # Adds prompt templating capabilities to your ActiveRecord model
9
+ #
10
+ # Usage:
11
+ # rails generate langchainrb_rails:prompt
12
+ #
13
+ class PromptGenerator < Rails::Generators::Base
14
+ include ::ActiveRecord::Generators::Migration
15
+
16
+ source_root File.join(__dir__, "templates")
17
+
18
+ def create_model_file
19
+ template "prompt_model.rb", "app/models/prompt.rb"
20
+ end
21
+
22
+ def copy_migration
23
+ migration_template "create_prompts.rb", "db/migrate/create_prompts.rb", migration_version: migration_version
24
+ end
25
+
26
+ def migration_version
27
+ "[#{::ActiveRecord::VERSION::MAJOR}.#{::ActiveRecord::VERSION::MINOR}]"
28
+ end
29
+ end
30
+ end
31
+ end
@@ -28,7 +28,6 @@ module LangchainrbRails
28
28
  end
29
29
 
30
30
  # Adds `qdrant-ruby` gem to the Gemfile
31
- # TODO: Can we automatically run `bundle install`?
32
31
  def add_to_gemfile
33
32
  gem "qdrant-ruby"
34
33
  end
@@ -0,0 +1,10 @@
1
+ class <%= migration_class_name %> < ActiveRecord::Migration<%= migration_version %>
2
+ def change
3
+ create_table :assistants do |t|
4
+ t.string :instructions
5
+ t.string :tool_choice
6
+ t.json :tools
7
+ t.timestamps
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,12 @@
1
+ class <%= migration_class_name %> < ActiveRecord::Migration<%= migration_version %>
2
+ def change
3
+ create_table :messages do |t|
4
+ t.references :assistant, foreign_key: true
5
+ t.string :role
6
+ t.text :content
7
+ t.json :tool_calls
8
+ t.string :tool_call_id
9
+ t.timestamps
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Assistant < ActiveRecord::Base
4
+ has_many :messages
5
+
6
+ def llm
7
+ <%= llm_class %>.new(api_key: ENV["<%= llm.upcase %>_API_KEY"])
8
+ end
9
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Message < ActiveRecord::Base
4
+ belongs_to :assistant
5
+ end
@@ -0,0 +1,9 @@
1
+ class CreatePrompts < ActiveRecord::Migration<%= migration_version %>
2
+ def change
3
+ create_table :prompts do |t|
4
+ t.text :template, null: false
5
+
6
+ t.timestamps
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Prompt < ApplicationRecord
4
+ include LangchainrbRails::Prompting
5
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LangchainrbRails
4
+ module Prompting
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ validates :template, presence: true
9
+
10
+ def render(variables = {})
11
+ template.gsub(/\{(\w+)\}/) do |match|
12
+ variable = ::Regexp.last_match(1).to_sym
13
+ variables.fetch(variable, match)
14
+ end
15
+ end
16
+
17
+ def template_variables
18
+ template.scan(/\{(\w+)\}/).flatten.uniq
19
+ end
20
+ end
21
+ end
22
+ end
@@ -9,10 +9,12 @@ module LangchainrbRails
9
9
  end
10
10
 
11
11
  generators do
12
+ require_relative "generators/langchainrb_rails/assistant_generator"
12
13
  require_relative "generators/langchainrb_rails/chroma_generator"
13
14
  require_relative "generators/langchainrb_rails/pinecone_generator"
14
15
  require_relative "generators/langchainrb_rails/pgvector_generator"
15
16
  require_relative "generators/langchainrb_rails/qdrant_generator"
17
+ require_relative "generators/langchainrb_rails/prompt_generator"
16
18
  end
17
19
  end
18
20
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module LangchainrbRails
4
- VERSION = "0.1.11"
4
+ VERSION = "0.1.12"
5
5
  end
@@ -3,10 +3,15 @@
3
3
  require "forwardable"
4
4
  require "langchain"
5
5
  require "rails"
6
- require_relative "langchainrb_rails/version"
7
- require "langchainrb_rails/railtie"
6
+
8
7
  require "langchainrb_rails/config"
8
+ require "langchainrb_rails/prompting"
9
+ require "langchainrb_rails/railtie"
10
+ require "langchainrb_rails/version"
11
+
9
12
  require_relative "langchainrb_overrides/vectorsearch/pgvector"
13
+ require_relative "langchainrb_overrides/assistant"
14
+ require_relative "langchainrb_overrides/message"
10
15
 
11
16
  module LangchainrbRails
12
17
  class Error < StandardError; end
@@ -17,9 +22,11 @@ module LangchainrbRails
17
22
 
18
23
  module Generators
19
24
  autoload :BaseGenerator, "langchainrb_rails/generators/langchainrb_rails/base_generator"
25
+ autoload :AssistantGenerator, "langchainrb_rails/generators/langchainrb_rails/assistant_generator"
20
26
  autoload :ChromaGenerator, "langchainrb_rails/generators/langchainrb_rails/chroma_generator"
21
27
  autoload :PgvectorGenerator, "langchainrb_rails/generators/langchainrb_rails/pgvector_generator"
22
28
  autoload :QdrantGenerator, "langchainrb_rails/generators/langchainrb_rails/qdrant_generator"
29
+ autoload :PromptGenerator, "langchainrb_rails/generators/langchainrb_rails/prompt_generator"
23
30
  end
24
31
 
25
32
  class << self
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: langchainrb_rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.11
4
+ version: 0.1.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrei Bondarev
@@ -19,7 +19,7 @@ dependencies:
19
19
  version: '0.7'
20
20
  - - "<"
21
21
  - !ruby/object:Gem::Version
22
- version: '0.14'
22
+ version: '0.17'
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -29,7 +29,7 @@ dependencies:
29
29
  version: '0.7'
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
- version: '0.14'
32
+ version: '0.17'
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: pry-byebug
35
35
  requirement: !ruby/object:Gem::Requirement
@@ -72,6 +72,20 @@ dependencies:
72
72
  - - ">"
73
73
  - !ruby/object:Gem::Version
74
74
  version: 6.0.0
75
+ - !ruby/object:Gem::Dependency
76
+ name: generator_spec
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
75
89
  description: Rails wrapper for langchainrb gem
76
90
  email:
77
91
  - andrei.bondarev13@gmail.com
@@ -88,21 +102,32 @@ files:
88
102
  - LICENSE.txt
89
103
  - README.md
90
104
  - Rakefile
105
+ - lib/langchainrb_overrides/assistant.rb
106
+ - lib/langchainrb_overrides/message.rb
91
107
  - lib/langchainrb_overrides/vectorsearch/pgvector.rb
92
108
  - lib/langchainrb_rails.rb
93
109
  - lib/langchainrb_rails/active_record/hooks.rb
94
110
  - lib/langchainrb_rails/config.rb
111
+ - lib/langchainrb_rails/generators/langchainrb_rails/assistant_generator.rb
95
112
  - lib/langchainrb_rails/generators/langchainrb_rails/base_generator.rb
96
113
  - lib/langchainrb_rails/generators/langchainrb_rails/chroma_generator.rb
97
114
  - lib/langchainrb_rails/generators/langchainrb_rails/pgvector_generator.rb
98
115
  - lib/langchainrb_rails/generators/langchainrb_rails/pinecone_generator.rb
116
+ - lib/langchainrb_rails/generators/langchainrb_rails/prompt_generator.rb
99
117
  - lib/langchainrb_rails/generators/langchainrb_rails/qdrant_generator.rb
100
118
  - lib/langchainrb_rails/generators/langchainrb_rails/templates/add_vector_column_template.rb.tt
119
+ - lib/langchainrb_rails/generators/langchainrb_rails/templates/assistant/migrations/create_assistants.rb.tt
120
+ - lib/langchainrb_rails/generators/langchainrb_rails/templates/assistant/migrations/create_messages.rb.tt
121
+ - lib/langchainrb_rails/generators/langchainrb_rails/templates/assistant/models/assistant.rb.tt
122
+ - lib/langchainrb_rails/generators/langchainrb_rails/templates/assistant/models/message.rb.tt
101
123
  - lib/langchainrb_rails/generators/langchainrb_rails/templates/chroma_initializer.rb.tt
124
+ - lib/langchainrb_rails/generators/langchainrb_rails/templates/create_prompts.rb.tt
102
125
  - lib/langchainrb_rails/generators/langchainrb_rails/templates/enable_vector_extension_template.rb.tt
103
126
  - lib/langchainrb_rails/generators/langchainrb_rails/templates/pgvector_initializer.rb.tt
104
127
  - lib/langchainrb_rails/generators/langchainrb_rails/templates/pinecone_initializer.rb.tt
128
+ - lib/langchainrb_rails/generators/langchainrb_rails/templates/prompt_model.rb.tt
105
129
  - lib/langchainrb_rails/generators/langchainrb_rails/templates/qdrant_initializer.rb.tt
130
+ - lib/langchainrb_rails/prompting.rb
106
131
  - lib/langchainrb_rails/railtie.rb
107
132
  - lib/langchainrb_rails/version.rb
108
133
  - sig/langchainrb_rails.rbs