fix: i18n

This commit is contained in:
ulleo
2025-06-17 17:00:28 +08:00
parent fa3f57e1b7
commit aebcace782
4 changed files with 48 additions and 16 deletions
+10 -11
View File
@@ -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")
+13
View File
@@ -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"
}
}
+13
View File
@@ -136,5 +136,18 @@
"failed": "连接失败"
}
}
},
"chat": {
"chart_type": {
"table": "明细表",
"bar": "条形图",
"column": "柱状图",
"line": "折线图",
"pie": "饼图"
},
"sql_generation": "生成SQL",
"chart_generation": "生成图表",
"inference_process": "思考过程",
"thinking": "思考中"
}
}
+12 -5
View File
@@ -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>