lex-llm 0.1.2 → 0.1.4

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 (165) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/CHANGELOG.md +12 -1
  4. data/Gemfile +1 -19
  5. data/README.md +25 -26
  6. data/lex-llm.gemspec +2 -2
  7. data/lib/legion/extensions/llm/agent.rb +366 -0
  8. data/lib/legion/extensions/llm/aliases.rb +42 -0
  9. data/lib/legion/extensions/llm/attachment.rb +229 -0
  10. data/lib/legion/extensions/llm/chat.rb +355 -0
  11. data/lib/legion/extensions/llm/chunk.rb +10 -0
  12. data/lib/legion/extensions/llm/configuration.rb +82 -0
  13. data/lib/legion/extensions/llm/connection.rb +134 -0
  14. data/lib/legion/extensions/llm/content.rb +81 -0
  15. data/lib/legion/extensions/llm/context.rb +33 -0
  16. data/lib/legion/extensions/llm/embedding.rb +33 -0
  17. data/lib/legion/extensions/llm/error.rb +116 -0
  18. data/lib/legion/extensions/llm/image.rb +109 -0
  19. data/lib/legion/extensions/llm/message.rb +111 -0
  20. data/lib/legion/extensions/llm/mime_type.rb +75 -0
  21. data/lib/legion/extensions/llm/model/info.rb +117 -0
  22. data/lib/legion/extensions/llm/model/modalities.rb +26 -0
  23. data/lib/legion/extensions/llm/model/pricing.rb +52 -0
  24. data/lib/legion/extensions/llm/model/pricing_category.rb +50 -0
  25. data/lib/legion/extensions/llm/model/pricing_tier.rb +37 -0
  26. data/lib/legion/extensions/llm/model.rb +11 -0
  27. data/lib/legion/extensions/llm/models.rb +514 -0
  28. data/lib/{lex_llm → legion/extensions/llm}/models_schema.json +1 -1
  29. data/lib/legion/extensions/llm/moderation.rb +60 -0
  30. data/lib/legion/extensions/llm/provider/open_ai_compatible.rb +276 -0
  31. data/lib/legion/extensions/llm/provider.rb +337 -0
  32. data/lib/legion/extensions/llm/routing/lane_key.rb +57 -0
  33. data/lib/legion/extensions/llm/routing/model_offering.rb +173 -0
  34. data/lib/legion/extensions/llm/routing.rb +11 -0
  35. data/lib/legion/extensions/llm/stream_accumulator.rb +209 -0
  36. data/lib/legion/extensions/llm/streaming.rb +181 -0
  37. data/lib/legion/extensions/llm/thinking.rb +53 -0
  38. data/lib/legion/extensions/llm/tokens.rb +51 -0
  39. data/lib/legion/extensions/llm/tool.rb +258 -0
  40. data/lib/legion/extensions/llm/tool_call.rb +29 -0
  41. data/lib/legion/extensions/llm/transcription.rb +39 -0
  42. data/lib/legion/extensions/llm/utils.rb +95 -0
  43. data/lib/legion/extensions/llm/version.rb +9 -0
  44. data/lib/legion/extensions/llm.rb +85 -6
  45. metadata +40 -122
  46. data/lib/generators/lex_llm/agent/agent_generator.rb +0 -36
  47. data/lib/generators/lex_llm/agent/templates/agent.rb.tt +0 -6
  48. data/lib/generators/lex_llm/agent/templates/instructions.txt.erb.tt +0 -0
  49. data/lib/generators/lex_llm/chat_ui/chat_ui_generator.rb +0 -256
  50. data/lib/generators/lex_llm/chat_ui/templates/controllers/chats_controller.rb.tt +0 -38
  51. data/lib/generators/lex_llm/chat_ui/templates/controllers/messages_controller.rb.tt +0 -21
  52. data/lib/generators/lex_llm/chat_ui/templates/controllers/models_controller.rb.tt +0 -14
  53. data/lib/generators/lex_llm/chat_ui/templates/helpers/messages_helper.rb.tt +0 -25
  54. data/lib/generators/lex_llm/chat_ui/templates/jobs/chat_response_job.rb.tt +0 -12
  55. data/lib/generators/lex_llm/chat_ui/templates/tailwind/views/chats/_chat.html.erb.tt +0 -16
  56. data/lib/generators/lex_llm/chat_ui/templates/tailwind/views/chats/_form.html.erb.tt +0 -31
  57. data/lib/generators/lex_llm/chat_ui/templates/tailwind/views/chats/index.html.erb.tt +0 -31
  58. data/lib/generators/lex_llm/chat_ui/templates/tailwind/views/chats/new.html.erb.tt +0 -9
  59. data/lib/generators/lex_llm/chat_ui/templates/tailwind/views/chats/show.html.erb.tt +0 -27
  60. data/lib/generators/lex_llm/chat_ui/templates/tailwind/views/messages/_assistant.html.erb.tt +0 -14
  61. data/lib/generators/lex_llm/chat_ui/templates/tailwind/views/messages/_content.html.erb.tt +0 -1
  62. data/lib/generators/lex_llm/chat_ui/templates/tailwind/views/messages/_error.html.erb.tt +0 -13
  63. data/lib/generators/lex_llm/chat_ui/templates/tailwind/views/messages/_form.html.erb.tt +0 -23
  64. data/lib/generators/lex_llm/chat_ui/templates/tailwind/views/messages/_system.html.erb.tt +0 -10
  65. data/lib/generators/lex_llm/chat_ui/templates/tailwind/views/messages/_tool.html.erb.tt +0 -2
  66. data/lib/generators/lex_llm/chat_ui/templates/tailwind/views/messages/_tool_calls.html.erb.tt +0 -4
  67. data/lib/generators/lex_llm/chat_ui/templates/tailwind/views/messages/_user.html.erb.tt +0 -14
  68. data/lib/generators/lex_llm/chat_ui/templates/tailwind/views/messages/tool_calls/_default.html.erb.tt +0 -13
  69. data/lib/generators/lex_llm/chat_ui/templates/tailwind/views/messages/tool_results/_default.html.erb.tt +0 -21
  70. data/lib/generators/lex_llm/chat_ui/templates/tailwind/views/models/_model.html.erb.tt +0 -17
  71. data/lib/generators/lex_llm/chat_ui/templates/tailwind/views/models/index.html.erb.tt +0 -40
  72. data/lib/generators/lex_llm/chat_ui/templates/tailwind/views/models/show.html.erb.tt +0 -27
  73. data/lib/generators/lex_llm/chat_ui/templates/views/chats/_chat.html.erb.tt +0 -16
  74. data/lib/generators/lex_llm/chat_ui/templates/views/chats/_form.html.erb.tt +0 -29
  75. data/lib/generators/lex_llm/chat_ui/templates/views/chats/index.html.erb.tt +0 -28
  76. data/lib/generators/lex_llm/chat_ui/templates/views/chats/new.html.erb.tt +0 -11
  77. data/lib/generators/lex_llm/chat_ui/templates/views/chats/show.html.erb.tt +0 -25
  78. data/lib/generators/lex_llm/chat_ui/templates/views/messages/_assistant.html.erb.tt +0 -9
  79. data/lib/generators/lex_llm/chat_ui/templates/views/messages/_content.html.erb.tt +0 -1
  80. data/lib/generators/lex_llm/chat_ui/templates/views/messages/_error.html.erb.tt +0 -8
  81. data/lib/generators/lex_llm/chat_ui/templates/views/messages/_form.html.erb.tt +0 -21
  82. data/lib/generators/lex_llm/chat_ui/templates/views/messages/_system.html.erb.tt +0 -6
  83. data/lib/generators/lex_llm/chat_ui/templates/views/messages/_tool.html.erb.tt +0 -2
  84. data/lib/generators/lex_llm/chat_ui/templates/views/messages/_tool_calls.html.erb.tt +0 -4
  85. data/lib/generators/lex_llm/chat_ui/templates/views/messages/_user.html.erb.tt +0 -9
  86. data/lib/generators/lex_llm/chat_ui/templates/views/messages/create.turbo_stream.erb.tt +0 -7
  87. data/lib/generators/lex_llm/chat_ui/templates/views/messages/tool_calls/_default.html.erb.tt +0 -8
  88. data/lib/generators/lex_llm/chat_ui/templates/views/messages/tool_results/_default.html.erb.tt +0 -16
  89. data/lib/generators/lex_llm/chat_ui/templates/views/models/_model.html.erb.tt +0 -15
  90. data/lib/generators/lex_llm/chat_ui/templates/views/models/index.html.erb.tt +0 -38
  91. data/lib/generators/lex_llm/chat_ui/templates/views/models/show.html.erb.tt +0 -17
  92. data/lib/generators/lex_llm/generator_helpers.rb +0 -214
  93. data/lib/generators/lex_llm/install/install_generator.rb +0 -109
  94. data/lib/generators/lex_llm/install/templates/add_references_to_chats_tool_calls_and_messages_migration.rb.tt +0 -9
  95. data/lib/generators/lex_llm/install/templates/chat_model.rb.tt +0 -3
  96. data/lib/generators/lex_llm/install/templates/create_chats_migration.rb.tt +0 -7
  97. data/lib/generators/lex_llm/install/templates/create_messages_migration.rb.tt +0 -19
  98. data/lib/generators/lex_llm/install/templates/create_models_migration.rb.tt +0 -39
  99. data/lib/generators/lex_llm/install/templates/create_tool_calls_migration.rb.tt +0 -21
  100. data/lib/generators/lex_llm/install/templates/initializer.rb.tt +0 -20
  101. data/lib/generators/lex_llm/install/templates/message_model.rb.tt +0 -4
  102. data/lib/generators/lex_llm/install/templates/model_model.rb.tt +0 -3
  103. data/lib/generators/lex_llm/install/templates/tool_call_model.rb.tt +0 -3
  104. data/lib/generators/lex_llm/schema/schema_generator.rb +0 -26
  105. data/lib/generators/lex_llm/schema/templates/schema.rb.tt +0 -2
  106. data/lib/generators/lex_llm/tool/templates/tool.rb.tt +0 -9
  107. data/lib/generators/lex_llm/tool/templates/tool_call.html.erb.tt +0 -13
  108. data/lib/generators/lex_llm/tool/templates/tool_result.html.erb.tt +0 -13
  109. data/lib/generators/lex_llm/tool/tool_generator.rb +0 -96
  110. data/lib/generators/lex_llm/upgrade_to_v1_10/templates/add_v1_10_message_columns.rb.tt +0 -19
  111. data/lib/generators/lex_llm/upgrade_to_v1_10/upgrade_to_v1_10_generator.rb +0 -50
  112. data/lib/generators/lex_llm/upgrade_to_v1_14/templates/add_v1_14_tool_call_columns.rb.tt +0 -7
  113. data/lib/generators/lex_llm/upgrade_to_v1_14/upgrade_to_v1_14_generator.rb +0 -49
  114. data/lib/generators/lex_llm/upgrade_to_v1_7/templates/migration.rb.tt +0 -145
  115. data/lib/generators/lex_llm/upgrade_to_v1_7/upgrade_to_v1_7_generator.rb +0 -122
  116. data/lib/generators/lex_llm/upgrade_to_v1_9/templates/add_v1_9_message_columns.rb.tt +0 -15
  117. data/lib/generators/lex_llm/upgrade_to_v1_9/upgrade_to_v1_9_generator.rb +0 -49
  118. data/lib/lex_llm/active_record/acts_as.rb +0 -180
  119. data/lib/lex_llm/active_record/acts_as_legacy.rb +0 -503
  120. data/lib/lex_llm/active_record/chat_methods.rb +0 -468
  121. data/lib/lex_llm/active_record/message_methods.rb +0 -131
  122. data/lib/lex_llm/active_record/model_methods.rb +0 -76
  123. data/lib/lex_llm/active_record/payload_helpers.rb +0 -26
  124. data/lib/lex_llm/active_record/tool_call_methods.rb +0 -15
  125. data/lib/lex_llm/agent.rb +0 -365
  126. data/lib/lex_llm/aliases.rb +0 -38
  127. data/lib/lex_llm/attachment.rb +0 -223
  128. data/lib/lex_llm/chat.rb +0 -351
  129. data/lib/lex_llm/chunk.rb +0 -6
  130. data/lib/lex_llm/configuration.rb +0 -81
  131. data/lib/lex_llm/connection.rb +0 -130
  132. data/lib/lex_llm/content.rb +0 -77
  133. data/lib/lex_llm/context.rb +0 -29
  134. data/lib/lex_llm/embedding.rb +0 -29
  135. data/lib/lex_llm/error.rb +0 -112
  136. data/lib/lex_llm/image.rb +0 -105
  137. data/lib/lex_llm/message.rb +0 -107
  138. data/lib/lex_llm/mime_type.rb +0 -71
  139. data/lib/lex_llm/model/info.rb +0 -113
  140. data/lib/lex_llm/model/modalities.rb +0 -22
  141. data/lib/lex_llm/model/pricing.rb +0 -48
  142. data/lib/lex_llm/model/pricing_category.rb +0 -46
  143. data/lib/lex_llm/model/pricing_tier.rb +0 -33
  144. data/lib/lex_llm/model.rb +0 -7
  145. data/lib/lex_llm/models.rb +0 -506
  146. data/lib/lex_llm/moderation.rb +0 -56
  147. data/lib/lex_llm/provider/open_ai_compatible.rb +0 -219
  148. data/lib/lex_llm/provider.rb +0 -278
  149. data/lib/lex_llm/railtie.rb +0 -35
  150. data/lib/lex_llm/routing/lane_key.rb +0 -51
  151. data/lib/lex_llm/routing/model_offering.rb +0 -169
  152. data/lib/lex_llm/routing.rb +0 -7
  153. data/lib/lex_llm/stream_accumulator.rb +0 -203
  154. data/lib/lex_llm/streaming.rb +0 -175
  155. data/lib/lex_llm/thinking.rb +0 -49
  156. data/lib/lex_llm/tokens.rb +0 -47
  157. data/lib/lex_llm/tool.rb +0 -254
  158. data/lib/lex_llm/tool_call.rb +0 -25
  159. data/lib/lex_llm/transcription.rb +0 -35
  160. data/lib/lex_llm/utils.rb +0 -91
  161. data/lib/lex_llm/version.rb +0 -5
  162. data/lib/lex_llm.rb +0 -96
  163. data/lib/tasks/lex_llm.rake +0 -23
  164. /data/lib/{lex_llm → legion/extensions/llm}/aliases.json +0 -0
  165. /data/lib/{lex_llm → legion/extensions/llm}/models.json +0 -0
