12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- import chainlit as cl
- from chainlit.input_widget import Select
- from vanna_llm_factory import create_vanna_instance
- import os
- # vn.set_api_key(os.environ['VANNA_API_KEY'])
- # vn.set_model('chinook')
- # vn.connect_to_sqlite('https://vanna.ai/Chinook.sqlite')
- vn = create_vanna_instance()
- @cl.set_chat_profiles
- async def chat_profile():
- return [
- cl.ChatProfile(
- name="Vanna助手",
- markdown_description="基于Vanna的智能数据库查询助手,支持自然语言转SQL查询和数据可视化",
- icon="./public/avatars/huoche.png",
- # 备用在线图标,如果本地图标不显示可以取消注释下面的行
- #icon="https://raw.githubusercontent.com/tabler/tabler-icons/master/icons/database.svg",
- ),
- ]
- @cl.step(language="sql", name="Vanna")
- async def gen_query(human_query: str):
- sql_query = vn.generate_sql(human_query)
- return sql_query
- @cl.step(name="Vanna")
- async def execute_query(query):
- current_step = cl.context.current_step
- df = vn.run_sql(query)
- current_step.output = df.head().to_markdown(index=False)
- return df
- @cl.step(name="Plot", language="python")
- async def plot(human_query, sql, df):
- current_step = cl.context.current_step
- plotly_code = vn.generate_plotly_code(question=human_query, sql=sql, df=df)
- fig = vn.get_plotly_figure(plotly_code=plotly_code, df=df)
- current_step.output = plotly_code
- return fig
- @cl.step(type="run", name="Vanna")
- async def chain(human_query: str):
- sql_query = await gen_query(human_query)
- df = await execute_query(sql_query)
- fig = await plot(human_query, sql_query, df)
- # 创建表格和图表元素
- elements = [
- cl.Text(name="data_table", content=df.to_markdown(index=False), display="inline"),
- cl.Plotly(name="chart", figure=fig, display="inline")
- ]
-
- await cl.Message(content=human_query, elements=elements, author="Vanna助手").send()
- @cl.on_message
- async def main(message: cl.Message):
- await chain(message.content)
- @cl.on_chat_start
- async def on_chat_start():
- # 发送中文欢迎消息
- welcome_message = """
- 🎉 **欢迎使用智能数据库查询助手!**
- 我可以帮助您:
- - 🔍 将自然语言问题转换为SQL查询
- - 📊 执行数据库查询并展示结果
- - 📈 生成数据可视化图表
- 请直接输入您想了解的数据问题,例如:
- - "交易次数最多的前5位客户是谁?"
- - "查看过去30天的交易趋势"
- 让我们开始探索数据吧!✨
- """
-
- await cl.Message(
- content=welcome_message,
- author="Vanna助手"
- ).send()
|