rubyllm-observ 0.5.1 → 0.6.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/README.md +54 -6
- data/app/assets/stylesheets/observ/_annotations.scss +114 -103
- data/app/assets/stylesheets/observ/_card.scss +58 -49
- data/app/assets/stylesheets/observ/_chat.scss +247 -155
- data/app/assets/stylesheets/observ/_components.scss +622 -340
- data/app/assets/stylesheets/observ/_dashboard.scss +31 -28
- data/app/assets/stylesheets/observ/_datasets.scss +494 -547
- data/app/assets/stylesheets/observ/_drawer.scss +250 -228
- data/app/assets/stylesheets/observ/_filters.scss +139 -0
- data/app/assets/stylesheets/observ/_json_viewer.scss +103 -97
- data/app/assets/stylesheets/observ/_layout.scss +443 -178
- data/app/assets/stylesheets/observ/_metrics.scss +79 -76
- data/app/assets/stylesheets/observ/_namespace.scss +18 -0
- data/app/assets/stylesheets/observ/_observations.scss +122 -119
- data/app/assets/stylesheets/observ/_pagination.scss +129 -112
- data/app/assets/stylesheets/observ/_prompts.scss +485 -269
- data/app/assets/stylesheets/observ/_reset.scss +249 -0
- data/app/assets/stylesheets/observ/_table.scss +46 -38
- data/app/assets/stylesheets/observ/_variables.scss +54 -0
- data/app/assets/stylesheets/observ/application.scss +3 -0
- data/app/controllers/observ/dataset_run_items_controller.rb +0 -1
- data/app/controllers/observ/review_queue_controller.rb +154 -0
- data/app/controllers/observ/scores_controller.rb +64 -0
- data/app/controllers/observ/sessions_controller.rb +23 -0
- data/app/helpers/observ/application_helper.rb +1 -0
- data/app/helpers/observ/reviews_helper.rb +33 -0
- data/app/models/concerns/observ/json_queryable.rb +138 -0
- data/app/models/concerns/observ/reviewable.rb +41 -0
- data/app/models/concerns/observ/scoreable.rb +34 -0
- data/app/models/observ/dataset_run_item.rb +3 -13
- data/app/models/observ/review_item.rb +48 -0
- data/app/models/observ/score.rb +38 -6
- data/app/models/observ/session.rb +5 -1
- data/app/models/observ/trace.rb +3 -0
- data/app/services/observ/evaluators/base_evaluator.rb +0 -1
- data/app/services/observ/guardrail_service.rb +128 -0
- data/app/views/kaminari/_first_page.html.erb +1 -1
- data/app/views/kaminari/_gap.html.erb +1 -1
- data/app/views/kaminari/_last_page.html.erb +1 -1
- data/app/views/kaminari/_next_page.html.erb +1 -1
- data/app/views/kaminari/_page.html.erb +1 -1
- data/app/views/kaminari/_paginator.html.erb +1 -1
- data/app/views/kaminari/_prev_page.html.erb +1 -1
- data/app/views/kaminari/observ/_first_page.html.erb +1 -1
- data/app/views/kaminari/observ/_gap.html.erb +1 -1
- data/app/views/kaminari/observ/_last_page.html.erb +1 -1
- data/app/views/kaminari/observ/_next_page.html.erb +1 -1
- data/app/views/kaminari/observ/_page.html.erb +1 -1
- data/app/views/kaminari/observ/_paginator.html.erb +1 -1
- data/app/views/kaminari/observ/_prev_page.html.erb +1 -1
- data/app/views/layouts/observ/application.html.erb +96 -58
- data/app/views/observ/annotations/_form.html.erb +5 -5
- data/app/views/observ/annotations/index.html.erb +4 -4
- data/app/views/observ/annotations/sessions_index.html.erb +9 -9
- data/app/views/observ/annotations/traces_index.html.erb +9 -9
- data/app/views/observ/chats/_form.html.erb +7 -7
- data/app/views/observ/datasets/index.html.erb +6 -6
- data/app/views/observ/messages/_form.html.erb +11 -12
- data/app/views/observ/observations/index.html.erb +3 -4
- data/app/views/observ/prompts/_form.html.erb +37 -38
- data/app/views/observ/prompts/_new_form.html.erb +37 -38
- data/app/views/observ/prompts/compare.html.erb +59 -55
- data/app/views/observ/prompts/edit.html.erb +3 -3
- data/app/views/observ/prompts/index.html.erb +9 -9
- data/app/views/observ/prompts/new.html.erb +3 -3
- data/app/views/observ/prompts/show.html.erb +2 -2
- data/app/views/observ/prompts/versions.html.erb +22 -22
- data/app/views/observ/review_queue/_item.html.erb +39 -0
- data/app/views/observ/review_queue/_stats.html.erb +18 -0
- data/app/views/observ/review_queue/index.html.erb +49 -0
- data/app/views/observ/review_queue/show.html.erb +76 -0
- data/app/views/observ/review_queue/stats.html.erb +100 -0
- data/app/views/observ/scores/_form.html.erb +39 -0
- data/app/views/observ/scores/create.turbo_stream.erb +10 -0
- data/app/views/observ/sessions/_chat.html.erb +59 -0
- data/app/views/observ/sessions/_metadata.html.erb +17 -0
- data/app/views/observ/sessions/_metrics.html.erb +81 -0
- data/app/views/observ/sessions/_traces.html.erb +92 -0
- data/app/views/observ/sessions/annotations_drawer.turbo_stream.erb +8 -1
- data/app/views/observ/sessions/index.html.erb +60 -4
- data/app/views/observ/sessions/show.html.erb +4 -217
- data/app/views/observ/traces/_details.html.erb +47 -0
- data/app/views/observ/traces/_input.html.erb +10 -0
- data/app/views/observ/traces/_metadata.html.erb +10 -0
- data/app/views/observ/traces/_observations.html.erb +172 -0
- data/app/views/observ/traces/_output.html.erb +10 -0
- data/app/views/observ/traces/annotations_drawer.turbo_stream.erb +8 -1
- data/app/views/observ/traces/index.html.erb +3 -4
- data/app/views/observ/traces/show.html.erb +5 -232
- data/config/routes.rb +14 -0
- data/db/migrate/015_refactor_scores_to_polymorphic.rb +27 -0
- data/db/migrate/016_create_observ_review_items.rb +25 -0
- data/lib/observ/version.rb +1 -1
- metadata +30 -1
|
@@ -1,76 +1,74 @@
|
|
|
1
1
|
<%= form_with model: form, url: prompts_path, method: :post do |f| %>
|
|
2
2
|
|
|
3
3
|
<% if form.errors.any? %>
|
|
4
|
-
<div class="observ-
|
|
5
|
-
<
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
</ul>
|
|
14
|
-
</div>
|
|
4
|
+
<div class="observ-alert observ-alert--danger">
|
|
5
|
+
<h3 class="observ-alert__title">
|
|
6
|
+
<%= pluralize(form.errors.count, "error") %> prohibited this prompt from being saved:
|
|
7
|
+
</h3>
|
|
8
|
+
<ul class="observ-alert__list">
|
|
9
|
+
<% form.errors.full_messages.each do |message| %>
|
|
10
|
+
<li><%= message %></li>
|
|
11
|
+
<% end %>
|
|
12
|
+
</ul>
|
|
15
13
|
</div>
|
|
16
14
|
<% end %>
|
|
17
15
|
|
|
18
16
|
<div class="observ-card">
|
|
19
17
|
<div class="observ-card__body">
|
|
20
18
|
<!-- Prompt Name -->
|
|
21
|
-
<div
|
|
22
|
-
<%= f.label :name, "Prompt Name",
|
|
19
|
+
<div class="observ-form__group">
|
|
20
|
+
<%= f.label :name, "Prompt Name", class: "observ-form__label" %>
|
|
23
21
|
<%= f.text_field :name,
|
|
24
22
|
placeholder: "e.g., research-agent-system-prompt",
|
|
25
|
-
|
|
26
|
-
<p
|
|
23
|
+
class: "observ-form__input" %>
|
|
24
|
+
<p class="observ-form__hint">
|
|
27
25
|
Use kebab-case. This will be used to identify the prompt (e.g., "my-agent-system-prompt")
|
|
28
26
|
</p>
|
|
29
27
|
</div>
|
|
30
28
|
|
|
31
29
|
<!-- Commit Message -->
|
|
32
|
-
<div
|
|
33
|
-
<%= f.label :commit_message, "Commit Message",
|
|
30
|
+
<div class="observ-form__group">
|
|
31
|
+
<%= f.label :commit_message, "Commit Message", class: "observ-form__label" %>
|
|
34
32
|
<%= f.text_area :commit_message,
|
|
35
33
|
rows: 2,
|
|
36
34
|
placeholder: "Describe what changed in this version...",
|
|
37
|
-
|
|
38
|
-
<p
|
|
35
|
+
class: "observ-form__textarea" %>
|
|
36
|
+
<p class="observ-form__hint">
|
|
39
37
|
Optional but recommended for tracking changes
|
|
40
38
|
</p>
|
|
41
39
|
</div>
|
|
42
40
|
|
|
43
41
|
<!-- Prompt Content -->
|
|
44
|
-
<div
|
|
45
|
-
<%= f.label :prompt, "Prompt Content",
|
|
42
|
+
<div class="observ-form__group" data-controller="observ--prompt-variables">
|
|
43
|
+
<%= f.label :prompt, "Prompt Content", class: "observ-form__label" %>
|
|
46
44
|
<%= f.text_area :prompt,
|
|
47
45
|
rows: 15,
|
|
48
46
|
placeholder: "Enter your prompt here...\n\nUse {{variable_name}} for dynamic variables.",
|
|
49
|
-
|
|
47
|
+
class: "observ-form__textarea observ-form__textarea--code",
|
|
50
48
|
data: {
|
|
51
49
|
observ__prompt_variables_target: "input",
|
|
52
50
|
action: "input->observ--prompt-variables#detectVariables"
|
|
53
51
|
} %>
|
|
54
|
-
<p
|
|
55
|
-
Use <code
|
|
52
|
+
<p class="observ-form__hint">
|
|
53
|
+
Use <code class="observ-code">{{variable_name}}</code> syntax for variables
|
|
56
54
|
</p>
|
|
57
55
|
|
|
58
56
|
<!-- Variable Preview -->
|
|
59
|
-
<div data-observ--prompt-variables-target="preview"
|
|
60
|
-
<p
|
|
61
|
-
<div data-observ--prompt-variables-target="list"
|
|
57
|
+
<div data-observ--prompt-variables-target="preview" class="observ-prompt-form__variable-preview">
|
|
58
|
+
<p class="observ-prompt-form__variable-title">Detected Variables:</p>
|
|
59
|
+
<div data-observ--prompt-variables-target="list" class="observ-prompt-form__variable-list"></div>
|
|
62
60
|
</div>
|
|
63
61
|
</div>
|
|
64
62
|
|
|
65
63
|
<!-- Configuration (JSON) -->
|
|
66
|
-
<div
|
|
67
|
-
<%= f.label :config, "Configuration (JSON)",
|
|
64
|
+
<div class="observ-form__group">
|
|
65
|
+
<%= f.label :config, "Configuration (JSON)", class: "observ-form__label" %>
|
|
68
66
|
<%= f.text_area :config,
|
|
69
67
|
rows: 8,
|
|
70
68
|
placeholder: '{\n "model": "gpt-4o",\n "temperature": 0.7,\n "max_tokens": 2000\n}',
|
|
71
|
-
|
|
69
|
+
class: "observ-form__textarea observ-form__textarea--code",
|
|
72
70
|
data: { controller: "json-editor" } %>
|
|
73
|
-
<p
|
|
71
|
+
<p class="observ-form__hint">
|
|
74
72
|
Optional JSON configuration for model parameters and metadata
|
|
75
73
|
</p>
|
|
76
74
|
</div>
|
|
@@ -79,20 +77,21 @@
|
|
|
79
77
|
<%= f.hidden_field :from_version %>
|
|
80
78
|
|
|
81
79
|
<!-- Actions -->
|
|
82
|
-
<div
|
|
83
|
-
<div>
|
|
84
|
-
<label
|
|
85
|
-
<%= f.check_box :promote_to_production,
|
|
86
|
-
<span
|
|
80
|
+
<div class="observ-form__actions observ-form__actions--between">
|
|
81
|
+
<div class="observ-form__checkbox-group">
|
|
82
|
+
<label class="observ-form__checkbox-label">
|
|
83
|
+
<%= f.check_box :promote_to_production, class: "observ-form__checkbox" %>
|
|
84
|
+
<span class="observ-form__checkbox-custom"></span>
|
|
85
|
+
<span class="observ-form__checkbox-text">
|
|
87
86
|
Promote to production immediately
|
|
88
87
|
</span>
|
|
89
88
|
</label>
|
|
90
|
-
<p
|
|
89
|
+
<p class="observ-form__checkbox-hint">
|
|
91
90
|
If unchecked, prompt will be saved as draft
|
|
92
91
|
</p>
|
|
93
92
|
</div>
|
|
94
93
|
|
|
95
|
-
<div
|
|
94
|
+
<div class="observ-form__actions-group">
|
|
96
95
|
<%= link_to "Cancel", prompts_path, class: "observ-button" %>
|
|
97
96
|
<%= f.submit "Create Prompt", class: "observ-button observ-button--primary" %>
|
|
98
97
|
</div>
|
|
@@ -3,21 +3,21 @@
|
|
|
3
3
|
<% content_for :page_header do %>
|
|
4
4
|
<div class="observ-page-header__content">
|
|
5
5
|
<div>
|
|
6
|
-
<%= link_to "← Back to Prompt", prompt_path(@prompt_name),
|
|
6
|
+
<%= link_to "← Back to Prompt", prompt_path(@prompt_name), class: "observ-link" %>
|
|
7
7
|
<h1 class="observ-page-header__title">Compare Versions</h1>
|
|
8
|
-
<p
|
|
8
|
+
<p class="observ-prompt-header__subtitle"><%= @prompt_name %></p>
|
|
9
9
|
</div>
|
|
10
10
|
</div>
|
|
11
11
|
<% end %>
|
|
12
12
|
|
|
13
13
|
<div class="observ-container">
|
|
14
14
|
<!-- Version Selector -->
|
|
15
|
-
<div class="observ-card"
|
|
15
|
+
<div class="observ-card">
|
|
16
16
|
<div class="observ-card__body">
|
|
17
|
-
<%= form_with url: compare_prompt_path(@prompt_name), method: :get,
|
|
17
|
+
<%= form_with url: compare_prompt_path(@prompt_name), method: :get, class: "observ-compare__selector" do |f| %>
|
|
18
18
|
|
|
19
|
-
<div
|
|
20
|
-
<%= f.label :from, "From Version",
|
|
19
|
+
<div class="observ-compare__field">
|
|
20
|
+
<%= f.label :from, "From Version", class: "observ-form__label" %>
|
|
21
21
|
<%= f.select :from,
|
|
22
22
|
options_for_select(
|
|
23
23
|
Observ::Prompt.where(name: @prompt_name).order(version: :desc).map { |v|
|
|
@@ -26,11 +26,11 @@
|
|
|
26
26
|
params[:from]
|
|
27
27
|
),
|
|
28
28
|
{},
|
|
29
|
-
|
|
29
|
+
class: "observ-form__select" %>
|
|
30
30
|
</div>
|
|
31
31
|
|
|
32
|
-
<div
|
|
33
|
-
<%= f.label :to, "To Version",
|
|
32
|
+
<div class="observ-compare__field">
|
|
33
|
+
<%= f.label :to, "To Version", class: "observ-form__label" %>
|
|
34
34
|
<%= f.select :to,
|
|
35
35
|
options_for_select(
|
|
36
36
|
Observ::Prompt.where(name: @prompt_name).order(version: :desc).map { |v|
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
params[:to]
|
|
40
40
|
),
|
|
41
41
|
{},
|
|
42
|
-
|
|
42
|
+
class: "observ-form__select" %>
|
|
43
43
|
</div>
|
|
44
44
|
|
|
45
45
|
<%= f.submit "Compare", class: "observ-button observ-button--primary" %>
|
|
@@ -48,63 +48,63 @@
|
|
|
48
48
|
</div>
|
|
49
49
|
|
|
50
50
|
<!-- Metadata Comparison -->
|
|
51
|
-
<div class="observ-card"
|
|
52
|
-
<div
|
|
53
|
-
<div
|
|
54
|
-
<div
|
|
55
|
-
<h2
|
|
51
|
+
<div class="observ-card">
|
|
52
|
+
<div class="observ-compare__grid">
|
|
53
|
+
<div class="observ-compare__panel observ-compare__panel--left">
|
|
54
|
+
<div class="observ-compare__version-header">
|
|
55
|
+
<h2 class="observ-compare__version-title">Version <%= @from_version.version %></h2>
|
|
56
56
|
<span class="observ-badge <%= case @from_version.state
|
|
57
57
|
when 'draft' then 'observ-badge--warning'
|
|
58
58
|
when 'production' then 'observ-badge--success'
|
|
59
59
|
when 'archived' then 'observ-badge--default'
|
|
60
|
-
end %>"
|
|
60
|
+
end %>">
|
|
61
61
|
<%= @from_version.state %>
|
|
62
62
|
</span>
|
|
63
63
|
</div>
|
|
64
64
|
|
|
65
|
-
<dl
|
|
66
|
-
<div>
|
|
67
|
-
<dt
|
|
68
|
-
<dd
|
|
65
|
+
<dl class="observ-compare__metadata">
|
|
66
|
+
<div class="observ-compare__metadata-item">
|
|
67
|
+
<dt>Created</dt>
|
|
68
|
+
<dd><%= @from_version.created_at.strftime("%b %d, %Y %I:%M %p") %></dd>
|
|
69
69
|
</div>
|
|
70
|
-
<div>
|
|
71
|
-
<dt
|
|
72
|
-
<dd
|
|
70
|
+
<div class="observ-compare__metadata-item">
|
|
71
|
+
<dt>Created By</dt>
|
|
72
|
+
<dd><%= @from_version.created_by || "system" %></dd>
|
|
73
73
|
</div>
|
|
74
74
|
<% if @from_version.commit_message.present? %>
|
|
75
|
-
<div>
|
|
76
|
-
<dt
|
|
77
|
-
<dd
|
|
75
|
+
<div class="observ-compare__metadata-item">
|
|
76
|
+
<dt>Commit Message</dt>
|
|
77
|
+
<dd class="observ-compare__metadata-item--italic">"<%= @from_version.commit_message %>"</dd>
|
|
78
78
|
</div>
|
|
79
79
|
<% end %>
|
|
80
80
|
</dl>
|
|
81
81
|
</div>
|
|
82
82
|
|
|
83
|
-
<div
|
|
84
|
-
<div
|
|
85
|
-
<h2
|
|
83
|
+
<div class="observ-compare__panel">
|
|
84
|
+
<div class="observ-compare__version-header">
|
|
85
|
+
<h2 class="observ-compare__version-title">Version <%= @to_version.version %></h2>
|
|
86
86
|
<span class="observ-badge <%= case @to_version.state
|
|
87
87
|
when 'draft' then 'observ-badge--warning'
|
|
88
88
|
when 'production' then 'observ-badge--success'
|
|
89
89
|
when 'archived' then 'observ-badge--default'
|
|
90
|
-
end %>"
|
|
90
|
+
end %>">
|
|
91
91
|
<%= @to_version.state %>
|
|
92
92
|
</span>
|
|
93
93
|
</div>
|
|
94
94
|
|
|
95
|
-
<dl
|
|
96
|
-
<div>
|
|
97
|
-
<dt
|
|
98
|
-
<dd
|
|
95
|
+
<dl class="observ-compare__metadata">
|
|
96
|
+
<div class="observ-compare__metadata-item">
|
|
97
|
+
<dt>Created</dt>
|
|
98
|
+
<dd><%= @to_version.created_at.strftime("%b %d, %Y %I:%M %p") %></dd>
|
|
99
99
|
</div>
|
|
100
|
-
<div>
|
|
101
|
-
<dt
|
|
102
|
-
<dd
|
|
100
|
+
<div class="observ-compare__metadata-item">
|
|
101
|
+
<dt>Created By</dt>
|
|
102
|
+
<dd><%= @to_version.created_by || "system" %></dd>
|
|
103
103
|
</div>
|
|
104
104
|
<% if @to_version.commit_message.present? %>
|
|
105
|
-
<div>
|
|
106
|
-
<dt
|
|
107
|
-
<dd
|
|
105
|
+
<div class="observ-compare__metadata-item">
|
|
106
|
+
<dt>Commit Message</dt>
|
|
107
|
+
<dd class="observ-compare__metadata-item--italic">"<%= @to_version.commit_message %>"</dd>
|
|
108
108
|
</div>
|
|
109
109
|
<% end %>
|
|
110
110
|
</dl>
|
|
@@ -115,21 +115,21 @@
|
|
|
115
115
|
<!-- Side-by-Side Diff -->
|
|
116
116
|
<div class="observ-card">
|
|
117
117
|
<div class="observ-card__header">
|
|
118
|
-
<h2
|
|
118
|
+
<h2 class="observ-compare__section-title">Prompt Content Comparison</h2>
|
|
119
119
|
</div>
|
|
120
120
|
|
|
121
|
-
<div
|
|
121
|
+
<div class="observ-compare__grid">
|
|
122
122
|
<!-- Left: From Version -->
|
|
123
|
-
<div
|
|
124
|
-
<div
|
|
125
|
-
<pre
|
|
123
|
+
<div class="observ-compare__panel observ-compare__panel--left">
|
|
124
|
+
<div class="observ-compare__content-block">
|
|
125
|
+
<pre><%= render "diff_content", content: @from_version.prompt, diff: @diff, side: :from %></pre>
|
|
126
126
|
</div>
|
|
127
127
|
</div>
|
|
128
128
|
|
|
129
129
|
<!-- Right: To Version -->
|
|
130
|
-
<div
|
|
131
|
-
<div
|
|
132
|
-
<pre
|
|
130
|
+
<div class="observ-compare__panel">
|
|
131
|
+
<div class="observ-compare__content-block">
|
|
132
|
+
<pre><%= render "diff_content", content: @to_version.prompt, diff: @diff, side: :to %></pre>
|
|
133
133
|
</div>
|
|
134
134
|
</div>
|
|
135
135
|
</div>
|
|
@@ -137,17 +137,21 @@
|
|
|
137
137
|
|
|
138
138
|
<!-- Config Comparison -->
|
|
139
139
|
<% if @from_version.config.present? || @to_version.config.present? %>
|
|
140
|
-
<div class="observ-card"
|
|
140
|
+
<div class="observ-card">
|
|
141
141
|
<div class="observ-card__header">
|
|
142
|
-
<h2
|
|
142
|
+
<h2 class="observ-compare__section-title">Configuration Comparison</h2>
|
|
143
143
|
</div>
|
|
144
144
|
|
|
145
|
-
<div
|
|
146
|
-
<div
|
|
147
|
-
<
|
|
145
|
+
<div class="observ-compare__grid">
|
|
146
|
+
<div class="observ-compare__panel observ-compare__panel--left">
|
|
147
|
+
<div class="observ-compare__content-block">
|
|
148
|
+
<pre><%= JSON.pretty_generate(@from_version.config) %></pre>
|
|
149
|
+
</div>
|
|
148
150
|
</div>
|
|
149
|
-
<div
|
|
150
|
-
<
|
|
151
|
+
<div class="observ-compare__panel">
|
|
152
|
+
<div class="observ-compare__content-block">
|
|
153
|
+
<pre><%= JSON.pretty_generate(@to_version.config) %></pre>
|
|
154
|
+
</div>
|
|
151
155
|
</div>
|
|
152
156
|
</div>
|
|
153
157
|
</div>
|
|
@@ -3,15 +3,15 @@
|
|
|
3
3
|
<% content_for :page_header do %>
|
|
4
4
|
<div class="observ-page-header__content">
|
|
5
5
|
<div>
|
|
6
|
-
<%= link_to "← Back to Prompt", prompt_path(@prompt.name),
|
|
6
|
+
<%= link_to "← Back to Prompt", prompt_path(@prompt.name), class: "observ-link" %>
|
|
7
7
|
<h1 class="observ-page-header__title">Edit Prompt Draft</h1>
|
|
8
|
-
<p
|
|
8
|
+
<p class="observ-prompt-header__subtitle">
|
|
9
9
|
Editing <%= @prompt.name %> (v<%= @prompt.version %> - Draft)
|
|
10
10
|
</p>
|
|
11
11
|
</div>
|
|
12
12
|
</div>
|
|
13
13
|
<% end %>
|
|
14
14
|
|
|
15
|
-
<div class="observ-container"
|
|
15
|
+
<div class="observ-container">
|
|
16
16
|
<%= render "form", prompt: @prompt %>
|
|
17
17
|
</div>
|
|
@@ -9,29 +9,29 @@
|
|
|
9
9
|
|
|
10
10
|
<div class="observ-container">
|
|
11
11
|
<!-- Search and Filters -->
|
|
12
|
-
<section class="observ-card observ-
|
|
12
|
+
<section class="observ-card observ-filters">
|
|
13
13
|
<div class="observ-card__body">
|
|
14
|
-
<%= form_with url: prompts_path, method: :get, class: "observ-
|
|
15
|
-
<div class="observ-
|
|
16
|
-
<%= f.label :search, "Search prompts", class: "observ-
|
|
14
|
+
<%= form_with url: prompts_path, method: :get, class: "observ-filters__form" do |f| %>
|
|
15
|
+
<div class="observ-filters__field observ-filters__field--flex">
|
|
16
|
+
<%= f.label :search, "Search prompts", class: "observ-filters__label" %>
|
|
17
17
|
<%= f.text_field :search,
|
|
18
18
|
value: params[:search],
|
|
19
19
|
placeholder: "Search by name...",
|
|
20
|
-
class: "observ-
|
|
20
|
+
class: "observ-filters__input" %>
|
|
21
21
|
</div>
|
|
22
22
|
|
|
23
|
-
<div class="observ-
|
|
24
|
-
<%= f.label :state, "Filter by state", class: "observ-
|
|
23
|
+
<div class="observ-filters__field observ-filters__field--lg">
|
|
24
|
+
<%= f.label :state, "Filter by state", class: "observ-filters__label" %>
|
|
25
25
|
<%= f.select :state,
|
|
26
26
|
options_for_select(
|
|
27
27
|
[["All States", ""], ["Draft", "draft"], ["Production", "production"], ["Archived", "archived"]],
|
|
28
28
|
params[:state]
|
|
29
29
|
),
|
|
30
30
|
{},
|
|
31
|
-
class: "observ-
|
|
31
|
+
class: "observ-filters__select" %>
|
|
32
32
|
</div>
|
|
33
33
|
|
|
34
|
-
<div class="observ-
|
|
34
|
+
<div class="observ-filters__actions">
|
|
35
35
|
<%= f.submit "Filter", class: "observ-button observ-button--secondary" %>
|
|
36
36
|
<%= link_to "Clear", prompts_path, class: "observ-button" %>
|
|
37
37
|
</div>
|
|
@@ -3,15 +3,15 @@
|
|
|
3
3
|
<% content_for :page_header do %>
|
|
4
4
|
<div class="observ-page-header__content">
|
|
5
5
|
<div>
|
|
6
|
-
<%= link_to "← Back to Prompts", prompts_path,
|
|
6
|
+
<%= link_to "← Back to Prompts", prompts_path, class: "observ-link" %>
|
|
7
7
|
<h1 class="observ-page-header__title">Create New Prompt</h1>
|
|
8
|
-
<p
|
|
8
|
+
<p class="observ-prompt-header__subtitle">
|
|
9
9
|
Create a new prompt version. All new prompts start as drafts.
|
|
10
10
|
</p>
|
|
11
11
|
</div>
|
|
12
12
|
</div>
|
|
13
13
|
<% end %>
|
|
14
14
|
|
|
15
|
-
<div class="observ-container"
|
|
15
|
+
<div class="observ-container">
|
|
16
16
|
<%= render "new_form", form: @form %>
|
|
17
17
|
</div>
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
<% content_for :page_header do %>
|
|
4
4
|
<div class="observ-page-header__content">
|
|
5
5
|
<div>
|
|
6
|
-
<%= link_to "← Back to Prompts", prompts_path, class: "
|
|
6
|
+
<%= link_to "← Back to Prompts", prompts_path, class: "observ-link" %>
|
|
7
7
|
<h1 class="observ-page-header__title"><%= @prompt.name %></h1>
|
|
8
|
-
<p class="prompt-
|
|
8
|
+
<p class="observ-prompt-header__subtitle">
|
|
9
9
|
Currently viewing version <%= @prompt.version %>
|
|
10
10
|
</p>
|
|
11
11
|
</div>
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
<% content_for :page_header do %>
|
|
4
4
|
<div class="observ-page-header__content">
|
|
5
5
|
<div>
|
|
6
|
-
<%= link_to "← Back to Prompt", prompt_path(@prompt_name),
|
|
6
|
+
<%= link_to "← Back to Prompt", prompt_path(@prompt_name), class: "observ-link" %>
|
|
7
7
|
<h1 class="observ-page-header__title">Version History</h1>
|
|
8
|
-
<p
|
|
8
|
+
<p class="observ-prompt-header__subtitle"><%= @prompt_name %></p>
|
|
9
9
|
</div>
|
|
10
10
|
</div>
|
|
11
11
|
<% end %>
|
|
@@ -14,53 +14,53 @@
|
|
|
14
14
|
<!-- Timeline View -->
|
|
15
15
|
<div class="observ-card">
|
|
16
16
|
<div class="observ-card__body">
|
|
17
|
-
<div
|
|
17
|
+
<div class="observ-timeline">
|
|
18
18
|
<% @versions.each_with_index do |version, index| %>
|
|
19
|
-
<div
|
|
19
|
+
<div class="observ-timeline__item">
|
|
20
20
|
<!-- Timeline Line -->
|
|
21
|
-
<div
|
|
22
|
-
<div
|
|
23
|
-
when 'production' then '
|
|
24
|
-
when 'draft' then '
|
|
25
|
-
when 'archived' then '
|
|
21
|
+
<div class="observ-timeline__marker">
|
|
22
|
+
<div class="observ-timeline__dot observ-timeline__dot--<%= case version.state
|
|
23
|
+
when 'production' then 'success'
|
|
24
|
+
when 'draft' then 'warning'
|
|
25
|
+
when 'archived' then 'muted'
|
|
26
26
|
end %>">
|
|
27
27
|
</div>
|
|
28
28
|
<% unless index == @versions.count - 1 %>
|
|
29
|
-
<div
|
|
29
|
+
<div class="observ-timeline__line"></div>
|
|
30
30
|
<% end %>
|
|
31
31
|
</div>
|
|
32
32
|
|
|
33
33
|
<!-- Version Card -->
|
|
34
|
-
<div
|
|
35
|
-
<div
|
|
36
|
-
<div
|
|
37
|
-
<div
|
|
38
|
-
<div
|
|
39
|
-
<h3
|
|
34
|
+
<div class="observ-timeline__content">
|
|
35
|
+
<div class="observ-version-card">
|
|
36
|
+
<div class="observ-version-card__header">
|
|
37
|
+
<div>
|
|
38
|
+
<div class="observ-version-card__title-row">
|
|
39
|
+
<h3 class="observ-version-card__title">Version <%= version.version %></h3>
|
|
40
40
|
<span class="observ-badge <%= case version.state
|
|
41
41
|
when 'draft' then 'observ-badge--warning'
|
|
42
42
|
when 'production' then 'observ-badge--success'
|
|
43
43
|
when 'archived' then 'observ-badge--default'
|
|
44
|
-
end %>"
|
|
44
|
+
end %>">
|
|
45
45
|
<%= version.state.titleize %>
|
|
46
46
|
</span>
|
|
47
47
|
</div>
|
|
48
48
|
|
|
49
|
-
<p
|
|
49
|
+
<p class="observ-version-card__meta">
|
|
50
50
|
<%= version.created_at.strftime("%B %d, %Y at %I:%M %p") %>
|
|
51
51
|
<% if version.created_by.present? %>
|
|
52
|
-
by <span
|
|
52
|
+
by <span class="observ-version-card__author"><%= version.created_by %></span>
|
|
53
53
|
<% end %>
|
|
54
54
|
</p>
|
|
55
55
|
|
|
56
56
|
<% if version.commit_message.present? %>
|
|
57
|
-
<p
|
|
57
|
+
<p class="observ-version-card__commit">
|
|
58
58
|
"<%= version.commit_message %>"
|
|
59
59
|
</p>
|
|
60
60
|
<% end %>
|
|
61
61
|
</div>
|
|
62
62
|
|
|
63
|
-
<div
|
|
63
|
+
<div class="observ-version-card__actions">
|
|
64
64
|
<%= link_to "View", prompt_path(@prompt_name, version: version.version), class: "observ-button observ-button--sm observ-button--secondary" %>
|
|
65
65
|
|
|
66
66
|
<% if @production_version && version != @production_version %>
|
|
@@ -74,7 +74,7 @@
|
|
|
74
74
|
</div>
|
|
75
75
|
|
|
76
76
|
<!-- Preview -->
|
|
77
|
-
<div
|
|
77
|
+
<div class="observ-version-card__preview">
|
|
78
78
|
<%= truncate(version.prompt, length: 200) %>
|
|
79
79
|
</div>
|
|
80
80
|
</div>
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
<tr class="observ-table__row">
|
|
2
|
+
<td class="observ-table__cell">
|
|
3
|
+
<span class="observ-badge <%= review_item.priority_badge_class %>">
|
|
4
|
+
<%= review_item.priority.capitalize %>
|
|
5
|
+
</span>
|
|
6
|
+
</td>
|
|
7
|
+
<td class="observ-table__cell">
|
|
8
|
+
<span class="observ-type-label">
|
|
9
|
+
<%= review_item.reviewable_type_display %>
|
|
10
|
+
</span>
|
|
11
|
+
</td>
|
|
12
|
+
<td class="observ-table__cell">
|
|
13
|
+
<%= review_item.reason_display %>
|
|
14
|
+
<% if review_item.reason_details.present? %>
|
|
15
|
+
<span class="observ-text--muted observ-text--small">
|
|
16
|
+
<% if review_item.reason_details["cost"] %>
|
|
17
|
+
($<%= number_with_precision(review_item.reason_details["cost"], precision: 4) %>)
|
|
18
|
+
<% elsif review_item.reason_details["latency_ms"] %>
|
|
19
|
+
(<%= number_with_delimiter(review_item.reason_details["latency_ms"]) %>ms)
|
|
20
|
+
<% elsif review_item.reason_details["tokens"] %>
|
|
21
|
+
(<%= number_with_delimiter(review_item.reason_details["tokens"]) %> tokens)
|
|
22
|
+
<% end %>
|
|
23
|
+
</span>
|
|
24
|
+
<% end %>
|
|
25
|
+
</td>
|
|
26
|
+
<td class="observ-table__cell">
|
|
27
|
+
<span class="observ-badge observ-badge--<%= review_item.status == 'in_progress' ? 'warning' : 'secondary' %>">
|
|
28
|
+
<%= review_item.status.humanize %>
|
|
29
|
+
</span>
|
|
30
|
+
</td>
|
|
31
|
+
<td class="observ-table__cell">
|
|
32
|
+
<span class="observ-text--muted" title="<%= review_item.created_at %>">
|
|
33
|
+
<%= time_ago_in_words(review_item.created_at) %> ago
|
|
34
|
+
</span>
|
|
35
|
+
</td>
|
|
36
|
+
<td class="observ-table__cell observ-table__cell--actions">
|
|
37
|
+
<%= link_to "Review", review_path(review_item), class: "observ-button observ-button--sm" %>
|
|
38
|
+
</td>
|
|
39
|
+
</tr>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<div class="observ-stats-bar">
|
|
2
|
+
<div class="observ-stat">
|
|
3
|
+
<span class="observ-stat__value"><%= stats[:pending] %></span>
|
|
4
|
+
<span class="observ-stat__label">Pending</span>
|
|
5
|
+
</div>
|
|
6
|
+
<div class="observ-stat">
|
|
7
|
+
<span class="observ-stat__value"><%= stats[:in_progress] %></span>
|
|
8
|
+
<span class="observ-stat__label">In Progress</span>
|
|
9
|
+
</div>
|
|
10
|
+
<div class="observ-stat">
|
|
11
|
+
<span class="observ-stat__value"><%= stats[:completed_today] %></span>
|
|
12
|
+
<span class="observ-stat__label">Completed Today</span>
|
|
13
|
+
</div>
|
|
14
|
+
<div class="observ-stat">
|
|
15
|
+
<span class="observ-stat__value"><%= stats[:completed_this_week] %></span>
|
|
16
|
+
<span class="observ-stat__label">This Week</span>
|
|
17
|
+
</div>
|
|
18
|
+
</div>
|