Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
赵月辉
/
fastgpt-migrated
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Unverified
Commit
6c4026cc
authored
Apr 03, 2023
by
archer
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
perf: 文件结构
parent
caf31faf
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
103 additions
and
99 deletions
+103
-99
src/pages/api/chat/chatGpt.ts
+1
-2
src/pages/api/model/del.ts
+2
-1
src/pages/api/model/train/putTrainStatus.ts
+2
-2
src/pages/api/model/train/train.ts
+2
-1
src/pages/api/timer/updateTraining.ts
+1
-2
src/service/events/generateAbstract.ts
+2
-1
src/service/events/generateQA.ts
+2
-1
src/service/utils/chat.ts
+2
-1
src/service/utils/openai.ts
+89
-0
src/service/utils/tools.ts
+0
-88
No files found.
src/pages/api/chat/chatGpt.ts
View file @
6c4026cc
...
@@ -2,7 +2,7 @@ import type { NextApiRequest, NextApiResponse } from 'next';
...
@@ -2,7 +2,7 @@ import type { NextApiRequest, NextApiResponse } from 'next';
import
{
createParser
,
ParsedEvent
,
ReconnectInterval
}
from
'eventsource-parser'
;
import
{
createParser
,
ParsedEvent
,
ReconnectInterval
}
from
'eventsource-parser'
;
import
{
connectToDatabase
}
from
'@/service/mongo'
;
import
{
connectToDatabase
}
from
'@/service/mongo'
;
import
{
getOpenAIApi
,
authChat
}
from
'@/service/utils/chat'
;
import
{
getOpenAIApi
,
authChat
}
from
'@/service/utils/chat'
;
import
{
httpsAgent
}
from
'@/service/utils/tools'
;
import
{
httpsAgent
,
openaiChatFilter
}
from
'@/service/utils/tools'
;
import
{
ChatCompletionRequestMessage
,
ChatCompletionRequestMessageRoleEnum
}
from
'openai'
;
import
{
ChatCompletionRequestMessage
,
ChatCompletionRequestMessageRoleEnum
}
from
'openai'
;
import
{
ChatItemType
}
from
'@/types/chat'
;
import
{
ChatItemType
}
from
'@/types/chat'
;
import
{
jsonRes
}
from
'@/service/response'
;
import
{
jsonRes
}
from
'@/service/response'
;
...
@@ -10,7 +10,6 @@ import type { ModelSchema } from '@/types/mongoSchema';
...
@@ -10,7 +10,6 @@ import type { ModelSchema } from '@/types/mongoSchema';
import
{
PassThrough
}
from
'stream'
;
import
{
PassThrough
}
from
'stream'
;
import
{
modelList
}
from
'@/constants/model'
;
import
{
modelList
}
from
'@/constants/model'
;
import
{
pushChatBill
}
from
'@/service/events/pushBill'
;
import
{
pushChatBill
}
from
'@/service/events/pushBill'
;
import
{
openaiChatFilter
}
from
'@/service/utils/tools'
;
/* 发送提示词 */
/* 发送提示词 */
export
default
async
function
handler
(
req
:
NextApiRequest
,
res
:
NextApiResponse
)
{
export
default
async
function
handler
(
req
:
NextApiRequest
,
res
:
NextApiResponse
)
{
...
...
src/pages/api/model/del.ts
View file @
6c4026cc
import
type
{
NextApiRequest
,
NextApiResponse
}
from
'next'
;
import
type
{
NextApiRequest
,
NextApiResponse
}
from
'next'
;
import
{
jsonRes
}
from
'@/service/response'
;
import
{
jsonRes
}
from
'@/service/response'
;
import
{
Chat
,
Model
,
Training
,
connectToDatabase
}
from
'@/service/mongo'
;
import
{
Chat
,
Model
,
Training
,
connectToDatabase
}
from
'@/service/mongo'
;
import
{
authToken
,
getUserApiOpenai
}
from
'@/service/utils/tools'
;
import
{
authToken
}
from
'@/service/utils/tools'
;
import
{
getUserApiOpenai
}
from
'@/service/utils/openai'
;
import
{
TrainingStatusEnum
}
from
'@/constants/model'
;
import
{
TrainingStatusEnum
}
from
'@/constants/model'
;
import
{
TrainingItemType
}
from
'@/types/training'
;
import
{
TrainingItemType
}
from
'@/types/training'
;
import
{
httpsAgent
}
from
'@/service/utils/tools'
;
import
{
httpsAgent
}
from
'@/service/utils/tools'
;
...
...
src/pages/api/model/train/putTrainStatus.ts
View file @
6c4026cc
import
type
{
NextApiRequest
,
NextApiResponse
}
from
'next'
;
import
type
{
NextApiRequest
,
NextApiResponse
}
from
'next'
;
import
{
jsonRes
}
from
'@/service/response'
;
import
{
jsonRes
}
from
'@/service/response'
;
import
{
connectToDatabase
,
Model
,
Training
}
from
'@/service/mongo'
;
import
{
connectToDatabase
,
Model
,
Training
}
from
'@/service/mongo'
;
import
{
getOpenAIApi
}
from
'@/service/utils/chat
'
;
import
{
authToken
}
from
'@/service/utils/tools
'
;
import
{
authToken
,
getUserApiOpenai
}
from
'@/service/utils/tools
'
;
import
{
getUserApiOpenai
}
from
'@/service/utils/openai
'
;
import
type
{
ModelSchema
}
from
'@/types/mongoSchema'
;
import
type
{
ModelSchema
}
from
'@/types/mongoSchema'
;
import
{
TrainingItemType
}
from
'@/types/training'
;
import
{
TrainingItemType
}
from
'@/types/training'
;
import
{
ModelStatusEnum
,
TrainingStatusEnum
}
from
'@/constants/model'
;
import
{
ModelStatusEnum
,
TrainingStatusEnum
}
from
'@/constants/model'
;
...
...
src/pages/api/model/train/train.ts
View file @
6c4026cc
...
@@ -3,7 +3,8 @@ import type { NextApiRequest, NextApiResponse } from 'next';
...
@@ -3,7 +3,8 @@ import type { NextApiRequest, NextApiResponse } from 'next';
import
{
jsonRes
}
from
'@/service/response'
;
import
{
jsonRes
}
from
'@/service/response'
;
import
{
connectToDatabase
,
Model
,
Training
}
from
'@/service/mongo'
;
import
{
connectToDatabase
,
Model
,
Training
}
from
'@/service/mongo'
;
import
formidable
from
'formidable'
;
import
formidable
from
'formidable'
;
import
{
authToken
,
getUserApiOpenai
}
from
'@/service/utils/tools'
;
import
{
authToken
}
from
'@/service/utils/tools'
;
import
{
getUserApiOpenai
}
from
'@/service/utils/openai'
;
import
{
join
}
from
'path'
;
import
{
join
}
from
'path'
;
import
fs
from
'fs'
;
import
fs
from
'fs'
;
import
type
{
ModelSchema
}
from
'@/types/mongoSchema'
;
import
type
{
ModelSchema
}
from
'@/types/mongoSchema'
;
...
...
src/pages/api/timer/updateTraining.ts
View file @
6c4026cc
...
@@ -4,8 +4,7 @@ import { jsonRes } from '@/service/response';
...
@@ -4,8 +4,7 @@ import { jsonRes } from '@/service/response';
import
{
connectToDatabase
,
Training
,
Model
}
from
'@/service/mongo'
;
import
{
connectToDatabase
,
Training
,
Model
}
from
'@/service/mongo'
;
import
type
{
TrainingItemType
}
from
'@/types/training'
;
import
type
{
TrainingItemType
}
from
'@/types/training'
;
import
{
TrainingStatusEnum
,
ModelStatusEnum
}
from
'@/constants/model'
;
import
{
TrainingStatusEnum
,
ModelStatusEnum
}
from
'@/constants/model'
;
import
{
getOpenAIApi
}
from
'@/service/utils/chat'
;
import
{
getUserApiOpenai
}
from
'@/service/utils/openai'
;
import
{
getUserApiOpenai
}
from
'@/service/utils/tools'
;
import
{
OpenAiTuneStatusEnum
}
from
'@/service/constants/training'
;
import
{
OpenAiTuneStatusEnum
}
from
'@/service/constants/training'
;
import
{
sendTrainSucceed
}
from
'@/service/utils/sendEmail'
;
import
{
sendTrainSucceed
}
from
'@/service/utils/sendEmail'
;
import
{
httpsAgent
}
from
'@/service/utils/tools'
;
import
{
httpsAgent
}
from
'@/service/utils/tools'
;
...
...
src/service/events/generateAbstract.ts
View file @
6c4026cc
import
{
DataItem
}
from
'@/service/mongo'
;
import
{
DataItem
}
from
'@/service/mongo'
;
import
{
getOpenAIApi
}
from
'@/service/utils/chat'
;
import
{
getOpenAIApi
}
from
'@/service/utils/chat'
;
import
{
httpsAgent
,
getOpenApiKey
}
from
'@/service/utils/tools'
;
import
{
httpsAgent
}
from
'@/service/utils/tools'
;
import
{
getOpenApiKey
}
from
'../utils/openai'
;
import
type
{
ChatCompletionRequestMessage
}
from
'openai'
;
import
type
{
ChatCompletionRequestMessage
}
from
'openai'
;
import
{
DataItemSchema
}
from
'@/types/mongoSchema'
;
import
{
DataItemSchema
}
from
'@/types/mongoSchema'
;
import
{
ChatModelNameEnum
}
from
'@/constants/model'
;
import
{
ChatModelNameEnum
}
from
'@/constants/model'
;
...
...
src/service/events/generateQA.ts
View file @
6c4026cc
import
{
SplitData
}
from
'@/service/mongo'
;
import
{
SplitData
}
from
'@/service/mongo'
;
import
{
getOpenAIApi
}
from
'@/service/utils/chat'
;
import
{
getOpenAIApi
}
from
'@/service/utils/chat'
;
import
{
httpsAgent
,
getOpenApiKey
}
from
'@/service/utils/tools'
;
import
{
httpsAgent
}
from
'@/service/utils/tools'
;
import
{
getOpenApiKey
}
from
'../utils/openai'
;
import
type
{
ChatCompletionRequestMessage
}
from
'openai'
;
import
type
{
ChatCompletionRequestMessage
}
from
'openai'
;
import
{
ChatModelNameEnum
}
from
'@/constants/model'
;
import
{
ChatModelNameEnum
}
from
'@/constants/model'
;
import
{
pushSplitDataBill
}
from
'@/service/events/pushBill'
;
import
{
pushSplitDataBill
}
from
'@/service/events/pushBill'
;
...
...
src/service/utils/chat.ts
View file @
6c4026cc
import
{
Configuration
,
OpenAIApi
}
from
'openai'
;
import
{
Configuration
,
OpenAIApi
}
from
'openai'
;
import
{
Chat
}
from
'../mongo'
;
import
{
Chat
}
from
'../mongo'
;
import
type
{
ChatPopulate
}
from
'@/types/mongoSchema'
;
import
type
{
ChatPopulate
}
from
'@/types/mongoSchema'
;
import
{
authToken
,
getOpenApiKey
}
from
'./tools'
;
import
{
authToken
}
from
'./tools'
;
import
{
getOpenApiKey
}
from
'./openai'
;
export
const
getOpenAIApi
=
(
apiKey
:
string
)
=>
{
export
const
getOpenAIApi
=
(
apiKey
:
string
)
=>
{
const
configuration
=
new
Configuration
({
const
configuration
=
new
Configuration
({
...
...
src/service/utils/openai.ts
0 → 100644
View file @
6c4026cc
import
axios
from
'axios'
;
import
{
getOpenAIApi
}
from
'@/service/utils/chat'
;
import
{
httpsAgent
}
from
'./tools'
;
import
{
User
}
from
'../models/user'
;
import
{
formatPrice
}
from
'@/utils/user'
;
/* 判断 apikey 是否还有余额 */
export
const
checkKeyGrant
=
async
(
apiKey
:
string
)
=>
{
const
grant
=
await
axios
.
get
(
'https://api.openai.com/dashboard/billing/credit_grants'
,
{
headers
:
{
Authorization
:
`Bearer
${
apiKey
}
`
},
httpsAgent
});
if
(
grant
.
data
?.
total_available
<=
0.2
)
{
return
false
;
}
return
true
;
};
/* 获取用户 api 的 openai 信息 */
export
const
getUserApiOpenai
=
async
(
userId
:
string
)
=>
{
const
user
=
await
User
.
findById
(
userId
);
const
userApiKey
=
user
?.
accounts
?.
find
((
item
:
any
)
=>
item
.
type
===
'openai'
)?.
value
;
if
(
!
userApiKey
)
{
return
Promise
.
reject
(
'缺少ApiKey, 无法请求'
);
}
// 余额校验
const
hasGrant
=
await
checkKeyGrant
(
userApiKey
);
if
(
!
hasGrant
)
{
return
Promise
.
reject
({
code
:
501
,
message
:
'API 余额不足'
});
}
return
{
user
,
openai
:
getOpenAIApi
(
userApiKey
),
apiKey
:
userApiKey
};
};
/* 获取 open api key,如果用户没有自己的key,就用平台的,用平台记得加账单 */
export
const
getOpenApiKey
=
async
(
userId
:
string
,
checkGrant
=
false
)
=>
{
const
user
=
await
User
.
findById
(
userId
);
if
(
!
user
)
{
return
Promise
.
reject
(
'找不到用户'
);
}
const
userApiKey
=
user
?.
accounts
?.
find
((
item
:
any
)
=>
item
.
type
===
'openai'
)?.
value
;
// 有自己的key
if
(
userApiKey
)
{
// api 余额校验
if
(
checkGrant
)
{
const
hasGrant
=
await
checkKeyGrant
(
userApiKey
);
if
(
!
hasGrant
)
{
return
Promise
.
reject
({
code
:
501
,
message
:
'API 余额不足'
});
}
}
return
{
user
,
userApiKey
,
systemKey
:
''
};
}
// 平台账号余额校验
if
(
formatPrice
(
user
.
balance
)
<=
0
)
{
return
Promise
.
reject
({
code
:
501
,
message
:
'账号余额不足'
});
}
return
{
user
,
userApiKey
:
''
,
systemKey
:
process
.
env
.
OPENAIKEY
as
string
};
};
src/service/utils/tools.ts
View file @
6c4026cc
import
crypto
from
'crypto'
;
import
crypto
from
'crypto'
;
import
jwt
from
'jsonwebtoken'
;
import
jwt
from
'jsonwebtoken'
;
import
{
User
}
from
'../models/user'
;
import
tunnel
from
'tunnel'
;
import
tunnel
from
'tunnel'
;
import
{
formatPrice
}
from
'@/utils/user'
;
import
{
ChatItemType
}
from
'@/types/chat'
;
import
{
ChatItemType
}
from
'@/types/chat'
;
import
{
encode
}
from
'gpt-token-utils'
;
import
{
encode
}
from
'gpt-token-utils'
;
import
{
getOpenAIApi
}
from
'@/service/utils/chat'
;
import
axios
from
'axios'
;
/* 密码加密 */
/* 密码加密 */
export
const
hashPassword
=
(
psw
:
string
)
=>
{
export
const
hashPassword
=
(
psw
:
string
)
=>
{
...
@@ -56,90 +52,6 @@ export const httpsAgent =
...
@@ -56,90 +52,6 @@ export const httpsAgent =
})
})
:
undefined
;
:
undefined
;
/* 判断 apikey 是否还有余额 */
export
const
checkKeyGrant
=
async
(
apiKey
:
string
)
=>
{
const
grant
=
await
axios
.
get
(
'https://api.openai.com/dashboard/billing/credit_grants'
,
{
headers
:
{
Authorization
:
`Bearer
${
apiKey
}
`
},
httpsAgent
});
if
(
grant
.
data
?.
total_available
<=
0.2
)
{
return
false
;
}
return
true
;
};
/* 获取用户 api 的 openai 信息 */
export
const
getUserApiOpenai
=
async
(
userId
:
string
)
=>
{
const
user
=
await
User
.
findById
(
userId
);
const
userApiKey
=
user
?.
accounts
?.
find
((
item
:
any
)
=>
item
.
type
===
'openai'
)?.
value
;
if
(
!
userApiKey
)
{
return
Promise
.
reject
(
'缺少ApiKey, 无法请求'
);
}
// 余额校验
const
hasGrant
=
await
checkKeyGrant
(
userApiKey
);
if
(
!
hasGrant
)
{
return
Promise
.
reject
({
code
:
501
,
message
:
'API 余额不足'
});
}
return
{
user
,
openai
:
getOpenAIApi
(
userApiKey
),
apiKey
:
userApiKey
};
};
/* 获取 open api key,如果用户没有自己的key,就用平台的,用平台记得加账单 */
export
const
getOpenApiKey
=
async
(
userId
:
string
,
checkGrant
=
false
)
=>
{
const
user
=
await
User
.
findById
(
userId
);
if
(
!
user
)
{
return
Promise
.
reject
(
'找不到用户'
);
}
const
userApiKey
=
user
?.
accounts
?.
find
((
item
:
any
)
=>
item
.
type
===
'openai'
)?.
value
;
// 有自己的key
if
(
userApiKey
)
{
// api 余额校验
if
(
checkGrant
)
{
const
hasGrant
=
await
checkKeyGrant
(
userApiKey
);
if
(
!
hasGrant
)
{
return
Promise
.
reject
({
code
:
501
,
message
:
'API 余额不足'
});
}
}
return
{
user
,
userApiKey
,
systemKey
:
''
};
}
// 平台账号余额校验
if
(
formatPrice
(
user
.
balance
)
<=
0
)
{
return
Promise
.
reject
({
code
:
501
,
message
:
'账号余额不足'
});
}
return
{
user
,
userApiKey
:
''
,
systemKey
:
process
.
env
.
OPENAIKEY
as
string
};
};
/* tokens 截断 */
/* tokens 截断 */
export
const
openaiChatFilter
=
(
prompts
:
ChatItemType
[],
maxTokens
:
number
)
=>
{
export
const
openaiChatFilter
=
(
prompts
:
ChatItemType
[],
maxTokens
:
number
)
=>
{
let
res
:
ChatItemType
[]
=
[];
let
res
:
ChatItemType
[]
=
[];
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment