completion-kit 0.1.0.rc1

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 (123) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +192 -0
  4. data/Rakefile +12 -0
  5. data/app/assets/config/completion_kit_manifest.js +1 -0
  6. data/app/assets/config/manifest.js +3 -0
  7. data/app/assets/images/completion_kit/logo.svg +6 -0
  8. data/app/assets/javascripts/completion_kit/evaluation_steps_controller.js +25 -0
  9. data/app/assets/stylesheets/completion_kit/application.css +2214 -0
  10. data/app/controllers/completion_kit/api/v1/base_controller.rb +29 -0
  11. data/app/controllers/completion_kit/api/v1/criteria_controller.rb +62 -0
  12. data/app/controllers/completion_kit/api/v1/datasets_controller.rb +51 -0
  13. data/app/controllers/completion_kit/api/v1/metrics_controller.rb +51 -0
  14. data/app/controllers/completion_kit/api/v1/prompts_controller.rb +64 -0
  15. data/app/controllers/completion_kit/api/v1/provider_credentials_controller.rb +51 -0
  16. data/app/controllers/completion_kit/api/v1/responses_controller.rb +32 -0
  17. data/app/controllers/completion_kit/api/v1/runs_controller.rb +71 -0
  18. data/app/controllers/completion_kit/api_reference_controller.rb +9 -0
  19. data/app/controllers/completion_kit/application_controller.rb +31 -0
  20. data/app/controllers/completion_kit/criteria_controller.rb +67 -0
  21. data/app/controllers/completion_kit/datasets_controller.rb +53 -0
  22. data/app/controllers/completion_kit/mcp_controller.rb +57 -0
  23. data/app/controllers/completion_kit/metrics_controller.rb +52 -0
  24. data/app/controllers/completion_kit/prompts_controller.rb +69 -0
  25. data/app/controllers/completion_kit/provider_credentials_controller.rb +63 -0
  26. data/app/controllers/completion_kit/responses_controller.rb +44 -0
  27. data/app/controllers/completion_kit/runs_controller.rb +131 -0
  28. data/app/helpers/completion_kit/application_helper.rb +193 -0
  29. data/app/jobs/completion_kit/application_job.rb +4 -0
  30. data/app/jobs/completion_kit/generate_job.rb +12 -0
  31. data/app/jobs/completion_kit/judge_job.rb +12 -0
  32. data/app/jobs/completion_kit/model_discovery_job.rb +29 -0
  33. data/app/mailers/completion_kit/application_mailer.rb +6 -0
  34. data/app/models/completion_kit/application_record.rb +5 -0
  35. data/app/models/completion_kit/criteria.rb +22 -0
  36. data/app/models/completion_kit/criteria_membership.rb +20 -0
  37. data/app/models/completion_kit/dataset.rb +24 -0
  38. data/app/models/completion_kit/metric.rb +97 -0
  39. data/app/models/completion_kit/model.rb +13 -0
  40. data/app/models/completion_kit/prompt.rb +99 -0
  41. data/app/models/completion_kit/provider_credential.rb +114 -0
  42. data/app/models/completion_kit/response.rb +30 -0
  43. data/app/models/completion_kit/review.rb +28 -0
  44. data/app/models/completion_kit/run.rb +253 -0
  45. data/app/models/completion_kit/run_metric.rb +6 -0
  46. data/app/models/completion_kit/suggestion.rb +8 -0
  47. data/app/services/completion_kit/anthropic_client.rb +86 -0
  48. data/app/services/completion_kit/api_config.rb +80 -0
  49. data/app/services/completion_kit/csv_processor.rb +65 -0
  50. data/app/services/completion_kit/judge_service.rb +87 -0
  51. data/app/services/completion_kit/llm_client.rb +45 -0
  52. data/app/services/completion_kit/mcp_dispatcher.rb +53 -0
  53. data/app/services/completion_kit/mcp_tools/criteria.rb +106 -0
  54. data/app/services/completion_kit/mcp_tools/datasets.rb +90 -0
  55. data/app/services/completion_kit/mcp_tools/metrics.rb +98 -0
  56. data/app/services/completion_kit/mcp_tools/prompts.rb +112 -0
  57. data/app/services/completion_kit/mcp_tools/provider_credentials.rb +97 -0
  58. data/app/services/completion_kit/mcp_tools/responses.rb +45 -0
  59. data/app/services/completion_kit/mcp_tools/runs.rb +130 -0
  60. data/app/services/completion_kit/model_discovery_service.rb +223 -0
  61. data/app/services/completion_kit/ollama_client.rb +80 -0
  62. data/app/services/completion_kit/open_ai_client.rb +71 -0
  63. data/app/services/completion_kit/open_router_client.rb +69 -0
  64. data/app/services/completion_kit/prompt_improvement_service.rb +81 -0
  65. data/app/views/completion_kit/api_reference/_example.html.erb +6 -0
  66. data/app/views/completion_kit/api_reference/index.html.erb +308 -0
  67. data/app/views/completion_kit/criteria/_form.html.erb +46 -0
  68. data/app/views/completion_kit/criteria/edit.html.erb +14 -0
  69. data/app/views/completion_kit/criteria/index.html.erb +37 -0
  70. data/app/views/completion_kit/criteria/new.html.erb +13 -0
  71. data/app/views/completion_kit/criteria/show.html.erb +37 -0
  72. data/app/views/completion_kit/datasets/_form.html.erb +29 -0
  73. data/app/views/completion_kit/datasets/edit.html.erb +13 -0
  74. data/app/views/completion_kit/datasets/index.html.erb +38 -0
  75. data/app/views/completion_kit/datasets/new.html.erb +12 -0
  76. data/app/views/completion_kit/datasets/show.html.erb +45 -0
  77. data/app/views/completion_kit/metrics/_form.html.erb +72 -0
  78. data/app/views/completion_kit/metrics/edit.html.erb +13 -0
  79. data/app/views/completion_kit/metrics/index.html.erb +34 -0
  80. data/app/views/completion_kit/metrics/new.html.erb +12 -0
  81. data/app/views/completion_kit/metrics/show.html.erb +49 -0
  82. data/app/views/completion_kit/prompts/_form.html.erb +52 -0
  83. data/app/views/completion_kit/prompts/edit.html.erb +13 -0
  84. data/app/views/completion_kit/prompts/index.html.erb +46 -0
  85. data/app/views/completion_kit/prompts/new.html.erb +12 -0
  86. data/app/views/completion_kit/prompts/show.html.erb +156 -0
  87. data/app/views/completion_kit/provider_credentials/_discovery_status.html.erb +30 -0
  88. data/app/views/completion_kit/provider_credentials/_form.html.erb +71 -0
  89. data/app/views/completion_kit/provider_credentials/edit.html.erb +12 -0
  90. data/app/views/completion_kit/provider_credentials/index.html.erb +41 -0
  91. data/app/views/completion_kit/provider_credentials/new.html.erb +12 -0
  92. data/app/views/completion_kit/responses/show.html.erb +87 -0
  93. data/app/views/completion_kit/runs/_actions.html.erb +14 -0
  94. data/app/views/completion_kit/runs/_form.html.erb +159 -0
  95. data/app/views/completion_kit/runs/_progress.html.erb +18 -0
  96. data/app/views/completion_kit/runs/_response_row.html.erb +13 -0
  97. data/app/views/completion_kit/runs/_sort_toolbar.html.erb +8 -0
  98. data/app/views/completion_kit/runs/_status_header.html.erb +15 -0
  99. data/app/views/completion_kit/runs/edit.html.erb +14 -0
  100. data/app/views/completion_kit/runs/index.html.erb +43 -0
  101. data/app/views/completion_kit/runs/new.html.erb +12 -0
  102. data/app/views/completion_kit/runs/show.html.erb +79 -0
  103. data/app/views/completion_kit/runs/suggestion.html.erb +47 -0
  104. data/app/views/layouts/completion_kit/application.html.erb +77 -0
  105. data/config/routes.rb +55 -0
  106. data/db/migrate/20260311000001_create_completion_kit_tables.rb +87 -0
  107. data/db/migrate/20260326000001_rename_criteria_to_instruction_on_metrics_and_reviews.rb +6 -0
  108. data/db/migrate/20260327000001_add_progress_to_runs.rb +6 -0
  109. data/db/migrate/20260327100001_replace_criteria_with_direct_metrics_on_runs.rb +12 -0
  110. data/db/migrate/20260328000001_add_error_message_to_runs.rb +5 -0
  111. data/db/migrate/20260329000001_create_completion_kit_models.rb +20 -0
  112. data/db/migrate/20260401170001_add_discovery_columns_to_completion_kit_provider_credentials.rb +7 -0
  113. data/db/migrate/20260403000001_add_temperature_to_completion_kit_runs.rb +5 -0
  114. data/db/migrate/20260403000002_create_completion_kit_suggestions.rb +13 -0
  115. data/db/migrate/20260403000003_add_applied_at_to_completion_kit_suggestions.rb +5 -0
  116. data/lib/completion-kit.rb +1 -0
  117. data/lib/completion_kit/engine.rb +35 -0
  118. data/lib/completion_kit/version.rb +3 -0
  119. data/lib/completion_kit.rb +55 -0
  120. data/lib/generators/completion_kit/install_generator.rb +21 -0
  121. data/lib/generators/completion_kit/templates/README +20 -0
  122. data/lib/generators/completion_kit/templates/initializer.rb +43 -0
  123. metadata +361 -0
