| @@ -1,117 +0,0 @@ | |||
| # Logs | |||
| logs | |||
| *.log | |||
| npm-debug.log* | |||
| yarn-debug.log* | |||
| yarn-error.log* | |||
| lerna-debug.log* | |||
| # Diagnostic reports (https://nodejs.org/api/report.html) | |||
| report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json | |||
| # Runtime data | |||
| pids | |||
| *.pid | |||
| *.seed | |||
| *.pid.lock | |||
| # Directory for instrumented libs generated by jscoverage/JSCover | |||
| lib-cov | |||
| # Coverage directory used by tools like istanbul | |||
| coverage | |||
| *.lcov | |||
| # nyc test coverage | |||
| .nyc_output | |||
| # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) | |||
| .grunt | |||
| # Bower dependency directory (https://bower.io/) | |||
| bower_components | |||
| # node-waf configuration | |||
| .lock-wscript | |||
| # Compiled binary addons (https://nodejs.org/api/addons.html) | |||
| build/Release | |||
| # Dependency directories | |||
| node_modules/ | |||
| jspm_packages/ | |||
| # TypeScript v1 declaration files | |||
| typings/ | |||
| # TypeScript cache | |||
| *.tsbuildinfo | |||
| # Optional npm cache directory | |||
| .npm | |||
| # Optional eslint cache | |||
| .eslintcache | |||
| # Microbundle cache | |||
| .rpt2_cache/ | |||
| .rts2_cache_cjs/ | |||
| .rts2_cache_es/ | |||
| .rts2_cache_umd/ | |||
| # Optional REPL history | |||
| .node_repl_history | |||
| # Output of 'npm pack' | |||
| *.tgz | |||
| # Yarn Integrity file | |||
| .yarn-integrity | |||
| # dotenv environment variables file | |||
| .env | |||
| .env.test | |||
| # parcel-bundler cache (https://parceljs.org/) | |||
| .cache | |||
| # Next.js build output | |||
| .next | |||
| # Nuxt.js build / generate output | |||
| .nuxt | |||
| dist | |||
| # Gatsby files | |||
| .cache/ | |||
| # Comment in the public line in if your project uses Gatsby and *not* Next.js | |||
| # https://nextjs.org/blog/next-9-1#public-directory-support | |||
| # public | |||
| # vuepress build output | |||
| .vuepress/dist | |||
| # Serverless directories | |||
| .serverless/ | |||
| # FuseBox cache | |||
| .fusebox/ | |||
| # DynamoDB Local files | |||
| .dynamodb/ | |||
| # TernJS port file | |||
| .tern-port | |||
| # npm | |||
| package-lock.json | |||
| # yarn | |||
| .pnp.cjs | |||
| .pnp.loader.mjs | |||
| .yarn/ | |||
| yarn.lock | |||
| .yarnrc.yml | |||
| # pmpm | |||
| pnpm-lock.yaml | |||
| @@ -1 +0,0 @@ | |||
| # Mock Server | |||
| @@ -1,551 +0,0 @@ | |||
| const chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_' | |||
| function randomString (length) { | |||
| let result = '' | |||
| for (let i = length; i > 0; --i) result += chars[Math.floor(Math.random() * chars.length)] | |||
| return result | |||
| } | |||
| // https://www.notion.so/55773516a0194781ae211792a44a3663?pvs=4 | |||
| const VirtualData = new Array(10).fill().map((_, index) => { | |||
| const date = new Date(Date.now() - index * 24 * 60 * 60 * 1000) | |||
| return { | |||
| date: `${date.getFullYear()}-${date.getMonth()}-${date.getDate()}`, | |||
| conversation_count: Math.floor(Math.random() * 10) + index, | |||
| terminal_count: Math.floor(Math.random() * 10) + index, | |||
| token_count: Math.floor(Math.random() * 10) + index, | |||
| total_price: Math.floor(Math.random() * 10) + index, | |||
| } | |||
| }) | |||
| const registerAPI = function (app) { | |||
| const apps = [{ | |||
| id: '1', | |||
| name: 'chat app', | |||
| mode: 'chat', | |||
| description: 'description01', | |||
| enable_site: true, | |||
| enable_api: true, | |||
| api_rpm: 60, | |||
| api_rph: 3600, | |||
| is_demo: false, | |||
| model_config: { | |||
| provider: 'OPENAI', | |||
| model_id: 'gpt-3.5-turbo', | |||
| configs: { | |||
| prompt_template: '你是我的解梦小助手,请参考 {{book}} 回答我有关梦境的问题。在回答前请称呼我为 {{myName}}。', | |||
| prompt_variables: [ | |||
| { | |||
| key: 'book', | |||
| name: '书', | |||
| value: '《梦境解析》', | |||
| type: 'string', | |||
| description: '请具体说下书名' | |||
| }, | |||
| { | |||
| key: 'myName', | |||
| name: 'your name', | |||
| value: 'Book', | |||
| type: 'string', | |||
| description: 'please tell me your name' | |||
| } | |||
| ], | |||
| completion_params: { | |||
| max_token: 16, | |||
| temperature: 1, // 0-2 | |||
| top_p: 1, | |||
| presence_penalty: 1, // -2-2 | |||
| frequency_penalty: 1, // -2-2 | |||
| } | |||
| } | |||
| }, | |||
| site: { | |||
| access_token: '1000', | |||
| title: 'site 01', | |||
| author: 'John', | |||
| default_language: 'zh-Hans-CN', | |||
| customize_domain: 'http://customize_domain', | |||
| theme: 'theme', | |||
| customize_token_strategy: 'must', | |||
| prompt_public: true | |||
| } | |||
| }, | |||
| { | |||
| id: '2', | |||
| name: 'completion app', | |||
| mode: 'completion', // genertation text | |||
| description: 'description 02', // genertation text | |||
| enable_site: false, | |||
| enable_api: false, | |||
| api_rpm: 60, | |||
| api_rph: 3600, | |||
| is_demo: false, | |||
| model_config: { | |||
| provider: 'OPENAI', | |||
| model_id: 'text-davinci-003', | |||
| configs: { | |||
| prompt_template: '你是我的翻译小助手,请把以下内容 {{langA}} 翻译成 {{langB}},以下的内容:', | |||
| prompt_variables: [ | |||
| { | |||
| key: 'langA', | |||
| name: '原始语音', | |||
| value: '中文', | |||
| type: 'string', | |||
| description: '这是中文格式的原始语音' | |||
| }, | |||
| { | |||
| key: 'langB', | |||
| name: '目标语言', | |||
| value: '英语', | |||
| type: 'string', | |||
| description: '这是英语格式的目标语言' | |||
| } | |||
| ], | |||
| completion_params: { | |||
| max_token: 16, | |||
| temperature: 1, // 0-2 | |||
| top_p: 1, | |||
| presence_penalty: 1, // -2-2 | |||
| frequency_penalty: 1, // -2-2 | |||
| } | |||
| } | |||
| }, | |||
| site: { | |||
| access_token: '2000', | |||
| title: 'site 02', | |||
| author: 'Mark', | |||
| default_language: 'en-US', | |||
| customize_domain: 'http://customize_domain', | |||
| theme: 'theme', | |||
| customize_token_strategy: 'must', | |||
| prompt_public: false | |||
| } | |||
| }, | |||
| ] | |||
| const apikeys = [{ | |||
| id: '111121312313132', | |||
| token: 'sk-DEFGHJKMNPQRSTWXYZabcdefhijk1234', | |||
| last_used_at: '1679212138000', | |||
| created_at: '1673316000000' | |||
| }, { | |||
| id: '43441242131223123', | |||
| token: 'sk-EEFGHJKMNPQRSTWXYZabcdefhijk5678', | |||
| last_used_at: '1679212721000', | |||
| created_at: '1679212731000' | |||
| }] | |||
| // create app | |||
| app.post('/apps', async (req, res) => { | |||
| apps.push({ | |||
| id: apps.length + 1 + '', | |||
| ...req.body, | |||
| }) | |||
| res.send({ | |||
| result: 'success' | |||
| }) | |||
| }) | |||
| // app list | |||
| app.get('/apps', async (req, res) => { | |||
| res.send({ | |||
| data: apps | |||
| }) | |||
| }) | |||
| // app detail | |||
| app.get('/apps/:id', async (req, res) => { | |||
| const item = apps.find(item => item.id === req.params.id) || apps[0] | |||
| res.send(item) | |||
| }) | |||
| // update app name | |||
| app.post('/apps/:id/name', async (req, res) => { | |||
| const item = apps.find(item => item.id === req.params.id) | |||
| item.name = req.body.name | |||
| res.send(item || null) | |||
| }) | |||
| // update app site-enable status | |||
| app.post('/apps/:id/site-enable', async (req, res) => { | |||
| const item = apps.find(item => item.id === req.params.id) | |||
| console.log(item) | |||
| item.enable_site = req.body.enable_site | |||
| res.send(item || null) | |||
| }) | |||
| // update app api-enable status | |||
| app.post('/apps/:id/api-enable', async (req, res) => { | |||
| const item = apps.find(item => item.id === req.params.id) | |||
| console.log(item) | |||
| item.enable_api = req.body.enable_api | |||
| res.send(item || null) | |||
| }) | |||
| // update app rate-limit | |||
| app.post('/apps/:id/rate-limit', async (req, res) => { | |||
| const item = apps.find(item => item.id === req.params.id) | |||
| console.log(item) | |||
| item.api_rpm = req.body.api_rpm | |||
| item.api_rph = req.body.api_rph | |||
| res.send(item || null) | |||
| }) | |||
| // update app url including code | |||
| app.post('/apps/:id/site/access-token-reset', async (req, res) => { | |||
| const item = apps.find(item => item.id === req.params.id) | |||
| console.log(item) | |||
| item.site.access_token = randomString(12) | |||
| res.send(item || null) | |||
| }) | |||
| // update app config | |||
| app.post('/apps/:id/site', async (req, res) => { | |||
| const item = apps.find(item => item.id === req.params.id) | |||
| console.log(item) | |||
| item.name = req.body.title | |||
| item.description = req.body.description | |||
| item.prompt_public = req.body.prompt_public | |||
| item.default_language = req.body.default_language | |||
| res.send(item || null) | |||
| }) | |||
| // get statistics daily-conversations | |||
| app.get('/apps/:id/statistics/daily-conversations', async (req, res) => { | |||
| const item = apps.find(item => item.id === req.params.id) | |||
| if (item) { | |||
| res.send({ | |||
| data: VirtualData | |||
| }) | |||
| } else { | |||
| res.send({ | |||
| data: [] | |||
| }) | |||
| } | |||
| }) | |||
| // get statistics daily-end-users | |||
| app.get('/apps/:id/statistics/daily-end-users', async (req, res) => { | |||
| const item = apps.find(item => item.id === req.params.id) | |||
| if (item) { | |||
| res.send({ | |||
| data: VirtualData | |||
| }) | |||
| } else { | |||
| res.send({ | |||
| data: [] | |||
| }) | |||
| } | |||
| }) | |||
| // get statistics token-costs | |||
| app.get('/apps/:id/statistics/token-costs', async (req, res) => { | |||
| const item = apps.find(item => item.id === req.params.id) | |||
| if (item) { | |||
| res.send({ | |||
| data: VirtualData | |||
| }) | |||
| } else { | |||
| res.send({ | |||
| data: [] | |||
| }) | |||
| } | |||
| }) | |||
| // update app model config | |||
| app.post('/apps/:id/model-config', async (req, res) => { | |||
| const item = apps.find(item => item.id === req.params.id) | |||
| console.log(item) | |||
| item.model_config = req.body | |||
| res.send(item || null) | |||
| }) | |||
| // get api keys list | |||
| app.get('/apps/:id/api-keys', async (req, res) => { | |||
| res.send({ | |||
| data: apikeys | |||
| }) | |||
| }) | |||
| // del api key | |||
| app.delete('/apps/:id/api-keys/:api_key_id', async (req, res) => { | |||
| res.send({ | |||
| result: 'success' | |||
| }) | |||
| }) | |||
| // create api key | |||
| app.post('/apps/:id/api-keys', async (req, res) => { | |||
| res.send({ | |||
| id: 'e2424241313131', | |||
| token: 'sk-GEFGHJKMNPQRSTWXYZabcdefhijk0124', | |||
| created_at: '1679216688962' | |||
| }) | |||
| }) | |||
| // get completion-conversations | |||
| app.get('/apps/:id/completion-conversations', async (req, res) => { | |||
| const data = { | |||
| data: [{ | |||
| id: 1, | |||
| from_end_user_id: 'user 1', | |||
| summary: 'summary1', | |||
| created_at: '2023-10-11', | |||
| annotated: true, | |||
| message_count: 100, | |||
| user_feedback_stats: { | |||
| like: 4, dislike: 5 | |||
| }, | |||
| admin_feedback_stats: { | |||
| like: 1, dislike: 2 | |||
| }, | |||
| message: { | |||
| message: 'message1', | |||
| query: 'question1', | |||
| answer: 'answer1' | |||
| } | |||
| }, { | |||
| id: 12, | |||
| from_end_user_id: 'user 2', | |||
| summary: 'summary2', | |||
| created_at: '2023-10-01', | |||
| annotated: false, | |||
| message_count: 10, | |||
| user_feedback_stats: { | |||
| like: 2, dislike: 20 | |||
| }, | |||
| admin_feedback_stats: { | |||
| like: 12, dislike: 21 | |||
| }, | |||
| message: { | |||
| message: 'message2', | |||
| query: 'question2', | |||
| answer: 'answer2' | |||
| } | |||
| }, { | |||
| id: 13, | |||
| from_end_user_id: 'user 3', | |||
| summary: 'summary3', | |||
| created_at: '2023-10-11', | |||
| annotated: false, | |||
| message_count: 20, | |||
| user_feedback_stats: { | |||
| like: 2, dislike: 0 | |||
| }, | |||
| admin_feedback_stats: { | |||
| like: 0, dislike: 21 | |||
| }, | |||
| message: { | |||
| message: 'message3', | |||
| query: 'question3', | |||
| answer: 'answer3' | |||
| } | |||
| }], | |||
| total: 200 | |||
| } | |||
| res.send(data) | |||
| }) | |||
| // get chat-conversations | |||
| app.get('/apps/:id/chat-conversations', async (req, res) => { | |||
| const data = { | |||
| data: [{ | |||
| id: 1, | |||
| from_end_user_id: 'user 1', | |||
| summary: 'summary1', | |||
| created_at: '2023-10-11', | |||
| read_at: '2023-10-12', | |||
| annotated: true, | |||
| message_count: 100, | |||
| user_feedback_stats: { | |||
| like: 4, dislike: 5 | |||
| }, | |||
| admin_feedback_stats: { | |||
| like: 1, dislike: 2 | |||
| }, | |||
| message: { | |||
| message: 'message1', | |||
| query: 'question1', | |||
| answer: 'answer1' | |||
| } | |||
| }, { | |||
| id: 12, | |||
| from_end_user_id: 'user 2', | |||
| summary: 'summary2', | |||
| created_at: '2023-10-01', | |||
| annotated: false, | |||
| message_count: 10, | |||
| user_feedback_stats: { | |||
| like: 2, dislike: 20 | |||
| }, | |||
| admin_feedback_stats: { | |||
| like: 12, dislike: 21 | |||
| }, | |||
| message: { | |||
| message: 'message2', | |||
| query: 'question2', | |||
| answer: 'answer2' | |||
| } | |||
| }, { | |||
| id: 13, | |||
| from_end_user_id: 'user 3', | |||
| summary: 'summary3', | |||
| created_at: '2023-10-11', | |||
| annotated: false, | |||
| message_count: 20, | |||
| user_feedback_stats: { | |||
| like: 2, dislike: 0 | |||
| }, | |||
| admin_feedback_stats: { | |||
| like: 0, dislike: 21 | |||
| }, | |||
| message: { | |||
| message: 'message3', | |||
| query: 'question3', | |||
| answer: 'answer3' | |||
| } | |||
| }], | |||
| total: 200 | |||
| } | |||
| res.send(data) | |||
| }) | |||
| // get completion-conversation detail | |||
| app.get('/apps/:id/completion-conversations/:cid', async (req, res) => { | |||
| const data = | |||
| { | |||
| id: 1, | |||
| from_end_user_id: 'user 1', | |||
| summary: 'summary1', | |||
| created_at: '2023-10-11', | |||
| annotated: true, | |||
| message: { | |||
| message: 'question1', | |||
| // query: 'question1', | |||
| answer: 'answer1', | |||
| annotation: { | |||
| content: '这是一段纠正的内容' | |||
| } | |||
| }, | |||
| model_config: { | |||
| provider: 'openai', | |||
| model_id: 'model_id', | |||
| configs: { | |||
| prompt_template: '你是我的翻译小助手,请把以下内容 {{langA}} 翻译成 {{langB}},以下的内容:{{content}}' | |||
| } | |||
| } | |||
| } | |||
| res.send(data) | |||
| }) | |||
| // get chat-conversation detail | |||
| app.get('/apps/:id/chat-conversations/:cid', async (req, res) => { | |||
| const data = | |||
| { | |||
| id: 1, | |||
| from_end_user_id: 'user 1', | |||
| summary: 'summary1', | |||
| created_at: '2023-10-11', | |||
| annotated: true, | |||
| message: { | |||
| message: 'question1', | |||
| // query: 'question1', | |||
| answer: 'answer1', | |||
| created_at: '2023-08-09 13:00', | |||
| provider_response_latency: 130, | |||
| message_tokens: 230 | |||
| }, | |||
| model_config: { | |||
| provider: 'openai', | |||
| model_id: 'model_id', | |||
| configs: { | |||
| prompt_template: '你是我的翻译小助手,请把以下内容 {{langA}} 翻译成 {{langB}},以下的内容:{{content}}' | |||
| } | |||
| } | |||
| } | |||
| res.send(data) | |||
| }) | |||
| // get chat-conversation message list | |||
| app.get('/apps/:id/chat-messages', async (req, res) => { | |||
| const data = { | |||
| data: [{ | |||
| id: 1, | |||
| created_at: '2023-10-11 07:09', | |||
| message: '请说说人为什么会做梦?' + req.query.conversation_id, | |||
| answer: '梦境通常是个人内心深处的反映,很难确定每个人梦境的确切含义,因为它们可能会受到梦境者的文化背景、生活经验和情感状态等多种因素的影响。', | |||
| provider_response_latency: 450, | |||
| answer_tokens: 200, | |||
| annotation: { | |||
| content: 'string', | |||
| account: { | |||
| id: 'string', | |||
| name: 'string', | |||
| email: 'string' | |||
| } | |||
| }, | |||
| feedbacks: { | |||
| rating: 'like', | |||
| content: 'string', | |||
| from_source: 'log' | |||
| } | |||
| }, { | |||
| id: 2, | |||
| created_at: '2023-10-11 8:23', | |||
| message: '夜里经常做梦会影响次日的精神状态吗?', | |||
| answer: '总之,这个梦境可能与梦境者的个人经历和情感状态有关,但在一般情况下,它可能表示一种强烈的情感反应,包括愤怒、不满和对于正义和自由的渴望。', | |||
| provider_response_latency: 400, | |||
| answer_tokens: 250, | |||
| annotation: { | |||
| content: 'string', | |||
| account: { | |||
| id: 'string', | |||
| name: 'string', | |||
| email: 'string' | |||
| } | |||
| }, | |||
| // feedbacks: { | |||
| // rating: 'like', | |||
| // content: 'string', | |||
| // from_source: 'log' | |||
| // } | |||
| }, { | |||
| id: 3, | |||
| created_at: '2023-10-11 10:20', | |||
| message: '梦见在山上手撕鬼子,大师解解梦', | |||
| answer: '但是,一般来说,“手撕鬼子”这个场景可能是梦境者对于过去历史上的战争、侵略以及对于自己国家和族群的保护与维护的情感反应。在梦中,你可能会感到自己充满力量和勇气,去对抗那些看似强大的侵略者。', | |||
| provider_response_latency: 288, | |||
| answer_tokens: 100, | |||
| annotation: { | |||
| content: 'string', | |||
| account: { | |||
| id: 'string', | |||
| name: 'string', | |||
| email: 'string' | |||
| } | |||
| }, | |||
| feedbacks: { | |||
| rating: 'dislike', | |||
| content: 'string', | |||
| from_source: 'log' | |||
| } | |||
| }], | |||
| limit: 20, | |||
| has_more: true | |||
| } | |||
| res.send(data) | |||
| }) | |||
| app.post('/apps/:id/annotations', async (req, res) => { | |||
| res.send({ result: 'success' }) | |||
| }) | |||
| app.post('/apps/:id/feedbacks', async (req, res) => { | |||
| res.send({ result: 'success' }) | |||
| }) | |||
| } | |||
| module.exports = registerAPI | |||
| @@ -1,38 +0,0 @@ | |||
| const registerAPI = function (app) { | |||
| app.post('/login', async (req, res) => { | |||
| res.send({ | |||
| result: 'success' | |||
| }) | |||
| }) | |||
| // get user info | |||
| app.get('/account/profile', async (req, res) => { | |||
| res.send({ | |||
| id: '11122222', | |||
| name: 'Joel', | |||
| email: 'iamjoel007@gmail.com' | |||
| }) | |||
| }) | |||
| // logout | |||
| app.get('/logout', async (req, res) => { | |||
| res.send({ | |||
| result: 'success' | |||
| }) | |||
| }) | |||
| // Langgenius version | |||
| app.get('/version', async (req, res) => { | |||
| res.send({ | |||
| current_version: 'v1.0.0', | |||
| latest_version: 'v1.0.0', | |||
| upgradeable: true, | |||
| compatible_upgrade: true | |||
| }) | |||
| }) | |||
| } | |||
| module.exports = registerAPI | |||
| @@ -1,249 +0,0 @@ | |||
| const registerAPI = function (app) { | |||
| app.get("/datasets/:id/documents", async (req, res) => { | |||
| if (req.params.id === "0") res.send({ data: [] }); | |||
| else { | |||
| res.send({ | |||
| data: [ | |||
| { | |||
| id: 1, | |||
| name: "Steve Jobs' life", | |||
| words: "70k", | |||
| word_count: 100, | |||
| updated_at: 1681801029, | |||
| indexing_status: "completed", | |||
| archived: true, | |||
| enabled: false, | |||
| data_source_info: { | |||
| upload_file: { | |||
| // id: string | |||
| // name: string | |||
| // size: number | |||
| // mime_type: string | |||
| // created_at: number | |||
| // created_by: string | |||
| extension: "pdf", | |||
| }, | |||
| }, | |||
| }, | |||
| { | |||
| id: 2, | |||
| name: "Steve Jobs' life", | |||
| word_count: "10k", | |||
| hit_count: 10, | |||
| updated_at: 1681801029, | |||
| indexing_status: "waiting", | |||
| archived: true, | |||
| enabled: false, | |||
| data_source_info: { | |||
| upload_file: { | |||
| extension: "json", | |||
| }, | |||
| }, | |||
| }, | |||
| { | |||
| id: 3, | |||
| name: "Steve Jobs' life xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", | |||
| word_count: "100k", | |||
| hit_count: 0, | |||
| updated_at: 1681801029, | |||
| indexing_status: "indexing", | |||
| archived: false, | |||
| enabled: true, | |||
| data_source_info: { | |||
| upload_file: { | |||
| extension: "txt", | |||
| }, | |||
| }, | |||
| }, | |||
| { | |||
| id: 4, | |||
| name: "Steve Jobs' life xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", | |||
| word_count: "100k", | |||
| hit_count: 0, | |||
| updated_at: 1681801029, | |||
| indexing_status: "splitting", | |||
| archived: false, | |||
| enabled: true, | |||
| data_source_info: { | |||
| upload_file: { | |||
| extension: "md", | |||
| }, | |||
| }, | |||
| }, | |||
| { | |||
| id: 5, | |||
| name: "Steve Jobs' life", | |||
| word_count: "100k", | |||
| hit_count: 0, | |||
| updated_at: 1681801029, | |||
| indexing_status: "error", | |||
| archived: false, | |||
| enabled: false, | |||
| data_source_info: { | |||
| upload_file: { | |||
| extension: "html", | |||
| }, | |||
| }, | |||
| }, | |||
| ], | |||
| total: 100, | |||
| id: req.params.id, | |||
| }); | |||
| } | |||
| }); | |||
| app.get("/datasets/:id/documents/:did/segments", async (req, res) => { | |||
| if (req.params.id === "0") res.send({ data: [] }); | |||
| else { | |||
| res.send({ | |||
| data: new Array(100).fill({ | |||
| id: 1234, | |||
| content: `他的坚持让我很为难。众所周知他非常注意保护自己的隐私,而我想他应该从来没有看过我写的书。也许将来的某个时候吧,我还是这么说。但是,到了2009年,他的妻子劳伦·鲍威尔(Laurene Powell)直言不讳地对我说:“如果你真的打算写一本关于史蒂夫的书,最好现在就开始。”他当时刚刚第二次因病休假。我向劳伦坦承,当乔布斯第一次提出这个想法时,我并不知道他病了。几乎没有人知道,她说。他是在接受癌症手术之前给我打的电话,直到今天他还将此事作为一个秘密,她这么解释道。\n | |||
| 他的坚持让我很为难。众所周知他非常注意保护自己的隐私,而我想他应该从来没有看过我写的书。也许将来的某个时候吧,我还是这么说。但是,到了2009年,他的妻子劳伦·鲍威尔(Laurene Powell)直言不讳地对我说:“如果你真的打算写一本关于史蒂夫的书,最好现在就开始。”他当时刚刚第二次因病休假。我向劳伦坦承,当乔布斯第一次提出这个想法时,我并不知道他病了。几乎没有人知道,她说。他是在接受癌症手术之前给我打的电话,直到今天他还将此事作为一个秘密,她这么解释道。`, | |||
| enabled: true, | |||
| keyWords: [ | |||
| "劳伦·鲍威尔", | |||
| "劳伦·鲍威尔", | |||
| "手术", | |||
| "秘密", | |||
| "癌症", | |||
| "乔布斯", | |||
| "史蒂夫", | |||
| "书", | |||
| "休假", | |||
| "坚持", | |||
| "隐私", | |||
| ], | |||
| word_count: 120, | |||
| hit_count: 100, | |||
| status: "ok", | |||
| index_node_hash: "index_node_hash value", | |||
| }), | |||
| limit: 100, | |||
| has_more: true, | |||
| }); | |||
| } | |||
| }); | |||
| // get doc detail | |||
| app.get("/datasets/:id/documents/:did", async (req, res) => { | |||
| const fixedParams = { | |||
| // originInfo: { | |||
| originalFilename: "Original filename", | |||
| originalFileSize: "16mb", | |||
| uploadDate: "2023-01-01", | |||
| lastUpdateDate: "2023-01-05", | |||
| source: "Source", | |||
| // }, | |||
| // technicalParameters: { | |||
| segmentSpecification: "909090", | |||
| segmentLength: 100, | |||
| avgParagraphLength: 130, | |||
| }; | |||
| const bookData = { | |||
| doc_type: "book", | |||
| doc_metadata: { | |||
| title: "机器学习实战", | |||
| language: "zh", | |||
| author: "Peter Harrington", | |||
| publisher: "人民邮电出版社", | |||
| publicationDate: "2013-01-01", | |||
| ISBN: "9787115335500", | |||
| category: "技术", | |||
| }, | |||
| }; | |||
| const webData = { | |||
| doc_type: "webPage", | |||
| doc_metadata: { | |||
| title: "深度学习入门教程", | |||
| url: "https://www.example.com/deep-learning-tutorial", | |||
| language: "zh", | |||
| publishDate: "2020-05-01", | |||
| authorPublisher: "张三", | |||
| topicsKeywords: "深度学习, 人工智能, 教程", | |||
| description: | |||
| "这是一篇详细的深度学习入门教程,适用于对人工智能和深度学习感兴趣的初学者。", | |||
| }, | |||
| }; | |||
| const postData = { | |||
| doc_type: "socialMediaPost", | |||
| doc_metadata: { | |||
| platform: "Twitter", | |||
| authorUsername: "example_user", | |||
| publishDate: "2021-08-15", | |||
| postURL: "https://twitter.com/example_user/status/1234567890", | |||
| topicsTags: | |||
| "AI, DeepLearning, Tutorial, Example, Example2, Example3, AI, DeepLearning, Tutorial, Example, Example2, Example3, AI, DeepLearning, Tutorial, Example, Example2, Example3,", | |||
| }, | |||
| }; | |||
| res.send({ | |||
| id: "550e8400-e29b-41d4-a716-446655440000", | |||
| position: 1, | |||
| dataset_id: "550e8400-e29b-41d4-a716-446655440002", | |||
| data_source_type: "upload_file", | |||
| data_source_info: { | |||
| upload_file: { | |||
| extension: "html", | |||
| id: "550e8400-e29b-41d4-a716-446655440003", | |||
| }, | |||
| }, | |||
| dataset_process_rule_id: "550e8400-e29b-41d4-a716-446655440004", | |||
| batch: "20230410123456123456", | |||
| name: "example_document", | |||
| created_from: "web", | |||
| created_by: "550e8400-e29b-41d4-a716-446655440005", | |||
| created_api_request_id: "550e8400-e29b-41d4-a716-446655440006", | |||
| created_at: 1671269696, | |||
| processing_started_at: 1671269700, | |||
| word_count: 11, | |||
| parsing_completed_at: 1671269710, | |||
| cleaning_completed_at: 1671269720, | |||
| splitting_completed_at: 1671269730, | |||
| tokens: 10, | |||
| indexing_latency: 5.0, | |||
| completed_at: 1671269740, | |||
| paused_by: null, | |||
| paused_at: null, | |||
| error: null, | |||
| stopped_at: null, | |||
| indexing_status: "completed", | |||
| enabled: true, | |||
| disabled_at: null, | |||
| disabled_by: null, | |||
| archived: false, | |||
| archived_reason: null, | |||
| archived_by: null, | |||
| archived_at: null, | |||
| updated_at: 1671269740, | |||
| ...(req.params.did === "book" | |||
| ? bookData | |||
| : req.params.did === "web" | |||
| ? webData | |||
| : req.params.did === "post" | |||
| ? postData | |||
| : {}), | |||
| segment_count: 10, | |||
| hit_count: 9, | |||
| status: "ok", | |||
| }); | |||
| }); | |||
| // // logout | |||
| // app.get("/logout", async (req, res) => { | |||
| // res.send({ | |||
| // result: "success", | |||
| // }); | |||
| // }); | |||
| // // Langgenius version | |||
| // app.get("/version", async (req, res) => { | |||
| // res.send({ | |||
| // current_version: "v1.0.0", | |||
| // latest_version: "v1.0.0", | |||
| // upgradeable: true, | |||
| // compatible_upgrade: true, | |||
| // }); | |||
| // }); | |||
| }; | |||
| module.exports = registerAPI; | |||
| @@ -1,119 +0,0 @@ | |||
| const registerAPI = function (app) { | |||
| const coversationList = [ | |||
| { | |||
| id: '1', | |||
| name: '梦的解析', | |||
| inputs: { | |||
| book: '《梦的解析》', | |||
| callMe: '大师', | |||
| }, | |||
| chats: [] | |||
| }, | |||
| { | |||
| id: '2', | |||
| name: '生命的起源', | |||
| inputs: { | |||
| book: '《x x x》', | |||
| } | |||
| }, | |||
| ] | |||
| // site info | |||
| app.get('/apps/site/info', async (req, res) => { | |||
| // const id = req.params.id | |||
| res.send({ | |||
| enable_site: true, | |||
| appId: '1', | |||
| site: { | |||
| title: 'Story Bot', | |||
| description: '这是一款解梦聊天机器人,你可以选择你喜欢的解梦人进行解梦,这句话是客户端应用说明', | |||
| }, | |||
| prompt_public: true, //id === '1', | |||
| prompt_template: '你是我的解梦小助手,请参考 {{book}} 回答我有关梦境的问题。在回答前请称呼我为 {{myName}}。', | |||
| }) | |||
| }) | |||
| app.post('/apps/:id/chat-messages', async (req, res) => { | |||
| const conversationId = req.body.conversation_id ? req.body.conversation_id : Date.now() + '' | |||
| res.send({ | |||
| id: Date.now() + '', | |||
| conversation_id: Date.now() + '', | |||
| answer: 'balabababab' | |||
| }) | |||
| }) | |||
| app.post('/apps/:id/completion-messages', async (req, res) => { | |||
| res.send({ | |||
| id: Date.now() + '', | |||
| answer: `做为一个AI助手,我可以为你提供随机生成的段落,这些段落可以用于测试、占位符、或者其他目的。以下是一个随机生成的段落: | |||
| “随着科技的不断发展,越来越多的人开始意识到人工智能的重要性。人工智能已经成为我们生活中不可或缺的一部分,它可以帮助我们完成很多繁琐的工作,也可以为我们提供更智能、更便捷的服务。虽然人工智能带来了很多好处,但它也面临着很多挑战。例如,人工智能的算法可能会出现偏见,导致对某些人群不公平。此外,人工智能的发展也可能会导致一些工作的失业。因此,我们需要不断地研究人工智能的发展,以确保它能够为人类带来更多的好处。”` | |||
| }) | |||
| }) | |||
| // share api | |||
| // chat list | |||
| app.get('/apps/:id/coversations', async (req, res) => { | |||
| res.send({ | |||
| data: coversationList | |||
| }) | |||
| }) | |||
| app.get('/apps/:id/variables', async (req, res) => { | |||
| res.send({ | |||
| variables: [ | |||
| { | |||
| key: 'book', | |||
| name: '书', | |||
| value: '《梦境解析》', | |||
| type: 'string' | |||
| }, | |||
| { | |||
| key: 'myName', | |||
| name: '称呼', | |||
| value: '', | |||
| type: 'string' | |||
| } | |||
| ], | |||
| }) | |||
| }) | |||
| } | |||
| module.exports = registerAPI | |||
| // const chatList = [ | |||
| // { | |||
| // id: 1, | |||
| // content: 'AI 开场白', | |||
| // isAnswer: true, | |||
| // }, | |||
| // { | |||
| // id: 2, | |||
| // content: '梦见在山上手撕鬼子,大师解解梦', | |||
| // more: { time: '5.6 秒' }, | |||
| // }, | |||
| // { | |||
| // id: 3, | |||
| // content: '梦境通常是个人内心深处的反映,很难确定每个人梦境的确切含义,因为它们可能会受到梦境者的文化背景、生活经验和情感状态等多种因素的影响。', | |||
| // isAnswer: true, | |||
| // more: { time: '99 秒' }, | |||
| // }, | |||
| // { | |||
| // id: 4, | |||
| // content: '梦见在山上手撕鬼子,大师解解梦', | |||
| // more: { time: '5.6 秒' }, | |||
| // }, | |||
| // { | |||
| // id: 5, | |||
| // content: '梦见在山上手撕鬼子,大师解解梦', | |||
| // more: { time: '5.6 秒' }, | |||
| // }, | |||
| // { | |||
| // id: 6, | |||
| // content: '梦见在山上手撕鬼子,大师解解梦', | |||
| // more: { time: '5.6 秒' }, | |||
| // }, | |||
| // ] | |||
| @@ -1,15 +0,0 @@ | |||
| const registerAPI = function (app) { | |||
| app.get('/demo', async (req, res) => { | |||
| res.send({ | |||
| des: 'get res' | |||
| }) | |||
| }) | |||
| app.post('/demo', async (req, res) => { | |||
| res.send({ | |||
| des: 'post res' | |||
| }) | |||
| }) | |||
| } | |||
| module.exports = registerAPI | |||
| @@ -1,42 +0,0 @@ | |||
| const express = require('express') | |||
| const app = express() | |||
| const bodyParser = require('body-parser') | |||
| var cors = require('cors') | |||
| const commonAPI = require('./api/common') | |||
| const demoAPI = require('./api/demo') | |||
| const appsApi = require('./api/apps') | |||
| const debugAPI = require('./api/debug') | |||
| const datasetsAPI = require('./api/datasets') | |||
| const port = 3001 | |||
| app.use(bodyParser.json()) // for parsing application/json | |||
| app.use(bodyParser.urlencoded({ extended: true })) // for parsing application/x-www-form-urlencoded | |||
| const corsOptions = { | |||
| origin: true, | |||
| credentials: true, | |||
| } | |||
| app.use(cors(corsOptions)) // for cross origin | |||
| app.options('*', cors(corsOptions)) // include before other routes | |||
| demoAPI(app) | |||
| commonAPI(app) | |||
| appsApi(app) | |||
| debugAPI(app) | |||
| datasetsAPI(app) | |||
| app.get('/', (req, res) => { | |||
| res.send('rootpath') | |||
| }) | |||
| app.listen(port, () => { | |||
| console.log(`Mock run on port ${port}`) | |||
| }) | |||
| const sleep = (ms) => { | |||
| return new Promise(resolve => setTimeout(resolve, ms)) | |||
| } | |||
| @@ -1,26 +0,0 @@ | |||
| { | |||
| "name": "server", | |||
| "version": "1.0.0", | |||
| "description": "", | |||
| "main": "index.js", | |||
| "scripts": { | |||
| "dev": "nodemon node app.js", | |||
| "start": "node app.js", | |||
| "tcp": "node tcp.js" | |||
| }, | |||
| "keywords": [], | |||
| "author": "", | |||
| "license": "MIT", | |||
| "engines": { | |||
| "node": ">=16.0.0" | |||
| }, | |||
| "dependencies": { | |||
| "body-parser": "^1.20.2", | |||
| "cors": "^2.8.5", | |||
| "express": "4.18.2", | |||
| "express-jwt": "8.4.1" | |||
| }, | |||
| "devDependencies": { | |||
| "nodemon": "2.0.21" | |||
| } | |||
| } | |||
| @@ -1,3 +0,0 @@ | |||
| export async function GET(_request: Request) { | |||
| return new Response('Hello, Next.js!') | |||
| } | |||
| @@ -69,7 +69,7 @@ type IDocumentsProps = { | |||
| datasetId: string | |||
| } | |||
| export const fetcher = (url: string) => get(url, {}, { isMock: true }) | |||
| export const fetcher = (url: string) => get(url, {}, {}) | |||
| const Documents: FC<IDocumentsProps> = ({ datasetId }) => { | |||
| const { t } = useTranslation() | |||
| @@ -31,9 +31,6 @@ if (process.env.NEXT_PUBLIC_API_PREFIX && process.env.NEXT_PUBLIC_PUBLIC_API_PRE | |||
| export const API_PREFIX: string = apiPrefix; | |||
| export const PUBLIC_API_PREFIX: string = publicApiPrefix; | |||
| // mock server | |||
| export const MOCK_API_PREFIX = 'http://127.0.0.1:3001' | |||
| const EDITION = process.env.NEXT_PUBLIC_EDITION || globalThis.document?.body?.getAttribute('data-public-edition') | |||
| export const IS_CE_EDITION = EDITION === 'SELF_HOSTED' | |||
| @@ -1,4 +1,4 @@ | |||
| import { API_PREFIX, MOCK_API_PREFIX, PUBLIC_API_PREFIX, IS_CE_EDITION } from '@/config' | |||
| import { API_PREFIX, PUBLIC_API_PREFIX, IS_CE_EDITION } from '@/config' | |||
| import Toast from '@/app/components/base/toast' | |||
| const TIME_OUT = 100000 | |||
| @@ -33,7 +33,6 @@ export type IOnError = (msg: string) => void | |||
| type IOtherOptions = { | |||
| isPublicAPI?: boolean | |||
| isMock?: boolean | |||
| needAllResponseContent?: boolean | |||
| onData?: IOnData // for stream | |||
| onError?: IOnError | |||
| @@ -116,7 +115,14 @@ const handleStream = (response: any, onData: IOnData, onCompleted?: IOnCompleted | |||
| read() | |||
| } | |||
| const baseFetch = (url: string, fetchOptions: any, { isPublicAPI = false, isMock = false, needAllResponseContent }: IOtherOptions) => { | |||
| const baseFetch = ( | |||
| url: string, | |||
| fetchOptions: any, | |||
| { | |||
| isPublicAPI = false, | |||
| needAllResponseContent | |||
| }: IOtherOptions | |||
| ) => { | |||
| const options = Object.assign({}, baseOptions, fetchOptions) | |||
| if (isPublicAPI) { | |||
| const sharedToken = globalThis.location.pathname.split('/').slice(-1)[0] | |||
| @@ -124,9 +130,6 @@ const baseFetch = (url: string, fetchOptions: any, { isPublicAPI = false, isMock | |||
| } | |||
| let urlPrefix = isPublicAPI ? PUBLIC_API_PREFIX : API_PREFIX | |||
| if (isMock) | |||
| urlPrefix = MOCK_API_PREFIX | |||
| let urlWithPrefix = `${urlPrefix}${url.startsWith('/') ? url : `/${url}`}` | |||
| const { method, params, body } = options | |||