Files

97 lines
2.6 KiB
Ruby
Raw Permalink Normal View History

2024-06-27 17:27:40 +10:00
# frozen_string_literal: true
module DiscourseAi
module Admin
class AiToolsController < ::Admin::AdminController
requires_plugin ::DiscourseAi::PLUGIN_NAME
before_action :find_ai_tool, only: %i[test show update destroy]
2024-06-27 17:27:40 +10:00
def index
ai_tools = AiTool.all
render_serialized({ ai_tools: ai_tools }, AiCustomToolListSerializer, root: false)
end
def show
render_serialized(@ai_tool, AiCustomToolSerializer)
end
def create
ai_tool = AiTool.new(ai_tool_params)
2024-06-27 17:27:40 +10:00
ai_tool.created_by_id = current_user.id
if ai_tool.save
2024-09-30 16:27:50 +09:00
RagDocumentFragment.link_target_and_uploads(ai_tool, attached_upload_ids)
2024-06-27 17:27:40 +10:00
render_serialized(ai_tool, AiCustomToolSerializer, status: :created)
else
render_json_error ai_tool
end
end
def update
if @ai_tool.update(ai_tool_params)
2024-09-30 16:27:50 +09:00
RagDocumentFragment.update_target_uploads(@ai_tool, attached_upload_ids)
2024-06-27 17:27:40 +10:00
render_serialized(@ai_tool, AiCustomToolSerializer)
else
render_json_error @ai_tool
end
end
def destroy
if @ai_tool.destroy
head :no_content
else
render_json_error @ai_tool
end
end
def test
@ai_tool.assign_attributes(ai_tool_params) if params[:ai_tool]
2024-06-27 17:27:40 +10:00
parameters = params[:parameters].to_unsafe_h
# we need an llm so we have a tokenizer
# but will do without if none is available
llm = LlmModel.first&.to_llm
runner = @ai_tool.runner(parameters, llm: llm, bot_user: current_user, context: {})
2024-06-27 17:27:40 +10:00
result = runner.invoke
if result.is_a?(Hash) && result[:error]
render_json_error result[:error]
else
render json: { output: result }
end
rescue ActiveRecord::RecordNotFound => e
render_json_error e.message, status: 400
rescue => e
render_json_error "Error executing the tool: #{e.message}", status: 400
end
private
2024-09-30 16:27:50 +09:00
def attached_upload_ids
params[:ai_tool][:rag_uploads].to_a.map { |h| h[:id] }
2024-09-30 16:27:50 +09:00
end
2024-06-27 17:27:40 +10:00
def find_ai_tool
@ai_tool = AiTool.find(params[:id].to_i)
2024-06-27 17:27:40 +10:00
end
def ai_tool_params
params
.require(:ai_tool)
.permit(
:name,
:description,
:script,
:summary,
:rag_chunk_tokens,
:rag_chunk_overlap_tokens,
rag_uploads: [:id],
parameters: [:name, :type, :description, :required, enum: []],
)
.except(:rag_uploads)
2024-06-27 17:27:40 +10:00
end
end
end
end