Greasy Fork

Greasy Fork is available in English.

Claude AI Response Model Modifier

Modifies the 'model' field in specific claude.ai API responses.

当前为 2025-05-25 提交的版本,查看 最新版本

// ==UserScript==
// @name         Claude AI Response Model Modifier
// @namespace    http://tampermonkey.net/
// @version      1.3
// @description  Modifies the 'model' field in specific claude.ai API responses.
// @author       gemini 2.5 pro 
// @match        https://claude.ai/*
// @grant        none
// @run-at       document-start
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    // --- 用户配置开始 ---
    const ENABLE_MODEL_MODIFICATION = true;
        // 当前常用model
        // claude-opus-4-20250514-claude-ai-pro
        // claude-3-7-sonnet-20250219
        // claude-opus-4-20250514
    const NEW_MODEL_STRING = 'claude-3-7-sonnet-20250219'; // <--- 在这里设置你想要的 model 字符串
    // --- 用户配置结束 ---

    // 更新后的正则表达式,匹配以 /api/ 开头的相对路径
    const TARGET_URL_REGEX = /^\/api\/organizations\/[^\/]+\/chat_conversations\/[^\/]+\?tree=True&rendering_mode=messages&render_all_tools=true$/;

    const originalFetch = window.fetch;

    window.fetch = function(input, init) {
        let urlToTest;

        if (typeof input === 'string') {
            urlToTest = input;
        } else if (input && typeof input.url === 'string') { // Covers Request object
            urlToTest = input.url;
            // 对于 Request 对象,其 .url 属性通常是绝对 URL。
            // 但如果 fetch 是用相对路径的 Request 对象初始化的,这里可能仍是相对的。
            // 不过,更常见的是 fetch(relativePath) 导致 typeof input === 'string'
        } else {
            console.warn('[Claude Model Modifier] Could not determine URL from fetch input:', input);
            return originalFetch(input, init);
        }

        // 调试日志:打印所有被 fetch 的 URL 及其与正则表达式的匹配结果
        const isMatch = TARGET_URL_REGEX.test(urlToTest);
        // 为了更清晰地看到传入的urlToTest和匹配情况,可以保留或按需调整这条日志
        // console.log(`[Claude Model Modifier] Testing URL: "${urlToTest}" | Regex: ${TARGET_URL_REGEX.toString()} | Matches: ${isMatch}`);
        // if (urlToTest.includes('/api/organizations')) { // 只打印相关的URL,避免过多日志
        //     console.log(`[Claude Model Modifier] Testing URL: "${urlToTest}" | Matches: ${isMatch}`);
        //}


        if (ENABLE_MODEL_MODIFICATION && isMatch) {
            console.log('[Claude Model Modifier] Intercepted target URL:', urlToTest);

            return originalFetch(input, init)
                .then(async (response) => {
                    if (!response.ok) {
                        console.log('[Claude Model Modifier] Original response not OK:', response.status, response.statusText);
                        return response;
                    }

                    const responseBodyText = await response.text();
                    let jsonData;

                    try {
                        jsonData = JSON.parse(responseBodyText);
                    } catch (e) {
                        console.error('[Claude Model Modifier] Failed to parse JSON response:', e);
                        console.error('[Claude Model Modifier] Response text was:', responseBodyText.substring(0, 500)); // 只打印部分响应文本
                        return new Response(responseBodyText, {
                            status: response.status,
                            statusText: response.statusText,
                            headers: response.headers
                        });
                    }

                    console.log('[Claude Model Modifier] Original model:', jsonData.model);
                    jsonData.model = NEW_MODEL_STRING;
                    console.log('[Claude Model Modifier] Modified model to:', jsonData.model);

                    const modifiedResponseBody = JSON.stringify(jsonData);
                    const modifiedResponse = new Response(modifiedResponseBody, {
                        status: response.status,
                        statusText: response.statusText,
                        headers: response.headers
                    });
                    modifiedResponse.headers.set('Content-Type', 'application/json');

                    console.log('[Claude Model Modifier] Returning modified response.');
                    return modifiedResponse;
                })
                .catch(error => {
                    console.error('[Claude Model Modifier] Error during fetch modification for URL:', urlToTest, error);
                    throw error;
                });
        }

        return originalFetch(input, init);
    };

    console.log('[Claude Model Modifier] Script loaded and fetch overridden. (v1.3 - Relative URL fix)');

})();