Skip to content

Commit 3d89ddd

Browse files
committed
WIP, custom API Modes
1 parent fbb74b6 commit 3d89ddd

File tree

15 files changed

+112
-82
lines changed

15 files changed

+112
-82
lines changed

src/components/ConversationCard/index.jsx

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
isFirefox,
1212
isMobile,
1313
isSafari,
14+
isUsingModelName,
1415
modelNameToDesc,
1516
} from '../../utils'
1617
import {
@@ -25,7 +26,7 @@ import FileSaver from 'file-saver'
2526
import { render } from 'preact'
2627
import FloatingToolbar from '../FloatingToolbar'
2728
import { useClampWindowSize } from '../../hooks/use-clamp-window-size'
28-
import { bingWebModelKeys, getUserConfig, Models } from '../../config/index.mjs'
29+
import { getUserConfig, isUsingBingWebModel, Models } from '../../config/index.mjs'
2930
import { useTranslation } from 'react-i18next'
3031
import DeleteButton from '../DeleteButton'
3132
import { useConfig } from '../../hooks/use-config.mjs'
@@ -61,8 +62,7 @@ function ConversationCard(props) {
6162
const windowSize = useClampWindowSize([750, 1500], [250, 1100])
6263
const bodyRef = useRef(null)
6364
const [completeDraggable, setCompleteDraggable] = useState(false)
64-
// `.some` for multi mode models. e.g. bingFree4-balanced
65-
const useForegroundFetch = bingWebModelKeys.some((n) => session.modelName.includes(n))
65+
const useForegroundFetch = isUsingBingWebModel(session)
6666
const [apiModes, setApiModes] = useState([])
6767

6868
/**
@@ -247,7 +247,7 @@ function ConversationCard(props) {
247247
}
248248
try {
249249
const bingToken = (await getUserConfig()).bingAccessToken
250-
if (session.modelName.includes('bingFreeSydney'))
250+
if (isUsingModelName('bingFreeSydney', session))
251251
await generateAnswersWithBingWebApi(
252252
fakePort,
253253
session.question,
@@ -390,7 +390,11 @@ function ConversationCard(props) {
390390
...session,
391391
modelName,
392392
apiMode,
393-
aiName: modelNameToDesc(apiMode ? apiModeToModelName(apiMode) : modelName, t),
393+
aiName: modelNameToDesc(
394+
apiMode ? apiModeToModelName(apiMode) : modelName,
395+
t,
396+
config.customModelName,
397+
),
394398
}
395399
if (config.autoRegenAfterSwitchModel && conversationItemData.length > 0)
396400
getRetryFn(newSession)()
@@ -399,7 +403,7 @@ function ConversationCard(props) {
399403
>
400404
{apiModes.map((apiMode, index) => {
401405
const modelName = apiModeToModelName(apiMode)
402-
const desc = modelNameToDesc(modelName, t)
406+
const desc = modelNameToDesc(modelName, t, config.customModelName)
403407
if (desc) {
404408
return (
405409
<option value={index} key={index} selected={isApiModeSelected(apiMode, session)}>
@@ -551,7 +555,6 @@ function ConversationCard(props) {
551555
key={idx}
552556
type={data.type}
553557
descName={data.type === 'answer' && session.aiName}
554-
modelName={data.type === 'answer' && session.modelName}
555558
onRetry={idx === conversationItemData.length - 1 ? retryFn : null}
556559
/>
557560
))}

src/components/ConversationItem/index.jsx

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,30 +5,18 @@ import ReadButton from '../ReadButton'
55
import PropTypes from 'prop-types'
66
import MarkdownRender from '../MarkdownRender/markdown.jsx'
77
import { useTranslation } from 'react-i18next'
8-
import { isUsingCustomModel } from '../../config/index.mjs'
9-
import { useConfig } from '../../hooks/use-config.mjs'
108

11-
function AnswerTitle({ descName, modelName }) {
9+
function AnswerTitle({ descName }) {
1210
const { t } = useTranslation()
13-
const config = useConfig()
1411

15-
return (
16-
<p style="white-space: nowrap;">
17-
{descName && modelName
18-
? `${t(descName)}${
19-
isUsingCustomModel({ modelName }) ? ' (' + config.customModelName + ')' : ''
20-
}:`
21-
: t('Loading...')}
22-
</p>
23-
)
12+
return <p style="white-space: nowrap;">{descName ? `${descName}:` : t('Loading...')}</p>
2413
}
2514

2615
AnswerTitle.propTypes = {
2716
descName: PropTypes.string,
28-
modelName: PropTypes.string,
2917
}
3018

31-
export function ConversationItem({ type, content, descName, modelName, onRetry }) {
19+
export function ConversationItem({ type, content, descName, onRetry }) {
3220
const { t } = useTranslation()
3321
const [collapsed, setCollapsed] = useState(false)
3422

@@ -67,17 +55,17 @@ export function ConversationItem({ type, content, descName, modelName, onRetry }
6755
return (
6856
<div className={'chatgptbox-' + type} dir="auto">
6957
<div className="gpt-header">
70-
<AnswerTitle descName={descName} modelName={modelName} />
58+
<AnswerTitle descName={descName} />
7159
<div className="gpt-util-group">
7260
{onRetry && (
7361
<span title={t('Retry')} className="gpt-util-icon" onClick={onRetry}>
7462
<SyncIcon size={14} />
7563
</span>
7664
)}
77-
{modelName && (
65+
{descName && (
7866
<CopyButton contentFn={() => content.replace(/\n<hr\/>$/, '')} size={14} />
7967
)}
80-
{modelName && <ReadButton contentFn={() => content} size={14} />}
68+
{descName && <ReadButton contentFn={() => content} size={14} />}
8169
{!collapsed ? (
8270
<span
8371
title={t('Collapse')}
@@ -141,7 +129,6 @@ ConversationItem.propTypes = {
141129
type: PropTypes.oneOf(['question', 'answer', 'error']).isRequired,
142130
content: PropTypes.string.isRequired,
143131
descName: PropTypes.string,
144-
modelName: PropTypes.string,
145132
onRetry: PropTypes.func,
146133
}
147134

src/config/index.mjs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
import { defaults } from 'lodash-es'
22
import Browser from 'webextension-polyfill'
33
import { isMobile } from '../utils/is-mobile.mjs'
4-
import { isInApiModeGroup, modelNameToDesc } from '../utils/model-name-convert.mjs'
4+
import {
5+
isInApiModeGroup,
6+
isUsingModelName,
7+
modelNameToDesc,
8+
} from '../utils/model-name-convert.mjs'
59
import { t } from 'i18next'
610

711
export const TriggerMode = {
@@ -526,7 +530,7 @@ export function isUsingCustomModel(configOrSession) {
526530
* @deprecated
527531
*/
528532
export function isUsingCustomNameOnlyModel(configOrSession) {
529-
return configOrSession.modelName === 'poeAiWebCustom'
533+
return isUsingModelName('poeAiWebCustom', configOrSession)
530534
}
531535

532536
export async function getPreferredLanguageKey() {

src/content-script/index.jsx

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
chatgptWebModelKeys,
1010
getPreferredLanguageKey,
1111
getUserConfig,
12+
isUsingChatgptWebModel,
1213
setAccessToken,
1314
setUserConfig,
1415
} from '../config/index.mjs'
@@ -91,7 +92,11 @@ async function mountComponent(siteConfig) {
9192

9293
render(
9394
<FloatingToolbar
94-
session={initSession({ modelName: userConfig.modelName, apiMode: userConfig.apiMode })}
95+
session={initSession({
96+
modelName: userConfig.modelName,
97+
apiMode: userConfig.apiMode,
98+
extraCustomModelName: userConfig.customModelName,
99+
})}
95100
selection=""
96101
container={toolbarContainer}
97102
triggered={triggered}
@@ -107,7 +112,11 @@ async function mountComponent(siteConfig) {
107112
container.id = 'chatgptbox-container'
108113
render(
109114
<DecisionCard
110-
session={initSession({ modelName: userConfig.modelName, apiMode: userConfig.apiMode })}
115+
session={initSession({
116+
modelName: userConfig.modelName,
117+
apiMode: userConfig.apiMode,
118+
extraCustomModelName: userConfig.customModelName,
119+
})}
111120
question={question}
112121
siteConfig={siteConfig}
113122
container={container}
@@ -154,7 +163,11 @@ const createSelectionTools = async (toolbarContainer, selection) => {
154163
const userConfig = await getUserConfig()
155164
render(
156165
<FloatingToolbar
157-
session={initSession({ modelName: userConfig.modelName, apiMode: userConfig.apiMode })}
166+
session={initSession({
167+
modelName: userConfig.modelName,
168+
apiMode: userConfig.apiMode,
169+
extraCustomModelName: userConfig.customModelName,
170+
})}
158171
selection={selection}
159172
container={toolbarContainer}
160173
dockable={true}
@@ -280,7 +293,11 @@ async function prepareForRightClickMenu() {
280293
const userConfig = await getUserConfig()
281294
render(
282295
<FloatingToolbar
283-
session={initSession({ modelName: userConfig.modelName, apiMode: userConfig.apiMode })}
296+
session={initSession({
297+
modelName: userConfig.modelName,
298+
apiMode: userConfig.apiMode,
299+
extraCustomModelName: userConfig.customModelName,
300+
})}
284301
selection={data.selectionText}
285302
container={container}
286303
triggered={true}
@@ -382,7 +399,7 @@ async function prepareForForegroundRequests() {
382399
})
383400

384401
registerPortListener(async (session, port) => {
385-
if (chatgptWebModelKeys.includes(session.modelName)) {
402+
if (isUsingChatgptWebModel(session)) {
386403
const accessToken = await getChatGptAccessToken()
387404
await generateAnswersWithChatgptWebApi(port, session.question, session, accessToken)
388405
}

src/services/apis/bing-web.mjs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import BingAIClient from '../clients/bing/index.mjs'
22
import { getUserConfig } from '../../config/index.mjs'
33
import { pushRecord, setAbortController } from './shared.mjs'
4-
import { isCustomModelName, modelNameToCustomPart } from '../../utils/model-name-convert.mjs'
4+
import { getModelValue } from '../../utils/model-name-convert.mjs'
55

66
/**
77
* @param {Runtime.Port} port
@@ -19,9 +19,8 @@ export async function generateAnswersWithBingWebApi(
1919
) {
2020
const { controller, messageListener, disconnectListener } = setAbortController(port)
2121
const config = await getUserConfig()
22-
let modelMode
23-
if (isCustomModelName(session.modelName)) modelMode = modelNameToCustomPart(session.modelName)
24-
else modelMode = config.modelMode
22+
let modelMode = getModelValue(session)
23+
if (!modelMode) modelMode = config.modelMode
2524

2625
console.debug('mode', modelMode)
2726

src/services/apis/chatgpt-web.mjs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { v4 as uuidv4 } from 'uuid'
99
import { t } from 'i18next'
1010
import { sha3_512 } from 'js-sha3'
1111
import randomInt from 'random-int'
12-
import { modelNameToValue } from '../../utils/model-name-convert.mjs'
12+
import { getModelValue } from '../../utils/model-name-convert.mjs'
1313

1414
async function request(token, method, path, data) {
1515
const apiUrl = (await getUserConfig()).customChatGptWebApiUrl
@@ -234,7 +234,7 @@ export async function generateAnswersWithChatgptWebApi(port, question, session,
234234
isNeedWebsocket(accessToken).catch(() => undefined),
235235
])
236236
console.debug('models', models)
237-
const selectedModel = modelNameToValue(session.modelName)
237+
const selectedModel = getModelValue(session)
238238
const usedModel =
239239
models && models.includes(selectedModel) ? selectedModel : Models.chatgptFree35.value
240240
console.debug('usedModel', usedModel)

src/services/apis/claude-api.mjs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { pushRecord, setAbortController } from './shared.mjs'
33
import { fetchSSE } from '../../utils/fetch-sse.mjs'
44
import { isEmpty } from 'lodash-es'
55
import { getConversationPairs } from '../../utils/get-conversation-pairs.mjs'
6-
import { modelNameToValue } from '../../utils/model-name-convert.mjs'
6+
import { getModelValue } from '../../utils/model-name-convert.mjs'
77

88
/**
99
* @param {Runtime.Port} port
@@ -14,7 +14,7 @@ export async function generateAnswersWithClaudeApi(port, question, session) {
1414
const { controller, messageListener, disconnectListener } = setAbortController(port)
1515
const config = await getUserConfig()
1616
const apiUrl = config.customClaudeApiUrl
17-
const modelName = session.modelName
17+
const model = getModelValue(session)
1818

1919
const prompt = getConversationPairs(
2020
session.conversationRecords.slice(-config.maxConversationContextLength),
@@ -32,7 +32,7 @@ export async function generateAnswersWithClaudeApi(port, question, session) {
3232
'x-api-key': config.claudeApiKey,
3333
},
3434
body: JSON.stringify({
35-
model: modelNameToValue(modelName),
35+
model,
3636
messages: prompt,
3737
stream: true,
3838
max_tokens: config.maxResponseTokenLength,

src/services/apis/claude-web.mjs

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,18 @@
11
import { pushRecord, setAbortController } from './shared.mjs'
22
import Claude from '../clients/claude'
3-
import { modelNameToValue } from '../../utils/model-name-convert.mjs'
3+
import { getModelValue } from '../../utils/model-name-convert.mjs'
44

55
/**
66
* @param {Runtime.Port} port
77
* @param {string} question
88
* @param {Session} session
99
* @param {string} sessionKey
10-
* @param {string} modelName
1110
*/
12-
export async function generateAnswersWithClaudeWebApi(
13-
port,
14-
question,
15-
session,
16-
sessionKey,
17-
modelName,
18-
) {
11+
export async function generateAnswersWithClaudeWebApi(port, question, session, sessionKey) {
1912
const bot = new Claude({ sessionKey })
2013
await bot.init()
2114
const { controller, cleanController } = setAbortController(port)
15+
const model = getModelValue(session)
2216

2317
let answer = ''
2418
const progressFunc = ({ completion }) => {
@@ -35,7 +29,7 @@ export async function generateAnswersWithClaudeWebApi(
3529
const params = {
3630
progress: progressFunc,
3731
done: doneFunc,
38-
model: modelNameToValue(modelName),
32+
model,
3933
signal: controller.signal,
4034
}
4135

src/services/apis/moonshot-web.mjs

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { pushRecord, setAbortController } from './shared.mjs'
22
import { setUserConfig } from '../../config/index.mjs'
33
import { fetchSSE } from '../../utils/fetch-sse'
44
import { isEmpty } from 'lodash-es'
5-
import { modelNameToValue } from '../../utils/model-name-convert.mjs'
5+
import { getModelValue } from '../../utils/model-name-convert.mjs'
66

77
export class MoonshotWeb {
88
/**
@@ -569,18 +569,12 @@ export class Message {
569569
* @param {string} question
570570
* @param {Session} session
571571
* @param {UserConfig} config
572-
* @param {string} modelName
573572
*/
574-
export async function generateAnswersWithMoonshotWebApi(
575-
port,
576-
question,
577-
session,
578-
config,
579-
modelName,
580-
) {
573+
export async function generateAnswersWithMoonshotWebApi(port, question, session, config) {
581574
const bot = new MoonshotWeb({ config })
582575
await bot.init()
583576
const { controller, cleanController } = setAbortController(port)
577+
const model = getModelValue(session)
584578

585579
let answer = ''
586580
const progressFunc = ({ completion }) => {
@@ -597,7 +591,7 @@ export async function generateAnswersWithMoonshotWebApi(
597591
const params = {
598592
progress: progressFunc,
599593
done: doneFunc,
600-
model: modelNameToValue(modelName),
594+
model,
601595
signal: controller.signal,
602596
}
603597

0 commit comments

Comments
 (0)