diff --git a/lib/generators/ruby_llm/chat_ui/chat_ui_generator.rb b/lib/generators/ruby_llm/chat_ui/chat_ui_generator.rb
index b420b41e1..a67c6b1cd 100644
--- a/lib/generators/ruby_llm/chat_ui/chat_ui_generator.rb
+++ b/lib/generators/ruby_llm/chat_ui/chat_ui_generator.rb
@@ -61,6 +61,7 @@ def create_views
template 'views/messages/_tool_calls.html.erb',
"app/views/#{message_view_path}/_tool_calls.html.erb"
template 'views/messages/_content.html.erb', "app/views/#{message_view_path}/_content.html.erb"
+ template 'views/messages/_content_raw.html.erb', "app/views/#{message_view_path}/_content_raw.html.erb"
template 'views/messages/_form.html.erb', "app/views/#{message_view_path}/_form.html.erb"
template 'views/messages/create.turbo_stream.erb', "app/views/#{message_view_path}/create.turbo_stream.erb"
diff --git a/lib/generators/ruby_llm/chat_ui/templates/views/messages/_content_raw.html.erb.tt b/lib/generators/ruby_llm/chat_ui/templates/views/messages/_content_raw.html.erb.tt
new file mode 100644
index 000000000..26cde1fb8
--- /dev/null
+++ b/lib/generators/ruby_llm/chat_ui/templates/views/messages/_content_raw.html.erb.tt
@@ -0,0 +1,28 @@
+
+
+
+ <%%= begin
+ keys = content.keys
+ shown = keys.first(4).map do |k|
+ v = content[k]
+ pv =
+ case v
+ when Hash then "{…}"
+ when Array then v.all? { |e| e.is_a?(Hash) } ? "[{…}, …]" : "[…]"
+ when NilClass then "nil"
+ when String then v.length > 30 ? %("#{v.truncate(30, omission: "…")}") : v.inspect
+ else v.to_s
+ end
+ "#{k}: #{pv}"
+ end
+ shown << "…" if keys.size > 4
+ "{ " + shown.join(", ") + " }"
+ rescue StandardError => e
+ "{…}"
+ end
+ %>
+
+
+
+ <%%= JSON.pretty_generate(content) -%>
+
diff --git a/lib/generators/ruby_llm/chat_ui/templates/views/messages/_message.html.erb.tt b/lib/generators/ruby_llm/chat_ui/templates/views/messages/_message.html.erb.tt
index 2c3f2e88c..e1e106155 100644
--- a/lib/generators/ruby_llm/chat_ui/templates/views/messages/_message.html.erb.tt
+++ b/lib/generators/ruby_llm/chat_ui/templates/views/messages/_message.html.erb.tt
@@ -3,7 +3,13 @@
<%%= <%= message_model_name.demodulize.underscore %>.role&.capitalize %>
- <%%= <%= message_model_name.demodulize.underscore %>.content %>
+ <%% if <%= message_model_name.demodulize.underscore %>.content.present? %>
+ <%%= <%= message_model_name.demodulize.underscore %>.content %>
+ <%% elsif <%= message_model_name.demodulize.underscore %>.content_raw.present? && <%= message_model_name.demodulize.underscore %>.content_raw.is_a?(Hash) %>
+
+ <%%= render "<%= message_model_name.underscore.pluralize %>/content_raw", content: <%= message_model_name.demodulize.underscore %>.content_raw %>
+
+ <%% end %>
<%% if <%= message_model_name.demodulize.underscore %>.tool_call? %>
<%%= render "<%= message_model_name.underscore.pluralize %>/tool_calls", <%= message_model_name.demodulize.underscore %>: <%= message_model_name.demodulize.underscore %> %>
<%% end %>
diff --git a/spec/ruby_llm/generators/chat_ui_generator_spec.rb b/spec/ruby_llm/generators/chat_ui_generator_spec.rb
index 40dc313e5..4d0420b91 100644
--- a/spec/ruby_llm/generators/chat_ui_generator_spec.rb
+++ b/spec/ruby_llm/generators/chat_ui_generator_spec.rb
@@ -47,6 +47,7 @@
# Message views
expect(File.exist?('app/views/messages/_message.html.erb')).to be true
expect(File.exist?('app/views/messages/_content.html.erb')).to be true
+ expect(File.exist?('app/views/messages/_content_raw.html.erb')).to be true
expect(File.exist?('app/views/messages/_form.html.erb')).to be true
expect(File.exist?('app/views/messages/create.turbo_stream.erb')).to be true
@@ -168,6 +169,7 @@
# Message views
expect(File.exist?('app/views/llm/messages/_message.html.erb')).to be true
expect(File.exist?('app/views/llm/messages/_content.html.erb')).to be true
+ expect(File.exist?('app/views/llm/messages/_content_raw.html.erb')).to be true
expect(File.exist?('app/views/llm/messages/_form.html.erb')).to be true
expect(File.exist?('app/views/llm/messages/create.turbo_stream.erb')).to be true