Commit b29e10cf by Archer Committed by GitHub

V4.14.9 dev (#6582)

* update doc

* update pnpm version

* update lock

* update model config doc

* time

* update dockerfile
parent 765ec526
name: Preview docs build name: Preview Docs Image — Build
on: on:
pull_request: pull_request:
...@@ -6,65 +6,56 @@ on: ...@@ -6,65 +6,56 @@ on:
- 'document/**' - 'document/**'
types: [opened, synchronize, reopened] types: [opened, synchronize, reopened]
jobs: # Only one build per PR branch at a time
build-docs-image: concurrency:
permissions: group: 'preview-docs-build-${{ github.head_ref }}'
contents: read cancel-in-progress: true
pull-requests: write
permissions:
contents: read
runs-on: ubuntu-latest jobs:
build:
runs-on: ubuntu-24.04
steps: steps:
- name: Checkout PR code - name: Checkout PR code
uses: actions/checkout@v4 uses: actions/checkout@v4
with:
- name: Get current datetime ref: ${{ github.event.pull_request.head.sha }}
id: datetime repository: ${{ github.event.pull_request.head.repo.full_name }}
run: echo "datetime=$(date +'%Y%m%d%H%M%S')" >> $GITHUB_OUTPUT
- name: Set up Docker Buildx - name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3 uses: docker/setup-buildx-action@v3
- name: Build Docker image - name: Build Docker image (no push)
uses: docker/build-push-action@v5 uses: docker/build-push-action@v6
with: with:
context: ./document context: ./document
file: ./document/Dockerfile file: ./document/Dockerfile
platforms: linux/amd64
push: false push: false
tags: fastgpt-docs:${{ steps.datetime.outputs.datetime }} tags: fastgpt-docs-pr:${{ github.event.pull_request.head.sha }}
labels: | labels: |
org.opencontainers.image.source=https://github.com/${{ github.repository_owner }}/FastGPT org.opencontainers.image.source=https://github.com/${{ github.repository_owner }}/FastGPT
org.opencontainers.image.description=FastGPT Docs Preview org.opencontainers.image.description=FastGPT Docs Preview
build-args: | build-args: |
FASTGPT_HOME_DOMAIN=https://fastgpt.io FASTGPT_HOME_DOMAIN=https://fastgpt.io
outputs: type=docker,dest=/tmp/fastgpt-docs-${{ steps.datetime.outputs.datetime }}.tar outputs: type=docker,dest=/tmp/docs-image.tar
cache-from: type=gha,scope=docs
cache-to: type=gha,mode=max,scope=docs
- name: Save PR metadata
run: |
echo "${{ github.event.pull_request.number }}" > /tmp/pr-number.txt
echo "${{ github.event.pull_request.head.sha }}" > /tmp/pr-sha.txt
- name: Upload image artifact - name: Upload Docker image artifact
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
name: fastgpt-docs-${{ steps.datetime.outputs.datetime }} name: preview-docs-image
path: /tmp/fastgpt-docs-${{ steps.datetime.outputs.datetime }}.tar path: |
/tmp/docs-image.tar
/tmp/pr-number.txt
/tmp/pr-sha.txt
retention-days: 1 retention-days: 1
outputs:
datetime: ${{ steps.datetime.outputs.datetime }}
call-push-workflow:
needs: build-docs-image
permissions:
contents: read
packages: write
attestations: write
id-token: write
pull-requests: write
issues: write
uses: ./.github/workflows/preview-docs-push.yml
secrets:
ALI_IMAGE_USER: ${{ secrets.FASTGPT_ALI_IMAGE_USER }}
ALI_IMAGE_PSW: ${{ secrets.FASTGPT_ALI_IMAGE_PSW }}
ALI_IMAGE_PREFIX: ${{ secrets.FASTGPT_ALI_IMAGE_PREFIX }}
KUBE_CONFIG_CN: ${{ secrets.KUBE_CONFIG_CN }}
with:
pr_number: ${{ format('{0}', github.event.pull_request.number) }}
datetime: ${{ needs.build-docs-image.outputs.datetime }}
run_id: ${{ format('{0}', github.run_id) }}
name: Preview docs push name: Preview Docs Image — Push
on: on:
workflow_call: workflow_run:
inputs: workflows: ['Preview Docs Image Build']
pr_number: types: [completed]
required: true
type: string # Only one push at a time
datetime: concurrency:
required: true group: 'preview-docs-push'
type: string cancel-in-progress: false
run_id:
required: true
type: string
secrets:
ALI_IMAGE_USER:
required: true
ALI_IMAGE_PSW:
required: true
ALI_IMAGE_PREFIX:
required: true
KUBE_CONFIG_CN:
required: true
permissions: permissions:
contents: read contents: read
...@@ -28,88 +16,104 @@ permissions: ...@@ -28,88 +16,104 @@ permissions:
attestations: write attestations: write
id-token: write id-token: write
pull-requests: write pull-requests: write
issues: write # Required for issue-comment (PR comments use Issues API) issues: write
actions: read
jobs: jobs:
push-and-deploy: push:
runs-on: ubuntu-24.04 runs-on: ubuntu-24.04
# Only push when the build succeeded
if: ${{ github.event.workflow_run.conclusion == 'success' }}
steps: steps:
- name: Read PR information - name: Download build artifact
id: pr
run: |
PR_NUMBER="${{ inputs.pr_number }}"
echo "number=$PR_NUMBER" >> $GITHUB_OUTPUT
echo "Found PR #$PR_NUMBER"
- name: Get artifact name
id: artifacts
run: |
echo "datetime=${{ inputs.datetime }}" >> $GITHUB_OUTPUT
echo "artifact_name=fastgpt-docs-${{ inputs.datetime }}" >> $GITHUB_OUTPUT
- name: Download image artifact
uses: actions/download-artifact@v4 uses: actions/download-artifact@v4
with: with:
name: ${{ steps.artifacts.outputs.artifact_name }} name: preview-docs-image
path: /tmp/ path: /tmp
run-id: ${{ inputs.run_id }} run-id: ${{ github.event.workflow_run.id }}
github-token: ${{ secrets.GITHUB_TOKEN }} github-token: ${{ secrets.GITHUB_TOKEN }}
- name: Load Docker image - name: Read PR metadata
id: pr
run: | run: |
docker load -i /tmp/fastgpt-docs-${{ steps.artifacts.outputs.datetime }}.tar echo "number=$(cat /tmp/pr-number.txt)" >> "$GITHUB_OUTPUT"
echo "sha=$(cat /tmp/pr-sha.txt)" >> "$GITHUB_OUTPUT"
- name: Load Docker image
run: docker load --input /tmp/docs-image.tar
- name: Login to Aliyun - name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to Aliyun Container Registry
uses: docker/login-action@v3 uses: docker/login-action@v3
with: with:
registry: registry.cn-hangzhou.aliyuncs.com registry: registry.cn-hangzhou.aliyuncs.com
username: ${{ secrets.ALI_IMAGE_USER }} username: ${{ secrets.FASTGPT_ALI_IMAGE_USER }}
password: ${{ secrets.ALI_IMAGE_PSW }} password: ${{ secrets.FASTGPT_ALI_IMAGE_PSW }}
- name: Tag and push image
run: |
docker tag fastgpt-docs:${{ steps.artifacts.outputs.datetime }} \
${{ secrets.ALI_IMAGE_PREFIX }}/fastgpt-docs:${{ steps.artifacts.outputs.datetime }}
docker push ${{ secrets.ALI_IMAGE_PREFIX }}/fastgpt-docs:${{ steps.artifacts.outputs.datetime }}
- name: Setup kubeconfig - name: Tag and push Docker image
run: | run: |
mkdir -p $HOME/.kube docker tag fastgpt-docs-pr:${{ steps.pr.outputs.sha }} \
echo "${{ secrets.KUBE_CONFIG_CN }}" > $HOME/.kube/config ${{ secrets.FASTGPT_ALI_IMAGE_PREFIX }}/fastgpt-docs-pr:${{ steps.pr.outputs.sha }}
chmod 600 $HOME/.kube/config docker push ${{ secrets.FASTGPT_ALI_IMAGE_PREFIX }}/fastgpt-docs-pr:${{ steps.pr.outputs.sha }}
- name: Update deployment image - name: Update deployment image
env:
KUBE_CONFIG: ${{ secrets.KUBE_CONFIG_CN }}
run: | run: |
kubectl set image deployment/fastgpt-docs-preview \ KUBECONFIG_FILE=$(mktemp)
fastgpt-docs-preview=${{ secrets.ALI_IMAGE_PREFIX }}/fastgpt-docs:${{ steps.artifacts.outputs.datetime }} trap "rm -f $KUBECONFIG_FILE" EXIT
echo "$KUBE_CONFIG" > "$KUBECONFIG_FILE"
chmod 600 "$KUBECONFIG_FILE"
- name: Annotate deployment kubectl --kubeconfig "$KUBECONFIG_FILE" set image deployment/fastgpt-docs-preview \
run: | fastgpt-docs-preview=${{ secrets.FASTGPT_ALI_IMAGE_PREFIX }}/fastgpt-docs-pr:${{ steps.pr.outputs.sha }}
kubectl annotate deployment/fastgpt-docs-preview \
originImageName="${{ secrets.ALI_IMAGE_PREFIX }}/fastgpt-docs:${{ steps.artifacts.outputs.datetime }}" --overwrite kubectl --kubeconfig "$KUBECONFIG_FILE" annotate deployment/fastgpt-docs-preview \
originImageName="${{ secrets.FASTGPT_ALI_IMAGE_PREFIX }}/fastgpt-docs-pr:${{ steps.pr.outputs.sha }}" --overwrite
- name: Comment deployment status - name: Add PR comment on success
uses: FinleyGe/github-tools@0.0.1 if: success() && steps.pr.outputs.number != ''
if: success() uses: actions/github-script@v7
with: with:
token: ${{ secrets.GITHUB_TOKEN }} script: |
tool: issue-comment const prNumber = parseInt('${{ steps.pr.outputs.number }}');
issue-number: ${{ steps.pr.outputs.number }} const marker = '<!-- fastgpt-docs-preview -->';
title: 'Docs Preview:'
body: | const { data: comments } = await github.rest.issues.listComments({
--- owner: context.repo.owner,
🚀 **FastGPT Document Preview Ready!** repo: context.repo.repo,
issue_number: prNumber,
});
const existingComment = comments.find(comment =>
comment.body.includes(marker)
);
const commentBody = `${marker}
✅ **Docs Preview Deployed!**
🔗 [👀 Click here to visit preview](https://pueuoharpgcl.sealoshzh.site) 🔗 [👀 Click here to visit preview](https://pueuoharpgcl.sealoshzh.site)
- name: Comment on failure \`\`\`
uses: FinleyGe/github-tools@0.0.1 ${{ secrets.FASTGPT_ALI_IMAGE_PREFIX }}/fastgpt-docs-pr:${{ steps.pr.outputs.sha }}
if: failure() \`\`\`
with: `;
token: ${{ secrets.GITHUB_TOKEN }}
tool: issue-comment if (existingComment) {
issue-number: ${{ steps.pr.outputs.number }} await github.rest.issues.updateComment({
title: 'Docs Preview Deployment Failed' owner: context.repo.owner,
body: | repo: context.repo.repo,
Failed to deploy docs preview. Please check workflow logs. comment_id: existingComment.id,
body: commentBody
});
} else {
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: prNumber,
body: commentBody
});
}
name: Preview fastgpt build name: Preview FastGPT Image — Build
on: on:
pull_request: pull_request:
types: [opened, synchronize, reopened] types: [opened, synchronize, reopened]
branches: ['*']
jobs: # Only one build per PR branch at a time
build-preview-images: concurrency:
permissions: group: 'preview-fastgpt-build-${{ github.head_ref }}'
contents: read cancel-in-progress: true
pull-requests: write
permissions:
contents: read
jobs:
build:
runs-on: ubuntu-24.04 runs-on: ubuntu-24.04
strategy: strategy:
matrix: matrix:
image: [fastgpt, sandbox, mcp_server] image: [fastgpt, sandbox, mcp_server]
fail-fast: false # 即使一个镜像构建失败,也继续构建其他镜像 fail-fast: false
steps: steps:
- name: Checkout PR code - name: Checkout PR code
uses: actions/checkout@v4 uses: actions/checkout@v4
with: with:
fetch-depth: 0 ref: ${{ github.event.pull_request.head.sha }}
repository: ${{ github.event.pull_request.head.repo.full_name }}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
with:
driver-opts: network=host
- name: Cache Docker layers
uses: actions/cache@v4
with:
path: /tmp/.buildx-cache
key: ${{ runner.os }}-buildx-${{ github.sha }}-${{ matrix.image }}
restore-keys: |
${{ runner.os }}-buildx-${{ github.sha }}-
${{ runner.os }}-buildx-
- name: Set image config - name: Set image config
id: config id: config
...@@ -53,51 +45,38 @@ jobs: ...@@ -53,51 +45,38 @@ jobs:
echo "IMAGE_NAME=fastgpt-mcp-server" >> $GITHUB_OUTPUT echo "IMAGE_NAME=fastgpt-mcp-server" >> $GITHUB_OUTPUT
fi fi
- name: Build ${{ matrix.image }} image - name: Set up Docker Buildx
run: | uses: docker/setup-buildx-action@v3
docker buildx build \
-f ${{ steps.config.outputs.DOCKERFILE }} \ - name: Build Docker image (no push)
--label "org.opencontainers.image.source=https://github.com/${{ github.repository_owner }}/FastGPT" \ uses: docker/build-push-action@v6
--label "org.opencontainers.image.description=${{ steps.config.outputs.DESCRIPTION }}" \ with:
--label "org.opencontainers.image.revision=${{ github.sha }}" \ context: .
--cache-from=type=local,src=/tmp/.buildx-cache \ file: ${{ steps.config.outputs.DOCKERFILE }}
--cache-to=type=local,dest=/tmp/.buildx-cache-new,mode=max \ platforms: linux/amd64
--output type=docker,dest=/tmp/${{ steps.config.outputs.IMAGE_NAME }}-${{ github.sha }}.tar \ push: false
-t preview-image:${{ github.sha }} \ tags: ${{ steps.config.outputs.IMAGE_NAME }}-pr:${{ github.event.pull_request.head.sha }}
. labels: |
org.opencontainers.image.source=https://github.com/${{ github.repository_owner }}/FastGPT
org.opencontainers.image.description=${{ steps.config.outputs.DESCRIPTION }}
org.opencontainers.image.revision=${{ github.event.pull_request.head.sha }}
outputs: type=docker,dest=/tmp/${{ steps.config.outputs.IMAGE_NAME }}-image.tar
cache-from: type=gha,scope=${{ matrix.image }}
cache-to: type=gha,mode=max,scope=${{ matrix.image }}
- name: Move cache - name: Save PR metadata
run: | run: |
rm -rf /tmp/.buildx-cache echo "${{ github.event.pull_request.number }}" > /tmp/pr-number.txt
mv /tmp/.buildx-cache-new /tmp/.buildx-cache echo "${{ github.event.pull_request.head.sha }}" > /tmp/pr-sha.txt
echo "${{ matrix.image }}" > /tmp/image-type.txt
- name: Upload image artifact - name: Upload Docker image artifact
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
name: ${{ steps.config.outputs.IMAGE_NAME }}-${{ github.sha }} name: preview-${{ matrix.image }}-image
path: /tmp/${{ steps.config.outputs.IMAGE_NAME }}-${{ github.sha }}.tar path: |
/tmp/${{ steps.config.outputs.IMAGE_NAME }}-image.tar
/tmp/pr-number.txt
/tmp/pr-sha.txt
/tmp/image-type.txt
retention-days: 1 retention-days: 1
call-push-workflow:
needs: build-preview-images
strategy:
matrix:
image: [fastgpt, sandbox, mcp_server]
fail-fast: false
permissions:
contents: read
packages: write
attestations: write
id-token: write
pull-requests: write
issues: write
uses: ./.github/workflows/preview-fastgpt-push.yml
secrets:
ALI_IMAGE_USER: ${{ secrets.FASTGPT_ALI_IMAGE_USER }}
ALI_IMAGE_PSW: ${{ secrets.FASTGPT_ALI_IMAGE_PSW }}
ALI_IMAGE_PREFIX: ${{ secrets.FASTGPT_ALI_IMAGE_PREFIX }}
with:
pr_number: ${{ format('{0}', github.event.pull_request.number) }}
pr_sha: ${{ github.sha }}
run_id: ${{ format('{0}', github.run_id) }}
image: ${{ matrix.image }}
name: Preview fastgpt push name: Preview FastGPT Image — Push
on: on:
workflow_call: workflow_run:
inputs: workflows: ['Preview FastGPT Image Build']
pr_number: types: [completed]
required: true
type: string
pr_sha:
required: true
type: string
run_id:
required: true
type: string
image:
required: true
type: string
secrets:
ALI_IMAGE_USER:
required: true
ALI_IMAGE_PSW:
required: true
ALI_IMAGE_PREFIX:
required: true
permissions: # Only one push at a time
contents: read concurrency:
packages: write group: 'preview-fastgpt-push'
attestations: write cancel-in-progress: false
id-token: write
pull-requests: write
issues: write
permissions: permissions:
contents: read contents: read
...@@ -38,95 +17,102 @@ permissions: ...@@ -38,95 +17,102 @@ permissions:
id-token: write id-token: write
pull-requests: write pull-requests: write
issues: write issues: write
actions: read
jobs: jobs:
push-preview-images: push:
runs-on: ubuntu-24.04 runs-on: ubuntu-24.04
# Only push when the build succeeded
if: ${{ github.event.workflow_run.conclusion == 'success' }}
strategy:
matrix:
image: [fastgpt, sandbox, mcp_server]
fail-fast: false
steps: steps:
- name: Read PR information
id: pr
run: |
echo "number=${{ inputs.pr_number }}" >> $GITHUB_OUTPUT
echo "sha=${{ inputs.pr_sha }}" >> $GITHUB_OUTPUT
echo "Found PR #${{ inputs.pr_number }} (SHA: ${{ inputs.pr_sha }})"
- name: Set image config - name: Set image config
id: config id: config
run: | run: |
SHA="${{ steps.pr.outputs.sha }}" if [[ "${{ matrix.image }}" == "fastgpt" ]]; then
if [[ "${{ inputs.image }}" == "fastgpt" ]]; then
echo "IMAGE_NAME=fastgpt" >> $GITHUB_OUTPUT echo "IMAGE_NAME=fastgpt" >> $GITHUB_OUTPUT
echo "DESCRIPTION=fastgpt-pr image" >> $GITHUB_OUTPUT elif [[ "${{ matrix.image }}" == "sandbox" ]]; then
echo "DOCKER_REPO_TAGGED=${{ secrets.ALI_IMAGE_PREFIX }}/fastgpt-pr:fastgpt_${SHA}" >> $GITHUB_OUTPUT
elif [[ "${{ inputs.image }}" == "sandbox" ]]; then
echo "IMAGE_NAME=fastgpt-sandbox" >> $GITHUB_OUTPUT echo "IMAGE_NAME=fastgpt-sandbox" >> $GITHUB_OUTPUT
echo "DESCRIPTION=fastgpt-sandbox-pr image" >> $GITHUB_OUTPUT elif [[ "${{ matrix.image }}" == "mcp_server" ]]; then
echo "DOCKER_REPO_TAGGED=${{ secrets.ALI_IMAGE_PREFIX }}/fastgpt-pr:fastgpt_sandbox_${SHA}" >> $GITHUB_OUTPUT
elif [[ "${{ inputs.image }}" == "mcp_server" ]]; then
echo "IMAGE_NAME=fastgpt-mcp-server" >> $GITHUB_OUTPUT echo "IMAGE_NAME=fastgpt-mcp-server" >> $GITHUB_OUTPUT
echo "DESCRIPTION=fastgpt-mcp_server-pr image" >> $GITHUB_OUTPUT
echo "DOCKER_REPO_TAGGED=${{ secrets.ALI_IMAGE_PREFIX }}/fastgpt-pr:fastgpt_mcp_server_${SHA}" >> $GITHUB_OUTPUT
fi fi
- name: Download image artifact - name: Download build artifact
uses: actions/download-artifact@v4 uses: actions/download-artifact@v4
with: with:
name: ${{ steps.config.outputs.IMAGE_NAME }}-${{ steps.pr.outputs.sha }} name: preview-${{ matrix.image }}-image
path: /tmp/ path: /tmp
run-id: ${{ inputs.run_id }} run-id: ${{ github.event.workflow_run.id }}
github-token: ${{ secrets.GITHUB_TOKEN }} github-token: ${{ secrets.GITHUB_TOKEN }}
- name: Load Docker image - name: Read PR metadata
id: pr
run: | run: |
docker load -i /tmp/${{ steps.config.outputs.IMAGE_NAME }}-${{ steps.pr.outputs.sha }}.tar echo "number=$(cat /tmp/pr-number.txt)" >> "$GITHUB_OUTPUT"
echo "sha=$(cat /tmp/pr-sha.txt)" >> "$GITHUB_OUTPUT"
- name: Scan image for vulnerabilities - name: Load Docker image
continue-on-error: true run: docker load --input /tmp/${{ steps.config.outputs.IMAGE_NAME }}-image.tar
run: |
# 安装 Trivy
wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | sudo apt-key add -
echo "deb https://aquasecurity.github.io/trivy-repo/deb $(lsb_release -sc) main" | sudo tee -a /etc/apt/sources.list.d/trivy.list
sudo apt-get update
sudo apt-get install trivy -y
# 扫描镜像 - name: Set up Docker Buildx
trivy image --severity HIGH,CRITICAL --exit-code 0 preview-image:${{ steps.pr.outputs.sha }} uses: docker/setup-buildx-action@v3
- name: Login to Aliyun Container Registry - name: Login to Aliyun Container Registry
uses: docker/login-action@v3 uses: docker/login-action@v3
with: with:
registry: registry.cn-hangzhou.aliyuncs.com registry: registry.cn-hangzhou.aliyuncs.com
username: ${{ secrets.ALI_IMAGE_USER }} username: ${{ secrets.FASTGPT_ALI_IMAGE_USER }}
password: ${{ secrets.ALI_IMAGE_PSW }} password: ${{ secrets.FASTGPT_ALI_IMAGE_PSW }}
- name: Tag and push image - name: Tag and push Docker image
run: | run: |
docker tag preview-image:${{ steps.pr.outputs.sha }} ${{ steps.config.outputs.DOCKER_REPO_TAGGED }} SHA="${{ steps.pr.outputs.sha }}"
docker push ${{ steps.config.outputs.DOCKER_REPO_TAGGED }} docker tag ${{ steps.config.outputs.IMAGE_NAME }}-pr:${SHA} \
${{ secrets.FASTGPT_ALI_IMAGE_PREFIX }}/fastgpt-pr:${{ matrix.image }}_${SHA}
docker push ${{ secrets.FASTGPT_ALI_IMAGE_PREFIX }}/fastgpt-pr:${{ matrix.image }}_${SHA}
- name: Comment push status - name: Add PR comment on success
uses: FinleyGe/github-tools@0.0.1 if: success() && steps.pr.outputs.number != ''
if: success() uses: actions/github-script@v7
with:
token: ${{ secrets.GITHUB_TOKEN }}
tool: issue-comment
issue-number: ${{ steps.pr.outputs.number }}
title: 'Preview ${{ inputs.image }} Image:'
body: |
```
${{ steps.config.outputs.DOCKER_REPO_TAGGED }}
```
- name: Comment on failure
uses: FinleyGe/github-tools@0.0.1
if: failure()
with: with:
token: ${{ secrets.GITHUB_TOKEN }} script: |
tool: issue-comment const prNumber = parseInt('${{ steps.pr.outputs.number }}');
issue-number: ${{ steps.pr.outputs.number }} const marker = '<!-- fastgpt-preview-${{ matrix.image }} -->';
title: 'Preview ${{ inputs.image }} Image Push Failed'
body: | const { data: comments } = await github.rest.issues.listComments({
Failed to push preview image. Please check workflow logs. owner: context.repo.owner,
repo: context.repo.repo,
issue_number: prNumber,
});
const existingComment = comments.find(comment =>
comment.body.includes(marker)
);
const commentBody = `${marker}
✅ **Build Successful** - Preview ${{ matrix.image }} Image for this PR:
\`\`\`
${{ secrets.FASTGPT_ALI_IMAGE_PREFIX }}/fastgpt-pr:${{ matrix.image }}_${{ steps.pr.outputs.sha }}
\`\`\`
`;
if (existingComment) {
await github.rest.issues.updateComment({
owner: context.repo.owner,
repo: context.repo.repo,
comment_id: existingComment.id,
body: commentBody
});
} else {
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: prNumber,
body: commentBody
});
}
...@@ -20,7 +20,7 @@ jobs: ...@@ -20,7 +20,7 @@ jobs:
repository: ${{ github.event.pull_request.head.repo.full_name }} repository: ${{ github.event.pull_request.head.repo.full_name }}
- uses: pnpm/action-setup@v4 - uses: pnpm/action-setup@v4
with: with:
version: 9 version: 10
- name: 'Install Deps' - name: 'Install Deps'
run: pnpm install run: pnpm install
- name: 'Test' - name: 'Test'
......
...@@ -20,7 +20,7 @@ jobs: ...@@ -20,7 +20,7 @@ jobs:
- uses: pnpm/action-setup@v4 - uses: pnpm/action-setup@v4
with: with:
version: 9.4.0 version: 10
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
with: with:
......
...@@ -129,7 +129,7 @@ export async function generateMetadata(props: { ...@@ -129,7 +129,7 @@ export async function generateMetadata(props: {
}); });
return { return {
title: `${page.data.title} | FastGPT`, title: page.data.title,
description: page.data.description, description: page.data.description,
alternates: { alternates: {
canonical: url, canonical: url,
......
{
"$schema": "node_modules/@fumadocs/cli/dist/schema/default.json",
"aliases": {
"uiDir": "./components/ui",
"componentsDir": "./components",
"blockDir": "./components",
"cssDir": "./styles",
"libDir": "./lib"
},
"baseDir": "",
"uiLibrary": "radix-ui",
"commands": {}
}
\ No newline at end of file
'use client';
import { Check, Link as LinkIcon } from 'lucide-react';
import { ComponentProps, type ReactNode, useEffect, useRef, useState } from 'react';
import { cn } from '../lib/cn';
import { useCopyButton } from 'fumadocs-ui/utils/use-copy-button';
import { buttonVariants } from './ui/button';
import { mergeRefs } from '../lib/merge-refs';
import {
Accordion as Root,
AccordionContent,
AccordionHeader,
AccordionItem,
AccordionTrigger,
} from './ui/accordion';
export function Accordions({
type = 'single',
ref,
className,
defaultValue,
...props
}: ComponentProps<typeof Root>) {
const rootRef = useRef<HTMLDivElement>(null);
const composedRef = mergeRefs(ref, rootRef);
const [value, setValue] = useState<string | string[]>(() =>
type === 'single' ? (defaultValue ?? '') : (defaultValue ?? []),
);
useEffect(() => {
const id = window.location.hash.substring(1);
const element = rootRef.current;
if (!element || id.length === 0) return;
const selected = document.getElementById(id);
if (!selected || !element.contains(selected)) return;
const value = selected.getAttribute('data-accordion-value');
if (value) setValue((prev) => (typeof prev === 'string' ? value : [value, ...prev]));
}, []);
return (
// @ts-expect-error -- Multiple types
<Root
type={type}
ref={composedRef}
value={value}
onValueChange={setValue}
collapsible={type === 'single' ? true : undefined}
className={cn(
'divide-y divide-fd-border overflow-hidden rounded-lg border bg-fd-card',
className,
)}
{...props}
/>
);
}
export function Accordion({
title,
id,
value = String(title),
children,
...props
}: Omit<ComponentProps<typeof AccordionItem>, 'value' | 'title'> & {
title: string | ReactNode;
value?: string;
}) {
return (
<AccordionItem value={value} {...props}>
<AccordionHeader id={id} data-accordion-value={value}>
<AccordionTrigger>{title}</AccordionTrigger>
{id ? <CopyButton id={id} /> : null}
</AccordionHeader>
<AccordionContent>
<div className="px-4 pb-2 text-[0.9375rem] prose-no-margin">{children}</div>
</AccordionContent>
</AccordionItem>
);
}
function CopyButton({ id }: { id: string }) {
const [checked, onClick] = useCopyButton(() => {
const url = new URL(window.location.href);
url.hash = id;
return navigator.clipboard.writeText(url.toString());
});
return (
<button
type="button"
aria-label="Copy Link"
className={cn(
buttonVariants({
color: 'ghost',
className: 'text-fd-muted-foreground me-2',
}),
)}
onClick={onClick}
>
{checked ? <Check className="size-3.5" /> : <LinkIcon className="size-3.5" />}
</button>
);
}
'use client';
import * as Primitive from '@radix-ui/react-accordion';
import { ChevronRight } from 'lucide-react';
import { type ComponentProps } from 'react';
import { cn } from '../../lib/cn';
export function Accordion({ className, ...props }: ComponentProps<typeof Primitive.Root>) {
return (
<Primitive.Root
className={cn(
'divide-y divide-fd-border overflow-hidden rounded-lg border bg-fd-card',
className,
)}
{...props}
/>
);
}
export function AccordionItem({
className,
children,
...props
}: ComponentProps<typeof Primitive.Item>) {
return (
<Primitive.Item className={cn('scroll-m-24', className)} {...props}>
{children}
</Primitive.Item>
);
}
export function AccordionHeader({
className,
children,
...props
}: ComponentProps<typeof Primitive.Header>) {
return (
<Primitive.Header
className={cn(
'not-prose flex flex-row items-center text-fd-card-foreground font-medium has-focus-visible:bg-fd-accent',
className,
)}
{...props}
>
{children}
</Primitive.Header>
);
}
export function AccordionTrigger({
className,
children,
...props
}: ComponentProps<typeof Primitive.Trigger>) {
return (
<Primitive.Trigger
className={cn(
'group flex flex-1 items-center gap-2 px-3 py-2.5 text-start focus-visible:outline-none',
className,
)}
{...props}
>
<ChevronRight className="size-4 shrink-0 text-fd-muted-foreground transition-transform duration-200 group-data-[state=open]:rotate-90" />
{children}
</Primitive.Trigger>
);
}
export function AccordionContent({
className,
children,
...props
}: ComponentProps<typeof Primitive.Content>) {
return (
<Primitive.Content
className={cn(
'overflow-hidden data-[state=closed]:animate-fd-accordion-up data-[state=open]:animate-fd-accordion-down',
className,
)}
{...props}
>
{children}
</Primitive.Content>
);
}
import { cva, type VariantProps } from 'class-variance-authority';
const variants = {
primary:
'bg-fd-primary text-fd-primary-foreground hover:bg-fd-primary/80 disabled:bg-fd-secondary disabled:text-fd-secondary-foreground',
outline: 'border hover:bg-fd-accent hover:text-fd-accent-foreground',
ghost: 'hover:bg-fd-accent hover:text-fd-accent-foreground',
secondary:
'border bg-fd-secondary text-fd-secondary-foreground hover:bg-fd-accent hover:text-fd-accent-foreground',
} as const;
export const buttonVariants = cva(
'inline-flex items-center justify-center rounded-md p-2 text-sm font-medium transition-colors duration-100 disabled:pointer-events-none disabled:opacity-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fd-ring',
{
variants: {
variant: variants,
// fumadocs use `color` instead of `variant`
color: variants,
size: {
sm: 'gap-1 px-2 py-1.5 text-xs',
icon: 'p-1.5 [&_svg]:size-5',
'icon-sm': 'p-1.5 [&_svg]:size-4.5',
'icon-xs': 'p-1 [&_svg]:size-4',
},
},
},
);
export type ButtonProps = VariantProps<typeof buttonVariants>;
---
title: Connect Models via AI Proxy
description: Connect Models via AI Proxy
---
Starting from `FastGPT 4.8.23`, AI Proxy was introduced to further simplify model configuration.
Similar to One API, AI Proxy serves as an OpenAI API management and distribution system that provides access to all LLMs through the standard OpenAI API format, ready to use out of the box.
## Deployment
### Docker Version
The `docker-compose.yml` file already includes the AI Proxy configuration and can be used directly. [View the latest yml configuration](https://raw.githubusercontent.com/labring/FastGPT/main/deploy/docker/docker-compose-pgvector.yml)
If upgrading from an older version, copy the AI Proxy section from the yml and add it to your existing yml file.
## How It Works
AI Proxy core modules:
1. Channel Management: Manage API keys and available model lists from various model providers.
2. Model Invocation: Select the corresponding channel based on the requested model; construct the request body according to the channel's API format and send the request; format the response into a standard format before returning.
3. Call Logs: Detailed logging of model invocations, with the ability to record input parameters and error messages on failure for easier debugging.
Workflow:
![aiproxy12](/imgs/aiproxy1.png)
## Using AI Proxy in FastGPT
AI Proxy features can be found on the `Account - Model Providers` page.
### 1. Create a Channel
On the `Model Providers` configuration page, click `Model Channels` to enter the channel configuration page.
![aiproxy1](/imgs/aiproxy-1.png)
Click "Add Channel" in the upper right corner to enter the channel configuration page.
![aiproxy2](/imgs/aiproxy-2.png)
Using Alibaba Cloud models as an example:
![aiproxy3](/imgs/aiproxy-3.png)
1. Channel Name: The display name for the channel, used for identification only;
2. Provider: The provider corresponding to the model. Different providers have different default addresses and API key formats;
3. Models: The specific models available for this channel. The system includes mainstream models by default. If the desired option is not in the dropdown, click "Add Model" to [add a custom model](/docs/self-host/config/model/intro/#add-custom-models);
4. Model Mapping: Map the model requested by FastGPT to the actual model provided. For example:
```json
{
"gpt-4o-test": "gpt-4o"
}
```
The model in FastGPT is `gpt-4o-test`, and the request to AI Proxy also uses `gpt-4o-test`. When AI Proxy sends the request upstream, the actual `model` is `gpt-4o`.
5. Proxy Address: The actual request address. The system provides default addresses for each mainstream channel. No need to fill in if no changes are required.
6. API Key: The API credentials obtained from the model provider. Note that some providers require multiple key combinations — follow the prompts to enter them.
Click "Add" to see the newly configured channel under "Model Channels".
![aiproxy4](/imgs/aiproxy-4.png)
### 2. Channel Testing
You can then test the channel to ensure the configured models are working properly.
![aiproxy5](/imgs/aiproxy-5.png)
Click "Model Test" to see the list of configured models, then click "Start Test".
![aiproxy6](/imgs/aiproxy-6.png)
After the test completes, the results and request duration for each model will be displayed.
![aiproxy7](/imgs/aiproxy-7.png)
### 3. Enable Models
Finally, in `Model Configuration`, you can enable the corresponding models to use them on the platform. For more model configuration details, see [Model Configuration](/docs/self-host/config/model/intro).
![aiproxy8](/imgs/aiproxy-8.png)
## Other Features
### Priority
Range: 1-100. Higher values are more likely to be selected first.
![aiproxy9](/imgs/aiproxy-9.png)
### Enable/Disable
In the control menu on the right side of a channel, you can enable or disable it. Disabled channels will no longer provide model services.
![aiproxy10](/imgs/aiproxy-10.png)
### Call Logs
The `Call Logs` page displays request records sent to models, including input/output tokens, request time, duration, request address, and more. Failed requests include detailed input parameters and error messages for debugging, but are only retained for 1 hour (configurable via environment variables).
![aiproxy11](/imgs/aiproxy-11.png)
## Migrating from OneAPI to AI Proxy
You can send an HTTP request from any terminal. Replace `{{host}}` with the AI Proxy address and `{{admin_key}}` with the value of `ADMIN_KEY` in AI Proxy.
The body parameter `dsn` is the MySQL connection string for OneAPI.
```bash
curl --location --request POST '{{host}}/api/channels/import/oneapi' \
--header 'Authorization: Bearer {{admin_key}}' \
--header 'Content-Type: application/json' \
--data-raw '{
"dsn": "mysql://root:s5mfkwst@tcp(dbconn.sealoshzh.site:33123)/mydb"
}'
```
A successful execution returns `"success": true`.
The migration script is not fully precise — it only performs simple data mapping, primarily migrating `proxy addresses`, `models`, and `API keys`. Manual verification after migration is recommended.
---
title: 通过 AI Proxy 接入模型
description: 通过 AI Proxy 接入模型
---
从 `FastGPT 4.8.23` 版本开始,引入 AI Proxy 来进一步方便模型的配置。
AI Proxy 与 One API 类似,也是作为一个 OpenAI 接口管理 & 分发系统,可以通过标准的 OpenAI API 格式访问所有的大模型,开箱即用。
## 部署
### Docker 版本
`docker-compose.yml` 文件已加入了 AI Proxy 配置,可直接使用。[点击查看最新的 yml 配置](https://raw.githubusercontent.com/labring/FastGPT/main/deploy/docker/docker-compose-pgvector.yml)
从旧版升级的用户,可以复制 yml 里,ai proxy 的配置,加入到旧的 yml 文件中。
## 运行原理
AI proxy 核心模块:
1. 渠道管理:管理各家模型提供商的 API Key 和可用模型列表。
2. 模型调用:根据请求的模型,选中对应的渠道;根据渠道的 API 格式,构造请求体,发送请求;格式化响应体成标准格式返回。
3. 调用日志:详细记录模型调用的日志,并在错误时候可以记录其入参和报错信息,方便排查。
运行流程:
![aiproxy12](/imgs/aiproxy1.png)
## 在 FastGPT 中使用
AI proxy 相关功能,可以在`账号-模型提供商`页面找到。
### 1. 创建渠道
在`模型提供商`的配置页面,点击`模型渠道`,进入渠道配置页面
![aiproxy1](/imgs/aiproxy-1.png)
点击右上角的“新增渠道”,即可进入渠道配置页面
![aiproxy2](/imgs/aiproxy-2.png)
以阿里云的模型为例,进行如下配置
![aiproxy3](/imgs/aiproxy-3.png)
1. 渠道名:展示在外部的渠道名称,仅作标识;
2. 厂商:模型对应的厂商,不同厂商对应不同的默认地址和 API 密钥格式;
3. 模型:当前渠道具体可以使用的模型,系统内置了主流的一些模型,如果下拉框中没有想要的选项,可以点击“新增模型”,[增加自定义模型](/docs/self-host/config/model/intro/#新增自定义模型);
4. 模型映射:将 FastGPT 请求的模型,映射到具体提供的模型上。例如:
```json
{
"gpt-4o-test": "gpt-4o"
}
```
FatGPT 中的模型为 `gpt-4o-test`,向 AI Proxy 发起请求时也是 `gpt-4o-test`。AI proxy 在向上游发送请求时,实际的`model`为 `gpt-4o`。
5. 代理地址:具体请求的地址,系统给每个主流渠道配置了默认的地址,如果无需改动则不用填。
6. API 密钥:从模型厂商处获取的 API 凭证。注意部分厂商需要提供多个密钥组合,可以根据提示进行输入。
最后点击“新增”,就能在“模型渠道”下看到刚刚配置的渠道
![aiproxy4](/imgs/aiproxy-4.png)
### 2. 渠道测试
然后可以对渠道进行测试,确保配置的模型有效
![aiproxy5](/imgs/aiproxy-5.png)
点击“模型测试”,可以看到配置的模型列表,点击“开始测试”
![aiproxy6](/imgs/aiproxy-6.png)
等待模型测试完成后,会输出每个模型的测试结果以及请求时长
![aiproxy7](/imgs/aiproxy-7.png)
### 3. 启用模型
最后在`模型配置`中,可以选择启用对应的模型,这样就能在平台中使用了,更多模型配置可以参考[模型配置](/docs/self-host/config/model/intro)
![aiproxy8](/imgs/aiproxy-8.png)
## 其他功能介绍
### 优先级
范围1~100。数值越大,越容易被优先选中。
![aiproxy9](/imgs/aiproxy-9.png)
### 启用/禁用
在渠道右侧的控制菜单中,还可以控制渠道的启用或禁用,被禁用的渠道将无法再提供模型服务
![aiproxy10](/imgs/aiproxy-10.png)
### 调用日志
在 `调用日志` 页面,会展示发送到模型处的请求记录,包括具体的输入输出 tokens、请求时间、请求耗时、请求地址等等。错误的请求,则会详细的入参和错误信息,方便排查,但仅会保留 1 小时(环境变量里可配置)。
![aiproxy11](/imgs/aiproxy-11.png)
## 从 OneAPI 迁移到 AI Proxy
可以从任意终端,发起 1 个 HTTP 请求。其中 `{{host}}` 替换成 AI Proxy 地址,`{{admin_key}}` 替换成 AI Proxy 中 `ADMIN_KEY` 的值。
Body 参数 `dsn` 为 OneAPI 的 mysql 连接串。
```bash
curl --location --request POST '{{host}}/api/channels/import/oneapi' \
--header 'Authorization: Bearer {{admin_key}}' \
--header 'Content-Type: application/json' \
--data-raw '{
"dsn": "mysql://root:s5mfkwst@tcp(dbconn.sealoshzh.site:33123)/mydb"
}'
```
执行成功的情况下会返回 "success": true
脚本目前不是完全准,仅是简单的做数据映射,主要是迁移`代理地址`、`模型`和`API 密钥`,建议迁移后再进行手动检查。
{ {
"title": "Model Configuration", "title": "Model Configuration",
"pages": ["intro", "ai-proxy", "one-api", "siliconCloud", "ppio"] "pages": ["intro", "siliconCloud"]
} }
{ {
"title": "模型配置方案", "title": "模型配置方案",
"pages": ["intro", "ai-proxy", "one-api", "siliconCloud", "ppio"] "pages": ["intro", "siliconCloud"]
} }
---
title: Connect Models via OneAPI
description: Connect Models via OneAPI
---
FastGPT uses a model-separated deployment approach. FastGPT only supports the OpenAI model specification (models not available in OpenAI follow a more generic specification), and uses [One API](https://github.com/songquanpeng/one-api) to unify access to different model interfaces.
[One API](https://github.com/songquanpeng/one-api) is an OpenAI API management and distribution system that provides access to all LLMs through the standard OpenAI API format, ready to use out of the box.
## Relationship Between FastGPT and One API
Think of One API as a gateway. The relationship between FastGPT and One API:
![](/imgs/sealos-fastgpt.webp)
## Deployment
### Sealos Version
* Beijing region: [Deploy OneAPI](https://hzh.sealos.run/?openapp=system-template%3FtemplateName%3Done-api)
* Singapore region (GPT available): [Deploy OneAPI](https://cloud.sealos.io/?openapp=system-template%3FtemplateName%3Done-api&uid=fnWRt09fZP)
![alt text](/imgs/image-59.png)
After deployment, open the OneAPI access link to proceed with the next steps.
## OneAPI Basic Tutorial
### Concepts
1. Channels:
1. In OneAPI, a channel corresponds to one `Api Key`, which can be from GPT, Microsoft, ChatGLM, ERNIE Bot, etc. A single `Api Key` can typically call multiple models from the same provider.
2. One API routes requests to channels based on the `model` specified in the request. If a model maps to multiple channels, one is selected at random.
2. Tokens: Credentials required to access One API. You only need this single credential to access all models configured in One API. In FastGPT, you only need to configure the `baseurl` and `token` from One API. Do not set any model scope restrictions on the token, as this can cause errors.
![alt text](/imgs/image-60.png)
### General Workflow
1. Client sends a request to One API.
2. One API matches the request to a channel based on the `model` parameter (must match exactly with the models in the channel). If multiple channels match, one is selected at random (same priority).
3. One API sends the request to the actual endpoint.
4. One API returns the result to the client.
### 1. Log in to One API
![step5](/imgs/oneapi-step5.png)
### 2. Create a Channel
Add a channel in One API. Click [Add Base Models] directly — don't forget the embedding models.
![step6](/imgs/oneapi-step6.png)
### 3. Create a Token
| | |
| --- | --- |
| ![step7](/imgs/oneapi-step7.png) | ![alt text](/imgs/image-61.png) |
### 4. Adjust Account Balance
One API defaults to $200 for the root user. You can edit this as needed.
![alt text](/imgs/image-62.png)
### 5. Update FastGPT Environment Variables
With the One API token, FastGPT can send requests to One API by modifying the `baseurl` and `key`, and One API will forward them to the appropriate models. Update these two environment variables:
```bash
# Make sure to include v1. If on the same network, you can use the internal address.
OPENAI_BASE_URL=https://xxxx.cloud.sealos.io/v1
# The key below is the token provided by One API
CHAT_API_KEY=sk-xxxxxx
```
## Connect Other Models
**Example: Adding ERNIE Bot:**
### 1. Add a Model Channel in OneAPI
Select "Baidu Wenxin Qianfan" as the type.
![](/imgs/oneapi-demo1.png)
### 2. Update FastGPT Model Configuration
Open FastGPT model configuration and enable the Wenxin Qianfan model. If the model is not built-in, you can add it manually through the "Add Model" option.
![alt text](/imgs/image-103.png)
## Other Provider Integration References
This section covers tutorials for connecting various providers to OneAPI. After configuration, don't forget to enable the models in FastGPT's model configuration.
### Alibaba Qwen (Tongyi Qianwen)
Qwen is now compatible with the GPT format and can be connected directly using the OpenAI type. As shown below, select `OpenAI` as the type and fill in the Alibaba Cloud proxy address.
You can directly use Alibaba Cloud's language models and the `text-embedding-v3` embedding model (confirmed to be normalized and ready to use).
![alt text](/imgs/image-63.png)
### SiliconCloud — Open Source Model Collection
[SiliconCloud](https://cloud.siliconflow.cn/i/TR9Ym0c4) is a platform specializing in open source model inference with its own acceleration engine. It offers a wide range of models, making it ideal for low-cost testing of open source models. Integration steps:
1. [Register a SiliconCloud account](https://cloud.siliconflow.cn/i/TR9Ym0c4)
2. Go to the console and get your API key: https://cloud.siliconflow.cn/account/ak
3. Add a new OneAPI channel, select `OpenAI` as the type, set the proxy to `https://api.siliconflow.cn`, and use the API key from step 2.
![alt text](/imgs/image-64.png)
Since OneAPI doesn't include SiliconCloud model names by default, you can enter custom model names. Here's how to find the model names:
1. Open the [SiliconCloud model list](https://siliconflow.cn/zh-cn/models)
2. Click on a model to open its details.
3. Copy the model name into OneAPI.
| | | |
| --- | --- | --- |
| ![alt text](/imgs/image-65.png) | ![alt text](/imgs/image-66.png)| ![alt text](/imgs/image-67.png) |
---
title: 通过 OneAPI 接入模型
description: 通过 OneAPI 接入模型
---
FastGPT 目前采用模型分离的部署方案,FastGPT 中只兼容 OpenAI 的模型规范(OpenAI 不存在的模型采用一个较为通用的规范),并通过 [One API](https://github.com/songquanpeng/one-api) 来实现对不同模型接口的统一。
[One API](https://github.com/songquanpeng/one-api) 是一个 OpenAI 接口管理 & 分发系统,可以通过标准的 OpenAI API 格式访问所有的大模型,开箱即用。
## FastGPT 与 One API 关系
可以把 One API 当做一个网关,FastGPT 与 One API 关系:
![](/imgs/sealos-fastgpt.webp)
## 部署
### Sealos 版本
* 北京区: [点击部署 OneAPI](https://hzh.sealos.run/?openapp=system-template%3FtemplateName%3Done-api)
* 新加坡区(可用 GPT) [点击部署 OneAPI](https://cloud.sealos.io/?openapp=system-template%3FtemplateName%3Done-api&uid=fnWRt09fZP)
![alt text](/imgs/image-59.png)
部署完后,可以打开 OneAPI 访问链接,进行下一步操作。
## OneAPI 基础教程
### 概念
1. 渠道:
1. OneApi 中一个渠道对应一个 `Api Key`,这个 `Api Key` 可以是GPT、微软、ChatGLM、文心一言的。一个`Api Key`通常可以调用同一个厂商的多个模型。
2. One API 会根据请求传入的`模型`来决定使用哪一个`渠道`,如果一个模型对应了多个`渠道`,则会随机调用。
2. 令牌:访问 One API 所需的凭证,只需要这`1`个凭证即可访问`One API`上配置的模型。因此`FastGPT`中,只需要配置`One API`的`baseurl`和`令牌`即可。令牌不要设置任何的模型范围权限,否则容易报错。
![alt text](/imgs/image-60.png)
### 大致工作流程
1. 客户端请求 One API
2. 根据请求中的 `model` 参数,匹配对应的渠道(根据渠道里的模型进行匹配,必须完全一致)。如果匹配到多个渠道,则随机选择一个(同优先级)。
3. One API 向真正的地址发出请求。
4. One API 将结果返回给客户端。
### 1. 登录 One API
![step5](/imgs/oneapi-step5.png)
### 2. 创建渠道
在 One API 中添加对应渠道,直接点击 【添加基础模型】,不要遗漏了向量模型(Embedding)
![step6](/imgs/oneapi-step6.png)
### 3. 创建令牌
| | |
| --- | --- |
| ![step7](/imgs/oneapi-step7.png) | ![alt text](/imgs/image-61.png) |
### 4. 修改账号余额
One API 默认 root 用户只有 200刀,可以自行修改编辑。
![alt text](/imgs/image-62.png)
### 5. 修改 FastGPT 的环境变量
有了 One API 令牌后,FastGPT 可以通过修改 `baseurl` 和 `key` 去请求到 One API,再由 One API 去请求不同的模型。修改下面两个环境变量:
```bash
# 务必写上 v1。如果在同一个网络内,可改成内网地址。
OPENAI_BASE_URL=https://xxxx.cloud.sealos.io/v1
# 下面的 key 是由 One API 提供的令牌
CHAT_API_KEY=sk-xxxxxx
```
## 接入其他模型
**以添加文心一言为例:**
### 1. OneAPI 新增模型渠道
类型选择百度文心千帆。
![](/imgs/oneapi-demo1.png)
### 2. 修改 FastGPT 模型配置
打开 FastGPT 模型配置,启动文心千帆模型,如果希望未内置,可以通过新增模型来配置。
![alt text](/imgs/image-103.png)
## 其他服务商接入参考
这章介绍一些提供商接入 OneAPI 的教程,配置后不要忘记在 FastGPT 模型配置中启用。
### 阿里通义千问
千问目前已经兼容 GPT 格式,可以直接选择 OpenAI 类型来接入即可。如下图,选择类型为`OpenAI`,代理填写阿里云的代理地址。
目前可以直接使用阿里云的语言模型和 `text-embedding-v3` 向量模型(实测已经归一化,可直接使用)
![alt text](/imgs/image-63.png)
### 硅基流动 —— 开源模型大合集
[硅基流动](https://cloud.siliconflow.cn/i/TR9Ym0c4) 是一个专门提供开源模型调用平台,并拥有自己的加速引擎。模型覆盖面广,非常适合低成本来测试开源模型。接入教程:
1. [点击注册硅基流动账号](https://cloud.siliconflow.cn/i/TR9Ym0c4)
2. 进入控制台,获取 API key: https://cloud.siliconflow.cn/account/ak
3. 新增 OneAPI 渠道,选择`OpenAI`类型,代理填写:`https://api.siliconflow.cn`,密钥是第二步创建的密钥。
![alt text](/imgs/image-64.png)
由于 OneAPI 未内置 硅基流动 的模型名,可以通过自定义模型名称来填入,下面是获取模型名称的教程:
1. 打开[硅基流动模型列表](https://siliconflow.cn/zh-cn/models)
2. 单击模型后,会打开模型详情。
3. 复制模型名到 OneAPI 中。
| | | |
| --- | --- | --- |
| ![alt text](/imgs/image-65.png) | ![alt text](/imgs/image-66.png)| ![alt text](/imgs/image-67.png) |
---
title: Connect Models via PPIO LLM API
description: Connect Models via PPIO LLM API
---
import { Alert } from '@/components/docs/Alert';
FastGPT can also connect models through the PPIO LLM API.
<Alert context="warning">
The following content is adapted from [FastGPT Integration with PPIO LLM
API](https://ppinfra.com/docs/third-party/fastgpt-use) and may not always be up to date.
</Alert>
FastGPT is a platform that simplifies the entire AI development, deployment, and usage workflow into visual operations. Developers don't need to dive deep into algorithms, and users don't need to master complex technologies — it turns AI into an easy-to-use tool through a one-stop service.
PPIO Cloud provides simple and easy-to-use API interfaces that allow developers to easily call models like DeepSeek.
- For developers: No need to restructure your architecture. Complete integration for all scenarios from text generation to decision reasoning with just 3 interfaces — design AI workflows like building blocks.
- For the ecosystem: Automatically adapts resource requirements from small applications to enterprise systems, letting intelligence grow naturally with your business.
The tutorial below provides a complete integration guide (including key configuration) to help you quickly connect FastGPT with the PPIO API.
## 1. Prerequisites
(1) Get the API endpoint
Fixed at: `https://api.ppinfra.com/v3/openai/chat/completions`.
(2) Get the API Key
Log in to the PPIO Cloud console [API Key Management](https://www.ppinfra.com/settings/key-management) page and click the create button.
Use invitation code [VOJL20] when registering to receive a 50 yuan voucher.
<img
src="https://static.ppinfra.com/docs/image/llm/BKWqbzI5PoYG6qxwAPxcinQDnob.png"
alt="Create API Key"
/>
(3) Generate and save the API Key
<Alert context="warning">
Keys are stored encrypted on the server. Please save your key when it is generated. If lost, you can delete it and create a new one in the console.
</Alert>
<img
src="https://static.ppinfra.com/docs/image/llm/OkUwbbWrcoCY2SxwVMIcM2aZnrs.png"
alt="Generate API Key"
/>
<img
src="https://static.ppinfra.com/docs/image/llm/GExfbvcosoJhVKxpzKVczlsdn3d.png"
alt="Save API Key"
/>
(4) Get the model IDs you need
DeepSeek series:
- DeepSeek R1: deepseek/deepseek-r1/community
- DeepSeek V3: deepseek/deepseek-v3/community
For other model IDs, max context, and pricing, see: [Model List](https://ppinfra.com/model-api/pricing)
## 2. Deploy the Latest FastGPT to Your Local Environment
<Alert context="warning">
Please use version v4.8.22 or above. Deployment reference: [Deploy FastGPT](/docs/self-host/dev/)
</Alert>
## 3. Model Configuration (Choose One of the Two Methods Below)
(1) Connect PPIO models via OneAPI: Refer to the OneAPI documentation to update FastGPT environment variables. After generating a token in One API, FastGPT can send requests to One API by modifying the baseurl and key, and One API will forward them to the appropriate models. Update these two environment variables (make sure to include v1; if on the same network, you can use the internal address):
OPENAI_BASE_URL= http://OneAPI-IP:OneAPI-PORT/v1
The key below is the token provided by One API: CHAT_API_KEY=sk-UyVQcpQWMU7ChTVl74B562C28e3c46Fe8f16E6D8AeF8736e
- After restarting FastGPT, select PPIO Cloud in the model providers as shown below:
<img
src="https://static.ppinfra.com/docs/image/llm/Fvqzb3kTroys5Uxkjlzco7kwnsb.png"
alt="Select PPIO Cloud"
/>
- Test connectivity
Using DeepSeek as an example, select deepseek/deepseek-r1/community in the model list, click the position marked 2 in the image to test connectivity. A green success indicator confirms the connection is working and you can proceed with configuring conversations.
<img
src="https://static.ppinfra.com/docs/image/llm/FzKGbGsSPoX4Eexobj2cxcaTnib.png"
alt="Test Connectivity"
/>
(2) Connect PPIO models without OneAPI
Select PPIO Cloud in the model providers as shown below:
<img
src="https://static.ppinfra.com/docs/image/llm/QbcdbPqRsoAmuyx2nlycQWFanrc.png"
alt="Select PPIO Cloud"
/>
- Configure the model: Enter `https://api.ppinfra.com/v3/openai/chat/completions` in the custom request URL field.
<img
src="https://static.ppinfra.com/docs/image/llm/ZVyAbDIaxo7ksAxLI3HcexYYnZf.png"
alt="Configure Model"
/>
<img
src="https://static.ppinfra.com/docs/image/llm/Ha9YbggkwoQsVdx1Z4Gc9zUSnle.png"
alt="Configure Model"
/>
- Test connectivity
<img
src="https://static.ppinfra.com/docs/image/llm/V1f0b89uloab9uxxj7IcKT0rn3e.png"
alt="Test Connectivity"
/>
A green success indicator confirms the connection is working and you can proceed with configuring conversations.
## 4. Configure Conversations
(1) Create a new workspace
<img
src="https://static.ppinfra.com/docs/image/llm/ZaGpbBH6QoVubIx2TsLcwYEInfe.png"
alt="Create Workspace"
/>
(2) Start chatting
<img
src="https://static.ppinfra.com/docs/image/llm/HzcTb4gobokVRQxTlU7cD5OunMf.png"
alt="Start Chatting"
/>
## PPIO New User Benefits
After completing the tutorial configuration steps, you'll unlock two benefits: 1. Enjoy the combination of PPIO's high-speed channel with FastGPT's capabilities; 2. Activate the "New User Referral Reward" — invite friends to register using your exclusive invitation code, and both you and your friend will receive a 50 yuan voucher to boost your AI tool efficiency!
New user exclusive: Register now with invitation code [VOJL20] and receive a 50 yuan voucher instantly!
---
title: 通过 PPIO LLM API 接入模型
description: 通过 PPIO LLM API 接入模型
---
import { Alert } from '@/components/docs/Alert';
FastGPT 还可以通过 PPIO LLM API 接入模型。
<Alert context="warning">
以下内容搬运自 [FastGPT 接入 PPIO LLM
API](https://ppinfra.com/docs/third-party/fastgpt-use),可能会有更新不及时的情况。
</Alert>
FastGPT 是一个将 AI 开发、部署和使用全流程简化为可视化操作的平台。它使开发者不需要深入研究算法,
用户也不需要掌握复杂技术,通过一站式服务将人工智能技术变成易于使用的工具。
PPIO 派欧云提供简单易用的 API 接口,让开发者能够轻松调用 DeepSeek 等模型。
- 对开发者:无需重构架构,3 个接口完成从文本生成到决策推理的全场景接入,像搭积木一样设计 AI 工作流;
- 对生态:自动适配从中小应用到企业级系统的资源需求,让智能随业务自然生长。
下方教程提供完整接入方案(含密钥配置),帮助您快速将 FastGPT 与 PPIO API 连接起来。
## 1. 配置前置条件
(1) 获取 API 接口地址
固定为: `https://api.ppinfra.com/v3/openai/chat/completions`。
(2) 获取 【API 密钥】
登录派欧云控制台 [API 秘钥管理](https://www.ppinfra.com/settings/key-management) 页面,点击创建按钮。
注册账号填写邀请码【VOJL20】得 50 代金券
<img
src="https://static.ppinfra.com/docs/image/llm/BKWqbzI5PoYG6qxwAPxcinQDnob.png"
alt="创建 API 密钥"
/>
(3) 生成并保存 【API 密钥】
<Alert context="warning">
秘钥在服务端是加密存储,请在生成时保存好秘钥;若遗失可以在控制台上删除并创建一个新的秘钥。
</Alert>
<img
src="https://static.ppinfra.com/docs/image/llm/OkUwbbWrcoCY2SxwVMIcM2aZnrs.png"
alt="生成 API 密钥"
/>
<img
src="https://static.ppinfra.com/docs/image/llm/GExfbvcosoJhVKxpzKVczlsdn3d.png"
alt="保存 API 密钥"
/>
(4) 获取需要使用的模型 ID
deepseek 系列:
- DeepSeek R1:deepseek/deepseek-r1/community
- DeepSeek V3:deepseek/deepseek-v3/community
其他模型 ID、最大上下文及价格可参考:[模型列表](https://ppinfra.com/model-api/pricing)
## 2. 部署最新版 FastGPT 到本地环境
<Alert context="warning">
请使用 v4.8.22 以上版本,部署参考: [部署 FastGPT](/docs/self-host/dev/)
</Alert>
## 3. 模型配置(下面两种方式二选其一)
(1)通过 OneAPI 接入模型 PPIO 模型: 参考 OneAPI 使用文档,修改 FastGPT 的环境变量 在 One API 生成令牌后,FastGPT 可以通过修改 baseurl 和 key 去请求到 One API,再由 One API 去请求不同的模型。修改下面两个环境变量: 务必写上 v1。如果在同一个网络内,可改成内网地址。
OPENAI_BASE_URL= http://OneAPI-IP:OneAPI-PORT/v1
下面的 key 是由 One API 提供的令牌 CHAT_API_KEY=sk-UyVQcpQWMU7ChTVl74B562C28e3c46Fe8f16E6D8AeF8736e
- 修改后重启 FastGPT,按下图在模型提供商中选择派欧云
<img
src="https://static.ppinfra.com/docs/image/llm/Fvqzb3kTroys5Uxkjlzco7kwnsb.png"
alt="选择派欧云"
/>
- 测试连通性
以 deepseek 为例,在模型中选择使用 deepseek/deepseek-r1/community,点击图中②的位置进行连通性测试,出现图中绿色的的成功显示证明连通成功,可以进行后续的配置对话了
<img
src="https://static.ppinfra.com/docs/image/llm/FzKGbGsSPoX4Eexobj2cxcaTnib.png"
alt="测试连通性"
/>
(2)不使用 OneAPI 接入 PPIO 模型
按照下图在模型提供商中选择派欧云
<img
src="https://static.ppinfra.com/docs/image/llm/QbcdbPqRsoAmuyx2nlycQWFanrc.png"
alt="选择派欧云"
/>
- 配置模型 自定义请求地址中输入:`https://api.ppinfra.com/v3/openai/chat/completions`
<img
src="https://static.ppinfra.com/docs/image/llm/ZVyAbDIaxo7ksAxLI3HcexYYnZf.png"
alt="配置模型"
/>
<img
src="https://static.ppinfra.com/docs/image/llm/Ha9YbggkwoQsVdx1Z4Gc9zUSnle.png"
alt="配置模型"
/>
- 测试连通性
<img
src="https://static.ppinfra.com/docs/image/llm/V1f0b89uloab9uxxj7IcKT0rn3e.png"
alt="测试连通性"
/>
出现图中绿色的的成功显示证明连通成功,可以进行对话配置
## 4. 配置对话
(1)新建工作台
<img
src="https://static.ppinfra.com/docs/image/llm/ZaGpbBH6QoVubIx2TsLcwYEInfe.png"
alt="新建工作台"
/>
(2)开始聊天
<img
src="https://static.ppinfra.com/docs/image/llm/HzcTb4gobokVRQxTlU7cD5OunMf.png"
alt="开始聊天"
/>
## PPIO 全新福利重磅来袭 🔥
顺利完成教程配置步骤后,您将解锁两大权益:1. 畅享 PPIO 高速通道与 FastGPT 的效能组合;2.立即激活 **「新用户邀请奖励」** ————通过专属邀请码邀好友注册,您与好友可各领 50 元代金券,硬核福利助力 AI 工具效率倍增!
🎁 新手专享:立即使用邀请码【VOJL20】完成注册,50 元代金券奖励即刻到账!
--- ---
title: Try Open Source Models with SiliconCloud title: SiliconCloud Integration Example
description: Try Open Source Models with SiliconCloud description: SiliconCloud integration example for FastGPT
--- ---
[SiliconCloud](https://cloud.siliconflow.cn/i/TR9Ym0c4) is a platform focused on providing open source model inference, with its own acceleration engine. It helps users test and use open source models quickly at low cost. In our experience, their models offer solid speed and stability, with a wide variety covering language, embedding, reranking, TTS, STT, image generation, and video generation models — meeting all model requirements in FastGPT. [SiliconCloud](https://cloud.siliconflow.cn/i/TR9Ym0c4) is a platform focused on open source model inference, with its own acceleration engine. It helps users test and use open source models quickly at low cost. In our experience, their models offer solid speed and stability, with a wide variety covering language, embedding, reranking, TTS, STT, image generation, and video generation — meeting all model requirements in FastGPT.
If you want to use SiliconCloud for only some models, see [OneAPI Integration with SiliconCloud](/docs/self-host/config/model/one-api/#siliconcloud--open-source-model-collection). Before reading this guide, make sure you've read the [Model Configuration Guide](/docs/self-host/config/model/intro).
This guide covers deploying FastGPT entirely with SiliconCloud models. ## 1. Register an Account
## 1. Register a SiliconCloud Account
1. [Register a SiliconCloud account](https://cloud.siliconflow.cn/i/TR9Ym0c4) 1. [Register a SiliconCloud account](https://cloud.siliconflow.cn/i/TR9Ym0c4)
2. Go to the console and get your API key: https://cloud.siliconflow.cn/account/ak 2. Go to the console and get your API key: https://cloud.siliconflow.cn/account/ak
## 2. Update FastGPT Environment Variables ## 2. Add Models
```bash The system includes a few SiliconCloud models by default for quick testing. If you need additional models, you can [add them manually](/docs/self-host/config/model/intro/#add-a-custom-model).
OPENAI_BASE_URL=https://api.siliconflow.cn/v1
# Enter the API Key from the SiliconCloud console
CHAT_API_KEY=sk-xxxxxx
```
## 3. Update FastGPT Model Configuration Here we enable `Qwen2.5 72b` for both text and vision; `bge-m3` as the embedding model; `bge-reranker-v2-m3` as the reranking model; `fish-speech-1.5` as the TTS model; and `SenseVoiceSmall` as the STT model.
The system includes a few SiliconCloud models by default for quick testing. You can add more models manually if needed. ![alt text](/imgs/image-104.png)
Here we enable `Qwen2.5 72b` for both text and vision models; `bge-m3` as the embedding model; `bge-reranker-v2-m3` as the reranking model; `fish-speech-1.5` as the TTS model; and `SenseVoiceSmall` as the STT model.
![alt text](/imgs/image-104.png) ## 3. Add a Model Channel
On the Model Channels page, add a new SiliconCloud channel and select the models you just added.
![alt text](../../../../../public/imgs/image-126.png)
## 4. Test Models
First, verify that all SiliconCloud models are running properly.
![alt text](../../../../../public/imgs/image-127.png)
## 4. Testing ## 5. Test in an App
### Test Chat and Image Recognition ### Test Chat and Image Recognition
......
--- ---
title: 通过 SiliconCloud 体验开源模型 title: 硅基流动接入示例
description: 通过 SiliconCloud 体验开源模型 description: 硅基流动接入示例
--- ---
[SiliconCloud(硅基流动)](https://cloud.siliconflow.cn/i/TR9Ym0c4) 是一个以提供开源模型调用为主的平台,并拥有自己的加速引擎。帮助用户低成本、快速的进行开源模型的测试和使用。实际体验下来,他们家模型的速度和稳定性都非常不错,并且种类丰富,覆盖语言、向量、重排、TTS、STT、绘图、视频生成模型,可以满足 FastGPT 中所有模型需求。 [SiliconCloud(硅基流动)](https://cloud.siliconflow.cn/i/TR9Ym0c4) 是一个以提供开源模型调用为主的平台,并拥有自己的加速引擎。帮助用户低成本、快速的进行开源模型的测试和使用。实际体验下来,他们家模型的速度和稳定性都非常不错,并且种类丰富,覆盖语言、向量、重排、TTS、STT、绘图、视频生成模型,可以满足 FastGPT 中所有模型需求。
如果你想部分模型使用 SiliconCloud 的模型,可额外参考[OneAPI接入硅基流动](/docs/self-host/config/model/one-api/#硅基流动--开源模型大合集)。 在阅读该章之前,请先确保你阅读了[模型配置说明](/docs/self-host/config/model/intro)。
本文会介绍完全使用 SiliconCloud 模型来部署 FastGPT 的方案。 ## 1. 注册账号
## 1. 注册 SiliconCloud 账号
1. [点击注册硅基流动账号](https://cloud.siliconflow.cn/i/TR9Ym0c4) 1. [点击注册硅基流动账号](https://cloud.siliconflow.cn/i/TR9Ym0c4)
2. 进入控制台,获取 API key: https://cloud.siliconflow.cn/account/ak 2. 进入控制台,获取 API key: https://cloud.siliconflow.cn/account/ak
## 2. 修改 FastGPT 环境变量 ## 2. 新增模型
```bash
OPENAI_BASE_URL=https://api.siliconflow.cn/v1
# 填写 SiliconCloud 控制台提供的 Api Key
CHAT_API_KEY=sk-xxxxxx
```
## 3. 修改 FastGPT 模型配置
系统内置了几个硅基流动的模型进行体验,如果需要其他模型,可以手动添加 系统内置了几个硅基流动的模型进行体验,如果需要其他模型,可以[手动添加](/docs/self-host/config/model/intro/#新增自定义模型)
这里启动了 `Qwen2.5 72b` 的纯语言和视觉模型;选择 `bge-m3` 作为向量模型;选择 `bge-reranker-v2-m3` 作为重排模型。选择 `fish-speech-1.5` 作为语音模型;选择 `SenseVoiceSmall` 作为语音输入模型。 这里启动了 `Qwen2.5 72b` 的纯语言和视觉模型;选择 `bge-m3` 作为向量模型;选择 `bge-reranker-v2-m3` 作为重排模型。选择 `fish-speech-1.5` 作为语音模型;选择 `SenseVoiceSmall` 作为语音输入模型。
![alt text](/imgs/image-104.png) ![alt text](/imgs/image-104.png)
## 4. 体验测试
## 3. 新增模型渠道
在模型渠道页,新增一个硅基流动的渠道,选择刚刚添加的模型即可。
![alt text](../../../../../public/imgs/image-126.png)
## 4. 测试模型
先测试下硅基流动的模型是否均可正常运行。
![alt text](../../../../../public/imgs/image-127.png)
## 5. 在应用中测试
### 测试对话和图片识别 ### 测试对话和图片识别
......
...@@ -185,7 +185,7 @@ Each container restart automatically initializes the root user with password `12 ...@@ -185,7 +185,7 @@ Each container restart automatically initializes the root user with password `12
### 6. Configure Models ### 6. Configure Models
- After first login, the system prompts that `Language Model` and `Index Model` are not configured and automatically redirects to the model configuration page. At least these two model types are required. - After first login, the system prompts that `Language Model` and `Index Model` are not configured and automatically redirects to the model configuration page. At least these two model types are required.
- If the redirect doesn't happen, go to `Account - Model Providers` to configure models. [View tutorial](/docs/self-host/config/model/ai-proxy) - If the redirect doesn't happen, go to `Account - Model Providers` to configure models. [View tutorial](/docs/self-host/config/model/intro)
- Known issue: after first entering the system, the browser tab may become unresponsive. Close the tab and reopen it. - Known issue: after first entering the system, the browser tab may become unresponsive. Close the tab and reopen it.
### 7. Install System Plugins as Needed ### 7. Install System Plugins as Needed
......
...@@ -185,7 +185,7 @@ docker-compose up -d ...@@ -185,7 +185,7 @@ docker-compose up -d
### 6. 配置模型 ### 6. 配置模型
- 首次登录FastGPT后,系统会提示未配置`语言模型`和`索引模型`,并自动跳转模型配置页面。系统必须至少有这两类模型才能正常使用。 - 首次登录FastGPT后,系统会提示未配置`语言模型`和`索引模型`,并自动跳转模型配置页面。系统必须至少有这两类模型才能正常使用。
- 如果系统未正常跳转,可以在`账号-模型提供商`页面,进行模型配置。[点击查看相关教程](/docs/self-host/config/model/ai-proxy) - 如果系统未正常跳转,可以在`账号-模型提供商`页面,进行模型配置。[点击查看相关教程](/docs/self-host/config/model/intro)
- 目前已知可能问题:首次进入系统后,整个浏览器 tab 无法响应。此时需要删除该tab,重新打开一次即可。 - 目前已知可能问题:首次进入系统后,整个浏览器 tab 无法响应。此时需要删除该tab,重新打开一次即可。
### 7. 按需安装系统插件 ### 7. 按需安装系统插件
......
...@@ -14,8 +14,8 @@ import FastGPTLink from '@/components/docs/linkFastGPT'; ...@@ -14,8 +14,8 @@ import FastGPTLink from '@/components/docs/linkFastGPT';
- [Git](https://git-scm.com/) - [Git](https://git-scm.com/)
- [Docker](https://www.docker.com/) - [Docker](https://www.docker.com/)
- [Node.js v20.14.0](https://nodejs.org)(版本尽量一样,可以使用 [nvm](https://github.com/nvm-sh/nvm) 管理 node 版本) - [Node.js >=20](https://nodejs.org)(版本尽量一样,可以使用 [nvm](https://github.com/nvm-sh/nvm) 管理 node 版本)
- [pnpm](https://pnpm.io/) 推荐版本 9.4.0 (目前官方的开发环境) - [pnpm](https://pnpm.io/) 需要使用 10.x
建议在 *nix 环境进行开发 (Linux, MacOS, Windows WSL) 建议在 *nix 环境进行开发 (Linux, MacOS, Windows WSL)
......
--- ---
title: S3问题排查 title: 存储桶问题排查
description: FastGPT 私有部署常见问题排查方式 description: FastGPT 私有部署存储桶问题排查方式
--- ---
## 1. 日志出现 ERR 等级的 “Failed to ensure external public/private bucket exists”,导致无法连接上对象存储 ## 1. 日志出现 ERR 等级的 “Failed to ensure external public/private bucket exists”,导致无法连接上对象存储
......
...@@ -5,7 +5,7 @@ description: 'FastGPT V4.14.9 更新说明' ...@@ -5,7 +5,7 @@ description: 'FastGPT V4.14.9 更新说明'
### 环境变量更新 ### 环境变量更新
1. 调整 FastGPT 环境变量:CODE_SANDBOX_URL 和 SANDBOX_TOKEN,改名成 CODE_SANDBOX_URL 和 CODE_SANDBOX_TOKEN: 1. 修改 FastGPT 环境变量:CODE_SANDBOX_URL 和 SANDBOX_TOKEN,改名成 CODE_SANDBOX_URL 和 CODE_SANDBOX_TOKEN:
```bash ```bash
SANDBOX_URL=代码运行沙盒的地址 SANDBOX_URL=代码运行沙盒的地址
......
...@@ -76,10 +76,7 @@ description: FastGPT Toc ...@@ -76,10 +76,7 @@ description: FastGPT Toc
- [/en/docs/openapi/intro](/en/docs/openapi/intro) - [/en/docs/openapi/intro](/en/docs/openapi/intro)
- [/en/docs/openapi/share](/en/docs/openapi/share) - [/en/docs/openapi/share](/en/docs/openapi/share)
- [/en/docs/self-host/config/json](/en/docs/self-host/config/json) - [/en/docs/self-host/config/json](/en/docs/self-host/config/json)
- [/en/docs/self-host/config/model/ai-proxy](/en/docs/self-host/config/model/ai-proxy)
- [/en/docs/self-host/config/model/intro](/en/docs/self-host/config/model/intro) - [/en/docs/self-host/config/model/intro](/en/docs/self-host/config/model/intro)
- [/en/docs/self-host/config/model/one-api](/en/docs/self-host/config/model/one-api)
- [/en/docs/self-host/config/model/ppio](/en/docs/self-host/config/model/ppio)
- [/en/docs/self-host/config/model/siliconCloud](/en/docs/self-host/config/model/siliconCloud) - [/en/docs/self-host/config/model/siliconCloud](/en/docs/self-host/config/model/siliconCloud)
- [/en/docs/self-host/config/object-storage](/en/docs/self-host/config/object-storage) - [/en/docs/self-host/config/object-storage](/en/docs/self-host/config/object-storage)
- [/en/docs/self-host/config/signoz](/en/docs/self-host/config/signoz) - [/en/docs/self-host/config/signoz](/en/docs/self-host/config/signoz)
......
...@@ -76,10 +76,7 @@ description: FastGPT 文档目录 ...@@ -76,10 +76,7 @@ description: FastGPT 文档目录
- [/docs/openapi/intro](/docs/openapi/intro) - [/docs/openapi/intro](/docs/openapi/intro)
- [/docs/openapi/share](/docs/openapi/share) - [/docs/openapi/share](/docs/openapi/share)
- [/docs/self-host/config/json](/docs/self-host/config/json) - [/docs/self-host/config/json](/docs/self-host/config/json)
- [/docs/self-host/config/model/ai-proxy](/docs/self-host/config/model/ai-proxy)
- [/docs/self-host/config/model/intro](/docs/self-host/config/model/intro) - [/docs/self-host/config/model/intro](/docs/self-host/config/model/intro)
- [/docs/self-host/config/model/one-api](/docs/self-host/config/model/one-api)
- [/docs/self-host/config/model/ppio](/docs/self-host/config/model/ppio)
- [/docs/self-host/config/model/siliconCloud](/docs/self-host/config/model/siliconCloud) - [/docs/self-host/config/model/siliconCloud](/docs/self-host/config/model/siliconCloud)
- [/docs/self-host/config/object-storage](/docs/self-host/config/object-storage) - [/docs/self-host/config/object-storage](/docs/self-host/config/object-storage)
- [/docs/self-host/config/signoz](/docs/self-host/config/signoz) - [/docs/self-host/config/signoz](/docs/self-host/config/signoz)
......
...@@ -4,13 +4,13 @@ ...@@ -4,13 +4,13 @@
"document/content/docs/faq/chat.en.mdx": "2026-02-26T22:14:30+08:00", "document/content/docs/faq/chat.en.mdx": "2026-02-26T22:14:30+08:00",
"document/content/docs/faq/chat.mdx": "2025-08-02T19:38:37+08:00", "document/content/docs/faq/chat.mdx": "2025-08-02T19:38:37+08:00",
"document/content/docs/faq/dataset.en.mdx": "2026-02-26T22:14:30+08:00", "document/content/docs/faq/dataset.en.mdx": "2026-02-26T22:14:30+08:00",
"document/content/docs/faq/dataset.mdx": "2026-02-26T11:41:53+08:00", "document/content/docs/faq/dataset.mdx": "2026-03-17T14:44:54+08:00",
"document/content/docs/faq/external_channel_integration.en.mdx": "2026-02-26T22:14:30+08:00", "document/content/docs/faq/external_channel_integration.en.mdx": "2026-02-26T22:14:30+08:00",
"document/content/docs/faq/external_channel_integration.mdx": "2025-08-02T19:38:37+08:00", "document/content/docs/faq/external_channel_integration.mdx": "2025-08-02T19:38:37+08:00",
"document/content/docs/faq/index.en.mdx": "2026-02-26T22:14:30+08:00", "document/content/docs/faq/index.en.mdx": "2026-02-26T22:14:30+08:00",
"document/content/docs/faq/index.mdx": "2025-08-02T19:38:37+08:00", "document/content/docs/faq/index.mdx": "2025-08-02T19:38:37+08:00",
"document/content/docs/faq/other.en.mdx": "2026-03-14T18:13:05+08:00", "document/content/docs/faq/other.en.mdx": "2026-03-17T14:44:54+08:00",
"document/content/docs/faq/other.mdx": "2026-03-14T18:13:05+08:00", "document/content/docs/faq/other.mdx": "2026-03-17T14:44:54+08:00",
"document/content/docs/faq/points_consumption.en.mdx": "2026-02-26T22:14:30+08:00", "document/content/docs/faq/points_consumption.en.mdx": "2026-02-26T22:14:30+08:00",
"document/content/docs/faq/points_consumption.mdx": "2025-08-02T19:38:37+08:00", "document/content/docs/faq/points_consumption.mdx": "2025-08-02T19:38:37+08:00",
"document/content/docs/introduction/cloud/faq.en.mdx": "2026-03-03T17:39:47+08:00", "document/content/docs/introduction/cloud/faq.en.mdx": "2026-03-03T17:39:47+08:00",
...@@ -147,16 +147,10 @@ ...@@ -147,16 +147,10 @@
"document/content/docs/openapi/share.mdx": "2026-02-12T18:45:30+08:00", "document/content/docs/openapi/share.mdx": "2026-02-12T18:45:30+08:00",
"document/content/docs/self-host/config/json.en.mdx": "2026-03-03T17:39:47+08:00", "document/content/docs/self-host/config/json.en.mdx": "2026-03-03T17:39:47+08:00",
"document/content/docs/self-host/config/json.mdx": "2026-03-03T17:39:47+08:00", "document/content/docs/self-host/config/json.mdx": "2026-03-03T17:39:47+08:00",
"document/content/docs/self-host/config/model/ai-proxy.en.mdx": "2026-03-03T17:39:47+08:00", "document/content/docs/self-host/config/model/intro.en.mdx": "2026-03-19T13:55:19+08:00",
"document/content/docs/self-host/config/model/ai-proxy.mdx": "2026-03-03T17:39:47+08:00", "document/content/docs/self-host/config/model/intro.mdx": "2026-03-19T13:55:19+08:00",
"document/content/docs/self-host/config/model/intro.en.mdx": "2026-03-03T17:39:47+08:00", "document/content/docs/self-host/config/model/siliconCloud.en.mdx": "2026-03-19T13:55:19+08:00",
"document/content/docs/self-host/config/model/intro.mdx": "2026-03-03T17:39:47+08:00", "document/content/docs/self-host/config/model/siliconCloud.mdx": "2026-03-19T13:55:19+08:00",
"document/content/docs/self-host/config/model/one-api.en.mdx": "2026-03-03T17:39:47+08:00",
"document/content/docs/self-host/config/model/one-api.mdx": "2026-03-03T17:39:47+08:00",
"document/content/docs/self-host/config/model/ppio.en.mdx": "2026-03-03T17:39:47+08:00",
"document/content/docs/self-host/config/model/ppio.mdx": "2026-03-03T17:39:47+08:00",
"document/content/docs/self-host/config/model/siliconCloud.en.mdx": "2026-03-03T17:39:47+08:00",
"document/content/docs/self-host/config/model/siliconCloud.mdx": "2026-03-03T17:39:47+08:00",
"document/content/docs/self-host/config/object-storage.en.mdx": "2026-03-03T17:39:47+08:00", "document/content/docs/self-host/config/object-storage.en.mdx": "2026-03-03T17:39:47+08:00",
"document/content/docs/self-host/config/object-storage.mdx": "2026-03-03T17:39:47+08:00", "document/content/docs/self-host/config/object-storage.mdx": "2026-03-03T17:39:47+08:00",
"document/content/docs/self-host/config/signoz.en.mdx": "2026-03-03T17:39:47+08:00", "document/content/docs/self-host/config/signoz.en.mdx": "2026-03-03T17:39:47+08:00",
...@@ -177,8 +171,8 @@ ...@@ -177,8 +171,8 @@
"document/content/docs/self-host/custom-models/ollama.mdx": "2026-03-03T17:39:47+08:00", "document/content/docs/self-host/custom-models/ollama.mdx": "2026-03-03T17:39:47+08:00",
"document/content/docs/self-host/custom-models/xinference.en.mdx": "2026-03-03T17:39:47+08:00", "document/content/docs/self-host/custom-models/xinference.en.mdx": "2026-03-03T17:39:47+08:00",
"document/content/docs/self-host/custom-models/xinference.mdx": "2026-03-03T17:39:47+08:00", "document/content/docs/self-host/custom-models/xinference.mdx": "2026-03-03T17:39:47+08:00",
"document/content/docs/self-host/deploy/docker.en.mdx": "2026-03-03T17:39:47+08:00", "document/content/docs/self-host/deploy/docker.en.mdx": "2026-03-19T13:55:19+08:00",
"document/content/docs/self-host/deploy/docker.mdx": "2026-03-03T17:39:47+08:00", "document/content/docs/self-host/deploy/docker.mdx": "2026-03-19T13:55:19+08:00",
"document/content/docs/self-host/deploy/sealos.en.mdx": "2026-03-03T17:39:47+08:00", "document/content/docs/self-host/deploy/sealos.en.mdx": "2026-03-03T17:39:47+08:00",
"document/content/docs/self-host/deploy/sealos.mdx": "2026-03-03T17:39:47+08:00", "document/content/docs/self-host/deploy/sealos.mdx": "2026-03-03T17:39:47+08:00",
"document/content/docs/self-host/design/dataset.en.mdx": "2026-03-03T17:39:47+08:00", "document/content/docs/self-host/design/dataset.en.mdx": "2026-03-03T17:39:47+08:00",
...@@ -186,7 +180,7 @@ ...@@ -186,7 +180,7 @@
"document/content/docs/self-host/design/design_plugin.en.mdx": "2026-03-03T17:39:47+08:00", "document/content/docs/self-host/design/design_plugin.en.mdx": "2026-03-03T17:39:47+08:00",
"document/content/docs/self-host/design/design_plugin.mdx": "2026-03-03T17:39:47+08:00", "document/content/docs/self-host/design/design_plugin.mdx": "2026-03-03T17:39:47+08:00",
"document/content/docs/self-host/dev.en.mdx": "2026-03-03T17:39:47+08:00", "document/content/docs/self-host/dev.en.mdx": "2026-03-03T17:39:47+08:00",
"document/content/docs/self-host/dev.mdx": "2026-03-03T17:39:47+08:00", "document/content/docs/self-host/dev.mdx": "2026-03-19T11:32:26+08:00",
"document/content/docs/self-host/faq.en.mdx": "2026-03-03T17:39:47+08:00", "document/content/docs/self-host/faq.en.mdx": "2026-03-03T17:39:47+08:00",
"document/content/docs/self-host/index.en.mdx": "2026-03-03T17:39:47+08:00", "document/content/docs/self-host/index.en.mdx": "2026-03-03T17:39:47+08:00",
"document/content/docs/self-host/index.mdx": "2026-03-03T17:39:47+08:00", "document/content/docs/self-host/index.mdx": "2026-03-03T17:39:47+08:00",
...@@ -194,14 +188,16 @@ ...@@ -194,14 +188,16 @@
"document/content/docs/self-host/migration/docker_db.mdx": "2026-03-03T17:39:47+08:00", "document/content/docs/self-host/migration/docker_db.mdx": "2026-03-03T17:39:47+08:00",
"document/content/docs/self-host/migration/docker_mongo.en.mdx": "2026-03-03T17:39:47+08:00", "document/content/docs/self-host/migration/docker_mongo.en.mdx": "2026-03-03T17:39:47+08:00",
"document/content/docs/self-host/migration/docker_mongo.mdx": "2026-03-03T17:39:47+08:00", "document/content/docs/self-host/migration/docker_mongo.mdx": "2026-03-03T17:39:47+08:00",
"document/content/docs/self-host/troubleshooting/faq.en.mdx": "2026-03-14T18:13:05+08:00", "document/content/docs/self-host/troubleshooting/attention.en.mdx": "2026-03-19T11:32:14+08:00",
"document/content/docs/self-host/troubleshooting/faq.mdx": "2026-03-14T18:13:05+08:00", "document/content/docs/self-host/troubleshooting/attention.mdx": "2026-03-19T11:32:14+08:00",
"document/content/docs/self-host/troubleshooting/methods.en.mdx": "2026-03-12T15:26:02+08:00", "document/content/docs/self-host/troubleshooting/faq.en.mdx": "2026-03-17T14:44:54+08:00",
"document/content/docs/self-host/troubleshooting/methods.mdx": "2026-03-12T15:26:02+08:00", "document/content/docs/self-host/troubleshooting/faq.mdx": "2026-03-17T14:44:54+08:00",
"document/content/docs/self-host/troubleshooting/model-errors.en.mdx": "2026-03-12T15:26:02+08:00", "document/content/docs/self-host/troubleshooting/methods.en.mdx": "2026-03-17T14:44:54+08:00",
"document/content/docs/self-host/troubleshooting/model-errors.mdx": "2026-03-12T15:26:02+08:00", "document/content/docs/self-host/troubleshooting/methods.mdx": "2026-03-17T14:44:54+08:00",
"document/content/docs/self-host/troubleshooting/s3-issues.en.mdx": "2026-03-12T15:26:02+08:00", "document/content/docs/self-host/troubleshooting/model-errors.en.mdx": "2026-03-19T11:32:14+08:00",
"document/content/docs/self-host/troubleshooting/s3-issues.mdx": "2026-03-12T15:26:02+08:00", "document/content/docs/self-host/troubleshooting/model-errors.mdx": "2026-03-19T11:32:14+08:00",
"document/content/docs/self-host/troubleshooting/s3-issues.en.mdx": "2026-03-17T14:44:54+08:00",
"document/content/docs/self-host/troubleshooting/s3-issues.mdx": "2026-03-19T13:55:19+08:00",
"document/content/docs/self-host/upgrading/4-12/4120.en.mdx": "2026-03-03T17:39:47+08:00", "document/content/docs/self-host/upgrading/4-12/4120.en.mdx": "2026-03-03T17:39:47+08:00",
"document/content/docs/self-host/upgrading/4-12/4120.mdx": "2026-03-03T17:39:47+08:00", "document/content/docs/self-host/upgrading/4-12/4120.mdx": "2026-03-03T17:39:47+08:00",
"document/content/docs/self-host/upgrading/4-12/4121.en.mdx": "2026-03-03T17:39:47+08:00", "document/content/docs/self-host/upgrading/4-12/4121.en.mdx": "2026-03-03T17:39:47+08:00",
...@@ -240,7 +236,7 @@ ...@@ -240,7 +236,7 @@
"document/content/docs/self-host/upgrading/4-14/4148.mdx": "2026-03-09T17:39:53+08:00", "document/content/docs/self-host/upgrading/4-14/4148.mdx": "2026-03-09T17:39:53+08:00",
"document/content/docs/self-host/upgrading/4-14/41481.en.mdx": "2026-03-09T12:02:02+08:00", "document/content/docs/self-host/upgrading/4-14/41481.en.mdx": "2026-03-09T12:02:02+08:00",
"document/content/docs/self-host/upgrading/4-14/41481.mdx": "2026-03-09T17:39:53+08:00", "document/content/docs/self-host/upgrading/4-14/41481.mdx": "2026-03-09T17:39:53+08:00",
"document/content/docs/self-host/upgrading/4-14/4149.mdx": "2026-03-16T17:09:25+08:00", "document/content/docs/self-host/upgrading/4-14/4149.mdx": "2026-03-19T11:21:58+08:00",
"document/content/docs/self-host/upgrading/outdated/40.en.mdx": "2026-03-03T17:39:47+08:00", "document/content/docs/self-host/upgrading/outdated/40.en.mdx": "2026-03-03T17:39:47+08:00",
"document/content/docs/self-host/upgrading/outdated/40.mdx": "2026-03-03T17:39:47+08:00", "document/content/docs/self-host/upgrading/outdated/40.mdx": "2026-03-03T17:39:47+08:00",
"document/content/docs/self-host/upgrading/outdated/41.en.mdx": "2026-03-03T17:39:47+08:00", "document/content/docs/self-host/upgrading/outdated/41.en.mdx": "2026-03-03T17:39:47+08:00",
...@@ -381,8 +377,8 @@ ...@@ -381,8 +377,8 @@
"document/content/docs/self-host/upgrading/outdated/499.mdx": "2026-03-03T17:39:47+08:00", "document/content/docs/self-host/upgrading/outdated/499.mdx": "2026-03-03T17:39:47+08:00",
"document/content/docs/self-host/upgrading/upgrade-intruction.en.mdx": "2026-03-03T17:39:47+08:00", "document/content/docs/self-host/upgrading/upgrade-intruction.en.mdx": "2026-03-03T17:39:47+08:00",
"document/content/docs/self-host/upgrading/upgrade-intruction.mdx": "2026-03-03T17:39:47+08:00", "document/content/docs/self-host/upgrading/upgrade-intruction.mdx": "2026-03-03T17:39:47+08:00",
"document/content/docs/toc.en.mdx": "2026-03-12T15:48:21+08:00", "document/content/docs/toc.en.mdx": "2026-03-19T13:55:19+08:00",
"document/content/docs/toc.mdx": "2026-03-12T15:48:21+08:00", "document/content/docs/toc.mdx": "2026-03-19T13:55:19+08:00",
"document/content/docs/use-cases/app-cases/dalle3.en.mdx": "2026-02-26T22:14:30+08:00", "document/content/docs/use-cases/app-cases/dalle3.en.mdx": "2026-02-26T22:14:30+08:00",
"document/content/docs/use-cases/app-cases/dalle3.mdx": "2025-07-23T21:35:03+08:00", "document/content/docs/use-cases/app-cases/dalle3.mdx": "2025-07-23T21:35:03+08:00",
"document/content/docs/use-cases/app-cases/english_essay_correction_bot.en.mdx": "2026-02-26T22:14:30+08:00", "document/content/docs/use-cases/app-cases/english_essay_correction_bot.en.mdx": "2026-02-26T22:14:30+08:00",
...@@ -413,4 +409,4 @@ ...@@ -413,4 +409,4 @@
"document/content/docs/use-cases/external-integration/wecom.mdx": "2025-12-10T20:07:05+08:00", "document/content/docs/use-cases/external-integration/wecom.mdx": "2025-12-10T20:07:05+08:00",
"document/content/docs/use-cases/index.en.mdx": "2026-02-26T22:14:30+08:00", "document/content/docs/use-cases/index.en.mdx": "2026-02-26T22:14:30+08:00",
"document/content/docs/use-cases/index.mdx": "2025-07-24T14:23:04+08:00" "document/content/docs/use-cases/index.mdx": "2025-07-24T14:23:04+08:00"
} }
\ No newline at end of file
export { twMerge as cn } from 'tailwind-merge';
import type * as React from 'react';
export function mergeRefs<T>(...refs: (React.Ref<T> | undefined)[]): React.RefCallback<T> {
return (value) => {
refs.forEach((ref) => {
if (typeof ref === 'function') {
ref(value);
} else if (ref) {
ref.current = value;
}
});
};
}
...@@ -11,6 +11,8 @@ ...@@ -11,6 +11,8 @@
"dependencies": { "dependencies": {
"@orama/orama": "^3.1.11", "@orama/orama": "^3.1.11",
"@orama/tokenizers": "^3.1.11", "@orama/tokenizers": "^3.1.11",
"@radix-ui/react-accordion": "^1.2.12",
"class-variance-authority": "^0.7.1",
"fast-glob": "^3.3.3", "fast-glob": "^3.3.3",
"fs-extra": "^11.3.0", "fs-extra": "^11.3.0",
"fumadocs-core": "15.6.3", "fumadocs-core": "15.6.3",
...@@ -26,7 +28,8 @@ ...@@ -26,7 +28,8 @@
"remark-gfm": "^4.0.1", "remark-gfm": "^4.0.1",
"remark-mdx": "^3.1.0", "remark-mdx": "^3.1.0",
"remark-stringify": "^11.0.0", "remark-stringify": "^11.0.0",
"schema-dts": "^1.1.5" "schema-dts": "^1.1.5",
"tailwind-merge": "^3.5.0"
}, },
"devDependencies": { "devDependencies": {
"@content-collections/core": "^0.10.0", "@content-collections/core": "^0.10.0",
...@@ -1306,13 +1309,13 @@ ...@@ -1306,13 +1309,13 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/@radix-ui/react-accordion": { "node_modules/@radix-ui/react-accordion": {
"version": "1.2.11", "version": "1.2.12",
"resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.11.tgz", "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.12.tgz",
"integrity": "sha512-l3W5D54emV2ues7jjeG1xcyN7S3jnK3zE2zHqgn0CmMsy9lNJwmgcrmaxS+7ipw15FAivzKNzH3d5EcGoFKw0A==", "integrity": "sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@radix-ui/primitive": "1.1.2", "@radix-ui/primitive": "1.1.3",
"@radix-ui/react-collapsible": "1.1.11", "@radix-ui/react-collapsible": "1.1.12",
"@radix-ui/react-collection": "1.1.7", "@radix-ui/react-collection": "1.1.7",
"@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2",
"@radix-ui/react-context": "1.1.2", "@radix-ui/react-context": "1.1.2",
...@@ -1336,6 +1339,12 @@ ...@@ -1336,6 +1339,12 @@
} }
} }
}, },
"node_modules/@radix-ui/react-accordion/node_modules/@radix-ui/primitive": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz",
"integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==",
"license": "MIT"
},
"node_modules/@radix-ui/react-arrow": { "node_modules/@radix-ui/react-arrow": {
"version": "1.1.7", "version": "1.1.7",
"resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz",
...@@ -1360,16 +1369,16 @@ ...@@ -1360,16 +1369,16 @@
} }
}, },
"node_modules/@radix-ui/react-collapsible": { "node_modules/@radix-ui/react-collapsible": {
"version": "1.1.11", "version": "1.1.12",
"resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.11.tgz", "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.12.tgz",
"integrity": "sha512-2qrRsVGSCYasSz1RFOorXwl0H7g7J1frQtgpQgYrt+MOidtPAINHn9CPovQXb83r8ahapdx3Tu0fa/pdFFSdPg==", "integrity": "sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@radix-ui/primitive": "1.1.2", "@radix-ui/primitive": "1.1.3",
"@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2",
"@radix-ui/react-context": "1.1.2", "@radix-ui/react-context": "1.1.2",
"@radix-ui/react-id": "1.1.1", "@radix-ui/react-id": "1.1.1",
"@radix-ui/react-presence": "1.1.4", "@radix-ui/react-presence": "1.1.5",
"@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-primitive": "2.1.3",
"@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-controllable-state": "1.2.2",
"@radix-ui/react-use-layout-effect": "1.1.1" "@radix-ui/react-use-layout-effect": "1.1.1"
...@@ -1389,6 +1398,36 @@ ...@@ -1389,6 +1398,36 @@
} }
} }
}, },
"node_modules/@radix-ui/react-collapsible/node_modules/@radix-ui/primitive": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz",
"integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==",
"license": "MIT"
},
"node_modules/@radix-ui/react-collapsible/node_modules/@radix-ui/react-presence": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz",
"integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==",
"license": "MIT",
"dependencies": {
"@radix-ui/react-compose-refs": "1.1.2",
"@radix-ui/react-use-layout-effect": "1.1.1"
},
"peerDependencies": {
"@types/react": "*",
"@types/react-dom": "*",
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
},
"peerDependenciesMeta": {
"@types/react": {
"optional": true
},
"@types/react-dom": {
"optional": true
}
}
},
"node_modules/@radix-ui/react-collection": { "node_modules/@radix-ui/react-collection": {
"version": "1.1.7", "version": "1.1.7",
"resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz",
...@@ -6070,9 +6109,9 @@ ...@@ -6070,9 +6109,9 @@
} }
}, },
"node_modules/tailwind-merge": { "node_modules/tailwind-merge": {
"version": "3.3.1", "version": "3.5.0",
"resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.3.1.tgz", "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.5.0.tgz",
"integrity": "sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g==", "integrity": "sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==",
"license": "MIT", "license": "MIT",
"funding": { "funding": {
"type": "github", "type": "github",
......
...@@ -11,6 +11,8 @@ ...@@ -11,6 +11,8 @@
"dependencies": { "dependencies": {
"@orama/orama": "^3.1.11", "@orama/orama": "^3.1.11",
"@orama/tokenizers": "^3.1.11", "@orama/tokenizers": "^3.1.11",
"@radix-ui/react-accordion": "^1.2.12",
"class-variance-authority": "^0.7.1",
"fast-glob": "^3.3.3", "fast-glob": "^3.3.3",
"fs-extra": "^11.3.0", "fs-extra": "^11.3.0",
"fumadocs-core": "15.6.3", "fumadocs-core": "15.6.3",
...@@ -26,7 +28,8 @@ ...@@ -26,7 +28,8 @@
"remark-gfm": "^4.0.1", "remark-gfm": "^4.0.1",
"remark-mdx": "^3.1.0", "remark-mdx": "^3.1.0",
"remark-stringify": "^11.0.0", "remark-stringify": "^11.0.0",
"schema-dts": "^1.1.5" "schema-dts": "^1.1.5",
"tailwind-merge": "^3.5.0"
}, },
"devDependencies": { "devDependencies": {
"@content-collections/core": "^0.10.0", "@content-collections/core": "^0.10.0",
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment