Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
赵月辉
/
fastgpt-migrated
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Unverified
Commit
af581bc9
authored
Mar 05, 2024
by
Archer
Committed by
GitHub
Mar 05, 2024
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Global variables support external variable; Extract module support default value (#921)
parent
42a8184e
Hide whitespace changes
Inline
Side-by-side
Showing
30 changed files
with
308 additions
and
201 deletions
+308
-201
docSite/content/docs/agreement/privacy.md
+2
-2
docSite/content/docs/development/openapi/share.md
+2
-0
docSite/content/docs/development/upgrading/469.md
+12
-6
packages/global/core/module/constants.ts
+16
-4
packages/global/core/module/template/system/contextExtract.ts
+2
-1
packages/global/core/module/type.d.ts
+1
-0
packages/service/common/vectorStore/pg/index.ts
+11
-1
packages/web/components/common/CustomModal/index.tsx
+0
-0
packages/web/components/common/Icon/constants.ts
+1
-0
packages/web/components/common/Icon/icons/core/app/variable/external.svg
+7
-0
packages/web/components/common/Textarea/PromptEditor/index.tsx
+1
-1
packages/web/styles/theme.ts
+0
-0
pnpm-lock.yaml
+7
-4
projects/app/package.json
+1
-0
projects/app/public/docs/versionIntro.md
+7
-5
projects/app/public/locales/en/common.json
+8
-1
projects/app/public/locales/zh/common.json
+8
-1
projects/app/src/components/ChatBox/index.tsx
+14
-9
projects/app/src/components/MyModal/index.tsx
+1
-1
projects/app/src/components/core/module/Flow/FlowProvider.tsx
+2
-2
projects/app/src/components/core/module/Flow/components/modules/VariableEdit.tsx
+34
-32
projects/app/src/components/core/module/Flow/components/nodes/NodeExtract/ExtractFieldModal.tsx
+38
-12
projects/app/src/components/core/module/Flow/components/nodes/NodeExtract/index.tsx
+86
-64
projects/app/src/global/core/prompt/agent.ts
+3
-4
projects/app/src/pages/_app.tsx
+1
-1
projects/app/src/pages/app/detail/components/SimpleEdit/EditForm.tsx
+0
-1
projects/app/src/pages/chat/share.tsx
+22
-24
projects/app/src/pages/login/components/RegisterForm.tsx
+1
-1
projects/app/src/pages/login/index.tsx
+2
-3
projects/app/src/service/moduleDispatch/agent/extract.ts
+18
-21
No files found.
docSite/content/docs/agreement/privacy.md
View file @
af581bc9
...
...
@@ -9,7 +9,7 @@ weight: 1221
最后更新时间:2024年3月3日
我们非常重视您的隐私保护,在您使用FastGPT云服务时,我们将按照以下政策收集、使用、披露和保护您的个人信息。请您仔细阅读并充分理解本隐私政策。
我们非常重视您的隐私保护,在您使用FastGPT云服务时
(以下简称为“本服务”)
,我们将按照以下政策收集、使用、披露和保护您的个人信息。请您仔细阅读并充分理解本隐私政策。
**我们可能需要收集的信息**
...
...
@@ -39,7 +39,7 @@ weight: 1221
2.
我们会定期对收集、存储和处理的个人信息进行安全评估,以确保个人信息安全。
3.
在发生个人信息泄露等安全事件时,我们会立即启动应急预案,并在法律法规规定的范围内向您及时告知。
4.
我们不会使用您的数据进行额外的备份存储或用于模型训练。
5.
您在本服务进行的数据删除均为物理删除,不可恢复。如有
有
非物理删除的操作,我们会在服务中特别指出。
5.
您在本服务进行的数据删除均为物理删除,不可恢复。如有非物理删除的操作,我们会在服务中特别指出。
**用户权利**
...
...
docSite/content/docs/development/openapi/share.md
View file @
af581bc9
...
...
@@ -169,6 +169,8 @@ curl --location --request POST '{{host}}/shareAuth/start' \
响应值与
[
chat 接口格式相同
](
/docs/development/openapi/chat/#响应
)
,仅多了一个
`token`
。
重点关注:
`totalPoints`
(总消耗AI积分),
`token`
(Token消耗总数)
```
bash
curl
--location
--request
POST
'{{host}}/shareAuth/finish'
\
--header
'Content-Type: application/json'
\
...
...
docSite/content/docs/development/upgrading/469.md
View file @
af581bc9
...
...
@@ -20,15 +20,21 @@ curl --location --request POST 'https://{{host}}/api/init/v469' \
1.
重置计量表。
2.
执行脏数据清理(清理无效的文件、清理无效的图片、清理无效的知识库集合、清理无效的向量)
## 外部接口更新
1.
由于计费系统变更,
[
分享链接对话上报接口
](
/docs/development/openapi/share/#5-编写对话结果上报接口可选
)
需要做一些调整,price字段被totalPoints字段取代。inputToken和outputToken不再提供,只提供
`token`
字段(总token数量)。
## V4.6.9 更新说明
1.
商业版新增 - 知识库新增“增强处理”训练模式,可生成更多类型索引。
2.
新增 - 完善了HTTP模块的变量提示。
3.
新增 - HTTP模块支持OpenAI单接口导入。
4.
优化 - 问题补全。增加英文类型。同时可以设置为单独模块,方便复用。
5.
优化 - 重写了计量模式
6.
优化 - Token 过滤历史记录,保持偶数条,防止部分模型报错。
7.
优化 - 分享链接SEO,可直接展示应用名和头像。
8.
修复 - 标注功能。
9.
修复 - qa生成线程计数错误。
4.
新增 - 全局变量支持增加外部变量。可通过分享链接的Query或 API 的 variables 参数传入。
5.
新增 - 内容提取模块增加默认值。
6.
优化 - 问题补全。增加英文类型。同时可以设置为单独模块,方便复用。
7.
优化 - 重写了计量模式
8.
优化 - Token 过滤历史记录,保持偶数条,防止部分模型报错。
9.
优化 - 分享链接SEO,可直接展示应用名和头像。
10.
修复 - 标注功能。
11.
修复 - qa生成线程计数错误。
12.
修复 - 问题分类连线类型错误
packages/global/core/module/constants.ts
View file @
af581bc9
...
...
@@ -116,17 +116,29 @@ export enum ModuleOutputKeyEnum {
export
enum
VariableInputEnum
{
input
=
'input'
,
textarea
=
'textarea'
,
select
=
'select'
select
=
'select'
,
external
=
'external'
}
export
const
variableMap
=
{
[
VariableInputEnum
.
input
]:
{
icon
:
'core/app/variable/input'
icon
:
'core/app/variable/input'
,
title
:
'core.module.variable.input type'
,
desc
:
''
},
[
VariableInputEnum
.
textarea
]:
{
icon
:
'core/app/variable/textarea'
icon
:
'core/app/variable/textarea'
,
title
:
'core.module.variable.textarea type'
,
desc
:
'允许用户最多输入4000字的对话框。'
},
[
VariableInputEnum
.
select
]:
{
icon
:
'core/app/variable/select'
icon
:
'core/app/variable/select'
,
title
:
'core.module.variable.select type'
,
desc
:
''
},
[
VariableInputEnum
.
external
]:
{
icon
:
'core/app/variable/external'
,
title
:
'core.module.variable.External type'
,
desc
:
'可以通过API接口或分享链接的Query传递变量。增加该类型变量的主要目的是用于变量提示。使用例子: 你可以通过分享链接Query中拼接Token,来实现内部系统身份鉴权。'
}
};
...
...
packages/global/core/module/template/system/contextExtract.ts
View file @
af581bc9
...
...
@@ -57,7 +57,7 @@ export const ContextExtractModule: FlowModuleTemplateType = {
{
key
:
ModuleInputKeyEnum
.
extractKeys
,
type
:
FlowNodeInputTypeEnum
.
custom
,
label
:
'
目标字段
'
,
label
:
''
,
valueType
:
ModuleIOValueTypeEnum
.
any
,
description
:
"由 '描述' 和 'key' 组成一个目标字段,可提取多个目标字段"
,
value
:
[],
// {desc: string; key: string; required: boolean; enum: string[]}[]
...
...
@@ -76,6 +76,7 @@ export const ContextExtractModule: FlowModuleTemplateType = {
{
key
:
ModuleOutputKeyEnum
.
failed
,
label
:
'提取字段缺失'
,
description
:
'存在一个或多个字段未提取成功。尽管使用了默认值也算缺失。'
,
valueType
:
ModuleIOValueTypeEnum
.
boolean
,
type
:
FlowNodeOutputTypeEnum
.
source
,
targets
:
[]
...
...
packages/global/core/module/type.d.ts
View file @
af581bc9
...
...
@@ -80,6 +80,7 @@ export type ContextExtractAgentItemType = {
desc
:
string
;
key
:
string
;
required
:
boolean
;
defaultValue
?:
string
;
enum
?:
string
;
};
...
...
packages/service/common/vectorStore/pg/index.ts
View file @
af581bc9
import
{
delay
}
from
'@fastgpt/global/common/system/utils'
;
import
{
addLog
}
from
'../../system/log'
;
import
{
Pool
}
from
'pg'
;
import
type
{
QueryResultRow
}
from
'pg'
;
...
...
@@ -15,10 +17,13 @@ export const connectPg = async (): Promise<Pool> => {
connectionTimeoutMillis
:
20000
});
global
.
pgClient
.
on
(
'error'
,
(
err
)
=>
{
global
.
pgClient
.
on
(
'error'
,
async
(
err
)
=>
{
console
.
log
(
err
);
global
.
pgClient
?.
end
();
global
.
pgClient
=
null
;
await
delay
(
1000
);
addLog
.
info
(
`Retry connect pg`
);
connectPg
();
});
...
...
@@ -27,7 +32,12 @@ export const connectPg = async (): Promise<Pool> => {
console
.
log
(
'pg connected'
);
return
global
.
pgClient
;
}
catch
(
error
)
{
global
.
pgClient
?.
end
();
global
.
pgClient
=
null
;
await
delay
(
1000
);
addLog
.
info
(
`Retry connect pg`
);
return
connectPg
();
}
};
...
...
packages/web/components/common/
My
Modal/index.tsx
→
packages/web/components/common/
Custom
Modal/index.tsx
View file @
af581bc9
File moved
packages/web/components/common/Icon/constants.ts
View file @
af581bc9
...
...
@@ -69,6 +69,7 @@ export const iconPaths = {
'core/app/simpleMode/tts'
:
()
=>
import
(
'./icons/core/app/simpleMode/tts.svg'
),
'core/app/simpleMode/variable'
:
()
=>
import
(
'./icons/core/app/simpleMode/variable.svg'
),
'core/app/ttsFill'
:
()
=>
import
(
'./icons/core/app/ttsFill.svg'
),
'core/app/variable/external'
:
()
=>
import
(
'./icons/core/app/variable/external.svg'
),
'core/app/variable/input'
:
()
=>
import
(
'./icons/core/app/variable/input.svg'
),
'core/app/variable/select'
:
()
=>
import
(
'./icons/core/app/variable/select.svg'
),
'core/app/variable/textarea'
:
()
=>
import
(
'./icons/core/app/variable/textarea.svg'
),
...
...
packages/web/components/common/Icon/icons/core/app/variable/external.svg
0 → 100644
View file @
af581bc9
<svg
t=
"1709524607561"
class=
"icon"
viewBox=
"0 0 1024 1024"
version=
"1.1"
xmlns=
"http://www.w3.org/2000/svg"
p-id=
"5121"
width=
"128"
height=
"128"
>
<path
d=
"M310.4 454.4v-118.4h435.2c44.8 0 86.4 25.6 105.6 64 16-22.4 22.4-48 22.4-73.6 0-73.6-57.6-131.2-131.2-131.2H310.4V76.8c0-16-19.2-28.8-35.2-19.2L9.6 246.4c-12.8 9.6-12.8 25.6 0 35.2l268.8 188.8c12.8 12.8 32 3.2 32-16zM1014.4 742.4l-268.8-188.8c-12.8-9.6-35.2 0-35.2 19.2v118.4H278.4c-44.8 0-86.4-25.6-105.6-64-16 22.4-22.4 48-22.4 73.6 0 73.6 57.6 131.2 131.2 131.2h432v118.4c0 16 19.2 28.8 35.2 19.2l268.8-188.8c9.6-12.8 9.6-32-3.2-38.4z"
p-id=
"5122"
></path>
</svg>
\ No newline at end of file
packages/web/components/common/Textarea/PromptEditor/index.tsx
View file @
af581bc9
...
...
@@ -2,7 +2,7 @@ import { Button, ModalBody, ModalFooter, useDisclosure } from '@chakra-ui/react'
import
React
,
{
useEffect
}
from
'react'
;
import
{
editorStateToText
}
from
'./utils'
;
import
Editor
from
'./Editor'
;
import
MyModal
from
'../../
My
Modal'
;
import
MyModal
from
'../../
Custom
Modal'
;
import
{
useTranslation
}
from
'next-i18next'
;
import
{
$getRoot
,
EditorState
,
type
LexicalEditor
}
from
'lexical'
;
import
{
EditorVariablePickerType
}
from
'./type.d'
;
...
...
p
rojects/app/src
/web/styles/theme.ts
→
p
ackages
/web/styles/theme.ts
View file @
af581bc9
File moved
pnpm-lock.yaml
View file @
af581bc9
...
...
@@ -317,6 +317,9 @@ importers:
jschardet
:
specifier
:
^3.0.0
version
:
3.0.0
json5
:
specifier
:
^2.2.3
version
:
2.2.3
jsonwebtoken
:
specifier
:
^9.0.2
version
:
9.0.2
...
...
@@ -5128,7 +5131,7 @@ packages:
engines
:
{
node
:
^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7
}
hasBin
:
true
dependencies
:
caniuse-lite
:
1.0.3000159
1
caniuse-lite
:
1.0.3000159
3
electron-to-chromium
:
1.4.690
node-releases
:
2.0.14
update-browserslist-db
:
1.0.13(browserslist@4.23.0)
...
...
@@ -5196,8 +5199,8 @@ packages:
engines
:
{
node
:
'
>=10'
}
dev
:
true
/caniuse-lite@1.0.3000159
1
:
resolution
:
{
integrity
:
sha512-
PCzRMei/vXjJyL5mJtzNiUCKP59dm8Apqc3PH8gJkMnMXZGox93RbE76jHsmLwmIo6/3nsYIpJtx0O7u5PqFu
Q==
}
/caniuse-lite@1.0.3000159
3
:
resolution
:
{
integrity
:
sha512-
UWM1zlo3cZfkpBysd7AS+z+v007q9G1+fLTUU42rQnY6t2axoogPW/xol6T7juU5EUoOhML4WgBIdG+9yYqAj
Q==
}
/canvas@2.11.2
:
resolution
:
{
integrity
:
sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==
}
...
...
@@ -9124,7 +9127,7 @@ packages:
'
@next/env'
:
13.5.2
'
@swc/helpers'
:
0.5.2
busboy
:
1.6.0
caniuse-lite
:
1.0.3000159
1
caniuse-lite
:
1.0.3000159
3
postcss
:
8.4.14
react
:
18.2.0
react-dom
:
18.2.0(react@18.2.0)
...
...
projects/app/package.json
View file @
af581bc9
...
...
@@ -37,6 +37,7 @@
"
immer
"
:
"^9.0.19"
,
"
js-yaml
"
:
"^4.1.0"
,
"
jschardet
"
:
"^3.0.0"
,
"
json5
"
:
"^2.2.3"
,
"
jsonwebtoken
"
:
"^9.0.2"
,
"
lodash
"
:
"^4.17.21"
,
"
mermaid
"
:
"^10.2.3"
,
...
...
projects/app/public/docs/versionIntro.md
View file @
af581bc9
...
...
@@ -3,7 +3,9 @@
1.
新增 - 知识库新增“增强处理”训练模式,可生成更多类型索引。
2.
新增 - 完善了HTTP模块的变量提示。
3.
新增 - HTTP模块支持OpenAI单接口导入。
4.
优化 - 问题补全。增加英文类型。同时可以设置为单独模块,方便复用。
5.
[
点击查看高级编排介绍文档
](
https://doc.fastgpt.in/docs/workflow/intro
)
6.
[
使用文档
](
https://doc.fastgpt.in/docs/intro/
)
7.
[
点击查看商业版
](
https://doc.fastgpt.in/docs/commercial/
)
\ No newline at end of file
4.
新增 - 全局变量支持增加外部变量。可通过分享链接的Query或 API 的 variables 参数传入。
5.
新增 - 内容提取模块增加默认值。
6.
优化 - 问题补全。增加英文类型。同时可以设置为单独模块,方便复用。
7.
[
点击查看高级编排介绍文档
](
https://doc.fastgpt.in/docs/workflow/intro
)
8.
[
使用文档
](
https://doc.fastgpt.in/docs/intro/
)
9.
[
点击查看商业版
](
https://doc.fastgpt.in/docs/commercial/
)
\ No newline at end of file
projects/app/public/locales/en/common.json
View file @
af581bc9
...
...
@@ -774,6 +774,8 @@
"Input description"
:
""
,
"label"
:
"Dataset quote"
},
"Default value"
:
"Default "
,
"Default value placeholder"
:
"Null characters are returned by default"
,
"Field Description"
:
"Description"
,
"Field Name"
:
"Name"
,
"Field Type"
:
"Type"
,
...
...
@@ -795,10 +797,14 @@
"Field Edit"
:
"Field Edit"
},
"extract"
:
{
"Add field"
:
"Add"
,
"Enum Description"
:
"Lists the possible values for the field, one per row"
,
"Enum Value"
:
"Enum"
,
"Field Description Placeholder"
:
"Name/age /sql statement......"
,
"Field Setting Title"
:
"Extract field configuration"
"Field Setting Title"
:
"Extract field configuration"
,
"Required"
:
"Required"
,
"Required Description"
:
"Even if the field cannot be extracted, it is returned with the default value"
,
"Target field"
:
"Field"
},
"http"
:
{
"Add props"
:
"Add props"
,
...
...
@@ -939,6 +945,7 @@
"string"
:
"String"
},
"variable"
:
{
"External type"
:
"External"
,
"add option"
:
"Add Option"
,
"input type"
:
"Text"
,
"key"
:
"Key"
,
...
...
projects/app/public/locales/zh/common.json
View file @
af581bc9
...
...
@@ -776,6 +776,8 @@
"Input description"
:
"可接收知识库搜索的结果。"
,
"label"
:
"知识库引用"
},
"Default value"
:
"默认值"
,
"Default value placeholder"
:
"不填则默认返回空字符"
,
"Field Description"
:
"字段描述"
,
"Field Name"
:
"字段名"
,
"Field Type"
:
"字段类型"
,
...
...
@@ -797,10 +799,14 @@
"Field Edit"
:
"字段编辑"
},
"extract"
:
{
"Add field"
:
"新增字段"
,
"Enum Description"
:
"列举出该字段可能的值,每行一个"
,
"Enum Value"
:
"枚举值"
,
"Field Description Placeholder"
:
"姓名/年龄/sql语句……"
,
"Field Setting Title"
:
"提取字段配置"
"Field Setting Title"
:
"提取字段配置"
,
"Required"
:
"必须返回"
,
"Required Description"
:
"即使无法提取该字段,也会使用默认值进行返回"
,
"Target field"
:
"目标字段"
},
"http"
:
{
"Add props"
:
"添加参数"
,
...
...
@@ -941,6 +947,7 @@
"string"
:
"字符串"
},
"variable"
:
{
"External type"
:
"外部传入"
,
"add option"
:
"添加选项"
,
"input type"
:
"文本"
,
"key"
:
"变量 key"
,
...
...
projects/app/src/components/ChatBox/index.tsx
View file @
af581bc9
...
...
@@ -186,6 +186,10 @@ const ChatBox = (
()
=>
splitGuideModule
(
userGuideModule
),
[
userGuideModule
]
);
const
filterVariableModules
=
useMemo
(
()
=>
variableModules
.
filter
((
item
)
=>
item
.
type
!==
VariableInputEnum
.
external
),
[
variableModules
]
);
// compute variable input is finish.
const
chatForm
=
useForm
<
{
...
...
@@ -200,17 +204,18 @@ const ChatBox = (
const
[
variableInputFinish
,
setVariableInputFinish
]
=
useState
(
false
);
// clicked start chat button
const
variableIsFinish
=
useMemo
(()
=>
{
if
(
!
variableModules
||
variableModules
.
length
===
0
||
chatHistory
.
length
>
0
)
return
true
;
if
(
!
filterVariableModules
||
filterVariableModules
.
length
===
0
||
chatHistory
.
length
>
0
)
return
true
;
for
(
let
i
=
0
;
i
<
v
ariableModules
.
length
;
i
++
)
{
const
item
=
v
ariableModules
[
i
];
for
(
let
i
=
0
;
i
<
filterV
ariableModules
.
length
;
i
++
)
{
const
item
=
filterV
ariableModules
[
i
];
if
(
item
.
required
&&
!
variables
[
item
.
key
])
{
return
false
;
}
}
return
variableInputFinish
;
},
[
chatHistory
.
length
,
variableInputFinish
,
v
ariableModules
,
variables
]);
},
[
chatHistory
.
length
,
variableInputFinish
,
filterV
ariableModules
,
variables
]);
// 滚动到底部
const
scrollToBottom
=
(
behavior
:
'smooth'
|
'auto'
=
'smooth'
)
=>
{
...
...
@@ -495,7 +500,7 @@ const ChatBox = (
getChatHistories
:
()
=>
chatHistory
,
resetVariables
(
e
)
{
const
defaultVal
:
Record
<
string
,
any
>
=
{};
v
ariableModules
?.
forEach
((
item
)
=>
{
filterV
ariableModules
?.
forEach
((
item
)
=>
{
defaultVal
[
item
.
key
]
=
''
;
});
...
...
@@ -519,13 +524,13 @@ const ChatBox = (
feConfigs
?.
show_emptyChat
&&
showEmptyIntro
&&
chatHistory
.
length
===
0
&&
!
v
ariableModules
?.
length
&&
!
filterV
ariableModules
?.
length
&&
!
welcomeText
,
[
chatHistory
.
length
,
feConfigs
?.
show_emptyChat
,
showEmptyIntro
,
v
ariableModules
?.
length
,
filterV
ariableModules
?.
length
,
welcomeText
]
);
...
...
@@ -604,10 +609,10 @@ const ChatBox = (
{
showEmpty
&&
<
Empty
/>
}
{
!!
welcomeText
&&
<
WelcomeText
appAvatar=
{
appAvatar
}
welcomeText=
{
welcomeText
}
/>
}
{
/* variable input */
}
{
!!
v
ariableModules
?.
length
&&
(
{
!!
filterV
ariableModules
?.
length
&&
(
<
VariableInput
appAvatar=
{
appAvatar
}
variableModules=
{
v
ariableModules
}
variableModules=
{
filterV
ariableModules
}
variableIsFinish=
{
variableIsFinish
}
chatForm=
{
chatForm
}
onSubmitVariables=
{
onSubmitVariables
}
...
...
projects/app/src/components/MyModal/index.tsx
View file @
af581bc9
import
React
from
'react'
;
import
{
ModalContentProps
}
from
'@chakra-ui/react'
;
import
{
useSystemStore
}
from
'@/web/common/system/useSystemStore'
;
import
CustomModal
from
'@fastgpt/web/components/common/
My
Modal'
;
import
CustomModal
from
'@fastgpt/web/components/common/
Custom
Modal'
;
export
interface
MyModalProps
extends
ModalContentProps
{
iconSrc
?:
string
;
...
...
projects/app/src/components/core/module/Flow/FlowProvider.tsx
View file @
af581bc9
...
...
@@ -178,7 +178,7 @@ export const FlowProvider = ({
const
source
=
nodes
.
find
((
node
)
=>
node
.
id
===
connect
.
source
)?.
data
;
const
sourceType
=
(()
=>
{
if
(
source
?.
flowType
===
FlowNodeTypeEnum
.
classifyQuestion
)
{
return
ModuleIOValueTypeEnum
.
string
;
return
ModuleIOValueTypeEnum
.
boolean
;
}
if
(
source
?.
flowType
===
FlowNodeTypeEnum
.
pluginInput
)
{
return
source
?.
inputs
.
find
((
input
)
=>
input
.
key
===
connect
.
sourceHandle
)?.
valueType
;
...
...
@@ -189,7 +189,7 @@ export const FlowProvider = ({
const
targetType
=
nodes
.
find
((
node
)
=>
node
.
id
===
connect
.
target
)
?.
data
?.
inputs
.
find
((
input
)
=>
input
.
key
===
connect
.
targetHandle
)?.
valueType
;
console
.
log
(
source
,
targetType
);
if
(
!
sourceType
||
!
targetType
)
{
return
toast
({
status
:
'warning'
,
...
...
projects/app/src/components/core/module/Flow/components/modules/VariableEdit.tsx
View file @
af581bc9
...
...
@@ -25,7 +25,7 @@ import {
useDisclosure
}
from
'@chakra-ui/react'
;
import
{
QuestionOutlineIcon
,
SmallAddIcon
}
from
'@chakra-ui/icons'
;
import
{
VariableInputEnum
}
from
'@fastgpt/global/core/module/constants'
;
import
{
VariableInputEnum
,
variableMap
}
from
'@fastgpt/global/core/module/constants'
;
import
type
{
VariableItemType
}
from
'@fastgpt/global/core/module/type.d'
;
import
MyIcon
from
'@fastgpt/web/components/common/Icon'
;
import
{
useForm
}
from
'react-hook-form'
;
...
...
@@ -52,23 +52,12 @@ const VariableEdit = ({
const
[
refresh
,
setRefresh
]
=
useState
(
false
);
const
VariableTypeList
=
useMemo
(
()
=>
[
{
title
:
t
(
'core.module.variable.input type'
),
icon
:
'core/app/variable/input'
,
value
:
VariableInputEnum
.
input
},
{
title
:
t
(
'core.module.variable.textarea type'
),
icon
:
'core/app/variable/textarea'
,
value
:
VariableInputEnum
.
textarea
},
{
title
:
t
(
'core.module.variable.select type'
),
icon
:
'core/app/variable/select'
,
value
:
VariableInputEnum
.
select
}
],
()
=>
Object
.
entries
(
variableMap
).
map
(([
key
,
value
])
=>
({
title
:
t
(
value
.
title
),
icon
:
value
.
icon
,
value
:
key
})),
[
t
]
);
...
...
@@ -79,9 +68,12 @@ const VariableEdit = ({
getValues
:
getValuesEdit
,
setValue
:
setValuesEdit
,
control
:
editVariableController
,
handleSubmit
:
handleSubmitEdit
handleSubmit
:
handleSubmitEdit
,
watch
}
=
useForm
<
{
variable
:
VariableItemType
}
>
();
const
variableType
=
watch
(
'variable.type'
);
const
{
fields
:
selectEnums
,
append
:
appendEnums
,
...
...
@@ -140,11 +132,11 @@ const VariableEdit = ({
<
Table
bg=
{
'white'
}
>
<
Thead
>
<
Tr
>
<
Th
w=
{
'18px !important'
}
p=
{
0
}
/>
<
Th
>
{
t
(
'core.module.variable.variable name'
)
}
</
Th
>
<
Th
>
{
t
(
'core.module.variable.key'
)
}
</
Th
>
<
Th
>
{
t
(
'common.Require Input'
)
}
</
Th
>
<
Th
></
Th
>
<
Th
w=
{
'18px !important'
}
p=
{
0
}
bg=
{
'myGray.50'
}
/>
<
Th
bg=
{
'myGray.50'
}
>
{
t
(
'core.module.variable.variable name'
)
}
</
Th
>
<
Th
bg=
{
'myGray.50'
}
>
{
t
(
'core.module.variable.key'
)
}
</
Th
>
<
Th
bg=
{
'myGray.50'
}
>
{
t
(
'common.Require Input'
)
}
</
Th
>
<
Th
bg=
{
'myGray.50'
}
></
Th
>
</
Tr
>
</
Thead
>
<
Tbody
>
...
...
@@ -188,12 +180,15 @@ const VariableEdit = ({
title=
{
t
(
'core.module.Variable Setting'
)
}
isOpen=
{
isOpenEdit
}
onClose=
{
onCloseEdit
}
maxW=
{
[
'90vw'
,
'500px'
]
}
>
<
ModalBody
>
<
Flex
alignItems=
{
'center'
}
>
<
Box
w=
{
'70px'
}
>
{
t
(
'common.Require Input'
)
}
</
Box
>
<
Switch
{
...
registerEdit
('
variable
.
required
')}
/>
</
Flex
>
{
variableType
!==
VariableInputEnum
.
external
&&
(
<
Flex
alignItems=
{
'center'
}
>
<
Box
w=
{
'70px'
}
>
{
t
(
'common.Require Input'
)
}
</
Box
>
<
Switch
{
...
registerEdit
('
variable
.
required
')}
/>
</
Flex
>
)
}
<
Flex
mt=
{
5
}
alignItems=
{
'center'
}
>
<
Box
w=
{
'80px'
}
>
{
t
(
'core.module.variable.variable name'
)
}
</
Box
>
<
Input
...
...
@@ -216,8 +211,8 @@ const VariableEdit = ({
</
Box
>
<
MyRadio
gridGap=
{
4
}
gridTemplateColumns=
{
'repeat(
3
,1fr)'
}
value=
{
getValuesEdit
(
'variable.type'
)
}
gridTemplateColumns=
{
'repeat(
2
,1fr)'
}
value=
{
variableType
}
list=
{
VariableTypeList
}
color=
{
'myGray.600'
}
hiddenCircle
...
...
@@ -227,7 +222,14 @@ const VariableEdit = ({
}
}
/>
{
getValuesEdit
(
'variable.type'
)
===
VariableInputEnum
.
input
&&
(
{
/* desc */
}
{
variableMap
[
variableType
]?.
desc
&&
(
<
Box
mt=
{
2
}
fontSize=
{
'sm'
}
color=
{
'myGray.500'
}
whiteSpace=
{
'pre-wrap'
}
>
{
t
(
variableMap
[
variableType
].
desc
)
}
</
Box
>
)
}
{
variableType
===
VariableInputEnum
.
input
&&
(
<>
<
Box
mt=
{
5
}
mb=
{
2
}
>
{
t
(
'core.module.variable.text max length'
)
}
...
...
@@ -251,7 +253,7 @@ const VariableEdit = ({
</>
)
}
{
getValuesEdit
(
'variable.type'
)
===
VariableInputEnum
.
select
&&
(
{
variableType
===
VariableInputEnum
.
select
&&
(
<>
<
Box
mt=
{
5
}
mb=
{
2
}
>
{
t
(
'core.module.variable.variable options'
)
}
...
...
projects/app/src/components/core/module/Flow/components/nodes/NodeExtract/ExtractFieldModal.tsx
View file @
af581bc9
...
...
@@ -16,10 +16,11 @@ import { useTranslation } from 'next-i18next';
import
MyTooltip
from
'@/components/MyTooltip'
;
import
{
QuestionOutlineIcon
}
from
'@chakra-ui/icons'
;
export
const
defaultField
=
{
export
const
defaultField
:
ContextExtractAgentItemType
=
{
required
:
false
,
defaultValue
:
''
,
desc
:
''
,
key
:
''
,
required
:
true
,
enum
:
''
};
...
...
@@ -33,9 +34,10 @@ const ExtractFieldModal = ({
onSubmit
:
(
data
:
ContextExtractAgentItemType
)
=>
void
;
})
=>
{
const
{
t
}
=
useTranslation
();
const
{
register
,
handleSubmit
}
=
useForm
<
ContextExtractAgentItemType
>
({
const
{
register
,
handleSubmit
,
watch
}
=
useForm
<
ContextExtractAgentItemType
>
({
defaultValues
:
defaultField
});
const
required
=
watch
(
'required'
);
return
(
<
MyModal
...
...
@@ -43,19 +45,41 @@ const ExtractFieldModal = ({
iconSrc=
"/imgs/module/extract.png"
title=
{
t
(
'core.module.extract.Field Setting Title'
)
}
onClose=
{
onClose
}
w=
{
[
'90vw'
,
'500px'
]
}
>
<
ModalBody
>
<
Flex
alignItems=
{
'center'
}
>
<
Box
flex=
{
'0 0 70px'
}
>
{
t
(
'common.Require Input'
)
}
</
Box
>
<
Flex
mt=
{
2
}
alignItems=
{
'center'
}
>
<
Flex
alignItems=
{
'center'
}
flex=
{
[
'0 0 80px'
,
'0 0 100px'
]
}
>
{
t
(
'core.module.extract.Required'
)
}
<
MyTooltip
label=
{
t
(
'core.module.extract.Required Description'
)
}
forceShow
>
<
QuestionOutlineIcon
ml=
{
1
}
/>
</
MyTooltip
>
</
Flex
>
<
Switch
{
...
register
('
required
')}
/>
</
Flex
>
{
required
&&
(
<
Flex
mt=
{
5
}
alignItems=
{
'center'
}
>
<
Box
flex=
{
[
'0 0 80px'
,
'0 0 100px'
]
}
>
{
t
(
'core.module.Default value'
)
}
</
Box
>
<
Input
bg=
{
'myGray.50'
}
placeholder=
{
t
(
'core.module.Default value placeholder'
)
}
{
...
register
('
defaultValue
')}
/>
</
Flex
>
)
}
<
Flex
mt=
{
5
}
alignItems=
{
'center'
}
>
<
Box
flex=
{
'0 0 70px'
}
>
{
t
(
'core.module.Field key'
)
}
</
Box
>
<
Input
placeholder=
"name/age/sql"
{
...
register
('
key
',
{
required
:
true
})}
/>
<
Box
flex=
{
[
'0 0 80px'
,
'0 0 100px'
]
}
>
{
t
(
'core.module.Field key'
)
}
</
Box
>
<
Input
bg=
{
'myGray.50'
}
placeholder=
"name/age/sql"
{
...
register
('
key
',
{
required
:
true
})}
/>
</
Flex
>
<
Flex
mt=
{
5
}
alignItems=
{
'center'
}
>
<
Box
flex=
{
'0 0 70px'
}
>
{
t
(
'core.module.Field Description'
)
}
</
Box
>
<
Box
flex=
{
[
'0 0 80px'
,
'0 0 100px'
]
}
>
{
t
(
'core.module.Field Description'
)
}
</
Box
>
<
Input
bg=
{
'myGray.50'
}
placeholder=
{
t
(
'core.module.extract.Field Description Placeholder'
)
}
{
...
register
('
desc
',
{
required
:
true
})}
/>
...
...
@@ -68,14 +92,16 @@ const ExtractFieldModal = ({
</
MyTooltip
>
</
Flex
>
<
Textarea
rows=
{
5
}
placeholder=
{
'apple\npeach\nwatermelon'
}
{
...
register
('
enum
')}
/>
<
Textarea
rows=
{
5
}
bg=
{
'myGray.50'
}
placeholder=
{
'apple\npeach\nwatermelon'
}
{
...
register
('
enum
')}
/>
</
Box
>
</
ModalBody
>
<
ModalFooter
>
<
Button
variant=
{
'whiteBase'
}
mr=
{
3
}
onClick=
{
onClose
}
>
{
t
(
'common.Close'
)
}
</
Button
>
<
Button
onClick=
{
handleSubmit
(
onSubmit
)
}
>
{
t
(
'common.Confirm'
)
}
</
Button
>
</
ModalFooter
>
</
MyModal
>
...
...
projects/app/src/components/core/module/Flow/components/nodes/NodeExtract/index.tsx
View file @
af581bc9
import
React
,
{
useState
}
from
'react'
;
import
{
Box
,
Button
,
Table
,
Thead
,
Tbody
,
Tr
,
Th
,
Td
,
TableContainer
}
from
'@chakra-ui/react'
;
import
{
Box
,
Button
,
Table
,
Thead
,
Tbody
,
Tr
,
Th
,
Td
,
TableContainer
,
Flex
}
from
'@chakra-ui/react'
;
import
{
NodeProps
}
from
'reactflow'
;
import
{
FlowModuleItemType
}
from
'@fastgpt/global/core/module/type.d'
;
import
{
useTranslation
}
from
'next-i18next'
;
...
...
@@ -36,75 +47,87 @@ const NodeExtract = ({ data }: NodeProps<FlowModuleItemType>) => {
}:
{
value
?:
ContextExtractAgentItemType
[];
})
=>
(
<
Box
pt=
{
2
}
>
<
Box
position=
{
'absolute'
}
top=
{
0
}
right=
{
0
}
>
<
Box
>
<
Flex
alignItems=
{
'center'
}
>
<
Box
flex=
{
'1 0 0'
}
>
{
t
(
'core.module.extract.Target field'
)
}
</
Box
>
<
Button
size=
{
'sm'
}
variant=
{
'whitePrimary'
}
leftIcon=
{
<
AddIcon
fontSize=
{
'10px'
}
/>
}
onClick=
{
()
=>
setEditExtractField
(
defaultField
)
}
>
新增字段
{
t
(
'core.module.extract.Add field'
)
}
</
Button
>
</
Box
>
<
TableContainer
>
<
Table
>
<
Thead
>
<
Tr
>
<
Th
>
字段 key
</
Th
>
<
Th
>
字段描述
</
Th
>
<
Th
>
必须
</
Th
>
<
Th
></
Th
>
</
Tr
>
</
Thead
>
<
Tbody
>
{
extractKeys
.
map
((
item
,
index
)
=>
(
<
Tr
key=
{
index
}
position=
{
'relative'
}
whiteSpace=
{
'pre-wrap'
}
wordBreak=
{
'break-all'
}
>
<
Td
>
{
item
.
key
}
</
Td
>
<
Td
>
{
item
.
desc
}
</
Td
>
<
Td
>
{
item
.
required
?
'✔'
:
''
}
</
Td
>
<
Td
whiteSpace=
{
'nowrap'
}
>
<
MyIcon
mr=
{
3
}
name=
{
'common/settingLight'
}
w=
{
'16px'
}
cursor=
{
'pointer'
}
onClick=
{
()
=>
{
setEditExtractField
(
item
);
}
}
/>
<
MyIcon
name=
{
'delete'
}
w=
{
'16px'
}
cursor=
{
'pointer'
}
onClick=
{
()
=>
{
onChangeNode
({
moduleId
,
type
:
'updateInput'
,
key
:
ModuleInputKeyEnum
.
extractKeys
,
value
:
{
...
props
,
value
:
extractKeys
.
filter
((
extract
)
=>
item
.
key
!==
extract
.
key
)
}
});
onChangeNode
({
moduleId
,
type
:
'delOutput'
,
key
:
item
.
key
});
}
}
/>
</
Td
>
</
Flex
>
<
Box
mt=
{
2
}
borderRadius=
{
'md'
}
overflow=
{
'hidden'
}
borderWidth=
{
'1px'
}
borderBottom=
"none"
>
<
TableContainer
>
<
Table
bg=
{
'white'
}
>
<
Thead
>
<
Tr
>
<
Th
bg=
{
'myGray.50'
}
>
字段 key
</
Th
>
<
Th
bg=
{
'myGray.50'
}
>
字段描述
</
Th
>
<
Th
bg=
{
'myGray.50'
}
>
必须
</
Th
>
<
Th
bg=
{
'myGray.50'
}
></
Th
>
</
Tr
>
))
}
</
Tbody
>
</
Table
>
</
TableContainer
>
</
Thead
>
<
Tbody
>
{
extractKeys
.
map
((
item
,
index
)
=>
(
<
Tr
key=
{
index
}
position=
{
'relative'
}
whiteSpace=
{
'pre-wrap'
}
wordBreak=
{
'break-all'
}
>
<
Td
>
{
item
.
key
}
</
Td
>
<
Td
>
{
item
.
desc
}
</
Td
>
<
Td
>
{
item
.
required
?
'✔'
:
''
}
</
Td
>
<
Td
whiteSpace=
{
'nowrap'
}
>
<
MyIcon
mr=
{
3
}
name=
{
'common/settingLight'
}
w=
{
'16px'
}
cursor=
{
'pointer'
}
onClick=
{
()
=>
{
setEditExtractField
(
item
);
}
}
/>
<
MyIcon
name=
{
'delete'
}
w=
{
'16px'
}
cursor=
{
'pointer'
}
onClick=
{
()
=>
{
onChangeNode
({
moduleId
,
type
:
'updateInput'
,
key
:
ModuleInputKeyEnum
.
extractKeys
,
value
:
{
...
props
,
value
:
extractKeys
.
filter
(
(
extract
)
=>
item
.
key
!==
extract
.
key
)
}
});
onChangeNode
({
moduleId
,
type
:
'delOutput'
,
key
:
item
.
key
});
}
}
/>
</
Td
>
</
Tr
>
))
}
</
Tbody
>
</
Table
>
</
TableContainer
>
</
Box
>
</
Box
>
)
}
}
...
...
@@ -142,7 +165,6 @@ const NodeExtract = ({ data }: NodeProps<FlowModuleItemType>) => {
const
newOutput
=
{
key
:
data
.
key
,
label
:
`提取结果-${data.desc}`
,
description
:
'无法提取时不会返回'
,
valueType
:
ModuleIOValueTypeEnum
.
string
,
type
:
FlowNodeOutputTypeEnum
.
source
,
targets
:
[]
...
...
projects/app/src/global/core/prompt/agent.ts
View file @
af581bc9
...
...
@@ -31,10 +31,9 @@ export const Prompt_ExtractJson = `你可以从 <对话记录></对话记录>
<字段说明>
1. 下面的 JSON 字符串均按照 JSON Schema 的规则描述。
2. key 代表字段名;description 代表字段的描述;required 代表字段是否必须;enum 是可选值,代表可选的 value。
3. 如果字段内容为空,你可以返回空字符串。
{{json}}
2. key 代表字段名;description 代表字段的描述;enum 是可选值,代表可选的 value。
3. 如果没有可提取的内容,忽略该字段。
4. 本次需提取的JSON Schema:{{json}}
</字段说明>
<对话记录>
...
...
projects/app/src/pages/_app.tsx
View file @
af581bc9
...
...
@@ -4,7 +4,7 @@ import Script from 'next/script';
import
Head
from
'next/head'
;
import
{
ChakraProvider
,
ColorModeScript
}
from
'@chakra-ui/react'
;
import
Layout
from
'@/components/Layout'
;
import
{
theme
}
from
'@/web/styles/theme'
;
import
{
theme
}
from
'@
fastgpt
/web/styles/theme'
;
import
{
QueryClient
,
QueryClientProvider
}
from
'@tanstack/react-query'
;
import
NProgress
from
'nprogress'
;
//nprogress module
import
Router
from
'next/router'
;
...
...
projects/app/src/pages/app/detail/components/SimpleEdit/EditForm.tsx
View file @
af581bc9
...
...
@@ -31,7 +31,6 @@ import Avatar from '@/components/Avatar';
import
MyIcon
from
'@fastgpt/web/components/common/Icon'
;
import
VariableEdit
from
'@/components/core/module/Flow/components/modules/VariableEdit'
;
import
MyTextarea
from
'@/components/common/Textarea/MyTextarea/index'
;
import
{
DatasetSearchModeMap
}
from
'@fastgpt/global/core/dataset/constants'
;
import
SelectAiModel
from
'@/components/Select/SelectAiModel'
;
import
PromptEditor
from
'@fastgpt/web/components/common/Textarea/PromptEditor'
;
import
{
formatEditorVariablePickerIcon
}
from
'@fastgpt/global/core/module/utils'
;
...
...
projects/app/src/pages/chat/share.tsx
View file @
af581bc9
...
...
@@ -30,24 +30,29 @@ import { MongoOutLink } from '@fastgpt/service/support/outLink/schema';
import
{
OutLinkWithAppType
}
from
'@fastgpt/global/support/outLink/type'
;
const
OutLink
=
({
shareId
,
chatId
,
showHistory
,
authToken
,
appName
,
appIntro
,
appAvatar
}:
{
shareId
:
string
;
chatId
:
string
;
showHistory
:
'0'
|
'1'
;
authToken
?:
string
;
appName
?:
string
;
appIntro
?:
string
;
appAvatar
?:
string
;
})
=>
{
const
{
t
}
=
useTranslation
();
const
router
=
useRouter
();
const
{
shareId
=
''
,
chatId
=
''
,
showHistory
=
'1'
,
authToken
,
...
customVariables
}
=
router
.
query
as
{
shareId
:
string
;
chatId
:
string
;
showHistory
:
'0'
|
'1'
;
authToken
:
string
;
[
key
:
string
]:
string
;
};
const
{
toast
}
=
useToast
();
const
{
isOpen
:
isOpenSlider
,
onClose
:
onCloseSlider
,
onOpen
:
onOpenSlider
}
=
useDisclosure
();
const
{
isPc
}
=
useSystemStore
();
...
...
@@ -56,11 +61,7 @@ const OutLink = ({
const
initSign
=
useRef
(
false
);
const
[
isEmbed
,
setIdEmbed
]
=
useState
(
true
);
const
{
localUId
,
shareChatHistory
,
// abandon
clearLocalHistory
// abandon
}
=
useShareChatStore
();
const
{
localUId
}
=
useShareChatStore
();
const
{
histories
,
loadHistories
,
...
...
@@ -83,7 +84,10 @@ const OutLink = ({
const
{
responseText
,
responseData
}
=
await
streamFetch
({
data
:
{
messages
:
prompts
,
variables
,
variables
:
{
...
customVariables
,
...
variables
},
shareId
,
chatId
:
completionChatId
,
outLinkUid
...
...
@@ -159,6 +163,7 @@ const OutLink = ({
},
[
chatId
,
customVariables
,
shareId
,
outLinkUid
,
t
,
...
...
@@ -391,9 +396,6 @@ const OutLink = ({
export
async
function
getServerSideProps
(
context
:
any
)
{
const
shareId
=
context
?.
query
?.
shareId
||
''
;
const
chatId
=
context
?.
query
?.
chatId
||
''
;
const
showHistory
=
context
?.
query
?.
showHistory
||
'1'
;
const
authToken
=
context
?.
query
?.
authToken
||
''
;
const
app
=
await
(
async
()
=>
{
try
{
...
...
@@ -413,13 +415,9 @@ export async function getServerSideProps(context: any) {
return
{
props
:
{
shareId
,
chatId
,
showHistory
,
authToken
,
appName
:
app
?.
appId
?.
name
,
appAvatar
:
app
?.
appId
?.
avatar
,
appIntro
:
app
?.
appId
?.
intro
,
appName
:
app
?.
appId
?.
name
||
''
,
appAvatar
:
app
?.
appId
?.
avatar
||
''
,
appIntro
:
app
?.
appId
?.
intro
||
''
,
...(
await
serviceSideProps
(
context
))
}
};
...
...
projects/app/src/pages/login/components/RegisterForm.tsx
View file @
af581bc9
...
...
@@ -85,7 +85,7 @@ const RegisterForm = ({ setPageType, loginSuccess }: Props) => {
}
setRequesting
(
false
);
},
[
loginSuccess
,
toast
]
[
loginSuccess
,
t
,
t
oast
]
);
return
(
...
...
projects/app/src/pages/login/index.tsx
View file @
af581bc9
...
...
@@ -57,11 +57,10 @@ const Login = () => {
/* default login type */
useEffect
(()
=>
{
if
(
!
feConfigs
.
oauth
)
return
;
setPageType
(
feConfigs
.
oauth
?.
wechat
?
LoginPageTypeEnum
.
wechat
:
LoginPageTypeEnum
.
passwordLogin
feConfigs
?
.
oauth
?.
wechat
?
LoginPageTypeEnum
.
wechat
:
LoginPageTypeEnum
.
passwordLogin
);
},
[
feConfigs
.
oauth
,
feConfigs
.
oauth
?.
wechat
]);
},
[
feConfigs
.
oauth
]);
useEffect
(()
=>
{
clearToken
();
router
.
prefetch
(
'/app/list'
);
...
...
projects/app/src/service/moduleDispatch/agent/extract.ts
View file @
af581bc9
...
...
@@ -16,6 +16,7 @@ import { LLMModelItemType } from '@fastgpt/global/core/ai/model.d';
import
{
getHistories
}
from
'../utils'
;
import
{
ModelTypeEnum
,
getLLMModel
}
from
'@fastgpt/service/core/ai/model'
;
import
{
formatModelChars2Points
}
from
'@fastgpt/service/support/wallet/usage/utils'
;
import
json5
from
'json5'
;
type
Props
=
ModuleDispatchProps
<
{
[
ModuleInputKeyEnum
.
history
]?:
ChatItemType
[];
...
...
@@ -64,7 +65,8 @@ export async function dispatchContentExtract(props: Props): Promise<Response> {
// remove invalid key
for
(
let
key
in
arg
)
{
if
(
!
extractKeys
.
find
((
item
)
=>
item
.
key
===
key
))
{
const
item
=
extractKeys
.
find
((
item
)
=>
item
.
key
===
key
);
if
(
!
item
)
{
delete
arg
[
key
];
}
if
(
arg
[
key
]
===
''
)
{
...
...
@@ -72,12 +74,20 @@ export async function dispatchContentExtract(props: Props): Promise<Response> {
}
}
// auto fill required fields
extractKeys
.
forEach
((
item
)
=>
{
if
(
item
.
required
&&
!
arg
[
item
.
key
])
{
arg
[
item
.
key
]
=
item
.
defaultValue
||
''
;
}
});
// auth fields
let
success
=
!
extractKeys
.
find
((
item
)
=>
!
(
item
.
key
in
arg
));
// auth empty value
if
(
success
)
{
for
(
const
key
in
arg
)
{
if
(
arg
[
key
]
===
''
)
{
const
item
=
extractKeys
.
find
((
item
)
=>
item
.
key
===
key
);
if
(
!
item
)
{
success
=
false
;
break
;
}
...
...
@@ -125,14 +135,8 @@ async function toolChoice({
...
histories
,
{
obj
:
ChatRoleEnum
.
Human
,
value
:
`你的任务:
"""
${
description
||
'根据用户要求获取适当的 JSON 字符串。'
}
value
:
`你的任务是根据上下文获取适当的 JSON 字符串。要求:
"""
要求:
"""
- 如果字段为空,你返回空字符串。
- 字符串不要换行。
- 结合上下文和当前问题进行获取。
"""
...
...
@@ -167,8 +171,7 @@ ${description || '根据用户要求获取适当的 JSON 字符串。'}
description
,
parameters
:
{
type
:
'object'
,
properties
,
required
:
extractKeys
.
filter
((
item
)
=>
item
.
required
).
map
((
item
)
=>
item
.
key
)
properties
}
};
const
tools
:
any
=
[
...
...
@@ -193,7 +196,7 @@ ${description || '根据用户要求获取适当的 JSON 字符串。'}
const
arg
:
Record
<
string
,
any
>
=
(()
=>
{
try
{
return
JSON
.
parse
(
return
json5
.
parse
(
response
?.
choices
?.[
0
]?.
message
?.
tool_calls
?.[
0
]?.
function
?.
arguments
||
'{}'
);
}
catch
(
error
)
{
...
...
@@ -225,7 +228,7 @@ async function completions({
json
:
extractKeys
.
map
(
(
item
)
=>
`{"key":"
${
item
.
key
}
", "description":"
${
item
.
desc
}
"
, "required":
${
item
.
required
}
${
`{"key":"
${
item
.
key
}
", "description":"
${
item
.
desc
}
"
${
item
.
enum
?
`, "enum":"[
${
item
.
enum
.
split
(
'\n'
)}
]"`
:
''
}
}`
)
...
...
@@ -240,7 +243,6 @@ Human: ${content}`
userKey
:
user
.
openaiAccount
,
timeout
:
480000
});
const
data
=
await
ai
.
chat
.
completions
.
create
({
model
:
extractModel
.
model
,
temperature
:
0.01
,
...
...
@@ -260,19 +262,14 @@ Human: ${content}`
arg
:
{}
};
const
jsonStr
=
answer
.
substring
(
start
,
end
+
1
)
.
replace
(
/
(\\
n|
\\)
/g
,
''
)
.
replace
(
/ /g
,
''
);
try
{
return
{
rawResponse
:
answer
,
tokens
:
countMessagesTokens
(
messages
),
arg
:
JSON
.
parse
(
jsonStr
)
as
Record
<
string
,
any
>
arg
:
json5
.
parse
(
answer
)
as
Record
<
string
,
any
>
};
}
catch
(
error
)
{
console
.
log
(
error
);
return
{
rawResponse
:
answer
,
tokens
:
countMessagesTokens
(
messages
),
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment