mirror of
https://gh-proxy.org/https://github.com/klinsmaya/SQLBot.git
synced 2026-11-08 01:06:59 +08:00
fix: i18n
This commit is contained in:
@@ -123,48 +123,47 @@ async def stream_sql(session: SessionDep, current_user: CurrentUser, request_que
|
||||
def run_task():
|
||||
try:
|
||||
# return id
|
||||
yield json.dumps({'type': 'id', 'id': llm_service.get_record().id}) + '\n\n'
|
||||
yield orjson.dumps({'type': 'id', 'id': llm_service.get_record().id}).decode() + '\n\n'
|
||||
|
||||
# generate sql
|
||||
sql_res = llm_service.generate_sql(session=session, lang=db_user.language)
|
||||
full_sql_text = ''
|
||||
for chunk in sql_res:
|
||||
full_sql_text += chunk
|
||||
yield json.dumps({'content': chunk, 'type': 'sql-result'}, ensure_ascii=False) + '\n\n'
|
||||
yield json.dumps({'type': 'info', 'msg': 'sql generated'}) + '\n\n'
|
||||
yield orjson.dumps({'content': chunk, 'type': 'sql-result'}).decode() + '\n\n'
|
||||
yield orjson.dumps({'type': 'info', 'msg': 'sql generated'}).decode() + '\n\n'
|
||||
|
||||
# filter sql
|
||||
print(full_sql_text)
|
||||
sql = llm_service.check_save_sql(session=session, res=full_sql_text)
|
||||
print(sql)
|
||||
yield json.dumps({'content': sql, 'type': 'sql'}) + '\n\n'
|
||||
yield orjson.dumps({'content': sql, 'type': 'sql'}).decode() + '\n\n'
|
||||
|
||||
# execute sql
|
||||
result = llm_service.execute_sql(sql=sql)
|
||||
llm_service.save_sql_data(session=session, data_obj=result)
|
||||
yield json.dumps({'content': orjson.dumps(result).decode(), 'type': 'sql-data'}) + '\n\n'
|
||||
yield orjson.dumps({'content': orjson.dumps(result).decode(), 'type': 'sql-data'}).decode() + '\n\n'
|
||||
|
||||
# generate chart
|
||||
chart_res = llm_service.generate_chart(session=session, lang=db_user.language)
|
||||
full_chart_text = ''
|
||||
for chunk in chart_res:
|
||||
full_chart_text += chunk
|
||||
yield json.dumps({'content': chunk, 'type': 'chart-result'}, ensure_ascii=False) + '\n\n'
|
||||
yield json.dumps({'type': 'info', 'msg': 'chart generated'}) + '\n\n'
|
||||
yield orjson.dumps({'content': chunk, 'type': 'chart-result'}).decode() + '\n\n'
|
||||
yield orjson.dumps({'type': 'info', 'msg': 'chart generated'}).decode() + '\n\n'
|
||||
|
||||
# filter chart
|
||||
print(full_chart_text)
|
||||
chart = llm_service.check_save_chart(session=session, res=full_chart_text)
|
||||
print(chart)
|
||||
yield json.dumps({'content': json.dumps(chart, ensure_ascii=False), 'type': 'chart'},
|
||||
ensure_ascii=False) + '\n\n'
|
||||
yield orjson.dumps({'content': orjson.dumps(chart).decode(), 'type': 'chart'}).decode() + '\n\n'
|
||||
|
||||
llm_service.finish(session=session)
|
||||
yield json.dumps({'type': 'finish'})
|
||||
yield orjson.dumps({'type': 'finish'}).decode() + '\n\n'
|
||||
|
||||
except Exception as e:
|
||||
traceback.print_exc()
|
||||
llm_service.save_error(session=session, message=str(e))
|
||||
yield json.dumps({'content': str(e), 'type': 'error'}, ensure_ascii=False) + '\n\n'
|
||||
yield orjson.dumps({'content': str(e), 'type': 'error'}).decode() + '\n\n'
|
||||
|
||||
return StreamingResponse(run_task(), media_type="text/event-stream")
|
||||
|
||||
@@ -136,5 +136,18 @@
|
||||
"failed": "Connect failed"
|
||||
}
|
||||
}
|
||||
},
|
||||
"chat": {
|
||||
"chart_type": {
|
||||
"table": "Table",
|
||||
"bar": "Bar",
|
||||
"column": "Column",
|
||||
"line": "Line",
|
||||
"pie": "Pie"
|
||||
},
|
||||
"sql_generation": "SQL Generation",
|
||||
"chart_generation": "Chart Generation",
|
||||
"inference_process" : "Inference process",
|
||||
"thinking": "Thinking"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -136,5 +136,18 @@
|
||||
"failed": "连接失败"
|
||||
}
|
||||
}
|
||||
},
|
||||
"chat": {
|
||||
"chart_type": {
|
||||
"table": "明细表",
|
||||
"bar": "条形图",
|
||||
"column": "柱状图",
|
||||
"line": "折线图",
|
||||
"pie": "饼图"
|
||||
},
|
||||
"sql_generation": "生成SQL",
|
||||
"chart_generation": "生成图表",
|
||||
"inference_process": "思考过程",
|
||||
"thinking": "思考中"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,7 +11,9 @@ import ICON_LINE from '@/assets/svg/chart/line.svg'
|
||||
import ICON_PIE from '@/assets/svg/chart/pie.svg'
|
||||
import ICON_TABLE from '@/assets/svg/chart/table.svg'
|
||||
import { find } from 'lodash-es'
|
||||
import { useI18n } from 'vue-i18n'
|
||||
|
||||
const { t } = useI18n()
|
||||
const props = defineProps<{
|
||||
message?: ChatMessage
|
||||
}>()
|
||||
@@ -107,6 +109,7 @@ const chartTypeList = computed(() => {
|
||||
const _list = [
|
||||
{
|
||||
value: 'table',
|
||||
name: t('chat.chart_type.table'),
|
||||
icon: ICON_TABLE,
|
||||
},
|
||||
]
|
||||
@@ -119,20 +122,24 @@ const chartTypeList = computed(() => {
|
||||
case 'line':
|
||||
_list.push({
|
||||
value: 'column',
|
||||
name: t('chat.chart_type.column'),
|
||||
icon: ICON_COLUMN,
|
||||
})
|
||||
_list.push({
|
||||
value: 'bar',
|
||||
name: t('chat.chart_type.bar'),
|
||||
icon: ICON_BAR,
|
||||
})
|
||||
_list.push({
|
||||
value: 'line',
|
||||
name: t('chat.chart_type.line'),
|
||||
icon: ICON_LINE,
|
||||
})
|
||||
break
|
||||
case 'pie':
|
||||
_list.push({
|
||||
value: 'pie',
|
||||
name: t('chat.chart_type.pie'),
|
||||
icon: ICON_PIE,
|
||||
})
|
||||
}
|
||||
@@ -159,7 +166,7 @@ function onTypeChange() {
|
||||
<el-container v-if="message">
|
||||
<el-header style="display: flex; align-items: center; flex-direction: row">
|
||||
<div style="flex: 1">
|
||||
<div v-if="message.isTyping">Thinking ...</div>
|
||||
<div v-if="message.isTyping">{{ t('chat.thinking') }} ...</div>
|
||||
<div v-if="chartObject.title && !message.isTyping">{{ chartObject.title }}</div>
|
||||
</div>
|
||||
<div class="tab-container">
|
||||
@@ -188,7 +195,7 @@ function onTypeChange() {
|
||||
<el-icon size="34">
|
||||
<component :is="t.icon" />
|
||||
</el-icon>
|
||||
{{ t.value }}
|
||||
{{ t.name }}
|
||||
</div>
|
||||
</el-option>
|
||||
</el-select>
|
||||
@@ -207,19 +214,19 @@ function onTypeChange() {
|
||||
<el-collapse expand-icon-position="left">
|
||||
<el-collapse-item name="1">
|
||||
<template #title>
|
||||
Inference process
|
||||
{{ t('chat.inference_process') }}
|
||||
<el-icon v-if="props.message?.isTyping">
|
||||
<Loading />
|
||||
</el-icon>
|
||||
</template>
|
||||
<div>
|
||||
<template v-if="message.record.sql_answer">
|
||||
<div>SQL Generation:</div>
|
||||
<div style="font-weight: 500">{{ t('chat.sql_generation') }}:</div>
|
||||
<div v-if="message.record.sql_answer" v-dompurify-html="renderSqlThinking"></div>
|
||||
</template>
|
||||
<template v-if="message.record.chart_answer">
|
||||
<el-divider></el-divider>
|
||||
<div>Chart Generation:</div>
|
||||
<div style="font-weight: 500">{{ t('chat.chart_generation') }}:</div>
|
||||
<div v-dompurify-html="renderChartThinking"></div>
|
||||
</template>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user