@@ -1,31 +0,0 @@
1
- <%% content_for :title, "<%= chat_model_name.pluralize %>" %>
2
-
3
- <div class="w-full">
4
- <%% if notice.present? %>
5
- <p class="py-2 px-3 bg-green-50 mb-5 text-green-500 font-medium rounded-md inline-block" id="notice"><%%= notice %></p>
6
- <%% end %>
7
-
8
- <div class="flex justify-between items-center">
9
- <h1 class="font-bold text-4xl"><%= chat_model_name.pluralize %></h1>
10
- <div class="flex items-center gap-2">
11
- <%%= link_to "<%= model_model_name.pluralize %>", <%= model_table_name %>_path, class: "rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 text-gray-900 block font-medium" %>
12
- <%%= link_to "New <%= chat_table_name.singularize.humanize.downcase %>", new_<%= chat_variable_name %>_path, class: "rounded-md px-3.5 py-2.5 bg-blue-600 hover:bg-blue-500 text-white block font-medium" %>
13
- </div>
14
- </div>
15
-
16
- <div id="<%= chat_table_name %>" class="min-w-full divide-y divide-gray-200 space-y-5">
17
- <%% if @<%= chat_table_name %>.any? %>
18
- <%% @<%= chat_table_name %>.each do |<%= chat_variable_name %>| %>
19
- <div class="flex flex-col sm:flex-row justify-between items-center pb-5 sm:pb-0">
20
- <%%= render <%= chat_variable_name %> %>
21
- <div class="w-full sm:w-auto flex flex-col sm:flex-row space-x-2 space-y-2">
22
- <%%= link_to "Show", <%= chat_variable_name %>, class: "w-full sm:w-auto text-center rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %>
23
- <%%= button_to "Destroy", <%= chat_variable_name %>, method: :delete, class: "w-full sm:w-auto rounded-md px-3.5 py-2.5 bg-red-600 hover:bg-red-500 text-white inline-block font-medium cursor-pointer", data: { turbo_confirm: "Are you sure?" } %>
24
- </div>
25
- </div>
26
- <%% end %>
27
- <%% else %>
28
- <p class="text-center my-10">No <%= chat_table_name.humanize.downcase %> found.</p>
29
- <%% end %>
30
- </div>
31
- </div>
@@ -1,9 +0,0 @@
1
- <%% content_for :title, "New <%= chat_table_name.singularize.humanize.downcase %>" %>
2
-
3
- <div class="md:w-2/3 w-full">
4
- <h1 class="font-bold text-4xl">New <%= chat_table_name.singularize.humanize.downcase %></h1>
5
-
6
- <%%= render "form", <%= chat_variable_name %>: @<%= chat_variable_name %> %>
7
-
8
- <%%= link_to "Back to <%= chat_table_name.humanize.downcase %>", <%= chat_table_name %>_path, class: "w-full sm:w-auto text-center mt-2 sm:mt-0 sm:ml-2 rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %>
9
- </div>
@@ -1,27 +0,0 @@
1
- <%% content_for :title, "Showing <%= chat_table_name.singularize.humanize.downcase %>" %>
2
-
3
- <%%= turbo_stream_from "<%= chat_variable_name %>_#{@<%= chat_variable_name %>.id}" %>
4
-
5
- <%# Keep layout conventions aligned with tailwindcss-rails scaffold (top-left, md:w-2/3). -%>
6
- <div class="md:w-2/3 w-full">
7
- <%% if notice.present? %>
8
- <p class="py-2 px-3 bg-green-50 mb-5 text-green-500 font-medium rounded-md inline-block" id="notice"><%%= notice %></p>
9
- <%% end %>
10
-
11
- <h1 class="font-bold text-4xl">Showing <%= chat_table_name.singularize.humanize.downcase %> #<%%= @<%= chat_variable_name %>.id %></h1>
12
-
13
- <div class="my-5">
14
- <strong class="block font-medium mb-1">Model:</strong>
15
- <%%= @<%= chat_variable_name %>.<%= model_table_name.singularize %>&.label || default_model_display_name %>
16
- </div>
17
-
18
- <div id="<%= message_table_name %>" class="min-w-full divide-y divide-gray-200 space-y-5 my-5">
19
- <%% @<%= chat_variable_name %>.<%= message_table_name %>.where.not(id: nil).each do |<%= message_variable_name %>| %>
20
- <%%= render <%= message_variable_name %> %>
21
- <%% end %>
22
- </div>
23
-
24
- <%%= render "<%= message_model_name.underscore.pluralize %>/form", <%= chat_variable_name %>: @<%= chat_variable_name %>, <%= message_variable_name %>: @<%= message_variable_name %> %>
25
-
26
- <%%= link_to "Back to <%= chat_table_name.humanize.downcase %>", <%= chat_table_name %>_path, class: "w-full sm:w-auto text-center mt-2 sm:mt-0 sm:ml-2 rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %>
27
- </div>
@@ -1,14 +0,0 @@
1
- <%% assistant ||= local_assigns[:message] %>
2
- <div id="<%= message_variable_name %>_<%%= assistant.id %>" class="w-full sm:w-auto my-5 space-y-3 rounded-md px-3 py-2 bg-green-50">
3
- <div>
4
- <span class="inline-block rounded px-2 py-0.5 text-xs font-medium bg-green-100 text-green-700">
5
- Assistant
6
- </span>
7
- </div>
8
-
9
- <div id="<%= message_variable_name %>_<%%= assistant.id %>_content" class="whitespace-pre-wrap"><%%= assistant.content %></div>
10
-
11
- <div>
12
- <span class="text-sm text-gray-600"><%%= assistant.created_at&.strftime("%I:%M %p") %></span>
13
- </div>
14
- </div>
@@ -1,13 +0,0 @@
1
- <div id="<%= message_variable_name %>_<%%= <%= message_model_name.demodulize.underscore %>.id %>" class="w-full sm:w-auto my-5 space-y-3 rounded-md px-3 py-2 bg-red-50 border border-red-200">
2
- <div>
3
- <span class="inline-block rounded px-2 py-0.5 text-xs font-medium bg-red-100 text-red-700">
4
- <%%= title.presence || "Error" %>
5
- </span>
6
- </div>
7
-
8
- <pre class="whitespace-pre-wrap text-red-900 text-sm overflow-x-auto"><%%= error_message %></pre>
9
-
10
- <div>
11
- <span class="text-sm text-red-700"><%%= <%= message_model_name.demodulize.underscore %>.created_at&.strftime("%I:%M %p") %></span>
12
- </div>
13
- </div>
@@ -1,23 +0,0 @@
1
- <%%= form_with(model: <%= message_variable_name %>, url: <%= chat_model_name.include?('::') ? "#{chat_model_name.split('::').first.underscore}_#{chat_model_name.demodulize.underscore}_#{message_model_name.demodulize.underscore.pluralize}_path(@#{chat_variable_name})" : "[@#{chat_variable_name}, #{message_variable_name}]" %>, id: "new_<%= message_variable_name %>", class: "contents") do |form| %>
2
- <%% if <%= message_variable_name %>.errors.any? %>
3
- <div id="error_explanation" class="bg-red-50 text-red-500 px-3 py-2 font-medium rounded-md mt-3">
4
- <h2><%%= pluralize(<%= message_variable_name %>.errors.count, "error") %> prohibited this <%= message_table_name.singularize.humanize.downcase %> from being saved:</h2>
5
-
6
- <ul class="list-disc ml-6">
7
- <%% <%= message_variable_name %>.errors.each do |error| %>
8
- <li><%%= error.full_message %></li>
9
- <%% end %>
10
- </ul>
11
- </div>
12
- <%% end %>
13
-
14
- <div class="my-5">
15
- <%%= form.label :content, "Message" %>
16
- <%%= form.text_area :content, rows: 4, placeholder: "Message...", autofocus: true,
17
- class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": <%= message_variable_name %>.errors[:content].none?, "border-red-400 focus:outline-red-600": <%= message_variable_name %>.errors[:content].any?}] %>
18
- </div>
19
-
20
- <div class="inline">
21
- <%%= form.submit "Send <%= message_table_name.singularize.humanize.downcase %>", class: "w-full sm:w-auto rounded-md px-3.5 py-2.5 bg-blue-600 hover:bg-blue-500 text-white inline-block font-medium cursor-pointer" %>
22
- </div>
23
- <%% end %>
@@ -1,10 +0,0 @@
1
- <%% system ||= local_assigns[:message] %>
2
- <div id="<%= message_variable_name %>_<%%= system.id %>" class="w-full sm:w-auto my-5 space-y-3 rounded-md px-3 py-2 bg-gray-50 border border-gray-200">
3
- <div>
4
- <span class="inline-block rounded px-2 py-0.5 text-xs font-medium bg-gray-200 text-gray-700">
5
- System
6
- </span>
7
- </div>
8
-
9
- <div class="whitespace-pre-wrap text-gray-700"><%%= system.content %></div>
10
- </div>
@@ -1,2 +0,0 @@
1
- <%% tool ||= local_assigns[:message] %>
2
- <%%= render tool_result_partial(tool), tool: tool %>
@@ -1,4 +0,0 @@
1
- <%% tool_calls ||= local_assigns[:message] %>
2
- <%% tool_calls.<%= tool_call_variable_name.pluralize %>.each do |tool_call| %>
3
- <%%= render tool_call_partial(tool_call), tool_calls: tool_calls, tool_call: tool_call %>
4
- <%% end %>
@@ -1,14 +0,0 @@
1
- <%% user ||= local_assigns[:message] %>
2
- <div id="<%= message_variable_name %>_<%%= user.id %>" class="w-full sm:w-auto my-5 space-y-3 rounded-md px-3 py-2 bg-blue-50">
3
- <div>
4
- <span class="inline-block rounded px-2 py-0.5 text-xs font-medium bg-blue-100 text-blue-700">
5
- User
6
- </span>
7
- </div>
8
-
9
- <div id="<%= message_variable_name %>_<%%= user.id %>_content" class="whitespace-pre-wrap"><%%= user.content %></div>
10
-
11
- <div>
12
- <span class="text-sm text-gray-600"><%%= user.created_at&.strftime("%I:%M %p") %></span>
13
- </div>
14
- </div>
@@ -1,13 +0,0 @@
1
- <div id="<%= message_variable_name %>_<%%= tool_calls.id %>" class="w-full sm:w-auto my-5 space-y-3 rounded-md px-3 py-2 bg-gray-50 border border-gray-200">
2
- <div>
3
- <span class="inline-block rounded px-2 py-0.5 text-xs font-medium bg-gray-200 text-gray-700">
4
- Tool Call
5
- </span>
6
- </div>
7
-
8
- <pre class="whitespace-pre-wrap text-gray-700 text-sm overflow-x-auto"><%%= tool_call.name %>(<%%= tool_call.arguments.map { |k, v| "#{k}: #{v.inspect}" }.join(", ") %>)</pre>
9
-
10
- <div>
11
- <span class="text-sm text-gray-600"><%%= tool_calls.created_at&.strftime("%I:%M %p") %></span>
12
- </div>
13
- </div>
@@ -1,21 +0,0 @@
1
- <%% error_message = tool.tool_error_message %>
2
- <%% if error_message.present? %>
3
- <%%= render "<%= message_model_name.underscore.pluralize %>/error",
4
- <%= message_model_name.demodulize.underscore %>: tool,
5
- title: "Tool Result Error",
6
- error_message: error_message %>
7
- <%% else %>
8
- <div id="<%= message_variable_name %>_<%%= tool.id %>" class="w-full sm:w-auto my-5 space-y-3 rounded-md px-3 py-2 bg-gray-50 border border-gray-200">
9
- <div>
10
- <span class="inline-block rounded px-2 py-0.5 text-xs font-medium bg-gray-200 text-gray-700">
11
- Tool
12
- </span>
13
- </div>
14
-
15
- <pre class="whitespace-pre-wrap text-gray-700 text-sm overflow-x-auto"><%%= tool.content.presence || "(no output)" %></pre>
16
-
17
- <div>
18
- <span class="text-sm text-gray-600"><%%= tool.created_at&.strftime("%I:%M %p") %></span>
19
- </div>
20
- </div>
21
- <%% end %>
@@ -1,17 +0,0 @@
1
- <%% model_id = <%= model_model_name.demodulize.underscore %>.respond_to?(:model_id) ? <%= model_model_name.demodulize.underscore %>.model_id : <%= model_model_name.demodulize.underscore %>.id %>
2
- <%% row_id = [<%= model_model_name.demodulize.underscore %>.provider, model_id].join("_").parameterize(separator: "_") %>
3
- <tr id="model_<%%= row_id %>">
4
- <td class="px-3 py-2 text-sm text-gray-700"><%%= <%= model_model_name.demodulize.underscore %>.provider_class&.name || <%= model_model_name.demodulize.underscore %>.provider %></td>
5
- <td class="px-3 py-2 text-sm text-gray-900"><%%= <%= model_model_name.demodulize.underscore %>.respond_to?(:display_name) ? <%= model_model_name.demodulize.underscore %>.display_name : <%= model_model_name.demodulize.underscore %>.name %></td>
6
- <td class="px-3 py-2 text-sm text-gray-700"><%%= number_with_delimiter(<%= model_model_name.demodulize.underscore %>.context_window) if <%= model_model_name.demodulize.underscore %>.context_window %></td>
7
- <td class="px-3 py-2 text-sm text-gray-700">
8
- <%% input = <%= model_model_name.demodulize.underscore %>.input_price_per_million %>
9
- <%% output = <%= model_model_name.demodulize.underscore %>.output_price_per_million %>
10
- <%% if input && output %>
11
- $<%%= "%.2f" % input %> / $<%%= "%.2f" % output %>
12
- <%% end %>
13
- </td>
14
- <td class="px-3 py-2 text-sm">
15
- <%%= link_to "Start <%= chat_table_name.singularize.humanize.downcase %>", new_<%= chat_variable_name %>_path(model: model_id), class: "text-blue-600 hover:text-blue-500" %>
16
- </td>
17
- </tr>
@@ -1,40 +0,0 @@
1
- <%% content_for :title, "<%= model_model_name.pluralize %>" %>
2
-
3
- <div class="w-full">
4
- <%% if notice.present? %>
5
- <p class="py-2 px-3 bg-green-50 mb-5 text-green-500 font-medium rounded-md inline-block" id="notice"><%%= notice %></p>
6
- <%% end %>
7
-
8
- <div class="flex justify-between items-center">
9
- <h1 class="font-bold text-4xl"><%= model_model_name.pluralize %></h1>
10
- <div class="flex items-center gap-2">
11
- <%%= link_to "<%= chat_model_name.pluralize %>", <%= chat_table_name %>_path, class: "rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 text-gray-900 block font-medium" %>
12
- <%%= button_to "Refresh <%= model_model_name.pluralize %>", refresh_<%= model_table_name %>_path, method: :post, class: "rounded-md px-3.5 py-2.5 bg-blue-600 hover:bg-blue-500 text-white block font-medium cursor-pointer" %>
13
- </div>
14
- </div>
15
-
16
- <div id="<%= model_table_name %>" class="mt-5 overflow-x-auto">
17
- <%% if @<%= model_variable_name.pluralize %>.any? %>
18
- <table class="min-w-full divide-y divide-gray-300 border border-gray-300">
19
- <thead class="bg-gray-50">
20
- <tr>
21
- <th class="px-3 py-2 text-left text-sm font-semibold text-gray-900">Provider</th>
22
- <th class="px-3 py-2 text-left text-sm font-semibold text-gray-900">Model</th>
23
- <th class="px-3 py-2 text-left text-sm font-semibold text-gray-900">Context Window</th>
24
- <th class="px-3 py-2 text-left text-sm font-semibold text-gray-900">$/1M tokens (In/Out)</th>
25
- <th class="px-3 py-2 text-left text-sm font-semibold text-gray-900"></th>
26
- </tr>
27
- </thead>
28
- <tbody class="divide-y divide-gray-200 bg-white">
29
- <%% @<%= model_variable_name.pluralize %>.each do |model_info| %>
30
- <%%= render "<%= model_model_name.underscore.pluralize %>/<%= model_model_name.demodulize.underscore %>",
31
- <%= model_model_name.demodulize.underscore %>: model_info %>
32
- <%% end %>
33
- </tbody>
34
- </table>
35
- <%% else %>
36
- <p class="text-center my-10">No chat models found.</p>
37
- <%% end %>
38
- </div>
39
-
40
- </div>
@@ -1,27 +0,0 @@
1
- <%% content_for :title, "Showing <%= model_table_name.singularize.humanize.downcase %>" %>
2
-
3
- <div class="md:w-2/3 w-full">
4
- <%% if notice.present? %>
5
- <p class="py-2 px-3 bg-green-50 mb-5 text-green-500 font-medium rounded-md inline-block" id="notice"><%%= notice %></p>
6
- <%% end %>
7
-
8
- <h1 class="font-bold text-4xl">Showing <%= model_table_name.singularize.humanize.downcase %></h1>
9
-
10
- <div class="my-5 space-y-3">
11
- <p><strong class="block font-medium mb-1">Provider:</strong> <%%= @<%= model_variable_name %>.provider_class&.name || @<%= model_variable_name %>.provider %></p>
12
- <p><strong class="block font-medium mb-1">Model:</strong> <%%= @<%= model_variable_name %>.name %></p>
13
- <p><strong class="block font-medium mb-1">ID:</strong> <%%= @<%= model_variable_name %>.model_id %></p>
14
- <p><strong class="block font-medium mb-1">Context Window:</strong> <%%= number_with_delimiter(@<%= model_variable_name %>.context_window) if @<%= model_variable_name %>.context_window %></p>
15
- <p><strong class="block font-medium mb-1">Max Output Tokens:</strong> <%%= number_with_delimiter(@<%= model_variable_name %>.max_output_tokens) if @<%= model_variable_name %>.max_output_tokens %></p>
16
- </div>
17
-
18
- <%% if @<%= model_variable_name %>.capabilities.any? %>
19
- <div class="my-5">
20
- <strong class="block font-medium mb-1">Capabilities:</strong>
21
- <%%= @<%= model_variable_name %>.capabilities.join(", ") %>
22
- </div>
23
- <%% end %>
24
-
25
- <%%= link_to "Start <%= chat_table_name.singularize.humanize.downcase %> with this model", new_<%= chat_variable_name %>_path(model: @<%= model_variable_name %>.model_id), class: "w-full sm:w-auto text-center rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %>
26
- <%%= link_to "All <%= model_table_name.humanize.downcase %>", <%= model_table_name %>_path, class: "w-full sm:w-auto text-center mt-2 sm:mt-0 sm:ml-2 rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %>
27
- </div>
@@ -1,16 +0,0 @@
1
- <div id="<%%= dom_id <%= chat_model_name.demodulize.underscore %> %>">
2
- <div>
3
- <strong>Model:</strong>
4
- <%%= <%= chat_model_name.demodulize.underscore %>.<%= model_table_name.singularize %>&.label || default_model_display_name %>
5
- </div>
6
-
7
- <div>
8
- <strong>Messages:</strong>
9
- <%%= <%= chat_model_name.demodulize.underscore %>.<%= message_table_name %>.count %>
10
- </div>
11
-
12
- <div>
13
- <strong>Created:</strong>
14
- <%%= <%= chat_model_name.demodulize.underscore %>.created_at.strftime("%B %d, %Y at %I:%M %p") %>
15
- </div>
16
- </div>
@@ -1,29 +0,0 @@
1
- <%%= form_with(model: <%= chat_variable_name %>, url: <%= chat_table_name %>_path) do |form| %>
2
- <%% if <%= chat_variable_name %>.errors.any? %>
3
- <div style="color: red">
4
- <h2><%%= pluralize(<%= chat_variable_name %>.errors.count, "error") %> prohibited this <%= chat_table_name.singularize.humanize.downcase %> from being saved:</h2>
5
-
6
- <ul>
7
- <%% <%= chat_variable_name %>.errors.each do |error| %>
8
- <li><%%= error.full_message %></li>
9
- <%% end %>
10
- </ul>
11
- </div>
12
- <%% end %>
13
-
14
- <div>
15
- <%%= form.label :model, "Select AI model:", style: "display: block" %>
16
- <%%= form.select :model,
17
- options_for_select(@chat_models.map { |model| [model.label, model.id] }.unshift([default_model_display_name, nil]), @selected_model),
18
- {},
19
- style: "width: 100%; max-width: 600px; padding: 5px;" %>
20
- </div>
21
-
22
- <div style="margin-top: 15px;">
23
- <%%= form.text_field :prompt, style: "width: 100%; max-width: 600px;", placeholder: "What would you like to discuss?", autofocus: true %>
24
- </div>
25
-
26
- <div>
27
- <%%= form.submit "Start new <%= chat_table_name.singularize.humanize.downcase %>" %>
28
- </div>
29
- <%% end %>
@@ -1,28 +0,0 @@
1
- <%% if notice.present? %>
2
- <p style="color: green"><%%= notice %></p>
3
- <%% end %>
4
-
5
- <%% content_for :title, "<%= chat_model_name.pluralize %>" %>
6
-
7
- <h1><%= chat_model_name.pluralize %></h1>
8
- <p>
9
- <%%= link_to "<%= model_model_name.pluralize %>", <%= model_table_name %>_path %>
10
- </p>
11
-
12
- <div id="<%= chat_table_name %>">
13
- <%% if @<%= chat_table_name %>.any? %>
14
- <%% @<%= chat_table_name %>.each do |<%= chat_variable_name %>| %>
15
- <%%= render <%= chat_variable_name %> %>
16
- <p>
17
- <%%= link_to "Show this <%= chat_table_name.singularize.humanize.downcase %>", <%= chat_variable_name %> %>
18
- </p>
19
- <p>
20
- <%%= link_to "Destroy this <%= chat_table_name.singularize.humanize.downcase %>", <%= chat_variable_name %>, data: { turbo_method: :delete, turbo_confirm: "Are you sure?" } %>
21
- </p>
22
- <%% end %>
23
- <%% else %>
24
- <p>No <%= chat_table_name.humanize.downcase %> found.</p>
25
- <%% end %>
26
- </div>
27
-
28
- <%%= link_to "New <%= chat_table_name.singularize.humanize.downcase %>", new_<%= chat_variable_name %>_path %>
@@ -1,11 +0,0 @@
1
- <%% content_for :title, "New <%= chat_table_name.singularize.humanize.downcase %>" %>
2
-
3
- <h1>New <%= chat_table_name.singularize.humanize.downcase %></h1>
4
-
5
- <%%= render "form", <%= chat_variable_name %>: @<%= chat_variable_name %> %>
6
-
7
- <br>
8
-
9
- <div>
10
- <%%= link_to "Back to <%= chat_table_name.humanize.downcase %>", <%= chat_table_name %>_path %>
11
- </div>
@@ -1,25 +0,0 @@
1
- <%% if notice.present? %>
2
- <p style="color: green"><%%= notice %></p>
3
- <%% end %>
4
-
5
- <%%= turbo_stream_from "<%= chat_variable_name %>_#{@<%= chat_variable_name %>.id}" %>
6
-
7
- <%% content_for :title, "<%= chat_model_name %>" %>
8
-
9
- <h1><%= chat_model_name %> <%%= @<%= chat_variable_name %>.id %></h1>
10
-
11
- <p>Using <strong><%%= @<%= chat_variable_name %>.<%= model_table_name.singularize %>&.label || default_model_display_name %></strong></p>
12
-
13
- <div id="<%= message_table_name %>">
14
- <%% @<%= chat_variable_name %>.<%= message_table_name %>.where.not(id: nil).each do |<%= message_variable_name %>| %>
15
- <%%= render <%= message_variable_name %> %>
16
- <%% end %>
17
- </div>
18
-
19
- <div style="margin-top: 30px;">
20
- <%%= render "<%= message_model_name.underscore.pluralize %>/form", <%= chat_variable_name %>: @<%= chat_variable_name %>, <%= message_variable_name %>: @<%= message_variable_name %> %>
21
- </div>
22
-
23
- <div style="margin-top: 20px;">
24
- <%%= link_to "Back to <%= chat_table_name.humanize.downcase %>", <%= chat_table_name %>_path %>
25
- </div>
@@ -1,9 +0,0 @@
1
- <%% assistant ||= local_assigns[:message] %>
2
- <div id="<%= message_variable_name %>_<%%= assistant.id %>" class="<%= message_variable_name %>"
3
- style="margin-bottom: 20px; padding: 10px; border-left: 3px solid #28a745;">
4
- <div style="font-weight: bold; margin-bottom: 5px;">Assistant</div>
5
- <div id="<%= message_variable_name %>_<%%= assistant.id %>_content" style="white-space: pre-wrap;"><%%= assistant.content %></div>
6
- <div style="font-size: 0.85em; color: #666; margin-top: 5px;">
7
- <%%= assistant.created_at&.strftime("%I:%M %p") %>
8
- </div>
9
- </div>
@@ -1,8 +0,0 @@
1
- <div id="<%= message_variable_name %>_<%%= <%= message_model_name.demodulize.underscore %>.id %>" class="<%= message_variable_name %>"
2
- style="margin-bottom: 20px; padding: 10px; border-left: 3px solid #dc2626; background: #fef2f2;">
3
- <div style="font-weight: bold; margin-bottom: 5px; color: #b91c1c;"><%%= title.presence || "Error" %></div>
4
- <pre style="white-space: pre-wrap; margin: 0; color: #7f1d1d;"><%%= error_message %></pre>
5
- <div style="font-size: 0.85em; color: #7f1d1d; margin-top: 5px;">
6
- <%%= <%= message_model_name.demodulize.underscore %>.created_at&.strftime("%I:%M %p") %>
7
- </div>
8
- </div>
@@ -1,21 +0,0 @@
1
- <%%= form_with(model: <%= message_variable_name %>, url: <%= chat_model_name.include?('::') ? "#{chat_model_name.split('::').first.underscore}_#{chat_model_name.demodulize.underscore}_#{message_model_name.demodulize.underscore.pluralize}_path(@#{chat_variable_name})" : "[@#{chat_variable_name}, #{message_variable_name}]" %>, id: "new_<%= message_variable_name %>") do |form| %>
2
- <%% if <%= message_variable_name %>.errors.any? %>
3
- <div style="color: red">
4
- <h2><%%= pluralize(<%= message_variable_name %>.errors.count, "error") %> prohibited this <%= message_table_name.singularize.humanize.downcase %> from being saved:</h2>
5
-
6
- <ul>
7
- <%% <%= message_variable_name %>.errors.each do |error| %>
8
- <li><%%= error.full_message %></li>
9
- <%% end %>
10
- </ul>
11
- </div>
12
- <%% end %>
13
-
14
- <div>
15
- <%%= form.text_field :content, style: "width: 100%; max-width: 600px;", placeholder: "Message...", autofocus: true %>
16
- </div>
17
-
18
- <div>
19
- <%%= form.submit "Send <%= message_table_name.singularize.humanize.downcase %>" %>
20
- </div>
21
- <%% end %>
@@ -1,6 +0,0 @@
1
- <%% system ||= local_assigns[:message] %>
2
- <div id="<%= message_variable_name %>_<%%= system.id %>" class="<%= message_variable_name %>"
3
- style="margin-bottom: 20px; padding: 10px; border-left: 3px solid #6b7280; background: #f9fafb;">
4
- <div style="font-weight: bold; margin-bottom: 5px; color: #374151;">System</div>
5
- <div style="white-space: pre-wrap; color: #4b5563;"><%%= system.content %></div>
6
- </div>
@@ -1,2 +0,0 @@
1
- <%% tool ||= local_assigns[:message] %>
2
- <%%= render tool_result_partial(tool), tool: tool %>
@@ -1,4 +0,0 @@
1
- <%% tool_calls ||= local_assigns[:message] %>
2
- <%% tool_calls.<%= tool_call_variable_name.pluralize %>.each do |tool_call| %>
3
- <%%= render tool_call_partial(tool_call), tool_calls: tool_calls, tool_call: tool_call %>
4
- <%% end %>
@@ -1,9 +0,0 @@
1
- <%% user ||= local_assigns[:message] %>
2
- <div id="<%= message_variable_name %>_<%%= user.id %>" class="<%= message_variable_name %>"
3
- style="margin-bottom: 20px; padding: 10px; border-left: 3px solid #007bff;">
4
- <div style="font-weight: bold; margin-bottom: 5px;">User</div>
5
- <div id="<%= message_variable_name %>_<%%= user.id %>_content" style="white-space: pre-wrap;"><%%= user.content %></div>
6
- <div style="font-size: 0.85em; color: #666; margin-top: 5px;">
7
- <%%= user.created_at&.strftime("%I:%M %p") %>
8
- </div>
9
- </div>
@@ -1,7 +0,0 @@
1
- <%% if defined?(@<%= chat_variable_name %>) && @<%= chat_variable_name %>.present? %>
2
- <%%= turbo_stream.replace "new_<%= message_variable_name %>" do %>
3
- <%%= render "<%= message_model_name.underscore.pluralize %>/form",
4
- <%= chat_variable_name %>: @<%= chat_variable_name %>,
5
- <%= message_variable_name %>: @<%= chat_variable_name %>.<%= message_table_name %>.build %>
6
- <%% end %>
7
- <%% end %>
@@ -1,8 +0,0 @@
1
- <div id="<%= message_variable_name %>_<%%= tool_calls.id %>" class="<%= message_variable_name %>"
2
- style="margin-bottom: 20px; padding: 10px; border-left: 3px solid #6b7280; background: #f9fafb;">
3
- <div style="font-weight: bold; margin-bottom: 5px;">Tool Call</div>
4
- <pre style="white-space: pre-wrap; margin: 0;"><%%= tool_call.name %>(<%%= tool_call.arguments.map { |k, v| "#{k}: #{v.inspect}" }.join(", ") %>)</pre>
5
- <div style="font-size: 0.85em; color: #666; margin-top: 5px;">
6
- <%%= tool_calls.created_at&.strftime("%I:%M %p") %>
7
- </div>
8
- </div>
@@ -1,16 +0,0 @@
1
- <%% error_message = tool.tool_error_message %>
2
- <%% if error_message.present? %>
3
- <%%= render "<%= message_model_name.underscore.pluralize %>/error",
4
- <%= message_model_name.demodulize.underscore %>: tool,
5
- title: "Tool Result Error",
6
- error_message: error_message %>
7
- <%% else %>
8
- <div id="<%= message_variable_name %>_<%%= tool.id %>" class="<%= message_variable_name %>"
9
- style="margin-bottom: 20px; padding: 10px; border-left: 3px solid #6b7280; background: #f9fafb;">
10
- <div style="font-weight: bold; margin-bottom: 5px;">Tool</div>
11
- <pre style="white-space: pre-wrap; margin: 0;"><%%= tool.content.presence || "(no output)" %></pre>
12
- <div style="font-size: 0.85em; color: #666; margin-top: 5px;">
13
- <%%= tool.created_at&.strftime("%I:%M %p") %>
14
- </div>
15
- </div>
16
- <%% end %>
@@ -1,15 +0,0 @@
1
- <%% model_id = <%= model_model_name.demodulize.underscore %>.respond_to?(:model_id) ? <%= model_model_name.demodulize.underscore %>.model_id : <%= model_model_name.demodulize.underscore %>.id %>
2
- <%% row_id = [<%= model_model_name.demodulize.underscore %>.provider, model_id].join("_").parameterize(separator: "_") %>
3
- <tr id="model_<%%= row_id %>">
4
- <td><%%= <%= model_model_name.demodulize.underscore %>.provider_class&.name || <%= model_model_name.demodulize.underscore %>.provider %></td>
5
- <td><%%= <%= model_model_name.demodulize.underscore %>.respond_to?(:display_name) ? <%= model_model_name.demodulize.underscore %>.display_name : <%= model_model_name.demodulize.underscore %>.name %></td>
6
- <td><%%= number_with_delimiter(<%= model_model_name.demodulize.underscore %>.context_window) if <%= model_model_name.demodulize.underscore %>.context_window %></td>
7
- <td>
8
- <%% input = <%= model_model_name.demodulize.underscore %>.input_price_per_million %>
9
- <%% output = <%= model_model_name.demodulize.underscore %>.output_price_per_million %>
10
- <%% if input && output %>
11
- $<%%= "%.2f" % input %> / $<%%= "%.2f" % output %>
12
- <%% end %>
13
- </td>
14
- <td><%%= link_to "Start <%= chat_table_name.singularize.humanize.downcase %>", new_<%= chat_variable_name %>_path(model: model_id) %></td>
15
- </tr>
@@ -1,38 +0,0 @@
1
- <%% if notice.present? %>
2
- <p style="color: green"><%%= notice %></p>
3
- <%% end %>
4
-
5
- <%% content_for :title, "<%= model_model_name.pluralize %>" %>
6
-
7
- <h1><%= model_model_name.pluralize %></h1>
8
- <p>
9
- <%%= link_to "<%= chat_model_name.pluralize %>", <%= chat_table_name %>_path %>
10
- </p>
11
-
12
- <p>
13
- <%%= button_to "Refresh <%= model_model_name.pluralize %>", refresh_<%= model_table_name %>_path, method: :post %>
14
- </p>
15
-
16
- <div id="<%= model_table_name %>">
17
- <%% if @<%= model_variable_name.pluralize %>.any? %>
18
- <table>
19
- <thead>
20
- <tr>
21
- <th>Provider</th>
22
- <th>Model</th>
23
- <th>Context Window</th>
24
- <th>$/1M tokens (In/Out)</th>
25
- <th></th>
26
- </tr>
27
- </thead>
28
- <tbody>
29
- <%% @<%= model_variable_name.pluralize %>.each do |model_info| %>
30
- <%%= render "<%= model_model_name.underscore.pluralize %>/<%= model_model_name.demodulize.underscore %>",
31
- <%= model_model_name.demodulize.underscore %>: model_info %>
32
- <%% end %>
33
- </tbody>
34
- </table>
35
- <%% else %>
36
- <p>No chat models found.</p>
37
- <%% end %>
38
- </div>
@@ -1,17 +0,0 @@
1
- <%% content_for :title, @<%= model_variable_name %>.name %>
2
-
3
- <h1><%%= @<%= model_variable_name %>.name %></h1>
4
-
5
- <p><strong>ID:</strong> <%%= @<%= model_variable_name %>.model_id %></p>
6
- <p><strong>Provider:</strong> <%%= @<%= model_variable_name %>.provider_class&.name || @<%= model_variable_name %>.provider %></p>
7
- <p><strong>Context Window:</strong> <%%= number_with_delimiter(@<%= model_variable_name %>.context_window) %> tokens</p>
8
- <p><strong>Max Output:</strong> <%%= number_with_delimiter(@<%= model_variable_name %>.max_output_tokens) %> tokens</p>
9
-
10
- <%% if @<%= model_variable_name %>.capabilities.any? %>
11
- <p><strong>Capabilities:</strong> <%%= @<%= model_variable_name %>.capabilities.join(", ") %></p>
12
- <%% end %>
13
-
14
- <p>
15
- <%%= link_to "Start chat with this model", new_<%= chat_variable_name %>_path(model: @<%= model_variable_name %>.model_id) %> |
16
- <%%= link_to "All models", <%= model_table_name %>_path %>
17
- </p>