Skip to content

Commit 1b63f11

Browse files
committed
feat: independent Claude.ai model support (#457, #476, #477, #503)
1 parent 40ae457 commit 1b63f11

File tree

7 files changed

+129
-8
lines changed

7 files changed

+129
-8
lines changed

package-lock.json

Lines changed: 61 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
"@nem035/gpt-3-encoder": "^1.1.7",
2323
"@picocss/pico": "^1.5.9",
2424
"@primer/octicons-react": "^18.3.0",
25+
"claude-ai": "^1.2.2",
2526
"countries-list": "^2.6.1",
2627
"diff": "^5.1.0",
2728
"eventsource-parser": "^1.0.0",

src/background/index.mjs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import {
1919
bingWebModelKeys,
2020
chatgptApiModelKeys,
2121
chatgptWebModelKeys,
22+
claudeWebModelKeys,
2223
customApiModelKeys,
2324
defaultConfig,
2425
getUserConfig,
@@ -34,11 +35,13 @@ import {
3435
getBardCookies,
3536
getBingAccessToken,
3637
getChatGptAccessToken,
38+
getClaudeSessionKey,
3739
registerPortListener,
3840
} from '../services/wrappers.mjs'
3941
import { refreshMenu } from './menus.mjs'
4042
import { registerCommands } from './commands.mjs'
4143
import { generateAnswersWithBardWebApi } from '../services/apis/bard-web.mjs'
44+
import { generateAnswersWithClaudeWebApi } from '../services/apis/claude-web.mjs'
4245

4346
function setPortProxy(port, proxyTabId) {
4447
port.proxy = Browser.tabs.connect(proxyTabId)
@@ -123,6 +126,9 @@ async function executeApi(session, port, config) {
123126
} else if (bardWebModelKeys.includes(session.modelName)) {
124127
const cookies = await getBardCookies()
125128
await generateAnswersWithBardWebApi(port, session.question, session, cookies)
129+
} else if (claudeWebModelKeys.includes(session.modelName)) {
130+
const sessionKey = await getClaudeSessionKey()
131+
await generateAnswersWithClaudeWebApi(port, session.question, session, sessionKey)
126132
}
127133
}
128134

src/config/index.mjs

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ export const chatgptWebModelKeys = [
3030
]
3131
export const bingWebModelKeys = ['bingFree4', 'bingFreeSydney']
3232
export const bardWebModelKeys = ['bardWebFree']
33+
export const claudeWebModelKeys = ['claude2WebFree']
3334
export const gptApiModelKeys = ['gptApiDavinci']
3435
export const chatgptApiModelKeys = [
3536
'chatgptApi35',
@@ -81,6 +82,7 @@ export const Models = {
8182
value: 'gpt-3.5-turbo-16k-0613',
8283
desc: 'ChatGPT (GPT-3.5-turbo-16k 0613)',
8384
},
85+
claude2WebFree: { value: 'claude-2', desc: 'Claude.ai (Web, Claude 2)' },
8486
bingFree4: { value: '', desc: 'Bing (Web, GPT-4)' },
8587
bingFreeSydney: { value: '', desc: 'Bing (Web, GPT-4, Sydney)' },
8688
bardWebFree: { value: '', desc: 'Bard (Web)' },
@@ -175,21 +177,22 @@ export const defaultConfig = {
175177
activeApiModes: [
176178
'chatgptFree35',
177179
'chatgptFree35Mobile',
178-
'chatgptPlus4',
179-
'chatgptPlus4Mobile',
180+
// 'chatgptPlus4',
181+
// 'chatgptPlus4Mobile',
180182
'chatgptApi35',
181183
'chatgptApi35_16k',
184+
'claude2WebFree',
182185
'bingFree4',
183186
'bingFreeSydney',
184-
'poeAiWebSage', //poe.com/Assistant
185-
'poeAiWebGPT4',
186-
'poeAiWebGPT4_32k',
187-
'poeAiWebClaudePlus',
188-
'poeAiWebClaude100k',
187+
// 'poeAiWebSage', //poe.com/Assistant
188+
// 'poeAiWebGPT4',
189+
// 'poeAiWebGPT4_32k',
190+
// 'poeAiWebClaudePlus',
191+
// 'poeAiWebClaude100k',
189192
'chatgptApi4_8k',
190193
'customModel',
191194
'azureOpenAi',
192-
'poeAiWebCustom',
195+
// 'poeAiWebCustom',
193196
],
194197
activeSelectionTools: ['translate', 'summary', 'polish', 'code', 'ask'],
195198
activeSiteAdapters: [

src/services/apis/claude-web.mjs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import { pushRecord } from './shared.mjs'
2+
import Claude from 'claude-ai'
3+
4+
/**
5+
* @param {Runtime.Port} port
6+
* @param {string} question
7+
* @param {Session} session
8+
* @param {string} sessionKey
9+
*/
10+
export async function generateAnswersWithClaudeWebApi(port, question, session, sessionKey) {
11+
const bot = new Claude({ sessionKey })
12+
await bot.init()
13+
14+
let answer = ''
15+
const progressFunc = ({ completion }) => {
16+
answer = completion
17+
port.postMessage({ answer: answer, done: false, session: null })
18+
}
19+
20+
const doneFunc = () => {
21+
pushRecord(session, question, answer)
22+
console.debug('conversation history', { content: session.conversationRecords })
23+
port.postMessage({ answer: answer, done: true, session: session })
24+
}
25+
26+
if (!session.claude_conversation)
27+
await bot
28+
.startConversation(question, {
29+
progress: progressFunc,
30+
done: doneFunc,
31+
})
32+
.then((conversation) => {
33+
session.claude_conversation = conversation
34+
port.postMessage({ answer: answer, done: true, session: session })
35+
})
36+
else
37+
await bot.sendMessage(question, {
38+
conversation: session.claude_conversation,
39+
progress: progressFunc,
40+
done: doneFunc,
41+
})
42+
}

src/services/init-session.mjs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import { v4 as uuidv4 } from 'uuid'
2525
* @property {Object|null} bingWeb_jailbreakConversationCache
2626
* @property {number|null} poe_chatId
2727
* @property {object|null} bard_conversationObj
28+
* @property {object|null} claude_conversation
2829
*/
2930
/**
3031
* @param {string|null} question
@@ -78,5 +79,8 @@ export function initSession({
7879

7980
// bard
8081
bard_conversationObj: null,
82+
83+
// claude.ai
84+
claude_conversation: null,
8185
}
8286
}

src/services/wrappers.mjs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ export async function getBardCookies() {
4040
return '__Secure-1PSID=' + token
4141
}
4242

43+
export async function getClaudeSessionKey() {
44+
return (await Browser.cookies.get({ url: 'https://claude.ai/', name: 'sessionKey' }))?.value
45+
}
46+
4347
export function registerPortListener(executor) {
4448
Browser.runtime.onConnect.addListener((port) => {
4549
console.debug('connected')

0 commit comments

Comments
 (0)