prompt_engine 1.0.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.
Files changed (97) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +67 -0
  4. data/Rakefile +22 -0
  5. data/app/assets/stylesheets/prompt_engine/application.css +22 -0
  6. data/app/assets/stylesheets/prompt_engine/buttons.css +124 -0
  7. data/app/assets/stylesheets/prompt_engine/cards.css +63 -0
  8. data/app/assets/stylesheets/prompt_engine/comparison.css +244 -0
  9. data/app/assets/stylesheets/prompt_engine/components/_test_runs.css +144 -0
  10. data/app/assets/stylesheets/prompt_engine/dashboard.css +343 -0
  11. data/app/assets/stylesheets/prompt_engine/evaluations.css +124 -0
  12. data/app/assets/stylesheets/prompt_engine/forms.css +198 -0
  13. data/app/assets/stylesheets/prompt_engine/foundation.css +182 -0
  14. data/app/assets/stylesheets/prompt_engine/layout.css +75 -0
  15. data/app/assets/stylesheets/prompt_engine/loading.css +229 -0
  16. data/app/assets/stylesheets/prompt_engine/notifications.css +78 -0
  17. data/app/assets/stylesheets/prompt_engine/overrides.css +42 -0
  18. data/app/assets/stylesheets/prompt_engine/prompts.css +237 -0
  19. data/app/assets/stylesheets/prompt_engine/sidebar.css +90 -0
  20. data/app/assets/stylesheets/prompt_engine/tables.css +250 -0
  21. data/app/assets/stylesheets/prompt_engine/utilities.css +52 -0
  22. data/app/assets/stylesheets/prompt_engine/versions.css +370 -0
  23. data/app/clients/prompt_engine/open_ai_evals_client.rb +135 -0
  24. data/app/controllers/prompt_engine/admin/base_controller.rb +7 -0
  25. data/app/controllers/prompt_engine/application_controller.rb +4 -0
  26. data/app/controllers/prompt_engine/dashboard_controller.rb +24 -0
  27. data/app/controllers/prompt_engine/eval_runs_controller.rb +23 -0
  28. data/app/controllers/prompt_engine/eval_sets_controller.rb +200 -0
  29. data/app/controllers/prompt_engine/evaluations_controller.rb +32 -0
  30. data/app/controllers/prompt_engine/playground_controller.rb +57 -0
  31. data/app/controllers/prompt_engine/playground_run_results_controller.rb +41 -0
  32. data/app/controllers/prompt_engine/prompts_controller.rb +70 -0
  33. data/app/controllers/prompt_engine/settings_controller.rb +28 -0
  34. data/app/controllers/prompt_engine/test_cases_controller.rb +231 -0
  35. data/app/controllers/prompt_engine/versions_controller.rb +90 -0
  36. data/app/helpers/prompt_engine/application_helper.rb +4 -0
  37. data/app/jobs/prompt_engine/application_job.rb +4 -0
  38. data/app/mailers/prompt_engine/application_mailer.rb +6 -0
  39. data/app/models/prompt_engine/application_record.rb +5 -0
  40. data/app/models/prompt_engine/eval_result.rb +19 -0
  41. data/app/models/prompt_engine/eval_run.rb +40 -0
  42. data/app/models/prompt_engine/eval_set.rb +97 -0
  43. data/app/models/prompt_engine/parameter.rb +126 -0
  44. data/app/models/prompt_engine/parameter_parser.rb +39 -0
  45. data/app/models/prompt_engine/playground_run_result.rb +20 -0
  46. data/app/models/prompt_engine/prompt.rb +192 -0
  47. data/app/models/prompt_engine/prompt_version.rb +72 -0
  48. data/app/models/prompt_engine/setting.rb +45 -0
  49. data/app/models/prompt_engine/test_case.rb +29 -0
  50. data/app/services/prompt_engine/evaluation_runner.rb +258 -0
  51. data/app/services/prompt_engine/playground_executor.rb +124 -0
  52. data/app/services/prompt_engine/variable_detector.rb +97 -0
  53. data/app/views/layouts/prompt_engine/admin.html.erb +65 -0
  54. data/app/views/layouts/prompt_engine/application.html.erb +17 -0
  55. data/app/views/prompt_engine/dashboard/index.html.erb +230 -0
  56. data/app/views/prompt_engine/eval_runs/show.html.erb +204 -0
  57. data/app/views/prompt_engine/eval_sets/compare.html.erb +229 -0
  58. data/app/views/prompt_engine/eval_sets/edit.html.erb +111 -0
  59. data/app/views/prompt_engine/eval_sets/index.html.erb +63 -0
  60. data/app/views/prompt_engine/eval_sets/metrics.html.erb +371 -0
  61. data/app/views/prompt_engine/eval_sets/new.html.erb +113 -0
  62. data/app/views/prompt_engine/eval_sets/show.html.erb +235 -0
  63. data/app/views/prompt_engine/evaluations/index.html.erb +194 -0
  64. data/app/views/prompt_engine/playground/result.html.erb +58 -0
  65. data/app/views/prompt_engine/playground/show.html.erb +129 -0
  66. data/app/views/prompt_engine/playground_run_results/index.html.erb +99 -0
  67. data/app/views/prompt_engine/playground_run_results/show.html.erb +123 -0
  68. data/app/views/prompt_engine/prompts/_form.html.erb +224 -0
  69. data/app/views/prompt_engine/prompts/edit.html.erb +9 -0
  70. data/app/views/prompt_engine/prompts/index.html.erb +80 -0
  71. data/app/views/prompt_engine/prompts/new.html.erb +9 -0
  72. data/app/views/prompt_engine/prompts/show.html.erb +297 -0
  73. data/app/views/prompt_engine/settings/edit.html.erb +93 -0
  74. data/app/views/prompt_engine/shared/_form_errors.html.erb +16 -0
  75. data/app/views/prompt_engine/test_cases/edit.html.erb +72 -0
  76. data/app/views/prompt_engine/test_cases/import.html.erb +92 -0
  77. data/app/views/prompt_engine/test_cases/import_preview.html.erb +103 -0
  78. data/app/views/prompt_engine/test_cases/new.html.erb +79 -0
  79. data/app/views/prompt_engine/versions/_version_card.html.erb +56 -0
  80. data/app/views/prompt_engine/versions/compare.html.erb +82 -0
  81. data/app/views/prompt_engine/versions/index.html.erb +96 -0
  82. data/app/views/prompt_engine/versions/show.html.erb +98 -0
  83. data/config/routes.rb +61 -0
  84. data/db/migrate/20250124000001_create_eval_tables.rb +43 -0
  85. data/db/migrate/20250124000002_add_open_ai_fields_to_evals.rb +11 -0
  86. data/db/migrate/20250125000001_add_grader_fields_to_eval_sets.rb +8 -0
  87. data/db/migrate/20250723161909_create_prompts.rb +17 -0
  88. data/db/migrate/20250723184757_create_prompt_engine_versions.rb +24 -0
  89. data/db/migrate/20250723203838_create_prompt_engine_parameters.rb +20 -0
  90. data/db/migrate/20250724160623_create_prompt_engine_playground_run_results.rb +30 -0
  91. data/db/migrate/20250724165118_create_prompt_engine_settings.rb +14 -0
  92. data/lib/prompt_engine/engine.rb +25 -0
  93. data/lib/prompt_engine/version.rb +3 -0
  94. data/lib/prompt_engine.rb +33 -0
  95. data/lib/tasks/active_prompt_tasks.rake +32 -0
  96. data/lib/tasks/eval_demo.rake +149 -0
  97. metadata +293 -0
