human_sql 0.1.4 → 0.1.6
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.
- checksums.yaml +4 -4
- data/human_sql-0.1.4.gem +0 -0
- data/human_sql-0.1.5.gem +0 -0
- data/lib/human_sql/version.rb +1 -1
- data/lib/human_sql.rb +17 -7
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0b99e3383795c42236a802343a72f13c0de24240d35476a871d424bf3d87f795
|
4
|
+
data.tar.gz: 43f3c4d3a6f801bf1fb5109cbc58ec5f2fef9cfc14ac875a4a1dc5e9ea78930a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8e981540d9770d4b9db1ed0476c5417175ab813983c645ff351dc49aa3e1bbbd239ee36e2b6afd3effbd3387e04edbf417c098714c45c433f49aa5c6aa67ea32
|
7
|
+
data.tar.gz: b114d7dac96701c265a8fe52efc99b9039784a4e607c31540c9c0380f2c8bf7e901ee0387c65760f6eea3fa4651065100b6c1faee6dfe9b68ae0035ac7ce6dc2
|
data/human_sql-0.1.4.gem
ADDED
Binary file
|
data/human_sql-0.1.5.gem
ADDED
Binary file
|
data/lib/human_sql/version.rb
CHANGED
data/lib/human_sql.rb
CHANGED
@@ -7,7 +7,7 @@ require_relative 'human_sql/version'
|
|
7
7
|
module HumanSQL
|
8
8
|
class QueryBuilder
|
9
9
|
OPENAI_API_URL = 'https://api.openai.com/v1/chat/completions'
|
10
|
-
|
10
|
+
|
11
11
|
def initialize(user_input)
|
12
12
|
@user_input = user_input
|
13
13
|
@schema_content = File.read(Rails.root.join('db', 'schema.rb'))
|
@@ -19,8 +19,11 @@ module HumanSQL
|
|
19
19
|
|
20
20
|
def generate_query
|
21
21
|
prompt = build_query_prompt(@user_input, @schema_content)
|
22
|
+
|
22
23
|
generated_query_response = call_openai_service(prompt)&.strip
|
23
|
-
extract_active_record_query(generated_query_response)
|
24
|
+
extracted_query = extract_active_record_query(generated_query_response)
|
25
|
+
|
26
|
+
extracted_query
|
24
27
|
end
|
25
28
|
|
26
29
|
def get_results
|
@@ -32,6 +35,7 @@ module HumanSQL
|
|
32
35
|
|
33
36
|
formatted_results = format_results_for_openai(results)
|
34
37
|
natural_language_response = generate_natural_language_response(formatted_results, @user_input)
|
38
|
+
|
35
39
|
natural_language_response
|
36
40
|
rescue StandardError => e
|
37
41
|
process_error_in_natural_language(e.message)
|
@@ -40,7 +44,7 @@ module HumanSQL
|
|
40
44
|
private
|
41
45
|
|
42
46
|
def build_query_prompt(user_input, schema_content)
|
43
|
-
<<-PROMPT
|
47
|
+
prompt = <<-PROMPT
|
44
48
|
The user has requested: "#{user_input}".
|
45
49
|
This is the database schema:
|
46
50
|
|
@@ -49,11 +53,12 @@ module HumanSQL
|
|
49
53
|
Please generate an ActiveRecord query based on this schema. The query should be in a single line of code and return the result according to the user's request.
|
50
54
|
If it's necessary to access multiple related tables, prefer to use `includes` over `joins` to optimize data loading.
|
51
55
|
PROMPT
|
56
|
+
prompt
|
52
57
|
end
|
53
58
|
|
54
59
|
def call_openai_service(prompt)
|
55
60
|
body = {
|
56
|
-
model: "gpt-
|
61
|
+
model: "gpt-4o-mini",
|
57
62
|
messages: [
|
58
63
|
{
|
59
64
|
role: "system",
|
@@ -84,12 +89,14 @@ module HumanSQL
|
|
84
89
|
response_body = JSON.parse(response.body)
|
85
90
|
response_body.dig('choices', 0, 'message', 'content')
|
86
91
|
else
|
87
|
-
|
92
|
+
error_message = "Error in OpenAI API: #{response.code} - #{response.body}"
|
93
|
+
raise error_message
|
88
94
|
end
|
89
95
|
end
|
90
96
|
|
91
97
|
def extract_active_record_query(response)
|
92
98
|
return nil if response.blank?
|
99
|
+
|
93
100
|
code_lines = response.lines.select { |line| line.strip.match(/^[A-Za-z]\w*\./) }
|
94
101
|
return nil if code_lines.empty?
|
95
102
|
code_lines.join("\n").strip
|
@@ -103,15 +110,17 @@ module HumanSQL
|
|
103
110
|
|
104
111
|
def format_results_for_openai(results)
|
105
112
|
if results.is_a?(ActiveRecord::Relation) || results.is_a?(Array)
|
106
|
-
results.map do |result|
|
113
|
+
formatted = results.map do |result|
|
107
114
|
if result.respond_to?(:attributes)
|
108
115
|
result.attributes.map { |key, value| "#{key}: #{value}" }.join(', ')
|
109
116
|
else
|
110
117
|
result.to_s
|
111
118
|
end
|
112
119
|
end.join("\\n")
|
120
|
+
formatted
|
113
121
|
else
|
114
|
-
results.respond_to?(:attributes) ? results.attributes.map { |key, value| "#{key}: #{value}" }.join(', ') : results.to_s
|
122
|
+
formatted = results.respond_to?(:attributes) ? results.attributes.map { |key, value| "#{key}: #{value}" }.join(', ') : results.to_s
|
123
|
+
formatted
|
115
124
|
end
|
116
125
|
end
|
117
126
|
|
@@ -123,6 +132,7 @@ module HumanSQL
|
|
123
132
|
#{formatted_results}
|
124
133
|
|
125
134
|
Please generate a natural language description that clearly and understandably explains these results to the user in #{HumanSQLConfig[:default_language]}.
|
135
|
+
Do not ask for confirmation, just confirm what has already been done.
|
126
136
|
PROMPT
|
127
137
|
|
128
138
|
call_openai_service(prompt)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: human_sql
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nicolas Bertin
|
@@ -55,6 +55,8 @@ files:
|
|
55
55
|
- human_sql-0.1.1.gem
|
56
56
|
- human_sql-0.1.2.gem
|
57
57
|
- human_sql-0.1.3.gem
|
58
|
+
- human_sql-0.1.4.gem
|
59
|
+
- human_sql-0.1.5.gem
|
58
60
|
- lib/human_sql.rb
|
59
61
|
- lib/human_sql/version.rb
|
60
62
|
- sig/human_sql.rbs
|