Jacqkues commited on
Commit
51e5002
·
verified ·
1 Parent(s): 3dc1d4a

Delete app.py

Browse files
Files changed (1) hide show
  1. app.py +0 -196
app.py DELETED
@@ -1,196 +0,0 @@
1
- import gradio as gr
2
- from database import Database
3
- from filesource import FileSource
4
- from agent import run_agent
5
- from services.utils import get_db_scheme_from_uri
6
- source = None
7
-
8
-
9
- def connect_to_file(file):
10
- """
11
- This function is used to connect to a data source file like CSV or parquet
12
-
13
- Parameters:
14
- -----------
15
- file : File
16
- A file-like object (e.g., from a file upload or file picker) that contains structured data.
17
-
18
- Returns:
19
- --------
20
- tuple
21
- A tuple (schema, status) where:
22
- - schema (str): A string representation of the data schema if successful, or an empty string on failure.
23
- - status (str): A message indicating the success or failure of the connection.
24
-
25
- """
26
- global source
27
- try:
28
- source = FileSource(file.name)
29
- status = source.connect()
30
- schema = source._pretify_schema()
31
- status = "Connection successful!"
32
- except Exception as e:
33
- schema = ""
34
- status = f"Error: {str(e)}"
35
- return schema, status
36
-
37
- def generate_and_run_sql(prompt):
38
- """
39
- This function is used to give an answer to a user question related to a database or file source
40
-
41
-
42
- Parameters:
43
- -----------
44
- prompt : str
45
- A natural language instruction or question from the user (e.g., "Show me the top 10 customers by revenue").
46
-
47
- Returns:
48
- --------
49
- str
50
- The given response of the user question
51
- Notes:
52
- ------
53
- - Requires a connected `source` (via `connect_to_file` or `connect_to_database`).
54
- - Uses a language agent to interpret the prompt and generate an appropriate SQL query or explanation.
55
- """
56
- if source is None:
57
- return "Please connect to a database or add a file"
58
-
59
- answer = run_agent(source, prompt)
60
- out = ""
61
- for chunk in answer:
62
- out += chunk
63
- return out
64
-
65
-
66
- def connect_to_database(db_url):
67
- """
68
- This function is used to connect to a database using the provided database URL and returns its schema.
69
-
70
- Parameters:
71
- -----------
72
- db_url : str
73
- A valid database connection string (e.g., "mysql://user:pass@host:port/dbname").
74
-
75
- Returns:
76
- --------
77
- tuple
78
- A tuple (schema, status) where:
79
- - schema (str): A string representation of the database schema if the connection is successful,
80
- or an empty string if it fails.
81
- - status (str): A message indicating the result of the connection attempt.
82
-
83
- Notes:
84
- ------
85
- - The dialect is extracted from the URI to determine the database type (e.g., MySQL, PostgreSQL).
86
- """
87
- global source
88
- try:
89
- dialect = get_db_scheme_from_uri(db_url)
90
- source = Database(db_url, dialect)
91
- status = source.connect()
92
- schema = source._pretify_schema()
93
- status = "Connection successful!"
94
- except Exception as e:
95
- schema = ""
96
- status = f"Error: {str(e)}"
97
- return schema, status
98
- # Function to add user message to chat history
99
- def user(user_message, chat_history):
100
- chat_history.append({"role": "user", "content": user_message})
101
- return "", chat_history
102
-
103
- # Function to generate a bot response
104
- def bot(chat_history):
105
-
106
- if source is None:
107
- chat_history.append({"role":"assistant","content":"please connect to a database before asking question"})
108
- yield chat_history
109
- else:
110
- answer = run_agent(source,chat_history[-1]['content'])
111
- chat_history.append({"role":"assistant","content":""})
112
-
113
- for chunk in answer:
114
- chat_history[-1]['content'] += chunk
115
- yield chat_history
116
-
117
- # Create the Gradio interface
118
- with gr.Blocks( theme=gr.themes.Default(), css="""
119
- .gr-button { margin: 5px; border-radius:16px; }
120
- .gr-textbox, .gr-text-area, .gr-dropdown, .gr-json { border-radius: 8px; }
121
- .gr-row { gap: 10px; }
122
- .gr-tab { border-radius: 8px; }
123
- .status-text { font-size: 0.9em; color: #555; }
124
- .gr-json { max-height: 300px; overflow-y: auto; } /* Added scrolling for JSON */
125
- """) as demo:
126
- gr.Markdown(
127
- f"""
128
- # 🤖 MCP DB Answer
129
- Your mcp server that allow you to talk to any database
130
-
131
-
132
- Powered by Ibis it support : PostgreSQL , SQLite , MySQL , MSSQL , ClickHouse , BigQuery and many other
133
-
134
-
135
- Also support .CSV and .parquet files
136
-
137
- """,
138
- elem_classes=["header"]
139
- )
140
-
141
- with gr.Column(scale=3):
142
- with gr.Tabs():
143
- with gr.TabItem("💬 Chat"):
144
- with gr.Group():
145
- main_chat_disp = gr.Chatbot(
146
- label=None, height=400,
147
- avatar_images=(None, "https://huggingface.co/spaces/Space-Share/bucket/resolve/main/images/pfp.webp"),
148
- show_copy_button=True, render_markdown=True, sanitize_html=True, type='messages'
149
- )
150
- with gr.Row(variant="compact"):
151
- user_msg_tb = gr.Textbox(
152
- show_label=False, placeholder="Talk with your data...",
153
- scale=7, lines=1, max_lines=3
154
- )
155
- send_btn = gr.Button("Send", variant="primary", scale=1, min_width=100)
156
- with gr.TabItem("Config"):
157
- with gr.Row():
158
- # Left column for database configuration.
159
- with gr.Column(scale=1):
160
- gr.Markdown("## Database Configuration")
161
- # Textbox for entering the database URL.
162
- db_url_tb = gr.Textbox(
163
- show_label=True, label="Database URL", placeholder="Enter the URL to connect to the database..."
164
- )
165
- # Button to connect to the database.
166
- connect_btn = gr.Button("Connect", variant="primary")
167
- gr.Markdown("## File Upload")
168
- file_uploader = gr.File(
169
- label="Upload File", file_types=[".csv", ".parquet", ".xls", ".xlsx"]
170
- )
171
- # Button to connect to the database.
172
- load_btn = gr.Button("Load", variant="primary")
173
-
174
- # Right column for displaying the database schema and status message.
175
- with gr.Column(scale=3):
176
- gr.Markdown("## Database Schema")
177
- # Textarea to display the database schema.
178
- schema_ta = gr.TextArea(
179
- show_label=False, placeholder="Database schema will be displayed here...",
180
- lines=20, max_lines=50, interactive=False
181
- )
182
- # Textbox to display the status message.
183
- status_tb = gr.Textbox(
184
- show_label=False, placeholder="Status message will be displayed here...",
185
- lines=1, max_lines=1, interactive=False, elem_classes=["status-text"]
186
- )
187
- connect_btn.click(fn=connect_to_database, inputs=db_url_tb, outputs=[schema_ta, status_tb])
188
- load_btn.click(fn=connect_to_file, inputs=file_uploader, outputs=[schema_ta, status_tb])
189
- send_btn.click(fn=user, inputs=[user_msg_tb, main_chat_disp], outputs=[user_msg_tb, main_chat_disp], queue=False).then(
190
- fn=bot, inputs=main_chat_disp, outputs=main_chat_disp
191
- )
192
- invisible_btn = gr.Button(visible=False)
193
- invisible_btn.click(fn=generate_and_run_sql, inputs=[user_msg_tb], outputs=[user_msg_tb, main_chat_disp])
194
-
195
- if __name__ == "__main__":
196
- demo.launch(mcp_server=True)