@@ -0,0 +1,25 @@
1
+ module PromptEngine
2
+ class Engine < ::Rails::Engine
3
+ isolate_namespace PromptEngine
4
+
5
+ config.generators do |g|
6
+ g.test_framework :rspec
7
+ g.fixture_replacement :factory_bot
8
+ g.factory_bot dir: "spec/factories"
9
+ end
10
+
11
+ # Ensure services and clients directories are in the autoload paths
12
+ config.autoload_paths += %W[#{config.root}/app/services]
13
+ config.autoload_paths += %W[#{config.root}/app/clients]
14
+
15
+ # Ensure engine's migrations are available to the host app
16
+ # This is the standard Rails engine pattern
17
+ initializer :append_migrations do |app|
18
+ unless app.root.to_s.match?(root.to_s)
19
+ config.paths["db/migrate"].expanded.each do |expanded_path|
20
+ app.config.paths["db/migrate"] << expanded_path
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,3 @@
1
+ module PromptEngine
2
+ VERSION = "1.0.0"
3
+ end
@@ -0,0 +1,33 @@
1
+ require "prompt_engine/version"
2
+ require "prompt_engine/engine"
3
+
4
+ module PromptEngine
5
+ class << self
6
+ # Renders a prompt by name with the given variables
7
+ # @param prompt_name [String, Symbol] The name of the prompt to render
8
+ # @param variables [Hash] Variables to interpolate into the prompt
9
+ # @return [Hash] The rendered prompt with content and system_message
10
+ def render(prompt_name, variables: {})
11
+ prompt = Prompt.active.find_by!(name: prompt_name.to_s)
12
+
13
+ {
14
+ content: interpolate_variables(prompt.content, variables),
15
+ system_message: interpolate_variables(prompt.system_message, variables),
16
+ model: prompt.model,
17
+ temperature: prompt.temperature,
18
+ max_tokens: prompt.max_tokens
19
+ }
20
+ end
21
+
22
+ private
23
+
24
+ def interpolate_variables(text, variables)
25
+ return text if text.blank? || variables.empty?
26
+
27
+ text.gsub(/\{\{(\w+)\}\}/) do |match|
28
+ key = $1.to_sym
29
+ variables.fetch(key) { match }
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,32 @@
1
+ # desc "Explaining what the task does"
2
+ # task :prompt_engine do
3
+ # # Task goes here
4
+ # end
5
+
6
+ namespace :prompt_engine do
7
+ desc "Setup dummy app for development and testing"
8
+ task setup: :environment do
9
+ puts "Setting up PromptEngine dummy app..."
10
+
11
+ dummy_root = File.expand_path("../../spec/dummy", __dir__)
12
+
13
+ Dir.chdir(dummy_root) do
14
+ # Remove existing migrations and schema
15
+ FileUtils.rm_rf(Dir.glob("db/migrate/*"))
16
+ FileUtils.rm_f("db/schema.rb")
17
+ FileUtils.rm_f("db/development.sqlite3")
18
+ FileUtils.rm_f("db/test.sqlite3")
19
+
20
+ # Install engine migrations
21
+ system("bundle exec rails prompt_engine:install:migrations")
22
+
23
+ # Create and migrate databases
24
+ system("bundle exec rails db:create")
25
+ system("bundle exec rails db:migrate")
26
+ system("RAILS_ENV=test bundle exec rails db:create")
27
+ system("RAILS_ENV=test bundle exec rails db:migrate")
28
+
29
+ puts "✅ PromptEngine dummy app setup complete!"
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,149 @@
1
+ namespace :prompt_engine do
2
+ desc "Demo the evaluation workflow"
3
+ task eval_demo: :environment do
4
+ puts "\n=== ActivePrompt Evaluation Demo ==="
5
+ puts "This demo will walk through the complete evaluation workflow\n\n"
6
+
7
+ # Step 1: Create or find a prompt
8
+ prompt = ActivePrompt::Prompt.find_or_create_by(name: "demo_summarizer") do |p|
9
+ p.description = "Demo prompt for testing evaluations"
10
+ p.content = "Summarize this in one word: {{text}}"
11
+ p.system_message = "You are a concise summarizer. Always respond with exactly one word."
12
+ p.model = "gpt-3.5-turbo"
13
+ p.temperature = 0.0
14
+ p.max_tokens = 10
15
+ p.status = "active"
16
+ end
17
+ puts "✓ Created prompt: #{prompt.name}"
18
+
19
+ # Step 2: Create an evaluation set
20
+ eval_set = prompt.eval_sets.find_or_create_by(name: "Demo Eval Set") do |es|
21
+ es.description = "Testing one-word summaries"
22
+ end
23
+ puts "✓ Created eval set: #{eval_set.name}"
24
+
25
+ # Step 3: Create test cases
26
+ test_cases_data = [
27
+ {
28
+ input: { "text" => "The cat is sleeping peacefully on the warm windowsill" },
29
+ expected: "Cat",
30
+ description: "Animal summary"
31
+ },
32
+ {
33
+ input: { "text" => "It's raining heavily with thunder and lightning" },
34
+ expected: "Storm",
35
+ description: "Weather summary"
36
+ },
37
+ {
38
+ input: { "text" => "The delicious pizza has cheese, pepperoni, and mushrooms" },
39
+ expected: "Pizza",
40
+ description: "Food summary"
41
+ }
42
+ ]
43
+
44
+ test_cases_data.each do |tc_data|
45
+ test_case = eval_set.test_cases.find_or_create_by(
46
+ description: tc_data[:description]
47
+ ) do |tc|
48
+ tc.input_variables = tc_data[:input]
49
+ tc.expected_output = tc_data[:expected]
50
+ end
51
+ puts "✓ Created test case: #{test_case.description}"
52
+ end
53
+
54
+ # Step 4: Run evaluation
55
+ puts "\n--- Running Evaluation ---"
56
+
57
+ begin
58
+ # Check if API key is configured
59
+ if Rails.application.credentials.dig(:openai, :api_key).blank?
60
+ puts "⚠️ OpenAI API key not configured"
61
+ puts " To configure: rails credentials:edit"
62
+ puts " Add: openai:\\n api_key: your-api-key"
63
+ puts "\n--- Using Mock Evaluation ---"
64
+
65
+ # Create a mock eval run
66
+ eval_run = eval_set.eval_runs.create!(
67
+ prompt_version: prompt.current_version
68
+ )
69
+
70
+ # Simulate evaluation
71
+ eval_run.update!(
72
+ status: "completed",
73
+ started_at: 2.seconds.ago,
74
+ completed_at: Time.current,
75
+ total_count: 3,
76
+ passed_count: 2,
77
+ failed_count: 1,
78
+ error_message: nil
79
+ )
80
+
81
+ puts "✓ Mock evaluation completed"
82
+ else
83
+ puts "✓ OpenAI API key found"
84
+
85
+ # Create real eval run
86
+ eval_run = eval_set.eval_runs.create!(
87
+ prompt_version: prompt.current_version
88
+ )
89
+
90
+ # Note: The actual OpenAI Evals API may not be available
91
+ # This will fall back to mock if not available
92
+ begin
93
+ ActivePrompt::EvaluationRunner.new(eval_run).execute
94
+ puts "✓ Evaluation submitted to OpenAI"
95
+ rescue ActivePrompt::OpenAIEvalsClient::NotFoundError => e
96
+ puts "⚠️ OpenAI Evals API not available on this account"
97
+ puts " Using mock evaluation instead"
98
+
99
+ eval_run.update!(
100
+ status: "completed",
101
+ started_at: 2.seconds.ago,
102
+ completed_at: Time.current,
103
+ total_count: 3,
104
+ passed_count: 2,
105
+ failed_count: 1
106
+ )
107
+ end
108
+ end
109
+
110
+ # Step 5: Display results
111
+ puts "\n--- Evaluation Results ---"
112
+ eval_run.reload
113
+ puts "Status: #{eval_run.status}"
114
+ puts "Total tests: #{eval_run.total_count}"
115
+ puts "Passed: #{eval_run.passed_count}"
116
+ puts "Failed: #{eval_run.failed_count}"
117
+
118
+ if eval_run.total_count > 0
119
+ success_rate = (eval_run.passed_count.to_f / eval_run.total_count * 100).round(1)
120
+ puts "Success rate: #{success_rate}%"
121
+ end
122
+
123
+ if eval_run.error_message.present?
124
+ puts "Error: #{eval_run.error_message}"
125
+ end
126
+
127
+ # URLs to access the UI
128
+ puts "\n--- View in Browser ---"
129
+ puts "Eval Set: http://localhost:3000/prompt_engine/prompts/#{prompt.id}/eval_sets/#{eval_set.id}"
130
+ puts "Eval Run: http://localhost:3000/prompt_engine/prompts/#{prompt.id}/eval_runs/#{eval_run.id}"
131
+ rescue => e
132
+ puts "❌ Error: #{e.message}"
133
+ puts e.backtrace.first(5).join("\n")
134
+ end
135
+
136
+ puts "\n=== Demo Complete ==="
137
+ end
138
+
139
+ desc "Clean up eval demo data"
140
+ task clean_eval_demo: :environment do
141
+ prompt = ActivePrompt::Prompt.find_by(name: "demo_summarizer")
142
+ if prompt
143
+ prompt.destroy
144
+ puts "✓ Cleaned up demo data"
145
+ else
146
+ puts "No demo data to clean up"
147
+ end
148
+ end
149
+ end
metadata ADDED
@@ -0,0 +1,293 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: prompt_engine
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Avi Flombaum
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: rails
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '0'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: '0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: ruby_llm
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: bcrypt
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ - !ruby/object:Gem::Dependency
55
+ name: sqlite3
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ - !ruby/object:Gem::Dependency
69
+ name: rspec-rails
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '7.0'
75
+ type: :development
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '7.0'
82
+ - !ruby/object:Gem::Dependency
83
+ name: factory_bot_rails
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '6.4'
89
+ type: :development
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '6.4'
96
+ - !ruby/object:Gem::Dependency
97
+ name: vcr
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '6.3'
103
+ type: :development
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '6.3'
110
+ - !ruby/object:Gem::Dependency
111
+ name: webmock
112
+ requirement: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '3.23'
117
+ type: :development
118
+ prerelease: false
119
+ version_requirements: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '3.23'
124
+ - !ruby/object:Gem::Dependency
125
+ name: capybara
126
+ requirement: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '3.40'
131
+ type: :development
132
+ prerelease: false
133
+ version_requirements: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: '3.40'
138
+ - !ruby/object:Gem::Dependency
139
+ name: selenium-webdriver
140
+ requirement: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: '4.20'
145
+ type: :development
146
+ prerelease: false
147
+ version_requirements: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - "~>"
150
+ - !ruby/object:Gem::Version
151
+ version: '4.20'
152
+ - !ruby/object:Gem::Dependency
153
+ name: simplecov
154
+ requirement: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - ">="
157
+ - !ruby/object:Gem::Version
158
+ version: '0'
159
+ type: :development
160
+ prerelease: false
161
+ version_requirements: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - ">="
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
166
+ description: PromptEngine is a Rails mountable engine that provides a simple interface
167
+ for managing AI prompts, templates, and responses within Rails applications.
168
+ email:
169
+ - 4515+aviflombaum@users.noreply.github.com
170
+ executables: []
171
+ extensions: []
172
+ extra_rdoc_files: []
173
+ files:
174
+ - MIT-LICENSE
175
+ - README.md
176
+ - Rakefile
177
+ - app/assets/stylesheets/prompt_engine/application.css
178
+ - app/assets/stylesheets/prompt_engine/buttons.css
179
+ - app/assets/stylesheets/prompt_engine/cards.css
180
+ - app/assets/stylesheets/prompt_engine/comparison.css
181
+ - app/assets/stylesheets/prompt_engine/components/_test_runs.css
182
+ - app/assets/stylesheets/prompt_engine/dashboard.css
183
+ - app/assets/stylesheets/prompt_engine/evaluations.css
184
+ - app/assets/stylesheets/prompt_engine/forms.css
185
+ - app/assets/stylesheets/prompt_engine/foundation.css
186
+ - app/assets/stylesheets/prompt_engine/layout.css
187
+ - app/assets/stylesheets/prompt_engine/loading.css
188
+ - app/assets/stylesheets/prompt_engine/notifications.css
189
+ - app/assets/stylesheets/prompt_engine/overrides.css
190
+ - app/assets/stylesheets/prompt_engine/prompts.css
191
+ - app/assets/stylesheets/prompt_engine/sidebar.css
192
+ - app/assets/stylesheets/prompt_engine/tables.css
193
+ - app/assets/stylesheets/prompt_engine/utilities.css
194
+ - app/assets/stylesheets/prompt_engine/versions.css
195
+ - app/clients/prompt_engine/open_ai_evals_client.rb
196
+ - app/controllers/prompt_engine/admin/base_controller.rb
197
+ - app/controllers/prompt_engine/application_controller.rb
198
+ - app/controllers/prompt_engine/dashboard_controller.rb
199
+ - app/controllers/prompt_engine/eval_runs_controller.rb
200
+ - app/controllers/prompt_engine/eval_sets_controller.rb
201
+ - app/controllers/prompt_engine/evaluations_controller.rb
202
+ - app/controllers/prompt_engine/playground_controller.rb
203
+ - app/controllers/prompt_engine/playground_run_results_controller.rb
204
+ - app/controllers/prompt_engine/prompts_controller.rb
205
+ - app/controllers/prompt_engine/settings_controller.rb
206
+ - app/controllers/prompt_engine/test_cases_controller.rb
207
+ - app/controllers/prompt_engine/versions_controller.rb
208
+ - app/helpers/prompt_engine/application_helper.rb
209
+ - app/jobs/prompt_engine/application_job.rb
210
+ - app/mailers/prompt_engine/application_mailer.rb
211
+ - app/models/prompt_engine/application_record.rb
212
+ - app/models/prompt_engine/eval_result.rb
213
+ - app/models/prompt_engine/eval_run.rb
214
+ - app/models/prompt_engine/eval_set.rb
215
+ - app/models/prompt_engine/parameter.rb
216
+ - app/models/prompt_engine/parameter_parser.rb
217
+ - app/models/prompt_engine/playground_run_result.rb
218
+ - app/models/prompt_engine/prompt.rb
219
+ - app/models/prompt_engine/prompt_version.rb
220
+ - app/models/prompt_engine/setting.rb
221
+ - app/models/prompt_engine/test_case.rb
222
+ - app/services/prompt_engine/evaluation_runner.rb
223
+ - app/services/prompt_engine/playground_executor.rb
224
+ - app/services/prompt_engine/variable_detector.rb
225
+ - app/views/layouts/prompt_engine/admin.html.erb
226
+ - app/views/layouts/prompt_engine/application.html.erb
227
+ - app/views/prompt_engine/dashboard/index.html.erb
228
+ - app/views/prompt_engine/eval_runs/show.html.erb
229
+ - app/views/prompt_engine/eval_sets/compare.html.erb
230
+ - app/views/prompt_engine/eval_sets/edit.html.erb
231
+ - app/views/prompt_engine/eval_sets/index.html.erb
232
+ - app/views/prompt_engine/eval_sets/metrics.html.erb
233
+ - app/views/prompt_engine/eval_sets/new.html.erb
234
+ - app/views/prompt_engine/eval_sets/show.html.erb
235
+ - app/views/prompt_engine/evaluations/index.html.erb
236
+ - app/views/prompt_engine/playground/result.html.erb
237
+ - app/views/prompt_engine/playground/show.html.erb
238
+ - app/views/prompt_engine/playground_run_results/index.html.erb
239
+ - app/views/prompt_engine/playground_run_results/show.html.erb
240
+ - app/views/prompt_engine/prompts/_form.html.erb
241
+ - app/views/prompt_engine/prompts/edit.html.erb
242
+ - app/views/prompt_engine/prompts/index.html.erb
243
+ - app/views/prompt_engine/prompts/new.html.erb
244
+ - app/views/prompt_engine/prompts/show.html.erb
245
+ - app/views/prompt_engine/settings/edit.html.erb
246
+ - app/views/prompt_engine/shared/_form_errors.html.erb
247
+ - app/views/prompt_engine/test_cases/edit.html.erb
248
+ - app/views/prompt_engine/test_cases/import.html.erb
249
+ - app/views/prompt_engine/test_cases/import_preview.html.erb
250
+ - app/views/prompt_engine/test_cases/new.html.erb
251
+ - app/views/prompt_engine/versions/_version_card.html.erb
252
+ - app/views/prompt_engine/versions/compare.html.erb
253
+ - app/views/prompt_engine/versions/index.html.erb
254
+ - app/views/prompt_engine/versions/show.html.erb
255
+ - config/routes.rb
256
+ - db/migrate/20250124000001_create_eval_tables.rb
257
+ - db/migrate/20250124000002_add_open_ai_fields_to_evals.rb
258
+ - db/migrate/20250125000001_add_grader_fields_to_eval_sets.rb
259
+ - db/migrate/20250723161909_create_prompts.rb
260
+ - db/migrate/20250723184757_create_prompt_engine_versions.rb
261
+ - db/migrate/20250723203838_create_prompt_engine_parameters.rb
262
+ - db/migrate/20250724160623_create_prompt_engine_playground_run_results.rb
263
+ - db/migrate/20250724165118_create_prompt_engine_settings.rb
264
+ - lib/prompt_engine.rb
265
+ - lib/prompt_engine/engine.rb
266
+ - lib/prompt_engine/version.rb
267
+ - lib/tasks/active_prompt_tasks.rake
268
+ - lib/tasks/eval_demo.rake
269
+ homepage: https://github.com/aviflombaum/prompt_engine
270
+ licenses:
271
+ - MIT
272
+ metadata:
273
+ homepage_uri: https://github.com/aviflombaum/prompt_engine
274
+ source_code_uri: https://github.com/aviflombaum/prompt_engine
275
+ changelog_uri: https://github.com/aviflombaum/prompt_engine/blob/main/CHANGELOG.md
276
+ rdoc_options: []
277
+ require_paths:
278
+ - lib
279
+ required_ruby_version: !ruby/object:Gem::Requirement
280
+ requirements:
281
+ - - ">="
282
+ - !ruby/object:Gem::Version
283
+ version: '0'
284
+ required_rubygems_version: !ruby/object:Gem::Requirement
285
+ requirements:
286
+ - - ">="
287
+ - !ruby/object:Gem::Version
288
+ version: '0'
289
+ requirements: []
290
+ rubygems_version: 3.6.9
291
+ specification_version: 4
292
+ summary: Rails mountable engine for AI prompt management
293
+ test_files: []