Module: CompletionKit::ApplicationHelper
- Defined in:
- app/helpers/completion_kit/application_helper.rb
Constant Summary collapse
- OPENAI_MODEL_FAMILY_ORDER =
["GPT-5", "GPT-4", "o-series", "GPT-3.5", "GPT-OSS", "Other"].freeze
Instance Method Summary collapse
- #ck_badge_classes(kind) ⇒ Object
- #ck_button_classes(tone = :dark, variant: :solid) ⇒ Object
- #ck_grouped_models(models, selected = nil) ⇒ Object
- #ck_masked_token(token) ⇒ Object
-
#ck_model_optgroup_label(model) ⇒ Object
Optgroup label for the model select — mirrors the provider models table: OpenRouter splits by upstream vendor, OpenAI splits by family, everyone else is a single group.
- #ck_model_optgroup_sort_key(label) ⇒ Object
- #ck_model_option_label(model) ⇒ Object
- #ck_model_options_html(scope) ⇒ Object
-
#ck_model_table_sections(models) ⇒ Object
Groups a provider’s models for the models-card table, mirroring how the dropdown sub-groups: OpenRouter clusters by upstream vendor (the part before “/”); OpenAI clusters by family; everyone else stays flat.
- #ck_openai_model_family(model_id) ⇒ Object
- #ck_provider_label(provider) ⇒ Object
- #ck_run_dot(run) ⇒ Object
- #ck_run_status_label(run) ⇒ Object
- #ck_score_kind(score) ⇒ Object
- #ck_word_diff_new(old_text, new_text) ⇒ Object
- #ck_word_diff_old(old_text, new_text) ⇒ Object
- #tag_filter_url(base_path, selected, toggling) ⇒ Object
- #tag_pill_class(tag, outline: false) ⇒ Object
Instance Method Details
#ck_badge_classes(kind) ⇒ Object
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
# File 'app/helpers/completion_kit/application_helper.rb', line 26 def ck_badge_classes(kind) case kind.to_s when "high" "ck-badge ck-badge--high" when "medium" "ck-badge ck-badge--medium" when "low" "ck-badge ck-badge--low" when "pending" "ck-badge ck-badge--pending" when "running" "ck-badge ck-badge--running" when "completed" "ck-badge ck-badge--high" when "failed" "ck-badge ck-badge--low" else "ck-badge ck-badge--pending" end end |
#ck_button_classes(tone = :dark, variant: :solid) ⇒ Object
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# File 'app/helpers/completion_kit/application_helper.rb', line 3 def (tone = :dark, variant: :solid) base = "ck-button" styles = case [tone, variant] when [:dark, :solid] "ck-button--primary" when [:light, :outline] "ck-button--secondary" when [:green, :solid] "ck-button--success" when [:red, :outline] "ck-button--danger" when [:amber, :outline] "ck-button--warning" when [:blue, :outline] "ck-button--info" else "ck-button--primary" end "#{base} #{styles}" end |
#ck_grouped_models(models, selected = nil) ⇒ Object
121 122 123 124 125 126 127 128 129 130 131 132 133 |
# File 'app/helpers/completion_kit/application_helper.rb', line 121 def ck_grouped_models(models, selected = nil) if selected.present? && models.none? { |m| m[:id] == selected } retired = CompletionKit::Model.find_by(model_id: selected) if retired models = models + [{ id: retired.model_id, name: "#{retired.display_name || retired.model_id} (retired)", provider: retired.provider }] end end groups = models.group_by { |m| ck_model_optgroup_label(m) } ordered_keys = groups.keys.sort_by { |label| ck_model_optgroup_sort_key(label) } grouped = ordered_keys.map { |label| [label, groups[label].map { |m| [ck_model_option_label(m), m[:id]] }] } (grouped, selected) end |
#ck_masked_token(token) ⇒ Object
75 76 77 78 79 |
# File 'app/helpers/completion_kit/application_helper.rb', line 75 def ck_masked_token(token) return "YOUR_TOKEN" if token.blank? return "••••••••" if token.length < 12 "#{token[0..3]}#{'•' * [token.length - 8, 4].max}#{token[-4..]}" end |
#ck_model_optgroup_label(model) ⇒ Object
Optgroup label for the model select — mirrors the provider models table: OpenRouter splits by upstream vendor, OpenAI splits by family, everyone else is a single group.
138 139 140 141 142 143 144 |
# File 'app/helpers/completion_kit/application_helper.rb', line 138 def ck_model_optgroup_label(model) case model[:provider] when "openrouter" then "OpenRouter — #{model[:id].to_s.split("/", 2).first.delete_prefix("~")}" when "openai" then "OpenAI — #{ck_openai_model_family(model[:id])}" else ck_provider_label(model[:provider]) end end |
#ck_model_optgroup_sort_key(label) ⇒ Object
146 147 148 149 150 151 152 153 154 |
# File 'app/helpers/completion_kit/application_helper.rb', line 146 def ck_model_optgroup_sort_key(label) if label.start_with?("OpenAI — ") [0, OPENAI_MODEL_FAMILY_ORDER.index(label.delete_prefix("OpenAI — ")), label] elsif label.start_with?("OpenRouter") [2, 0, label] else [1, 0, label] end end |
#ck_model_option_label(model) ⇒ Object
116 117 118 119 |
# File 'app/helpers/completion_kit/application_helper.rb', line 116 def ck_model_option_label(model) return "#{model[:name]} (?)" if model.key?(:judging_confirmed) && !model[:judging_confirmed] model[:name] end |
#ck_model_options_html(scope) ⇒ Object
156 157 158 159 160 |
# File 'app/helpers/completion_kit/application_helper.rb', line 156 def (scope) models = CompletionKit::ApiConfig.available_models(scope: scope) return "" if models.empty? ck_grouped_models(models) end |
#ck_model_table_sections(models) ⇒ Object
Groups a provider’s models for the models-card table, mirroring how the dropdown sub-groups: OpenRouter clusters by upstream vendor (the part before “/”); OpenAI clusters by family; everyone else stays flat. Returns [[section_label_or_nil, [models]], …]. A single section collapses to a nil label so we don’t render a redundant header.
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 |
# File 'app/helpers/completion_kit/application_helper.rb', line 98 def ck_model_table_sections(models) models = models.to_a sections = case models.first&.provider when "openrouter" models.group_by { |m| m.model_id.to_s.split("/", 2).first.delete_prefix("~") } .sort_by { |label, _| label } when "openai" grouped = models.group_by { |m| ck_openai_model_family(m.model_id) } ordered = OPENAI_MODEL_FAMILY_ORDER.filter_map { |label| [label, grouped[label]] if grouped[label] } extras = (grouped.keys - OPENAI_MODEL_FAMILY_ORDER).sort.map { |label| [label, grouped[label]] } ordered + extras else [[nil, models]] end sections.size <= 1 ? [[nil, models]] : sections end |
#ck_openai_model_family(model_id) ⇒ Object
83 84 85 86 87 88 89 90 91 |
# File 'app/helpers/completion_kit/application_helper.rb', line 83 def ck_openai_model_family(model_id) id = model_id.to_s return "GPT-5" if id.match?(/\Agpt-5/i) return "GPT-4" if id.match?(/\Agpt-4/i) return "GPT-3.5" if id.match?(/\Agpt-3/i) return "GPT-OSS" if id.match?(/\Agpt-oss/i) return "o-series" if id.match?(/\Ao\d/i) "Other" end |
#ck_provider_label(provider) ⇒ Object
71 72 73 |
# File 'app/helpers/completion_kit/application_helper.rb', line 71 def ck_provider_label(provider) CompletionKit::ProviderCredential::PROVIDER_LABELS[provider.to_s] || provider.to_s.titleize end |
#ck_run_dot(run) ⇒ Object
47 48 49 50 51 52 53 54 |
# File 'app/helpers/completion_kit/application_helper.rb', line 47 def ck_run_dot(run) case run.status when "running" then "ck-dot ck-dot--running" when "failed" then "ck-dot ck-dot--failed" when "completed" then "ck-dot ck-dot--completed" else "ck-dot ck-dot--pending" end end |
#ck_run_status_label(run) ⇒ Object
56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
# File 'app/helpers/completion_kit/application_helper.rb', line 56 def ck_run_status_label(run) case run.status when "pending" then "Ready to run" when "running" if run.progress_total.to_i > 0 "Running (#{run.progress_current}/#{run.progress_total})" else "Running…" end when "completed" then "Completed" when "failed" then "Failed" else run.status.capitalize end end |
#ck_score_kind(score) ⇒ Object
162 163 164 165 166 167 168 |
# File 'app/helpers/completion_kit/application_helper.rb', line 162 def ck_score_kind(score) return :pending if score.nil? return :high if score >= CompletionKit.config.high_quality_threshold return :medium if score >= CompletionKit.config.medium_quality_threshold :low end |
#ck_word_diff_new(old_text, new_text) ⇒ Object
174 175 176 |
# File 'app/helpers/completion_kit/application_helper.rb', line 174 def ck_word_diff_new(old_text, new_text) diff_tokens(old_text, new_text, :new) end |
#ck_word_diff_old(old_text, new_text) ⇒ Object
170 171 172 |
# File 'app/helpers/completion_kit/application_helper.rb', line 170 def ck_word_diff_old(old_text, new_text) diff_tokens(old_text, new_text, :old) end |
#tag_filter_url(base_path, selected, toggling) ⇒ Object
182 183 184 185 186 187 |
# File 'app/helpers/completion_kit/application_helper.rb', line 182 def tag_filter_url(base_path, selected, toggling) remaining = selected.reject { |t| t.id == toggling.id } next_set = selected.include?(toggling) ? remaining : remaining + [toggling] return base_path if next_set.empty? "#{base_path}?#{{ tag: next_set.map(&:name) }.to_query}" end |
#tag_pill_class(tag, outline: false) ⇒ Object
178 179 180 |
# File 'app/helpers/completion_kit/application_helper.rb', line 178 def tag_pill_class(tag, outline: false) ["tag", "tag-#{tag.color}", ("tag-outline" if outline)].compact.join(" ") end |