Compare commits
45 Commits
v4.8.4
...
v4.8.7-alp
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
36f8755d09 | ||
|
|
fc96bb99cc | ||
|
|
1e4ffc2481 | ||
|
|
ee7496467b | ||
|
|
b5c98a4f63 | ||
|
|
090c880860 | ||
|
|
dd2a9bdee5 | ||
|
|
8d60ef505f | ||
|
|
b14514c105 | ||
|
|
11ffaaf2c5 | ||
|
|
e2ae571d15 | ||
|
|
f548e24e7d | ||
|
|
5605f1a892 | ||
|
|
88d10451c9 | ||
|
|
8a7bd689ae | ||
|
|
a9cdece341 | ||
|
|
babf03c218 | ||
|
|
9e169a48e3 | ||
|
|
e223390231 | ||
|
|
3257744c76 | ||
|
|
e1e112eaff | ||
|
|
5c37d29451 | ||
|
|
3a16f1a21c | ||
|
|
fa7b73f942 | ||
|
|
f8610d750d | ||
|
|
96a03e9927 | ||
|
|
a3b0ef066b | ||
|
|
9d084b633c | ||
|
|
4b4bea196a | ||
|
|
e247545afa | ||
|
|
93b44fc8f5 | ||
|
|
9aa6fd4904 | ||
|
|
c8bc9838e3 | ||
|
|
5c8c7fb9f2 | ||
|
|
d902d29c71 | ||
|
|
9d29b471bc | ||
|
|
4a33e04a08 | ||
|
|
a9ab9ebe8e | ||
|
|
24596a6e21 | ||
|
|
5cc01b8509 | ||
|
|
980b4d3db5 | ||
|
|
2b25e3cc2d | ||
|
|
565bfc8486 | ||
|
|
b17d14bb7d | ||
|
|
c11131d653 |
4
.github/ISSUE_TEMPLATE/config.yml
vendored
4
.github/ISSUE_TEMPLATE/config.yml
vendored
@@ -1,5 +1,5 @@
|
|||||||
blank_issues_enabled: false
|
blank_issues_enabled: false
|
||||||
contact_links:
|
contact_links:
|
||||||
- name: 微信交流群
|
- name: 飞书话题群
|
||||||
url: https://oss.laf.run/htr4n1-images/fastgpt-qr-code.jpg
|
url: https://oss.laf.run/otnvvf-imgs/1719505774252.jpg
|
||||||
about: FastGPT 全是问题群
|
about: FastGPT 全是问题群
|
||||||
|
|||||||
96
.github/workflows/build-sandbox-image.yml
vendored
96
.github/workflows/build-sandbox-image.yml
vendored
@@ -10,6 +10,7 @@ jobs:
|
|||||||
build-fastgpt-sandbox-images:
|
build-fastgpt-sandbox-images:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
steps:
|
steps:
|
||||||
|
# install env
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
@@ -30,22 +31,53 @@ jobs:
|
|||||||
key: ${{ runner.os }}-buildx-${{ github.sha }}
|
key: ${{ runner.os }}-buildx-${{ github.sha }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-buildx-
|
${{ runner.os }}-buildx-
|
||||||
|
|
||||||
|
# login docker
|
||||||
- name: Login to GitHub Container Registry
|
- name: Login to GitHub Container Registry
|
||||||
uses: docker/login-action@v2
|
uses: docker/login-action@v2
|
||||||
with:
|
with:
|
||||||
registry: ghcr.io
|
registry: ghcr.io
|
||||||
username: ${{ github.repository_owner }}
|
username: ${{ github.repository_owner }}
|
||||||
password: ${{ secrets.GH_PAT }}
|
password: ${{ secrets.GH_PAT }}
|
||||||
- name: Set DOCKER_REPO_TAGGED based on branch or tag
|
- name: Login to Ali Hub
|
||||||
|
uses: docker/login-action@v2
|
||||||
|
with:
|
||||||
|
registry: registry.cn-hangzhou.aliyuncs.com
|
||||||
|
username: ${{ secrets.ALI_HUB_USERNAME }}
|
||||||
|
password: ${{ secrets.ALI_HUB_PASSWORD }}
|
||||||
|
- name: Login to Docker Hub
|
||||||
|
uses: docker/login-action@v2
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKER_HUB_NAME }}
|
||||||
|
password: ${{ secrets.DOCKER_HUB_PASSWORD }}
|
||||||
|
|
||||||
|
# Set tag
|
||||||
|
- name: Set image name and tag
|
||||||
run: |
|
run: |
|
||||||
if [[ "${{ github.ref_name }}" == "main" ]]; then
|
if [[ "${{ github.ref_name }}" == "main" ]]; then
|
||||||
echo "DOCKER_REPO_TAGGED=ghcr.io/${{ github.repository_owner }}/fastgpt-sandbox:latest" >> $GITHUB_ENV
|
echo "Git_Tag=ghcr.io/${{ github.repository_owner }}/fastgpt-sandbox:latest" >> $GITHUB_ENV
|
||||||
|
echo "Git_Latest=ghcr.io/${{ github.repository_owner }}/fastgpt-sandbox:latest" >> $GITHUB_ENV
|
||||||
|
echo "Ali_Tag=${{ secrets.ALI_IMAGE_NAME }}/fastgpt-sandbox:latest" >> $GITHUB_ENV
|
||||||
|
echo "Ali_Latest=${{ secrets.ALI_IMAGE_NAME }}/fastgpt-sandbox:latest" >> $GITHUB_ENV
|
||||||
|
echo "Docker_Hub_Tag=${{ secrets.DOCKER_IMAGE_NAME }}/fastgpt-sandbox:latest" >> $GITHUB_ENV
|
||||||
|
echo "Docker_Hub_Latest=${{ secrets.DOCKER_IMAGE_NAME }}/fastgpt-sandbox:latest" >> $GITHUB_ENV
|
||||||
else
|
else
|
||||||
echo "DOCKER_REPO_TAGGED=ghcr.io/${{ github.repository_owner }}/fastgpt-sandbox:${{ github.ref_name }}" >> $GITHUB_ENV
|
echo "Git_Tag=ghcr.io/${{ github.repository_owner }}/fastgpt-sandbox:${{ github.ref_name }}" >> $GITHUB_ENV
|
||||||
|
echo "Git_Latest=ghcr.io/${{ github.repository_owner }}/fastgpt-sandbox:latest" >> $GITHUB_ENV
|
||||||
|
echo "Ali_Tag=${{ secrets.ALI_IMAGE_NAME }}/fastgpt-sandbox:${{ github.ref_name }}" >> $GITHUB_ENV
|
||||||
|
echo "Ali_Latest=${{ secrets.ALI_IMAGE_NAME }}/fastgpt-sandbox:latest" >> $GITHUB_ENV
|
||||||
|
echo "Docker_Hub_Tag=${{ secrets.DOCKER_IMAGE_NAME }}/fastgpt-sandbox:${{ github.ref_name }}" >> $GITHUB_ENV
|
||||||
|
echo "Docker_Hub_Latest=${{ secrets.DOCKER_IMAGE_NAME }}/fastgpt-sandbox:latest" >> $GITHUB_ENV
|
||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Build and publish image for main branch or tag push event
|
- name: Build and publish image for main branch or tag push event
|
||||||
env:
|
env:
|
||||||
DOCKER_REPO_TAGGED: ${{ env.DOCKER_REPO_TAGGED }}
|
Git_Tag: ${{ env.Git_Tag }}
|
||||||
|
Git_Latest: ${{ env.Git_Latest }}
|
||||||
|
Ali_Tag: ${{ env.Ali_Tag }}
|
||||||
|
Ali_Latest: ${{ env.Ali_Latest }}
|
||||||
|
Docker_Hub_Tag: ${{ env.Docker_Hub_Tag }}
|
||||||
|
Docker_Hub_Latest: ${{ env.Docker_Hub_Latest }}
|
||||||
run: |
|
run: |
|
||||||
docker buildx build \
|
docker buildx build \
|
||||||
-f projects/sandbox/Dockerfile \
|
-f projects/sandbox/Dockerfile \
|
||||||
@@ -55,54 +87,10 @@ jobs:
|
|||||||
--push \
|
--push \
|
||||||
--cache-from=type=local,src=/tmp/.buildx-cache \
|
--cache-from=type=local,src=/tmp/.buildx-cache \
|
||||||
--cache-to=type=local,dest=/tmp/.buildx-cache \
|
--cache-to=type=local,dest=/tmp/.buildx-cache \
|
||||||
-t ${DOCKER_REPO_TAGGED} \
|
-t ${Git_Tag} \
|
||||||
|
-t ${Git_Latest} \
|
||||||
|
-t ${Ali_Tag} \
|
||||||
|
-t ${Ali_Latest} \
|
||||||
|
-t ${Docker_Hub_Tag} \
|
||||||
|
-t ${Docker_Hub_Latest} \
|
||||||
.
|
.
|
||||||
push-to-ali-hub:
|
|
||||||
needs: build-fastgpt-sandbox-images
|
|
||||||
runs-on: ubuntu-20.04
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
- name: Login to Ali Hub
|
|
||||||
uses: docker/login-action@v2
|
|
||||||
with:
|
|
||||||
registry: registry.cn-hangzhou.aliyuncs.com
|
|
||||||
username: ${{ secrets.ALI_HUB_USERNAME }}
|
|
||||||
password: ${{ secrets.ALI_HUB_PASSWORD }}
|
|
||||||
- name: Set DOCKER_REPO_TAGGED based on branch or tag
|
|
||||||
run: |
|
|
||||||
if [[ "${{ github.ref_name }}" == "main" ]]; then
|
|
||||||
echo "IMAGE_TAG=latest" >> $GITHUB_ENV
|
|
||||||
else
|
|
||||||
echo "IMAGE_TAG=${{ github.ref_name }}" >> $GITHUB_ENV
|
|
||||||
fi
|
|
||||||
- name: Pull image from GitHub Container Registry
|
|
||||||
run: docker pull ghcr.io/${{ github.repository_owner }}/fastgpt-sandbox:${{env.IMAGE_TAG}}
|
|
||||||
- name: Tag image with Docker Hub repository name and version tag
|
|
||||||
run: docker tag ghcr.io/${{ github.repository_owner }}/fastgpt-sandbox:${{env.IMAGE_TAG}} ${{ secrets.ALI_IMAGE_NAME }}/fastgpt-sandbox:${{env.IMAGE_TAG}}
|
|
||||||
- name: Push image to Docker Hub
|
|
||||||
run: docker push ${{ secrets.ALI_IMAGE_NAME }}/fastgpt-sandbox:${{env.IMAGE_TAG}}
|
|
||||||
push-to-docker-hub:
|
|
||||||
needs: build-fastgpt-sandbox-images
|
|
||||||
runs-on: ubuntu-20.04
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
- name: Login to Docker Hub
|
|
||||||
uses: docker/login-action@v2
|
|
||||||
with:
|
|
||||||
username: ${{ secrets.DOCKER_HUB_NAME }}
|
|
||||||
password: ${{ secrets.DOCKER_HUB_PASSWORD }}
|
|
||||||
- name: Set DOCKER_REPO_TAGGED based on branch or tag
|
|
||||||
run: |
|
|
||||||
if [[ "${{ github.ref_name }}" == "main" ]]; then
|
|
||||||
echo "IMAGE_TAG=latest" >> $GITHUB_ENV
|
|
||||||
else
|
|
||||||
echo "IMAGE_TAG=${{ github.ref_name }}" >> $GITHUB_ENV
|
|
||||||
fi
|
|
||||||
- name: Pull image from GitHub Container Registry
|
|
||||||
run: docker pull ghcr.io/${{ github.repository_owner }}/fastgpt-sandbox:${{env.IMAGE_TAG}}
|
|
||||||
- name: Tag image with Docker Hub repository name and version tag
|
|
||||||
run: docker tag ghcr.io/${{ github.repository_owner }}/fastgpt-sandbox:${{env.IMAGE_TAG}} ${{ secrets.DOCKER_IMAGE_NAME }}/fastgpt-sandbox:${{env.IMAGE_TAG}}
|
|
||||||
- name: Push image to Docker Hub
|
|
||||||
run: docker push ${{ secrets.DOCKER_IMAGE_NAME }}/fastgpt-sandbox:${{env.IMAGE_TAG}}
|
|
||||||
|
|||||||
91
.github/workflows/fastgpt-image.yml
vendored
91
.github/workflows/fastgpt-image.yml
vendored
@@ -11,6 +11,7 @@ jobs:
|
|||||||
build-fastgpt-images:
|
build-fastgpt-images:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
steps:
|
steps:
|
||||||
|
# install env
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
@@ -31,19 +32,45 @@ jobs:
|
|||||||
key: ${{ runner.os }}-buildx-${{ github.sha }}
|
key: ${{ runner.os }}-buildx-${{ github.sha }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-buildx-
|
${{ runner.os }}-buildx-
|
||||||
|
|
||||||
|
# login docker
|
||||||
- name: Login to GitHub Container Registry
|
- name: Login to GitHub Container Registry
|
||||||
uses: docker/login-action@v2
|
uses: docker/login-action@v2
|
||||||
with:
|
with:
|
||||||
registry: ghcr.io
|
registry: ghcr.io
|
||||||
username: ${{ github.repository_owner }}
|
username: ${{ github.repository_owner }}
|
||||||
password: ${{ secrets.GH_PAT }}
|
password: ${{ secrets.GH_PAT }}
|
||||||
- name: Set DOCKER_REPO_TAGGED based on branch or tag
|
- name: Login to Ali Hub
|
||||||
|
uses: docker/login-action@v2
|
||||||
|
with:
|
||||||
|
registry: registry.cn-hangzhou.aliyuncs.com
|
||||||
|
username: ${{ secrets.ALI_HUB_USERNAME }}
|
||||||
|
password: ${{ secrets.ALI_HUB_PASSWORD }}
|
||||||
|
- name: Login to Docker Hub
|
||||||
|
uses: docker/login-action@v2
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKER_HUB_NAME }}
|
||||||
|
password: ${{ secrets.DOCKER_HUB_PASSWORD }}
|
||||||
|
|
||||||
|
# Set tag
|
||||||
|
- name: Set image name and tag
|
||||||
run: |
|
run: |
|
||||||
if [[ "${{ github.ref_name }}" == "main" ]]; then
|
if [[ "${{ github.ref_name }}" == "main" ]]; then
|
||||||
echo "DOCKER_REPO_TAGGED=ghcr.io/${{ github.repository_owner }}/fastgpt:latest" >> $GITHUB_ENV
|
echo "Git_Tag=ghcr.io/${{ github.repository_owner }}/fastgpt:latest" >> $GITHUB_ENV
|
||||||
|
echo "Git_Latest=ghcr.io/${{ github.repository_owner }}/fastgpt:latest" >> $GITHUB_ENV
|
||||||
|
echo "Ali_Tag=${{ secrets.ALI_IMAGE_NAME }}/fastgpt:latest" >> $GITHUB_ENV
|
||||||
|
echo "Ali_Latest=${{ secrets.ALI_IMAGE_NAME }}/fastgpt:latest" >> $GITHUB_ENV
|
||||||
|
echo "Docker_Hub_Tag=${{ secrets.DOCKER_IMAGE_NAME }}/fastgpt:latest" >> $GITHUB_ENV
|
||||||
|
echo "Docker_Hub_Latest=${{ secrets.DOCKER_IMAGE_NAME }}/fastgpt:latest" >> $GITHUB_ENV
|
||||||
else
|
else
|
||||||
echo "DOCKER_REPO_TAGGED=ghcr.io/${{ github.repository_owner }}/fastgpt:${{ github.ref_name }}" >> $GITHUB_ENV
|
echo "Git_Tag=ghcr.io/${{ github.repository_owner }}/fastgpt:${{ github.ref_name }}" >> $GITHUB_ENV
|
||||||
|
echo "Git_Latest=ghcr.io/${{ github.repository_owner }}/fastgpt:latest" >> $GITHUB_ENV
|
||||||
|
echo "Ali_Tag=${{ secrets.ALI_IMAGE_NAME }}/fastgpt:${{ github.ref_name }}" >> $GITHUB_ENV
|
||||||
|
echo "Ali_Latest=${{ secrets.ALI_IMAGE_NAME }}/fastgpt:latest" >> $GITHUB_ENV
|
||||||
|
echo "Docker_Hub_Tag=${{ secrets.DOCKER_IMAGE_NAME }}/fastgpt:${{ github.ref_name }}" >> $GITHUB_ENV
|
||||||
|
echo "Docker_Hub_Latest=${{ secrets.DOCKER_IMAGE_NAME }}/fastgpt:latest" >> $GITHUB_ENV
|
||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Build and publish image for main branch or tag push event
|
- name: Build and publish image for main branch or tag push event
|
||||||
env:
|
env:
|
||||||
DOCKER_REPO_TAGGED: ${{ env.DOCKER_REPO_TAGGED }}
|
DOCKER_REPO_TAGGED: ${{ env.DOCKER_REPO_TAGGED }}
|
||||||
@@ -56,56 +83,10 @@ jobs:
|
|||||||
--push \
|
--push \
|
||||||
--cache-from=type=local,src=/tmp/.buildx-cache \
|
--cache-from=type=local,src=/tmp/.buildx-cache \
|
||||||
--cache-to=type=local,dest=/tmp/.buildx-cache \
|
--cache-to=type=local,dest=/tmp/.buildx-cache \
|
||||||
-t ${DOCKER_REPO_TAGGED} \
|
-t ${Git_Tag} \
|
||||||
|
-t ${Git_Latest} \
|
||||||
|
-t ${Ali_Tag} \
|
||||||
|
-t ${Ali_Latest} \
|
||||||
|
-t ${Docker_Hub_Tag} \
|
||||||
|
-t ${Docker_Hub_Latest} \
|
||||||
.
|
.
|
||||||
push-to-docker-hub:
|
|
||||||
needs: build-fastgpt-images
|
|
||||||
runs-on: ubuntu-20.04
|
|
||||||
if: github.repository == 'labring/FastGPT'
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
- name: Login to Docker Hub
|
|
||||||
uses: docker/login-action@v2
|
|
||||||
with:
|
|
||||||
username: ${{ secrets.DOCKER_HUB_NAME }}
|
|
||||||
password: ${{ secrets.DOCKER_HUB_PASSWORD }}
|
|
||||||
- name: Set DOCKER_REPO_TAGGED based on branch or tag
|
|
||||||
run: |
|
|
||||||
if [[ "${{ github.ref_name }}" == "main" ]]; then
|
|
||||||
echo "IMAGE_TAG=latest" >> $GITHUB_ENV
|
|
||||||
else
|
|
||||||
echo "IMAGE_TAG=${{ github.ref_name }}" >> $GITHUB_ENV
|
|
||||||
fi
|
|
||||||
- name: Pull image from GitHub Container Registry
|
|
||||||
run: docker pull ghcr.io/${{ github.repository_owner }}/fastgpt:${{env.IMAGE_TAG}}
|
|
||||||
- name: Tag image with Docker Hub repository name and version tag
|
|
||||||
run: docker tag ghcr.io/${{ github.repository_owner }}/fastgpt:${{env.IMAGE_TAG}} ${{ secrets.DOCKER_IMAGE_NAME }}/fastgpt:${{env.IMAGE_TAG}}
|
|
||||||
- name: Push image to Docker Hub
|
|
||||||
run: docker push ${{ secrets.DOCKER_IMAGE_NAME }}/fastgpt:${{env.IMAGE_TAG}}
|
|
||||||
push-to-ali-hub:
|
|
||||||
needs: build-fastgpt-images
|
|
||||||
if: github.repository == 'labring/FastGPT'
|
|
||||||
runs-on: ubuntu-20.04
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
- name: Login to Ali Hub
|
|
||||||
uses: docker/login-action@v2
|
|
||||||
with:
|
|
||||||
registry: registry.cn-hangzhou.aliyuncs.com
|
|
||||||
username: ${{ secrets.ALI_HUB_USERNAME }}
|
|
||||||
password: ${{ secrets.ALI_HUB_PASSWORD }}
|
|
||||||
- name: Set DOCKER_REPO_TAGGED based on branch or tag
|
|
||||||
run: |
|
|
||||||
if [[ "${{ github.ref_name }}" == "main" ]]; then
|
|
||||||
echo "IMAGE_TAG=latest" >> $GITHUB_ENV
|
|
||||||
else
|
|
||||||
echo "IMAGE_TAG=${{ github.ref_name }}" >> $GITHUB_ENV
|
|
||||||
fi
|
|
||||||
- name: Pull image from GitHub Container Registry
|
|
||||||
run: docker pull ghcr.io/${{ github.repository_owner }}/fastgpt:${{env.IMAGE_TAG}}
|
|
||||||
- name: Tag image with Docker Hub repository name and version tag
|
|
||||||
run: docker tag ghcr.io/${{ github.repository_owner }}/fastgpt:${{env.IMAGE_TAG}} ${{ secrets.ALI_IMAGE_NAME }}/fastgpt:${{env.IMAGE_TAG}}
|
|
||||||
- name: Push image to Docker Hub
|
|
||||||
run: docker push ${{ secrets.ALI_IMAGE_NAME }}/fastgpt:${{env.IMAGE_TAG}}
|
|
||||||
|
|||||||
1
.npmrc
1
.npmrc
@@ -1,2 +1,3 @@
|
|||||||
public-hoist-pattern[]=*tiktoken*
|
public-hoist-pattern[]=*tiktoken*
|
||||||
public-hoist-pattern[]=*@zilliz/milvus2-sdk-node*
|
public-hoist-pattern[]=*@zilliz/milvus2-sdk-node*
|
||||||
|
registry=https://registry.npmjs.org/
|
||||||
5
.vscode/extensions.json
vendored
5
.vscode/extensions.json
vendored
@@ -1,5 +0,0 @@
|
|||||||
{
|
|
||||||
"recommendations": [
|
|
||||||
"inlang.vs-code-extension"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
46
.vscode/i18n-ally-custom-framework.yml
vendored
46
.vscode/i18n-ally-custom-framework.yml
vendored
@@ -1,46 +0,0 @@
|
|||||||
# .vscode/i18n-ally-custom-framework.yml
|
|
||||||
|
|
||||||
# An array of strings which contain Language Ids defined by VS Code
|
|
||||||
# You can check available language ids here: https://code.visualstudio.com/docs/languages/identifiers
|
|
||||||
languageIds:
|
|
||||||
- javascript
|
|
||||||
- typescript
|
|
||||||
- javascriptreact
|
|
||||||
- typescriptreact
|
|
||||||
|
|
||||||
# An array of RegExes to find the key usage. **The key should be captured in the first match group**.
|
|
||||||
# You should unescape RegEx strings in order to fit in the YAML file
|
|
||||||
# To help with this, you can use https://www.freeformatter.com/json-escape.html
|
|
||||||
usageMatchRegex:
|
|
||||||
# The following example shows how to detect `t("your.i18n.keys")`
|
|
||||||
# the `{key}` will be placed by a proper keypath matching regex,
|
|
||||||
# you can ignore it and use your own matching rules as well
|
|
||||||
- "[^\\w\\d]t\\(['\"`]({key})['\"`]"
|
|
||||||
- "[^\\w\\d]commonT\\(['\"`]({key})['\"`]"
|
|
||||||
# 支持 appT("your.i18n.keys")
|
|
||||||
- "[^\\w\\d]appT\\(['\"`]({key})['\"`]"
|
|
||||||
# 支持 datasetT("your.i18n.keys")
|
|
||||||
- "[^\\w\\d]datasetT\\(['\"`]({key})['\"`]"
|
|
||||||
- "[^\\w\\d]fileT\\(['\"`]({key})['\"`]"
|
|
||||||
- "[^\\w\\d]publishT\\(['\"`]({key})['\"`]"
|
|
||||||
- "[^\\w\\d]workflowT\\(['\"`]({key})['\"`]"
|
|
||||||
- "[^\\w\\d]userT\\(['\"`]({key})['\"`]"
|
|
||||||
- "[^\\w\\d]chatT\\(['\"`]({key})['\"`]"
|
|
||||||
|
|
||||||
# A RegEx to set a custom scope range. This scope will be used as a prefix when detecting keys
|
|
||||||
# and works like how the i18next framework identifies the namespace scope from the
|
|
||||||
# useTranslation() hook.
|
|
||||||
# You should unescape RegEx strings in order to fit in the YAML file
|
|
||||||
# To help with this, you can use https://www.freeformatter.com/json-escape.html
|
|
||||||
scopeRangeRegex: "useTranslation\\(\\s*\\[?\\s*['\"`](.*?)['\"`]"
|
|
||||||
|
|
||||||
# An array of strings containing refactor templates.
|
|
||||||
# The "$1" will be replaced by the keypath specified.
|
|
||||||
# Optional: uncomment the following two lines to use
|
|
||||||
|
|
||||||
# refactorTemplates:
|
|
||||||
# - i18n.get("$1")
|
|
||||||
|
|
||||||
|
|
||||||
# If set to true, only enables this custom framework (will disable all built-in frameworks)
|
|
||||||
monopoly: true
|
|
||||||
14
.vscode/settings.json
vendored
14
.vscode/settings.json
vendored
@@ -1,16 +1,24 @@
|
|||||||
{
|
{
|
||||||
"editor.formatOnSave": true,
|
"editor.formatOnSave": true,
|
||||||
"editor.mouseWheelZoom": true,
|
"editor.mouseWheelZoom": true,
|
||||||
|
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
||||||
|
"prettier.prettierPath": "node_modules/prettier",
|
||||||
"typescript.tsdk": "node_modules/typescript/lib",
|
"typescript.tsdk": "node_modules/typescript/lib",
|
||||||
"prettier.prettierPath": "",
|
|
||||||
"i18n-ally.localesPaths": [
|
"i18n-ally.localesPaths": [
|
||||||
"projects/app/i18n",
|
"packages/web/i18n",
|
||||||
|
],
|
||||||
|
"i18n-ally.enabledParsers": [
|
||||||
|
"json",
|
||||||
|
"yaml",
|
||||||
|
"js",
|
||||||
|
"ts"
|
||||||
],
|
],
|
||||||
"i18n-ally.enabledParsers": ["json", "yaml", "js", "ts"],
|
|
||||||
"i18n-ally.keystyle": "nested",
|
"i18n-ally.keystyle": "nested",
|
||||||
"i18n-ally.sortKeys": true,
|
"i18n-ally.sortKeys": true,
|
||||||
"i18n-ally.keepFulfilled": false,
|
"i18n-ally.keepFulfilled": false,
|
||||||
"i18n-ally.sourceLanguage": "zh", // 根据此语言文件翻译其他语言文件的变量和内容
|
"i18n-ally.sourceLanguage": "zh", // 根据此语言文件翻译其他语言文件的变量和内容
|
||||||
"i18n-ally.displayLanguage": "zh", // 显示语言
|
"i18n-ally.displayLanguage": "zh", // 显示语言
|
||||||
|
"i18n-ally.namespace": true,
|
||||||
|
"i18n-ally.pathMatcher": "{locale}/{namespaces}.json",
|
||||||
"i18n-ally.extract.targetPickingStrategy": "most-similar-by-key"
|
"i18n-ally.extract.targetPickingStrategy": "most-similar-by-key"
|
||||||
}
|
}
|
||||||
2
LICENSE
2
LICENSE
@@ -5,7 +5,7 @@ The FastGPT is licensed under the Apache License 2.0, with the following additio
|
|||||||
1. FastGPT is permitted to be used for commercialization. You can use FastGPT as a "backend-as-a-service" for your other applications, or delivering it to enterprises as an application development platform. However, when the following conditions are met, you must contact the producer to obtain a commercial license:
|
1. FastGPT is permitted to be used for commercialization. You can use FastGPT as a "backend-as-a-service" for your other applications, or delivering it to enterprises as an application development platform. However, when the following conditions are met, you must contact the producer to obtain a commercial license:
|
||||||
|
|
||||||
a. Multi-tenant SaaS service: Unless explicitly authorized by FastGPT in writing, you may not use the FastGPT.AI source code to operate a multi-tenant SaaS service that is similar to the FastGPT.
|
a. Multi-tenant SaaS service: Unless explicitly authorized by FastGPT in writing, you may not use the FastGPT.AI source code to operate a multi-tenant SaaS service that is similar to the FastGPT.
|
||||||
b. LOGO and copyright information: In the process of using FastGPT, you may not remove or moFastGPT the LOGO or copyright information in the FastGPT console.
|
b. LOGO and copyright information: In the process of using FastGPT, you may not remove or modify the LOGO or copyright information in the FastGPT console.
|
||||||
|
|
||||||
Please contact yujinlong@sealos.io by email to inquire about licensing matters.
|
Please contact yujinlong@sealos.io by email to inquire about licensing matters.
|
||||||
|
|
||||||
|
|||||||
@@ -120,9 +120,9 @@ https://github.com/labring/FastGPT/assets/15308462/7d3a38df-eb0e-4388-9250-2409b
|
|||||||
|
|
||||||
## 🏘️ 社区交流群
|
## 🏘️ 社区交流群
|
||||||
|
|
||||||
wx 扫一下加入:
|
扫码加入飞书话题群 (新开,逐渐弃用微信群):
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
<a href="#readme">
|
<a href="#readme">
|
||||||
<img src="https://img.shields.io/badge/-返回顶部-7d09f1.svg" alt="#" align="right">
|
<img src="https://img.shields.io/badge/-返回顶部-7d09f1.svg" alt="#" align="right">
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 67 KiB After Width: | Height: | Size: 209 KiB |
@@ -19,13 +19,15 @@ FastGPT 商业版是基于 FastGPT 开源版的增强版本,增加了一些独
|
|||||||
| 应用管理与高级编排 | ✅ | ✅ | ✅ |
|
| 应用管理与高级编排 | ✅ | ✅ | ✅ |
|
||||||
| 文档知识库 | ✅ | ✅ | ✅ |
|
| 文档知识库 | ✅ | ✅ | ✅ |
|
||||||
| 外部使用 | ✅ | ✅ | ✅ |
|
| 外部使用 | ✅ | ✅ | ✅ |
|
||||||
|
| 最大应用数量 | 500 | 无限制 | 由付费套餐决定 |
|
||||||
|
| 最大知识库数量(单个知识库内容无限制) | 30 | 无限制 | 由付费套餐决定 |
|
||||||
| 自定义版权信息 | ❌ | ✅ | 设计中 |
|
| 自定义版权信息 | ❌ | ✅ | 设计中 |
|
||||||
| 多租户与支付 | ❌ | ✅ | ✅ |
|
| 多租户与支付 | ❌ | ✅ | ✅ |
|
||||||
| 团队空间 | ❌ | ✅ | ✅ |
|
| 团队空间 | ❌ | ✅ | ✅ |
|
||||||
| 应用发布安全配置 | ❌ | ✅ | ✅ |
|
| 应用发布安全配置 | ❌ | ✅ | ✅ |
|
||||||
| 内容审核 | ❌ | ✅ | ✅ |
|
| 内容审核 | ❌ | ✅ | ✅ |
|
||||||
| web站点同步 | ❌ | ✅ | ✅ |
|
| web站点同步 | ❌ | ✅ | ✅ |
|
||||||
| 管理后台 | ❌ | ✅ | ✅ |
|
| 管理后台 | ❌ | ✅ | 不需要 |
|
||||||
| 增强训练模式 | ❌ | ✅ | ✅ |
|
| 增强训练模式 | ❌ | ✅ | ✅ |
|
||||||
| 图片知识库 | ❌ | 设计中 | 设计中 |
|
| 图片知识库 | ❌ | 设计中 | 设计中 |
|
||||||
| 自动规划召回 | ❌ | 设计中 | 设计中 |
|
| 自动规划召回 | ❌ | 设计中 | 设计中 |
|
||||||
|
|||||||
@@ -148,6 +148,9 @@ llm模型全部合并
|
|||||||
- /imgs/model/openai.svg - OpenAI GPT
|
- /imgs/model/openai.svg - OpenAI GPT
|
||||||
- /imgs/model/qwen.svg - 通义千问
|
- /imgs/model/qwen.svg - 通义千问
|
||||||
- /imgs/model/yi.svg - 零一万物
|
- /imgs/model/yi.svg - 零一万物
|
||||||
|
- /imgs/model/gemini.svg - gemini
|
||||||
|
- /imgs/model/deepseek.svg - deepseek
|
||||||
|
- /imgs/model/minimax.svg - minimax
|
||||||
-
|
-
|
||||||
|
|
||||||
## 特殊模型
|
## 特殊模型
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ weight: 707
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|
||||||
{{% alert icon="🤖" context="success" %}}
|
{{% alert icon="🤖" context="success" %}}
|
||||||
|
|
||||||
- MongoDB:用于存储除了向量外的各类数据
|
- MongoDB:用于存储除了向量外的各类数据
|
||||||
@@ -105,20 +104,18 @@ brew install orbstack
|
|||||||
{{< /tab >}}
|
{{< /tab >}}
|
||||||
{{< /tabs >}}
|
{{< /tabs >}}
|
||||||
|
|
||||||
|
|
||||||
## 开始部署
|
## 开始部署
|
||||||
|
|
||||||
### 1. 下载 docker-compose.yml
|
### 1. 下载 docker-compose.yml
|
||||||
|
|
||||||
|
非 Linux 环境或无法访问外网环境,可手动创建一个目录,并下载配置文件和对应版本的`docker-compose.yml`,在这个文件夹中依据下载的配置文件运行docker,若作为本地开发使用推荐`docker-compose-pgvector`版本,并且自行拉取并运行`sandbox`和`fastgpt`,并在docker配置文件中注释掉`sandbox`和`fastgpt`的部分
|
||||||
非 Linux 环境或无法访问外网环境,可手动创建一个目录,并下载配置文件和对应版本的`docker-compose.yml`
|
|
||||||
|
|
||||||
- [config.json](https://github.com/labring/FastGPT/blob/main/projects/app/data/config.json)
|
- [config.json](https://github.com/labring/FastGPT/blob/main/projects/app/data/config.json)
|
||||||
- [docker-compose.yml](https://github.com/labring/FastGPT/blob/main/files/docker) (注意,不同向量库版本的文件不一样)
|
- [docker-compose.yml](https://github.com/labring/FastGPT/blob/main/files/docker) (注意,不同向量库版本的文件不一样)
|
||||||
|
|
||||||
{{% alert icon="🤖" context="success" %}}
|
{{% alert icon="🤖" context="success" %}}
|
||||||
|
|
||||||
所有 `docker-compose.yml` 配置文件中 `MongoDB` 为 5.x,需要用到AUX指令集,部分 CPU 不支持,需手动更改其镜像版本为 4.4.24**(需要自己在docker hub下载,阿里云镜像没做备份)
|
所有 `docker-compose.yml` 配置文件中 `MongoDB` 为 5.x,需要用到AVX指令集,部分 CPU 不支持,需手动更改其镜像版本为 4.4.24**(需要自己在docker hub下载,阿里云镜像没做备份)
|
||||||
|
|
||||||
{{% /alert %}}
|
{{% /alert %}}
|
||||||
|
|
||||||
@@ -271,7 +268,6 @@ rs.status()
|
|||||||
|
|
||||||
默认是写了OneAPi的连接地址和密钥,可以通过修改`docker-compose.yml`中,fastgpt容器的环境变量实现。
|
默认是写了OneAPi的连接地址和密钥,可以通过修改`docker-compose.yml`中,fastgpt容器的环境变量实现。
|
||||||
|
|
||||||
|
|
||||||
`OPENAI_BASE_URL`(API 接口的地址,需要加/v1)
|
`OPENAI_BASE_URL`(API 接口的地址,需要加/v1)
|
||||||
`CHAT_API_KEY`(API 接口的凭证)。
|
`CHAT_API_KEY`(API 接口的凭证)。
|
||||||
|
|
||||||
@@ -315,8 +311,7 @@ docker-compose up -d
|
|||||||
1. `docker exec -it fastgpt sh` 进入 FastGPT 容器。
|
1. `docker exec -it fastgpt sh` 进入 FastGPT 容器。
|
||||||
2. 直接输入`env`命令查看所有环境变量。
|
2. 直接输入`env`命令查看所有环境变量。
|
||||||
|
|
||||||
|
### 为什么无法连接`本地模型`镜像
|
||||||
### 为什么无法连接`本地模型`镜像。
|
|
||||||
|
|
||||||
`docker-compose.yml`中使用了桥接的模式建立了`fastgpt`网络,如想通过0.0.0.0或镜像名访问其它镜像,需将其它镜像也加入到网络中。
|
`docker-compose.yml`中使用了桥接的模式建立了`fastgpt`网络,如想通过0.0.0.0或镜像名访问其它镜像,需将其它镜像也加入到网络中。
|
||||||
|
|
||||||
@@ -363,3 +358,14 @@ mongo连接失败,查看mongo的运行状态**对应日志**。
|
|||||||
### 无法导出知识库、无法使用语音输入/播报
|
### 无法导出知识库、无法使用语音输入/播报
|
||||||
|
|
||||||
没配置 SSL 证书,无权使用部分功能。
|
没配置 SSL 证书,无权使用部分功能。
|
||||||
|
|
||||||
|
### 登录提示 Network Error
|
||||||
|
|
||||||
|
由于服务初始化错误,系统重启导致。
|
||||||
|
|
||||||
|
- 90%是由于配置文件写不对,导致 JSON 解析报错
|
||||||
|
- 剩下的基本是因为向量数据库连不上
|
||||||
|
|
||||||
|
### 如何修改密码
|
||||||
|
|
||||||
|
修改`docker-compose.yml`文件中`DEFAULT_ROOT_PSW`并重启即可,密码会自动更新。
|
||||||
|
|||||||
@@ -31,7 +31,9 @@ images: []
|
|||||||
### 页面崩溃
|
### 页面崩溃
|
||||||
|
|
||||||
1. 关闭翻译
|
1. 关闭翻译
|
||||||
2. 检查配置文件是否正常加载,如果没有正常加载会导致缺失系统信息,在某些操作下会导致空指针。(95%情况是配置文件不对,可以F12打开控制台,看具体的空指针情况)
|
2. 检查配置文件是否正常加载,如果没有正常加载会导致缺失系统信息,在某些操作下会导致空指针。
|
||||||
|
* 95%情况是配置文件不对。会提示 xxx undefined
|
||||||
|
* 提示`URI malformed`,请 Issue 反馈具体操作和页面,这是由于特殊字符串编码解析报错。
|
||||||
3. 某些api不兼容问题(较少)
|
3. 某些api不兼容问题(较少)
|
||||||
|
|
||||||
### 开启内容补全后,响应速度变慢
|
### 开启内容补全后,响应速度变慢
|
||||||
|
|||||||
@@ -7,8 +7,7 @@ toc: true
|
|||||||
weight: 705
|
weight: 705
|
||||||
---
|
---
|
||||||
|
|
||||||
本文档介绍了如何设置开发环境以构建和测试 [FastGPT](https://fastgpt.in)。
|
本文档介绍了如何设置开发环境以构建和测试 [FastGPT](https://fastgpt.in),。
|
||||||
|
|
||||||
|
|
||||||
## 前置依赖项
|
## 前置依赖项
|
||||||
|
|
||||||
@@ -16,13 +15,14 @@ weight: 705
|
|||||||
|
|
||||||
- [Git](http://git-scm.com/)
|
- [Git](http://git-scm.com/)
|
||||||
- [Docker](https://www.docker.com/)(构建镜像)
|
- [Docker](https://www.docker.com/)(构建镜像)
|
||||||
- [Node.js v18.17 / v20.x](http://nodejs.org)
|
- [Node.js v18.17 / v20.x](http://nodejs.org)(版本尽量一样,可以使用nvm管理node版本)
|
||||||
- [pnpm](https://pnpm.io/) 版本 8.6.0 (目前官方的开发环境)
|
- [pnpm](https://pnpm.io/) 版本 8.6.0 (目前官方的开发环境)
|
||||||
- make命令: 根据不同平台,百度安装 (官方是GNU Make 4.3)
|
- make命令: 根据不同平台,百度安装 (官方是GNU Make 4.3)
|
||||||
|
|
||||||
## 开始本地开发
|
## 开始本地开发
|
||||||
|
|
||||||
{{% alert context="success" %}}
|
{{% alert context="success" %}}
|
||||||
|
|
||||||
1. 用户默认的时区为 `Asia/Shanghai`,非 linux 环境时候,获取系统时间会异常,本地开发时候,可以将用户的时区调整成 UTC(+0)。
|
1. 用户默认的时区为 `Asia/Shanghai`,非 linux 环境时候,获取系统时间会异常,本地开发时候,可以将用户的时区调整成 UTC(+0)。
|
||||||
2. 建议先服务器装好**数据库**,再进行本地开发。
|
2. 建议先服务器装好**数据库**,再进行本地开发。
|
||||||
{{% /alert %}}
|
{{% /alert %}}
|
||||||
@@ -47,9 +47,10 @@ git clone git@github.com:<github_username>/FastGPT.git
|
|||||||
|
|
||||||
### 3. 安装数据库
|
### 3. 安装数据库
|
||||||
|
|
||||||
第一次开发,需要先部署数据库,建议本地开发可以随便找一台 2C2G 的轻量小数据库实践。数据库部署教程:[Docker 快速部署](/docs/development/docker/)。部署完了,可以本地访问其数据库。
|
第一次开发,需要先部署数据库,建议本地开发可以随便找一台 2C2G 的轻量小数据库实践,或者新建文件夹并配置相关文件用以运行docker。数据库部署教程:[Docker 快速部署](/docs/development/docker/)。部署完了,可以本地访问其数据库。
|
||||||
|
{{% alert context="warning" %}}
|
||||||
Mongo 数据库需要注意,需要注意在连接地址中增加 `directConnection=true` 参数,才能连接上副本集的数据库。
|
Mongo 数据库需要注意,需要注意在连接地址中增加 `directConnection=true` 参数,才能连接上副本集的数据库。
|
||||||
|
{{% /alert %}}
|
||||||
|
|
||||||
### 4. 初始配置
|
### 4. 初始配置
|
||||||
|
|
||||||
@@ -57,7 +58,7 @@ Mongo 数据库需要注意,需要注意在连接地址中增加 `directConnec
|
|||||||
|
|
||||||
**1. 环境变量**
|
**1. 环境变量**
|
||||||
|
|
||||||
复制`.env.template`文件,在同级目录下生成一个`.env.local` 文件,修改`.env.local` 里内容才是有效的变量。变量说明见 .env.template
|
复制`.env.template`文件,在同级目录下生成一个`.env.local` 文件,修改`.env.local` 里内容才是有效的变量。变量说明见 .env.template,主要需要修改`API_KEY`和数据库的地址与端口以及数据库账号的用户名和密码,具体配置需要和docker配置文件相同,其中用户名和密码如需修改需要修改docker配置文件、数据库和`.env.local`文件,不能只改一处。
|
||||||
|
|
||||||
**2. config 配置文件**
|
**2. config 配置文件**
|
||||||
|
|
||||||
@@ -73,7 +74,7 @@ Mongo 数据库需要注意,需要注意在连接地址中增加 `directConnec
|
|||||||
|
|
||||||
### 5. 运行
|
### 5. 运行
|
||||||
|
|
||||||
可参考项目根目录下的 `dev.md`
|
可参考项目根目录下的 `dev.md`,第一次编译运行可能会有点慢,需要点耐心哦
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 给自动化脚本代码执行权限(非 linux 系统, 可以手动执行里面的 postinstall.sh 文件内容)
|
# 给自动化脚本代码执行权限(非 linux 系统, 可以手动执行里面的 postinstall.sh 文件内容)
|
||||||
@@ -114,7 +115,6 @@ make build name=app image=registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.8
|
|||||||
|
|
||||||
如果遇到问题,比如合并冲突或不知道如何打开拉取请求,请查看 GitHub 的[拉取请求教程](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests),了解如何解决合并冲突和其他问题。一旦您的 PR 被合并,您将自豪地被列为[贡献者表](https://github.com/labring/FastGPT/graphs/contributors)中的一员。
|
如果遇到问题,比如合并冲突或不知道如何打开拉取请求,请查看 GitHub 的[拉取请求教程](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests),了解如何解决合并冲突和其他问题。一旦您的 PR 被合并,您将自豪地被列为[贡献者表](https://github.com/labring/FastGPT/graphs/contributors)中的一员。
|
||||||
|
|
||||||
|
|
||||||
## QA
|
## QA
|
||||||
|
|
||||||
### 本地数据库无法连接
|
### 本地数据库无法连接
|
||||||
@@ -130,6 +130,7 @@ make build name=app image=registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.8
|
|||||||
FastGPT 在`pnpm i`后会执行`postinstall`脚本,用于自动生成`ChakraUI`的`Type`。如果没有权限,可以先执行`chmod -R +x ./scripts/`,再执行`pnpm i`。
|
FastGPT 在`pnpm i`后会执行`postinstall`脚本,用于自动生成`ChakraUI`的`Type`。如果没有权限,可以先执行`chmod -R +x ./scripts/`,再执行`pnpm i`。
|
||||||
|
|
||||||
仍不可行的话,可以手动执行`./scripts/postinstall.sh`里的内容。
|
仍不可行的话,可以手动执行`./scripts/postinstall.sh`里的内容。
|
||||||
|
*如果是Windows下的话,可以使用git bash给`postinstall`脚本添加执行权限并执行sh脚本*
|
||||||
|
|
||||||
### TypeError: Cannot read properties of null (reading 'useMemo' )
|
### TypeError: Cannot read properties of null (reading 'useMemo' )
|
||||||
|
|
||||||
@@ -141,6 +142,9 @@ FastGPT 在`pnpm i`后会执行`postinstall`脚本,用于自动生成`ChakraUI
|
|||||||
4. `cd projects/app`
|
4. `cd projects/app`
|
||||||
5. `pnpm dev`
|
5. `pnpm dev`
|
||||||
|
|
||||||
|
### Error response from daemon: error while creating mount source path 'XXX': mkdir XXX: file exists
|
||||||
|
|
||||||
|
这个错误可能是之前停止容器时有文件残留导致的,首先需要确认相关镜像都全部关闭,然后手动删除相关文件或者重启docker即可
|
||||||
|
|
||||||
## 加入社区
|
## 加入社区
|
||||||
|
|
||||||
@@ -155,6 +159,7 @@ FastGPT 在`pnpm i`后会执行`postinstall`脚本,用于自动生成`ChakraUI
|
|||||||
FastGPT 使用了 nextjs 的 page route 作为框架。为了区分好前后端代码,在目录分配上会分成 global, service, web 3个自目录,分别对应着 `前后端共用`、`后端专用`、`前端专用`的代码。
|
FastGPT 使用了 nextjs 的 page route 作为框架。为了区分好前后端代码,在目录分配上会分成 global, service, web 3个自目录,分别对应着 `前后端共用`、`后端专用`、`前端专用`的代码。
|
||||||
|
|
||||||
### monorepo
|
### monorepo
|
||||||
|
|
||||||
FastGPT 采用 pnpm workspace 方式构建 monorepo 项目,主要分为两个部分:
|
FastGPT 采用 pnpm workspace 方式构建 monorepo 项目,主要分为两个部分:
|
||||||
|
|
||||||
- projects/app - FastGPT 主项目
|
- projects/app - FastGPT 主项目
|
||||||
@@ -173,6 +178,7 @@ support - 支撑功能(用户体系,计费,鉴权等)
|
|||||||
common - 基础功能(日志管理,文件读写等)
|
common - 基础功能(日志管理,文件读写等)
|
||||||
|
|
||||||
{{% details title="代码结构说明" closed="true" %}}
|
{{% details title="代码结构说明" closed="true" %}}
|
||||||
|
|
||||||
```
|
```
|
||||||
.
|
.
|
||||||
├── .github // github 相关配置
|
├── .github // github 相关配置
|
||||||
@@ -200,4 +206,5 @@ common - 基础功能(日志管理,文件读写等)
|
|||||||
├── README_ja.md
|
├── README_ja.md
|
||||||
├── dev.md
|
├── dev.md
|
||||||
```
|
```
|
||||||
|
|
||||||
{{% /details %}}
|
{{% /details %}}
|
||||||
|
|||||||
@@ -7,18 +7,22 @@ toc: true
|
|||||||
weight: 852
|
weight: 852
|
||||||
---
|
---
|
||||||
|
|
||||||
## 发起对话
|
|
||||||
|
|
||||||
{{% alert icon="🤖 " context="success" %}}
|
{{% alert icon="🤖 " context="success" %}}
|
||||||
该接口的 API Key 需使用`应用特定的 key`,否则会报错。
|
该接口的 API Key 需使用`应用特定的 key`,否则会报错。
|
||||||
|
|
||||||
有些包调用时,`BaseUrl`需要添加`v1`路径,有些不需要,如果出现404情况,可补充`v1`重试。
|
有些包调用时,`BaseUrl`需要添加`v1`路径,有些不需要,如果出现404情况,可补充`v1`重试。
|
||||||
{{% /alert %}}
|
{{% /alert %}}
|
||||||
|
|
||||||
|
## 发起对话(简易应用和工作流)
|
||||||
|
|
||||||
**对话接口兼容`GPT`的接口!如果你的项目使用的是标准的`GPT`官方接口,可以直接通过修改`BaseUrl`和 `Authorization`来访问 FastGpt 应用。**
|
对话接口兼容`GPT`的接口!如果你的项目使用的是标准的`GPT`官方接口,可以直接通过修改`BaseUrl`和 `Authorization`来访问 FastGpt 应用,不过需要注意下面几个规则:
|
||||||
|
|
||||||
## 请求
|
{{% alert icon="🤖 " context="success" %}}
|
||||||
|
* 传入的`model`,`temperature`等参数字段均无效,这些字段由编排决定。
|
||||||
|
* 不会返回实际消耗`Token`值,如果需要,可以设置`detail=true`,并手动计算 `responseData` 里的`tokens`值。
|
||||||
|
{{% /alert %}}
|
||||||
|
|
||||||
|
### 请求
|
||||||
|
|
||||||
{{< tabs tabTotal="2" >}}
|
{{< tabs tabTotal="2" >}}
|
||||||
{{< tab tabName="请求示例" >}}
|
{{< tab tabName="请求示例" >}}
|
||||||
@@ -67,7 +71,7 @@ curl --location --request POST 'https://api.fastgpt.in/api/v1/chat/completions'
|
|||||||
{{< /tab >}}
|
{{< /tab >}}
|
||||||
{{< /tabs >}}
|
{{< /tabs >}}
|
||||||
|
|
||||||
## 响应
|
### 响应
|
||||||
|
|
||||||
{{< tabs tabTotal="5" >}}
|
{{< tabs tabTotal="5" >}}
|
||||||
{{< tab tabName="detail=false,stream=false 响应" >}}
|
{{< tab tabName="detail=false,stream=false 响应" >}}
|
||||||
@@ -245,7 +249,7 @@ data: [{"moduleName":"知识库搜索","moduleType":"datasetSearchNode","running
|
|||||||
{{< /markdownify >}}
|
{{< /markdownify >}}
|
||||||
{{< /tab >}}
|
{{< /tab >}}
|
||||||
|
|
||||||
{{< tab tabName="detail=true,stream=true 时,event值" >}}
|
{{< tab tabName="event值" >}}
|
||||||
{{< markdownify >}}
|
{{< markdownify >}}
|
||||||
|
|
||||||
event取值:
|
event取值:
|
||||||
@@ -265,6 +269,192 @@ event取值:
|
|||||||
{{< /tabs >}}
|
{{< /tabs >}}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 请求插件
|
||||||
|
|
||||||
|
插件的接口与对话接口一致,仅请求参数略有区别,有以下规定:
|
||||||
|
|
||||||
|
* 调用插件类型的应用时,接口默认为`detail`模式。
|
||||||
|
* 无需传入 `chatId`,因为插件只能运行一轮。
|
||||||
|
* 无需传入`messages`。
|
||||||
|
* 通过传递`variables`来代表插件的输入。
|
||||||
|
* 通过获取`pluginData`来获取插件输出。
|
||||||
|
|
||||||
|
### 请求示例
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl --location --request POST 'http://localhost:3000/api/v1/chat/completions' \
|
||||||
|
--header 'Authorization: Bearer test-xxxxx' \
|
||||||
|
--header 'Content-Type: application/json' \
|
||||||
|
--data-raw '{
|
||||||
|
"stream": false,
|
||||||
|
"chatId": "test",
|
||||||
|
"variables": {
|
||||||
|
"query":"你好" # 我的插件输入有一个参数,变量名叫 query
|
||||||
|
}
|
||||||
|
}'
|
||||||
|
```
|
||||||
|
|
||||||
|
### 响应示例
|
||||||
|
|
||||||
|
{{< tabs tabTotal="3" >}}
|
||||||
|
|
||||||
|
{{< tab tabName="detail=true,stream=false 响应" >}}
|
||||||
|
{{< markdownify >}}
|
||||||
|
|
||||||
|
* 插件的输出可以通过查找`responseData`中, `moduleType=pluginOutput`的元素,其`pluginOutput`是插件的输出。
|
||||||
|
* 流输出,仍可以通过`choices`进行获取。
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"responseData": [
|
||||||
|
{
|
||||||
|
"nodeId": "fdDgXQ6SYn8v",
|
||||||
|
"moduleName": "AI 对话",
|
||||||
|
"moduleType": "chatNode",
|
||||||
|
"totalPoints": 0.685,
|
||||||
|
"model": "FastAI-3.5",
|
||||||
|
"tokens": 685,
|
||||||
|
"query": "你好",
|
||||||
|
"maxToken": 2000,
|
||||||
|
"historyPreview": [
|
||||||
|
{
|
||||||
|
"obj": "Human",
|
||||||
|
"value": "你好"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"obj": "AI",
|
||||||
|
"value": "你好!有什么可以帮助你的吗?欢迎向我提问。"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"contextTotalLen": 14,
|
||||||
|
"runningTime": 1.73
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeId": "pluginOutput",
|
||||||
|
"moduleName": "自定义插件输出",
|
||||||
|
"moduleType": "pluginOutput",
|
||||||
|
"totalPoints": 0,
|
||||||
|
"pluginOutput": {
|
||||||
|
"result": "你好!有什么可以帮助你的吗?欢迎向我提问。"
|
||||||
|
},
|
||||||
|
"runningTime": 0
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"newVariables": {
|
||||||
|
"query": "你好"
|
||||||
|
},
|
||||||
|
"id": "safsafsa",
|
||||||
|
"model": "",
|
||||||
|
"usage": {
|
||||||
|
"prompt_tokens": 1,
|
||||||
|
"completion_tokens": 1,
|
||||||
|
"total_tokens": 1
|
||||||
|
},
|
||||||
|
"choices": [
|
||||||
|
{
|
||||||
|
"message": {
|
||||||
|
"role": "assistant",
|
||||||
|
"content": "你好!有什么可以帮助你的吗?欢迎向我提问。"
|
||||||
|
},
|
||||||
|
"finish_reason": "stop",
|
||||||
|
"index": 0
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
{{< /markdownify >}}
|
||||||
|
{{< /tab >}}
|
||||||
|
|
||||||
|
|
||||||
|
{{< tab tabName="detail=true,stream=true 响应" >}}
|
||||||
|
{{< markdownify >}}
|
||||||
|
|
||||||
|
* 插件的输出可以通过获取`event=flowResponses`中的字符串,并将其反序列化后得到一个数组。同样的,查找 `moduleType=pluginOutput`的元素,其`pluginOutput`是插件的输出。
|
||||||
|
* 流输出,仍和对话接口一样获取。
|
||||||
|
|
||||||
|
```bash
|
||||||
|
event: flowNodeStatus
|
||||||
|
data: {"status":"running","name":"AI 对话"}
|
||||||
|
|
||||||
|
event: answer
|
||||||
|
data: {"id":"","object":"","created":0,"model":"","choices":[{"delta":{"role":"assistant","content":""},"index":0,"finish_reason":null}]}
|
||||||
|
|
||||||
|
event: answer
|
||||||
|
data: {"id":"","object":"","created":0,"model":"","choices":[{"delta":{"role":"assistant","content":"你"},"index":0,"finish_reason":null}]}
|
||||||
|
|
||||||
|
event: answer
|
||||||
|
data: {"id":"","object":"","created":0,"model":"","choices":[{"delta":{"role":"assistant","content":"好"},"index":0,"finish_reason":null}]}
|
||||||
|
|
||||||
|
event: answer
|
||||||
|
data: {"id":"","object":"","created":0,"model":"","choices":[{"delta":{"role":"assistant","content":"!"},"index":0,"finish_reason":null}]}
|
||||||
|
|
||||||
|
event: answer
|
||||||
|
data: {"id":"","object":"","created":0,"model":"","choices":[{"delta":{"role":"assistant","content":"有"},"index":0,"finish_reason":null}]}
|
||||||
|
|
||||||
|
event: answer
|
||||||
|
data: {"id":"","object":"","created":0,"model":"","choices":[{"delta":{"role":"assistant","content":"什"},"index":0,"finish_reason":null}]}
|
||||||
|
|
||||||
|
event: answer
|
||||||
|
data: {"id":"","object":"","created":0,"model":"","choices":[{"delta":{"role":"assistant","content":"么"},"index":0,"finish_reason":null}]}
|
||||||
|
|
||||||
|
event: answer
|
||||||
|
data: {"id":"","object":"","created":0,"model":"","choices":[{"delta":{"role":"assistant","content":"可以"},"index":0,"finish_reason":null}]}
|
||||||
|
|
||||||
|
event: answer
|
||||||
|
data: {"id":"","object":"","created":0,"model":"","choices":[{"delta":{"role":"assistant","content":"帮"},"index":0,"finish_reason":null}]}
|
||||||
|
|
||||||
|
event: answer
|
||||||
|
data: {"id":"","object":"","created":0,"model":"","choices":[{"delta":{"role":"assistant","content":"助"},"index":0,"finish_reason":null}]}
|
||||||
|
|
||||||
|
event: answer
|
||||||
|
data: {"id":"","object":"","created":0,"model":"","choices":[{"delta":{"role":"assistant","content":"你"},"index":0,"finish_reason":null}]}
|
||||||
|
|
||||||
|
event: answer
|
||||||
|
data: {"id":"","object":"","created":0,"model":"","choices":[{"delta":{"role":"assistant","content":"的"},"index":0,"finish_reason":null}]}
|
||||||
|
|
||||||
|
event: answer
|
||||||
|
data: {"id":"","object":"","created":0,"model":"","choices":[{"delta":{"role":"assistant","content":"吗"},"index":0,"finish_reason":null}]}
|
||||||
|
|
||||||
|
event: answer
|
||||||
|
data: {"id":"","object":"","created":0,"model":"","choices":[{"delta":{"role":"assistant","content":"?"},"index":0,"finish_reason":null}]}
|
||||||
|
|
||||||
|
event: answer
|
||||||
|
data: {"id":"","object":"","created":0,"model":"","choices":[{"delta":{"role":"assistant","content":""},"index":0,"finish_reason":null}]}
|
||||||
|
|
||||||
|
event: answer
|
||||||
|
data: {"id":"","object":"","created":0,"model":"","choices":[{"delta":{},"index":0,"finish_reason":"stop"}]}
|
||||||
|
|
||||||
|
event: answer
|
||||||
|
data: [DONE]
|
||||||
|
|
||||||
|
event: flowResponses
|
||||||
|
data: [{"nodeId":"fdDgXQ6SYn8v","moduleName":"AI 对话","moduleType":"chatNode","totalPoints":0.033,"model":"FastAI-3.5","tokens":33,"query":"你好","maxToken":2000,"historyPreview":[{"obj":"Human","value":"你好"},{"obj":"AI","value":"你好!有什么可以帮助你的吗?"}],"contextTotalLen":2,"runningTime":1.42},{"nodeId":"pluginOutput","moduleName":"自定义插件输出","moduleType":"pluginOutput","totalPoints":0,"pluginOutput":{"result":"你好!有什么可以帮助你的吗?"},"runningTime":0}]
|
||||||
|
```
|
||||||
|
|
||||||
|
{{< /markdownify >}}
|
||||||
|
{{< /tab >}}
|
||||||
|
|
||||||
|
{{< tab tabName="输出获取" >}}
|
||||||
|
{{< markdownify >}}
|
||||||
|
|
||||||
|
event取值:
|
||||||
|
|
||||||
|
- answer: 返回给客户端的文本(最终会算作回答)
|
||||||
|
- fastAnswer: 指定回复返回给客户端的文本(最终会算作回答)
|
||||||
|
- toolCall: 执行工具
|
||||||
|
- toolParams: 工具参数
|
||||||
|
- toolResponse: 工具返回
|
||||||
|
- flowNodeStatus: 运行到的节点状态
|
||||||
|
- flowResponses: 节点完整响应
|
||||||
|
- updateVariables: 更新变量
|
||||||
|
- error: 报错
|
||||||
|
|
||||||
|
{{< /markdownify >}}
|
||||||
|
{{< /tab >}}
|
||||||
|
{{< /tabs >}}
|
||||||
|
|
||||||
## 使用案例
|
## 使用案例
|
||||||
|
|
||||||
- [接入 NextWeb/ChatGPT web 等应用](/docs/use-cases/openapi)
|
- [接入 NextWeb/ChatGPT web 等应用](/docs/use-cases/openapi)
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ weight: 853
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
## 创建训练订单(4.6.9地址发生改动)
|
## 创建训练订单
|
||||||
|
|
||||||
{{< tabs tabTotal="2" >}}
|
{{< tabs tabTotal="2" >}}
|
||||||
{{< tab tabName="请求示例" >}}
|
{{< tab tabName="请求示例" >}}
|
||||||
@@ -26,6 +26,7 @@ curl --location --request POST 'https://api.fastgpt.in/api/support/wallet/usage/
|
|||||||
--header 'Authorization: Bearer {{apikey}}' \
|
--header 'Authorization: Bearer {{apikey}}' \
|
||||||
--header 'Content-Type: application/json' \
|
--header 'Content-Type: application/json' \
|
||||||
--data-raw '{
|
--data-raw '{
|
||||||
|
"datasetId": "知识库 ID",
|
||||||
"name": "可选,自定义订单名称,例如:文档训练-fastgpt.docx"
|
"name": "可选,自定义订单名称,例如:文档训练-fastgpt.docx"
|
||||||
}'
|
}'
|
||||||
```
|
```
|
||||||
@@ -127,8 +128,12 @@ curl --location --request POST 'http://localhost:3000/api/core/dataset/create' \
|
|||||||
{{< markdownify >}}
|
{{< markdownify >}}
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
curl --location --request GET 'http://localhost:3000/api/core/dataset/list?parentId=' \
|
curl --location --request POST 'http://localhost:3000/api/core/dataset/list?parentId=' \
|
||||||
--header 'Authorization: Bearer {{authorization}}' \
|
--header 'Authorization: Bearer xxxx' \
|
||||||
|
--header 'Content-Type: application/json' \
|
||||||
|
--data-raw '{
|
||||||
|
"parentId":""
|
||||||
|
}'
|
||||||
```
|
```
|
||||||
|
|
||||||
{{< /markdownify >}}
|
{{< /markdownify >}}
|
||||||
@@ -138,7 +143,7 @@ curl --location --request GET 'http://localhost:3000/api/core/dataset/list?paren
|
|||||||
{{< markdownify >}}
|
{{< markdownify >}}
|
||||||
|
|
||||||
{{% alert icon=" " context="success" %}}
|
{{% alert icon=" " context="success" %}}
|
||||||
- parentId - 父级ID,不传或为空,代表获取根目录下的知识库
|
- parentId - 父级ID,传空字符串或者null,代表获取根目录下的知识库
|
||||||
{{% /alert %}}
|
{{% /alert %}}
|
||||||
|
|
||||||
{{< /markdownify >}}
|
{{< /markdownify >}}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
title: 'V4.8.4'
|
title: 'V4.8.4(需要初始化)'
|
||||||
description: 'FastGPT V4.8.4 更新说明'
|
description: 'FastGPT V4.8.4 更新说明'
|
||||||
icon: 'upgrade'
|
icon: 'upgrade'
|
||||||
draft: false
|
draft: false
|
||||||
@@ -35,4 +35,4 @@ curl --location --request POST 'https://{{host}}/api/admin/init/484' \
|
|||||||
6. 修复 - 定时执行初始化错误。
|
6. 修复 - 定时执行初始化错误。
|
||||||
7. 修复 - 应用调用传参异常。
|
7. 修复 - 应用调用传参异常。
|
||||||
8. 修复 - ctrl + cv 复杂节点时,nodeId错误。
|
8. 修复 - ctrl + cv 复杂节点时,nodeId错误。
|
||||||
9. 调整组件库全局theme。
|
9. 调整组件库全局theme。
|
||||||
|
|||||||
61
docSite/content/zh-cn/docs/development/upgrading/485.md
Normal file
61
docSite/content/zh-cn/docs/development/upgrading/485.md
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
---
|
||||||
|
title: 'V4.8.5(需要初始化)'
|
||||||
|
description: 'FastGPT V4.8.5 更新说明'
|
||||||
|
icon: 'upgrade'
|
||||||
|
draft: false
|
||||||
|
toc: true
|
||||||
|
weight: 819
|
||||||
|
---
|
||||||
|
|
||||||
|
## 升级指南
|
||||||
|
|
||||||
|
### 1. 做好数据库备份
|
||||||
|
|
||||||
|
### 2. 修改镜像
|
||||||
|
|
||||||
|
- fastgpt 镜像 tag 修改成 v4.8.5
|
||||||
|
- 商业版镜像 tag 修改成 v4.8.5
|
||||||
|
|
||||||
|
### 3. 执行初始化
|
||||||
|
|
||||||
|
从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 `rootkey`;{{host}} 替换成**FastGPT 域名**。
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl --location --request POST 'https://{{host}}/api/admin/initv485' \
|
||||||
|
--header 'rootkey: {{rootkey}}' \
|
||||||
|
--header 'Content-Type: application/json'
|
||||||
|
```
|
||||||
|
|
||||||
|
会把插件的数据表合并到应用中,插件表不会删除。
|
||||||
|
|
||||||
|
------
|
||||||
|
|
||||||
|
**商业版用户执行额外的初始化**
|
||||||
|
|
||||||
|
从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 `rootkey`;{{host}} 替换成**FastGPT 商业版的域名**:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl --location --request POST 'https://{{host}}/api/admin/init/485' \
|
||||||
|
--header 'rootkey: {{rootkey}}' \
|
||||||
|
--header 'Content-Type: application/json'
|
||||||
|
```
|
||||||
|
|
||||||
|
会重置知识库权限系统。
|
||||||
|
|
||||||
|
## V4.8.5 更新说明
|
||||||
|
|
||||||
|
1. 新增 - 合并插件和应用,统一成工作台
|
||||||
|
2. 新增 - 应用创建副本功能
|
||||||
|
3. 新增 - 应用创建模板
|
||||||
|
4. 新增 - 支持代码运行结果作为工具输出。
|
||||||
|
5. 新增 - Markdown 图片输出,支持移动端放大缩放。
|
||||||
|
6. 优化 - 原文件编码存取
|
||||||
|
7. 优化 - 知识库删除后,简易模式会过滤掉删除的知识库,避免错误判断。
|
||||||
|
8. 优化 - 文件夹读取,支持单个文件夹超出 100 个文件
|
||||||
|
9. 优化 - 问答拆分/手动录入,当有`a`字段时,自动将`q`作为补充索引。
|
||||||
|
10. 优化 - 对话框页面代码
|
||||||
|
11. 优化 - 工作流新节点自动增加序号名
|
||||||
|
12. 修复 - 定时任务无法实际关闭
|
||||||
|
13. 修复 - 输入引导特殊字符导致正则报错
|
||||||
|
14. 修复 - 文件包含特殊字符`%`,且为转义时会导致页面崩溃
|
||||||
|
15. 修复 - 自定义输入选择知识库引用时页面崩溃
|
||||||
51
docSite/content/zh-cn/docs/development/upgrading/486.md
Normal file
51
docSite/content/zh-cn/docs/development/upgrading/486.md
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
---
|
||||||
|
title: 'V4.8.6(需要初始化)'
|
||||||
|
description: 'FastGPT V4.8.6 更新说明'
|
||||||
|
icon: 'upgrade'
|
||||||
|
draft: false
|
||||||
|
toc: true
|
||||||
|
weight: 818
|
||||||
|
---
|
||||||
|
|
||||||
|
## 升级指南
|
||||||
|
|
||||||
|
### 1. 做好数据库备份
|
||||||
|
|
||||||
|
### 2. 修改镜像
|
||||||
|
|
||||||
|
- fastgpt 镜像 tag 修改成 v4.8.6
|
||||||
|
- fastgpt-sandbox 镜像 tag 修改成 v4.8.6
|
||||||
|
- 商业版镜像 tag 修改成 v4.8.6
|
||||||
|
|
||||||
|
### 3. 执行初始化
|
||||||
|
|
||||||
|
从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 `rootkey`;{{host}} 替换成**FastGPT 域名**。
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl --location --request POST 'https://{{host}}/api/admin/initv486' \
|
||||||
|
--header 'rootkey: {{rootkey}}' \
|
||||||
|
--header 'Content-Type: application/json'
|
||||||
|
```
|
||||||
|
|
||||||
|
会初始化应用的继承权限
|
||||||
|
|
||||||
|
-------
|
||||||
|
|
||||||
|
## V4.8.6 更新说明
|
||||||
|
|
||||||
|
1. 新增 - 应用权限继承
|
||||||
|
2. 新增 - 知识库支持单个集合禁用功能
|
||||||
|
3. 新增 - 系统插件模式变更,新增链接读取和数学计算器插件,正式版会更新如何自定义系统插件
|
||||||
|
4. 新增 - 代码沙盒运行参数
|
||||||
|
5. 新增 - AI对话时隐藏头部的功能,主要是适配移动端
|
||||||
|
6. 优化 - 文件读取,Mongo 默认使用从节点,减轻主节点压力
|
||||||
|
7. 优化 - 提示词模板
|
||||||
|
8. 优化 - Mongo model 重复加载
|
||||||
|
9. 修复 - 创建链接集合未返回 id
|
||||||
|
10. 修复 - 文档接口说明
|
||||||
|
11. 修复 - api system 提示合并
|
||||||
|
12. 修复 - 团队插件目录内的内容无法加载
|
||||||
|
13. 修复 - 知识库集合目录面包屑无法加载
|
||||||
|
14. 修复 - Markdown 导出对话异常
|
||||||
|
15. 修复 - 提示模板结束标签错误
|
||||||
|
16. 修复 - 文档描述
|
||||||
29
docSite/content/zh-cn/docs/development/upgrading/487.md
Normal file
29
docSite/content/zh-cn/docs/development/upgrading/487.md
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
---
|
||||||
|
title: 'V4.8.7(进行中)'
|
||||||
|
description: 'FastGPT V4.8.7 更新说明'
|
||||||
|
icon: 'upgrade'
|
||||||
|
draft: false
|
||||||
|
toc: true
|
||||||
|
weight: 817
|
||||||
|
---
|
||||||
|
|
||||||
|
## 升级指南
|
||||||
|
|
||||||
|
### 1. 做好数据库备份
|
||||||
|
|
||||||
|
### 2. 修改镜像
|
||||||
|
|
||||||
|
- fastgpt 镜像 tag 修改成 v4.8.7-alpha
|
||||||
|
- 商业版镜像 tag 修改成 v4.8.7-alpha
|
||||||
|
|
||||||
|
-------
|
||||||
|
|
||||||
|
## V4.8.7 更新说明
|
||||||
|
|
||||||
|
1. 新增 - 插件支持独立运行,发布和日志查看
|
||||||
|
2. 新增 - 应用搜索
|
||||||
|
3. 优化 - 对话框代码
|
||||||
|
4. 优化 - 升级 Dockerfile node 和 pnpm 版本
|
||||||
|
5. 优化 - local 域名部署,也可以正常使用 vision 模式
|
||||||
|
6. 修复 - 简易模式无法变更全局变量
|
||||||
|
7. 修复 - gpt4o 无法同时使用工具和图片
|
||||||
@@ -9,7 +9,7 @@ weight: 506
|
|||||||
|
|
||||||
# FastGPT 三分钟接入微信/企业微信
|
# FastGPT 三分钟接入微信/企业微信
|
||||||
私人微信和企业微信接入的方式基本一样,不同的地方会刻意指出。
|
私人微信和企业微信接入的方式基本一样,不同的地方会刻意指出。
|
||||||
[查看视频教程](https://www.bilibili.com/video/BV1cu411F7FN/?spm_id_from=333.1007.top_right_bar_window_history.content.click&vd_source=903c2b09b7412037c2eddc6a8fb9828b)
|
[查看视频教程](https://www.bilibili.com/video/BV1rJ4m1w7xk/)
|
||||||
## 创建APIKey
|
## 创建APIKey
|
||||||
首先找到我们需要接入的应用,然后点击「外部使用」->「API访问」创建一个APIKey并保存。
|
首先找到我们需要接入的应用,然后点击「外部使用」->「API访问」创建一个APIKey并保存。
|
||||||
|
|
||||||
@@ -27,7 +27,7 @@ weight: 506
|
|||||||
|
|
||||||
## sealos部署服务
|
## sealos部署服务
|
||||||
|
|
||||||
[访问sealos](https://cloud.sealos.io/) 登陆进来之后打开「应用管理」-> 「新建应用」。
|
[访问sealos](https://cloud.sealos.run/) 登陆进来之后打开「应用管理」-> 「新建应用」。
|
||||||
- 应用名:称随便填写
|
- 应用名:称随便填写
|
||||||
- 镜像名:私人微信填写 aibotk/wechat-assistant 企业微信填写 aibotk/worker-assistant
|
- 镜像名:私人微信填写 aibotk/wechat-assistant 企业微信填写 aibotk/worker-assistant
|
||||||
- cpu和内存建议 1c1g
|
- cpu和内存建议 1c1g
|
||||||
@@ -38,14 +38,14 @@ weight: 506
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
这里需要填写四个环境变量:
|
这里需要填写三个环境变量:
|
||||||
```
|
```
|
||||||
AIBOTK_KEY=微秘书 APIKEY
|
AIBOTK_KEY=微秘书 APIKEY
|
||||||
AIBOTK_SECRET=微秘书 APISECRET
|
AIBOTK_SECRET=微秘书 APISECRET
|
||||||
WORK_PRO_TOKEN=你申请的企微 token (企业微信需要填写,私人微信不需要)
|
WORK_PRO_TOKEN=你申请的企微 token (企业微信需要填写,私人微信不需要)
|
||||||
```
|
```
|
||||||
|
|
||||||
这里最后两个变量只有部署企业微信才需要,私人微信只需要填写前两个即可。
|
这里最后的企业微信 Token 在微秘书的->会员开通栏目中自行购买。
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@@ -55,9 +55,7 @@ WORK_PRO_TOKEN=你申请的企微 token (企业微信需要填写,私人
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
`WORK_PRO_TOKEN` [点击这里](https://tss.rpachat.com/?aff=aibotk)申请 token 然后填入即可。
|
`WORK_PRO_TOKEN` 微秘书的会员中心中自行购买即可。
|
||||||
|
|
||||||
`WECHATY_PUPPET_SERVICE_AUTHORITY`的值复制过去就可以。
|
|
||||||
|
|
||||||
填写完毕后点右上角「部署」,等待应用状态变为运行中。
|
填写完毕后点右上角「部署」,等待应用状态变为运行中。
|
||||||
|
|
||||||
|
|||||||
@@ -272,7 +272,7 @@ Response:
|
|||||||
{
|
{
|
||||||
"key": "Authorization",
|
"key": "Authorization",
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"value": "Bearer sk-zsfBsxEU3ApSFGYxF4CdB97e9556412588421823371b9f7b"
|
"value": "Bearer "
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"label": "",
|
"label": "",
|
||||||
|
|||||||
@@ -26,456 +26,378 @@ weight: 404
|
|||||||
{{% details title="编排配置" closed="true" %}}
|
{{% details title="编排配置" closed="true" %}}
|
||||||
|
|
||||||
```json
|
```json
|
||||||
[
|
{
|
||||||
{
|
"nodes": [
|
||||||
"nodeId": "userGuide",
|
{
|
||||||
"name": "core.module.template.App system setting",
|
"nodeId": "userGuide",
|
||||||
"intro": "core.app.tip.userGuideTip",
|
"name": "系统配置",
|
||||||
"avatar": "/imgs/workflow/userGuide.png",
|
"intro": "可以配置应用的系统参数",
|
||||||
"flowNodeType": "userGuide",
|
"avatar": "/imgs/workflow/userGuide.png",
|
||||||
"position": {
|
"flowNodeType": "userGuide",
|
||||||
"x": -92.26884681344463,
|
"position": {
|
||||||
"y": 710.9354029649536
|
"x": 303.41163758039283,
|
||||||
|
"y": -552.297639861266
|
||||||
|
},
|
||||||
|
"version": "481",
|
||||||
|
"inputs": [],
|
||||||
|
"outputs": []
|
||||||
},
|
},
|
||||||
"inputs": [
|
{
|
||||||
{
|
"nodeId": "workflowStartNodeId",
|
||||||
"key": "welcomeText",
|
"name": "流程开始",
|
||||||
"type": "hidden",
|
"intro": "",
|
||||||
"valueType": "string",
|
"avatar": "/imgs/workflow/userChatInput.svg",
|
||||||
"label": "core.app.Welcome Text",
|
"flowNodeType": "workflowStart",
|
||||||
"showTargetInApp": false,
|
"position": {
|
||||||
"showTargetInPlugin": false,
|
"x": 529.3935295017156,
|
||||||
"value": "",
|
"y": 197.114018410347
|
||||||
"connected": false
|
|
||||||
},
|
},
|
||||||
{
|
"version": "481",
|
||||||
"key": "variables",
|
"inputs": [
|
||||||
"type": "hidden",
|
{
|
||||||
"valueType": "any",
|
"key": "userChatInput",
|
||||||
"label": "core.module.Variable",
|
"renderTypeList": [
|
||||||
"value": [],
|
"reference",
|
||||||
"showTargetInApp": false,
|
"textarea"
|
||||||
"showTargetInPlugin": false,
|
],
|
||||||
"connected": false
|
"valueType": "string",
|
||||||
},
|
"label": "用户问题",
|
||||||
{
|
"required": true,
|
||||||
"key": "questionGuide",
|
"toolDescription": "用户问题"
|
||||||
"valueType": "boolean",
|
|
||||||
"type": "switch",
|
|
||||||
"label": "",
|
|
||||||
"showTargetInApp": false,
|
|
||||||
"showTargetInPlugin": false,
|
|
||||||
"value": false,
|
|
||||||
"connected": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "tts",
|
|
||||||
"type": "hidden",
|
|
||||||
"valueType": "any",
|
|
||||||
"label": "",
|
|
||||||
"showTargetInApp": false,
|
|
||||||
"showTargetInPlugin": false,
|
|
||||||
"value": {
|
|
||||||
"type": "web"
|
|
||||||
},
|
|
||||||
"connected": false
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"outputs": []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"nodeId": "userChatInput",
|
|
||||||
"name": "core.module.template.Chat entrance",
|
|
||||||
"intro": "当用户发送一个内容后,流程将会从这个模块开始执行。",
|
|
||||||
"avatar": "/imgs/workflow/userChatInput.svg",
|
|
||||||
"flowNodeType": "questionInput",
|
|
||||||
"position": {
|
|
||||||
"x": 241.60980819261408,
|
|
||||||
"y": 1330.9528898009685
|
|
||||||
},
|
|
||||||
"inputs": [
|
|
||||||
{
|
|
||||||
"key": "userChatInput",
|
|
||||||
"type": "systemInput",
|
|
||||||
"valueType": "string",
|
|
||||||
"label": "core.module.input.label.user question",
|
|
||||||
"showTargetInApp": false,
|
|
||||||
"showTargetInPlugin": false,
|
|
||||||
"connected": false
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"key": "userChatInput",
|
|
||||||
"label": "core.module.input.label.user question",
|
|
||||||
"type": "source",
|
|
||||||
"valueType": "string",
|
|
||||||
"targets": [
|
|
||||||
{
|
|
||||||
"nodeId": "n84rvg",
|
|
||||||
"key": "userChatInput"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"nodeId": "n84rvg",
|
|
||||||
"name": "工具调用(实验)",
|
|
||||||
"intro": "通过AI模型自动选择一个或多个功能块进行调用,也可以对插件进行调用。",
|
|
||||||
"avatar": "/imgs/workflow/tool.svg",
|
|
||||||
"flowNodeType": "tools",
|
|
||||||
"showStatus": true,
|
|
||||||
"position": {
|
|
||||||
"x": 809.4264785615641,
|
|
||||||
"y": 873.3971746859133
|
|
||||||
},
|
|
||||||
"inputs": [
|
|
||||||
{
|
|
||||||
"key": "model",
|
|
||||||
"type": "settingLLMModel",
|
|
||||||
"label": "core.module.input.label.aiModel",
|
|
||||||
"required": true,
|
|
||||||
"valueType": "string",
|
|
||||||
"showTargetInApp": false,
|
|
||||||
"showTargetInPlugin": false,
|
|
||||||
"llmModelType": "all",
|
|
||||||
"value": "gpt-3.5-turbo",
|
|
||||||
"connected": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "temperature",
|
|
||||||
"type": "hidden",
|
|
||||||
"label": "",
|
|
||||||
"value": 0,
|
|
||||||
"valueType": "number",
|
|
||||||
"min": 0,
|
|
||||||
"max": 10,
|
|
||||||
"step": 1,
|
|
||||||
"showTargetInApp": false,
|
|
||||||
"showTargetInPlugin": false,
|
|
||||||
"connected": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "maxToken",
|
|
||||||
"type": "hidden",
|
|
||||||
"label": "",
|
|
||||||
"value": 2000,
|
|
||||||
"valueType": "number",
|
|
||||||
"min": 100,
|
|
||||||
"max": 4000,
|
|
||||||
"step": 50,
|
|
||||||
"showTargetInApp": false,
|
|
||||||
"showTargetInPlugin": false,
|
|
||||||
"connected": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "systemPrompt",
|
|
||||||
"type": "textarea",
|
|
||||||
"max": 3000,
|
|
||||||
"valueType": "string",
|
|
||||||
"label": "core.ai.Prompt",
|
|
||||||
"description": "core.app.tip.chatNodeSystemPromptTip",
|
|
||||||
"placeholder": "core.app.tip.chatNodeSystemPromptTip",
|
|
||||||
"showTargetInApp": true,
|
|
||||||
"showTargetInPlugin": true,
|
|
||||||
"connected": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "history",
|
|
||||||
"type": "numberInput",
|
|
||||||
"label": "core.module.input.label.chat history",
|
|
||||||
"required": true,
|
|
||||||
"min": 0,
|
|
||||||
"max": 30,
|
|
||||||
"valueType": "chatHistory",
|
|
||||||
"value": 6,
|
|
||||||
"showTargetInApp": true,
|
|
||||||
"showTargetInPlugin": true,
|
|
||||||
"connected": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "userChatInput",
|
|
||||||
"type": "custom",
|
|
||||||
"label": "",
|
|
||||||
"required": true,
|
|
||||||
"valueType": "string",
|
|
||||||
"showTargetInApp": true,
|
|
||||||
"showTargetInPlugin": true,
|
|
||||||
"connected": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"key": "userChatInput",
|
|
||||||
"label": "core.module.input.label.user question",
|
|
||||||
"type": "hidden",
|
|
||||||
"valueType": "string",
|
|
||||||
"targets": []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "selectedTools",
|
|
||||||
"valueType": "tools",
|
|
||||||
"type": "hidden",
|
|
||||||
"targets": [
|
|
||||||
{
|
|
||||||
"nodeId": "3mbu91",
|
|
||||||
"key": "selectedTools"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "finish",
|
|
||||||
"label": "",
|
|
||||||
"description": "",
|
|
||||||
"valueType": "boolean",
|
|
||||||
"type": "hidden",
|
|
||||||
"targets": []
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"nodeId": "3mbu91",
|
|
||||||
"name": "HTTP 请求",
|
|
||||||
"intro": "调用飞书webhook,发送一个通知",
|
|
||||||
"avatar": "/imgs/workflow/http.png",
|
|
||||||
"flowNodeType": "httpRequest468",
|
|
||||||
"showStatus": true,
|
|
||||||
"position": {
|
|
||||||
"x": 1483.6437630977423,
|
|
||||||
"y": 798.9716928475544
|
|
||||||
},
|
|
||||||
"inputs": [
|
|
||||||
|
|
||||||
{
|
|
||||||
"key": "system_httpMethod",
|
|
||||||
"type": "custom",
|
|
||||||
"valueType": "string",
|
|
||||||
"label": "",
|
|
||||||
"value": "POST",
|
|
||||||
"required": true,
|
|
||||||
"showTargetInApp": false,
|
|
||||||
"showTargetInPlugin": false,
|
|
||||||
"connected": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "system_httpReqUrl",
|
|
||||||
"type": "hidden",
|
|
||||||
"valueType": "string",
|
|
||||||
"label": "",
|
|
||||||
"description": "core.module.input.description.Http Request Url",
|
|
||||||
"placeholder": "https://api.ai.com/getInventory",
|
|
||||||
"required": false,
|
|
||||||
"showTargetInApp": false,
|
|
||||||
"showTargetInPlugin": false,
|
|
||||||
"value": "这里填写你的飞书机器人地址",
|
|
||||||
"connected": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "system_httpHeader",
|
|
||||||
"type": "custom",
|
|
||||||
"valueType": "any",
|
|
||||||
"value": [],
|
|
||||||
"label": "",
|
|
||||||
"description": "core.module.input.description.Http Request Header",
|
|
||||||
"placeholder": "core.module.input.description.Http Request Header",
|
|
||||||
"required": false,
|
|
||||||
"showTargetInApp": false,
|
|
||||||
"showTargetInPlugin": false,
|
|
||||||
"connected": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "system_httpParams",
|
|
||||||
"type": "hidden",
|
|
||||||
"valueType": "any",
|
|
||||||
"value": [],
|
|
||||||
"label": "",
|
|
||||||
"required": false,
|
|
||||||
"showTargetInApp": false,
|
|
||||||
"showTargetInPlugin": false,
|
|
||||||
"connected": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "system_httpJsonBody",
|
|
||||||
"type": "hidden",
|
|
||||||
"valueType": "any",
|
|
||||||
"value": "{\r\n \"msg_type\": \"text\",\r\n \"content\": {\r\n \"text\": \"{{text}}\"\r\n }\r\n}",
|
|
||||||
"label": "",
|
|
||||||
"required": false,
|
|
||||||
"showTargetInApp": false,
|
|
||||||
"showTargetInPlugin": false,
|
|
||||||
"connected": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "DYNAMIC_INPUT_KEY",
|
|
||||||
"type": "target",
|
|
||||||
"valueType": "any",
|
|
||||||
"label": "core.workflow.inputType.dynamicTargetInput",
|
|
||||||
"description": "core.module.input.description.dynamic input",
|
|
||||||
"required": false,
|
|
||||||
"showTargetInApp": false,
|
|
||||||
"showTargetInPlugin": true,
|
|
||||||
"hideInApp": true,
|
|
||||||
"connected": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "system_addInputParam",
|
|
||||||
"type": "addInputParam",
|
|
||||||
"valueType": "any",
|
|
||||||
"label": "",
|
|
||||||
"required": false,
|
|
||||||
"showTargetInApp": false,
|
|
||||||
"showTargetInPlugin": false,
|
|
||||||
"editField": {
|
|
||||||
"key": true,
|
|
||||||
"description": true,
|
|
||||||
"dataType": true
|
|
||||||
},
|
|
||||||
"defaultEditField": {
|
|
||||||
"label": "",
|
|
||||||
"key": "",
|
|
||||||
"description": "",
|
|
||||||
"inputType": "target",
|
|
||||||
"valueType": "string"
|
|
||||||
},
|
|
||||||
"connected": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"valueType": "string",
|
|
||||||
"type": "hidden",
|
|
||||||
"key": "text",
|
|
||||||
"label": "text",
|
|
||||||
"toolDescription": "需要发送的通知内容",
|
|
||||||
"required": true,
|
|
||||||
"connected": false
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"key": "httpRawResponse",
|
|
||||||
"label": "原始响应",
|
|
||||||
"description": "HTTP请求的原始响应。只能接受字符串或JSON类型响应数据。",
|
|
||||||
"valueType": "any",
|
|
||||||
"type": "source",
|
|
||||||
"targets": [
|
|
||||||
{
|
|
||||||
"nodeId": "rzx4mj",
|
|
||||||
"key": "switch"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"nodeId": "psdhs1",
|
|
||||||
"key": "switch"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "system_addOutputParam",
|
|
||||||
"type": "addOutputParam",
|
|
||||||
"valueType": "any",
|
|
||||||
"label": "",
|
|
||||||
"targets": [],
|
|
||||||
"editField": {
|
|
||||||
"key": true,
|
|
||||||
"description": true,
|
|
||||||
"dataType": true,
|
|
||||||
"defaultValue": true
|
|
||||||
},
|
|
||||||
"defaultEditField": {
|
|
||||||
"label": "",
|
|
||||||
"key": "",
|
|
||||||
"description": "",
|
|
||||||
"outputType": "source",
|
|
||||||
"valueType": "string"
|
|
||||||
}
|
}
|
||||||
|
],
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"id": "userChatInput",
|
||||||
|
"key": "userChatInput",
|
||||||
|
"label": "core.module.input.label.user question",
|
||||||
|
"valueType": "string",
|
||||||
|
"type": "static"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeId": "u6IAOEssxoZT",
|
||||||
|
"name": "工具调用",
|
||||||
|
"intro": "通过AI模型自动选择一个或多个功能块进行调用,也可以对插件进行调用。",
|
||||||
|
"avatar": "/imgs/workflow/tool.svg",
|
||||||
|
"flowNodeType": "tools",
|
||||||
|
"showStatus": true,
|
||||||
|
"position": {
|
||||||
|
"x": 1003.146243538873,
|
||||||
|
"y": 48.52327869406625
|
||||||
},
|
},
|
||||||
{
|
"version": "481",
|
||||||
"type": "source",
|
"inputs": [
|
||||||
"valueType": "string",
|
{
|
||||||
"key": "prompt",
|
"key": "model",
|
||||||
"label": "prompt",
|
"renderTypeList": [
|
||||||
"description": "",
|
"settingLLMModel",
|
||||||
"required": false,
|
"reference"
|
||||||
"edit": true,
|
],
|
||||||
"editField": {
|
"label": "core.module.input.label.aiModel",
|
||||||
"key": true,
|
"valueType": "string",
|
||||||
"description": true,
|
"llmModelType": "all",
|
||||||
"dataType": true,
|
"value": "gpt-3.5-turbo"
|
||||||
"defaultValue": true
|
|
||||||
},
|
},
|
||||||
"targets": []
|
{
|
||||||
}
|
"key": "temperature",
|
||||||
]
|
"renderTypeList": [
|
||||||
},
|
"hidden"
|
||||||
{
|
],
|
||||||
"nodeId": "rzx4mj",
|
"label": "",
|
||||||
"name": "工具调用终止",
|
"value": 0,
|
||||||
"intro": "该模块需配置工具调用使用。当该模块被执行时,本次工具调用将会强制结束,并且不再调用AI针对工具调用结果回答问题。",
|
"valueType": "number",
|
||||||
"avatar": "/imgs/workflow/toolStop.svg",
|
"min": 0,
|
||||||
"flowNodeType": "stopTool",
|
"max": 10,
|
||||||
"position": {
|
"step": 1
|
||||||
"x": 2145.5070710160267,
|
},
|
||||||
"y": 1306.3581817783079
|
{
|
||||||
|
"key": "maxToken",
|
||||||
|
"renderTypeList": [
|
||||||
|
"hidden"
|
||||||
|
],
|
||||||
|
"label": "",
|
||||||
|
"value": 2000,
|
||||||
|
"valueType": "number",
|
||||||
|
"min": 100,
|
||||||
|
"max": 4000,
|
||||||
|
"step": 50
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "systemPrompt",
|
||||||
|
"renderTypeList": [
|
||||||
|
"textarea",
|
||||||
|
"reference"
|
||||||
|
],
|
||||||
|
"max": 3000,
|
||||||
|
"valueType": "string",
|
||||||
|
"label": "core.ai.Prompt",
|
||||||
|
"description": "core.app.tip.chatNodeSystemPromptTip",
|
||||||
|
"placeholder": "core.app.tip.chatNodeSystemPromptTip"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "history",
|
||||||
|
"renderTypeList": [
|
||||||
|
"numberInput",
|
||||||
|
"reference"
|
||||||
|
],
|
||||||
|
"valueType": "chatHistory",
|
||||||
|
"label": "core.module.input.label.chat history",
|
||||||
|
"description": "最多携带多少轮对话记录",
|
||||||
|
"required": true,
|
||||||
|
"min": 0,
|
||||||
|
"max": 50,
|
||||||
|
"value": 6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "userChatInput",
|
||||||
|
"renderTypeList": [
|
||||||
|
"reference",
|
||||||
|
"textarea"
|
||||||
|
],
|
||||||
|
"valueType": "string",
|
||||||
|
"label": "用户问题",
|
||||||
|
"required": true,
|
||||||
|
"value": [
|
||||||
|
"workflowStartNodeId",
|
||||||
|
"userChatInput"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"id": "answerText",
|
||||||
|
"key": "answerText",
|
||||||
|
"label": "core.module.output.label.Ai response content",
|
||||||
|
"description": "core.module.output.description.Ai response content",
|
||||||
|
"valueType": "string",
|
||||||
|
"type": "static"
|
||||||
|
}
|
||||||
|
]
|
||||||
},
|
},
|
||||||
"inputs": [
|
{
|
||||||
{
|
"nodeId": "fvY5hb0K646V",
|
||||||
"key": "switch",
|
"name": "工具调用终止",
|
||||||
"type": "triggerAndFinish",
|
"intro": "该模块需配置工具调用使用。当该模块被执行时,本次工具调用将会强制结束,并且不再调用AI针对工具调用结果回答问题。",
|
||||||
"label": "",
|
"avatar": "/imgs/workflow/toolStop.svg",
|
||||||
"description": "core.module.input.description.Trigger",
|
"flowNodeType": "stopTool",
|
||||||
"valueType": "any",
|
"position": {
|
||||||
"showTargetInApp": true,
|
"x": 2367.838362362707,
|
||||||
"showTargetInPlugin": true,
|
"y": 732.355988936165
|
||||||
"connected": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"outputs": []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"nodeId": "psdhs1",
|
|
||||||
"name": "指定回复",
|
|
||||||
"intro": "该模块可以直接回复一段指定的内容。常用于引导、提示。非字符串内容传入时,会转成字符串进行输出。",
|
|
||||||
"avatar": "/imgs/workflow/reply.png",
|
|
||||||
"flowNodeType": "answerNode",
|
|
||||||
"position": {
|
|
||||||
"x": 2117.0429459850598,
|
|
||||||
"y": 1658.4125434513746
|
|
||||||
},
|
|
||||||
"inputs": [
|
|
||||||
{
|
|
||||||
"key": "switch",
|
|
||||||
"type": "triggerAndFinish",
|
|
||||||
"label": "",
|
|
||||||
"description": "core.module.input.description.Trigger",
|
|
||||||
"valueType": "any",
|
|
||||||
"showTargetInApp": true,
|
|
||||||
"showTargetInPlugin": true,
|
|
||||||
"connected": true
|
|
||||||
},
|
},
|
||||||
|
"version": "481",
|
||||||
|
"inputs": [],
|
||||||
|
"outputs": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeId": "x9rN2a4WnZmt",
|
||||||
|
"name": "HTTP 请求",
|
||||||
|
"intro": "向飞书发送一个webhooks通知信息。",
|
||||||
|
"avatar": "/imgs/workflow/http.png",
|
||||||
|
"flowNodeType": "httpRequest468",
|
||||||
|
"showStatus": true,
|
||||||
|
"position": {
|
||||||
|
"x": 1623.9214305901633,
|
||||||
|
"y": 22.777089001645862
|
||||||
|
},
|
||||||
|
"version": "486",
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"key": "system_addInputParam",
|
||||||
|
"renderTypeList": [
|
||||||
|
"addInputParam"
|
||||||
|
],
|
||||||
|
"valueType": "dynamic",
|
||||||
|
"label": "",
|
||||||
|
"required": false,
|
||||||
|
"description": "core.module.input.description.HTTP Dynamic Input",
|
||||||
|
"editField": {
|
||||||
|
"key": true,
|
||||||
|
"valueType": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"valueType": "string",
|
||||||
|
"renderTypeList": [
|
||||||
|
"reference"
|
||||||
|
],
|
||||||
|
"key": "text",
|
||||||
|
"label": "text",
|
||||||
|
"toolDescription": "发送的消息",
|
||||||
|
"required": true,
|
||||||
|
"canEdit": true,
|
||||||
|
"editField": {
|
||||||
|
"key": true,
|
||||||
|
"description": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "system_httpMethod",
|
||||||
|
"renderTypeList": [
|
||||||
|
"custom"
|
||||||
|
],
|
||||||
|
"valueType": "string",
|
||||||
|
"label": "",
|
||||||
|
"value": "POST",
|
||||||
|
"required": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "system_httpReqUrl",
|
||||||
|
"renderTypeList": [
|
||||||
|
"hidden"
|
||||||
|
],
|
||||||
|
"valueType": "string",
|
||||||
|
"label": "",
|
||||||
|
"description": "core.module.input.description.Http Request Url",
|
||||||
|
"placeholder": "https://api.ai.com/getInventory",
|
||||||
|
"required": false,
|
||||||
|
"value": ""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "system_httpHeader",
|
||||||
|
"renderTypeList": [
|
||||||
|
"custom"
|
||||||
|
],
|
||||||
|
"valueType": "any",
|
||||||
|
"value": [],
|
||||||
|
"label": "",
|
||||||
|
"description": "core.module.input.description.Http Request Header",
|
||||||
|
"placeholder": "core.module.input.description.Http Request Header",
|
||||||
|
"required": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "system_httpParams",
|
||||||
|
"renderTypeList": [
|
||||||
|
"hidden"
|
||||||
|
],
|
||||||
|
"valueType": "any",
|
||||||
|
"value": [],
|
||||||
|
"label": "",
|
||||||
|
"required": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "system_httpJsonBody",
|
||||||
|
"renderTypeList": [
|
||||||
|
"hidden"
|
||||||
|
],
|
||||||
|
"valueType": "any",
|
||||||
|
"value": "{\r\n \"msg_type\": \"text\",\r\n \"content\": {\r\n \"text\": \"{{text}}\"\r\n }\r\n}",
|
||||||
|
"label": "",
|
||||||
|
"required": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"id": "system_addOutputParam",
|
||||||
|
"key": "system_addOutputParam",
|
||||||
|
"type": "dynamic",
|
||||||
|
"valueType": "dynamic",
|
||||||
|
"label": "",
|
||||||
|
"editField": {
|
||||||
|
"key": true,
|
||||||
|
"valueType": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "error",
|
||||||
|
"key": "error",
|
||||||
|
"label": "请求错误",
|
||||||
|
"description": "HTTP请求错误信息,成功时返回空",
|
||||||
|
"valueType": "object",
|
||||||
|
"type": "static"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "httpRawResponse",
|
||||||
|
"key": "httpRawResponse",
|
||||||
|
"label": "原始响应",
|
||||||
|
"required": true,
|
||||||
|
"description": "HTTP请求的原始响应。只能接受字符串或JSON类型响应数据。",
|
||||||
|
"valueType": "any",
|
||||||
|
"type": "static"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeId": "aGHGqH2oUupj",
|
||||||
|
"name": "指定回复",
|
||||||
|
"intro": "该模块可以直接回复一段指定的内容。常用于引导、提示。非字符串内容传入时,会转成字符串进行输出。",
|
||||||
|
"avatar": "/imgs/workflow/reply.png",
|
||||||
|
"flowNodeType": "answerNode",
|
||||||
|
"position": {
|
||||||
|
"x": 2350.7077940158674,
|
||||||
|
"y": 107.32448732713493
|
||||||
|
},
|
||||||
|
"version": "481",
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"key": "text",
|
||||||
|
"renderTypeList": [
|
||||||
|
"textarea",
|
||||||
|
"reference"
|
||||||
|
],
|
||||||
|
"valueType": "any",
|
||||||
|
"required": true,
|
||||||
|
"label": "core.module.input.label.Response content",
|
||||||
|
"description": "core.module.input.description.Response content",
|
||||||
|
"placeholder": "core.module.input.description.Response content",
|
||||||
|
"value": "嘻嘻,发送成功"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outputs": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"edges": [
|
||||||
|
{
|
||||||
|
"source": "workflowStartNodeId",
|
||||||
|
"target": "u6IAOEssxoZT",
|
||||||
|
"sourceHandle": "workflowStartNodeId-source-right",
|
||||||
|
"targetHandle": "u6IAOEssxoZT-target-left"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": "u6IAOEssxoZT",
|
||||||
|
"target": "x9rN2a4WnZmt",
|
||||||
|
"sourceHandle": "selectedTools",
|
||||||
|
"targetHandle": "selectedTools"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": "x9rN2a4WnZmt",
|
||||||
|
"target": "fvY5hb0K646V",
|
||||||
|
"sourceHandle": "x9rN2a4WnZmt-source-right",
|
||||||
|
"targetHandle": "fvY5hb0K646V-target-left"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": "x9rN2a4WnZmt",
|
||||||
|
"target": "aGHGqH2oUupj",
|
||||||
|
"sourceHandle": "x9rN2a4WnZmt-source-right",
|
||||||
|
"targetHandle": "aGHGqH2oUupj-target-left"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"chatConfig": {
|
||||||
|
"variables": [
|
||||||
{
|
{
|
||||||
"key": "text",
|
"id": "txq1ca",
|
||||||
"type": "textarea",
|
"key": "test",
|
||||||
"valueType": "any",
|
"label": "测试",
|
||||||
"label": "core.module.input.label.Response content",
|
"type": "custom",
|
||||||
"description": "core.module.input.description.Response content",
|
"required": true,
|
||||||
"placeholder": "core.module.input.description.Response content",
|
"maxLen": 50,
|
||||||
"showTargetInApp": true,
|
"enums": [
|
||||||
"showTargetInPlugin": true,
|
{
|
||||||
"value": "笑死发送成功啦",
|
"value": ""
|
||||||
"connected": false
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"outputs": [
|
"questionGuide": false,
|
||||||
{
|
"scheduledTriggerConfig": {
|
||||||
"key": "finish",
|
"cronString": "",
|
||||||
"label": "",
|
"timezone": "Asia/Shanghai",
|
||||||
"description": "",
|
"defaultPrompt": ""
|
||||||
"valueType": "boolean",
|
},
|
||||||
"type": "hidden",
|
"_id": "66715d4bf577287d39e35ecf"
|
||||||
"targets": []
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
]
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
{{% /details %}}
|
{{% /details %}}
|
||||||
|
|||||||
@@ -192,7 +192,7 @@ export default async function (ctx: FunctionContext) {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"nodeId": "NOgbnBzUwDgT",
|
"nodeId": "NOgbnBzUwDgT",
|
||||||
"name": "工具调用(实验)",
|
"name": "工具调用",
|
||||||
"intro": "通过AI模型自动选择一个或多个功能块进行调用,也可以对插件进行调用。",
|
"intro": "通过AI模型自动选择一个或多个功能块进行调用,也可以对插件进行调用。",
|
||||||
"avatar": "/imgs/workflow/tool.svg",
|
"avatar": "/imgs/workflow/tool.svg",
|
||||||
"flowNodeType": "tools",
|
"flowNodeType": "tools",
|
||||||
|
|||||||
@@ -436,7 +436,7 @@ HTTP模块中,需要设置 3 个工具参数:
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"nodeId": "fYxwWym8flYL",
|
"nodeId": "fYxwWym8flYL",
|
||||||
"name": "工具调用(实验)",
|
"name": "工具调用",
|
||||||
"intro": "通过AI模型自动选择一个或多个功能块进行调用,也可以对插件进行调用。",
|
"intro": "通过AI模型自动选择一个或多个功能块进行调用,也可以对插件进行调用。",
|
||||||
"avatar": "/imgs/workflow/tool.svg",
|
"avatar": "/imgs/workflow/tool.svg",
|
||||||
"flowNodeType": "tools",
|
"flowNodeType": "tools",
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ weight: 301
|
|||||||
|
|
||||||
FastGPT 从 V4 版本开始采用新的交互方式来构建 AI 应用。使用了 Flow 节点编排(工作流)的方式来实现复杂工作流,提高可玩性和扩展性。但同时也提高了上手的门槛,有一定开发背景的用户使用起来会比较容易。
|
FastGPT 从 V4 版本开始采用新的交互方式来构建 AI 应用。使用了 Flow 节点编排(工作流)的方式来实现复杂工作流,提高可玩性和扩展性。但同时也提高了上手的门槛,有一定开发背景的用户使用起来会比较容易。
|
||||||
|
|
||||||
[查看视频教程](https://www.bilibili.com/video/BV1aB4y1Z7Hy/?spm_id_from=333.999.list.card_archive.click&vd_source=903c2b09b7412037c2eddc6a8fb9828b)
|
[查看视频教程](https://www.bilibili.com/video/BV1is421u7bQ/)
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|||||||
@@ -114,15 +114,15 @@ services:
|
|||||||
# fastgpt
|
# fastgpt
|
||||||
sandbox:
|
sandbox:
|
||||||
container_name: sandbox
|
container_name: sandbox
|
||||||
image: ghcr.io/labring/fastgpt-sandbox:v4.8.4 # git
|
image: ghcr.io/labring/fastgpt-sandbox:latest # git
|
||||||
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-sandbox:v4.8.4 # 阿里云
|
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-sandbox:latest # 阿里云
|
||||||
networks:
|
networks:
|
||||||
- fastgpt
|
- fastgpt
|
||||||
restart: always
|
restart: always
|
||||||
fastgpt:
|
fastgpt:
|
||||||
container_name: fastgpt
|
container_name: fastgpt
|
||||||
image: ghcr.io/labring/fastgpt:v4.8.4 # git
|
image: ghcr.io/labring/fastgpt:v4.8.6 # git
|
||||||
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.8.4 # 阿里云
|
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.8.6 # 阿里云
|
||||||
ports:
|
ports:
|
||||||
- 3000:3000
|
- 3000:3000
|
||||||
networks:
|
networks:
|
||||||
@@ -156,12 +156,14 @@ services:
|
|||||||
- SANDBOX_URL=http://sandbox:3000
|
- SANDBOX_URL=http://sandbox:3000
|
||||||
# 日志等级: debug, info, warn, error
|
# 日志等级: debug, info, warn, error
|
||||||
- LOG_LEVEL=info
|
- LOG_LEVEL=info
|
||||||
|
- STORE_LOG_LEVEL=warn
|
||||||
volumes:
|
volumes:
|
||||||
- ./config.json:/app/data/config.json
|
- ./config.json:/app/data/config.json
|
||||||
|
|
||||||
# oneapi
|
# oneapi
|
||||||
mysql:
|
mysql:
|
||||||
image: mysql:8.0.36
|
image: registry.cn-hangzhou.aliyuncs.com/fastgpt/mysql:8.0.36 # 阿里云
|
||||||
|
# image: mysql:8.0.36
|
||||||
container_name: mysql
|
container_name: mysql
|
||||||
restart: always
|
restart: always
|
||||||
ports:
|
ports:
|
||||||
@@ -178,6 +180,7 @@ services:
|
|||||||
oneapi:
|
oneapi:
|
||||||
container_name: oneapi
|
container_name: oneapi
|
||||||
image: ghcr.io/songquanpeng/one-api:latest
|
image: ghcr.io/songquanpeng/one-api:latest
|
||||||
|
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/one-api:v0.6.6 # 阿里云
|
||||||
ports:
|
ports:
|
||||||
- 3001:3000
|
- 3001:3000
|
||||||
depends_on:
|
depends_on:
|
||||||
|
|||||||
@@ -72,15 +72,15 @@ services:
|
|||||||
# fastgpt
|
# fastgpt
|
||||||
sandbox:
|
sandbox:
|
||||||
container_name: sandbox
|
container_name: sandbox
|
||||||
image: ghcr.io/labring/fastgpt-sandbox:v4.8.4 # git
|
image: ghcr.io/labring/fastgpt-sandbox:latest # git
|
||||||
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-sandbox:v4.8.4 # 阿里云
|
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-sandbox:latest # 阿里云
|
||||||
networks:
|
networks:
|
||||||
- fastgpt
|
- fastgpt
|
||||||
restart: always
|
restart: always
|
||||||
fastgpt:
|
fastgpt:
|
||||||
container_name: fastgpt
|
container_name: fastgpt
|
||||||
image: ghcr.io/labring/fastgpt:v4.8.4 # git
|
image: ghcr.io/labring/fastgpt:v4.8.6 # git
|
||||||
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.8.4 # 阿里云
|
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.8.6 # 阿里云
|
||||||
ports:
|
ports:
|
||||||
- 3000:3000
|
- 3000:3000
|
||||||
networks:
|
networks:
|
||||||
@@ -113,11 +113,13 @@ services:
|
|||||||
- SANDBOX_URL=http://sandbox:3000
|
- SANDBOX_URL=http://sandbox:3000
|
||||||
# 日志等级: debug, info, warn, error
|
# 日志等级: debug, info, warn, error
|
||||||
- LOG_LEVEL=info
|
- LOG_LEVEL=info
|
||||||
|
- STORE_LOG_LEVEL=warn
|
||||||
volumes:
|
volumes:
|
||||||
- ./config.json:/app/data/config.json
|
- ./config.json:/app/data/config.json
|
||||||
|
|
||||||
# oneapi
|
# oneapi
|
||||||
mysql:
|
mysql:
|
||||||
|
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/mysql:8.0.36 # 阿里云
|
||||||
image: mysql:8.0.36
|
image: mysql:8.0.36
|
||||||
container_name: mysql
|
container_name: mysql
|
||||||
restart: always
|
restart: always
|
||||||
@@ -135,6 +137,7 @@ services:
|
|||||||
oneapi:
|
oneapi:
|
||||||
container_name: oneapi
|
container_name: oneapi
|
||||||
image: ghcr.io/songquanpeng/one-api:latest
|
image: ghcr.io/songquanpeng/one-api:latest
|
||||||
|
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/one-api:v0.6.6 # 阿里云
|
||||||
ports:
|
ports:
|
||||||
- 3001:3000
|
- 3001:3000
|
||||||
depends_on:
|
depends_on:
|
||||||
|
|||||||
@@ -53,15 +53,15 @@ services:
|
|||||||
wait $$!
|
wait $$!
|
||||||
sandbox:
|
sandbox:
|
||||||
container_name: sandbox
|
container_name: sandbox
|
||||||
image: ghcr.io/labring/fastgpt-sandbox:v4.8.4 # git
|
image: ghcr.io/labring/fastgpt-sandbox:latest # git
|
||||||
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-sandbox:v4.8.4 # 阿里云
|
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-sandbox:latest # 阿里云
|
||||||
networks:
|
networks:
|
||||||
- fastgpt
|
- fastgpt
|
||||||
restart: always
|
restart: always
|
||||||
fastgpt:
|
fastgpt:
|
||||||
container_name: fastgpt
|
container_name: fastgpt
|
||||||
image: ghcr.io/labring/fastgpt:v4.8.4 # git
|
image: ghcr.io/labring/fastgpt:v4.8.6 # git
|
||||||
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.8.4 # 阿里云
|
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.8.6 # 阿里云
|
||||||
ports:
|
ports:
|
||||||
- 3000:3000
|
- 3000:3000
|
||||||
networks:
|
networks:
|
||||||
@@ -94,12 +94,14 @@ services:
|
|||||||
- SANDBOX_URL=http://sandbox:3000
|
- SANDBOX_URL=http://sandbox:3000
|
||||||
# 日志等级: debug, info, warn, error
|
# 日志等级: debug, info, warn, error
|
||||||
- LOG_LEVEL=info
|
- LOG_LEVEL=info
|
||||||
|
- STORE_LOG_LEVEL=warn
|
||||||
volumes:
|
volumes:
|
||||||
- ./config.json:/app/data/config.json
|
- ./config.json:/app/data/config.json
|
||||||
|
|
||||||
# oneapi
|
# oneapi
|
||||||
mysql:
|
mysql:
|
||||||
image: mysql:8.0.36
|
image: registry.cn-hangzhou.aliyuncs.com/fastgpt/mysql:8.0.36 # 阿里云
|
||||||
|
# image: mysql:8.0.36
|
||||||
container_name: mysql
|
container_name: mysql
|
||||||
restart: always
|
restart: always
|
||||||
ports:
|
ports:
|
||||||
@@ -116,6 +118,7 @@ services:
|
|||||||
oneapi:
|
oneapi:
|
||||||
container_name: oneapi
|
container_name: oneapi
|
||||||
image: ghcr.io/songquanpeng/one-api:latest
|
image: ghcr.io/songquanpeng/one-api:latest
|
||||||
|
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/one-api:v0.6.6 # 阿里云
|
||||||
ports:
|
ports:
|
||||||
- 3001:3000
|
- 3001:3000
|
||||||
depends_on:
|
depends_on:
|
||||||
|
|||||||
22
package.json
22
package.json
@@ -14,25 +14,19 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@chakra-ui/cli": "^2.4.1",
|
"@chakra-ui/cli": "^2.4.1",
|
||||||
"husky": "^8.0.3",
|
"husky": "^8.0.3",
|
||||||
"i18next": "23.10.0",
|
"lint-staged": "^13.3.0",
|
||||||
"lint-staged": "^13.2.1",
|
"i18next": "23.11.5",
|
||||||
"next-i18next": "15.2.0",
|
"next-i18next": "15.3.0",
|
||||||
|
"react-i18next": "14.1.2",
|
||||||
"prettier": "3.2.4",
|
"prettier": "3.2.4",
|
||||||
"react-i18next": "13.5.0",
|
"zhlint": "^0.7.4"
|
||||||
"zhlint": "^0.7.1"
|
|
||||||
},
|
|
||||||
"resolutions": {
|
|
||||||
"react": "18.3.1",
|
|
||||||
"react-dom": "18.3.1",
|
|
||||||
"@types/react": "18.3.0",
|
|
||||||
"@types/react-dom": "18.3.0"
|
|
||||||
},
|
},
|
||||||
"lint-staged": {
|
"lint-staged": {
|
||||||
"./**/**/*.{ts,tsx,scss}": "npm run format-code",
|
"./**/**/*.{ts,tsx,scss}": "npm run format-code",
|
||||||
"./docSite/**/**/*.md": "npm run format-doc"
|
"./docSite/**/**/*.md": "npm run format-doc"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=18.0.0",
|
"node": ">=18.16.0",
|
||||||
"pnpm": ">=8.6.0"
|
"pnpm": ">=9.0.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4,7 +4,9 @@ import { ErrType } from '../errorCode';
|
|||||||
const startCode = 507000;
|
const startCode = 507000;
|
||||||
export enum CommonErrEnum {
|
export enum CommonErrEnum {
|
||||||
fileNotFound = 'fileNotFound',
|
fileNotFound = 'fileNotFound',
|
||||||
unAuthFile = 'unAuthFile'
|
unAuthFile = 'unAuthFile',
|
||||||
|
missingParams = 'missingParams',
|
||||||
|
inheritPermissionError = 'inheritPermissionError'
|
||||||
}
|
}
|
||||||
const datasetErr = [
|
const datasetErr = [
|
||||||
{
|
{
|
||||||
@@ -14,6 +16,14 @@ const datasetErr = [
|
|||||||
{
|
{
|
||||||
statusText: CommonErrEnum.unAuthFile,
|
statusText: CommonErrEnum.unAuthFile,
|
||||||
message: 'error.unAuthFile'
|
message: 'error.unAuthFile'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
statusText: CommonErrEnum.missingParams,
|
||||||
|
message: 'error.missingParams'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
statusText: CommonErrEnum.inheritPermissionError,
|
||||||
|
message: 'error.inheritPermissionError'
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
export default datasetErr.reduce((acc, cur, index) => {
|
export default datasetErr.reduce((acc, cur, index) => {
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import { ErrType } from '../errorCode';
|
|||||||
|
|
||||||
/* dataset: 501000 */
|
/* dataset: 501000 */
|
||||||
export enum DatasetErrEnum {
|
export enum DatasetErrEnum {
|
||||||
|
unExist = 'unExistDataset',
|
||||||
unAuthDataset = 'unAuthDataset',
|
unAuthDataset = 'unAuthDataset',
|
||||||
unCreateCollection = 'unCreateCollection',
|
unCreateCollection = 'unCreateCollection',
|
||||||
unAuthDatasetCollection = 'unAuthDatasetCollection',
|
unAuthDatasetCollection = 'unAuthDatasetCollection',
|
||||||
@@ -11,6 +12,10 @@ export enum DatasetErrEnum {
|
|||||||
unLinkCollection = 'unLinkCollection'
|
unLinkCollection = 'unLinkCollection'
|
||||||
}
|
}
|
||||||
const datasetErr = [
|
const datasetErr = [
|
||||||
|
{
|
||||||
|
statusText: DatasetErrEnum.unExist,
|
||||||
|
message: 'core.dataset.error.unExistDataset'
|
||||||
|
},
|
||||||
{
|
{
|
||||||
statusText: DatasetErrEnum.unAuthDataset,
|
statusText: DatasetErrEnum.unAuthDataset,
|
||||||
message: 'core.dataset.error.unAuthDataset'
|
message: 'core.dataset.error.unAuthDataset'
|
||||||
|
|||||||
@@ -53,4 +53,5 @@ export const uniqueImageTypeList = Object.entries(mongoImageTypeMap)
|
|||||||
|
|
||||||
export const FolderIcon = 'file/fill/folder';
|
export const FolderIcon = 'file/fill/folder';
|
||||||
export const FolderImgUrl = '/imgs/files/folder.svg';
|
export const FolderImgUrl = '/imgs/files/folder.svg';
|
||||||
|
export const HttpPluginImgUrl = '/imgs/app/httpPluginFill.svg';
|
||||||
export const HttpImgUrl = '/imgs/workflow/http.png';
|
export const HttpImgUrl = '/imgs/workflow/http.png';
|
||||||
|
|||||||
1
packages/global/common/file/image/type.d.ts
vendored
1
packages/global/common/file/image/type.d.ts
vendored
@@ -9,6 +9,7 @@ export type MongoImageSchemaType = {
|
|||||||
type: `${MongoImageTypeEnum}`;
|
type: `${MongoImageTypeEnum}`;
|
||||||
|
|
||||||
metadata?: {
|
metadata?: {
|
||||||
|
mime?: string; // image mime type.
|
||||||
relatedId?: string; // This id is associated with a set of images
|
relatedId?: string; // This id is associated with a set of images
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -350,7 +350,7 @@ export const splitText2Chunks = (props: SplitProps): SplitResponse => {
|
|||||||
|
|
||||||
return commonSplit(props);
|
return commonSplit(props);
|
||||||
});
|
});
|
||||||
console.log(Date.now() - start);
|
|
||||||
return {
|
return {
|
||||||
chunks: splitResult.map((item) => item.chunks).flat(),
|
chunks: splitResult.map((item) => item.chunks).flat(),
|
||||||
chars: splitResult.reduce((sum, item) => sum + item.chars, 0)
|
chars: splitResult.reduce((sum, item) => sum + item.chars, 0)
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import dayjs from 'dayjs';
|
import dayjs from 'dayjs';
|
||||||
import cronParser from 'cron-parser';
|
import cronParser from 'cron-parser';
|
||||||
|
|
||||||
|
export const formatTime2YMDHMW = (time?: Date) => dayjs(time).format('YYYY-MM-DD HH:mm:ss dddd');
|
||||||
export const formatTime2YMDHM = (time?: Date) =>
|
export const formatTime2YMDHM = (time?: Date) =>
|
||||||
time ? dayjs(time).format('YYYY-MM-DD HH:mm') : '';
|
time ? dayjs(time).format('YYYY-MM-DD HH:mm') : '';
|
||||||
export const formatTime2YMD = (time?: Date) => (time ? dayjs(time).format('YYYY-MM-DD') : '');
|
export const formatTime2YMD = (time?: Date) => (time ? dayjs(time).format('YYYY-MM-DD') : '');
|
||||||
|
|||||||
@@ -67,6 +67,14 @@ export const getNanoid = (size = 12) => {
|
|||||||
/* Custom text to reg, need to replace special chats */
|
/* Custom text to reg, need to replace special chats */
|
||||||
export const replaceRegChars = (text: string) => text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
export const replaceRegChars = (text: string) => text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
||||||
|
|
||||||
|
export const getRegQueryStr = (text: string, flags = 'i') => {
|
||||||
|
const formatText = replaceRegChars(text);
|
||||||
|
const chars = formatText.split('');
|
||||||
|
const regexPattern = chars.join('.*');
|
||||||
|
|
||||||
|
return new RegExp(regexPattern, flags);
|
||||||
|
};
|
||||||
|
|
||||||
/* slice json str */
|
/* slice json str */
|
||||||
export const sliceJsonStr = (str: string) => {
|
export const sliceJsonStr = (str: string) => {
|
||||||
str = str.replace(/(\\n|\\)/g, '').replace(/ /g, '');
|
str = str.replace(/(\\n|\\)/g, '').replace(/ /g, '');
|
||||||
|
|||||||
@@ -70,9 +70,3 @@ export type SystemEnvType = {
|
|||||||
oneapiUrl?: string;
|
oneapiUrl?: string;
|
||||||
chatApiKey?: string;
|
chatApiKey?: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
// declare global {
|
|
||||||
// var feConfigs: FastGPTFeConfigsType;
|
|
||||||
// var systemEnv: SystemEnvType;
|
|
||||||
// var systemInitd: boolean;
|
|
||||||
// }
|
|
||||||
|
|||||||
@@ -100,7 +100,7 @@ export const Prompt_QuotePromptList: PromptTemplateItem[] = [
|
|||||||
|
|
||||||
<QA>
|
<QA>
|
||||||
{{quote}}
|
{{quote}}
|
||||||
</QA>}
|
</QA>
|
||||||
|
|
||||||
思考流程:
|
思考流程:
|
||||||
1. 判断问题是否与 <QA></QA> 标记中的内容有关。
|
1. 判断问题是否与 <QA></QA> 标记中的内容有关。
|
||||||
@@ -109,7 +109,12 @@ export const Prompt_QuotePromptList: PromptTemplateItem[] = [
|
|||||||
4. 如果有相同的问题,直接输出对应答案。
|
4. 如果有相同的问题,直接输出对应答案。
|
||||||
5. 如果只有相近的问题,请把相近的问题和答案一起输出。
|
5. 如果只有相近的问题,请把相近的问题和答案一起输出。
|
||||||
|
|
||||||
最后,避免提及你是从 QA 获取的知识,只需要回复答案。
|
回答要求:
|
||||||
|
- 如果没有相关的问答对,你需要澄清。
|
||||||
|
- 回答的内容应尽可能与 <QA></QA> 标记中的内容一致。
|
||||||
|
- 避免提及你是从 QA 获取的知识,只需要回复答案。
|
||||||
|
- 使用 Markdown 语法优化回答格式。
|
||||||
|
- 使用与问题相同的语言回答。
|
||||||
|
|
||||||
问题:"""{{question}}"""`
|
问题:"""{{question}}"""`
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ A2:
|
|||||||
|
|
||||||
<Context>
|
<Context>
|
||||||
{{text}}
|
{{text}}
|
||||||
<Context/>
|
</Context>
|
||||||
`
|
`
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -3,19 +3,12 @@ import { AppTTSConfigType, AppWhisperConfigType } from './type';
|
|||||||
export enum AppTypeEnum {
|
export enum AppTypeEnum {
|
||||||
folder = 'folder',
|
folder = 'folder',
|
||||||
simple = 'simple',
|
simple = 'simple',
|
||||||
advanced = 'advanced'
|
workflow = 'advanced',
|
||||||
|
plugin = 'plugin',
|
||||||
|
httpPlugin = 'httpPlugin'
|
||||||
}
|
}
|
||||||
export const AppTypeMap = {
|
|
||||||
[AppTypeEnum.folder]: {
|
export const AppFolderTypeList = [AppTypeEnum.folder, AppTypeEnum.httpPlugin];
|
||||||
label: 'folder'
|
|
||||||
},
|
|
||||||
[AppTypeEnum.simple]: {
|
|
||||||
label: 'simple'
|
|
||||||
},
|
|
||||||
[AppTypeEnum.advanced]: {
|
|
||||||
label: 'advanced'
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
export const defaultTTSConfig: AppTTSConfigType = { type: 'web' };
|
export const defaultTTSConfig: AppTTSConfigType = { type: 'web' };
|
||||||
|
|
||||||
|
|||||||
24
packages/global/core/app/controller.d.ts
vendored
Normal file
24
packages/global/core/app/controller.d.ts
vendored
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
import { ParentIdType } from 'common/parentFolder/type';
|
||||||
|
import { AppSchema } from './type';
|
||||||
|
import { AppTypeEnum } from './constants';
|
||||||
|
|
||||||
|
export type CreateAppProps = {
|
||||||
|
parentId?: ParentIdType;
|
||||||
|
name?: string;
|
||||||
|
avatar?: string;
|
||||||
|
intro?: string;
|
||||||
|
type?: AppTypeEnum;
|
||||||
|
modules: AppSchema['modules'];
|
||||||
|
edges?: AppSchema['edges'];
|
||||||
|
};
|
||||||
|
export type CreateHttpPluginChildrenPros = Omit<CreateAppProps, 'type'> & {
|
||||||
|
parentId: ParentIdType;
|
||||||
|
name: string;
|
||||||
|
intro: string;
|
||||||
|
avatar: string;
|
||||||
|
modules: AppSchema['modules'];
|
||||||
|
edges: AppSchema['edges'];
|
||||||
|
pluginData: {
|
||||||
|
pluginUniId: string;
|
||||||
|
};
|
||||||
|
};
|
||||||
@@ -2,19 +2,20 @@ import { getNanoid } from '../../../common/string/tools';
|
|||||||
import { OpenApiJsonSchema } from './type';
|
import { OpenApiJsonSchema } from './type';
|
||||||
import yaml from 'js-yaml';
|
import yaml from 'js-yaml';
|
||||||
import { OpenAPIV3 } from 'openapi-types';
|
import { OpenAPIV3 } from 'openapi-types';
|
||||||
import { PluginTypeEnum } from '../constants';
|
import { FlowNodeInputItemType, FlowNodeOutputItemType } from '../../workflow/type/io';
|
||||||
import { FlowNodeInputItemType, FlowNodeOutputItemType } from '../../workflow/type/io.d';
|
|
||||||
import { FlowNodeInputTypeEnum, FlowNodeOutputTypeEnum } from '../../workflow/node/constant';
|
import { FlowNodeInputTypeEnum, FlowNodeOutputTypeEnum } from '../../workflow/node/constant';
|
||||||
import { NodeInputKeyEnum, WorkflowIOValueTypeEnum } from '../../workflow/constants';
|
import { WorkflowIOValueTypeEnum } from '../../workflow/constants';
|
||||||
import { PluginInputModule } from '../../workflow/template/system/pluginInput';
|
import { PluginInputModule } from '../../workflow/template/system/pluginInput';
|
||||||
import { PluginOutputModule } from '../../workflow/template/system/pluginOutput';
|
import { PluginOutputModule } from '../../workflow/template/system/pluginOutput';
|
||||||
import { HttpModule468 } from '../../workflow/template/system/http468';
|
import { HttpNode468 } from '../../workflow/template/system/http468';
|
||||||
import { HttpParamAndHeaderItemType } from '../../workflow/api';
|
import { HttpParamAndHeaderItemType } from '../../workflow/api';
|
||||||
import { CreateOnePluginParams } from '../controller';
|
import { StoreNodeItemType } from '../../workflow/type/node';
|
||||||
import { StoreNodeItemType } from '../../workflow/type';
|
|
||||||
import { HttpImgUrl } from '../../../common/file/image/constants';
|
import { HttpImgUrl } from '../../../common/file/image/constants';
|
||||||
import SwaggerParser from '@apidevtools/swagger-parser';
|
import SwaggerParser from '@apidevtools/swagger-parser';
|
||||||
import { getHandleId } from '../../../core/workflow/utils';
|
import { getHandleId } from '../../workflow/utils';
|
||||||
|
import { CreateHttpPluginChildrenPros } from '../controller';
|
||||||
|
import { AppTypeEnum } from '../constants';
|
||||||
|
import type { StoreEdgeItemType } from '../../workflow/type/edge';
|
||||||
|
|
||||||
export const str2OpenApiSchema = async (yamlStr = ''): Promise<OpenApiJsonSchema> => {
|
export const str2OpenApiSchema = async (yamlStr = ''): Promise<OpenApiJsonSchema> => {
|
||||||
try {
|
try {
|
||||||
@@ -89,7 +90,7 @@ export const httpApiSchema2Plugins = async ({
|
|||||||
parentId: string;
|
parentId: string;
|
||||||
apiSchemaStr?: string;
|
apiSchemaStr?: string;
|
||||||
customHeader?: string;
|
customHeader?: string;
|
||||||
}): Promise<CreateOnePluginParams[]> => {
|
}): Promise<CreateHttpPluginChildrenPros[]> => {
|
||||||
const jsonSchema = await str2OpenApiSchema(apiSchemaStr);
|
const jsonSchema = await str2OpenApiSchema(apiSchemaStr);
|
||||||
|
|
||||||
const baseUrl = jsonSchema.serverPath;
|
const baseUrl = jsonSchema.serverPath;
|
||||||
@@ -115,16 +116,7 @@ export const httpApiSchema2Plugins = async ({
|
|||||||
required: param.required,
|
required: param.required,
|
||||||
description: param.description,
|
description: param.description,
|
||||||
toolDescription: param.description,
|
toolDescription: param.description,
|
||||||
canEdit: true,
|
canEdit: true
|
||||||
editField: {
|
|
||||||
key: true,
|
|
||||||
name: true,
|
|
||||||
description: true,
|
|
||||||
required: true,
|
|
||||||
dataType: true,
|
|
||||||
inputType: true,
|
|
||||||
isToolInput: true
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
}) || []),
|
}) || []),
|
||||||
...(propsKeys?.map((key) => {
|
...(propsKeys?.map((key) => {
|
||||||
@@ -137,16 +129,7 @@ export const httpApiSchema2Plugins = async ({
|
|||||||
required: false,
|
required: false,
|
||||||
description: prop.description,
|
description: prop.description,
|
||||||
toolDescription: prop.description,
|
toolDescription: prop.description,
|
||||||
canEdit: true,
|
canEdit: true
|
||||||
editField: {
|
|
||||||
key: true,
|
|
||||||
name: true,
|
|
||||||
description: true,
|
|
||||||
required: true,
|
|
||||||
dataType: true,
|
|
||||||
inputType: true,
|
|
||||||
isToolInput: true
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
}) || [])
|
}) || [])
|
||||||
];
|
];
|
||||||
@@ -185,10 +168,6 @@ export const httpApiSchema2Plugins = async ({
|
|||||||
label: param.name,
|
label: param.name,
|
||||||
renderTypeList: [FlowNodeInputTypeEnum.reference],
|
renderTypeList: [FlowNodeInputTypeEnum.reference],
|
||||||
canEdit: true,
|
canEdit: true,
|
||||||
editField: {
|
|
||||||
key: true,
|
|
||||||
valueType: true
|
|
||||||
},
|
|
||||||
value: [pluginInputId, inputIdMap.get(param.name)]
|
value: [pluginInputId, inputIdMap.get(param.name)]
|
||||||
};
|
};
|
||||||
}) || []),
|
}) || []),
|
||||||
@@ -199,10 +178,6 @@ export const httpApiSchema2Plugins = async ({
|
|||||||
label: key,
|
label: key,
|
||||||
renderTypeList: [FlowNodeInputTypeEnum.reference],
|
renderTypeList: [FlowNodeInputTypeEnum.reference],
|
||||||
canEdit: true,
|
canEdit: true,
|
||||||
editField: {
|
|
||||||
key: true,
|
|
||||||
valueType: true
|
|
||||||
},
|
|
||||||
value: [pluginInputId, inputIdMap.get(key)]
|
value: [pluginInputId, inputIdMap.get(key)]
|
||||||
};
|
};
|
||||||
}) || [])
|
}) || [])
|
||||||
@@ -270,7 +245,7 @@ export const httpApiSchema2Plugins = async ({
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Combine complete modules */
|
/* Combine complete modules */
|
||||||
const modules: StoreNodeItemType[] = [
|
const nodes: StoreNodeItemType[] = [
|
||||||
{
|
{
|
||||||
nodeId: pluginInputId,
|
nodeId: pluginInputId,
|
||||||
name: PluginInputModule.name,
|
name: PluginInputModule.name,
|
||||||
@@ -279,8 +254,8 @@ export const httpApiSchema2Plugins = async ({
|
|||||||
flowNodeType: PluginInputModule.flowNodeType,
|
flowNodeType: PluginInputModule.flowNodeType,
|
||||||
showStatus: PluginInputModule.showStatus,
|
showStatus: PluginInputModule.showStatus,
|
||||||
position: {
|
position: {
|
||||||
x: 616.4226348688949,
|
x: 473.55206291900333,
|
||||||
y: -165.05298493910115
|
y: -145.65080850146154
|
||||||
},
|
},
|
||||||
version: PluginInputModule.version,
|
version: PluginInputModule.version,
|
||||||
inputs: pluginInputs,
|
inputs: pluginInputs,
|
||||||
@@ -294,8 +269,8 @@ export const httpApiSchema2Plugins = async ({
|
|||||||
flowNodeType: PluginOutputModule.flowNodeType,
|
flowNodeType: PluginOutputModule.flowNodeType,
|
||||||
showStatus: PluginOutputModule.showStatus,
|
showStatus: PluginOutputModule.showStatus,
|
||||||
position: {
|
position: {
|
||||||
x: 1607.7142331269126,
|
x: 1847.5956872650024,
|
||||||
y: -151.8669210746189
|
y: 5.114324648101558
|
||||||
},
|
},
|
||||||
version: PluginOutputModule.version,
|
version: PluginOutputModule.version,
|
||||||
inputs: [
|
inputs: [
|
||||||
@@ -307,11 +282,6 @@ export const httpApiSchema2Plugins = async ({
|
|||||||
required: false,
|
required: false,
|
||||||
description: '',
|
description: '',
|
||||||
canEdit: true,
|
canEdit: true,
|
||||||
editField: {
|
|
||||||
key: true,
|
|
||||||
description: true,
|
|
||||||
valueType: true
|
|
||||||
},
|
|
||||||
value: [httpId, 'httpRawResponse']
|
value: [httpId, 'httpRawResponse']
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -327,29 +297,18 @@ export const httpApiSchema2Plugins = async ({
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
nodeId: httpId,
|
nodeId: httpId,
|
||||||
name: HttpModule468.name,
|
name: HttpNode468.name,
|
||||||
intro: HttpModule468.intro,
|
intro: HttpNode468.intro,
|
||||||
avatar: HttpModule468.avatar,
|
avatar: HttpNode468.avatar,
|
||||||
flowNodeType: HttpModule468.flowNodeType,
|
flowNodeType: HttpNode468.flowNodeType,
|
||||||
showStatus: true,
|
showStatus: true,
|
||||||
position: {
|
position: {
|
||||||
x: 1042.549746602742,
|
x: 1188.947986995841,
|
||||||
y: -447.77496332641647
|
y: -473.52694296182904
|
||||||
},
|
},
|
||||||
version: HttpModule468.version,
|
version: HttpNode468.version,
|
||||||
inputs: [
|
inputs: [
|
||||||
{
|
HttpNode468.inputs[0],
|
||||||
key: NodeInputKeyEnum.addInputParam,
|
|
||||||
renderTypeList: [FlowNodeInputTypeEnum.addInputParam],
|
|
||||||
valueType: WorkflowIOValueTypeEnum.dynamic,
|
|
||||||
label: '',
|
|
||||||
required: false,
|
|
||||||
description: 'core.module.input.description.HTTP Dynamic Input',
|
|
||||||
editField: {
|
|
||||||
key: true,
|
|
||||||
valueType: true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
...httpInputs,
|
...httpInputs,
|
||||||
{
|
{
|
||||||
key: 'system_httpMethod',
|
key: 'system_httpMethod',
|
||||||
@@ -396,11 +355,11 @@ export const httpApiSchema2Plugins = async ({
|
|||||||
required: false
|
required: false
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
outputs: HttpModule468.outputs
|
outputs: HttpNode468.outputs
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
const edges = [
|
const edges: StoreEdgeItemType[] = [
|
||||||
{
|
{
|
||||||
source: pluginInputId,
|
source: pluginInputId,
|
||||||
target: httpId,
|
target: httpId,
|
||||||
@@ -420,9 +379,12 @@ export const httpApiSchema2Plugins = async ({
|
|||||||
avatar: HttpImgUrl,
|
avatar: HttpImgUrl,
|
||||||
intro: item.description,
|
intro: item.description,
|
||||||
parentId,
|
parentId,
|
||||||
type: PluginTypeEnum.http,
|
type: AppTypeEnum.plugin,
|
||||||
modules,
|
modules: nodes,
|
||||||
edges
|
edges,
|
||||||
|
pluginData: {
|
||||||
|
pluginUniId: item.name
|
||||||
|
}
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
10
packages/global/core/app/plugin/utils.ts
Normal file
10
packages/global/core/app/plugin/utils.ts
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
import { StoreNodeItemType } from '../../workflow/type/node';
|
||||||
|
import { FlowNodeInputItemType } from '../../workflow/type/io';
|
||||||
|
import { FlowNodeTypeEnum } from '../../workflow/node/constant';
|
||||||
|
|
||||||
|
export const getPluginInputsFromStoreNodes = (nodes: StoreNodeItemType[]) => {
|
||||||
|
return nodes.find((node) => node.flowNodeType === FlowNodeTypeEnum.pluginInput)?.inputs || [];
|
||||||
|
};
|
||||||
|
export const getPluginRunContent = (e: { pluginInputs: FlowNodeInputItemType[] }) => {
|
||||||
|
return JSON.stringify(e);
|
||||||
|
};
|
||||||
22
packages/global/core/app/type.d.ts
vendored
22
packages/global/core/app/type.d.ts
vendored
@@ -1,4 +1,4 @@
|
|||||||
import type { FlowNodeTemplateType, StoreNodeItemType } from '../workflow/type';
|
import type { FlowNodeTemplateType, StoreNodeItemType } from '../workflow/type/node';
|
||||||
import { AppTypeEnum } from './constants';
|
import { AppTypeEnum } from './constants';
|
||||||
import { PermissionTypeEnum } from '../../support/permission/constant';
|
import { PermissionTypeEnum } from '../../support/permission/constant';
|
||||||
import { VariableInputEnum } from '../workflow/constants';
|
import { VariableInputEnum } from '../workflow/constants';
|
||||||
@@ -6,7 +6,7 @@ import { SelectedDatasetType } from '../workflow/api';
|
|||||||
import { DatasetSearchModeEnum } from '../dataset/constants';
|
import { DatasetSearchModeEnum } from '../dataset/constants';
|
||||||
import { TeamTagSchema as TeamTagsSchemaType } from '@fastgpt/global/support/user/team/type.d';
|
import { TeamTagSchema as TeamTagsSchemaType } from '@fastgpt/global/support/user/team/type.d';
|
||||||
import { StoreEdgeItemType } from '../workflow/type/edge';
|
import { StoreEdgeItemType } from '../workflow/type/edge';
|
||||||
import { PermissionValueType } from '../../support/permission/type';
|
import { PermissionSchemaType, PermissionValueType } from '../../support/permission/type';
|
||||||
import { AppPermission } from '../../support/permission/app/controller';
|
import { AppPermission } from '../../support/permission/app/controller';
|
||||||
import { ParentIdType } from '../../common/parentFolder/type';
|
import { ParentIdType } from '../../common/parentFolder/type';
|
||||||
|
|
||||||
@@ -21,10 +21,17 @@ export type AppSchema = {
|
|||||||
name: string;
|
name: string;
|
||||||
avatar: string;
|
avatar: string;
|
||||||
intro: string;
|
intro: string;
|
||||||
updateTime: number;
|
|
||||||
|
updateTime: Date;
|
||||||
|
|
||||||
modules: StoreNodeItemType[];
|
modules: StoreNodeItemType[];
|
||||||
edges: StoreEdgeItemType[];
|
edges: StoreEdgeItemType[];
|
||||||
|
pluginData?: {
|
||||||
|
nodeVersion?: string;
|
||||||
|
pluginUniId?: string; // plugin unique id(plugin name)
|
||||||
|
apiSchemaStr?: string; // api schema string
|
||||||
|
customHeaders?: string;
|
||||||
|
};
|
||||||
|
|
||||||
// App system config
|
// App system config
|
||||||
chatConfig: AppChatConfigType;
|
chatConfig: AppChatConfigType;
|
||||||
@@ -33,18 +40,19 @@ export type AppSchema = {
|
|||||||
|
|
||||||
inited?: boolean;
|
inited?: boolean;
|
||||||
teamTags: string[];
|
teamTags: string[];
|
||||||
defaultPermission: PermissionValueType;
|
} & PermissionSchemaType;
|
||||||
};
|
|
||||||
|
|
||||||
export type AppListItemType = {
|
export type AppListItemType = {
|
||||||
_id: string;
|
_id: string;
|
||||||
|
tmbId: string;
|
||||||
name: string;
|
name: string;
|
||||||
avatar: string;
|
avatar: string;
|
||||||
intro: string;
|
intro: string;
|
||||||
type: AppTypeEnum;
|
type: AppTypeEnum;
|
||||||
defaultPermission: PermissionValueType;
|
updateTime: Date;
|
||||||
|
pluginData?: AppSchema['pluginData'];
|
||||||
permission: AppPermission;
|
permission: AppPermission;
|
||||||
};
|
} & PermissionSchemaType;
|
||||||
|
|
||||||
export type AppDetailType = AppSchema & {
|
export type AppDetailType = AppSchema & {
|
||||||
permission: AppPermission;
|
permission: AppPermission;
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import { FlowNodeTypeEnum } from '../workflow/node/constant';
|
|||||||
import { NodeInputKeyEnum, FlowNodeTemplateTypeEnum } from '../workflow/constants';
|
import { NodeInputKeyEnum, FlowNodeTemplateTypeEnum } from '../workflow/constants';
|
||||||
import type { FlowNodeInputItemType } from '../workflow/type/io.d';
|
import type { FlowNodeInputItemType } from '../workflow/type/io.d';
|
||||||
import { getAppChatConfig } from '../workflow/utils';
|
import { getAppChatConfig } from '../workflow/utils';
|
||||||
import { StoreNodeItemType } from '../workflow/type';
|
import { StoreNodeItemType } from '../workflow/type/node';
|
||||||
import { DatasetSearchModeEnum } from '../dataset/constants';
|
import { DatasetSearchModeEnum } from '../dataset/constants';
|
||||||
|
|
||||||
export const getDefaultAppForm = (): AppSimpleEditFormType => ({
|
export const getDefaultAppForm = (): AppSimpleEditFormType => ({
|
||||||
@@ -99,7 +99,7 @@ export const appWorkflow2Form = ({
|
|||||||
if (!node.pluginId) return;
|
if (!node.pluginId) return;
|
||||||
|
|
||||||
defaultAppForm.selectedTools.push({
|
defaultAppForm.selectedTools.push({
|
||||||
id: node.pluginId,
|
id: node.nodeId,
|
||||||
pluginId: node.pluginId,
|
pluginId: node.pluginId,
|
||||||
name: node.name,
|
name: node.name,
|
||||||
avatar: node.avatar,
|
avatar: node.avatar,
|
||||||
|
|||||||
9
packages/global/core/app/version.d.ts
vendored
9
packages/global/core/app/version.d.ts
vendored
@@ -1,12 +1,11 @@
|
|||||||
import { StoreNodeItemType } from '../workflow/type';
|
|
||||||
import { StoreEdgeItemType } from '../workflow/type/edge';
|
import { StoreEdgeItemType } from '../workflow/type/edge';
|
||||||
import { AppChatConfigType } from './type';
|
import { AppChatConfigType, AppSchema } from './type';
|
||||||
|
|
||||||
export type AppVersionSchemaType = {
|
export type AppVersionSchemaType = {
|
||||||
_id: string;
|
_id: string;
|
||||||
appId: string;
|
appId: string;
|
||||||
time: Date;
|
time: Date;
|
||||||
nodes: StoreNodeItemType[];
|
nodes: AppSchema['modules'];
|
||||||
edges: StoreEdgeItemType[];
|
edges: AppSchema['edges'];
|
||||||
chatConfig: AppChatConfigType;
|
chatConfig: AppSchema['chatConfig'];
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -56,7 +56,10 @@ export const chats2GPTMessages = ({
|
|||||||
text: item.text?.content || ''
|
text: item.text?.content || ''
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
if (item.type === 'file' && item.file?.type === ChatFileTypeEnum.image) {
|
if (
|
||||||
|
item.type === ChatItemValueTypeEnum.file &&
|
||||||
|
item.file?.type === ChatFileTypeEnum.image
|
||||||
|
) {
|
||||||
return {
|
return {
|
||||||
type: 'image_url',
|
type: 'image_url',
|
||||||
image_url: {
|
image_url: {
|
||||||
@@ -64,7 +67,6 @@ export const chats2GPTMessages = ({
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
return;
|
|
||||||
})
|
})
|
||||||
.filter(Boolean) as ChatCompletionContentPart[];
|
.filter(Boolean) as ChatCompletionContentPart[];
|
||||||
|
|
||||||
@@ -166,7 +168,7 @@ export const GPTMessages2Chats = (
|
|||||||
} else if (item.type === 'image_url') {
|
} else if (item.type === 'image_url') {
|
||||||
value.push({
|
value.push({
|
||||||
//@ts-ignore
|
//@ts-ignore
|
||||||
type: 'file',
|
type: ChatItemValueTypeEnum.file,
|
||||||
file: {
|
file: {
|
||||||
type: ChatFileTypeEnum.image,
|
type: ChatFileTypeEnum.image,
|
||||||
name: '',
|
name: '',
|
||||||
@@ -175,7 +177,6 @@ export const GPTMessages2Chats = (
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
// @ts-ignore
|
|
||||||
}
|
}
|
||||||
} else if (
|
} else if (
|
||||||
obj === ChatRoleEnum.AI &&
|
obj === ChatRoleEnum.AI &&
|
||||||
|
|||||||
@@ -56,7 +56,4 @@ export enum ChatStatusEnum {
|
|||||||
finish = 'finish'
|
finish = 'finish'
|
||||||
}
|
}
|
||||||
|
|
||||||
export const IMG_BLOCK_KEY = 'img-block';
|
|
||||||
export const FILE_BLOCK_KEY = 'file-block';
|
|
||||||
|
|
||||||
export const MARKDOWN_QUOTE_SIGN = 'QUOTE SIGN';
|
export const MARKDOWN_QUOTE_SIGN = 'QUOTE SIGN';
|
||||||
|
|||||||
5
packages/global/core/chat/type.d.ts
vendored
5
packages/global/core/chat/type.d.ts
vendored
@@ -1,4 +1,4 @@
|
|||||||
import { ClassifyQuestionAgentItemType } from '../workflow/type';
|
import { ClassifyQuestionAgentItemType } from '../workflow/template/system/classifyQuestion/type';
|
||||||
import { SearchDataResponseItemType } from '../dataset/type';
|
import { SearchDataResponseItemType } from '../dataset/type';
|
||||||
import {
|
import {
|
||||||
ChatFileTypeEnum,
|
ChatFileTypeEnum,
|
||||||
@@ -13,8 +13,8 @@ import { DispatchNodeResponseKeyEnum } from '../workflow/runtime/constants';
|
|||||||
import { AppChatConfigType, AppSchema, VariableItemType } from '../app/type';
|
import { AppChatConfigType, AppSchema, VariableItemType } from '../app/type';
|
||||||
import type { AppSchema as AppType } from '@fastgpt/global/core/app/type.d';
|
import type { AppSchema as AppType } from '@fastgpt/global/core/app/type.d';
|
||||||
import { DatasetSearchModeEnum } from '../dataset/constants';
|
import { DatasetSearchModeEnum } from '../dataset/constants';
|
||||||
import { ChatBoxInputType } from '../../../../projects/app/src/components/ChatBox/type';
|
|
||||||
import { DispatchNodeResponseType } from '../workflow/runtime/type.d';
|
import { DispatchNodeResponseType } from '../workflow/runtime/type.d';
|
||||||
|
import { ChatBoxInputType } from '../../../../projects/app/src/components/core/chat/ChatContainer/ChatBox/type';
|
||||||
|
|
||||||
export type ChatSchema = {
|
export type ChatSchema = {
|
||||||
_id: string;
|
_id: string;
|
||||||
@@ -115,6 +115,7 @@ export type ChatSiteItemType = (UserChatItemType | SystemChatItemType | AIChatIt
|
|||||||
status: `${ChatStatusEnum}`;
|
status: `${ChatStatusEnum}`;
|
||||||
moduleName?: string;
|
moduleName?: string;
|
||||||
ttsBuffer?: Uint8Array;
|
ttsBuffer?: Uint8Array;
|
||||||
|
responseData?: ChatHistoryItemResType[];
|
||||||
} & ChatBoxInputType;
|
} & ChatBoxInputType;
|
||||||
|
|
||||||
/* --------- team chat --------- */
|
/* --------- team chat --------- */
|
||||||
|
|||||||
@@ -3,6 +3,17 @@ import { FlowNodeTypeEnum } from '../workflow/node/constant';
|
|||||||
import { ChatItemValueTypeEnum, ChatRoleEnum } from './constants';
|
import { ChatItemValueTypeEnum, ChatRoleEnum } from './constants';
|
||||||
import { ChatHistoryItemResType, ChatItemType, UserChatItemValueItemType } from './type.d';
|
import { ChatHistoryItemResType, ChatItemType, UserChatItemValueItemType } from './type.d';
|
||||||
|
|
||||||
|
// Concat 2 -> 1, and sort by role
|
||||||
|
export const concatHistories = (histories1: ChatItemType[], histories2: ChatItemType[]) => {
|
||||||
|
const newHistories = [...histories1, ...histories2];
|
||||||
|
return newHistories.sort((a, b) => {
|
||||||
|
if (a.obj === ChatRoleEnum.System) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
export const getChatTitleFromChatMessage = (message?: ChatItemType, defaultValue = '新对话') => {
|
export const getChatTitleFromChatMessage = (message?: ChatItemType, defaultValue = '新对话') => {
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
const textMsg = message?.value.find((item) => item.type === ChatItemValueTypeEnum.text);
|
const textMsg = message?.value.find((item) => item.type === ChatItemValueTypeEnum.text);
|
||||||
@@ -54,11 +65,12 @@ export const filterPublicNodeResponseData = ({
|
|||||||
}: {
|
}: {
|
||||||
flowResponses?: ChatHistoryItemResType[];
|
flowResponses?: ChatHistoryItemResType[];
|
||||||
}) => {
|
}) => {
|
||||||
const filedList = ['quoteList', 'moduleType'];
|
const filedList = ['quoteList', 'moduleType', 'pluginOutput'];
|
||||||
const filterModuleTypeList: any[] = [
|
const filterModuleTypeList: any[] = [
|
||||||
FlowNodeTypeEnum.pluginModule,
|
FlowNodeTypeEnum.pluginModule,
|
||||||
FlowNodeTypeEnum.datasetSearchNode,
|
FlowNodeTypeEnum.datasetSearchNode,
|
||||||
FlowNodeTypeEnum.tools
|
FlowNodeTypeEnum.tools,
|
||||||
|
FlowNodeTypeEnum.pluginOutput
|
||||||
];
|
];
|
||||||
|
|
||||||
return flowResponses
|
return flowResponses
|
||||||
@@ -78,14 +90,22 @@ export const filterPublicNodeResponseData = ({
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
export const removeEmptyUserInput = (input: UserChatItemValueItemType[]) => {
|
export const removeEmptyUserInput = (input?: UserChatItemValueItemType[]) => {
|
||||||
return input.filter((item) => {
|
return (
|
||||||
if (item.type === ChatItemValueTypeEnum.text && !item.text?.content?.trim()) {
|
input?.filter((item) => {
|
||||||
return false;
|
if (item.type === ChatItemValueTypeEnum.text && !item.text?.content?.trim()) {
|
||||||
}
|
return false;
|
||||||
if (item.type === ChatItemValueTypeEnum.file && !item.file?.url) {
|
}
|
||||||
return false;
|
if (item.type === ChatItemValueTypeEnum.file && !item.file?.url) {
|
||||||
}
|
return false;
|
||||||
return true;
|
}
|
||||||
});
|
return true;
|
||||||
|
}) || []
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getPluginOutputsFromChatResponses = (responses: ChatHistoryItemResType[]) => {
|
||||||
|
const outputs =
|
||||||
|
responses.find((item) => item.moduleType === FlowNodeTypeEnum.pluginOutput)?.pluginOutput ?? {};
|
||||||
|
return outputs;
|
||||||
};
|
};
|
||||||
|
|||||||
6
packages/global/core/dataset/api.d.ts
vendored
6
packages/global/core/dataset/api.d.ts
vendored
@@ -1,20 +1,22 @@
|
|||||||
import { DatasetDataIndexItemType, DatasetSchemaType } from './type';
|
import { DatasetDataIndexItemType, DatasetSchemaType } from './type';
|
||||||
import { TrainingModeEnum, DatasetCollectionTypeEnum } from './constants';
|
import { TrainingModeEnum, DatasetCollectionTypeEnum } from './constants';
|
||||||
import type { LLMModelItemType } from '../ai/model.d';
|
import type { LLMModelItemType } from '../ai/model.d';
|
||||||
|
import { ParentIdType } from 'common/parentFolder/type';
|
||||||
|
|
||||||
/* ================= dataset ===================== */
|
/* ================= dataset ===================== */
|
||||||
export type DatasetUpdateBody = {
|
export type DatasetUpdateBody = {
|
||||||
id: string;
|
id: string;
|
||||||
parentId?: string;
|
parentId?: ParentIdType;
|
||||||
name?: string;
|
name?: string;
|
||||||
avatar?: string;
|
avatar?: string;
|
||||||
intro?: string;
|
intro?: string;
|
||||||
permission?: DatasetSchemaType['permission'];
|
permission?: DatasetSchemaType['permission']; // TODO: Should be deleted.
|
||||||
agentModel?: LLMModelItemType;
|
agentModel?: LLMModelItemType;
|
||||||
status?: DatasetSchemaType['status'];
|
status?: DatasetSchemaType['status'];
|
||||||
|
|
||||||
websiteConfig?: DatasetSchemaType['websiteConfig'];
|
websiteConfig?: DatasetSchemaType['websiteConfig'];
|
||||||
externalReadUrl?: DatasetSchemaType['externalReadUrl'];
|
externalReadUrl?: DatasetSchemaType['externalReadUrl'];
|
||||||
|
defaultPermission?: DatasetSchemaType['defaultPermission'];
|
||||||
};
|
};
|
||||||
|
|
||||||
/* ================= collection ===================== */
|
/* ================= collection ===================== */
|
||||||
|
|||||||
11
packages/global/core/dataset/collaborator.d.ts
vendored
Normal file
11
packages/global/core/dataset/collaborator.d.ts
vendored
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
import { UpdateClbPermissionProps } from '../../support/permission/collaborator';
|
||||||
|
import { PermissionValueType } from '../../support/permission/type';
|
||||||
|
|
||||||
|
export type UpdateDatasetCollaboratorBody = UpdateClbPermissionProps & {
|
||||||
|
datasetId: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type DatasetCollaboratorDeleteParams = {
|
||||||
|
datasetId: string;
|
||||||
|
tmbId: string;
|
||||||
|
};
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import { DatasetCollectionTypeEnum, TrainingModeEnum, TrainingTypeMap } from '../constants';
|
||||||
import { CollectionWithDatasetType, DatasetCollectionSchemaType } from '../type';
|
import { CollectionWithDatasetType, DatasetCollectionSchemaType } from '../type';
|
||||||
|
|
||||||
export const getCollectionSourceData = (
|
export const getCollectionSourceData = (
|
||||||
@@ -12,3 +13,13 @@ export const getCollectionSourceData = (
|
|||||||
sourceName: collection?.name || ''
|
sourceName: collection?.name || ''
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const checkCollectionIsFolder = (type: DatasetCollectionTypeEnum) => {
|
||||||
|
return type === DatasetCollectionTypeEnum.folder || type === DatasetCollectionTypeEnum.virtual;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getTrainingTypeLabel = (type?: TrainingModeEnum) => {
|
||||||
|
if (!type) return '';
|
||||||
|
if (!TrainingTypeMap[type]) return '';
|
||||||
|
return TrainingTypeMap[type].label;
|
||||||
|
};
|
||||||
|
|||||||
22
packages/global/core/dataset/type.d.ts
vendored
22
packages/global/core/dataset/type.d.ts
vendored
@@ -1,3 +1,4 @@
|
|||||||
|
import { PermissionValueType } from 'support/permission/type';
|
||||||
import type { LLMModelItemType, VectorModelItemType } from '../../core/ai/model.d';
|
import type { LLMModelItemType, VectorModelItemType } from '../../core/ai/model.d';
|
||||||
import { PermissionTypeEnum } from '../../support/permission/constant';
|
import { PermissionTypeEnum } from '../../support/permission/constant';
|
||||||
import { PushDatasetDataChunkProps } from './api';
|
import { PushDatasetDataChunkProps } from './api';
|
||||||
@@ -8,6 +9,8 @@ import {
|
|||||||
SearchScoreTypeEnum,
|
SearchScoreTypeEnum,
|
||||||
TrainingModeEnum
|
TrainingModeEnum
|
||||||
} from './constants';
|
} from './constants';
|
||||||
|
import { DatasetPermission } from '../../support/permission/dataset/controller';
|
||||||
|
import { Permission } from '../../support/permission/controller';
|
||||||
|
|
||||||
/* schema */
|
/* schema */
|
||||||
export type DatasetSchemaType = {
|
export type DatasetSchemaType = {
|
||||||
@@ -24,7 +27,7 @@ export type DatasetSchemaType = {
|
|||||||
intro: string;
|
intro: string;
|
||||||
type: DatasetTypeEnum;
|
type: DatasetTypeEnum;
|
||||||
status: `${DatasetStatusEnum}`;
|
status: `${DatasetStatusEnum}`;
|
||||||
permission: `${PermissionTypeEnum}`;
|
// permission: DatasetPermission;
|
||||||
|
|
||||||
// metadata
|
// metadata
|
||||||
websiteConfig?: {
|
websiteConfig?: {
|
||||||
@@ -32,6 +35,7 @@ export type DatasetSchemaType = {
|
|||||||
selector: string;
|
selector: string;
|
||||||
};
|
};
|
||||||
externalReadUrl?: string;
|
externalReadUrl?: string;
|
||||||
|
defaultPermission: PermissionValueType;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type DatasetCollectionSchemaType = {
|
export type DatasetCollectionSchemaType = {
|
||||||
@@ -44,6 +48,7 @@ export type DatasetCollectionSchemaType = {
|
|||||||
type: DatasetCollectionTypeEnum;
|
type: DatasetCollectionTypeEnum;
|
||||||
createTime: Date;
|
createTime: Date;
|
||||||
updateTime: Date;
|
updateTime: Date;
|
||||||
|
forbid?: boolean;
|
||||||
|
|
||||||
trainingType: TrainingModeEnum;
|
trainingType: TrainingModeEnum;
|
||||||
chunkSize: number;
|
chunkSize: number;
|
||||||
@@ -85,6 +90,7 @@ export type DatasetDataSchemaType = {
|
|||||||
updateTime: Date;
|
updateTime: Date;
|
||||||
q: string; // large chunks or question
|
q: string; // large chunks or question
|
||||||
a: string; // answer or custom content
|
a: string; // answer or custom content
|
||||||
|
forbid?: boolean;
|
||||||
fullTextToken: string;
|
fullTextToken: string;
|
||||||
indexes: DatasetDataIndexItemType[];
|
indexes: DatasetDataIndexItemType[];
|
||||||
rebuilding?: boolean;
|
rebuilding?: boolean;
|
||||||
@@ -132,24 +138,23 @@ export type DatasetListItemType = {
|
|||||||
name: string;
|
name: string;
|
||||||
intro: string;
|
intro: string;
|
||||||
type: DatasetTypeEnum;
|
type: DatasetTypeEnum;
|
||||||
isOwner: boolean;
|
permission: DatasetPermission;
|
||||||
canWrite: boolean;
|
|
||||||
permission: `${PermissionTypeEnum}`;
|
|
||||||
vectorModel: VectorModelItemType;
|
vectorModel: VectorModelItemType;
|
||||||
|
defaultPermission: PermissionValueType;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type DatasetItemType = Omit<DatasetSchemaType, 'vectorModel' | 'agentModel'> & {
|
export type DatasetItemType = Omit<DatasetSchemaType, 'vectorModel' | 'agentModel'> & {
|
||||||
vectorModel: VectorModelItemType;
|
vectorModel: VectorModelItemType;
|
||||||
agentModel: LLMModelItemType;
|
agentModel: LLMModelItemType;
|
||||||
isOwner: boolean;
|
permission: DatasetPermission;
|
||||||
canWrite: boolean;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* ================= collection ===================== */
|
/* ================= collection ===================== */
|
||||||
export type DatasetCollectionItemType = CollectionWithDatasetType & {
|
export type DatasetCollectionItemType = CollectionWithDatasetType & {
|
||||||
canWrite: boolean;
|
|
||||||
sourceName: string;
|
sourceName: string;
|
||||||
sourceId?: string;
|
sourceId?: string;
|
||||||
file?: DatasetFileSchema;
|
file?: DatasetFileSchema;
|
||||||
|
permission: DatasetPermission;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* ================= data ===================== */
|
/* ================= data ===================== */
|
||||||
@@ -177,10 +182,9 @@ export type DatasetFileSchema = {
|
|||||||
filename: string;
|
filename: string;
|
||||||
contentType: string;
|
contentType: string;
|
||||||
metadata: {
|
metadata: {
|
||||||
contentType: string;
|
|
||||||
datasetId: string;
|
|
||||||
teamId: string;
|
teamId: string;
|
||||||
tmbId: string;
|
tmbId: string;
|
||||||
|
encoding?: string;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -24,13 +24,15 @@ export function getSourceNameIcon({
|
|||||||
sourceName: string;
|
sourceName: string;
|
||||||
sourceId?: string;
|
sourceId?: string;
|
||||||
}) {
|
}) {
|
||||||
const fileIcon = getFileIcon(decodeURIComponent(sourceName), '');
|
try {
|
||||||
if (fileIcon) {
|
const fileIcon = getFileIcon(decodeURIComponent(sourceName.replace(/%/g, '%25')), '');
|
||||||
return fileIcon;
|
if (fileIcon) {
|
||||||
}
|
return fileIcon;
|
||||||
if (strIsLink(sourceId)) {
|
}
|
||||||
return 'common/linkBlue';
|
if (strIsLink(sourceId)) {
|
||||||
}
|
return 'common/linkBlue';
|
||||||
|
}
|
||||||
|
} catch (error) {}
|
||||||
|
|
||||||
return 'file/fill/manual';
|
return 'file/fill/manual';
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
import { StoreNodeItemType } from '../workflow/type';
|
|
||||||
|
|
||||||
export enum PluginTypeEnum {
|
export enum PluginTypeEnum {
|
||||||
folder = 'folder',
|
folder = 'folder',
|
||||||
custom = 'custom',
|
custom = 'custom',
|
||||||
|
|||||||
4
packages/global/core/plugin/controller.d.ts
vendored
4
packages/global/core/plugin/controller.d.ts
vendored
@@ -1,7 +1,7 @@
|
|||||||
import { StoreEdgeItemType } from 'core/workflow/type/edge';
|
import { StoreEdgeItemType } from 'core/workflow/type/edge';
|
||||||
import type { StoreNodeItemType } from '../workflow/type';
|
import type { StoreNodeItemType } from '../workflow/type/node';
|
||||||
import { PluginTypeEnum } from './constants';
|
import { PluginTypeEnum } from './constants';
|
||||||
import { HttpAuthMethodType } from './httpPlugin/type';
|
import { HttpAuthMethodType } from '../app/httpPlugin/type';
|
||||||
|
|
||||||
export type CreateOnePluginParams = {
|
export type CreateOnePluginParams = {
|
||||||
name: string;
|
name: string;
|
||||||
|
|||||||
6
packages/global/core/plugin/type.d.ts
vendored
6
packages/global/core/plugin/type.d.ts
vendored
@@ -1,8 +1,9 @@
|
|||||||
import { StoreEdgeItemType } from 'core/workflow/type/edge';
|
import { StoreEdgeItemType } from 'core/workflow/type/edge';
|
||||||
import { ModuleTemplateTypeEnum } from '../workflow/constants';
|
import { ModuleTemplateTypeEnum } from '../workflow/constants';
|
||||||
import type { FlowModuleTemplateType, StoreNodeItemType } from '../workflow/type';
|
import type { StoreNodeItemType } from '../workflow/type/node';
|
||||||
import { PluginSourceEnum, PluginTypeEnum } from './constants';
|
import { PluginSourceEnum, PluginTypeEnum } from './constants';
|
||||||
import { MethodType } from './controller';
|
import { MethodType } from './controller';
|
||||||
|
import { FlowNodeTemplateType } from '../workflow/type/node';
|
||||||
|
|
||||||
export type PluginItemSchema = {
|
export type PluginItemSchema = {
|
||||||
_id: string;
|
_id: string;
|
||||||
@@ -24,6 +25,7 @@ export type PluginItemSchema = {
|
|||||||
};
|
};
|
||||||
version?: 'v1' | 'v2';
|
version?: 'v1' | 'v2';
|
||||||
nodeVersion?: string;
|
nodeVersion?: string;
|
||||||
|
inited?: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* plugin template */
|
/* plugin template */
|
||||||
@@ -33,7 +35,7 @@ export type PluginTemplateType = PluginRuntimeType & {
|
|||||||
source: `${PluginSourceEnum}`;
|
source: `${PluginSourceEnum}`;
|
||||||
templateType: FlowNodeTemplateType['templateType'];
|
templateType: FlowNodeTemplateType['templateType'];
|
||||||
intro: string;
|
intro: string;
|
||||||
nodeVersion: string;
|
version: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type PluginRuntimeType = {
|
export type PluginRuntimeType = {
|
||||||
|
|||||||
2
packages/global/core/workflow/api.d.ts
vendored
2
packages/global/core/workflow/api.d.ts
vendored
@@ -4,7 +4,7 @@ import { NodeInputKeyEnum } from './constants';
|
|||||||
export type SelectedDatasetType = { datasetId: string }[];
|
export type SelectedDatasetType = { datasetId: string }[];
|
||||||
|
|
||||||
export type HttpBodyType<T = Record<string, any>> = {
|
export type HttpBodyType<T = Record<string, any>> = {
|
||||||
[NodeInputKeyEnum.addInputParam]: Record<string, any>;
|
// [NodeInputKeyEnum.addInputParam]: Record<string, any>;
|
||||||
} & T;
|
} & T;
|
||||||
export type HttpQueryType = {
|
export type HttpQueryType = {
|
||||||
appId: string;
|
appId: string;
|
||||||
|
|||||||
@@ -1,13 +1,11 @@
|
|||||||
export enum FlowNodeTemplateTypeEnum {
|
export enum FlowNodeTemplateTypeEnum {
|
||||||
systemInput = 'systemInput',
|
systemInput = 'systemInput',
|
||||||
|
ai = 'ai',
|
||||||
|
function = 'function',
|
||||||
tools = 'tools',
|
tools = 'tools',
|
||||||
textAnswer = 'textAnswer',
|
|
||||||
functionCall = 'functionCall',
|
|
||||||
externalCall = 'externalCall',
|
|
||||||
|
|
||||||
personalPlugin = 'personalPlugin',
|
other = 'other',
|
||||||
|
teamApp = 'teamApp'
|
||||||
other = 'other'
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum WorkflowIOValueTypeEnum {
|
export enum WorkflowIOValueTypeEnum {
|
||||||
@@ -84,6 +82,9 @@ export enum NodeInputKeyEnum {
|
|||||||
datasetSearchExtensionModel = 'datasetSearchExtensionModel',
|
datasetSearchExtensionModel = 'datasetSearchExtensionModel',
|
||||||
datasetSearchExtensionBg = 'datasetSearchExtensionBg',
|
datasetSearchExtensionBg = 'datasetSearchExtensionBg',
|
||||||
|
|
||||||
|
// concat dataset
|
||||||
|
datasetQuoteList = 'system_datasetQuoteList',
|
||||||
|
|
||||||
// context extract
|
// context extract
|
||||||
contextExtractInput = 'content',
|
contextExtractInput = 'content',
|
||||||
extractKeys = 'extractKeys',
|
extractKeys = 'extractKeys',
|
||||||
@@ -180,8 +181,6 @@ export const variableMap = {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
export const DYNAMIC_INPUT_REFERENCE_KEY = 'DYNAMIC_INPUT_REFERENCE_KEY';
|
|
||||||
|
|
||||||
/* run time */
|
/* run time */
|
||||||
export enum RuntimeEdgeStatusEnum {
|
export enum RuntimeEdgeStatusEnum {
|
||||||
'waiting' = 'waiting',
|
'waiting' = 'waiting',
|
||||||
@@ -190,3 +189,4 @@ export enum RuntimeEdgeStatusEnum {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export const VARIABLE_NODE_ID = 'VARIABLE_NODE_ID';
|
export const VARIABLE_NODE_ID = 'VARIABLE_NODE_ID';
|
||||||
|
export const DYNAMIC_INPUT_REFERENCE_KEY = 'DYNAMIC_INPUT_REFERENCE_KEY';
|
||||||
|
|||||||
@@ -1,8 +1,11 @@
|
|||||||
|
import { WorkflowIOValueTypeEnum } from '../constants';
|
||||||
|
|
||||||
export enum FlowNodeInputTypeEnum { // render ui
|
export enum FlowNodeInputTypeEnum { // render ui
|
||||||
reference = 'reference', // reference to other node output
|
reference = 'reference', // reference to other node output
|
||||||
input = 'input', // one line input
|
input = 'input', // one line input
|
||||||
numberInput = 'numberInput',
|
numberInput = 'numberInput',
|
||||||
switch = 'switch', // true/false
|
switch = 'switch', // true/false
|
||||||
|
select = 'select',
|
||||||
|
|
||||||
// editor
|
// editor
|
||||||
textarea = 'textarea',
|
textarea = 'textarea',
|
||||||
@@ -22,8 +25,6 @@ export enum FlowNodeInputTypeEnum { // render ui
|
|||||||
selectDatasetParamsModal = 'selectDatasetParamsModal',
|
selectDatasetParamsModal = 'selectDatasetParamsModal',
|
||||||
settingDatasetQuotePrompt = 'settingDatasetQuotePrompt',
|
settingDatasetQuotePrompt = 'settingDatasetQuotePrompt',
|
||||||
|
|
||||||
select = 'select',
|
|
||||||
|
|
||||||
hidden = 'hidden',
|
hidden = 'hidden',
|
||||||
custom = 'custom'
|
custom = 'custom'
|
||||||
}
|
}
|
||||||
@@ -114,7 +115,97 @@ export enum FlowNodeTypeEnum {
|
|||||||
lafModule = 'lafModule',
|
lafModule = 'lafModule',
|
||||||
ifElseNode = 'ifElseNode',
|
ifElseNode = 'ifElseNode',
|
||||||
variableUpdate = 'variableUpdate',
|
variableUpdate = 'variableUpdate',
|
||||||
code = 'code'
|
code = 'code',
|
||||||
|
textEditor = 'textEditor',
|
||||||
|
customFeedback = 'customFeedback'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// node IO value type
|
||||||
|
export const FlowValueTypeMap = {
|
||||||
|
[WorkflowIOValueTypeEnum.string]: {
|
||||||
|
label: 'string',
|
||||||
|
value: WorkflowIOValueTypeEnum.string,
|
||||||
|
description: ''
|
||||||
|
},
|
||||||
|
[WorkflowIOValueTypeEnum.number]: {
|
||||||
|
label: 'number',
|
||||||
|
value: WorkflowIOValueTypeEnum.number,
|
||||||
|
description: ''
|
||||||
|
},
|
||||||
|
[WorkflowIOValueTypeEnum.boolean]: {
|
||||||
|
label: 'boolean',
|
||||||
|
value: WorkflowIOValueTypeEnum.boolean,
|
||||||
|
description: ''
|
||||||
|
},
|
||||||
|
[WorkflowIOValueTypeEnum.object]: {
|
||||||
|
label: 'object',
|
||||||
|
value: WorkflowIOValueTypeEnum.object,
|
||||||
|
description: ''
|
||||||
|
},
|
||||||
|
[WorkflowIOValueTypeEnum.arrayString]: {
|
||||||
|
label: 'array<string>',
|
||||||
|
value: WorkflowIOValueTypeEnum.arrayString,
|
||||||
|
description: ''
|
||||||
|
},
|
||||||
|
[WorkflowIOValueTypeEnum.arrayNumber]: {
|
||||||
|
label: 'array<number>',
|
||||||
|
value: WorkflowIOValueTypeEnum.arrayNumber,
|
||||||
|
description: ''
|
||||||
|
},
|
||||||
|
[WorkflowIOValueTypeEnum.arrayBoolean]: {
|
||||||
|
label: 'array<boolean>',
|
||||||
|
value: WorkflowIOValueTypeEnum.arrayBoolean,
|
||||||
|
description: ''
|
||||||
|
},
|
||||||
|
[WorkflowIOValueTypeEnum.arrayObject]: {
|
||||||
|
label: 'array<object>',
|
||||||
|
value: WorkflowIOValueTypeEnum.arrayObject,
|
||||||
|
description: ''
|
||||||
|
},
|
||||||
|
[WorkflowIOValueTypeEnum.any]: {
|
||||||
|
label: 'any',
|
||||||
|
value: WorkflowIOValueTypeEnum.any,
|
||||||
|
description: ''
|
||||||
|
},
|
||||||
|
[WorkflowIOValueTypeEnum.chatHistory]: {
|
||||||
|
label: '历史记录',
|
||||||
|
value: WorkflowIOValueTypeEnum.chatHistory,
|
||||||
|
description: `{
|
||||||
|
obj: System | Human | AI;
|
||||||
|
value: string;
|
||||||
|
}[]`
|
||||||
|
},
|
||||||
|
[WorkflowIOValueTypeEnum.datasetQuote]: {
|
||||||
|
label: '知识库引用',
|
||||||
|
value: WorkflowIOValueTypeEnum.datasetQuote,
|
||||||
|
description: `{
|
||||||
|
id: string;
|
||||||
|
datasetId: string;
|
||||||
|
collectionId: string;
|
||||||
|
sourceName: string;
|
||||||
|
sourceId?: string;
|
||||||
|
q: string;
|
||||||
|
a: string
|
||||||
|
}[]`
|
||||||
|
},
|
||||||
|
[WorkflowIOValueTypeEnum.selectApp]: {
|
||||||
|
label: '选择应用',
|
||||||
|
value: WorkflowIOValueTypeEnum.selectApp,
|
||||||
|
description: ''
|
||||||
|
},
|
||||||
|
[WorkflowIOValueTypeEnum.selectDataset]: {
|
||||||
|
label: '选择知识库',
|
||||||
|
value: WorkflowIOValueTypeEnum.selectDataset,
|
||||||
|
description: `{
|
||||||
|
datasetId: string;
|
||||||
|
}`
|
||||||
|
},
|
||||||
|
[WorkflowIOValueTypeEnum.dynamic]: {
|
||||||
|
label: '动态输入',
|
||||||
|
value: WorkflowIOValueTypeEnum.dynamic,
|
||||||
|
description: ''
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
export const EDGE_TYPE = 'default';
|
export const EDGE_TYPE = 'default';
|
||||||
|
export const defaultNodeVersion = '481';
|
||||||
|
|||||||
17
packages/global/core/workflow/node/io/utils.ts
Normal file
17
packages/global/core/workflow/node/io/utils.ts
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
import { FlowNodeInputItemType } from '../../type/io';
|
||||||
|
|
||||||
|
export const getInputComponentProps = (input: FlowNodeInputItemType) => {
|
||||||
|
return {
|
||||||
|
referencePlaceholder: input.referencePlaceholder,
|
||||||
|
placeholder: input.placeholder,
|
||||||
|
maxLength: input.maxLength,
|
||||||
|
list: input.list,
|
||||||
|
markList: input.markList,
|
||||||
|
step: input.step,
|
||||||
|
max: input.max,
|
||||||
|
min: input.min,
|
||||||
|
defaultValue: input.defaultValue,
|
||||||
|
llmModelType: input.llmModelType,
|
||||||
|
customInputConfig: input.customInputConfig
|
||||||
|
};
|
||||||
|
};
|
||||||
39
packages/global/core/workflow/node/type.d.ts
vendored
39
packages/global/core/workflow/node/type.d.ts
vendored
@@ -1,39 +0,0 @@
|
|||||||
/*
|
|
||||||
react flow type
|
|
||||||
*/
|
|
||||||
import { FlowNodeInputTypeEnum, FlowNodeOutputTypeEnum, FlowNodeTypeEnum } from './constant';
|
|
||||||
import { WorkflowIOValueTypeEnum, NodeInputKeyEnum, NodeOutputKeyEnum } from '../constants';
|
|
||||||
import { SelectedDatasetType } from '../api';
|
|
||||||
import { LLMModelTypeEnum } from '../../ai/constants';
|
|
||||||
|
|
||||||
/* --------------- edit field ------------------- */
|
|
||||||
export type EditInputFieldMapType = EditOutputFieldMapType & {
|
|
||||||
inputType?: boolean;
|
|
||||||
};
|
|
||||||
export type EditOutputFieldMapType = {
|
|
||||||
key?: boolean;
|
|
||||||
description?: boolean;
|
|
||||||
valueType?: boolean; // output
|
|
||||||
required?: boolean;
|
|
||||||
defaultValue?: boolean;
|
|
||||||
};
|
|
||||||
export type EditNodeFieldType = {
|
|
||||||
inputType?: FlowNodeInputTypeEnum; // input type
|
|
||||||
valueType?: WorkflowIOValueTypeEnum;
|
|
||||||
required?: boolean;
|
|
||||||
key?: string;
|
|
||||||
label?: string;
|
|
||||||
description?: string;
|
|
||||||
isToolInput?: boolean;
|
|
||||||
|
|
||||||
defaultValue?: string;
|
|
||||||
maxLength?: number;
|
|
||||||
max?: number;
|
|
||||||
min?: number;
|
|
||||||
editField?: EditInputFieldMapType;
|
|
||||||
dynamicParamDefaultValue?: {
|
|
||||||
inputType?: FlowNodeInputTypeEnum; // input type
|
|
||||||
valueType?: WorkflowIOValueTypeEnum;
|
|
||||||
required?: boolean;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
62
packages/global/core/workflow/runtime/type.d.ts
vendored
62
packages/global/core/workflow/runtime/type.d.ts
vendored
@@ -1,11 +1,56 @@
|
|||||||
import { ChatNodeUsageType } from '../../../support/wallet/bill/type';
|
import { ChatNodeUsageType } from '../../../support/wallet/bill/type';
|
||||||
import { ChatItemValueItemType, ToolRunResponseItemType } from '../../chat/type';
|
import {
|
||||||
|
ChatItemType,
|
||||||
|
UserChatItemValueItemType,
|
||||||
|
ChatItemValueItemType,
|
||||||
|
ToolRunResponseItemType
|
||||||
|
} from '../../chat/type';
|
||||||
import { FlowNodeInputItemType, FlowNodeOutputItemType } from '../type/io.d';
|
import { FlowNodeInputItemType, FlowNodeOutputItemType } from '../type/io.d';
|
||||||
import { StoreNodeItemType } from '../type';
|
import { StoreNodeItemType } from '../type/node';
|
||||||
import { DispatchNodeResponseKeyEnum } from './constants';
|
import { DispatchNodeResponseKeyEnum } from './constants';
|
||||||
import { StoreEdgeItemType } from '../type/edge';
|
import { StoreEdgeItemType } from '../type/edge';
|
||||||
import { NodeInputKeyEnum } from '../constants';
|
import { NodeInputKeyEnum } from '../constants';
|
||||||
|
import { ClassifyQuestionAgentItemType } from '../template/system/classifyQuestion/type';
|
||||||
|
import { NextApiResponse } from 'next';
|
||||||
|
import { UserModelSchema } from '../../../support/user/type';
|
||||||
|
import { AppDetailType, AppSchema } from '../../app/type';
|
||||||
|
import { RuntimeNodeItemType } from '../runtime/type';
|
||||||
|
import { RuntimeEdgeItemType } from './edge';
|
||||||
|
|
||||||
|
/* workflow props */
|
||||||
|
export type ChatDispatchProps = {
|
||||||
|
res?: NextApiResponse;
|
||||||
|
mode: 'test' | 'chat' | 'debug';
|
||||||
|
teamId: string;
|
||||||
|
tmbId: string;
|
||||||
|
user: UserModelSchema;
|
||||||
|
app: AppDetailType | AppSchema;
|
||||||
|
chatId?: string;
|
||||||
|
responseChatItemId?: string;
|
||||||
|
histories: ChatItemType[];
|
||||||
|
variables: Record<string, any>; // global variable
|
||||||
|
query: UserChatItemValueItemType[]; // trigger query
|
||||||
|
stream: boolean;
|
||||||
|
detail: boolean; // response detail
|
||||||
|
maxRunTimes: number;
|
||||||
|
isToolCall?: boolean;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type ModuleDispatchProps<T> = ChatDispatchProps & {
|
||||||
|
node: RuntimeNodeItemType;
|
||||||
|
runtimeNodes: RuntimeNodeItemType[];
|
||||||
|
runtimeEdges: RuntimeEdgeItemType[];
|
||||||
|
params: T;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type SystemVariablesType = {
|
||||||
|
appId: string;
|
||||||
|
chatId?: string;
|
||||||
|
responseChatItemId?: string;
|
||||||
|
histories: ChatItemType[];
|
||||||
|
};
|
||||||
|
|
||||||
|
/* node props */
|
||||||
export type RuntimeNodeItemType = {
|
export type RuntimeNodeItemType = {
|
||||||
nodeId: StoreNodeItemType['nodeId'];
|
nodeId: StoreNodeItemType['nodeId'];
|
||||||
name: StoreNodeItemType['name'];
|
name: StoreNodeItemType['name'];
|
||||||
@@ -21,6 +66,16 @@ export type RuntimeNodeItemType = {
|
|||||||
pluginId?: string;
|
pluginId?: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export type PluginRuntimeType = {
|
||||||
|
teamId?: string;
|
||||||
|
name: string;
|
||||||
|
avatar: string;
|
||||||
|
showStatus?: boolean;
|
||||||
|
isTool?: boolean;
|
||||||
|
nodes: StoreNodeItemType[];
|
||||||
|
edges: StoreEdgeItemType[];
|
||||||
|
};
|
||||||
|
|
||||||
export type RuntimeEdgeItemType = StoreEdgeItemType & {
|
export type RuntimeEdgeItemType = StoreEdgeItemType & {
|
||||||
status: 'waiting' | 'active' | 'skipped';
|
status: 'waiting' | 'active' | 'skipped';
|
||||||
};
|
};
|
||||||
@@ -87,6 +142,9 @@ export type DispatchNodeResponseType = {
|
|||||||
|
|
||||||
// code
|
// code
|
||||||
codeLog?: string;
|
codeLog?: string;
|
||||||
|
|
||||||
|
// plugin
|
||||||
|
pluginOutput?: Record<string, any>;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type DispatchNodeResultType<T> = {
|
export type DispatchNodeResultType<T> = {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { ChatCompletionRequestMessageRoleEnum } from '../../ai/constants';
|
import { ChatCompletionRequestMessageRoleEnum } from '../../ai/constants';
|
||||||
import { NodeInputKeyEnum, NodeOutputKeyEnum } from '../constants';
|
import { NodeInputKeyEnum, NodeOutputKeyEnum } from '../constants';
|
||||||
import { FlowNodeTypeEnum } from '../node/constant';
|
import { FlowNodeTypeEnum } from '../node/constant';
|
||||||
import { StoreNodeItemType } from '../type';
|
import { StoreNodeItemType } from '../type/node';
|
||||||
import { StoreEdgeItemType } from '../type/edge';
|
import { StoreEdgeItemType } from '../type/edge';
|
||||||
import { RuntimeEdgeItemType, RuntimeNodeItemType } from './type';
|
import { RuntimeEdgeItemType, RuntimeNodeItemType } from './type';
|
||||||
import { VARIABLE_NODE_ID } from '../constants';
|
import { VARIABLE_NODE_ID } from '../constants';
|
||||||
@@ -123,6 +123,7 @@ export const checkNodeRunStatus = ({
|
|||||||
(item) => item.target === node.nodeId
|
(item) => item.target === node.nodeId
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// Entry
|
||||||
if (workflowEdges.length === 0) {
|
if (workflowEdges.length === 0) {
|
||||||
return 'run';
|
return 'run';
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,88 +5,66 @@ import { AiChatModule } from './system/aiChat';
|
|||||||
import { DatasetSearchModule } from './system/datasetSearch';
|
import { DatasetSearchModule } from './system/datasetSearch';
|
||||||
import { DatasetConcatModule } from './system/datasetConcat';
|
import { DatasetConcatModule } from './system/datasetConcat';
|
||||||
import { AssignedAnswerModule } from './system/assignedAnswer';
|
import { AssignedAnswerModule } from './system/assignedAnswer';
|
||||||
import { ClassifyQuestionModule } from './system/classifyQuestion';
|
import { ClassifyQuestionModule } from './system/classifyQuestion/index';
|
||||||
import { ContextExtractModule } from './system/contextExtract';
|
import { ContextExtractModule } from './system/contextExtract/index';
|
||||||
import { HttpModule468 } from './system/http468';
|
import { HttpNode468 } from './system/http468';
|
||||||
|
|
||||||
import { ToolModule } from './system/tools';
|
import { ToolModule } from './system/tools';
|
||||||
import { StopToolNode } from './system/stopTool';
|
import { StopToolNode } from './system/stopTool';
|
||||||
|
|
||||||
import { RunAppModule } from './system/runApp';
|
import { RunAppModule } from './system/runApp/index';
|
||||||
import { PluginInputModule } from './system/pluginInput';
|
import { PluginInputModule } from './system/pluginInput';
|
||||||
import { PluginOutputModule } from './system/pluginOutput';
|
import { PluginOutputModule } from './system/pluginOutput';
|
||||||
import { RunPluginModule } from './system/runPlugin';
|
import { RunPluginModule } from './system/runPlugin';
|
||||||
import { AiQueryExtension } from './system/queryExtension';
|
import { AiQueryExtension } from './system/queryExtension';
|
||||||
|
|
||||||
import type { FlowNodeTemplateType } from '../type';
|
import type { FlowNodeTemplateType } from '../type/node';
|
||||||
import { LafModule } from './system/laf';
|
import { LafModule } from './system/laf';
|
||||||
import { IfElseNode } from './system/ifElse/index';
|
import { IfElseNode } from './system/ifElse/index';
|
||||||
import { VariableUpdateNode } from './system/variableUpdate';
|
import { VariableUpdateNode } from './system/variableUpdate';
|
||||||
import { CodeNode } from './system/sandbox';
|
import { CodeNode } from './system/sandbox';
|
||||||
|
import { TextEditorNode } from './system/textEditor';
|
||||||
|
import { CustomFeedbackNode } from './system/customFeedback';
|
||||||
|
|
||||||
/* app flow module templates */
|
const systemNodes: FlowNodeTemplateType[] = [
|
||||||
export const appSystemModuleTemplates: FlowNodeTemplateType[] = [
|
|
||||||
SystemConfigNode,
|
|
||||||
WorkflowStart,
|
|
||||||
AiChatModule,
|
AiChatModule,
|
||||||
|
TextEditorNode,
|
||||||
AssignedAnswerModule,
|
AssignedAnswerModule,
|
||||||
DatasetSearchModule,
|
DatasetSearchModule,
|
||||||
DatasetConcatModule,
|
DatasetConcatModule,
|
||||||
RunAppModule,
|
|
||||||
ToolModule,
|
ToolModule,
|
||||||
StopToolNode,
|
StopToolNode,
|
||||||
ClassifyQuestionModule,
|
ClassifyQuestionModule,
|
||||||
ContextExtractModule,
|
ContextExtractModule,
|
||||||
HttpModule468,
|
HttpNode468,
|
||||||
AiQueryExtension,
|
AiQueryExtension,
|
||||||
LafModule,
|
LafModule,
|
||||||
IfElseNode,
|
IfElseNode,
|
||||||
VariableUpdateNode,
|
VariableUpdateNode,
|
||||||
CodeNode
|
CodeNode,
|
||||||
|
RunAppModule
|
||||||
|
];
|
||||||
|
/* app flow module templates */
|
||||||
|
export const appSystemModuleTemplates: FlowNodeTemplateType[] = [
|
||||||
|
SystemConfigNode,
|
||||||
|
WorkflowStart,
|
||||||
|
...systemNodes,
|
||||||
|
CustomFeedbackNode
|
||||||
];
|
];
|
||||||
/* plugin flow module templates */
|
/* plugin flow module templates */
|
||||||
export const pluginSystemModuleTemplates: FlowNodeTemplateType[] = [
|
export const pluginSystemModuleTemplates: FlowNodeTemplateType[] = [
|
||||||
PluginInputModule,
|
PluginInputModule,
|
||||||
PluginOutputModule,
|
PluginOutputModule,
|
||||||
AiChatModule,
|
...systemNodes
|
||||||
AssignedAnswerModule,
|
|
||||||
DatasetSearchModule,
|
|
||||||
DatasetConcatModule,
|
|
||||||
RunAppModule,
|
|
||||||
ToolModule,
|
|
||||||
StopToolNode,
|
|
||||||
ClassifyQuestionModule,
|
|
||||||
ContextExtractModule,
|
|
||||||
HttpModule468,
|
|
||||||
AiQueryExtension,
|
|
||||||
LafModule,
|
|
||||||
IfElseNode,
|
|
||||||
VariableUpdateNode,
|
|
||||||
CodeNode
|
|
||||||
];
|
];
|
||||||
|
|
||||||
/* all module */
|
/* all module */
|
||||||
export const moduleTemplatesFlat: FlowNodeTemplateType[] = [
|
export const moduleTemplatesFlat: FlowNodeTemplateType[] = [
|
||||||
|
...appSystemModuleTemplates.concat(
|
||||||
|
pluginSystemModuleTemplates.filter(
|
||||||
|
(item) => !appSystemModuleTemplates.find((app) => app.id === item.id)
|
||||||
|
)
|
||||||
|
),
|
||||||
EmptyNode,
|
EmptyNode,
|
||||||
SystemConfigNode,
|
RunPluginModule
|
||||||
WorkflowStart,
|
|
||||||
AiChatModule,
|
|
||||||
DatasetSearchModule,
|
|
||||||
DatasetConcatModule,
|
|
||||||
AssignedAnswerModule,
|
|
||||||
ClassifyQuestionModule,
|
|
||||||
ContextExtractModule,
|
|
||||||
HttpModule468,
|
|
||||||
ToolModule,
|
|
||||||
StopToolNode,
|
|
||||||
AiChatModule,
|
|
||||||
RunAppModule,
|
|
||||||
PluginInputModule,
|
|
||||||
PluginOutputModule,
|
|
||||||
RunPluginModule,
|
|
||||||
AiQueryExtension,
|
|
||||||
LafModule,
|
|
||||||
IfElseNode,
|
|
||||||
VariableUpdateNode,
|
|
||||||
CodeNode
|
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -9,9 +9,9 @@ export const Output_Template_AddOutput: FlowNodeOutputItemType = {
|
|||||||
type: FlowNodeOutputTypeEnum.dynamic,
|
type: FlowNodeOutputTypeEnum.dynamic,
|
||||||
valueType: WorkflowIOValueTypeEnum.dynamic,
|
valueType: WorkflowIOValueTypeEnum.dynamic,
|
||||||
label: '',
|
label: '',
|
||||||
|
customFieldConfig: {
|
||||||
editField: {
|
selectValueTypeList: Object.values(WorkflowIOValueTypeEnum),
|
||||||
key: true,
|
showDescription: false,
|
||||||
valueType: true
|
showDefaultValue: false
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import {
|
|||||||
FlowNodeOutputTypeEnum,
|
FlowNodeOutputTypeEnum,
|
||||||
FlowNodeTypeEnum
|
FlowNodeTypeEnum
|
||||||
} from '../../node/constant';
|
} from '../../node/constant';
|
||||||
import { FlowNodeTemplateType } from '../../type';
|
import { FlowNodeTemplateType } from '../../type/node';
|
||||||
import {
|
import {
|
||||||
WorkflowIOValueTypeEnum,
|
WorkflowIOValueTypeEnum,
|
||||||
NodeInputKeyEnum,
|
NodeInputKeyEnum,
|
||||||
@@ -22,7 +22,7 @@ import { getHandleConfig } from '../utils';
|
|||||||
|
|
||||||
export const AiChatModule: FlowNodeTemplateType = {
|
export const AiChatModule: FlowNodeTemplateType = {
|
||||||
id: FlowNodeTypeEnum.chatNode,
|
id: FlowNodeTypeEnum.chatNode,
|
||||||
templateType: FlowNodeTemplateTypeEnum.textAnswer,
|
templateType: FlowNodeTemplateTypeEnum.ai,
|
||||||
flowNodeType: FlowNodeTypeEnum.chatNode,
|
flowNodeType: FlowNodeTypeEnum.chatNode,
|
||||||
sourceHandle: getHandleConfig(true, true, true, true),
|
sourceHandle: getHandleConfig(true, true, true, true),
|
||||||
targetHandle: getHandleConfig(true, true, true, true),
|
targetHandle: getHandleConfig(true, true, true, true),
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { FlowNodeInputTypeEnum, FlowNodeTypeEnum } from '../../node/constant';
|
import { FlowNodeInputTypeEnum, FlowNodeTypeEnum } from '../../node/constant';
|
||||||
import { FlowNodeTemplateType } from '../../type/index.d';
|
import { FlowNodeTemplateType } from '../../type/node.d';
|
||||||
import {
|
import {
|
||||||
WorkflowIOValueTypeEnum,
|
WorkflowIOValueTypeEnum,
|
||||||
NodeInputKeyEnum,
|
NodeInputKeyEnum,
|
||||||
@@ -9,7 +9,7 @@ import { getHandleConfig } from '../utils';
|
|||||||
|
|
||||||
export const AssignedAnswerModule: FlowNodeTemplateType = {
|
export const AssignedAnswerModule: FlowNodeTemplateType = {
|
||||||
id: FlowNodeTypeEnum.answerNode,
|
id: FlowNodeTypeEnum.answerNode,
|
||||||
templateType: FlowNodeTemplateTypeEnum.textAnswer,
|
templateType: FlowNodeTemplateTypeEnum.tools,
|
||||||
flowNodeType: FlowNodeTypeEnum.answerNode,
|
flowNodeType: FlowNodeTypeEnum.answerNode,
|
||||||
sourceHandle: getHandleConfig(true, true, true, true),
|
sourceHandle: getHandleConfig(true, true, true, true),
|
||||||
targetHandle: getHandleConfig(true, true, true, true),
|
targetHandle: getHandleConfig(true, true, true, true),
|
||||||
|
|||||||
@@ -2,26 +2,26 @@ import {
|
|||||||
FlowNodeInputTypeEnum,
|
FlowNodeInputTypeEnum,
|
||||||
FlowNodeOutputTypeEnum,
|
FlowNodeOutputTypeEnum,
|
||||||
FlowNodeTypeEnum
|
FlowNodeTypeEnum
|
||||||
} from '../../node/constant';
|
} from '../../../node/constant';
|
||||||
import { FlowNodeTemplateType } from '../../type';
|
import { FlowNodeTemplateType } from '../../../type/node';
|
||||||
import {
|
import {
|
||||||
WorkflowIOValueTypeEnum,
|
WorkflowIOValueTypeEnum,
|
||||||
NodeInputKeyEnum,
|
NodeInputKeyEnum,
|
||||||
FlowNodeTemplateTypeEnum,
|
FlowNodeTemplateTypeEnum,
|
||||||
NodeOutputKeyEnum
|
NodeOutputKeyEnum
|
||||||
} from '../../constants';
|
} from '../../../constants';
|
||||||
import {
|
import {
|
||||||
Input_Template_SelectAIModel,
|
Input_Template_SelectAIModel,
|
||||||
Input_Template_History,
|
Input_Template_History,
|
||||||
Input_Template_UserChatInput
|
Input_Template_UserChatInput
|
||||||
} from '../input';
|
} from '../../input';
|
||||||
import { Input_Template_System_Prompt } from '../input';
|
import { Input_Template_System_Prompt } from '../../input';
|
||||||
import { LLMModelTypeEnum } from '../../../ai/constants';
|
import { LLMModelTypeEnum } from '../../../../ai/constants';
|
||||||
import { getHandleConfig } from '../utils';
|
import { getHandleConfig } from '../../utils';
|
||||||
|
|
||||||
export const ClassifyQuestionModule: FlowNodeTemplateType = {
|
export const ClassifyQuestionModule: FlowNodeTemplateType = {
|
||||||
id: FlowNodeTypeEnum.classifyQuestion,
|
id: FlowNodeTypeEnum.classifyQuestion,
|
||||||
templateType: FlowNodeTemplateTypeEnum.functionCall,
|
templateType: FlowNodeTemplateTypeEnum.ai,
|
||||||
flowNodeType: FlowNodeTypeEnum.classifyQuestion,
|
flowNodeType: FlowNodeTypeEnum.classifyQuestion,
|
||||||
sourceHandle: getHandleConfig(false, false, false, false),
|
sourceHandle: getHandleConfig(false, false, false, false),
|
||||||
targetHandle: getHandleConfig(true, false, true, true),
|
targetHandle: getHandleConfig(true, false, true, true),
|
||||||
4
packages/global/core/workflow/template/system/classifyQuestion/type.d.ts
vendored
Normal file
4
packages/global/core/workflow/template/system/classifyQuestion/type.d.ts
vendored
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
export type ClassifyQuestionAgentItemType = {
|
||||||
|
value: string;
|
||||||
|
key: string;
|
||||||
|
};
|
||||||
@@ -2,21 +2,21 @@ import {
|
|||||||
FlowNodeInputTypeEnum,
|
FlowNodeInputTypeEnum,
|
||||||
FlowNodeOutputTypeEnum,
|
FlowNodeOutputTypeEnum,
|
||||||
FlowNodeTypeEnum
|
FlowNodeTypeEnum
|
||||||
} from '../../node/constant';
|
} from '../../../node/constant';
|
||||||
import { FlowNodeTemplateType } from '../../type';
|
import { FlowNodeTemplateType } from '../../../type/node';
|
||||||
import {
|
import {
|
||||||
WorkflowIOValueTypeEnum,
|
WorkflowIOValueTypeEnum,
|
||||||
NodeInputKeyEnum,
|
NodeInputKeyEnum,
|
||||||
NodeOutputKeyEnum,
|
NodeOutputKeyEnum,
|
||||||
FlowNodeTemplateTypeEnum
|
FlowNodeTemplateTypeEnum
|
||||||
} from '../../constants';
|
} from '../../../constants';
|
||||||
import { Input_Template_SelectAIModel, Input_Template_History } from '../input';
|
import { Input_Template_SelectAIModel, Input_Template_History } from '../../input';
|
||||||
import { LLMModelTypeEnum } from '../../../ai/constants';
|
import { LLMModelTypeEnum } from '../../../../ai/constants';
|
||||||
import { getHandleConfig } from '../utils';
|
import { getHandleConfig } from '../../utils';
|
||||||
|
|
||||||
export const ContextExtractModule: FlowNodeTemplateType = {
|
export const ContextExtractModule: FlowNodeTemplateType = {
|
||||||
id: FlowNodeTypeEnum.contentExtract,
|
id: FlowNodeTypeEnum.contentExtract,
|
||||||
templateType: FlowNodeTemplateTypeEnum.functionCall,
|
templateType: FlowNodeTemplateTypeEnum.ai,
|
||||||
flowNodeType: FlowNodeTypeEnum.contentExtract,
|
flowNodeType: FlowNodeTypeEnum.contentExtract,
|
||||||
sourceHandle: getHandleConfig(true, true, true, true),
|
sourceHandle: getHandleConfig(true, true, true, true),
|
||||||
targetHandle: getHandleConfig(true, true, true, true),
|
targetHandle: getHandleConfig(true, true, true, true),
|
||||||
8
packages/global/core/workflow/template/system/contextExtract/type.d.ts
vendored
Normal file
8
packages/global/core/workflow/template/system/contextExtract/type.d.ts
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
export type ContextExtractAgentItemType = {
|
||||||
|
valueType: 'string' | 'number' | 'boolean';
|
||||||
|
desc: string;
|
||||||
|
key: string;
|
||||||
|
required: boolean;
|
||||||
|
defaultValue?: string;
|
||||||
|
enum?: string;
|
||||||
|
};
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
import { FlowNodeInputTypeEnum, FlowNodeTypeEnum } from '../../node/constant';
|
||||||
|
import { FlowNodeTemplateType } from '../../type/node.d';
|
||||||
|
import {
|
||||||
|
WorkflowIOValueTypeEnum,
|
||||||
|
FlowNodeTemplateTypeEnum,
|
||||||
|
NodeInputKeyEnum
|
||||||
|
} from '../../constants';
|
||||||
|
import { getHandleConfig } from '../utils';
|
||||||
|
|
||||||
|
export const CustomFeedbackNode: FlowNodeTemplateType = {
|
||||||
|
id: FlowNodeTypeEnum.customFeedback,
|
||||||
|
templateType: FlowNodeTemplateTypeEnum.other,
|
||||||
|
flowNodeType: FlowNodeTypeEnum.customFeedback,
|
||||||
|
sourceHandle: getHandleConfig(true, true, true, true),
|
||||||
|
targetHandle: getHandleConfig(true, true, true, true),
|
||||||
|
avatar: '/imgs/workflow/customFeedback.svg',
|
||||||
|
name: '自定义反馈',
|
||||||
|
intro: '该模块被触发时,会给当前的对话记录增加一条反馈。可用于自动记录对话效果等。',
|
||||||
|
version: '486',
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
key: NodeInputKeyEnum.textareaInput,
|
||||||
|
renderTypeList: [FlowNodeInputTypeEnum.textarea, FlowNodeInputTypeEnum.reference],
|
||||||
|
valueType: WorkflowIOValueTypeEnum.string,
|
||||||
|
required: true,
|
||||||
|
label: '反馈的文本'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
outputs: []
|
||||||
|
};
|
||||||
@@ -3,7 +3,7 @@ import {
|
|||||||
FlowNodeOutputTypeEnum,
|
FlowNodeOutputTypeEnum,
|
||||||
FlowNodeTypeEnum
|
FlowNodeTypeEnum
|
||||||
} from '../../node/constant';
|
} from '../../node/constant';
|
||||||
import { FlowNodeTemplateType } from '../../type';
|
import { FlowNodeTemplateType } from '../../type/node';
|
||||||
import {
|
import {
|
||||||
WorkflowIOValueTypeEnum,
|
WorkflowIOValueTypeEnum,
|
||||||
NodeInputKeyEnum,
|
NodeInputKeyEnum,
|
||||||
@@ -27,8 +27,7 @@ export const getOneQuoteInputTemplate = ({
|
|||||||
renderTypeList: [FlowNodeInputTypeEnum.reference],
|
renderTypeList: [FlowNodeInputTypeEnum.reference],
|
||||||
label: `引用${index}`,
|
label: `引用${index}`,
|
||||||
debugLabel: '知识库引用',
|
debugLabel: '知识库引用',
|
||||||
canEdit: key !== defaultQuoteKey,
|
canEdit: true,
|
||||||
description: '',
|
|
||||||
valueType: WorkflowIOValueTypeEnum.datasetQuote
|
valueType: WorkflowIOValueTypeEnum.datasetQuote
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -42,7 +41,7 @@ export const DatasetConcatModule: FlowNodeTemplateType = {
|
|||||||
name: '知识库搜索引用合并',
|
name: '知识库搜索引用合并',
|
||||||
intro: '可以将多个知识库搜索结果进行合并输出。使用 RRF 的合并方式进行最终排序输出。',
|
intro: '可以将多个知识库搜索结果进行合并输出。使用 RRF 的合并方式进行最终排序输出。',
|
||||||
showStatus: false,
|
showStatus: false,
|
||||||
version: '481',
|
version: '486',
|
||||||
inputs: [
|
inputs: [
|
||||||
{
|
{
|
||||||
key: NodeInputKeyEnum.datasetMaxTokens,
|
key: NodeInputKeyEnum.datasetMaxTokens,
|
||||||
@@ -52,11 +51,11 @@ export const DatasetConcatModule: FlowNodeTemplateType = {
|
|||||||
valueType: WorkflowIOValueTypeEnum.number
|
valueType: WorkflowIOValueTypeEnum.number
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: 'customComponent',
|
key: NodeInputKeyEnum.datasetQuoteList,
|
||||||
renderTypeList: [FlowNodeInputTypeEnum.custom],
|
renderTypeList: [FlowNodeInputTypeEnum.custom],
|
||||||
label: ''
|
label: ''
|
||||||
},
|
}
|
||||||
getOneQuoteInputTemplate({ key: defaultQuoteKey, index: 1 })
|
// getOneQuoteInputTemplate({ key: defaultQuoteKey, index: 1 })
|
||||||
],
|
],
|
||||||
outputs: [
|
outputs: [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import {
|
|||||||
FlowNodeOutputTypeEnum,
|
FlowNodeOutputTypeEnum,
|
||||||
FlowNodeTypeEnum
|
FlowNodeTypeEnum
|
||||||
} from '../../node/constant';
|
} from '../../node/constant';
|
||||||
import { FlowNodeTemplateType } from '../../type';
|
import { FlowNodeTemplateType } from '../../type/node';
|
||||||
import {
|
import {
|
||||||
WorkflowIOValueTypeEnum,
|
WorkflowIOValueTypeEnum,
|
||||||
NodeInputKeyEnum,
|
NodeInputKeyEnum,
|
||||||
@@ -19,7 +19,7 @@ export const Dataset_SEARCH_DESC =
|
|||||||
|
|
||||||
export const DatasetSearchModule: FlowNodeTemplateType = {
|
export const DatasetSearchModule: FlowNodeTemplateType = {
|
||||||
id: FlowNodeTypeEnum.datasetSearchNode,
|
id: FlowNodeTypeEnum.datasetSearchNode,
|
||||||
templateType: FlowNodeTemplateTypeEnum.functionCall,
|
templateType: FlowNodeTemplateTypeEnum.ai,
|
||||||
flowNodeType: FlowNodeTypeEnum.datasetSearchNode,
|
flowNodeType: FlowNodeTypeEnum.datasetSearchNode,
|
||||||
sourceHandle: getHandleConfig(true, true, true, true),
|
sourceHandle: getHandleConfig(true, true, true, true),
|
||||||
targetHandle: getHandleConfig(true, true, true, true),
|
targetHandle: getHandleConfig(true, true, true, true),
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { FlowNodeTypeEnum } from '../../node/constant';
|
import { FlowNodeTypeEnum } from '../../node/constant';
|
||||||
import { FlowNodeTemplateType } from '../../type';
|
import { FlowNodeTemplateType } from '../../type/node';
|
||||||
import { FlowNodeTemplateTypeEnum } from '../../constants';
|
import { FlowNodeTemplateTypeEnum } from '../../constants';
|
||||||
import { getHandleConfig } from '../utils';
|
import { getHandleConfig } from '../utils';
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import {
|
|||||||
FlowNodeOutputTypeEnum,
|
FlowNodeOutputTypeEnum,
|
||||||
FlowNodeTypeEnum
|
FlowNodeTypeEnum
|
||||||
} from '../../node/constant';
|
} from '../../node/constant';
|
||||||
import { FlowNodeTemplateType } from '../../type/index.d';
|
import { FlowNodeTemplateType } from '../../type/node.d';
|
||||||
import {
|
import {
|
||||||
WorkflowIOValueTypeEnum,
|
WorkflowIOValueTypeEnum,
|
||||||
NodeInputKeyEnum,
|
NodeInputKeyEnum,
|
||||||
@@ -14,9 +14,9 @@ import { Input_Template_DynamicInput } from '../input';
|
|||||||
import { Output_Template_AddOutput } from '../output';
|
import { Output_Template_AddOutput } from '../output';
|
||||||
import { getHandleConfig } from '../utils';
|
import { getHandleConfig } from '../utils';
|
||||||
|
|
||||||
export const HttpModule468: FlowNodeTemplateType = {
|
export const HttpNode468: FlowNodeTemplateType = {
|
||||||
id: FlowNodeTypeEnum.httpRequest468,
|
id: FlowNodeTypeEnum.httpRequest468,
|
||||||
templateType: FlowNodeTemplateTypeEnum.externalCall,
|
templateType: FlowNodeTemplateTypeEnum.tools,
|
||||||
flowNodeType: FlowNodeTypeEnum.httpRequest468,
|
flowNodeType: FlowNodeTypeEnum.httpRequest468,
|
||||||
sourceHandle: getHandleConfig(true, true, true, true),
|
sourceHandle: getHandleConfig(true, true, true, true),
|
||||||
targetHandle: getHandleConfig(true, true, true, true),
|
targetHandle: getHandleConfig(true, true, true, true),
|
||||||
@@ -30,9 +30,10 @@ export const HttpModule468: FlowNodeTemplateType = {
|
|||||||
{
|
{
|
||||||
...Input_Template_DynamicInput,
|
...Input_Template_DynamicInput,
|
||||||
description: 'core.module.input.description.HTTP Dynamic Input',
|
description: 'core.module.input.description.HTTP Dynamic Input',
|
||||||
editField: {
|
customInputConfig: {
|
||||||
key: true,
|
selectValueTypeList: Object.values(WorkflowIOValueTypeEnum),
|
||||||
valueType: true
|
showDescription: false,
|
||||||
|
showDefaultValue: true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -80,7 +81,9 @@ export const HttpModule468: FlowNodeTemplateType = {
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
outputs: [
|
outputs: [
|
||||||
Output_Template_AddOutput,
|
{
|
||||||
|
...Output_Template_AddOutput
|
||||||
|
},
|
||||||
{
|
{
|
||||||
id: NodeOutputKeyEnum.error,
|
id: NodeOutputKeyEnum.error,
|
||||||
key: NodeOutputKeyEnum.error,
|
key: NodeOutputKeyEnum.error,
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import {
|
|||||||
FlowNodeOutputTypeEnum,
|
FlowNodeOutputTypeEnum,
|
||||||
FlowNodeTypeEnum
|
FlowNodeTypeEnum
|
||||||
} from '../../../node/constant';
|
} from '../../../node/constant';
|
||||||
import { FlowNodeTemplateType } from '../../../type';
|
import { FlowNodeTemplateType } from '../../../type/node';
|
||||||
import { getHandleConfig } from '../../utils';
|
import { getHandleConfig } from '../../utils';
|
||||||
|
|
||||||
export const IfElseNode: FlowNodeTemplateType = {
|
export const IfElseNode: FlowNodeTemplateType = {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import {
|
|||||||
FlowNodeOutputTypeEnum,
|
FlowNodeOutputTypeEnum,
|
||||||
FlowNodeTypeEnum
|
FlowNodeTypeEnum
|
||||||
} from '../../node/constant';
|
} from '../../node/constant';
|
||||||
import { FlowNodeTemplateType } from '../../type/index.d';
|
import { FlowNodeTemplateType } from '../../type/node.d';
|
||||||
import {
|
import {
|
||||||
WorkflowIOValueTypeEnum,
|
WorkflowIOValueTypeEnum,
|
||||||
NodeInputKeyEnum,
|
NodeInputKeyEnum,
|
||||||
@@ -14,9 +14,15 @@ import { Input_Template_DynamicInput } from '../input';
|
|||||||
import { Output_Template_AddOutput } from '../output';
|
import { Output_Template_AddOutput } from '../output';
|
||||||
import { getHandleConfig } from '../utils';
|
import { getHandleConfig } from '../utils';
|
||||||
|
|
||||||
|
export const nodeLafCustomInputConfig = {
|
||||||
|
selectValueTypeList: Object.values(WorkflowIOValueTypeEnum),
|
||||||
|
showDescription: false,
|
||||||
|
showDefaultValue: true
|
||||||
|
};
|
||||||
|
|
||||||
export const LafModule: FlowNodeTemplateType = {
|
export const LafModule: FlowNodeTemplateType = {
|
||||||
id: FlowNodeTypeEnum.lafModule,
|
id: FlowNodeTypeEnum.lafModule,
|
||||||
templateType: FlowNodeTemplateTypeEnum.externalCall,
|
templateType: FlowNodeTemplateTypeEnum.other,
|
||||||
flowNodeType: FlowNodeTypeEnum.lafModule,
|
flowNodeType: FlowNodeTypeEnum.lafModule,
|
||||||
sourceHandle: getHandleConfig(true, true, true, true),
|
sourceHandle: getHandleConfig(true, true, true, true),
|
||||||
targetHandle: getHandleConfig(true, true, true, true),
|
targetHandle: getHandleConfig(true, true, true, true),
|
||||||
@@ -30,10 +36,7 @@ export const LafModule: FlowNodeTemplateType = {
|
|||||||
{
|
{
|
||||||
...Input_Template_DynamicInput,
|
...Input_Template_DynamicInput,
|
||||||
description: '接收前方节点的输出值作为变量,这些变量可以被 Laf 请求参数使用。',
|
description: '接收前方节点的输出值作为变量,这些变量可以被 Laf 请求参数使用。',
|
||||||
editField: {
|
customInputConfig: nodeLafCustomInputConfig
|
||||||
key: true,
|
|
||||||
valueType: true
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: NodeInputKeyEnum.httpReqUrl,
|
key: NodeInputKeyEnum.httpReqUrl,
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { FlowNodeTemplateTypeEnum } from '../../constants';
|
import { FlowNodeTemplateTypeEnum } from '../../constants';
|
||||||
import { FlowNodeTypeEnum } from '../../node/constant';
|
import { FlowNodeTypeEnum } from '../../node/constant';
|
||||||
import { FlowNodeTemplateType } from '../../type';
|
import { FlowNodeTemplateType } from '../../type/node';
|
||||||
import { getHandleConfig } from '../utils';
|
import { getHandleConfig } from '../utils';
|
||||||
|
|
||||||
export const PluginInputModule: FlowNodeTemplateType = {
|
export const PluginInputModule: FlowNodeTemplateType = {
|
||||||
@@ -12,8 +12,8 @@ export const PluginInputModule: FlowNodeTemplateType = {
|
|||||||
unique: true,
|
unique: true,
|
||||||
forbidDelete: true,
|
forbidDelete: true,
|
||||||
avatar: '/imgs/workflow/input.png',
|
avatar: '/imgs/workflow/input.png',
|
||||||
name: '自定义插件输入',
|
name: '插件输入',
|
||||||
intro: '自定义配置外部输入,使用插件时,仅暴露自定义配置的输入',
|
intro: '可以配置插件需要哪些输入,利用这些输入来运行插件',
|
||||||
showStatus: false,
|
showStatus: false,
|
||||||
version: '481',
|
version: '481',
|
||||||
inputs: [],
|
inputs: [],
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { FlowNodeTemplateTypeEnum } from '../../constants';
|
import { FlowNodeTemplateTypeEnum } from '../../constants';
|
||||||
import { FlowNodeTypeEnum } from '../../node/constant';
|
import { FlowNodeTypeEnum } from '../../node/constant';
|
||||||
import { FlowNodeTemplateType } from '../../type';
|
import { FlowNodeTemplateType } from '../../type/node';
|
||||||
import { getHandleConfig } from '../utils';
|
import { getHandleConfig } from '../utils';
|
||||||
|
|
||||||
export const PluginOutputModule: FlowNodeTemplateType = {
|
export const PluginOutputModule: FlowNodeTemplateType = {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import {
|
|||||||
FlowNodeOutputTypeEnum,
|
FlowNodeOutputTypeEnum,
|
||||||
FlowNodeTypeEnum
|
FlowNodeTypeEnum
|
||||||
} from '../../node/constant';
|
} from '../../node/constant';
|
||||||
import { FlowNodeTemplateType } from '../../type/index.d';
|
import { FlowNodeTemplateType } from '../../type/node.d';
|
||||||
import {
|
import {
|
||||||
WorkflowIOValueTypeEnum,
|
WorkflowIOValueTypeEnum,
|
||||||
NodeInputKeyEnum,
|
NodeInputKeyEnum,
|
||||||
@@ -19,7 +19,7 @@ import { LLMModelTypeEnum } from '../../../ai/constants';
|
|||||||
import { getHandleConfig } from '../utils';
|
import { getHandleConfig } from '../utils';
|
||||||
|
|
||||||
export const AiQueryExtension: FlowNodeTemplateType = {
|
export const AiQueryExtension: FlowNodeTemplateType = {
|
||||||
id: FlowNodeTypeEnum.chatNode,
|
id: FlowNodeTypeEnum.queryExtension,
|
||||||
templateType: FlowNodeTemplateTypeEnum.other,
|
templateType: FlowNodeTemplateTypeEnum.other,
|
||||||
flowNodeType: FlowNodeTypeEnum.queryExtension,
|
flowNodeType: FlowNodeTypeEnum.queryExtension,
|
||||||
sourceHandle: getHandleConfig(true, true, true, true),
|
sourceHandle: getHandleConfig(true, true, true, true),
|
||||||
|
|||||||
@@ -2,20 +2,20 @@ import {
|
|||||||
FlowNodeInputTypeEnum,
|
FlowNodeInputTypeEnum,
|
||||||
FlowNodeOutputTypeEnum,
|
FlowNodeOutputTypeEnum,
|
||||||
FlowNodeTypeEnum
|
FlowNodeTypeEnum
|
||||||
} from '../../node/constant';
|
} from '../../../node/constant';
|
||||||
import { FlowNodeTemplateType } from '../../type/index.d';
|
import { FlowNodeTemplateType } from '../../../type/node.d';
|
||||||
import {
|
import {
|
||||||
WorkflowIOValueTypeEnum,
|
WorkflowIOValueTypeEnum,
|
||||||
NodeInputKeyEnum,
|
NodeInputKeyEnum,
|
||||||
NodeOutputKeyEnum,
|
NodeOutputKeyEnum,
|
||||||
FlowNodeTemplateTypeEnum
|
FlowNodeTemplateTypeEnum
|
||||||
} from '../../constants';
|
} from '../../../constants';
|
||||||
import { Input_Template_History, Input_Template_UserChatInput } from '../input';
|
import { Input_Template_History, Input_Template_UserChatInput } from '../../input';
|
||||||
import { getHandleConfig } from '../utils';
|
import { getHandleConfig } from '../../utils';
|
||||||
|
|
||||||
export const RunAppModule: FlowNodeTemplateType = {
|
export const RunAppModule: FlowNodeTemplateType = {
|
||||||
id: FlowNodeTypeEnum.runApp,
|
id: FlowNodeTypeEnum.runApp,
|
||||||
templateType: FlowNodeTemplateTypeEnum.externalCall,
|
templateType: FlowNodeTemplateTypeEnum.tools,
|
||||||
flowNodeType: FlowNodeTypeEnum.runApp,
|
flowNodeType: FlowNodeTypeEnum.runApp,
|
||||||
sourceHandle: getHandleConfig(true, true, true, true),
|
sourceHandle: getHandleConfig(true, true, true, true),
|
||||||
targetHandle: getHandleConfig(true, true, true, true),
|
targetHandle: getHandleConfig(true, true, true, true),
|
||||||
5
packages/global/core/workflow/template/system/runApp/type.d.ts
vendored
Normal file
5
packages/global/core/workflow/template/system/runApp/type.d.ts
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
export type SelectAppItemType = {
|
||||||
|
id: string;
|
||||||
|
// name: string;
|
||||||
|
// logo?: string;
|
||||||
|
};
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
import { FlowNodeTemplateTypeEnum } from '../../constants';
|
import { FlowNodeTemplateTypeEnum } from '../../constants';
|
||||||
import { FlowNodeTypeEnum } from '../../node/constant';
|
import { FlowNodeTypeEnum } from '../../node/constant';
|
||||||
import { FlowNodeTemplateType } from '../../type';
|
import { FlowNodeTemplateType } from '../../type/node';
|
||||||
import { getHandleConfig } from '../utils';
|
import { getHandleConfig } from '../utils';
|
||||||
|
|
||||||
export const RunPluginModule: FlowNodeTemplateType = {
|
export const RunPluginModule: FlowNodeTemplateType = {
|
||||||
id: FlowNodeTypeEnum.pluginModule,
|
id: FlowNodeTypeEnum.pluginModule,
|
||||||
templateType: FlowNodeTemplateTypeEnum.externalCall,
|
templateType: FlowNodeTemplateTypeEnum.other,
|
||||||
flowNodeType: FlowNodeTypeEnum.pluginModule,
|
flowNodeType: FlowNodeTypeEnum.pluginModule,
|
||||||
sourceHandle: getHandleConfig(true, true, true, true),
|
sourceHandle: getHandleConfig(true, true, true, true),
|
||||||
targetHandle: getHandleConfig(true, true, true, true),
|
targetHandle: getHandleConfig(true, true, true, true),
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import {
|
|||||||
FlowNodeOutputTypeEnum,
|
FlowNodeOutputTypeEnum,
|
||||||
FlowNodeTypeEnum
|
FlowNodeTypeEnum
|
||||||
} from '../../../node/constant';
|
} from '../../../node/constant';
|
||||||
import { FlowNodeTemplateType } from '../../../type';
|
import { FlowNodeTemplateType } from '../../../type/node';
|
||||||
import { getHandleConfig } from '../../utils';
|
import { getHandleConfig } from '../../utils';
|
||||||
import { Input_Template_DynamicInput } from '../../input';
|
import { Input_Template_DynamicInput } from '../../input';
|
||||||
import { Output_Template_AddOutput } from '../../output';
|
import { Output_Template_AddOutput } from '../../output';
|
||||||
@@ -30,11 +30,38 @@ export const CodeNode: FlowNodeTemplateType = {
|
|||||||
{
|
{
|
||||||
...Input_Template_DynamicInput,
|
...Input_Template_DynamicInput,
|
||||||
description: '这些变量会作为代码的运行的输入参数',
|
description: '这些变量会作为代码的运行的输入参数',
|
||||||
editField: {
|
customInputConfig: {
|
||||||
key: true,
|
selectValueTypeList: Object.values(WorkflowIOValueTypeEnum),
|
||||||
valueType: true
|
showDescription: false,
|
||||||
|
showDefaultValue: true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
renderTypeList: [FlowNodeInputTypeEnum.reference],
|
||||||
|
valueType: WorkflowIOValueTypeEnum.string,
|
||||||
|
canEdit: true,
|
||||||
|
key: 'data1',
|
||||||
|
label: 'data1',
|
||||||
|
customInputConfig: {
|
||||||
|
selectValueTypeList: Object.values(WorkflowIOValueTypeEnum),
|
||||||
|
showDescription: false,
|
||||||
|
showDefaultValue: true
|
||||||
|
},
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
renderTypeList: [FlowNodeInputTypeEnum.reference],
|
||||||
|
valueType: WorkflowIOValueTypeEnum.string,
|
||||||
|
canEdit: true,
|
||||||
|
key: 'data2',
|
||||||
|
label: 'data2',
|
||||||
|
customInputConfig: {
|
||||||
|
selectValueTypeList: Object.values(WorkflowIOValueTypeEnum),
|
||||||
|
showDescription: false,
|
||||||
|
showDefaultValue: true
|
||||||
|
},
|
||||||
|
required: true
|
||||||
|
},
|
||||||
{
|
{
|
||||||
key: NodeInputKeyEnum.codeType,
|
key: NodeInputKeyEnum.codeType,
|
||||||
renderTypeList: [FlowNodeInputTypeEnum.hidden],
|
renderTypeList: [FlowNodeInputTypeEnum.hidden],
|
||||||
@@ -51,7 +78,7 @@ export const CodeNode: FlowNodeTemplateType = {
|
|||||||
outputs: [
|
outputs: [
|
||||||
{
|
{
|
||||||
...Output_Template_AddOutput,
|
...Output_Template_AddOutput,
|
||||||
description: '将代码中 return 的对象作为输出,传递给后续的节点'
|
description: '将代码中 return 的对象作为输出,传递给后续的节点。变量名需要对应 return 的 key'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: NodeOutputKeyEnum.rawResponse,
|
id: NodeOutputKeyEnum.rawResponse,
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
import { FlowNodeTypeEnum } from '../../node/constant';
|
import { FlowNodeTypeEnum } from '../../node/constant';
|
||||||
import { FlowNodeTemplateType } from '../../type';
|
import { FlowNodeTemplateType } from '../../type/node';
|
||||||
import { FlowNodeTemplateTypeEnum } from '../../constants';
|
import { FlowNodeTemplateTypeEnum } from '../../constants';
|
||||||
import { getHandleConfig } from '../utils';
|
import { getHandleConfig } from '../utils';
|
||||||
|
|
||||||
export const StopToolNode: FlowNodeTemplateType = {
|
export const StopToolNode: FlowNodeTemplateType = {
|
||||||
id: FlowNodeTypeEnum.stopTool,
|
id: FlowNodeTypeEnum.stopTool,
|
||||||
templateType: FlowNodeTemplateTypeEnum.functionCall,
|
templateType: FlowNodeTemplateTypeEnum.ai,
|
||||||
flowNodeType: FlowNodeTypeEnum.stopTool,
|
flowNodeType: FlowNodeTypeEnum.stopTool,
|
||||||
sourceHandle: getHandleConfig(false, false, false, false),
|
sourceHandle: getHandleConfig(false, false, false, false),
|
||||||
targetHandle: getHandleConfig(true, true, true, true),
|
targetHandle: getHandleConfig(true, true, true, true),
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { FlowNodeTypeEnum } from '../../node/constant';
|
import { FlowNodeTypeEnum } from '../../node/constant';
|
||||||
import { FlowNodeTemplateType } from '../../type/index.d';
|
import { FlowNodeTemplateType } from '../../type/node.d';
|
||||||
import { FlowNodeTemplateTypeEnum } from '../../constants';
|
import { FlowNodeTemplateTypeEnum } from '../../constants';
|
||||||
import { getHandleConfig } from '../utils';
|
import { getHandleConfig } from '../utils';
|
||||||
|
|
||||||
|
|||||||
54
packages/global/core/workflow/template/system/textEditor.ts
Normal file
54
packages/global/core/workflow/template/system/textEditor.ts
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
import {
|
||||||
|
FlowNodeInputTypeEnum,
|
||||||
|
FlowNodeOutputTypeEnum,
|
||||||
|
FlowNodeTypeEnum
|
||||||
|
} from '../../node/constant';
|
||||||
|
import { FlowNodeTemplateType } from '../../type/node.d';
|
||||||
|
import {
|
||||||
|
WorkflowIOValueTypeEnum,
|
||||||
|
NodeOutputKeyEnum,
|
||||||
|
FlowNodeTemplateTypeEnum,
|
||||||
|
NodeInputKeyEnum
|
||||||
|
} from '../../constants';
|
||||||
|
import { getHandleConfig } from '../utils';
|
||||||
|
import { Input_Template_DynamicInput } from '../input';
|
||||||
|
|
||||||
|
export const TextEditorNode: FlowNodeTemplateType = {
|
||||||
|
id: FlowNodeTypeEnum.textEditor,
|
||||||
|
templateType: FlowNodeTemplateTypeEnum.tools,
|
||||||
|
flowNodeType: FlowNodeTypeEnum.textEditor,
|
||||||
|
sourceHandle: getHandleConfig(true, true, true, true),
|
||||||
|
targetHandle: getHandleConfig(true, true, true, true),
|
||||||
|
avatar: '/imgs/workflow/textEditor.svg',
|
||||||
|
name: '文本拼接',
|
||||||
|
intro: '可对固定或传入的文本进行加工后输出,非字符串类型数据最终会转成字符串类型。',
|
||||||
|
version: '486',
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
...Input_Template_DynamicInput,
|
||||||
|
description: '可以引用其他节点的输出,作为文本拼接的变量,通过 {{字段名}} 来引用变量',
|
||||||
|
customInputConfig: {
|
||||||
|
selectValueTypeList: Object.values(WorkflowIOValueTypeEnum),
|
||||||
|
showDescription: false,
|
||||||
|
showDefaultValue: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: NodeInputKeyEnum.textareaInput,
|
||||||
|
renderTypeList: [FlowNodeInputTypeEnum.textarea],
|
||||||
|
valueType: WorkflowIOValueTypeEnum.string,
|
||||||
|
required: true,
|
||||||
|
label: '拼接文本',
|
||||||
|
placeholder: '可通过 {{字段名}} 来引用变量'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
id: NodeOutputKeyEnum.text,
|
||||||
|
key: NodeOutputKeyEnum.text,
|
||||||
|
label: '拼接结果',
|
||||||
|
type: FlowNodeOutputTypeEnum.static,
|
||||||
|
valueType: WorkflowIOValueTypeEnum.string
|
||||||
|
}
|
||||||
|
]
|
||||||
|
};
|
||||||
@@ -3,7 +3,7 @@ import {
|
|||||||
FlowNodeOutputTypeEnum,
|
FlowNodeOutputTypeEnum,
|
||||||
FlowNodeTypeEnum
|
FlowNodeTypeEnum
|
||||||
} from '../../node/constant';
|
} from '../../node/constant';
|
||||||
import { FlowNodeTemplateType } from '../../type/index.d';
|
import { FlowNodeTemplateType } from '../../type/node.d';
|
||||||
import {
|
import {
|
||||||
WorkflowIOValueTypeEnum,
|
WorkflowIOValueTypeEnum,
|
||||||
NodeOutputKeyEnum,
|
NodeOutputKeyEnum,
|
||||||
@@ -23,11 +23,11 @@ import { getHandleConfig } from '../utils';
|
|||||||
export const ToolModule: FlowNodeTemplateType = {
|
export const ToolModule: FlowNodeTemplateType = {
|
||||||
id: FlowNodeTypeEnum.tools,
|
id: FlowNodeTypeEnum.tools,
|
||||||
flowNodeType: FlowNodeTypeEnum.tools,
|
flowNodeType: FlowNodeTypeEnum.tools,
|
||||||
templateType: FlowNodeTemplateTypeEnum.functionCall,
|
templateType: FlowNodeTemplateTypeEnum.ai,
|
||||||
sourceHandle: getHandleConfig(true, true, false, true),
|
sourceHandle: getHandleConfig(true, true, false, true),
|
||||||
targetHandle: getHandleConfig(true, true, false, true),
|
targetHandle: getHandleConfig(true, true, false, true),
|
||||||
avatar: '/imgs/workflow/tool.svg',
|
avatar: '/imgs/workflow/tool.svg',
|
||||||
name: '工具调用(实验)',
|
name: '工具调用',
|
||||||
intro: '通过AI模型自动选择一个或多个功能块进行调用,也可以对插件进行调用。',
|
intro: '通过AI模型自动选择一个或多个功能块进行调用,也可以对插件进行调用。',
|
||||||
showStatus: true,
|
showStatus: true,
|
||||||
version: '481',
|
version: '481',
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { FlowNodeInputTypeEnum, FlowNodeTypeEnum } from '../../../node/constant';
|
import { FlowNodeInputTypeEnum, FlowNodeTypeEnum } from '../../../node/constant';
|
||||||
import { FlowNodeTemplateType } from '../../../type/index.d';
|
import { FlowNodeTemplateType } from '../../../type/node.d';
|
||||||
import {
|
import {
|
||||||
FlowNodeTemplateTypeEnum,
|
FlowNodeTemplateTypeEnum,
|
||||||
NodeInputKeyEnum,
|
NodeInputKeyEnum,
|
||||||
@@ -25,10 +25,6 @@ export const VariableUpdateNode: FlowNodeTemplateType = {
|
|||||||
valueType: WorkflowIOValueTypeEnum.any,
|
valueType: WorkflowIOValueTypeEnum.any,
|
||||||
label: '',
|
label: '',
|
||||||
renderTypeList: [FlowNodeInputTypeEnum.hidden],
|
renderTypeList: [FlowNodeInputTypeEnum.hidden],
|
||||||
editField: {
|
|
||||||
key: true,
|
|
||||||
valueType: true
|
|
||||||
},
|
|
||||||
value: [
|
value: [
|
||||||
{
|
{
|
||||||
variable: ['', ''],
|
variable: ['', ''],
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { FlowNodeOutputTypeEnum, FlowNodeTypeEnum } from '../../node/constant';
|
import { FlowNodeOutputTypeEnum, FlowNodeTypeEnum } from '../../node/constant';
|
||||||
import { FlowNodeTemplateType } from '../../type/index.d';
|
import { FlowNodeTemplateType } from '../../type/node.d';
|
||||||
import {
|
import {
|
||||||
WorkflowIOValueTypeEnum,
|
WorkflowIOValueTypeEnum,
|
||||||
NodeOutputKeyEnum,
|
NodeOutputKeyEnum,
|
||||||
@@ -31,3 +31,6 @@ export const WorkflowStart: FlowNodeTemplateType = {
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const isWorkflowStartOutput = (key?: string) =>
|
||||||
|
!!WorkflowStart.outputs.find((output) => output.key === key);
|
||||||
|
|||||||
14
packages/global/core/workflow/type/fe.d.ts
vendored
14
packages/global/core/workflow/type/fe.d.ts
vendored
@@ -1,3 +1,5 @@
|
|||||||
|
import { FlowNodeInputItemType, FlowNodeOutputItemType } from './io';
|
||||||
|
|
||||||
export type FlowNodeChangeProps = { nodeId: string } & (
|
export type FlowNodeChangeProps = { nodeId: string } & (
|
||||||
| {
|
| {
|
||||||
type: 'attr'; // key: attr, value: new value
|
type: 'attr'; // key: attr, value: new value
|
||||||
@@ -7,16 +9,16 @@ export type FlowNodeChangeProps = { nodeId: string } & (
|
|||||||
| {
|
| {
|
||||||
type: 'updateInput'; // key: update input key, value: new input value
|
type: 'updateInput'; // key: update input key, value: new input value
|
||||||
key: string;
|
key: string;
|
||||||
value: any;
|
value: FlowNodeInputItemType;
|
||||||
}
|
}
|
||||||
| {
|
| {
|
||||||
type: 'replaceInput'; // key: old input key, value: new input value
|
type: 'replaceInput'; // key: old input key, value: new input value
|
||||||
key: string;
|
key: string;
|
||||||
value: any;
|
value: FlowNodeInputItemType;
|
||||||
}
|
}
|
||||||
| {
|
| {
|
||||||
type: 'addInput'; // key: null, value: new input value
|
type: 'addInput'; // key: null, value: new input value
|
||||||
value: any;
|
value: FlowNodeInputItemType;
|
||||||
index?: number;
|
index?: number;
|
||||||
}
|
}
|
||||||
| {
|
| {
|
||||||
@@ -26,16 +28,16 @@ export type FlowNodeChangeProps = { nodeId: string } & (
|
|||||||
| {
|
| {
|
||||||
type: 'updateOutput'; // key: update output key, value: new output value
|
type: 'updateOutput'; // key: update output key, value: new output value
|
||||||
key: string;
|
key: string;
|
||||||
value: any;
|
value: FlowNodeOutputItemType;
|
||||||
}
|
}
|
||||||
| {
|
| {
|
||||||
type: 'replaceOutput'; // key: old output key, value: new output value
|
type: 'replaceOutput'; // key: old output key, value: new output value
|
||||||
key: string;
|
key: string;
|
||||||
value: any;
|
value: FlowNodeOutputItemType;
|
||||||
}
|
}
|
||||||
| {
|
| {
|
||||||
type: 'addOutput'; // key: null, value: new output value
|
type: 'addOutput'; // key: null, value: new output value
|
||||||
value: any;
|
value: FlowNodeOutputItemType;
|
||||||
index?: number;
|
index?: number;
|
||||||
}
|
}
|
||||||
| {
|
| {
|
||||||
|
|||||||
158
packages/global/core/workflow/type/index.d.ts
vendored
158
packages/global/core/workflow/type/index.d.ts
vendored
@@ -6,147 +6,53 @@ import {
|
|||||||
VariableInputEnum
|
VariableInputEnum
|
||||||
} from '../constants';
|
} from '../constants';
|
||||||
import { DispatchNodeResponseKeyEnum } from '../runtime/constants';
|
import { DispatchNodeResponseKeyEnum } from '../runtime/constants';
|
||||||
import { FlowNodeInputItemType, FlowNodeOutputItemType } from './io.d';
|
import { CustomInputItemType, FlowNodeInputItemType, FlowNodeOutputItemType } from './io.d';
|
||||||
import { UserModelSchema } from '../../../support/user/type';
|
|
||||||
import {
|
import {
|
||||||
ChatHistoryItemResType,
|
ChatHistoryItemResType,
|
||||||
ChatItemType,
|
ChatItemType,
|
||||||
ChatItemValueItemType,
|
ChatItemValueItemType,
|
||||||
ToolRunResponseItemType,
|
ToolRunResponseItemType
|
||||||
UserChatItemValueItemType
|
|
||||||
} from '../../chat/type';
|
} from '../../chat/type';
|
||||||
import { ChatNodeUsageType } from '../../../support/wallet/bill/type';
|
import { ChatNodeUsageType } from '../../../support/wallet/bill/type';
|
||||||
import { RuntimeNodeItemType } from '../runtime/type';
|
|
||||||
import { PluginTypeEnum } from '../../plugin/constants';
|
import { PluginTypeEnum } from '../../plugin/constants';
|
||||||
import { RuntimeEdgeItemType, StoreEdgeItemType } from './edge';
|
import { StoreEdgeItemType } from './edge';
|
||||||
import { NextApiResponse } from 'next';
|
import { AppChatConfigType } from '../../app/type';
|
||||||
import { AppDetailType, AppSchema } from '../../app/type';
|
import { ParentIdType } from 'common/parentFolder/type';
|
||||||
|
import { AppTypeEnum } from 'core/app/constants';
|
||||||
|
import { FlowNodeTemplateType, StoreNodeItemType } from './node';
|
||||||
|
|
||||||
export type FlowNodeCommonType = {
|
export type WorkflowTemplateBasicType = {
|
||||||
flowNodeType: FlowNodeTypeEnum; // render node card
|
nodes: StoreNodeItemType[];
|
||||||
|
edges: StoreEdgeItemType[];
|
||||||
|
chatConfigs?: AppChatConfigType;
|
||||||
|
};
|
||||||
|
export type WorkflowTemplateType = {
|
||||||
|
id: string;
|
||||||
|
parentId?: string;
|
||||||
|
isFolder?: boolean;
|
||||||
|
|
||||||
avatar?: string;
|
|
||||||
name: string;
|
name: string;
|
||||||
intro?: string; // template list intro
|
avatar: string;
|
||||||
showStatus?: boolean; // chatting response step status
|
intro?: string;
|
||||||
|
author?: string;
|
||||||
version: string;
|
version: string;
|
||||||
|
|
||||||
// data
|
showStatus?: boolean;
|
||||||
inputs: FlowNodeInputItemType[];
|
weight?: number;
|
||||||
outputs: FlowNodeOutputItemType[];
|
|
||||||
|
|
||||||
// plugin data
|
workflow: WorkflowTemplateBasicType;
|
||||||
pluginId?: string;
|
|
||||||
pluginType?: `${PluginTypeEnum}`;
|
|
||||||
parentId?: string;
|
|
||||||
};
|
};
|
||||||
|
// template market
|
||||||
export type FlowNodeTemplateType = FlowNodeCommonType & {
|
export type TemplateMarketItemType = WorkflowTemplateType & {
|
||||||
id: string; // node id, unique
|
tags?: { id: string; label: string }[];
|
||||||
templateType: `${FlowNodeTemplateTypeEnum}`;
|
|
||||||
|
|
||||||
// show handle
|
|
||||||
sourceHandle?: {
|
|
||||||
left: boolean;
|
|
||||||
right: boolean;
|
|
||||||
top: boolean;
|
|
||||||
bottom: boolean;
|
|
||||||
};
|
|
||||||
targetHandle?: {
|
|
||||||
left: boolean;
|
|
||||||
right: boolean;
|
|
||||||
top: boolean;
|
|
||||||
bottom: boolean;
|
|
||||||
};
|
|
||||||
|
|
||||||
// info
|
|
||||||
isTool?: boolean; // can be connected by tool
|
|
||||||
|
|
||||||
// action
|
|
||||||
forbidDelete?: boolean; // forbid delete
|
|
||||||
unique?: boolean;
|
|
||||||
nodeVersion?: string;
|
|
||||||
};
|
};
|
||||||
export type FlowNodeItemType = FlowNodeTemplateType & {
|
// system plugin
|
||||||
nodeId: string;
|
export type SystemPluginTemplateItemType = WorkflowTemplateType & {
|
||||||
isError?: boolean;
|
templateType: FlowNodeTemplateTypeEnum;
|
||||||
debugResult?: {
|
isTool?: boolean;
|
||||||
status: 'running' | 'success' | 'skipped' | 'failed';
|
|
||||||
message?: string;
|
|
||||||
showResult?: boolean; // show and hide result modal
|
|
||||||
response?: ChatHistoryItemResType;
|
|
||||||
isExpired?: boolean;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
export type nodeTemplateListType = {
|
|
||||||
type: `${FlowNodeTemplateTypeEnum}`;
|
|
||||||
label: string;
|
|
||||||
list: FlowNodeTemplateType[];
|
|
||||||
}[];
|
|
||||||
|
|
||||||
// store node type
|
originCost: number; // n points/one time
|
||||||
export type StoreNodeItemType = FlowNodeCommonType & {
|
currentCost: number;
|
||||||
nodeId: string;
|
|
||||||
position?: {
|
|
||||||
x: number;
|
|
||||||
y: number;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
/* connection type */
|
workflow: WorkflowTemplateBasicType;
|
||||||
export type NodeTargetNodeItemType = {
|
|
||||||
nodeId: string;
|
|
||||||
sourceHandle: string;
|
|
||||||
targetHandle: string;
|
|
||||||
};
|
|
||||||
export type NodeSourceNodeItemType = {
|
|
||||||
nodeId: string;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* --------------- function type -------------------- */
|
|
||||||
export type SelectAppItemType = {
|
|
||||||
id: string;
|
|
||||||
// name: string;
|
|
||||||
// logo?: string;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* agent */
|
|
||||||
export type ClassifyQuestionAgentItemType = {
|
|
||||||
value: string;
|
|
||||||
key: string;
|
|
||||||
};
|
|
||||||
export type ContextExtractAgentItemType = {
|
|
||||||
valueType: 'string' | 'number' | 'boolean';
|
|
||||||
desc: string;
|
|
||||||
key: string;
|
|
||||||
required: boolean;
|
|
||||||
defaultValue?: string;
|
|
||||||
enum?: string;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* -------------- running module -------------- */
|
|
||||||
|
|
||||||
export type ChatDispatchProps = {
|
|
||||||
res?: NextApiResponse;
|
|
||||||
mode: 'test' | 'chat' | 'debug';
|
|
||||||
teamId: string;
|
|
||||||
tmbId: string;
|
|
||||||
user: UserModelSchema;
|
|
||||||
app: AppDetailType | AppSchema;
|
|
||||||
chatId?: string;
|
|
||||||
responseChatItemId?: string;
|
|
||||||
histories: ChatItemType[];
|
|
||||||
variables: Record<string, any>; // global variable
|
|
||||||
query: UserChatItemValueItemType[]; // trigger query
|
|
||||||
stream: boolean;
|
|
||||||
detail: boolean; // response detail
|
|
||||||
maxRunTimes: number;
|
|
||||||
isToolCall?: boolean;
|
|
||||||
};
|
|
||||||
|
|
||||||
export type ModuleDispatchProps<T> = ChatDispatchProps & {
|
|
||||||
node: RuntimeNodeItemType;
|
|
||||||
runtimeNodes: RuntimeNodeItemType[];
|
|
||||||
runtimeEdges: RuntimeEdgeItemType[];
|
|
||||||
params: T;
|
|
||||||
};
|
};
|
||||||
|
|||||||
64
packages/global/core/workflow/type/io.d.ts
vendored
64
packages/global/core/workflow/type/io.d.ts
vendored
@@ -1,9 +1,43 @@
|
|||||||
import { LLMModelTypeEnum } from '../../ai/constants';
|
import { LLMModelTypeEnum } from '../../ai/constants';
|
||||||
import { WorkflowIOValueTypeEnum, NodeInputKeyEnum, NodeOutputKeyEnum } from '../constants';
|
import { WorkflowIOValueTypeEnum, NodeInputKeyEnum, NodeOutputKeyEnum } from '../constants';
|
||||||
import { FlowNodeInputTypeEnum, FlowNodeOutputTypeEnum } from '../node/constant';
|
import { FlowNodeInputTypeEnum, FlowNodeOutputTypeEnum } from '../node/constant';
|
||||||
import { EditInputFieldMapType, EditNodeFieldType, EditOutputFieldMapType } from '../node/type';
|
|
||||||
|
|
||||||
export type FlowNodeInputItemType = {
|
// Dynamic input field configuration
|
||||||
|
export type CustomFieldConfigType = {
|
||||||
|
// selectInputTypeList: FlowNodeInputTypeEnum[]; // 可以选哪些输入类型, 只有1个话,则默认选择
|
||||||
|
|
||||||
|
// reference
|
||||||
|
selectValueTypeList?: WorkflowIOValueTypeEnum[]; // 可以选哪个数据类型, 只有1个的话,则默认选择
|
||||||
|
|
||||||
|
// showIsToolParam?: boolean; // 是否作为工具参数
|
||||||
|
|
||||||
|
// showRequired?: boolean;
|
||||||
|
// defaultRequired?: boolean;
|
||||||
|
|
||||||
|
showDefaultValue?: boolean;
|
||||||
|
showDescription?: boolean;
|
||||||
|
};
|
||||||
|
export type InputComponentPropsType = {
|
||||||
|
referencePlaceholder?: string;
|
||||||
|
placeholder?: string; // input,textarea
|
||||||
|
maxLength?: number; // input,textarea
|
||||||
|
|
||||||
|
list?: { label: string; value: string }[]; // select
|
||||||
|
|
||||||
|
markList?: { label: string; value: number }[]; // slider
|
||||||
|
step?: number; // slider
|
||||||
|
max?: number; // slider, number input
|
||||||
|
min?: number; // slider, number input
|
||||||
|
|
||||||
|
defaultValue?: string;
|
||||||
|
|
||||||
|
llmModelType?: `${LLMModelTypeEnum}`;
|
||||||
|
|
||||||
|
// dynamic input
|
||||||
|
customInputConfig?: CustomFieldConfigType;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type FlowNodeInputItemType = InputComponentPropsType & {
|
||||||
selectedTypeIndex?: number;
|
selectedTypeIndex?: number;
|
||||||
renderTypeList: FlowNodeInputTypeEnum[]; // Node Type. Decide on a render style
|
renderTypeList: FlowNodeInputTypeEnum[]; // Node Type. Decide on a render style
|
||||||
|
|
||||||
@@ -16,29 +50,8 @@ export type FlowNodeInputItemType = {
|
|||||||
required?: boolean;
|
required?: boolean;
|
||||||
toolDescription?: string; // If this field is not empty, it is entered as a tool
|
toolDescription?: string; // If this field is not empty, it is entered as a tool
|
||||||
|
|
||||||
maxLength?: number; // input,textarea
|
|
||||||
|
|
||||||
// edit
|
|
||||||
canEdit?: boolean;
|
|
||||||
|
|
||||||
// render components params
|
// render components params
|
||||||
referencePlaceholder?: string;
|
canEdit?: boolean; // dynamic inputs
|
||||||
placeholder?: string; // input,textarea
|
|
||||||
|
|
||||||
list?: { label: string; value: any }[]; // select
|
|
||||||
|
|
||||||
markList?: { label: string; value: any }[]; // slider
|
|
||||||
step?: number; // slider
|
|
||||||
max?: number; // slider, number input
|
|
||||||
min?: number; // slider, number input
|
|
||||||
|
|
||||||
defaultValue?: string;
|
|
||||||
|
|
||||||
// dynamic input
|
|
||||||
editField?: EditNodeFieldType['editField'];
|
|
||||||
dynamicParamDefaultValue?: EditNodeFieldType['dynamicParamDefaultValue'];
|
|
||||||
|
|
||||||
llmModelType?: `${LLMModelTypeEnum}`;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export type FlowNodeOutputItemType = {
|
export type FlowNodeOutputItemType = {
|
||||||
@@ -54,8 +67,7 @@ export type FlowNodeOutputItemType = {
|
|||||||
required?: boolean;
|
required?: boolean;
|
||||||
|
|
||||||
// component params
|
// component params
|
||||||
canEdit?: boolean;
|
customFieldConfig?: CustomFieldConfigType;
|
||||||
editField?: EditOutputFieldMapType; // 添加
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export type ReferenceValueProps = [string, string | undefined];
|
export type ReferenceValueProps = [string, string | undefined];
|
||||||
|
|||||||
111
packages/global/core/workflow/type/node.d.ts
vendored
Normal file
111
packages/global/core/workflow/type/node.d.ts
vendored
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
import { FlowNodeTypeEnum } from '../node/constant';
|
||||||
|
import {
|
||||||
|
WorkflowIOValueTypeEnum,
|
||||||
|
NodeOutputKeyEnum,
|
||||||
|
FlowNodeTemplateTypeEnum,
|
||||||
|
VariableInputEnum
|
||||||
|
} from '../constants';
|
||||||
|
import { DispatchNodeResponseKeyEnum } from '../runtime/constants';
|
||||||
|
import { FlowNodeInputItemType, FlowNodeOutputItemType } from './io.d';
|
||||||
|
import { UserModelSchema } from '../../../support/user/type';
|
||||||
|
import {
|
||||||
|
ChatHistoryItemResType,
|
||||||
|
ChatItemType,
|
||||||
|
ChatItemValueItemType,
|
||||||
|
ToolRunResponseItemType,
|
||||||
|
UserChatItemValueItemType
|
||||||
|
} from '../../chat/type';
|
||||||
|
import { ChatNodeUsageType } from '../../../support/wallet/bill/type';
|
||||||
|
import { RuntimeNodeItemType } from '../runtime/type';
|
||||||
|
import { PluginTypeEnum } from '../../plugin/constants';
|
||||||
|
import { RuntimeEdgeItemType, StoreEdgeItemType } from './edge';
|
||||||
|
import { NextApiResponse } from 'next';
|
||||||
|
import { AppDetailType, AppSchema } from '../../app/type';
|
||||||
|
import { ParentIdType } from 'common/parentFolder/type';
|
||||||
|
import { AppTypeEnum } from 'core/app/constants';
|
||||||
|
|
||||||
|
export type FlowNodeCommonType = {
|
||||||
|
flowNodeType: FlowNodeTypeEnum; // render node card
|
||||||
|
abandon?: boolean; // abandon node
|
||||||
|
|
||||||
|
avatar?: string;
|
||||||
|
name: string;
|
||||||
|
intro?: string; // template list intro
|
||||||
|
showStatus?: boolean; // chatting response step status
|
||||||
|
version: string;
|
||||||
|
|
||||||
|
// data
|
||||||
|
inputs: FlowNodeInputItemType[];
|
||||||
|
outputs: FlowNodeOutputItemType[];
|
||||||
|
|
||||||
|
// plugin data
|
||||||
|
pluginId?: string;
|
||||||
|
isFolder?: boolean;
|
||||||
|
// pluginType?: AppTypeEnum;
|
||||||
|
};
|
||||||
|
|
||||||
|
type HandleType = {
|
||||||
|
left: boolean;
|
||||||
|
right: boolean;
|
||||||
|
top: boolean;
|
||||||
|
bottom: boolean;
|
||||||
|
};
|
||||||
|
// system template
|
||||||
|
export type FlowNodeTemplateType = FlowNodeCommonType & {
|
||||||
|
id: string; // node id, unique
|
||||||
|
templateType: FlowNodeTemplateTypeEnum;
|
||||||
|
|
||||||
|
// show handle
|
||||||
|
sourceHandle?: HandleType;
|
||||||
|
targetHandle?: HandleType;
|
||||||
|
|
||||||
|
// info
|
||||||
|
isTool?: boolean; // can be connected by tool
|
||||||
|
|
||||||
|
// action
|
||||||
|
forbidDelete?: boolean; // forbid delete
|
||||||
|
unique?: boolean;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type NodeTemplateListItemType = {
|
||||||
|
id: string; // 系统节点-系统节点的 id, 系统插件-插件的 id,团队应用的 id
|
||||||
|
flowNodeType: FlowNodeTypeEnum; // render node card
|
||||||
|
parentId?: string;
|
||||||
|
isFolder?: boolean;
|
||||||
|
templateType: FlowNodeTemplateTypeEnum;
|
||||||
|
avatar?: string;
|
||||||
|
name: string;
|
||||||
|
intro?: string; // template list intro
|
||||||
|
isTool?: boolean;
|
||||||
|
author?: string;
|
||||||
|
unique?: boolean; // 唯一的
|
||||||
|
};
|
||||||
|
|
||||||
|
export type NodeTemplateListType = {
|
||||||
|
type: FlowNodeTemplateTypeEnum;
|
||||||
|
label: string;
|
||||||
|
list: NodeTemplateListItemType[];
|
||||||
|
}[];
|
||||||
|
|
||||||
|
// react flow node type
|
||||||
|
export type FlowNodeItemType = FlowNodeTemplateType & {
|
||||||
|
nodeId: string;
|
||||||
|
isError?: boolean;
|
||||||
|
debugResult?: {
|
||||||
|
status: 'running' | 'success' | 'skipped' | 'failed';
|
||||||
|
message?: string;
|
||||||
|
showResult?: boolean; // show and hide result modal
|
||||||
|
response?: ChatHistoryItemResType;
|
||||||
|
isExpired?: boolean;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
// store node type
|
||||||
|
export type StoreNodeItemType = FlowNodeCommonType & {
|
||||||
|
nodeId: string;
|
||||||
|
// isEntry: boolean;
|
||||||
|
position?: {
|
||||||
|
x: number;
|
||||||
|
y: number;
|
||||||
|
};
|
||||||
|
};
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user