data/config/routes.rb ADDED
@@ -0,0 +1,55 @@
1
+ CompletionKit::Engine.routes.draw do
2
+ root to: "prompts#index"
3
+
4
+ resources :prompts do
5
+ member do
6
+ post :publish
7
+ end
8
+ end
9
+
10
+ resources :datasets
11
+ resources :metrics
12
+ resources :criteria, controller: "criteria"
13
+
14
+ resources :runs do
15
+ member do
16
+ post :generate
17
+ post :judge
18
+ get :suggestion
19
+ post :suggest
20
+ post :apply_suggestion
21
+ end
22
+ resources :responses, only: [:show]
23
+ end
24
+
25
+ resources :provider_credentials, only: [:index, :new, :create, :edit, :update] do
26
+ post :refresh, on: :member
27
+ end
28
+ post "refresh_models", to: "provider_credentials#refresh_all", as: :refresh_models
29
+
30
+ get "api_reference", to: "api_reference#index", as: :api_reference
31
+
32
+ namespace :api do
33
+ namespace :v1 do
34
+ resources :prompts do
35
+ member do
36
+ post :publish
37
+ end
38
+ end
39
+ resources :runs do
40
+ member do
41
+ post :generate
42
+ post :judge
43
+ end
44
+ resources :responses, only: [:index, :show]
45
+ end
46
+ resources :datasets
47
+ resources :metrics
48
+ resources :criteria, controller: "criteria"
49
+ resources :provider_credentials
50
+ end
51
+ end
52
+
53
+ post "mcp", to: "mcp#handle"
54
+ delete "mcp", to: "mcp#destroy"
55
+ end
@@ -0,0 +1,87 @@
1
+ class CreateCompletionKitTables < ActiveRecord::Migration[7.1]
2
+ def change
3
+ create_table :completion_kit_prompts do |t|
4
+ t.string :name, null: false
5
+ t.text :description
6
+ t.text :template, null: false
7
+ t.string :llm_model, null: false
8
+ t.string :family_key, null: false
9
+ t.integer :version_number, null: false
10
+ t.boolean :current, default: true, null: false
11
+ t.datetime :published_at
12
+ t.timestamps
13
+ end
14
+
15
+ add_index :completion_kit_prompts, :family_key
16
+ add_index :completion_kit_prompts, [:family_key, :version_number], unique: true, name: "idx_ck_prompts_family_version"
17
+ add_index :completion_kit_prompts, [:family_key, :current], name: "idx_ck_prompts_family_current"
18
+
19
+ create_table :completion_kit_datasets do |t|
20
+ t.string :name, null: false
21
+ t.text :csv_data, null: false
22
+ t.timestamps
23
+ end
24
+
25
+ create_table :completion_kit_criteria do |t|
26
+ t.string :name, null: false
27
+ t.text :description
28
+ t.timestamps
29
+ end
30
+
31
+ create_table :completion_kit_metrics do |t|
32
+ t.string :name, null: false
33
+ t.text :criteria
34
+ t.text :evaluation_steps
35
+ t.text :rubric_bands
36
+ t.string :key
37
+ t.timestamps
38
+ end
39
+
40
+ add_index :completion_kit_metrics, :key, unique: true
41
+
42
+ create_table :completion_kit_criteria_memberships do |t|
43
+ t.references :criteria, null: false, foreign_key: { to_table: :completion_kit_criteria }
44
+ t.references :metric, null: false, foreign_key: { to_table: :completion_kit_metrics }
45
+ t.integer :position
46
+ t.timestamps
47
+ end
48
+
49
+ create_table :completion_kit_provider_credentials do |t|
50
+ t.string :provider, null: false
51
+ t.text :api_key
52
+ t.text :api_endpoint
53
+ t.timestamps
54
+ end
55
+
56
+ add_index :completion_kit_provider_credentials, :provider, unique: true
57
+
58
+ create_table :completion_kit_runs do |t|
59
+ t.string :name
60
+ t.references :prompt, null: false, foreign_key: { to_table: :completion_kit_prompts }
61
+ t.references :dataset, foreign_key: { to_table: :completion_kit_datasets }
62
+ t.references :criteria, foreign_key: { to_table: :completion_kit_criteria }
63
+ t.string :judge_model
64
+ t.string :status
65
+ t.timestamps
66
+ end
67
+
68
+ create_table :completion_kit_responses do |t|
69
+ t.references :run, null: false, foreign_key: { to_table: :completion_kit_runs }
70
+ t.text :input_data
71
+ t.text :response_text
72
+ t.text :expected_output
73
+ t.timestamps
74
+ end
75
+
76
+ create_table :completion_kit_reviews do |t|
77
+ t.references :response, null: false, foreign_key: { to_table: :completion_kit_responses }
78
+ t.references :metric, foreign_key: { to_table: :completion_kit_metrics }
79
+ t.string :metric_name
80
+ t.text :criteria
81
+ t.string :status
82
+ t.decimal :ai_score, precision: 4, scale: 1
83
+ t.text :ai_feedback
84
+ t.timestamps
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,6 @@
1
+ class RenameCriteriaToInstructionOnMetricsAndReviews < ActiveRecord::Migration[7.0]
2
+ def change
3
+ rename_column :completion_kit_metrics, :criteria, :instruction
4
+ rename_column :completion_kit_reviews, :criteria, :instruction
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ class AddProgressToRuns < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_column :completion_kit_runs, :progress_current, :integer, default: 0
4
+ add_column :completion_kit_runs, :progress_total, :integer, default: 0
5
+ end
6
+ end
@@ -0,0 +1,12 @@
1
+ class ReplaceCriteriaWithDirectMetricsOnRuns < ActiveRecord::Migration[7.0]
2
+ def change
3
+ create_table :completion_kit_run_metrics do |t|
4
+ t.references :run, null: false, foreign_key: { to_table: :completion_kit_runs }
5
+ t.references :metric, null: false, foreign_key: { to_table: :completion_kit_metrics }
6
+ t.integer :position
7
+ t.timestamps
8
+ end
9
+
10
+ remove_reference :completion_kit_runs, :criteria, foreign_key: { to_table: :completion_kit_criteria }
11
+ end
12
+ end
@@ -0,0 +1,5 @@
1
+ class AddErrorMessageToRuns < ActiveRecord::Migration[7.1]
2
+ def change
3
+ add_column :completion_kit_runs, :error_message, :text
4
+ end
5
+ end
@@ -0,0 +1,20 @@
1
+ class CreateCompletionKitModels < ActiveRecord::Migration[7.1]
2
+ def change
3
+ create_table :completion_kit_models do |t|
4
+ t.string :provider, null: false
5
+ t.string :model_id, null: false
6
+ t.string :display_name
7
+ t.string :status, null: false, default: "active"
8
+ t.boolean :supports_generation
9
+ t.boolean :supports_judging
10
+ t.text :generation_error
11
+ t.text :judging_error
12
+ t.datetime :probed_at
13
+ t.datetime :discovered_at
14
+ t.datetime :retired_at
15
+ t.timestamps
16
+ end
17
+
18
+ add_index :completion_kit_models, [:provider, :model_id], unique: true
19
+ end
20
+ end
@@ -0,0 +1,7 @@
1
+ class AddDiscoveryColumnsToCompletionKitProviderCredentials < ActiveRecord::Migration[8.1]
2
+ def change
3
+ add_column :completion_kit_provider_credentials, :discovery_status, :string
4
+ add_column :completion_kit_provider_credentials, :discovery_current, :integer, default: 0
5
+ add_column :completion_kit_provider_credentials, :discovery_total, :integer, default: 0
6
+ end
7
+ end
@@ -0,0 +1,5 @@
1
+ class AddTemperatureToCompletionKitRuns < ActiveRecord::Migration[7.1]
2
+ def change
3
+ add_column :completion_kit_runs, :temperature, :float, default: 1.0
4
+ end
5
+ end
@@ -0,0 +1,13 @@
1
+ class CreateCompletionKitSuggestions < ActiveRecord::Migration[7.1]
2
+ def change
3
+ create_table :completion_kit_suggestions do |t|
4
+ t.references :run, null: false
5
+ t.references :prompt, null: false
6
+ t.text :reasoning
7
+ t.text :suggested_template
8
+ t.text :original_template
9
+ t.datetime :applied_at
10
+ t.timestamps
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,5 @@
1
+ class AddAppliedAtToCompletionKitSuggestions < ActiveRecord::Migration[7.1]
2
+ def change
3
+ add_column :completion_kit_suggestions, :applied_at, :datetime
4
+ end
5
+ end
@@ -0,0 +1 @@
1
+ require "completion_kit"
@@ -0,0 +1,35 @@
1
+ require "turbo-rails"
2
+ require "heroicons-rails"
3
+
4
+ module CompletionKit
5
+ class Engine < ::Rails::Engine
6
+ isolate_namespace CompletionKit
7
+
8
+ initializer("completion_kit.inflections", before: :load_config_initializers) do
9
+ ActiveSupport::Inflector.inflections(:en) do |inflect|
10
+ inflect.irregular "criterion", "criteria"
11
+ end
12
+ end
13
+
14
+ paths.add "app/services", eager_load: true
15
+
16
+ def self.register_assets(app)
17
+ app.config.assets.precompile += %w( completion_kit/application.css completion_kit/evaluation_steps_controller.js completion_kit/logo.svg )
18
+ end
19
+
20
+ initializer("completion_kit.assets") { |app| Engine.register_assets(app) }
21
+
22
+ config.after_initialize do
23
+ cfg = CompletionKit.config
24
+ unless cfg.username || cfg.auth_strategy
25
+ Rails.logger.warn "[CompletionKit] WARNING: No authentication configured. All routes are publicly accessible."
26
+ end
27
+ end
28
+
29
+ config.generators do |g|
30
+ g.test_framework :rspec
31
+ g.fixture_replacement :factory_bot
32
+ g.factory_bot dir: "spec/factories"
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,3 @@
1
+ module CompletionKit
2
+ VERSION = "0.1.0.rc1"
3
+ end
@@ -0,0 +1,55 @@
1
+ require "completion_kit/version"
2
+ require "completion_kit/engine"
3
+
4
+ module CompletionKit
5
+ class ConfigurationError < StandardError; end
6
+
7
+ class Configuration
8
+ attr_accessor :openai_api_key, :anthropic_api_key, :ollama_api_key, :ollama_api_endpoint
9
+ attr_accessor :judge_model, :high_quality_threshold, :medium_quality_threshold
10
+ attr_accessor :username, :password, :auth_strategy, :api_token
11
+
12
+ def initialize
13
+ @openai_api_key = ENV['OPENAI_API_KEY']
14
+ @anthropic_api_key = ENV['ANTHROPIC_API_KEY']
15
+ @ollama_api_key = ENV['OLLAMA_API_KEY']
16
+ @ollama_api_endpoint = ENV['OLLAMA_API_ENDPOINT']
17
+
18
+ @judge_model = "gpt-4.1"
19
+ @high_quality_threshold = 4
20
+ @medium_quality_threshold = 3
21
+ end
22
+ end
23
+
24
+ class << self
25
+ def config
26
+ @config ||= Configuration.new
27
+ end
28
+
29
+ def configure
30
+ yield(config) if block_given?
31
+ end
32
+
33
+ def current_prompt(identifier)
34
+ Prompt.current_for(identifier)
35
+ end
36
+
37
+ def current_prompt_payload(identifier)
38
+ prompt = current_prompt(identifier)
39
+
40
+ {
41
+ name: prompt.name,
42
+ family_key: prompt.family_key,
43
+ version_number: prompt.version_number,
44
+ template: prompt.template,
45
+ generation_model: prompt.llm_model
46
+ }
47
+ end
48
+
49
+ def render_current_prompt(identifier, variables = {})
50
+ prompt = current_prompt(identifier)
51
+ CsvProcessor.apply_variables(prompt, variables.stringify_keys)
52
+ end
53
+
54
+ end
55
+ end
@@ -0,0 +1,21 @@
1
+ module CompletionKit
2
+ class InstallGenerator < Rails::Generators::Base
3
+ source_root File.expand_path('templates', __dir__)
4
+
5
+ def create_initializer
6
+ template 'initializer.rb', 'config/initializers/completion_kit.rb'
7
+ end
8
+
9
+ def mount_engine
10
+ route "mount CompletionKit::Engine => '/completion_kit'"
11
+ end
12
+
13
+ def copy_migrations
14
+ rake 'completion_kit:install:migrations'
15
+ end
16
+
17
+ def show_readme
18
+ readme 'README'
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,20 @@
1
+ =============================================
2
+ CompletionKit Installation Instructions
3
+ =============================================
4
+
5
+ Thank you for installing CompletionKit!
6
+
7
+ To complete the setup:
8
+
9
+ 1. Run database migrations:
10
+ $ bin/rails db:migrate
11
+
12
+ 2. Configure your API keys in config/initializers/completion_kit.rb
13
+
14
+ 3. Access the CompletionKit interface at:
15
+ http://your-app-url/completion_kit
16
+
17
+ For more information, see the full documentation at:
18
+ https://github.com/completionkit/completion_kit
19
+
20
+ Happy prompt testing!
@@ -0,0 +1,43 @@
1
+ # CompletionKit Configuration
2
+
3
+ # Configure CompletionKit
4
+ CompletionKit.configure do |config|
5
+ # 1. Environment variables:
6
+ # config.openai_api_key = ENV['OPENAI_API_KEY']
7
+ # config.anthropic_api_key = ENV['ANTHROPIC_API_KEY']
8
+ # config.ollama_api_key = ENV['OLLAMA_API_KEY']
9
+ # config.ollama_api_endpoint = ENV['OLLAMA_API_ENDPOINT']
10
+
11
+ # 2. Dotenv (.env file):
12
+ # require 'dotenv/load'
13
+ # config.openai_api_key = ENV['OPENAI_API_KEY'] if ENV['OPENAI_API_KEY']
14
+
15
+ # 3. Rails secrets (config/secrets.yml):
16
+ # secrets.yml ->
17
+ # development:
18
+ # completion_kit:
19
+ # openai_api_key: 'your-api-key'
20
+ # config.openai_api_key = Rails.application.secrets.completion_kit[:openai_api_key]
21
+ # config.anthropic_api_key = Rails.application.secrets.completion_kit[:anthropic_api_key]
22
+ # config.ollama_api_key = Rails.application.secrets.completion_kit[:ollama_api_key]
23
+ # config.ollama_api_endpoint = Rails.application.secrets.completion_kit[:ollama_api_endpoint]
24
+
25
+ # 4. Rails credentials (config/credentials.yml.enc):
26
+ # credentials.yml.enc ->
27
+ # completion_kit:
28
+ # openai_api_key: 'your-api-key'
29
+ # config.openai_api_key = Rails.application.credentials.completion_kit[:openai_api_key]
30
+ # config.anthropic_api_key = Rails.application.credentials.completion_kit[:anthropic_api_key]
31
+ # config.ollama_api_key = Rails.application.credentials.completion_kit[:ollama_api_key]
32
+ # config.ollama_api_endpoint = Rails.application.credentials.completion_kit[:ollama_api_endpoint]
33
+
34
+ # 5. Direct assignment:
35
+ # config.openai_api_key = 'your-api-key-here'
36
+
37
+ # API Authentication
38
+ # config.api_token = ENV['COMPLETION_KIT_API_TOKEN']
39
+
40
+ # Web UI Authentication
41
+ # config.username = "admin"
42
+ # config.password = ENV['COMPLETION_KIT_PASSWORD']
43
+ end