Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions server/app/models/agents/knowledge_base_file.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# frozen_string_literal: true

module Agents
class KnowledgeBaseFile < ApplicationRecord
belongs_to :knowledge_base, class_name: "KnowledgeBase"
has_one_attached :file

enum :upload_status, { processing: 0, processed: 1, failed: 2 }

validates :name, presence: true
validates :size, presence: true
validates :upload_status, presence: true
end
end
38 changes: 38 additions & 0 deletions server/app/models/knowledge_base.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# frozen_string_literal: true

class KnowledgeBase < ApplicationRecord
EMBEDDING_CONFIG_JSON_SCHEMA = Rails.root.join(
"app/models/schema_validations/knowledge_bases/configuration_embedding.json"
)
STORAGE_CONFIG_JSON_SCHEMA = Rails.root.join(
"app/models/schema_validations/knowledge_bases/configuration_storage.json"
)

belongs_to :workspace
belongs_to :hosted_data_store, optional: true
belongs_to :source_connector, class_name: "Connector", optional: true
belongs_to :destination_connector, class_name: "Connector", optional: true
has_many :knowledge_base_files, class_name: "Agents::KnowledgeBaseFile", dependent: :destroy

enum :knowledge_base_type, { vector_store: 0, semantic_data_model: 1 }

validates :name, presence: true
validates :knowledge_base_type, presence: true
validates :size, presence: true
validates :embedding_config, presence: true, json: { schema: lambda {
embedding_config_schema_validation
} }
validates :storage_config, presence: true, json: { schema: lambda {
storage_config_schema_validation
} }

private

def embedding_config_schema_validation
EMBEDDING_CONFIG_JSON_SCHEMA
end

