layered-assistant-rails 0.2.2 → 0.3.0
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/app/controllers/layered/assistant/assistants_controller.rb +1 -1
- data/app/models/layered/assistant/conversation.rb +9 -0
- data/app/services/layered/assistant/client_service.rb +1 -3
- data/app/services/layered/assistant/clients/anthropic.rb +2 -2
- data/app/services/layered/assistant/clients/base.rb +1 -1
- data/app/services/layered/assistant/clients/openai.rb +2 -2
- data/app/services/layered/assistant/messages_service.rb +5 -7
- data/app/views/layered/assistant/assistants/_form.html.erb +3 -3
- data/app/views/layered/assistant/conversations/show.html.erb +0 -1
- data/app/views/layered/assistant/panel/conversations/show.html.erb +0 -1
- data/db/migrate/20260406000000_rename_system_prompt_to_instructions.rb +5 -0
- data/lib/layered/assistant/version.rb +1 -1
- metadata +2 -2
- data/app/views/layered/assistant/messages/_system_prompt.html.erb +0 -10
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 1e367d72d8f95ede81ac50a520755aa2afbf1fef6d9d8bf719b5ca8620ec26f3
|
|
4
|
+
data.tar.gz: 6525df2eb9d245791ebb5cb761bff293778b1b17cda0a7b4682ea566376f8664
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: cfa9d6034e3a92e14b386406b186f6ff5eadce1a053afcde74d816108ab5ebe680eb120aa103cb2027d75a30979876579f7c8e7cb15583e9afda5b2f36c8e599
|
|
7
|
+
data.tar.gz: b6d3ff236bf5c748ebd629a9d3e445bc9f67a7216d56290398e29628772183f0f243a4b85dbd0cd82115a48531ce410f2c264b1c9bf90dc4f19e442d07cd5f9e
|
|
@@ -53,7 +53,7 @@ module Layered
|
|
|
53
53
|
end
|
|
54
54
|
|
|
55
55
|
def assistant_params
|
|
56
|
-
params.require(:assistant).permit(:name, :description, :
|
|
56
|
+
params.require(:assistant).permit(:name, :description, :instructions, :default_model_id, :public)
|
|
57
57
|
end
|
|
58
58
|
end
|
|
59
59
|
end
|
|
@@ -10,6 +10,9 @@ module Layered
|
|
|
10
10
|
belongs_to :subject, polymorphic: true, optional: true
|
|
11
11
|
has_many :messages, dependent: :destroy
|
|
12
12
|
|
|
13
|
+
# Callbacks
|
|
14
|
+
after_create :create_system_message
|
|
15
|
+
|
|
13
16
|
# Validations
|
|
14
17
|
validates :name, presence: true
|
|
15
18
|
|
|
@@ -73,6 +76,12 @@ module Layered
|
|
|
73
76
|
|
|
74
77
|
private
|
|
75
78
|
|
|
79
|
+
def create_system_message
|
|
80
|
+
return if assistant.instructions.blank?
|
|
81
|
+
|
|
82
|
+
messages.create!(role: :system, content: assistant.instructions)
|
|
83
|
+
end
|
|
84
|
+
|
|
76
85
|
def broadcast_name_updated(old_name)
|
|
77
86
|
css_class = "#{ActionView::RecordIdentifier.dom_id(self)}_name"
|
|
78
87
|
Turbo::StreamsChannel.broadcast_action_to(
|
|
@@ -4,13 +4,11 @@ module Layered
|
|
|
4
4
|
def call(message:, stream_proc:)
|
|
5
5
|
provider = message.model.provider
|
|
6
6
|
client = Clients::Base.for(provider)
|
|
7
|
-
system_prompt = message.conversation.assistant.system_prompt
|
|
8
7
|
|
|
9
8
|
client.chat(
|
|
10
9
|
messages: message.conversation.messages,
|
|
11
10
|
model: message.model.identifier,
|
|
12
|
-
stream_proc: stream_proc
|
|
13
|
-
system_prompt: system_prompt
|
|
11
|
+
stream_proc: stream_proc
|
|
14
12
|
)
|
|
15
13
|
end
|
|
16
14
|
end
|
|
@@ -2,8 +2,8 @@ module Layered
|
|
|
2
2
|
module Assistant
|
|
3
3
|
module Clients
|
|
4
4
|
class Anthropic < Base
|
|
5
|
-
def chat(messages:, model:, stream_proc
|
|
6
|
-
formatted = MessagesService.new.format(messages, provider: @provider
|
|
5
|
+
def chat(messages:, model:, stream_proc:)
|
|
6
|
+
formatted = MessagesService.new.format(messages, provider: @provider)
|
|
7
7
|
|
|
8
8
|
parameters = {
|
|
9
9
|
model: model,
|
|
@@ -9,7 +9,7 @@ module Layered
|
|
|
9
9
|
raise StandardError, "API key is not set for provider #{provider.name}" if @api_key.blank?
|
|
10
10
|
end
|
|
11
11
|
|
|
12
|
-
def chat(messages:, model:, stream_proc
|
|
12
|
+
def chat(messages:, model:, stream_proc:)
|
|
13
13
|
raise NotImplementedError
|
|
14
14
|
end
|
|
15
15
|
|
|
@@ -2,8 +2,8 @@ module Layered
|
|
|
2
2
|
module Assistant
|
|
3
3
|
module Clients
|
|
4
4
|
class OpenAI < Base
|
|
5
|
-
def chat(messages:, model:, stream_proc
|
|
6
|
-
formatted = MessagesService.new.format(messages, provider: @provider
|
|
5
|
+
def chat(messages:, model:, stream_proc:)
|
|
6
|
+
formatted = MessagesService.new.format(messages, provider: @provider)
|
|
7
7
|
|
|
8
8
|
client_options = {
|
|
9
9
|
access_token: @api_key,
|
|
@@ -1,21 +1,20 @@
|
|
|
1
1
|
module Layered
|
|
2
2
|
module Assistant
|
|
3
3
|
class MessagesService
|
|
4
|
-
def format(messages, provider: nil
|
|
4
|
+
def format(messages, provider: nil)
|
|
5
5
|
protocol = provider&.protocol
|
|
6
6
|
|
|
7
7
|
if protocol == "openai"
|
|
8
|
-
format_openai(messages
|
|
8
|
+
format_openai(messages)
|
|
9
9
|
else
|
|
10
|
-
format_anthropic(messages
|
|
10
|
+
format_anthropic(messages)
|
|
11
11
|
end
|
|
12
12
|
end
|
|
13
13
|
|
|
14
14
|
private
|
|
15
15
|
|
|
16
|
-
def format_anthropic(messages
|
|
16
|
+
def format_anthropic(messages)
|
|
17
17
|
system_messages = []
|
|
18
|
-
system_messages << system_prompt if system_prompt.present?
|
|
19
18
|
regular_messages = []
|
|
20
19
|
|
|
21
20
|
messages.by_created_at.each do |message|
|
|
@@ -35,9 +34,8 @@ module Layered
|
|
|
35
34
|
result
|
|
36
35
|
end
|
|
37
36
|
|
|
38
|
-
def format_openai(messages
|
|
37
|
+
def format_openai(messages)
|
|
39
38
|
formatted = []
|
|
40
|
-
formatted << { role: "system", content: system_prompt } if system_prompt.present?
|
|
41
39
|
|
|
42
40
|
messages.by_created_at.each do |message|
|
|
43
41
|
case message.role
|
|
@@ -14,9 +14,9 @@
|
|
|
14
14
|
</div>
|
|
15
15
|
|
|
16
16
|
<div class="l-ui-form__group">
|
|
17
|
-
<%= render "layered_ui/shared/label", form: f, field: :
|
|
18
|
-
<%= f.text_area :
|
|
19
|
-
<%= render "layered_ui/shared/field_error", object: assistant, field: :
|
|
17
|
+
<%= render "layered_ui/shared/label", form: f, field: :instructions, required: false %>
|
|
18
|
+
<%= f.text_area :instructions, class: "l-ui-form__field", rows: 5 %>
|
|
19
|
+
<%= render "layered_ui/shared/field_error", object: assistant, field: :instructions %>
|
|
20
20
|
</div>
|
|
21
21
|
|
|
22
22
|
<div class="l-ui-form__group">
|
|
@@ -8,7 +8,6 @@
|
|
|
8
8
|
|
|
9
9
|
<div class="l-ui-conversation__messages" data-controller="messages">
|
|
10
10
|
<div id="<%= dom_id(@conversation) %>_messages" class="<%= dom_id(@conversation) %>_messages l-ui-conversation" aria-live="polite" data-messages-target="list">
|
|
11
|
-
<%= render "layered/assistant/messages/system_prompt", conversation: @conversation %>
|
|
12
11
|
<%= render partial: "layered/assistant/messages/message", collection: @messages, as: :message %>
|
|
13
12
|
</div>
|
|
14
13
|
|
|
@@ -6,7 +6,6 @@
|
|
|
6
6
|
|
|
7
7
|
<div class="l-ui-conversation__messages" data-controller="messages">
|
|
8
8
|
<div id="panel_<%= dom_id(@conversation) %>_messages" class="<%= dom_id(@conversation) %>_messages l-ui-conversation" aria-live="polite" data-messages-target="list">
|
|
9
|
-
<%= render "layered/assistant/messages/system_prompt", conversation: @conversation %>
|
|
10
9
|
<%= render partial: "layered/assistant/messages/message", collection: @messages, as: :message %>
|
|
11
10
|
</div>
|
|
12
11
|
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: layered-assistant-rails
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.3.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- layered.ai
|
|
@@ -362,7 +362,6 @@ files:
|
|
|
362
362
|
- app/views/layered/assistant/messages/_composer.html.erb
|
|
363
363
|
- app/views/layered/assistant/messages/_composer_fields.html.erb
|
|
364
364
|
- app/views/layered/assistant/messages/_message.html.erb
|
|
365
|
-
- app/views/layered/assistant/messages/_system_prompt.html.erb
|
|
366
365
|
- app/views/layered/assistant/messages/create.turbo_stream.erb
|
|
367
366
|
- app/views/layered/assistant/messages/index.html.erb
|
|
368
367
|
- app/views/layered/assistant/models/_form.html.erb
|
|
@@ -401,6 +400,7 @@ files:
|
|
|
401
400
|
- db/migrate/20260315000000_add_stopped_to_layered_assistant_messages.rb
|
|
402
401
|
- db/migrate/20260315100000_add_response_timing_to_layered_assistant_messages.rb
|
|
403
402
|
- db/migrate/20260317000000_normalise_provider_protocol_values.rb
|
|
403
|
+
- db/migrate/20260406000000_rename_system_prompt_to_instructions.rb
|
|
404
404
|
- lib/generators/layered/assistant/install_generator.rb
|
|
405
405
|
- lib/generators/layered/assistant/migrations_generator.rb
|
|
406
406
|
- lib/generators/layered/assistant/templates/initializer.rb
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
<% if conversation.assistant.system_prompt.present? %>
|
|
2
|
-
<div class="l-ui-message">
|
|
3
|
-
<div class="l-ui-message__bubble">
|
|
4
|
-
<div class="l-ui-message__author">System</div>
|
|
5
|
-
<div class="l-ui-message__body">
|
|
6
|
-
<%= conversation.assistant.system_prompt %>
|
|
7
|
-
</div>
|
|
8
|
-
</div>
|
|
9
|
-
</div>
|
|
10
|
-
<% end %>
|