ruby_conversations 1.0.7 → 1.0.8

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.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +5 -16
  3. data/app/models/concerns/ruby_conversations/conversation_chat.rb +49 -0
  4. data/app/models/concerns/ruby_conversations/conversation_messages.rb +18 -0
  5. data/app/models/{ruby_conversations/concerns → concerns/ruby_conversations}/llm_credentials.rb +1 -0
  6. data/app/models/concerns/ruby_conversations/message_api_attributes.rb +39 -0
  7. data/app/models/concerns/ruby_conversations/message_attributes.rb +44 -0
  8. data/app/models/concerns/ruby_conversations/message_processing.rb +48 -0
  9. data/app/models/{ruby_conversations/concerns → concerns/ruby_conversations}/message_validation.rb +2 -2
  10. data/app/models/concerns/ruby_conversations/storable.rb +13 -0
  11. data/app/models/ruby_conversations/conversation.rb +102 -0
  12. data/app/models/ruby_conversations/message.rb +108 -0
  13. data/app/models/ruby_conversations/message_builder.rb +45 -20
  14. data/app/models/ruby_conversations/message_input.rb +69 -0
  15. data/app/models/ruby_conversations/message_prompt.rb +110 -0
  16. data/app/models/ruby_conversations/prompt.rb +48 -39
  17. data/lib/ruby_conversations/aws_credential_provider.rb +11 -5
  18. data/lib/ruby_conversations/client.rb +90 -0
  19. data/lib/ruby_conversations/configuration.rb +3 -13
  20. data/lib/ruby_conversations/engine.rb +2 -0
  21. data/lib/ruby_conversations/errors.rb +9 -0
  22. data/lib/ruby_conversations/version.rb +1 -1
  23. data/lib/ruby_conversations.rb +15 -42
  24. metadata +43 -81
  25. data/Rakefile +0 -12
  26. data/app/models/concerns/ruby_conversations/messageable.rb +0 -13
  27. data/app/models/concerns/ruby_conversations/versionable.rb +0 -20
  28. data/app/models/ruby_conversations/ai_conversation.rb +0 -91
  29. data/app/models/ruby_conversations/ai_message.rb +0 -28
  30. data/app/models/ruby_conversations/ai_message_input.rb +0 -22
  31. data/app/models/ruby_conversations/ai_message_prompt.rb +0 -28
  32. data/app/models/ruby_conversations/prompt_version.rb +0 -16
  33. data/lib/generators/ruby_conversations/install/install_generator.rb +0 -60
  34. data/lib/generators/ruby_conversations/install/templates/README.md +0 -42
  35. data/lib/generators/ruby_conversations/install/templates/initializer.rb.erb +0 -18
  36. data/lib/generators/ruby_conversations/install/templates/migrations/create_ai_conversations.rb.erb +0 -13
  37. data/lib/generators/ruby_conversations/install/templates/migrations/create_ai_message_inputs.rb.erb +0 -13
  38. data/lib/generators/ruby_conversations/install/templates/migrations/create_ai_message_prompts.rb.erb +0 -18
  39. data/lib/generators/ruby_conversations/install/templates/migrations/create_ai_messages.rb.erb +0 -18
  40. data/lib/generators/ruby_conversations/install/templates/migrations/create_ai_tool_calls.rb.erb +0 -15
  41. data/lib/generators/ruby_conversations/install/templates/migrations/create_prompt_versions.rb.erb +0 -14
  42. data/lib/generators/ruby_conversations/install/templates/migrations/create_prompts.rb.erb +0 -16
  43. data/lib/ruby_conversations/jwt_client.rb +0 -23
  44. data/lib/ruby_conversations/storage/base.rb +0 -28
  45. data/lib/ruby_conversations/storage/local.rb +0 -30
  46. data/lib/ruby_conversations/storage/remote.rb +0 -93