def storage_config_schema_validation
STORAGE_CONFIG_JSON_SCHEMA
end
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"properties": {
"embedding_provider": {
"type": "string",
"enum": ["open_ai"]
},
"embedding_model": {
"type": "string",
"enum": ["text-embedding-3-small", "text-embedding-3-large", "text-embedding-ada-002"]
},
"api_key": {
"type": "string"
},
"chunk_size": {
"type": "integer",
"minimum": 1
},
"chunk_overlap": {
"type": "integer",
"minimum": 0
}
},
"required": ["embedding_provider", "embedding_model", "api_key", "chunk_size", "chunk_overlap"]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"properties": {
"table_name": {
"type": "string"
},
"vector_column_name": {
"type": "string"
},
"text_column_name": {
"type": "string"
},
"metadata_column_name": {
"type": "string"
}
},
"required": ["table_name"]
}
6 changes: 6 additions & 0 deletions server/app/models/workspace.rb
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,13 @@ class Workspace < ApplicationRecord
has_many :workflows, class_name: "Agents::Workflow", dependent: :destroy
has_many :workflow_runs, class_name: "Agents::WorkflowRun", dependent: :destroy
has_many :workflow_logs, class_name: "Agents::WorkflowLog", dependent: :nullify
<<<<<<< HEAD
has_many :workflow_integrations, dependent: :nullify
=======
has_many :workflow_integrations, class_name: "Agents::WorkflowIntegration", dependent: :nullify
has_many :hosted_data_stores, dependent: :nullify
has_many :knowledge_bases, class_name: "KnowledgeBase", dependent: :nullify
>>>>>>> fc3257fc (chore(CE): Add Knowledge Base and Knowledge Base File to DB (#1528))

belongs_to :organization
has_many :sso_configurations, through: :organization
Expand Down
4 changes: 4 additions & 0 deletions server/config/initializers/inflections.rb
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,7 @@
# ActiveSupport::Inflector.inflections(:en) do |inflect|
# inflect.acronym "RESTful"
# end

ActiveSupport::Inflector.inflections(:en) do |inflect|
inflect.irregular "knowledge_base", "knowledge_bases"
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
class AddKnowledgeBasePermissionsToRoles < ActiveRecord::Migration[7.1]
# rubocop:disable Metrics/MethodLength
def change
admin_role = Role.find_by(role_name: "Admin")
member_role = Role.find_by(role_name: "Member")
viewer_role = Role.find_by(role_name: "Viewer")

admin_role&.update!(
policies: {
permissions: {
connector_definition: { create: true, read: true, update: true, delete: true },
connector: { create: true, read: true, update: true, delete: true },
model: { create: true, read: true, update: true, delete: true },
report: { create: true, read: true, update: true, delete: true },
sync_record: { create: true, read: true, update: true, delete: true },
sync_run: { create: true, read: true, update: true, delete: true },
sync: { create: true, read: true, update: true, delete: true },
user: { create: true, read: true, update: true, delete: true },
workspace: { create: true, read: true, update: true, delete: true },
data_app: { create: true, read: true, update: true, delete: true },
audit_logs: { create: true, read: true, update: true, delete: true },
alerts: { create: true, read: true, update: true, delete: true },
billing: { create: true, read: true, update: true, delete: true },
sso: { create: true, read: true, update: true, delete: true },
eula: { create: true, read: true, update: true, delete: true },
assistant: { create: true, read: true, update: true, delete: true },
workflow: { create: true, read: true, update: true, delete: true },
hosted_datastore: { create: true, read: true, update: true, delete: true },
knowledge_base: { create: true, read: true, update: true, delete: true }
}
}
)

member_role&.update!(
policies: {
permissions: {
connector_definition: { create: true, read: true, update: true, delete: true },
connector: { create: true, read: true, update: true, delete: true },
model: { create: true, read: true, update: true, delete: true },
report: { create: true, read: true, update: true, delete: true },
sync_record: { create: true, read: true, update: true, delete: true },
sync_run: { create: true, read: true, update: true, delete: true },
sync: { create: true, read: true, update: true, delete: true },
user: { create: false, read: false, update: false, delete: false },
workspace: { create: false, read: true, update: false, delete: false },
data_app: { create: true, read: true, update: true, delete: true },
audit_logs: { create: true, read: true, update: true, delete: true },
alerts: { create: true, read: true, update: true, delete: true },
billing: { create: false, read: false, update: false, delete: false },
sso: { create: false, read: false, update: false, delete: false },
eula: { create: false, read: true, update: false, delete: false },
assistant: { create: false, read: false, update: false, delete: false },
workflow: { create: true, read: true, update: true, delete: true },
hosted_datastore: { create: false, read: true, update: false, delete: false },
knowledge_base: { create: false, read: true, update: false, delete: false }
}
}
)

viewer_role&.update!(
policies: {
permissions: {
connector_definition: { create: false, read: true, update: false, delete: false },
connector: { create: false, read: true, update: false, delete: false },
model: { create: false, read: true, update: false, delete: false },
report: { create: false, read: true, update: false, delete: false },
sync_record: { create: false, read: true, update: false, delete: false },
sync_run: { create: false, read: true, update: false, delete: false },
sync: { create: false, read: true, update: false, delete: false },
user: { create: false, read: false, update: false, delete: false },
workspace: { create: false, read: true, update: false, delete: false },
data_app: { create: false, read: true, update: false, delete: false },
audit_logs: { create: false, read: false, update: false, delete: false },
alerts: { create: false, read: true, update: false, delete: false },
billing: { create: false, read: false, update: false, delete: false },
sso: { create: false, read: false, update: false, delete: false },
eula: { create: false, read: true, update: false, delete: false },
assistant: { create: false, read: false, update: false, delete: false },
workflow: { create: false, read: true, update: false, delete: false },
hosted_datastore: { create: false, read: true, update: false, delete: false },
knowledge_base: { create: false, read: true, update: false, delete: false }
}
}
)
end
# rubocop:enable Metrics/MethodLength
end
4 changes: 4 additions & 0 deletions server/db/data_schema.rb
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
<<<<<<< HEAD
# frozen_string_literal: true

DataMigrate::Data.define(version: 20250724110926)
=======
DataMigrate::Data.define(version: 20251209173922)
>>>>>>> fc3257fc (chore(CE): Add Knowledge Base and Knowledge Base File to DB (#1528))
17 changes: 17 additions & 0 deletions server/db/migrate/20251208154550_create_knowledge_base.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
class CreateKnowledgeBase < ActiveRecord::Migration[7.1]
def change
create_table :knowledge_bases do |t|
t.string :name
t.integer :knowledge_base_type
t.integer :size, default: 0
t.jsonb :embedding_config
t.jsonb :storage_config
t.integer :source_connector_id
t.integer :destination_connector_id
t.integer :hosted_data_store_id, null: true
t.integer :workspace_id

t.timestamps
end
end
end
15 changes: 15 additions & 0 deletions server/db/migrate/20251208155517_create_knowledge_base_file.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
class CreateKnowledgeBaseFile < ActiveRecord::Migration[7.1]
def change
create_table :knowledge_base_files do |t|
t.string :name
t.integer :size, default: 0
t.string :status, default: "processing"
t.integer :first_record_id
t.integer :last_record_id
t.integer :knowledge_base_id
t.boolean :workflow_enabled, default: false

t.timestamps
end
end
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
class UpdateStatusForKnowledgeBaseFile < ActiveRecord::Migration[7.1]
def up
if column_exists?(:knowledge_base_files, :status)
safety_assured { remove_column :knowledge_base_files, :status }
add_column :knowledge_base_files, :upload_status, :integer, default: 0
end
end

def down
if column_exists?(:knowledge_base_files, :upload_status)
safety_assured { remove_column :knowledge_base_files, :upload_status }
add_column :knowledge_base_files, :status, :string, default: "processing"
end
end
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
class AddFileNameToKnowledgeBaseFile < ActiveRecord::Migration[7.1]
def up
safety_assured { remove_column :knowledge_base_files, :first_record_id if column_exists?(:knowledge_base_files, :first_record_id) }
safety_assured { remove_column :knowledge_base_files, :last_record_id if column_exists?(:knowledge_base_files, :last_record_id) }

# Add foreign key only if both tables exist
if table_exists?(:workspaces)
add_foreign_key :knowledge_bases, :workspaces, validate: false
end

if table_exists?(:knowledge_bases)
add_foreign_key :knowledge_base_files, :knowledge_bases, column: :knowledge_base_id, validate: false
end
end

def down
add_column :knowledge_base_files, :first_record_id, :integer unless column_exists?(:knowledge_base_files, :first_record_id)
add_column :knowledge_base_files, :last_record_id, :integer unless column_exists?(:knowledge_base_files, :last_record_id)
remove_foreign_key :knowledge_bases, :workspaces rescue nil
remove_foreign_key :knowledge_base_files, :knowledge_bases, column: :knowledge_base_id rescue nil
end
end
65 changes: 65 additions & 0 deletions server/db/schema.rb

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 11 additions & 0 deletions server/spec/factories/agents/knowledge_base_file.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# frozen_string_literal: true

FactoryBot.define do
factory :knowledge_base_file, class: "Agents::KnowledgeBaseFile" do
association :knowledge_base, factory: :knowledge_base
name { "My Knowledge Base File" }
size { 100 }
workflow_enabled { false }
upload_status { :processing }
end
end
Loading
Loading