使用类似one-api进行转发Gemini api的时候,没办法设置v1beta路由,所以使用cf Workers转发一遍,以非标准路由。
支持 gemini-2.0-flash-exp 模型进行联网
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();
// 添加 "tools": [{"googleSearch": {}}] 到请求体
const modifiedBody = {
...originalBody,
tools: [
{
googleSearch: {}
}
]
};
// 将修改后的 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);
}
}


