Add OpenAI o1

6d79cc015ab8e9049a4b09b0d197c30aa709ef09

Cohee <18619528+Cohee1207@users.noreply.github.com>

6 files changed, +48 -10Showing whitespace changes
package-lock.json+5 -4
@@ -46,7 +46,7 @@
4646 "sanitize-filename": "^1.6.3",
4747 "sillytavern-transformers": "2.14.6",
4848 "simple-git": "^3.19.1",
4949 "tiktoken": "^1.0.1516",
5050 "vectra": "^0.2.2",
5151 "wavefile": "^11.0.0",
5252 "write-file-atomic": "^5.0.1",
@@ -5751,9 +5751,10 @@
57515751 "license": "MIT"
57525752 },
57535753 "node_modules/tiktoken": {
57545754 "version": "1.0.1516",
57555755 "resolved": "https://registry.npmjs.org/tiktoken/-/tiktoken-1.0.1516.tgz",
57565756 "integrity": "sha512-sCsrq/vMWUSEW29CJLNmPvWxlVp7yh2tlkAjpJltIKqp5CKf98ZNpdeHRmAlPVFlGEbswDc6SmI8vz64WhRcORIGF2YlAgWx3nzrGJOrKSJwLoc81HpXmMQk89632XAgURc7IeV2FgQ2iXo9z/qErwJ96fCvpsHg2kWoHcbj9fg==",
5757+ "license": "MIT"
57575758 },
57585759 "node_modules/timm": {
57595760 "version": "1.7.1",
package.json+1 -1
@@ -36,7 +36,7 @@
3636 "sanitize-filename": "^1.6.3",
3737 "sillytavern-transformers": "2.14.6",
3838 "simple-git": "^3.19.1",
3939 "tiktoken": "^1.0.1516",
4040 "vectra": "^0.2.2",
4141 "wavefile": "^11.0.0",
4242 "write-file-atomic": "^5.0.1",
public/index.html+5 -1
@@ -383,7 +383,7 @@
383383 Max Response Length (tokens)
384384 </div>
385385 <div class="wide100p">
386386 <input type="number" id="openai_max_tokens" name="openai_max_tokens" class="text_pole" min="1" max="1638465536 ">
387387 </div>
388388 </div>
389389 <div class="range-block" data-source="openai,custom">
@@ -2611,6 +2611,10 @@
26112611 <option value="gpt-4-0125-preview">gpt-4-0125-preview (2024)</option>
26122612 <option value="gpt-4-1106-preview">gpt-4-1106-preview (2023)</option>
26132613 </optgroup>
2614+ <optgroup label="o1">
2615+ <option value="o1-preview">o1-preview</option>
2616+ <option value="o1-mini">o1-mini</option>
2617+ </optgroup>
26142618 <optgroup label="Other">
26152619 <option value="text-davinci-003">text-davinci-003</option>
26162620 <option value="text-davinci-002">text-davinci-002</option>
public/script.js+6 -1
@@ -2862,7 +2862,12 @@ export function getCharacterCardFields() {
28622862
28632863export function isStreamingEnabled() {
28642864 const noStreamSources = [chat_completion_sources.SCALE];
2865- return ((main_api == 'openai' && oai_settings.stream_openai && !noStreamSources.includes(oai_settings.chat_completion_source) && !(oai_settings.chat_completion_source == chat_completion_sources.MAKERSUITE && oai_settings.google_model.includes('bison')))
2865+ return (
2866+ (main_api == 'openai' &&
2867+ oai_settings.stream_openai &&
2868+ !noStreamSources.includes(oai_settings.chat_completion_source) &&
2869+ !(oai_settings.chat_completion_source == chat_completion_sources.OPENAI && oai_settings.openai_model.startsWith('o1-')) &&
2870+ !(oai_settings.chat_completion_source == chat_completion_sources.MAKERSUITE && oai_settings.google_model.includes('bison')))
28662871 || (main_api == 'kobold' && kai_settings.streaming_kobold && kai_flags.can_use_streaming)
28672872 || (main_api == 'novel' && nai_settings.streaming_novel)
28682873 || (main_api == 'textgenerationwebui' && textgen_settings.streaming));
public/scripts/openai.js+27 -3
@@ -1797,7 +1797,7 @@ async function sendOpenAIRequest(type, messages, signal) {
17971797 const isQuiet = type === 'quiet';
17981798 const isImpersonate = type === 'impersonate';
17991799 const isContinue = type === 'continue';
18001800 const stream = oai_settings.stream_openai && !isQuiet && !isScale && !(isGoogle && oai_settings.google_model.includes('bison')) && !(isOAI && oai_settings.openai_model.startsWith('o1-'));
18011801 const useLogprobs = !!power_user.request_token_probabilities;
18021802 const canMultiSwipe = oai_settings.n > 1 && !isContinue && !isImpersonate && !isQuiet && (isOAI || isCustom);
18031803
@@ -1960,12 +1960,33 @@ async function sendOpenAIRequest(type, messages, signal) {
19601960 generate_data['seed'] = oai_settings.seed;
19611961 }
19621962
1963- await eventSource.emit(event_types.CHAT_COMPLETION_SETTINGS_READY, generate_data);
1964-
19651963 if (isFunctionCallingSupported() && !stream) {
19661964 await registerFunctionTools(type, generate_data);
19671965 }
19681966
1967+ if (isOAI && oai_settings.openai_model.startsWith('o1-')) {
1968+ generate_data.messages.forEach((msg) => {
1969+ if (msg.role === 'system') {
1970+ msg.role = 'user';
1971+ }
1972+ });
1973+ delete generate_data.stream;
1974+ delete generate_data.logprobs;
1975+ delete generate_data.top_logprobs;
1976+ delete generate_data.n;
1977+ delete generate_data.temperature;
1978+ delete generate_data.top_p;
1979+ delete generate_data.frequency_penalty;
1980+ delete generate_data.presence_penalty;
1981+ delete generate_data.tools;
1982+ delete generate_data.tool_choice;
1983+ // IDK if it supports it and I have no way to test it
1984+ // delete generate_data.logit_bias;
1985+ // delete generate_data.stop;
1986+ }
1987+
1988+ await eventSource.emit(event_types.CHAT_COMPLETION_SETTINGS_READY, generate_data);
1989+
19691990 const generate_url = '/api/backends/chat-completions/generate';
19701991 const response = await fetch(generate_url, {
19711992 method: 'POST',
@@ -3905,6 +3926,9 @@ function getMaxContextOpenAI(value) {
39053926 if (oai_settings.max_context_unlocked) {
39063927 return unlocked_max;
39073928 }
3929+ else if (value.startsWith('o1-')) {
3930+ return max_128k;
3931+ }
39083932 else if (value.includes('chatgpt-4o-latest') || value.includes('gpt-4-turbo') || value.includes('gpt-4o') || value.includes('gpt-4-1106') || value.includes('gpt-4-0125') || value.includes('gpt-4-vision')) {
39093933 return max_128k;
39103934 }
src/endpoints/tokenizers.js+4 -0
@@ -350,6 +350,10 @@ function getWebTokenizersChunks(tokenizer, ids) {
350350 * @returns {string} Tokenizer model to use
351351 */
352352function getTokenizerModel(requestModel) {
353+ if (requestModel.includes('o1-preview') || requestModel.includes('o1-mini')) {
354+ return 'gpt-4o';
355+ }
356+
353357 if (requestModel.includes('gpt-4o')) {
354358 return 'gpt-4o';
355359 }