申请google gemini免费apikey打造本地多模态ai聊天助手笔记

google最近更新了gemini-1.5-pro,200万的上下文tokens,听说效果直接秒杀gpt4o等主流大模型,而且还是免费可申请apikey使用,今天我也来申请一个:
先申请一个gemini的apikey:申请地址:https://aistudio.google.com/app/apikey?pli=1

gemini提示词库:https://ai.google.dev/gemini-api/prompts?hl=zh-cn
gemini api文档:https://ai.google.dev/gemini-api/docs/get-started/tutorial?lang=python&hl=zh-cn
由于国外的封锁,所有国内无法直接访问gemini的api接口,cloudflare worker由于国内访问的是香港的worker,所有也在被限制了
现在有两种解决办法:
1、使用vertex ai来调用gemini api
申请教程可以参考:点击打开链接
具体的worker代码和客户端调用代码我放在文章后面。
2、在未限制ip的国家租用虚拟主机,自己搭建gemini代理
去阿里云上购买一个其他国家的ecs服务器,例如日本,然后安装nodejs,在nodejs下运行以下代码搭建代理
const http = require('http');
const httpProxy = require('http-proxy');
// 创建一个代理服务器实例
const proxy = httpProxy.createProxyServer({
ws: true,
changeOrigin: true,
secure: false
});
// 修改请求头中的 Host 字段
proxy.on('proxyReq', (proxyReq, req, res, options) => {
proxyReq.setHeader('Host', 'generativelanguage.googleapis.com');
});
// 创建一个HTTP服务器
const server = http.createServer((req, res) => {
// 设置目标服务器地址
const target = 'https://generativelanguage.googleapis.com';
// 添加跨域头
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
// 处理预检请求
if (req.method === 'OPTIONS') {
res.writeHead(204);
res.end();
return;
}
// 代理请求到目标服务器
proxy.web(req, res, { target });
});
// 处理代理服务器错误
proxy.on('error', (err, req, res) => {
console.error('Proxy error:', err);
res.writeHead(500, {
'Content-Type': 'text/plain'
});
res.end('Something went wrong. Please try again later.');
});
// 启动服务器,监听端口8000
server.listen(8000, "0.0.0.0", () => {
console.log('Proxy server is running on http://localhost:8000');
});客户端调用代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum=1.0,minimum=1.0,user-scalable=0" />
<title>BFW NEW PAGE</title>
</head>
<body>
<script type="module">
const API_KEY = "";//官网
const response = await fetch(`https://代理服务器域名/v1beta/models/gemini-1.5-flash:streamGenerateContent?alt=sse&key=`+API_KEY, {
body: JSON.stringify({
"contents": [
{
"role": "user",
"parts": [
{"text":"hello"}
]
}
],
"generationConfig": {
"maxOutputTokens": 8192,
"temperature": 1,
"topP": 0.95,
},
"safetySettings": [
{
"category": "HARM_CATEGORY_HATE_SPEECH",
"threshold": "BLOCK_MEDIUM_AND_ABOVE"
},
{
"category": "HARM_CATEGORY_DANGEROUS_CONTENT",
"threshold": "BLOCK_MEDIUM_AND_ABOVE"
},
{
"category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
"threshold": "BLOCK_MEDIUM_AND_ABOVE"
},
{
"category": "HARM_CATEGORY_HARASSMENT",
"threshold": "BLOCK_MEDIUM_AND_ABOVE"
}
],
}),
method: 'POST',
headers: {
'content-type': 'application/json',
}
});
// 检查响应状态码
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}${response.statusText}`);
}
// 将响应体设置为可读流,并逐步输出数据到可写流
const reader = response.body.getReader();
const decoder = new TextDecoder();
const textDecoder = new TextEncoder();
while (true) {
const { done, value } =await reader.read();
if (done) {
break;
}
const chunk = decoder.decode(value);
const lines = chunk.split('\n').filter(line => line.trim() !== '');
// Process each line
for (const line of lines) {
// Remove the "data: " prefix from the line
const message = line.replace(/^data: /, '');
// console.log(message)
const content = JSON.parse(message).candidates[0].content.parts[0].text;
if(content!=undefined){
console.log(content)
}
}
}
</script>
看console
</body>
</html>
点击查看cloudflare worker与浏览器调用代码
网友评论