Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
S
saas-bi
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
EzijingWeb
saas-bi
Commits
f41baf12
提交
f41baf12
authored
4月 17, 2025
作者:
王鹏飞
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
chore: update
上级
bc53e756
隐藏空白字符变更
内嵌
并排
正在显示
6 个修改的文件
包含
22 行增加
和
21 行删除
+22
-21
AIBubble.tsx
src/ai/AIBubble.tsx
+7
-0
api.ts
src/ai/api.ts
+6
-6
types.ts
src/ai/types.ts
+1
-0
useAIStore.ts
src/ai/useAIStore.ts
+1
-0
AIModal.tsx
src/components/data/AIModal.tsx
+4
-9
DataReport.tsx
src/modules/data/write/my/components/DataReport.tsx
+3
-6
没有找到文件。
src/ai/AIBubble.tsx
0 → 100644
浏览文件 @
f41baf12
import
{
Bubble
,
BubbleProps
}
from
'@ant-design/x'
import
MarkdownRender
from
'@/components/MarkdownRender'
const
renderMarkdown
=
(
content
:
string
)
=>
<
MarkdownRender
>
{
content
}
</
MarkdownRender
>
export
default
function
AIBubble
(
props
:
BubbleProps
)
{
return
<
Bubble
messageRender=
{
renderMarkdown
}
{
...
props
}
></
Bubble
>
}
src/ai/api.ts
浏览文件 @
f41baf12
...
...
@@ -134,11 +134,11 @@ export async function openAI(data: AIData, options: SSEOptions) {
const
aiService
=
{
async
post
(
data
:
AIData
,
options
:
SSEOptions
)
{
const
messages
:
AIMessage
[]
=
[]
//
const dataset = localStorage.getItem('dataset')
//
if (dataset) {
//
const datasetInfo = JSON.parse(dataset)
//
messages.push({ role: 'system', content: `这是一个数据集:${JSON.stringify(datasetInfo)}` })
//
}
const
dataset
=
localStorage
.
getItem
(
'dataset'
)
if
(
dataset
)
{
const
datasetInfo
=
JSON
.
parse
(
dataset
)
messages
.
push
({
role
:
'system'
,
content
:
`这是一个数据集:
${
JSON
.
stringify
(
datasetInfo
)}
`
})
}
data
.
messages
=
[...
messages
,
...
data
.
messages
]
const
providers
=
{
...
...
@@ -150,7 +150,7 @@ const aiService = {
openAI
,
}
const
provider
=
providers
[
data
.
model
as
keyof
typeof
providers
]
||
openAI
const
provider
=
providers
[
data
.
model
as
keyof
typeof
providers
]
||
qwen
await
provider
(
data
,
options
)
},
}
...
...
src/ai/types.ts
浏览文件 @
f41baf12
...
...
@@ -9,6 +9,7 @@ export interface AIMessage {
content
:
string
reasoning_content
?:
string
json
?:
any
loading
?:
boolean
}
export
interface
AIData
{
...
...
src/ai/useAIStore.ts
浏览文件 @
f41baf12
...
...
@@ -54,6 +54,7 @@ export const useAIStore = create<AIState>((set, get) => ({
{
signal
:
controller
.
signal
,
onUpdate
:
(
message
)
=>
{
console
.
log
(
message
)
set
((
state
)
=>
{
const
messageIndex
=
state
.
messages
.
findIndex
((
msg
)
=>
msg
.
id
===
message
.
id
)
...
...
src/components/data/AIModal.tsx
浏览文件 @
f41baf12
import
{
Button
,
Flex
,
Modal
,
Spin
}
from
'antd'
import
{
Button
,
Modal
}
from
'antd'
import
{
useEffect
,
useState
}
from
'react'
import
{
useAI
}
from
'@/ai/useAI'
import
MarkdownRender
from
'@/components/MarkdownRender
'
import
AIBubble
from
'@/ai/AIBubble
'
export
default
function
AIModal
({
prompt
}:
{
prompt
:
string
})
{
const
[
open
,
setOpen
]
=
useState
(
false
)
...
...
@@ -9,9 +9,7 @@ export default function AIModal({ prompt }: { prompt: string }) {
useEffect
(()
=>
{
if
(
open
)
{
post
({
messages
:
[{
role
:
'user'
,
content
:
prompt
}],
})
post
({
messages
:
[{
role
:
'user'
,
content
:
prompt
}]
})
}
},
[
open
,
prompt
])
return
(
...
...
@@ -20,10 +18,7 @@ export default function AIModal({ prompt }: { prompt: string }) {
AI建议
</
Button
>
<
Modal
title=
"AI建议"
open=
{
open
}
footer=
{
null
}
width=
{
1000
}
onCancel=
{
()
=>
setOpen
(
false
)
}
destroyOnClose
>
<
MarkdownRender
>
{
message
?.
content
}
</
MarkdownRender
>
<
Flex
justify=
"center"
>
<
Spin
size=
"large"
spinning=
{
isLoading
}
></
Spin
>
</
Flex
>
<
AIBubble
loading=
{
!
message
?.
content
}
typing=
{
isLoading
}
content=
{
message
?.
content
}
></
AIBubble
>
</
Modal
>
</>
)
...
...
src/modules/data/write/my/components/DataReport.tsx
浏览文件 @
f41baf12
import
{
Button
,
Flex
,
Modal
,
Spin
}
from
'antd'
import
{
Button
,
Modal
}
from
'antd'
import
{
useEffect
,
useState
}
from
'react'
import
{
useAI
}
from
'@/ai/useAI'
import
MarkdownRender
from
'@/components/MarkdownRender
'
import
AIBubble
from
'@/ai/AIBubble
'
export
default
function
DataReport
()
{
const
[
open
,
setOpen
]
=
useState
(
false
)
...
...
@@ -26,10 +26,7 @@ export default function DataReport() {
数据分析报告
</
Button
>
<
Modal
title=
"数据分析报告"
open=
{
open
}
footer=
{
null
}
width=
{
1000
}
onCancel=
{
()
=>
setOpen
(
false
)
}
destroyOnClose
>
<
MarkdownRender
>
{
message
?.
content
}
</
MarkdownRender
>
<
Flex
justify=
"center"
>
<
Spin
size=
"large"
spinning=
{
isLoading
}
></
Spin
>
</
Flex
>
<
AIBubble
loading=
{
!
message
?.
content
}
typing=
{
isLoading
}
content=
{
message
?.
content
}
></
AIBubble
>
</
Modal
>
</>
)
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论