@@ -1,16 +0,0 @@
1
- class CreatePrompts < ActiveRecord::Migration[7.0]
2
- def change
3
- create_table :prompts do |t|
4
- t.text :message
5
- t.string :name
6
- t.string :role
7
- t.float :temperature, default: 0.0
8
- t.string :valid_placeholders
9
-
10
- t.timestamps
11
- end
12
-
13
- add_index :prompts, :name, unique: true
14
- add_index :prompts, :role
15
- end
16
- end
@@ -1,23 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RubyConversations
4
- # Handles JWT encoding and decoding for secure communication.
5
- class JwtClient
6
- def initialize(secret)
7
- @secret = secret
8
- end
9
-
10
- def token
11
- JWT.encode(payload, @secret, 'HS256')
12
- end
13
-
14
- private
15
-
16
- def payload
17
- {
18
- exp: 5.minutes.from_now.to_i,
19
- iat: Time.current.to_i
20
- }
21
- end
22
- end
23
- end
@@ -1,28 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RubyConversations
4
- module Storage
5
- # Abstract base class for storage adapters.
6
- class Base
7
- def remote?
8
- raise NotImplementedError
9
- end
10
-
11
- def store_conversation(_conversation)
12
- raise NotImplementedError
13
- end
14
-
15
- def fetch_conversation(id)
16
- raise NotImplementedError
17
- end
18
-
19
- def fetch_prompt(name)
20
- raise NotImplementedError
21
- end
22
-
23
- def store_prompt(prompt)
24
- raise NotImplementedError
25
- end
26
- end
27
- end
28
- end
@@ -1,30 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RubyConversations
4
- module Storage
5
- # Storage adapter for handling conversations locally using ActiveRecord.
6
- class Local < Base
7
- def remote?
8
- false
9
- end
10
-
11
- def store_conversation(conversation)
12
- # No-op for local storage - ActiveRecord handles it
13
- conversation
14
- end
15
-
16
- def fetch_conversation(id)
17
- RubyConversations.configuration.conversation_class.constantize.find(id)
18
- end
19
-
20
- def fetch_prompt(name)
21
- RubyConversations.configuration.prompt_class.constantize.find_by!(name: name)
22
- end
23
-
24
- def store_prompt(prompt)
25
- # No-op for local storage - ActiveRecord handles it
26
- prompt
27
- end
28
- end
29
- end
30
- end
@@ -1,93 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RubyConversations
4
- module Storage
5
- # Storage adapter for handling conversations via a remote API.
6
- class Remote < Base
7
- def initialize(url:, jwt_secret:)
8
- super()
9
- @url = url
10
- @jwt_client = JwtClient.new(jwt_secret)
11
- end
12
-
13
- def remote?
14
- true
15
- end
16
-
17
- def store_conversation(conversation)
18
- response = client.post(
19
- "#{@url}/api/conversations",
20
- conversation.as_json(conversation_json_options)
21
- )
22
-
23
- update_conversation_from_response(conversation, response.body)
24
- end
25
-
26
- def fetch_conversation(id)
27
- response = client.get("#{@url}/api/conversations/#{id}")
28
- build_conversation_from_response(response.body)
29
- end
30
-
31
- def fetch_prompt(name)
32
- response = client.get("#{@url}/api/prompts/#{name}")
33
- build_prompt_from_response(response.body)
34
- end
35
-
36
- def store_prompt(prompt)
37
- response = client.post(
38
- "#{@url}/api/prompts",
39
- prompt.as_json(include: :versions)
40
- )
41
- build_prompt_from_response(response.body)
42
- end
43
-
44
- private
45
-
46
- def client
47
- @client ||= Faraday.new do |f|
48
- f.request :json
49
- f.response :json
50
- f.adapter Faraday.default_adapter
51
- f.headers['Authorization'] = "Bearer #{@jwt_client.token}"
52
- end
53
- end
54
-
55
- def update_conversation_from_response(conversation, response)
56
- conversation.assign_attributes(
57
- response.except('ai_messages')
58
- )
59
-
60
- response['ai_messages']&.each do |msg_data|
61
- msg = conversation.ai_messages.find { |m| m.id == msg_data['id'] }
62
- msg&.assign_attributes(msg_data.except('ai_message_prompts'))
63
- end
64
-
65
- conversation
66
- end
67
-
68
- def build_conversation_from_response(response)
69
- RubyConversations.configuration.conversation_class.constantize.new(response)
70
- end
71
-
72
- def build_prompt_from_response(response)
73
- RubyConversations.configuration.prompt_class.constantize.new(response)
74
- end
75
-
76
- # rubocop:disable Metrics/MethodLength
77
- def conversation_json_options
78
- {
79
- include: {
80
- ai_messages: {
81
- include: {
82
- ai_message_prompts: {
83
- include: :ai_message_inputs
84
- }
85
- }
86
- }
87
- }
88
- }
89
- end
90
- # rubocop:enable Metrics/MethodLength
91
- end
92
- end
93
- end