diff --git a/README_ja.md b/README_ja.md index e169cd9f9..1a2684ab4 100644 --- a/README_ja.md +++ b/README_ja.md @@ -10,7 +10,7 @@ 日本語

-FastGPT は、LLM 上に構築された知識ベースの Q&A システムで、すぐに使えるデータ処理とモデル呼び出し機能を提供し、Flow の可視化を通じてワークフローのオーケストレーションを可能にします! +FastGPT は、LLM 上 に 構築 された 知識 ベースの Q&A システムで、すぐに 使 えるデータ 処理 とモデル 呼 び 出 し 機能 を 提供 し、Flow の 可視化 を 通 じてワークフローのオーケストレーションを 可能 にします! @@ -34,7 +34,7 @@ FastGPT は、LLM 上に構築された知識ベースの Q&A システムで、 https://github.com/labring/FastGPT/assets/15308462/7d3a38df-eb0e-4388-9250-2409bd33f6d4 -## 🛸 クラウドサービスの利用 +## 🛸 クラウドサービスの 利用 [fastgpt.run](https://fastgpt.run/) | | | @@ -44,64 +44,64 @@ https://github.com/labring/FastGPT/assets/15308462/7d3a38df-eb0e-4388-9250-2409b ## 💡 機能 -1. パワフルなビジュアルワークフロー: AI アプリケーションを簡単に作成 +1. パワフルなビジュアルワークフロー:AI アプリケーションを 簡単 に 作成 - - [x] デッキのシンプルモード - マニュアルアレンジ不要 - - [x] ユーザ対話事前ガイダンス - - [x] グローバル変数 - - [x] ナレッジベース検索 - - [x] 複数の LLM モデルによる対話 - - [x] テキストマジック - 構造化データへの変換 - - [x] HTTP による拡張 - - [ ] on-the-fly HTTP モジュールのための埋め込みLaf - - [x] 次の対話ステップへの指示 - - [x] ソースファイル参照の追跡 + - [x] デッキのシンプルモード - マニュアルアレンジ 不要 + - [x] ユーザ 対話事前 ガイダンス + - [x] グローバル 変数 + - [x] ナレッジベース 検索 + - [x] 複数 の LLM モデルによる 対話 + - [x] テキストマジック - 構造化 データへの 変換 + - [x] HTTP による 拡張 + - [ ] on-the-fly HTTP モジュールのための 埋 め 込 みLaf + - [x] 次 の 対話 ステップへの 指示 + - [x] ソースファイル 参照 の 追跡 - [ ] カスタムファイルリーダー - - [ ] モジュールをプラグインにパッケージして再利用する + - [ ] モジュールをプラグインにパッケージして 再利用 する -2. 広範なナレッジベースの前処理 +2. 広範 なナレッジベースの 前処理 - - [x] 複数のナレッジベースの再利用と混合 - - [x] チャンクの変更と削除を追跡 - - [x] 手動入力、直接分割、QA 分割インポートをサポート + - [x] 複数 のナレッジベースの 再利用 と 混合 + - [x] チャンクの 変更 と 削除 を 追跡 + - [x] 手動入力、直接分割、QA 分割 インポートをサポート - [x] URL フェッチとバッチ CSV インポートをサポート - - [x] ナレッジベースにユニークなベクトルモデルを設定可能 - - [x] オリジナルファイルの保存 - - [ ] ファイル学習エージェント + - [x] ナレッジベースにユニークなベクトルモデルを 設定可能 + - [x] オリジナルファイルの 保存 + - [ ] ファイル 学習 エージェント -3. 複数の効果測定チャンネル +3. 複数 の 効果測定 チャンネル - - [x] シングルポイントナレッジベース検索テスト - - [x] 対話中のフィードバック参照と修正・削除機能 - - [x] 完全なコンテキストの提示 - - [ ] 完全なモジュール中間値提示 + - [x] シングルポイントナレッジベース 検索 テスト + - [x] 対話中 のフィードバック 参照 と 修正 ・ 削除機能 + - [x] 完全 なコンテキストの 提示 + - [ ] 完全 なモジュール 中間値提示 4. OpenAPI - - [x] 補完インターフェイス(GPT インターフェイスに合わせる) + - [x] 補完 インターフェイス (GPT インターフェイスに 合 わせる) - [ ] ナレッジベース CRUD -5. オペレーション機能 +5. オペレーション 機能 - - [x] ログイン不要の共有ウィンドウ - - [x] Iframe によるワンクリック埋め込み - - [ ] 対話記録への統一されたアクセス + - [x] ログイン 不要 の 共有 ウィンドウ + - [x] Iframe によるワンクリック 埋 め 込 み + - [ ] 対話記録 への 統一 されたアクセス ## 👨‍💻 開発 -プロジェクトの技術スタック: NextJs + TS + ChakraUI + Mongo + Postgres (Vector プラグイン) +プロジェクトの 技術 スタック:NextJs + TS + ChakraUI + Mongo + Postgres (Vector プラグイン) - **⚡ デプロイ** [![](https://cdn.jsdelivr.us/gh/labring-actions/templates@main/Deploy-on-Sealos.svg)](https://cloud.sealos.io/?openapp=system-fastdeploy%3FtemplateName%3Dfastgpt) - デプロイ後、データベースをセットアップするので、2~4分待ってください。基本設定を使っているので、最初は少し遅いかもしれません。 + デプロイ 後、データベースをセットアップするので、2~4分待 ってください。基本設定 を 使 っているので、最初 は 少 し 遅 いかもしれません。 -- [ローカル開発入門](https://doc.fastgpt.run/docs/development) +- [ローカル 開発入門](https://doc.fastgpt.run/docs/development) - [FastGPT のデプロイ](https://doc.fastgpt.run/docs/installation) -- [システム設定ガイド](https://doc.fastgpt.run/docs/installation/reference) -- [複数モデルの設定](https://doc.fastgpt.run/docs/installation/reference/models) -- [バージョン更新とアップグレード](https://doc.fastgpt.run/docs/installation/upgrading) +- [システム 設定 ガイド](https://doc.fastgpt.run/docs/installation/reference) +- [複数 モデルの 設定](https://doc.fastgpt.run/docs/installation/reference/models) +- [バージョン 更新 とアップグレード](https://doc.fastgpt.run/docs/installation/upgrading) @@ -112,23 +112,23 @@ https://github.com/labring/FastGPT/assets/15308462/7d3a38df-eb0e-4388-9250-2409b | ------------------------------------------------- | ---------------------------------------------- | | ![](https://otnvvf-imgs.oss.laf.run/wxqun300.jpg) | ![](https://otnvvf-imgs.oss.laf.run/wx300.jpg) | --> -## 👀 その他 +## 👀 その 他 - [FastGPT FAQ](https://kjqvjse66l.feishu.cn/docx/HtrgdT0pkonP4kxGx8qcu6XDnGh) -- [Docker 導入チュートリアル動画](https://www.bilibili.com/video/BV1jo4y147fT/) -- [公式アカウント統合ビデオチュートリアル](https://www.bilibili.com/video/BV1xh4y1t7fy/) +- [Docker 導入 チュートリアル 動画](https://www.bilibili.com/video/BV1jo4y147fT/) +- [公式 アカウント 統合 ビデオチュートリアル](https://www.bilibili.com/video/BV1xh4y1t7fy/) - [FastGPT ナレッジベースデモ](https://www.bilibili.com/video/BV1Wo4y1p7i1/) -## 💪 関連プロジェクト +## 💪 関連 プロジェクト -- [Laf: サードパーティ製アプリケーションに 3 分でクイックアクセス](https://github.com/labring/laf) -- [Sealos: クラスタアプリケーションの迅速な展開](https://github.com/labring/sealos) -- [One API: マルチモデル管理、Azure、Wenxin Yiyuan などをサポートします。](https://github.com/songquanpeng/one-api) -- [TuShan: 5 分でバックエンド管理システムを構築](https://github.com/msgbyte/tushan) +- [Laf:サードパーティ 製 アプリケーションに 3 分 でクイックアクセス](https://github.com/labring/laf) +- [Sealos:クラスタアプリケーションの 迅速 な 展開](https://github.com/labring/sealos) +- [One API:マルチモデル 管理、Azure、Wenxin Yiyuan などをサポートします。](https://github.com/songquanpeng/one-api) +- [TuShan:5 分 でバックエンド 管理 システムを 構築](https://github.com/msgbyte/tushan) ## 🤝 サードパーティエコシステム -- [luolinAI: すぐに使える企業向け WeChat ボット](https://github.com/luolin-ai/FastGPT-Enterprise-WeChatbot) +- [luolinAI:すぐに 使 える 企業向 け WeChat ボット](https://github.com/luolin-ai/FastGPT-Enterprise-WeChatbot) ## 🌟 Star History diff --git a/docSite/.zhlintrc b/docSite/.zhlintrc index 6a01ab669..b97a85ef4 100644 --- a/docSite/.zhlintrc +++ b/docSite/.zhlintrc @@ -1,6 +1,6 @@ { - "preset": "default", - "rules": { - "adjustedFullWidthPunctuation": "" - } -} \ No newline at end of file + "preset": "default", + "rules": { + "adjustedFullWidthPunctuation": "" + } + } \ No newline at end of file diff --git a/docSite/assets/imgs/fastgpt-api-baseurl.png b/docSite/assets/imgs/fastgpt-api-baseurl.png new file mode 100644 index 000000000..bc2b3196f Binary files /dev/null and b/docSite/assets/imgs/fastgpt-api-baseurl.png differ diff --git a/docSite/assets/imgs/share-auth1.jpg b/docSite/assets/imgs/share-auth1.jpg new file mode 100644 index 000000000..e67919bc8 Binary files /dev/null and b/docSite/assets/imgs/share-auth1.jpg differ diff --git a/docSite/assets/imgs/share-auth2.png b/docSite/assets/imgs/share-auth2.png new file mode 100644 index 000000000..d3958227a Binary files /dev/null and b/docSite/assets/imgs/share-auth2.png differ diff --git a/docSite/assets/imgs/share-setlink.jpg b/docSite/assets/imgs/share-setlink.jpg new file mode 100644 index 000000000..94d76616c Binary files /dev/null and b/docSite/assets/imgs/share-setlink.jpg differ diff --git a/docSite/content/docs/development/intro.md b/docSite/content/docs/development/intro.md index ae6fd93d2..a7465671a 100644 --- a/docSite/content/docs/development/intro.md +++ b/docSite/content/docs/development/intro.md @@ -54,11 +54,11 @@ git clone git@github.com:/FastGPT.git **环境变量** -复制.env.template 文件,在同级目录下生成一个.env.local 文件,修改.env.local 里内容才是有效的变量。变量说明见 .env.template +复制`.env.template`文件,在同级目录下生成一个`.env.local` 文件,修改`.env.local` 里内容才是有效的变量。变量说明见 .env.template **config 配置文件** -复制 data/config.json 文件,生成一个 data/config.local.json 配置文件,具体配置参数说明,可参考 [config 配置说明](/docs/development/configuration) +复制 `data/config.json` 文件,生成一个 `data/config.local.json` 配置文件,具体配置参数说明,可参考 [config 配置说明](/docs/development/configuration) **注意:json 配置文件不能包含注释,介绍中为了方便看才加入的注释** diff --git a/docSite/content/docs/development/openApi.md b/docSite/content/docs/development/openApi.md deleted file mode 100644 index 8b49041f5..000000000 --- a/docSite/content/docs/development/openApi.md +++ /dev/null @@ -1,546 +0,0 @@ ---- -title: 'OpenAPI 使用(API Key 使用)' -description: 'FastGPT OpenAPI 文档' -icon: 'api' -draft: false -toc: true -weight: 512 ---- - -# 基本配置 -``` -baseUrl: "https://fastgpt.run/api" -headers: { - Authorization: "Bearer apikey" -} -``` - -# 如何获取 API Key - -FastGPT 的 API Key 有 2 类,一类是全局通用的 key;一类是携带了 AppId 也就是有应用标记的 key。 - -| 通用key | 应用特定 key | -| --------------------- | --------------------- | -| ![](/imgs/fastgpt-api2.png) | ![](/imgs/fastgpt-api.png) | - -# 接口 - -## 发起对话 - -{{% alert icon="🤖 " context="success" %}} -该接口 API Key 需使用应用特定的 key,否则会报错。 - -有些包的 BaseUrl 需要添加 `v1` 路径,有些不需要,建议都试一下。 -{{% /alert %}} - - -对话接口兼容`GPT`的接口!如果你的项目使用的是标准的`GPT`官方接口,可以直接通过修改 `BaseUrl` 和 `Authorization` 来访问 FastGpt 应用。 - -请求参数说明 -- headers.Authorization: Bearer apikey -- chatId: string | undefined 。 - - 为 undefined 时(不传入),不使用 FastGpt 提供的上下文功能,完全通过传入的 messages 构建上下文。 不会将你的记录存储到数据库中,你也无法在记录汇总中查阅到。 - - 为非空字符串时,意味着使用 chatId 进行对话,自动从 FastGpt 数据库取历史记录,并使用 messages 数组最后一个内容作为用户问题。(请自行确保 chatId 唯一,长度不限制) -- messages: 结构与 [GPT接口](https://platform.openai.com/docs/api-reference/chat/object) 完全一致。 -- detail: 是否返回详细值(模块状态,响应的完整结果),`stream模式`下会通过event进行区分,`非stream模式`结果保存在responseData中。 -- variables: 变量内容,一个对象,会替换`{{key}}`变量。在`HTTP`模块中会发给接口,可作为身份凭证等标识。 - -**请求示例:** - -```bash -curl --location --request POST 'https://fastgpt.run/api/v1/chat/completions' \ ---header 'Authorization: Bearer apikey' \ ---header 'Content-Type: application/json' \ ---data-raw '{ - "chatId":"111", - "stream":false, - "detail": false, - "variables": { - "cTime": "2022/2/2 22:22" - }, - "messages": [ - { - "content": "导演是谁", - "role": "user" - } - ] -}' -``` - - -{{< tabs tabTotal="3" >}} -{{< tab tabName="detail=false 响应" >}} -{{< markdownify >}} - -```bash -data: {"id":"","object":"","created":0,"choices":[{"delta":{"content":""},"index":0,"finish_reason":null}]} - -data: {"id":"","object":"","created":0,"choices":[{"delta":{"content":"电"},"index":0,"finish_reason":null}]} - -data: {"id":"","object":"","created":0,"choices":[{"delta":{"content":"影"},"index":0,"finish_reason":null}]} - -data: {"id":"","object":"","created":0,"choices":[{"delta":{"content":"《"},"index":0,"finish_reason":null}]} -``` - -{{< /markdownify >}} -{{< /tab >}} - -{{< tab tabName="detail=true 响应" >}} -{{< markdownify >}} - -```bash -event: answer -data: {"id":"","object":"","created":0,"choices":[{"delta":{"content":""},"index":0,"finish_reason":null}]} - -event: answer -data: {"id":"","object":"","created":0,"choices":[{"delta":{"content":"电"},"index":0,"finish_reason":null}]} - -event: answer -data: {"id":"","object":"","created":0,"choices":[{"delta":{"content":"影"},"index":0,"finish_reason":null}]} - -event: answer -data: {"id":"","object":"","created":0,"choices":[{"delta":{"content":"《"},"index":0,"finish_reason":null}]} - -event: answer -data: {"id":"","object":"","created":0,"choices":[{"delta":{"content":"铃"},"index":0,"finish_reason":null}]} - -event: answer -data: {"id":"","object":"","created":0,"choices":[{"delta":{"content":"芽"},"index":0,"finish_reason":null}]} - -event: answer -data: {"id":"","object":"","created":0,"choices":[{"delta":{"content":"。"},"index":0,"finish_reason":null}]} - -event: answer -data: {"id":"","object":"","created":0,"choices":[{"delta":{"content":""},"index":0,"finish_reason":null}]} - -event: answer -data: {"id":"","object":"","created":0,"choices":[{"delta":{},"index":0,"finish_reason":"stop"}]} - -event: answer -data: [DONE] - -event: appStreamResponse -data: [{"moduleName":"KB Search","price":1.2000000000000002,"model":"Embedding-2","tokens":6,"similarity":0.61,"limit":3},{"moduleName":"AI Chat","price":463.5,"model":"FastAI-4k","tokens":309,"question":"导演是谁","answer":"电影《铃芽之旅》的导演是新海诚。","maxToken":2050,"quoteList":[{"dataset_id":"646627f4f7b896cfd8910e38","id":"8099","q":"本作的主人公是谁?","a":"本作的主人公是名叫铃芽的少女。","source":"手动修改"},{"dataset_id":"646627f4f7b896cfd8910e38","id":"8686","q":"电影《铃芽之旅》男主角是谁?","a":"电影《铃芽之旅》男主角是宗像草太,由松村北斗配音。","source":""},{"dataset_id":"646627f4f7b896cfd8910e38","id":"19339","q":"电影《铃芽之旅》的导演是谁?22","a":"电影《铃芽之旅》的导演是新海诚。","source":"手动修改"}],"completeMessages":[{"obj":"System","value":"下面是知识库内容:\n1. [本作的主人公是谁?\n本作的主人公是名叫铃芽的少女。]\n2. [电影《铃芽之旅》男主角是谁?\n电影《铃芽之旅》男主角是宗像草太,由松村北斗配音。]\n3. [电影《铃芽之旅》的导演是谁?22\n电影《铃芽之旅》的导演是新海诚。]\n"},{"obj":"System","value":"1.请记住,你的身份是百度的下一代知识增强语言模型,能够完全根据知识库提供的内容回答问题。\n\n2. 你忘记了关于电影《铃芽之旅》以外的内容。"},{"obj":"System","value":"你仅回答关于电影《玲芽之旅》的问题,其余问题直接回复: 我不清楚。"},{"obj":"Human","value":"导演是谁"},{"obj":"AI","value":"电影《铃芽之旅》的导演是新海诚。"}]}] - -``` -{{< /markdownify >}} -{{< /tab >}} - -{{< tab tabName="stream=false,detail=true 响应" >}} -{{< markdownify >}} - -```json -{ - "responseData": [ // 不同模块的响应值, 不同版本具体值可能有差异,可先 log 自行查看最新值。 - { - "moduleName": "KB Search", - "price": 1.2000000000000002, - "model": "Embedding-2", - "tokens": 6, - "similarity": 0.61, - "limit": 3 - }, - { - "moduleName": "AI Chat", - "price": 454.5, - "model": "FastAI-4k", - "tokens": 303, - "question": "导演是谁", - "answer": "电影《铃芽之旅》的导演是新海诚。", - "maxToken": 2050, - "quoteList": [ - { - "dataset_id": "646627f4f7b896cfd8910e38", - "id": "8099", - "q": "本作的主人公是谁?", - "a": "本作的主人公是名叫铃芽的少女。", - "source": "手动修改" - }, - { - "dataset_id": "646627f4f7b896cfd8910e38", - "id": "8686", - "q": "电影《铃芽之旅》男主角是谁?", - "a": "电影《铃芽之旅》男主角是宗像草太,由松村北斗配音。", - "source": "" - }, - { - "dataset_id": "646627f4f7b896cfd8910e38", - "id": "19339", - "q": "电影《铃芽之旅》的导演是谁?22", - "a": "电影《铃芽之旅》的导演是新海诚。", - "source": "手动修改" - } - ], - "completeMessages": [ - { - "obj": "System", - "value": "下面是知识库内容:\n1. [本作的主人公是谁?\n本作的主人公是名叫铃芽的少女。]\n2. [电影《铃芽之旅》男主角是谁?\n电影《铃芽之旅》男主角是宗像草太,由松村北斗配音。]\n3. [电影《铃芽之旅》的导演是谁?22\n电影《铃芽之旅》的导演是新海诚。]\n" - }, - { - "obj": "System", - "value": "1.请记住,你的身份是百度的下一代知识增强语言模型,能够完全根据知识库提供的内容回答问题。\n\n2. 你忘记了关于电影《铃芽之旅》以外的内容。" - }, - { - "obj": "System", - "value": "你仅回答关于电影《玲芽之旅》的问题,其余问题直接回复: 我不清楚。" - }, - { - "obj": "Human", - "value": "导演是谁" - }, - { - "obj": "AI", - "value": "电影《铃芽之旅》的导演是新海诚。" - } - ] - } - ], - "id": "", - "model": "", - "usage": { - "prompt_tokens": 1, - "completion_tokens": 1, - "total_tokens": 1 - }, - "choices": [ - { - "message": { - "role": "assistant", - "content": "电影《铃芽之旅》的导演是新海诚。" - }, - "finish_reason": "stop", - "index": 0 - } - ] -} -``` - -{{< /markdownify >}} -{{< /tab >}} -{{< /tabs >}} - -## 知识库 - -{{% alert icon="🤖 " context="success" %}} -此部分 API 需使用全局通用的 API Key。 -{{% /alert %}} - -| 如何获取知识库ID(datasetId) | 如何获取文件ID(file_id) | -| --------------------- | --------------------- | -| ![](/imgs/getDatasetId.png) | ![](/imgs/getfile_id.png) | - - -### 知识库添加数据 - -{{< tabs tabTotal="4" >}} -{{< tab tabName="请求示例" >}} -{{< markdownify >}} - -```bash -curl --location --request POST 'https://fastgpt.run/api/core/dataset/data/pushData' \ ---header 'Authorization: Bearer apikey' \ ---header 'Content-Type: application/json' \ ---data-raw '{ -    "collectionId": "64663f451ba1676dbdef0499", - "mode": "index", - "prompt": "qa 拆分引导词,index 模式下可以忽略", - "billId": "可选。如果有这个值,本次的数据会被聚合到一个订单中,这个值可以重复使用。可以参考 [创建训练订单] 获取该值。", -    "data": [ -        { -            "a": "test", -            "q": "1111", - "file_id": "关联的文件ID/URL/manual/mark", - "source": "来源名称", -        }, -        { -            "a": "test2", -            "q": "22222" -        } -    ] -}' -``` - -{{< /markdownify >}} -{{< /tab >}} - -{{< tab tabName="参数说明" >}} -{{< markdownify >}} - -```json -{ - "collectionId": "文件的ID,参考上面的第二张图", - "mode": "index | qa ", // index 模式: 直接将 q 转成向量存起来,a 直接入库。qa 模式: 只关注 data 里的 q,将 q 丢给大模型,让其根据 prompt 拆分成 qa 问答对。 - "prompt": "拆分提示词,需严格按照模板,建议不要传入。", - "data": [ - { - "q": "生成索引的内容,index 模式下最大 tokens 为3000,建议不超过 1000", - "a": "预期回答/补充", - "file_id": "如果推送数据到手动录入,这里可以留空; 如果希望关联到某个文件中,需要填写对应文件的ID; 如果希望加入到手动标注中,可设置为: mark", - }, - { - "q": "生成索引的内容,qa 模式下最大 tokens 为10000,建议 8000 左右", - "a": "预期回答/补充" - } - ] -} -``` - -{{< /markdownify >}} -{{< /tab >}} - -{{< tab tabName="响应例子" >}} -{{< markdownify >}} - -```json -{ - "code": 200, - "statusText": "", - "data": { - "insertLen": 1, // 最终插入成功的数量 - "overToken": [], // 超出 token 的 - "fileIdInvalid": [ // file_id 无效的 - { - "a": "飞飞dsaf飞", - "q": "测试是32否收到", - "file_id": "32dwe" - } - ], - "error": [] // 其他错误 - } -} -``` - -{{< /markdownify >}} -{{< /tab >}} - -{{< tab tabName="QA Prompt 模板" >}} -{{< markdownify >}} - -{{theme}} 里的内容可以换成数据的主题。默认为:它们可能包含多个主题内容 - -``` -我会给你一段文本,{{theme}},学习它们,并整理学习成果,要求为: -1. 提出最多 25 个问题。 -2. 给出每个问题的答案。 -3. 答案要详细完整,答案可以包含普通文字、链接、代码、表格、公示、媒体链接等 markdown 元素。 -4. 按格式返回多个问题和答案: - -Q1: 问题。 -A1: 答案。 -Q2: -A2: -…… - -我的文本:"""{{text}}""" -``` - -{{< /markdownify >}} -{{< /tab >}} - -{{< /tabs >}} - - -### 搜索测试 - -{{< tabs tabTotal="2" >}} -{{< tab tabName="请求示例" >}} -{{< markdownify >}} - -```bash -curl --location --request POST 'https://fastgpt.run/api/core/dataset/searchTest' \ ---header 'Authorization: Bearer apiKey' \ ---header 'Content-Type: application/json' \ ---data-raw '{ - "datasetId": "知识库的ID", - "text": "导演是谁" -}' -``` - -{{< /markdownify >}} -{{< /tab >}} - -{{< tab tabName="响应示例" >}} -{{< markdownify >}} - -返回 top12 结果 - -```bash -{ - "code": 200, - "statusText": "", - "data": [ - { - "id": "5613327", - "q": "该人有获奖情况吗?", - "a": "该人获得过2020/07全国大学生服务外包大赛国家一等奖和2021/05国家创新创业计划立项的获奖情况。", - "source": "余金隆简历.pdf", - "score": 0.41556452839298963 - }, - ...... - ] -} -``` - -{{< /markdownify >}} -{{< /tab >}} - -{{< /tabs >}} - -## 订单 - -### 创建训练订单 - -**请求示例** - -```bash -curl --location --request POST 'https://fastgpt.run/api/support/wallet/bill/createTrainingBill' \ ---header 'Authorization: Bearer {{apikey}}' \ ---header 'Content-Type: application/json' \ ---data-raw '' -``` - -**响应结果** - -data 为 billId,可用于 api 添加数据时进行账单聚合。 - -```json -{ - "code": 200, - "statusText": "", - "message": "", - "data": "65112ab717c32018f4156361" -} -``` - -## 免登录分享链接校验(内测中) - -免登录链接配置中,增加了`凭证校验服务器`后,使用分享链接时会向服务器发起请求,校验链接是否可用,并在每次对话结束后,向服务器发送对话结果。下面以`host`来表示`凭证校验服务器`。服务器接口仅需返回是否校验成功即可,不需要返回其他数据,格式如下: - -```json -{ - "success": true, - "message": "错误提示" -} -``` - -![](/imgs/sharelinkProcess.png) - -### 分享链接中增加额外 query - -增加一个 query: authToken。例如: - -原始的链接:https://fastgpt.run/chat/share?shareId=648aaf5ae121349a16d62192 -完整链接: https://fastgpt.run/chat/share?shareId=648aaf5ae121349a16d62192&authToken=userid12345 - -发出校验请求时候,会在`body`中携带 token={{authToken}} 的参数。 - -### 初始化校验 - -**FastGPT 发出的请求** - -```bash -curl --location --request POST '{{host}}/shareAuth/init' \ ---header 'Content-Type: application/json' \ ---data-raw '{ - "token": "sintdolore" -}' -``` - -### 对话前校验 - -**FastGPT 发出的请求** - -```bash -curl --location --request POST '{{host}}/shareAuth/start' \ ---header 'Content-Type: application/json' \ ---data-raw '{ - "token": "sintdolore", - "question": "用户问题", -}' -``` - -### 对话结果上报 - -**FastGPT 发出的请求** - -```bash -curl --location --request POST '{{host}}/shareAuth/finish' \ ---header 'Content-Type: application/json' \ ---data-raw '{ - "token": "sint dolore", - "responseData": [ - { - "moduleName": "KB Search", - "price": 1.2000000000000002, - "model": "Embedding-2", - "tokens": 6, - "similarity": 0.61, - "limit": 3 - }, - { - "moduleName": "AI Chat", - "price": 454.5, - "model": "FastAI-4k", - "tokens": 303, - "question": "导演是谁", - "answer": "电影《铃芽之旅》的导演是新海诚。", - "maxToken": 2050, - "quoteList": [ - { - "dataset_id": "646627f4f7b896cfd8910e38", - "id": "8099", - "q": "本作的主人公是谁?", - "a": "本作的主人公是名叫铃芽的少女。", - "source": "手动修改" - }, - { - "dataset_id": "646627f4f7b896cfd8910e38", - "id": "8686", - "q": "电影《铃芽之旅》男主角是谁?", - "a": "电影《铃芽之旅》男主角是宗像草太,由松村北斗配音。", - "source": "" - }, - { - "dataset_id": "646627f4f7b896cfd8910e38", - "id": "19339", - "q": "电影《铃芽之旅》的导演是谁?22", - "a": "电影《铃芽之旅》的导演是新海诚。", - "source": "手动修改" - } - ], - "completeMessages": [ - { - "obj": "System", - "value": "下面是知识库内容:\n1. [本作的主人公是谁?\n本作的主人公是名叫铃芽的少女。]\n2. [电影《铃芽之旅》男主角是谁?\n电影《铃芽之旅》男主角是宗像草太,由松村北斗配音。]\n3. [电影《铃芽之旅》的导演是谁?22\n电影《铃芽之旅》的导演是新海诚。]\n" - }, - { - "obj": "System", - "value": "1.请记住,你的身份是百度的下一代知识增强语言模型,能够完全根据知识库提供的内容回答问题。\n\n2. 你忘记了关于电影《铃芽之旅》以外的内容。" - }, - { - "obj": "System", - "value": "你仅回答关于电影《玲芽之旅》的问题,其余问题直接回复: 我不清楚。" - }, - { - "obj": "Human", - "value": "导演是谁" - }, - { - "obj": "AI", - "value": "电影《铃芽之旅》的导演是新海诚。" - } - ] - } - ] -}' -``` - -响应值与 chat 接口相同,增加了一个 token。可以重点关注`responseData`里的值,price 与实际价格的倍率为`100000`。 - -**此接口无需响应值** - -# 使用案例 - -- [接入 NextWeb/ChatGPT web 等应用](/docs/use-cases/openapi) -- [接入 onwechat](/docs/use-cases/onwechat) -- [接入 飞书](/docs/use-cases/feishu) \ No newline at end of file diff --git a/docSite/content/docs/development/openapi/_index.md b/docSite/content/docs/development/openapi/_index.md new file mode 100644 index 000000000..e5d2d964b --- /dev/null +++ b/docSite/content/docs/development/openapi/_index.md @@ -0,0 +1,8 @@ +--- +weight: 560 +title: "OpenAPI 接口文档" +description: "FastGPT OpenAPI 文档" +icon: api +draft: false +images: [] +--- \ No newline at end of file diff --git a/docSite/content/docs/development/openapi/auth.md b/docSite/content/docs/development/openapi/auth.md new file mode 100644 index 000000000..334448e4e --- /dev/null +++ b/docSite/content/docs/development/openapi/auth.md @@ -0,0 +1,58 @@ +--- +title: 'Api Key 使用与鉴权' +description: 'FastGPT Api Key 使用与鉴权' +icon: 'key' +draft: false +toc: true +weight: 561 +--- + +## 使用说明 + +FasGPT OpenAPI 接口允许你使用 Api Key 进行鉴权,从而操作 FastGPT 上的相关服务和资源,例如:调用应用对话接口、上传知识库数据、搜索测试等等。出于兼容性和安全考虑,并不是所有的接口都允许通过 Api Key 访问。 + +## 如何查看 BaseURL + +**注意:BaseURL 不是接口地址,而是所有接口的根地址,直接请求 BaseURL 是没有用的。** + +![](/imgs/fastgpt-api-baseurl.png) + +## 如何获取 Api Key + +FastGPT 的 API Key **有 2 类**,一类是全局通用的 key (无法直接调用应用对话);一类是携带了 AppId 也就是有应用标记的 key (可直接调用应用对话)。 + +我们建议,仅操作应用或者对话的相关接口使用 `应用特定key`,其他接口使用 `通用key`。 + +| 通用key | 应用特定 key | +| --------------------- | --------------------- | +| ![](/imgs/fastgpt-api2.png) | ![](/imgs/fastgpt-api.png) | + +## 基本配置 + +OpenAPI 中,所有的接口都通过 Header.Authorization 进行鉴权。 + +``` +baseUrl: "https://fastgpt.run/api" +headers: { + Authorization: "Bearer {{apikey}}" +} +``` + +**发起应用对话示例** + +```sh +curl --location --request POST 'https://fastgpt.run/api/v1/chat/completions' \ +--header 'Authorization: Bearer fastgpt-xxxxxx' \ +--header 'Content-Type: application/json' \ +--data-raw '{ + "chatId": "111", + "stream": false, + "detail": false, + "messages": [ + { + "content": "导演是谁", + "role": "user" + } + ] +}' +``` \ No newline at end of file diff --git a/docSite/content/docs/development/openapi/chat.md b/docSite/content/docs/development/openapi/chat.md new file mode 100644 index 000000000..440d5f73f --- /dev/null +++ b/docSite/content/docs/development/openapi/chat.md @@ -0,0 +1,254 @@ +--- +title: '对话接口' +description: 'FastGPT OpenAPI 对话接口' +icon: 'chat' +draft: false +toc: true +weight: 562 +--- + +## 发起对话 + +{{% alert icon="🤖 " context="success" %}} +该接口的 API Key 需使用`应用特定的 key`,否则会报错。 + +有些包调用时,`BaseUrl`需要添加`v1`路径,有些不需要,如果出现404情况,可补充`v1`重试。 +{{% /alert %}} + + +**对话接口兼容`GPT`的接口!如果你的项目使用的是标准的`GPT`官方接口,可以直接通过修改`BaseUrl`和 `Authorization`来访问 FastGpt 应用。** + +## 请求 + +{{< tabs tabTotal="2" >}} +{{< tab tabName="请求示例" >}} +{{< markdownify >}} + +```bash +curl --location --request POST 'https://fastgpt.run/api/v1/chat/completions' \ +--header 'Authorization: Bearer fastgpt-xxxxxx' \ +--header 'Content-Type: application/json' \ +--data-raw '{ + "chatId": "abcd", + "stream": false, + "detail": false, + "variables": { + "uid": "asdfadsfasfd2323", + "name": "张三" + }, + "messages": [ + { + "content": "导演是谁", + "role": "user" + } + ] +}' +``` + +{{< /markdownify >}} +{{< /tab >}} + +{{< tab tabName="detail=true 响应" >}} +{{< markdownify >}} + +{{% alert context="info" %}} +- headers.Authorization: Bearer {{apikey}} +- chatId: string | undefined 。 + - 为 `undefined` 时(不传入),不使用 FastGpt 提供的上下文功能,完全通过传入的 messages 构建上下文。 不会将你的记录存储到数据库中,你也无法在记录汇总中查阅到。 + - 为`非空字符串`时,意味着使用 chatId 进行对话,自动从 FastGpt 数据库取历史记录,并使用 messages 数组最后一个内容作为用户问题。请自行确保 chatId 唯一,长度小于250,通常可以是自己系统的对话框ID。 +- messages: 结构与 [GPT接口](https://platform.openai.com/docs/api-reference/chat/object) 完全一致。 +- detail: 是否返回中间值(模块状态,响应的完整结果等),`stream模式`下会通过`event`进行区分,`非stream模式`结果保存在`responseData`中。 +- variables: 模块变量,一个对象,会替换模块中,输入框内容里的`{{key}}` +{{% /alert %}} + + + +{{< /markdownify >}} +{{< /tab >}} +{{< /tabs >}} + +## 响应 + +{{< tabs tabTotal="4" >}} +{{< tab tabName="detail=false,stream=false 响应" >}} +{{< markdownify >}} + +```json +{ + "id": "adsfasf", + "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=false,stream=true 响应" >}} +{{< markdownify >}} + + +```bash +data: {"id":"","object":"","created":0,"choices":[{"delta":{"content":""},"index":0,"finish_reason":null}]} + +data: {"id":"","object":"","created":0,"choices":[{"delta":{"content":"电"},"index":0,"finish_reason":null}]} + +data: {"id":"","object":"","created":0,"choices":[{"delta":{"content":"影"},"index":0,"finish_reason":null}]} + +data: {"id":"","object":"","created":0,"choices":[{"delta":{"content":"《"},"index":0,"finish_reason":null}]} +``` +{{< /markdownify >}} +{{< /tab >}} + +{{< tab tabName="detail=true,stream=false 响应" >}} +{{< markdownify >}} + +```json +{ + "responseData": [ // 不同模块的响应值, 不同版本具体值可能有差异,可先 log 自行查看最新值。 + { + "moduleName": "Dataset Search", + "price": 1.2000000000000002, + "model": "Embedding-2", + "tokens": 6, + "similarity": 0.61, + "limit": 3 + }, + { + "moduleName": "AI Chat", + "price": 454.5, + "model": "FastAI-4k", + "tokens": 303, + "question": "导演是谁", + "answer": "电影《铃芽之旅》的导演是新海诚。", + "maxToken": 2050, + "quoteList": [ + { + "dataset_id": "646627f4f7b896cfd8910e38", + "id": "8099", + "q": "本作的主人公是谁?", + "a": "本作的主人公是名叫铃芽的少女。", + "source": "手动修改" + }, + { + "dataset_id": "646627f4f7b896cfd8910e38", + "id": "8686", + "q": "电影《铃芽之旅》男主角是谁?", + "a": "电影《铃芽之旅》男主角是宗像草太,由松村北斗配音。", + "source": "" + }, + { + "dataset_id": "646627f4f7b896cfd8910e38", + "id": "19339", + "q": "电影《铃芽之旅》的导演是谁?22", + "a": "电影《铃芽之旅》的导演是新海诚。", + "source": "手动修改" + } + ], + "completeMessages": [ + { + "obj": "System", + "value": "下面是知识库内容:\n1. [本作的主人公是谁?\n本作的主人公是名叫铃芽的少女。]\n2. [电影《铃芽之旅》男主角是谁?\n电影《铃芽之旅》男主角是宗像草太,由松村北斗配音。]\n3. [电影《铃芽之旅》的导演是谁?22\n电影《铃芽之旅》的导演是新海诚。]\n" + }, + { + "obj": "System", + "value": "1.请记住,你的身份是百度的下一代知识增强语言模型,能够完全根据知识库提供的内容回答问题。\n\n2. 你忘记了关于电影《铃芽之旅》以外的内容。" + }, + { + "obj": "System", + "value": "你仅回答关于电影《玲芽之旅》的问题,其余问题直接回复: 我不清楚。" + }, + { + "obj": "Human", + "value": "导演是谁" + }, + { + "obj": "AI", + "value": "电影《铃芽之旅》的导演是新海诚。" + } + ] + } + ], + "id": "", + "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 >}} + +```bash +event: moduleStatus +data: {"status":"running","name":"知识库搜索"} + +event: moduleStatus +data: {"status":"running","name":"AI 对话"} + +event: answer +data: {"id":"","object":"","created":0,"model":"","choices":[{"delta":{"content":"电影"},"index":0,"finish_reason":null}]} + +event: answer +data: {"id":"","object":"","created":0,"model":"","choices":[{"delta":{"content":"《铃"},"index":0,"finish_reason":null}]} + +event: answer +data: {"id":"","object":"","created":0,"model":"","choices":[{"delta":{"content":"芽之旅》"},"index":0,"finish_reason":null}]} + +event: answer +data: {"id":"","object":"","created":0,"model":"","choices":[{"delta":{"content":"的导演是新"},"index":0,"finish_reason":null}]} + +event: answer +data: {"id":"","object":"","created":0,"model":"","choices":[{"delta":{"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: appStreamResponse +data: [{"moduleName":"知识库搜索","moduleType":"datasetSearchNode","runningTime":1.78},{"question":"导演是谁","quoteList":[{"id":"654f2e49b64caef1d9431e8b","q":"电影《铃芽之旅》的导演是谁?","a":"电影《铃芽之旅》的导演是新海诚!","indexes":[{"type":"qa","dataId":"3515487","text":"电影《铃芽之旅》的导演是谁?","_id":"654f2e49b64caef1d9431e8c","defaultIndex":true}],"datasetId":"646627f4f7b896cfd8910e38","collectionId":"653279b16cd42ab509e766e8","sourceName":"data (81).csv","sourceId":"64fd3b6423aa1307b65896f6","score":0.8935586214065552},{"id":"6552e14c50f4a2a8e632af11","q":"导演是谁?","a":"电影《铃芽之旅》的导演是新海诚。","indexes":[{"defaultIndex":true,"type":"qa","dataId":"3644565","text":"导演是谁?\n电影《铃芽之旅》的导演是新海诚。","_id":"6552e14dde5cc7ba3954e417"}],"datasetId":"646627f4f7b896cfd8910e38","collectionId":"653279b16cd42ab509e766e8","sourceName":"data (81).csv","sourceId":"64fd3b6423aa1307b65896f6","score":0.8890955448150635},{"id":"654f34a0b64caef1d946337e","q":"本作的主人公是谁?","a":"本作的主人公是名叫铃芽的少女。","indexes":[{"type":"qa","dataId":"3515541","text":"本作的主人公是谁?","_id":"654f34a0b64caef1d946337f","defaultIndex":true}],"datasetId":"646627f4f7b896cfd8910e38","collectionId":"653279b16cd42ab509e766e8","sourceName":"data (81).csv","sourceId":"64fd3b6423aa1307b65896f6","score":0.8738770484924316},{"id":"654f3002b64caef1d944207a","q":"电影《铃芽之旅》男主角是谁?","a":"电影《铃芽之旅》男主角是宗像草太,由松村北斗配音。","indexes":[{"type":"qa","dataId":"3515538","text":"电影《铃芽之旅》男主角是谁?","_id":"654f3002b64caef1d944207b","defaultIndex":true}],"datasetId":"646627f4f7b896cfd8910e38","collectionId":"653279b16cd42ab509e766e8","sourceName":"data (81).csv","sourceId":"64fd3b6423aa1307b65896f6","score":0.8607980012893677},{"id":"654f2fc8b64caef1d943fd46","q":"电影《铃芽之旅》的编剧是谁?","a":"新海诚是本片的编剧。","indexes":[{"defaultIndex":true,"type":"qa","dataId":"3515550","text":"电影《铃芽之旅》的编剧是谁?22","_id":"654f2fc8b64caef1d943fd47"}],"datasetId":"646627f4f7b896cfd8910e38","collectionId":"653279b16cd42ab509e766e8","sourceName":"data (81).csv","sourceId":"64fd3b6423aa1307b65896f6","score":0.8468944430351257}],"moduleName":"AI 对话","moduleType":"chatNode","runningTime":1.86}] +``` + +{{< /markdownify >}} +{{< /tab >}} +{{< /tabs >}} + + +## 使用案例 + +- [接入 NextWeb/ChatGPT web 等应用](/docs/use-cases/openapi) +- [接入 onwechat](/docs/use-cases/onwechat) +- [接入 飞书](/docs/use-cases/feishu) \ No newline at end of file diff --git a/docSite/content/docs/development/openapi/dataset.md b/docSite/content/docs/development/openapi/dataset.md new file mode 100644 index 000000000..66a12f106 --- /dev/null +++ b/docSite/content/docs/development/openapi/dataset.md @@ -0,0 +1,214 @@ +--- +title: '知识库接口' +description: 'FastGPT OpenAPI 知识库接口' +icon: 'dataset' +draft: false +toc: true +weight: 563 +--- + +| 如何获取知识库ID(datasetId) | 如何获取文件集合ID(collection_id) | +| --------------------- | --------------------- | +| ![](/imgs/getDatasetId.png) | ![](/imgs/getfile_id.png) | + + + +## 创建训练订单 + +**请求示例** + +```bash +curl --location --request POST 'https://fastgpt.run/api/support/wallet/bill/createTrainingBill' \ +--header 'Authorization: Bearer {{apikey}}' \ +--header 'Content-Type: application/json' \ +--data-raw '' +``` + +**响应结果** + +data 为 billId,可用于添加知识库数据时进行账单聚合。 + +```json +{ + "code": 200, + "statusText": "", + "message": "", + "data": "65112ab717c32018f4156361" +} +``` + +## 知识库添加数据 + +{{< tabs tabTotal="4" >}} +{{< tab tabName="请求示例" >}} +{{< markdownify >}} + +```bash +curl --location --request POST 'https://fastgpt.run/api/core/dataset/data/pushData' \ +--header 'Authorization: Bearer apikey' \ +--header 'Content-Type: application/json' \ +--data-raw '{ +    "collectionId": "64663f451ba1676dbdef0499", + "mode": "chunk", + "prompt": "可选。qa 拆分引导词,chunk 模式下忽略", + "billId": "可选。如果有这个值,本次的数据会被聚合到一个订单中,这个值可以重复使用。可以参考 [创建训练订单] 获取该值。", +    "data": [ + { + "q": "你是谁?", + "a": "我是FastGPT助手" + }, + { + "q": "你会什么?", + "a": "我什么都会", + "indexes": [{ + "type":"custom", + "text":"你好" + }] + } + ] +}' +``` + +{{< /markdownify >}} +{{< /tab >}} + +{{< tab tabName="参数说明" >}} +{{< markdownify >}} + +需要先了解 FastGPT 的多路索引概念: + +在 FastGPT 中,你可以为一组数据创建多个索引,如果不指定索引,则系统会自动取对应的 chunk 作为索引。例如前面的请求示例中: + +`q:你是谁?a:我是FastGPT助手` 它的`indexes`属性为空,意味着不自定义索引,而是使用默认的索引(你是谁?\n我是FastGPT助手)。 + +在第二组数据中`q:你会什么?a:我什么都会`指定了一个`你好`的索引,因此这组数据的索引为`你好`。 + +```json +{ + "collectionId": "文件集合的ID,参考上面的第二张图", + "mode": "chunk | qa ", // chunk 模式: 可自定义索引。qa 模型:无法自定义索引,会自动取 data 中的 q 作为数据,让模型自动生成问答对和索引。 + "prompt": "QA 拆分提示词,需严格按照模板,建议不要传入。", + "data": [ + { + "q": "生成索引的内容,index 模式下最大 tokens 为3000,建议不超过 1000", + "a": "预期回答/补充", + "indexes": "自定义索引", + }, + { + "q": "xxx", + "a": "xxxx" + } + ], + +} +``` + +{{< /markdownify >}} +{{< /tab >}} + +{{< tab tabName="响应例子" >}} +{{< markdownify >}} + +```json +{ + "code": 200, + "statusText": "", + "data": { + "insertLen": 1, // 最终插入成功的数量 + "overToken": [], // 超出 token 的 + + "repeat": [], // 重复的数量 + "error": [] // 其他错误 + } +} +``` + +{{< /markdownify >}} +{{< /tab >}} + +{{< tab tabName="QA Prompt 模板" >}} +{{< markdownify >}} + +{{theme}} 里的内容可以换成数据的主题。默认为:它们可能包含多个主题内容 + +``` +我会给你一段文本,{{theme}},学习它们,并整理学习成果,要求为: +1. 提出最多 25 个问题。 +2. 给出每个问题的答案。 +3. 答案要详细完整,答案可以包含普通文字、链接、代码、表格、公示、媒体链接等 markdown 元素。 +4. 按格式返回多个问题和答案: + +Q1: 问题。 +A1: 答案。 +Q2: +A2: +…… + +我的文本:"""{{text}}""" +``` + +{{< /markdownify >}} +{{< /tab >}} + +{{< /tabs >}} + + +## 搜索测试 + +{{< tabs tabTotal="2" >}} +{{< tab tabName="请求示例" >}} +{{< markdownify >}} + +```bash +curl --location --request POST 'https://fastgpt.run/api/core/dataset/searchTest' \ +--header 'Authorization: Bearer fastgpt-xxxxx' \ +--header 'Content-Type: application/json' \ +--data-raw '{ + "datasetId": "知识库的ID", + "text": "导演是谁", + "rarank": true, + "limit": 20 +}' +``` + +{{< /markdownify >}} +{{< /tab >}} + +{{< tab tabName="响应示例" >}} +{{< markdownify >}} + +返回 top limit 结果 + +```bash +{ + "code": 200, + "statusText": "", + "data": [ + { + "id": "65599c54a5c814fb803363cb", + "q": "你是谁", + "a": "我是FastGPT助手", + "indexes": [ + { + "defaultIndex": true, + "type": "qa", + "dataId": "3645952", + "text": "你是谁\n我是FastGPT助手", + "_id": "65599c5588271af95b019862" + } + ], + "datasetId": "6554684f7f9ed18a39a4d15c", + "collectionId": "6556cd795e4b663e770bb66d", + "sourceName": "GBT 15104-2021 装饰单板贴面人造板.pdf", + "sourceId": "6556cd775e4b663e770bb65c", + "score": 0.8050316572189331 + }, + ...... + ] +} +``` + +{{< /markdownify >}} +{{< /tab >}} + +{{< /tabs >}} diff --git a/docSite/content/docs/development/openapi/share.md b/docSite/content/docs/development/openapi/share.md new file mode 100644 index 000000000..56e085b90 --- /dev/null +++ b/docSite/content/docs/development/openapi/share.md @@ -0,0 +1,257 @@ +--- +title: '分享链接鉴权' +description: 'FastGPT 分享链接鉴权' +icon: 'share' +draft: false +toc: true +weight: 564 +--- + +## 使用说明 + +分享链接鉴权设计的目的在于,将 FastGPT 的对话框安全的接入你现有的系统中。 + +免登录链接配置中,增加了`凭证校验服务器`后,使用分享链接时会向服务器发起请求,校验链接是否可用,并在每次对话结束后,向服务器发送对话结果。下面以`host`来表示`凭证校验服务器`。服务器接口仅需返回是否校验成功即可,不需要返回其他数据,格式如下: + +```json +{ + "success": true, + "message": "错误提示", + "msg": "同message, 错误提示" +} +``` + +![](/imgs/sharelinkProcess.png) + +## 配置校验地址和校验token + +### 1. 配置校验地址的`BaseURL`、 + +![](/imgs/share-setlink.jpg) + +配置校验地址后,在每次分享链接使用时,都会向对应的地址发起校验和上报请求。 + +### 2. 分享链接中增加额外 query + +在分享链接的地址中,增加一个额外的参数: authToken。例如: + +原始的链接:https://fastgpt.run/chat/share?shareId=648aaf5ae121349a16d62192 +完整链接: https://fastgpt.run/chat/share?shareId=648aaf5ae121349a16d62192&authToken=userid12345 + +这个`token`通常是你系统生成的,在发出校验请求时,FastGPT 会在`body`中携带 token={{authToken}} 的参数。 + +## 聊天初始化校验 + +**FastGPT 发出的请求** + +```bash +curl --location --request POST '{{host}}/shareAuth/init' \ +--header 'Content-Type: application/json' \ +--data-raw '{ + "token": "sintdolore" +}' +``` + +**响应示例** + +```json +{ + "success": false, + "message": "分享链接无效", +} +``` + +## 对话前校验 + +**FastGPT 发出的请求** + +```bash +curl --location --request POST '{{host}}/shareAuth/start' \ +--header 'Content-Type: application/json' \ +--data-raw '{ + "token": "sintdolore", + "question": "用户问题", +}' +``` + +**响应示例** + +```json +{ + "success": true +} +``` + +## 对话结果上报 + +```bash +curl --location --request POST '{{host}}/shareAuth/finish' \ +--header 'Content-Type: application/json' \ +--data-raw '{ + "token": "sint dolore", + "responseData": [ + { + "moduleName": "KB Search", + "price": 1.2000000000000002, + "model": "Embedding-2", + "tokens": 6, + "similarity": 0.61, + "limit": 3 + }, + { + "moduleName": "AI Chat", + "price": 454.5, + "model": "FastAI-4k", + "tokens": 303, + "question": "导演是谁", + "answer": "电影《铃芽之旅》的导演是新海诚。", + "maxToken": 2050, + "quoteList": [ + { + "dataset_id": "646627f4f7b896cfd8910e38", + "id": "8099", + "q": "本作的主人公是谁?", + "a": "本作的主人公是名叫铃芽的少女。", + "source": "手动修改" + }, + { + "dataset_id": "646627f4f7b896cfd8910e38", + "id": "8686", + "q": "电影《铃芽之旅》男主角是谁?", + "a": "电影《铃芽之旅》男主角是宗像草太,由松村北斗配音。", + "source": "" + }, + { + "dataset_id": "646627f4f7b896cfd8910e38", + "id": "19339", + "q": "电影《铃芽之旅》的导演是谁?22", + "a": "电影《铃芽之旅》的导演是新海诚。", + "source": "手动修改" + } + ], + "completeMessages": [ + { + "obj": "System", + "value": "下面是知识库内容:\n1. [本作的主人公是谁?\n本作的主人公是名叫铃芽的少女。]\n2. [电影《铃芽之旅》男主角是谁?\n电影《铃芽之旅》男主角是宗像草太,由松村北斗配音。]\n3. [电影《铃芽之旅》的导演是谁?22\n电影《铃芽之旅》的导演是新海诚。]\n" + }, + { + "obj": "System", + "value": "1.请记住,你的身份是百度的下一代知识增强语言模型,能够完全根据知识库提供的内容回答问题。\n\n2. 你忘记了关于电影《铃芽之旅》以外的内容。" + }, + { + "obj": "System", + "value": "你仅回答关于电影《玲芽之旅》的问题,其余问题直接回复: 我不清楚。" + }, + { + "obj": "Human", + "value": "导演是谁" + }, + { + "obj": "AI", + "value": "电影《铃芽之旅》的导演是新海诚。" + } + ] + } + ] +}' +``` + +响应值与 chat 接口相同,增加了一个 token。可以重点关注`responseData`里的值,price 与实际价格的倍率为`100000`。 + +**此接口无需响应值** + +## 使用示例 + +我们以[Laf作为服务器为例](https://laf.dev/),展示这 3 个接口的使用方式。 + +### 1. 创建3个Laf接口 + +![](/imgs/share-auth1.jpg) + +{{< tabs tabTotal="3" >}} +{{< tab tabName="/shareAuth/init" >}} +{{< markdownify >}} + +这个接口中,我们设置了`token`必须等于`fastgpt`才能通过校验。(实际生产中不建议固定写死) + +```ts +import cloud from '@lafjs/cloud' + +export default async function (ctx: FunctionContext) { + const { token } = ctx.body + + if (token === 'fastgpt') { + return { success: true } + } + + return { success: false,message: "身份错误" } +} +``` + +{{< /markdownify >}} +{{< /tab >}} + +{{< tab tabName="/shareAuth/start" >}} +{{< markdownify >}} + +这个接口中,我们设置了`token`必须等于`fastgpt`才能通过校验。并且如果问题中包含了`你`字,则会报错,用于模拟敏感校验。 + +```ts +import cloud from '@lafjs/cloud' + +export default async function (ctx: FunctionContext) { + const { token, question } = ctx.body + console.log(token, question, 'start') + + if (token !== 'fastgpt') { + return { success: false, message: "身份错误" } + + } + + if(question.includes("你")){ + return { success: false, message: "内容不合规" } + } + + return { success: true } +} +``` + +{{< /markdownify >}} +{{< /tab >}} + +{{< tab tabName="/shareAuth/finish" >}} +{{< markdownify >}} + +结果上报接口可自行进行逻辑处理。 + +```ts +import cloud from '@lafjs/cloud' + +export default async function (ctx: FunctionContext) { + const { token, responseData } = ctx.body + console.log(token,responseData,'=====') + return { } +} +``` + +{{< /markdownify >}} +{{< /tab >}} +{{< /tabs >}} + + +### 2. 配置校验地址 + +我们随便复制3个地址中一个接口:https://d8dns0.laf.dev/shareAuth/finish , 去除 /shareAuth/finish 后填入 FastGPT 中: https://d8dns0.laf.dev + +![](/imgs/share-auth2.jpg) + +### 3. 修改分享链接参数 + +源分享链接:[https://fastgpt.run/chat/share?shareId=64be36376a438af0311e599c](https://fastgpt.run/chat/share?shareId=64be36376a438af0311e599c) + +修改后:[https://fastgpt.run/chat/share?shareId=64be36376a438af0311e599c&authToken=fastgpt](https://fastgpt.run/chat/share?shareId=64be36376a438af0311e599c&authToken=fastgpt) + +### 4. 测试效果 + +1. 打开源链接或者`authToken`不等于 `fastgpt`的链接会提示身份错误。 +2. 发送内容中包含你字,会提示内容不合规。 \ No newline at end of file diff --git a/docSite/content/docs/installation/one-api.md b/docSite/content/docs/installation/one-api.md index d06ec0827..68d9860c6 100644 --- a/docSite/content/docs/installation/one-api.md +++ b/docSite/content/docs/installation/one-api.md @@ -46,7 +46,6 @@ SqlLite 版本不支持多实例,适合个人小流量使用,但是价格非 ``` SESSION_SECRET=SESSION_SECRET -CHANNEL_TEST_FREQUENCY=30 POLLING_INTERVAL=60 BATCH_UPDATE_ENABLED=true BATCH_UPDATE_INTERVAL=60 @@ -72,7 +71,7 @@ BATCH_UPDATE_INTERVAL=60 ### 3. 修改 FastGPT 的环境变量 -有了 One API 令牌后,FastGPT 可以通过修改 baseurl 和 key 去请求到 One API,再由 One API 去请求不同的模型。修改下面两个环境变量: +有了 One API 令牌后,FastGPT 可以通过修改 `baseurl` 和 `key` 去请求到 One API,再由 One API 去请求不同的模型。修改下面两个环境变量: ```bash # 下面的地址是 Sealos 提供的,务必写上 v1, 两个项目都在 sealos 部署时候,https://xxxx.cloud.sealos.io 可以改用内网地址 @@ -104,6 +103,7 @@ CHAT_API_KEY=sk-xxxxxx // 例如:文心一言的中英文 token 基本是 1:1,而 GPT 的中文 Token 是 2:1,如果文心一言官方最大 Token 是 4000,那么这里就可以填 8000,保险点就填 7000. "quoteMaxToken": 2000, // 引用知识库的最大 Token "maxTemperature": 1, // 最大温度 + "vision": false, // 是否开启图片识别 "defaultSystemChatPrompt": "" // 默认的系统提示词 } ... diff --git a/docSite/content/docs/installation/upgrading/421.md b/docSite/content/docs/installation/upgrading/421.md index ea8a12e27..b224ed9e2 100644 --- a/docSite/content/docs/installation/upgrading/421.md +++ b/docSite/content/docs/installation/upgrading/421.md @@ -7,7 +7,7 @@ toc: true weight: 847 --- -私有部署,如果添加了配置文件,需要在配置文件中修改 `VectorModels` 字段。增加 defaultToken 和 maxToken,分别对应直接分段时的默认 token 数量和该模型支持的 token 上限(通常不建议超过 3000) +私有部署,如果添加了配置文件,需要在配置文件中修改 `VectorModels` 字段。增加 defaultToken 和 maxToken,分别对应直接分段时的默认 token 数量和该模型支持的 token 上限 (通常不建议超过 3000) ```json "VectorModels": [ diff --git a/docSite/content/docs/installation/upgrading/43.md b/docSite/content/docs/installation/upgrading/43.md index 1c101244c..6aca74023 100644 --- a/docSite/content/docs/installation/upgrading/43.md +++ b/docSite/content/docs/installation/upgrading/43.md @@ -9,7 +9,7 @@ weight: 846 ## 执行初始化 API -发起 1 个 HTTP 请求(记得携带 `headers.rootkey`,这个值是环境变量里的) +发起 1 个 HTTP 请求 (记得携带 `headers.rootkey`,这个值是环境变量里的) 1. https://xxxxx/api/admin/initv43 diff --git a/docSite/content/docs/installation/upgrading/44.md b/docSite/content/docs/installation/upgrading/44.md index ee87879ad..27d138fe4 100644 --- a/docSite/content/docs/installation/upgrading/44.md +++ b/docSite/content/docs/installation/upgrading/44.md @@ -9,7 +9,7 @@ weight: 845 ## 执行初始化 API -发起 1 个 HTTP 请求(记得携带 `headers.rootkey`,这个值是环境变量里的) +发起 1 个 HTTP 请求 (记得携带 `headers.rootkey`,这个值是环境变量里的) 1. https://xxxxx/api/admin/initv44 diff --git a/docSite/content/docs/installation/upgrading/442.md b/docSite/content/docs/installation/upgrading/442.md index 21958a493..0c5832931 100644 --- a/docSite/content/docs/installation/upgrading/442.md +++ b/docSite/content/docs/installation/upgrading/442.md @@ -9,7 +9,7 @@ weight: 843 ## 执行初始化 API -发起 1 个 HTTP 请求(记得携带 `headers.rootkey`,这个值是环境变量里的) +发起 1 个 HTTP 请求 (记得携带 `headers.rootkey`,这个值是环境变量里的) 1. https://xxxxx/api/admin/initv442 diff --git a/docSite/content/docs/installation/upgrading/46.md b/docSite/content/docs/installation/upgrading/46.md index 5867d42c7..f71423a3b 100644 --- a/docSite/content/docs/installation/upgrading/46.md +++ b/docSite/content/docs/installation/upgrading/46.md @@ -9,18 +9,18 @@ weight: 836 **V4.6 版本加入了简单的团队功能,可以邀请其他用户进来管理资源。该版本升级后无法执行旧的升级脚本,且无法回退。** -## 1. 更新镜像并变更配置文件 +## 1。更新镜像并变更配置文件 更新镜像至 latest 或者 v4.6 版本。商业版镜像更新至 V0.2.1 -最新配置可参考: [V46版本最新 config.json](/docs/development/configuration),商业镜像配置文件也更新,参考最新的飞书文档。 +最新配置可参考:[V46 版本最新 config.json](/docs/development/configuration),商业镜像配置文件也更新,参考最新的飞书文档。 -## 2. 执行初始化 API +## 2。执行初始化 API -发起 2 个 HTTP 请求({{rootkey}} 替换成环境变量里的`rootkey`,{{host}}替换成自己域名) +发起 2 个 HTTP 请求 ({{rootkey}} 替换成环境变量里的 `rootkey`,{{host}} 替换成自己域名) -**该初始化接口可能速度很慢,返回超时不用管,注意看日志即可,需要注意的是,需确保initv46成功后,在执行initv46-2** +**该初始化接口可能速度很慢,返回超时不用管,注意看日志即可,需要注意的是,需确保 initv46 成功后,在执行 initv46-2** 1. https://xxxxx/api/admin/initv46 @@ -39,22 +39,22 @@ curl --location --request POST 'https://{{host}}/api/admin/initv46-2' \ ``` 初始化内容: -1. 创建默认团队 -2. 初始化 Mongo 所有资源的团队字段 -3. 初始化 Pg 的字段 -4. 初始化 Mongo Data +1。创建默认团队 +2。初始化 Mongo 所有资源的团队字段 +3。初始化 Pg 的字段 +4。初始化 Mongo Data -## V4.6功能介绍 +## V4.6 功能介绍 1. 新增 - 团队空间 -2. 新增 - 多路向量(多个向量映射一组数据) -3. 新增 - tts语音 +2. 新增 - 多路向量 (多个向量映射一组数据) +3. 新增 - tts 语音 4. 新增 - 支持知识库配置文本预处理模型 -5. 线上环境新增 - ReRank向量召回,提高召回精度 +5. 线上环境新增 - ReRank 向量召回,提高召回精度 6. 优化 - 知识库导出,可直接触发流下载,无需等待转圈圈 -## 4.6缺陷修复 +## 4.6 缺陷修复 旧的 4.6 版本由于缺少一个字段,导致文件导入时知识库数据无法显示,可执行下面的脚本: diff --git a/packages/global/common/system/types/index.d.ts b/packages/global/common/system/types/index.d.ts index b981fcb4d..7715c9328 100644 --- a/packages/global/common/system/types/index.d.ts +++ b/packages/global/common/system/types/index.d.ts @@ -4,7 +4,6 @@ export type FeConfigsType = { show_appStore?: boolean; show_contact?: boolean; show_git?: boolean; - show_doc?: boolean; show_pay?: boolean; show_openai_account?: boolean; show_promotion?: boolean; diff --git a/packages/global/core/ai/model.d.ts b/packages/global/core/ai/model.d.ts index fd316c035..123d98868 100644 --- a/packages/global/core/ai/model.d.ts +++ b/packages/global/core/ai/model.d.ts @@ -30,8 +30,6 @@ export type AudioSpeechModelType = { model: string; name: string; price: number; - baseUrl?: string; - key?: string; voices: { label: string; value: string; bufferId: string }[]; }; diff --git a/packages/service/core/ai/audio/speech.ts b/packages/service/core/ai/audio/speech.ts index 2ff245a0c..ee79fe2a8 100644 --- a/packages/service/core/ai/audio/speech.ts +++ b/packages/service/core/ai/audio/speech.ts @@ -10,8 +10,7 @@ export async function text2Speech({ input, model = defaultAudioSpeechModels[0].model, voice, - speed = 1, - props + speed = 1 }: { res: NextApiResponse; onSuccess: (e: { model: string; buffer: Buffer }) => void; @@ -20,9 +19,8 @@ export async function text2Speech({ model: string; voice: string; speed?: number; - props?: UserModelSchema['openaiAccount']; }) { - const ai = getAIApi(props); + const ai = getAIApi(); const response = await ai.audio.speech.create({ model, // @ts-ignore diff --git a/packages/service/core/dataset/data/schema.ts b/packages/service/core/dataset/data/schema.ts index e1993c1a3..b51262478 100644 --- a/packages/service/core/dataset/data/schema.ts +++ b/packages/service/core/dataset/data/schema.ts @@ -7,7 +7,10 @@ import { } from '@fastgpt/global/support/user/team/constant'; import { DatasetCollectionName } from '../schema'; import { DatasetColCollectionName } from '../collection/schema'; -import { DatasetDataIndexTypeMap } from '@fastgpt/global/core/dataset/constant'; +import { + DatasetDataIndexTypeEnum, + DatasetDataIndexTypeMap +} from '@fastgpt/global/core/dataset/constant'; export const DatasetDataCollectionName = 'dataset.datas'; @@ -50,7 +53,7 @@ const DatasetDataSchema = new Schema({ type: { type: String, enum: Object.keys(DatasetDataIndexTypeMap), - required: true + default: DatasetDataIndexTypeEnum.custom }, dataId: { type: String, diff --git a/projects/app/data/config.json b/projects/app/data/config.json index 556863d56..af0f8d168 100644 --- a/projects/app/data/config.json +++ b/projects/app/data/config.json @@ -118,8 +118,6 @@ "model": "tts-1", "name": "OpenAI TTS1", "price": 0, - "baseUrl": "", - "key": "", "voices": [ { "label": "Alloy", "value": "alloy", "bufferId": "openai-Alloy" }, { "label": "Echo", "value": "echo", "bufferId": "openai-Echo" }, diff --git a/projects/app/src/components/ChatBox/MessageInput.tsx b/projects/app/src/components/ChatBox/MessageInput.tsx index a4053d47c..5f33e6c7c 100644 --- a/projects/app/src/components/ChatBox/MessageInput.tsx +++ b/projects/app/src/components/ChatBox/MessageInput.tsx @@ -286,7 +286,7 @@ ${images.map((img) => JSON.stringify({ src: img.src })).join('\n')} transform={'translateY(1px)'} onClick={() => { if (isSpeaking) return; - onOpenSelectFile; + onOpenSelectFile(); }} > diff --git a/projects/app/src/components/Layout/navbar.tsx b/projects/app/src/components/Layout/navbar.tsx index 3d0f61247..69792037c 100644 --- a/projects/app/src/components/Layout/navbar.tsx +++ b/projects/app/src/components/Layout/navbar.tsx @@ -174,7 +174,7 @@ const Navbar = ({ unread }: { unread: number }) => { )} - {feConfigs?.show_doc && ( + {feConfigs?.docUrl && ( { const ref = useRef(null); - const SelectRef = useRef(null); const menuItemStyles = { borderRadius: 'sm', py: 2, @@ -40,13 +39,6 @@ const MySelect = ( const { isOpen, onOpen, onClose } = useDisclosure(); const selectItem = useMemo(() => list.find((item) => item.value === value), [list, value]); - useOutsideClick({ - ref: SelectRef, - handler: () => { - onClose(); - } - }); - return ( - {/* { - isOpen ? onClose() : onOpen(); - }} - > */} {t('app.AI Advanced Settings')} - {feConfigs?.show_doc && ( + {feConfigs?.docUrl && ( { )} - {feConfigs?.show_doc && ( + {feConfigs?.docUrl && ( <> { try { pushAudioSpeechBill({ diff --git a/projects/app/src/pages/api/system/getInitData.ts b/projects/app/src/pages/api/system/getInitData.ts index 83c818e8f..d2fab6b9e 100644 --- a/projects/app/src/pages/api/system/getInitData.ts +++ b/projects/app/src/pages/api/system/getInitData.ts @@ -49,9 +49,8 @@ const defaultFeConfigs: FeConfigsType = { show_emptyChat: true, show_contact: true, show_git: true, - show_doc: true, - docUrl: 'https://docs.fastgpt.run', - openAPIDocUrl: 'https://doc.fastgpt.run/docs/development/openapi', + docUrl: 'https://docs.fastgpt.in', + openAPIDocUrl: 'https://doc.fastgpt.in/docs/development/openapi', systemTitle: 'FastGPT', authorText: 'Made by FastGPT Team.', limit: { diff --git a/projects/app/src/pages/app/detail/components/OutLink/Share.tsx b/projects/app/src/pages/app/detail/components/OutLink/Share.tsx index 7a54a8265..bef0a89ba 100644 --- a/projects/app/src/pages/app/detail/components/OutLink/Share.tsx +++ b/projects/app/src/pages/app/detail/components/OutLink/Share.tsx @@ -353,7 +353,7 @@ function EditLinkModal({ /> { } ] : []), - ...(feConfigs?.show_doc + ...(feConfigs?.docUrl ? [ { label: t('home.Docs'), diff --git a/projects/app/src/pages/login/components/LoginForm.tsx b/projects/app/src/pages/login/components/LoginForm.tsx index 0ce422b79..10395b763 100644 --- a/projects/app/src/pages/login/components/LoginForm.tsx +++ b/projects/app/src/pages/login/components/LoginForm.tsx @@ -141,7 +141,7 @@ const LoginForm = ({ setPageType, loginSuccess }: Props) => { 注册账号 - {feConfigs?.show_doc && ( + {feConfigs?.docUrl && ( 使用即代表你同意我们的{' '} { } ] : []), - ...(feConfigs?.show_doc + ...(feConfigs?.docUrl ? [ { icon: 'courseLight', diff --git a/projects/app/src/service/moduleDispatch/chat/oneapi.ts b/projects/app/src/service/moduleDispatch/chat/oneapi.ts index 5b358d769..2dfc910fd 100644 --- a/projects/app/src/service/moduleDispatch/chat/oneapi.ts +++ b/projects/app/src/service/moduleDispatch/chat/oneapi.ts @@ -128,7 +128,7 @@ export const dispatchChatCompletion = async (props: ChatProps): Promise void ) => POST('/common/file/upload', data, { - timeout: 60000, + timeout: 48000, onUploadProgress, headers: { 'Content-Type': 'multipart/form-data; charset=utf-8'