ollama 配置
大约 2 分钟
接口文档: https://github.com/ollama/ollama/blob/main/docs/api.md
ollama配置
默认模型保存位置
- macOS:
~/.ollama/models
- Linux:
/usr/share/ollama/.ollama/models
- Windows:
C:\Users\<username>\.ollama\models
修改模型保存位置
windows
添加一个系统环境变量:OLLAMA_MODELS
OLLAMA_HOST=0.0.0.0
OLLAMA_MODELS=D:\ollama\models
setx OLLAMA_HOST "0.0.0.0:11434"

允许远程访问
linux
找到配置文件
cd /etc/systemd/system
sudo vim ollama.service
添加一个环境变量: OLLAMA_MODELS=<youpath:/data/ollama/models>
记得用 ;
号分隔 path
[Unit]
Description=Ollama Service
After=network-online.target
[Service]
ExecStart=/usr/local/bin/ollama serve
User=ollama
Environment="OLLAMA_HOST=0.0.0.0" // 允许远程访问
Environment="OLLAMA_ORIGINS=*" // 允许跨域
Group=ollama
Restart=always
RestartSec=3
Environment="OLLAMA_MODELS=/data/ollama/models;PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/go/bin"
[Install]
WantedBy=default.target
重启一下
sudo systemctl restart ollama
larvel sse 输出
public function ollama()
{
$prompt = \request()->input("prompt","你是谁");
return response()->stream(function () use($prompt){
$this->client = new Client();
$url = 'http://127.0.0.1:11434/api/generate'; // OpenAI接口URL
// 请求头
$headers = [
// 'Authorization' => 'Bearer ' . $this->apiKey,
// 'Content-Type' => 'application/json',
];
// 请求体
$body = json_encode([
"model"=> "deepseek-r1:7b",
"prompt"=> $prompt, //"为什么天空是蓝色的?",
"stream"=> true,
]);
// 使用流式响应
$response = $this->client->post($url, [
'headers' => $headers,
'body' => $body,
'stream' => true, // 启用流式响应
]);
// 读取响应流并实时打印
$body = $response->getBody();
// 禁用 PHP 输出缓冲,确保实时输出
ob_implicit_flush(true);
ob_end_flush();
// 使用输出缓冲,避免多次刷新浏览器
while (!$body->eof()) {
// 如果停止或这关闭页面
if (connection_aborted()) {
break;
}
$chunk = $body->read(1024); // 每次读取1024字节
$lines = explode("\n", $chunk);
foreach ($lines as $line) {
echo "data:".$line . "\n\n"; // 输出实时数据
$decoded = json_decode($line, true);
if ($decoded){
if ($decoded["done"] === true){
break;
}
}
flush();
}
}
}, 200, [
'Cache-Control' => 'no-cache',
'Content-Type' => 'text/event-stream',
'Connection' => 'keep-alive',
]);
}
前端接收
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Chat Page</title>
<style>
body {
font-family: Arial, sans-serif;
background-color: #f4f4f4;
margin: 0;
padding: 0;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
}
.chat-container {
width: 60%;
min-height: 500px;
background-color: #fff;
border-radius: 8px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
overflow: hidden;
display: flex;
flex-direction: column;
}
.chat-header {
background-color: #007bff;
color: #fff;
padding: 10px;
text-align: center;
}
.chat-messages {
flex: 1;
padding: 10px;
overflow-y: auto;
}
.chat-input {
display: flex;
border-top: 1px solid #ddd;
}
.chat-input input {
flex: 1;
padding: 10px;
border: none;
outline: none;
}
.chat-input button {
padding: 10px;
border: none;
background-color: #007bff;
color: #fff;
cursor: pointer;
}
.chat-input button:hover {
background-color: #0056b3;
}
.message {
margin: 10px 0;
padding: 10px;
border-radius: 5px;
max-width: 70%;
}
.message.sent {
background-color: #dcf8c6;
align-self: flex-end;
}
.message.received {
background-color: #f1f0f0;
align-self: flex-start;
}
</style>
</head>
<body>
<div class="chat-container">
<div class="chat-header">
Chat with us
</div>
<div class="chat-messages" id="chat-messages"></div>
<div class="chat-input">
<input type="text" id="message-input" placeholder="Type a message...">
<button onclick="sendMessage()">Send</button>
</div>
</div>
<script>
function sendMessage() {
const input = document.getElementById('message-input');
const message = input.value.trim();
if (message === '') return;
// Create a new message element
const messageElement = document.createElement('div');
messageElement.classList.add('message', 'sent');
messageElement.textContent = message;
// Append the message to the chat messages container
const chatMessages = document.getElementById('chat-messages');
chatMessages.appendChild(messageElement);
// Clear the input field
input.value = '';
// Simulate a received message
var source = new EventSource("/demo/ollama?prompt="+message); // 接口地址
const receivedMessageElement = document.createElement('div');
source.onmessage = function (event) {
receivedMessageElement.classList.add('message', 'received');
// receivedMessageElement.append(event.data);
let res = JSON.parse(event.data)
receivedMessageElement.append(res.response || '');
chatMessages.appendChild(receivedMessageElement);
chatMessages.scrollTop = chatMessages.scrollHeight;
};
source.onerror = function (event) {
console.log(event);
source.close()
};
}
</script>
</body>
</html>