require 'sinatra'
require 'sinatra/json'
require 'json'
require 'securerandom'
require 'fileutils'
set :port, 8000
set :bind, '0.0.0.0'
CONFIGS_DIR = 'configs'
FileUtils.mkdir_p(CONFIGS_DIR)
def load_config(config_id)
file_path = File.join(CONFIGS_DIR, "#{config_id}.json")
JSON.parse(File.read(file_path))
rescue Errno::ENOENT
halt 404, json(error: "Configuration #{config_id} not found")
end
def save_config(config_id, config)
file_path = File.join(CONFIGS_DIR, "#{config_id}.json")
File.write(file_path, JSON.pretty_generate(config))
end
post '/config' do
config_id = SecureRandom.uuid
initial_config = {
'version' => '1.0.0',
'sections' => {
'main' => [{ 'ai' => {} }]
}
}
save_config(config_id, initial_config)
json config_id: config_id
end
get '/config/:config_id' do |config_id|
json load_config(config_id)
end
delete '/config/:config_id' do |config_id|
file_path = File.join(CONFIGS_DIR, "#{config_id}.json")
File.delete(file_path)
json message: "Configuration #{config_id} deleted successfully"
rescue Errno::ENOENT
halt 404, json(error: "Configuration #{config_id} not found")
end
put '/config/:config_id/params/:param_name' do |config_id, param_name|
value = JSON.parse(request.body.read)
config = load_config(config_id)
config['sections']['main'][0]['ai']['params'] ||= {}
config['sections']['main'][0]['ai']['params'][param_name] = value
save_config(config_id, config)
json message: "Parameter #{param_name} updated successfully"
end
put '/config/:config_id/params' do |config_id|
params = JSON.parse(request.body.read)
config = load_config(config_id)
config['sections']['main'][0]['ai']['params'] ||= {}
params.each do |param|
config['sections']['main'][0]['ai']['params'][param['name']] = param['value']
end
save_config(config_id, config)
json message: "#{params.length} parameters updated successfully"
end
delete '/config/:config_id/params/:param_name' do |config_id, param_name|
config = load_config(config_id)
if config['sections']['main'][0]['ai']['params'] && config['sections']['main'][0]['ai']['params'].key?(param_name)
config['sections']['main'][0]['ai']['params'].delete(param_name)
save_config(config_id, config)
json message: "Parameter #{param_name} deleted successfully"
else
halt 404, json(error: "Parameter #{param_name} not found")
end
end
put '/config/:config_id/prompt' do |config_id|
prompt = JSON.parse(request.body.read)
config = load_config(config_id)
config['sections']['main'][0]['ai']['prompt'] = prompt
save_config(config_id, config)
json message: 'Prompt updated successfully'
end
put '/config/:config_id/post_prompt' do |config_id|
post_prompt = JSON.parse(request.body.read)
config = load_config(config_id)
config['sections']['main'][0]['ai']['post_prompt'] = post_prompt
save_config(config_id, config)
json message: 'Post-prompt updated successfully'
end
put '/config/:config_id/languages' do |config_id|
languages = JSON.parse(request.body.read)
config = load_config(config_id)
config['sections']['main'][0]['ai']['languages'] = languages
save_config(config_id, config)
json message: 'Languages updated successfully'
end
put '/config/:config_id/hints' do |config_id|
hints = JSON.parse(request.body.read)
config = load_config(config_id)
config['sections']['main'][0]['ai']['hints'] = hints
save_config(config_id, config)
json message: 'Hints updated successfully'
end
put '/config/:config_id/swaig/functions/:function_name' do |config_id, function_name|
function = JSON.parse(request.body.read)
config = load_config(config_id)
config['sections']['main'][0]['ai']['SWAIG'] ||= { 'functions' => [] }
functions = config['sections']['main'][0]['ai']['SWAIG']['functions']
existing_function = functions.find { |f| f['function'] == function_name }
if existing_function
existing_function.merge!(function)
message = "SWAIG function #{function_name} updated successfully"
else
functions << function
message = "SWAIG function #{function_name} added successfully"
end
save_config(config_id, config)
json message: message
end
delete '/config/:config_id/swaig/functions/:function_name' do |config_id, function_name|
config = load_config(config_id)
if config['sections']['main'][0]['ai']['SWAIG'] && config['sections']['main'][0]['ai']['SWAIG']['functions']
functions = config['sections']['main'][0]['ai']['SWAIG']['functions']
removed = functions.reject! { |f| f['function'] == function_name }
if removed
save_config(config_id, config)
json message: "SWAIG function #{function_name} deleted successfully"
else
halt 404, json(error: "SWAIG function #{function_name} not found")
end
else
halt 404, json(error: "SWAIG function #{function_name} not found")
end
end
get '/config/:config_id/swaig/functions/:function_name' do |config_id, function_name|
config = load_config(config_id)
if config['sections']['main'][0]['ai']['SWAIG'] && config['sections']['main'][0]['ai']['SWAIG']['functions']
function = config['sections']['main'][0]['ai']['SWAIG']['functions'].find { |f| f['function'] == function_name }
if function
json function
else
halt 404, json(error: "SWAIG function #{function_name} not found")
end
else
halt 404, json(error: "SWAIG function #{function_name} not found")
end
end