ruby_conversations 1.0.7 → 1.0.9
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 +4 -4
- data/README.md +5 -41
- data/app/models/concerns/ruby_conversations/conversation_chat.rb +49 -0
- data/app/models/concerns/ruby_conversations/conversation_messages.rb +18 -0
- data/app/models/{ruby_conversations/concerns → concerns/ruby_conversations}/llm_credentials.rb +1 -0
- data/app/models/concerns/ruby_conversations/message_api_attributes.rb +39 -0
- data/app/models/concerns/ruby_conversations/message_attributes.rb +44 -0
- data/app/models/concerns/ruby_conversations/message_processing.rb +48 -0
- data/app/models/{ruby_conversations/concerns → concerns/ruby_conversations}/message_validation.rb +2 -2
- data/app/models/concerns/ruby_conversations/storable.rb +13 -0
- data/app/models/ruby_conversations/conversation.rb +102 -0
- data/app/models/ruby_conversations/message.rb +108 -0
- data/app/models/ruby_conversations/message_builder.rb +45 -20
- data/app/models/ruby_conversations/message_input.rb +69 -0
- data/app/models/ruby_conversations/message_prompt.rb +110 -0
- data/app/models/ruby_conversations/prompt.rb +48 -39
- data/lib/ruby_conversations/aws_credential_provider.rb +11 -5
- data/lib/ruby_conversations/client.rb +90 -0
- data/lib/ruby_conversations/configuration.rb +3 -13
- data/lib/ruby_conversations/engine.rb +2 -0
- data/lib/ruby_conversations/errors.rb +9 -0
- data/lib/ruby_conversations/version.rb +1 -1
- data/lib/ruby_conversations.rb +15 -42
- metadata +43 -81
- data/Rakefile +0 -12
- data/app/models/concerns/ruby_conversations/messageable.rb +0 -13
- data/app/models/concerns/ruby_conversations/versionable.rb +0 -20
- data/app/models/ruby_conversations/ai_conversation.rb +0 -91
- data/app/models/ruby_conversations/ai_message.rb +0 -28
- data/app/models/ruby_conversations/ai_message_input.rb +0 -22
- data/app/models/ruby_conversations/ai_message_prompt.rb +0 -28
- data/app/models/ruby_conversations/prompt_version.rb +0 -16
- data/lib/generators/ruby_conversations/install/install_generator.rb +0 -60
- data/lib/generators/ruby_conversations/install/templates/README.md +0 -42
- data/lib/generators/ruby_conversations/install/templates/initializer.rb.erb +0 -18
- data/lib/generators/ruby_conversations/install/templates/migrations/create_ai_conversations.rb.erb +0 -13
- data/lib/generators/ruby_conversations/install/templates/migrations/create_ai_message_inputs.rb.erb +0 -13
- data/lib/generators/ruby_conversations/install/templates/migrations/create_ai_message_prompts.rb.erb +0 -18
- data/lib/generators/ruby_conversations/install/templates/migrations/create_ai_messages.rb.erb +0 -18
- data/lib/generators/ruby_conversations/install/templates/migrations/create_ai_tool_calls.rb.erb +0 -15
- data/lib/generators/ruby_conversations/install/templates/migrations/create_prompt_versions.rb.erb +0 -14
- data/lib/generators/ruby_conversations/install/templates/migrations/create_prompts.rb.erb +0 -16
- data/lib/ruby_conversations/jwt_client.rb +0 -23
- data/lib/ruby_conversations/storage/base.rb +0 -28
- data/lib/ruby_conversations/storage/local.rb +0 -30
- 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
|