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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b0c052e155f7489ab469b2fe1cc4a59b9285fceaaf2595c5947287a95f31a1ed
4
- data.tar.gz: 8449a3ab76b185cae858779e37fe6888679a1d9f96b76717871acf3fa5b49443
3
+ metadata.gz: 1e367d72d8f95ede81ac50a520755aa2afbf1fef6d9d8bf719b5ca8620ec26f3
4
+ data.tar.gz: 6525df2eb9d245791ebb5cb761bff293778b1b17cda0a7b4682ea566376f8664
5
5
  SHA512:
6
- metadata.gz: 614f4ec4a6e1a592604a9f98572a61cd39808bd47dbcc9e2fcc8d80532dedb378f708877770aef11aaed25f9838be1a867b844b170efbdcb7be6a30dadb7d8b5
7
- data.tar.gz: 2655b683321d5e9a191106d8e20ab887b679d1b524e504a165a399dd30ef94874078908112ae6481c6bcbc7f2e00df07b9c3ea842e05313c7b9f3bd57b4eff74
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, :system_prompt, :default_model_id, :public)
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:, system_prompt: nil)
6
- formatted = MessagesService.new.format(messages, provider: @provider, system_prompt: system_prompt)
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:, system_prompt: nil)
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:, system_prompt: nil)
6
- formatted = MessagesService.new.format(messages, provider: @provider, system_prompt: system_prompt)
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, system_prompt: nil)
4
+ def format(messages, provider: nil)
5
5
  protocol = provider&.protocol
6
6
 
7
7
  if protocol == "openai"
8
- format_openai(messages, system_prompt: system_prompt)
8
+ format_openai(messages)
9
9
  else
10
- format_anthropic(messages, system_prompt: system_prompt)
10
+ format_anthropic(messages)
11
11
  end
12
12
  end
13
13
 
14
14
  private
15
15
 
16
- def format_anthropic(messages, system_prompt: nil)
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, system_prompt: nil)
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: :system_prompt, name: "System prompt", required: false %>
18
- <%= f.text_area :system_prompt, class: "l-ui-form__field", rows: 5 %>
19
- <%= render "layered_ui/shared/field_error", object: assistant, field: :system_prompt %>
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
 
@@ -0,0 +1,5 @@
1
+ class RenameSystemPromptToInstructions < ActiveRecord::Migration[8.0]
2
+ def change
3
+ rename_column :layered_assistant_assistants, :system_prompt, :instructions
4
+ end
5
+ end
@@ -1,5 +1,5 @@
1
1
  module Layered
2
2
  module Assistant
3
- VERSION = "0.2.2"
3
+ VERSION = "0.3.0"
4
4
  end
5
5
  end
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.2.2
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 %>