参考我的worker.js:
/**
* Welcome to Cloudflare Workers! This is your first worker.
*
* - Run "npm run dev" in your terminal to start a development server
* - Open a browser tab at http://localhost:8787/ to see your worker in action
* - Run "npm run deploy" to publish your worker
*
* Learn more at https://developers.cloudflare.com/workers/
*/
export default {
async fetch(request, env) {
// 将传入的请求 URL 转换为一个 URL 对象
const url = new URL(request.url);
// 从路径中查找和替换 `v1` 为 `v1beta`
url.pathname = url.pathname.replace(/^\/v1\//, '/v1beta/');
// 更改 URL 的主机部分(域名)为 'generativelanguage.googleapis.com'
url.host = 'generativelanguage.googleapis.com';
let newRequestInit = {
method: request.method,
headers: new Headers(request.headers),
// 保持请求的其他属性,例如 credentials, cache 等(如果需要)
// 可以根据具体需求添加
};
// 检查请求路径中是否包含 'gemini-2.0-flash-exp'
if (url.pathname.includes('gemini-2.0-flash-exp')) {
try {
// 解析原始请求的 JSON body
const originalBody = await request.json();
originalBody.safetySettings = [
{"category": "HARM_CATEGORY_HARASSMENT", "threshold": "BLOCK_NONE"},
{"category": "HARM_CATEGORY_HATE_SPEECH", "threshold": "BLOCK_NONE"},
{"category": "HARM_CATEGORY_SEXUALLY_EXPLICIT", "threshold": "BLOCK_NONE"},
{"category": "HARM_CATEGORY_DANGEROUS_CONTENT", "threshold": "BLOCK_NONE"},
{"category": "HARM_CATEGORY_CIVIC_INTEGRITY", "threshold": "BLOCK_NONE"}
];
// 添加 "tools": [{"googleSearch": {}}] 到请求体
const modifiedBody = {
...originalBody,
tools: [{
"google_search": {}
}]
};
// 将修改后的 JSON 重新序列化为字符串
const bodyString = JSON.stringify(modifiedBody);
// 设置新的请求体和相应的头部
newRequestInit.body = bodyString;
// 确保 'Content-Type' 是 'application/json'
newRequestInit.headers.set('Content-Type', 'application/json');
} catch (error) {
// 如果解析失败或其他错误,您可以选择如何处理
// 例如,返回错误响应或继续不修改请求
return new Response('Invalid JSON body', { status: 400 });
}
} else {
// 如果不需要修改 body,可以直接使用原始请求的 body
newRequestInit.body = request.body;
}
// 创建一个新的请求对象,并使用更新后的 URL 以及新的请求初始化选项
const newRequest = new Request(url, newRequestInit);
// 使用 fetch 函数发送新的请求,等同于将请求代理到了新的主机
return fetch(newRequest);
}
}