HTML 之 ollama流式API客户端 -generate模式

开源模型应用落地-工具使用篇-Ollama(六) Ollama集成QWen1.5系列模型,全网唯一,绝非搬运。 阅读详情

环境变量设置如下:
set OLLAMA_HOST=0.0.0.0:8888
set OLLAMA_ORIGINS=*

ollama流式API客户端

<!DOCTYPE html>
<html lang="zh-CN">
	<head>
		<meta charset="UTF-8">
		<!-- 添加viewport标签确保移动端正确缩放 -->
		<meta name="viewport" content="width=device-width, initial-scale=1.0">
		<title>AI-generate模式</title>
		<style>
			body {
				font-family: 'Segoe UI', Arial, sans-serif;
				background: #f0f2f5;
				margin: 0;
				min-height: 100vh;
				/* 改为min-height避免内容溢出 */
				display: flex;
				justify-content: center;
				align-items: center;
			}

			.container {
				width: 95vw;
				/* 增加宽度占比 */
				height: 95vh;
				display: flex;
				flex-direction: column;
				gap: 10px;
				/* 缩小间隙 */
				padding: 5px;
				/* 添加内边距 */
			}

			#output {
				flex: 1;
				width: calc(100% - 10px);
				/* 考虑内边距 */
				min-height: 50%;
				padding: 12px;
				font-size: 16px;
				/* 增大字体 */
				border: 2px solid #e3e8ee;
				border-radius: 6px;
				background: white;
				resize: none;
				overflow-y: auto;
				/* 确保滚动条可用 */
			}

			.input-group {
				display: flex;
				flex-direction: column;
				/* 改为垂直布局 */
				gap: 8px;
				height: auto;
				/* 自动高度 */
			}

			#input {
				width: calc(100% - 10px);
				min-height: 80px;
				/* 更适合移动端的高度 */
				padding: 10px;
				font-size: 16px;
				border: 2px solid #e3e8ee;
				border-radius: 6px;
				resize: vertical;
				/* 允许垂直调整 */
			}

			button {
				padding: 12px 20px;
				background: #007bff;
				color: white;
				border: none;
				border-radius: 6px;
				font-size: 16px;
				cursor: pointer;
				transition: background 0.2s;
				touch-action: manipulation;
				/* 优化触摸响应 */
			}

			/* 新增按钮容器样式 */
			.button-row {
				display: flex;
				gap: 8px;
				width: 100%;
			}

			/* 发送按钮宽度设置 */
			button[onclick="sendMessage()"] {
				flex: 1;
				/* 占据剩余空间 */
				width: 80%;
			}

			button:active {
				background: #0056b3;
			}

			/* 新增图标按钮样式 */
			button.icon-button {
				padding: 12px;
				width: 20%;
				min-width: 60px;
				/* 防止过小 */
				/* 固定宽度 */
				background: #28a745;
				display: flex;
				justify-content: center;
				align-items: center;
			}

			/* 调整按钮组间距 */
			.button-group {
				display: flex;
				gap: 8px;
				margin-top: 8px;
			}

			.icon-button {
				position: relative;
			}

			/* 喇叭图标样式 */
			.icon-button svg {
				width: 24px;
				height: 24px;
				fill: white;
				transition: opacity 0.3s;
			}

			.icon-button .off-icon {
				position: absolute;
				opacity: 0;
			}

			/* 激活状态 */
			.icon-button.active .on-icon {
				opacity: 0;
			}

			.icon-button.active .off-icon {
				opacity: 1;
			}

			/* 颜色变化 */
			.icon-button.active {
				background: #dc3545;
			}

			/* 手机端响应式调整 */
			@media (max-width: 480px) {
				.container {
					width: 100vw;
					height: 100vh;
					padding: 5px;
				}

				#output {
					font-size: 15px;
					padding: 10px;
				}

				#input {
					font-size: 15px;
					min-height: 70px;
				}

				button {
					padding: 15px 20px;
					/* 增大点击区域 */
					font-size: 15px;
				}

				button.icon-button {
					padding: 10px;
					width: 44px;
				}

				.icon-button svg {
					width: 22px;
					height: 22px;
				}
			}
		</style>
	</head>
	<body>
		<div class="container">
			<textarea id="output" readonly placeholder="结果将显示在这里..."></textarea>
			<div class="input-group">
				<textarea id="input" rows="2" placeholder="输入命令(/clear 清空)Shift+Enter换行"></textarea>
				<div class="button-row">
					<button onclick="sendMessage()">发送</button>
					<button class="icon-button" onclick="playSound(this)">
						<svg class="on-icon" viewBox="0 0 24 24">
							<path fill="currentColor"
								d="M15 3v18l-5-4H4V7h6l5-4zm3.5 5.5c1-1 2.5-1.5 4-1.5v3c-.6 0-1.2.2-1.7.5l-2.3-2zm2.3 7.7c.8-.6 1.5-1.5 1.9-2.7h-3c-.1.5-.3 1-.7 1.4l1.8 1.3z" />
						</svg>

						<svg class="off-icon" viewBox="0 0 24 24">
							<path fill="currentColor"
								d="M15 3v18l-5-4H4V7h6l5-4zm7.1 14.7l-1.4-1.4-3.6-3.6-3.6 3.6-1.4-1.4 3.6-3.6-3.6-3.6 1.4-1.4 3.6 3.6 3.6-3.6 1.4 1.4-3.6 3.6 3.6 3.6z" />
						</svg>
					</button>
				</div>
			</div>
		</div>

		<script>
			const outputDiv = document.getElementById('output');

			let isSpeaking = false;
			let currentUtterance = null;

			document.addEventListener("DOMContentLoaded", function() {
				document.addEventListener("keydown", function(event) {
					if (event.key === "Enter") {
						sendMessage();
						event.preventDefault();
					}
				});
			});

			function playSound(btn) {
				return new Promise((resolve) => { // 返回 Promise
					const content = outputDiv.value.split('AI:');
					if (!isSpeaking) {
						if (content) {
							// 创建语音实例
							currentUtterance = new SpeechSynthesisUtterance(content[content.length - 1]);
							currentUtterance.lang = 'zh-CN';

							// 语音结束回调
							currentUtterance.onend = () => {
								isSpeaking = false;
								btn.classList.toggle('active');
								resolve(); // 异步完成,通知外部
							};

							window.speechSynthesis.speak(currentUtterance);
							isSpeaking = true;
							btn.classList.toggle('active');
						} else {
							resolve(); // 无内容时直接 resolve
						}
					} else {
						window.speechSynthesis.cancel();
						isSpeaking = false;
						btn.classList.toggle('active');
						resolve(); // 异步完成,通知外部
					}
				});
			}

			// 添加 HTML 转义函数
			const sanitizeHTML = (str) => {
				const div = document.createElement('div');
				div.textContent = str.replace(/\s/g, '');
				return div.innerHTML;
			};

			function sendMessage() {
				const input = document.getElementById('input').value;
				document.getElementById('input').value = '';
				outputDiv.value += `\n\n您:${sanitizeHTML(input)}\n\nAI:\n`;
				outputDiv.scrollTop = outputDiv.scrollHeight;
				if (input.trim() === '/clear') {
					outputDiv.value = '';
					return;
				}

				const url = "http://192.168.0.223:8888/api/generate";
				const data = {
					model: "deepseek-r1:8b",
					prompt: input
				};

				fetch(url, {
						method: 'POST',
						headers: {
							'Content-Type': 'application/json'
						},
						body: JSON.stringify(data),
						mode: 'cors'
					})
					.then(response => {
						if (!response.ok) throw new Error(`HTTP错误: ${response.status}`);

						const reader = response.body.getReader();
						const decoder = new TextDecoder('utf-8');
						let prevChunk = '';

						return new ReadableStream({
							start(controller) {
								function pushChunk() {
									reader.read().then(({
										done,
										value
									}) => {
										if (done) {
											controller.close();
											return;
										}

										const chunk = decoder.decode(value, {
											stream: true
										});
										const combined = prevChunk + chunk;
										const split = combined.split('\n');
										prevChunk = split.pop() || '';

										split.forEach(line => {
											try {
												const parsed = JSON.parse(line);
												const text = parsed.response;
												outputDiv.value += text; // 将结果追加到文本框
												// 滚动到底部
												outputDiv.scrollTop = outputDiv.scrollHeight;
											} catch (e) {
												console.error('解析错误:', e);
											}
										});

										controller.enqueue(value);
										pushChunk();
									});
								}
								pushChunk();
							}
						});
					})
					.then(() => console.log('流式处理完成'))
					.catch(error => {
						outputDiv.value += `错误:${error.message}\n`; // 错误信息也显示在文本框
					});
			}
		</script>
	</body>
</html>

Python调用Ollama API实现本地大模型工程化落地 本地大模型部署的核心在于将Ollama从命令行玩具升级为可集成、可监控、可扩展的HTTP服务组件。其底层基于标准RESTful API(如/api/chat、/api/generate、/api/embeddings),通过Python生态(requests、httpx、FastAPI)实现低门槛接入与高可靠性调度。结合token精准截断、流式响应容错、嵌入向量检索等关键技术,可支撑Excel自动摘要、工单分类、语义搜索等真实业务场景。Ollama服务本质是轻量级HTTP守护进程,Python调用的关键不是 阅读详情

相关推荐

手撸简易Agent:Ollama+Docker实现流式多轮本地对话

Agent 是大语言模型从‘能说’走向‘能做’的关键范式,其核心原理在于状态维护、模型调用与响应编排。技术价值体现在降低LLM应用门槛、提升交互实时性与部署可控性。典型应用场景包括企业内部工具自动化、离线环境智能助手及AI原型快速验证。本文聚焦轻量级落地路径,摒弃LangChain等重型框架,基于Ollama本地模型服务与Docker环境封装,实现可调试、可复现的流式多轮对话系统,全程强调透明性与工程可操作性,特别适配Windows/Mac/Linux多平台本地开发与客户现场离线部署需求。

weixin_34203832的博客 367

从0打造本地聊天机器人:如何实现大模型流式输出?OpenAI+Ollama 实战

本文带大家实操大模型流式输出,在 OpenAI 和 Ollama API 中的具体实现。

u010522887的专栏 3458

FastAPI与ollama大模型异步流式响应实战

异步编程是现代Web开发的核心技术,通过事件循环机制实现高并发处理。Python的asyncio库提供了原生的异步支持,而FastAPI作为基于ASGI的异步Web框架,天然适合处理IO密集型任务。在实际工程中,将大模型服务如ollama与Web框架集成时,流式响应(StreamingResponse)能显著提升用户体验,避免长时间等待。本文通过FastAPI+ollama的实战案例,详解如何用httpx实现异步HTTP客户端,处理模型推理的流式输出,并解决异步编程中的常见陷阱,为AI服务集成提供可靠方案。

weixin_34128839的博客 435

在HTML页面通过JavaScript访问Ollama本地部署的DeepSeek

在HTML页面通过JavaScript访问Ollama本地部署的DeepSeek

叶疏鸿的博客 1585

Ollama本地部署AI大模型:从零搭建私有化ChatGPT环境

大语言模型(LLM)作为人工智能领域的核心技术,通过Transformer架构实现了对自然语言的深度理解与生成。其工作原理基于海量文本数据的预训练和微调,使模型能够捕捉语言的内在规律。这一技术价值在于将通用智能能力封装为可调用的服务,为开发者提供了强大的自然语言处理工具。在实际应用场景中,大模型常被用于智能对话、代码生成、内容创作等任务。本文聚焦于通过Ollama工具实现大模型的本地化部署,重点解决了数据隐私和无限免费调用两大痛点。Ollama作为轻量级部署框架,支持Llama、通义千问等主流模型,并提供O

weixin_30838873的博客 416

Codex接入国产大模型实战指南:OpenAI API兼容性配置全解析

Codex作为本地化AI编程协作者,其核心能力源于对OpenAI v1 API规范的严格遵循,而非绑定特定云厂商。理解API协议(/v1/chat/completions端点)、认证机制(Bearer Token)、流式响应(SSE格式)三大技术原理,是实现Qwen、DeepSeek等国产大模型无缝接入的前提。该架构设计赋予开发者高度可塑性——只需轻量级代理层做请求/响应格式转换,即可将任意国产模型服务‘标准化’接入。典型应用场景包括本地Ollama部署Qwen2-7B、vLLM托管DeepSeek-VL、

weixin_30352645的博客 670

ollama接口调用

(float, 可选): 控制生成文本的随机性。值越低,生成的文本越确定。(array of strings, 可选): 指定停止生成的条件。(array of integers, 可选): 上下文 token 列表,用于保持对话或生成的一致性。(integer, 可选): 限制采样时考虑的 top-k 词汇数量。(integer, 可选): 生成文本的最大长度(以 token 为单位)。(integer, 可选): 随机种子,用于控制生成的可重复性。(integer): 生成评估的 token 数量。

每天学习一点点 2651

使用Nginx反向代理与JWT认证加固本地Ollama大模型服务

在Web服务架构中,反向代理是提升应用安全性与可扩展性的关键技术,它通过接收客户端请求并转发至后端服务器,实现了网络层的隔离与负载均衡。其核心原理在于隐藏后端服务的真实地址,并作为统一的流量入口。结合应用层的身份认证机制,如JWT(JSON Web Token),可以构建起从网络到应用的双重安全防线。JWT作为一种自包含、可验证的令牌标准,通过数字签名确保信息完整性与来源可信,是实现无状态认证的理想选择。这种“反向代理+JWT认证”的模式,在API服务化、微服务网关等场景下具有极高的技术价值,能有效解决服务

weixin_30463341的博客 336

从 HTTP 到 Ollama API

HTTP,全称为超文本传输协议(HyperText Transfer Protocol),是互联网上应用最为广泛的一种网络协议。它是客户端和服务器之间进行通信的规则集合,允许将超文本标记语言(HTML)文档从Web服务器传输到Web浏览器。简而言之,HTTP是Web浏览器和Web服务器之间的“语言”,使得用户能够浏览网页、下载文件、提交表单等。比如:- 你发一个''请求''(比如“请帮我生成一段文字”)。- 服务器返回一个 **响应**(模型生成的文字)。

2501_94085327的博客 573

本地部署Gemma 4V:实测截图转HTML,小显存也能跑的多模态AI应用

多模态大语言模型通过融合视觉与文本理解能力,能够解析图像内容并生成结构化输出。其核心原理在于将图像编码为视觉特征向量,并与文本特征在统一的语义空间中对齐,从而实现跨模态的理解与生成。这一技术为自动化内容生成和界面开发带来了新的可能性,尤其适用于将视觉设计快速转化为前端代码等场景。本文聚焦于Google的轻量级视觉模型Gemma 4V,探讨其作为本地化“截图转HTML”生产力工具的实际效能。通过Ollama工具链,即使在RTX 4060等8GB显存的消费级显卡上也能流畅部署运行。实测表明,该模型能有效识别常见

weixin_34138056的博客 373

Ollama本地部署实战:从下载到接入IDE、Web和API

大模型通常依赖云端API,但本地部署正在成为开发者保护隐私、降低调用成本的新选择。Ollama作为一款轻量级大模型运行时管理器,让开发者可以像使用Docker一样便捷地拉取、运行和调用开源大模型。它通过将模型权重量化后加载至本地GPU/CPU,以HTTP服务暴露推理能力,从而实现数据的完全本地化处理。实际工程中,无论是将Ollama接入IDE实现代码补全与问答,还是通过OpenAI兼容或原生API构建Web应用,亦或在内网环境共享模型能力,其技术逻辑都围绕模型管理、服务端口、上下文长度与并发资源调整展开。本

weixin_28835583的博客 245

Llama-3.2-3B实战教程:Ollama部署+REST API封装+前端集成全流程

本文介绍了如何在星图GPU平台上自动化部署【ollama】Llama-3.2-3B镜像,快速构建轻量级大语言模型服务。依托该平台,用户可一键完成模型拉取、API服务启动与前端集成,典型应用于智能客服问答、周报自动生成及代码解释等文本生成任务,显著降低本地大模型落地门槛。

weixin_32836713的博客 340

torchsparse安装

torchsparse安装以及安装失败原因分析和解决

AI_BING_的博客 1万+

Ollama+Llama2中文本地部署实战指南

大模型本地化部署是AI工程落地的关键环节,其核心在于运行时环境与基座模型的协同优化。Ollama作为轻量级本地推理运行时,通过抽象CUDA/Metal适配、GGUF量化加载、KV Cache管理及标准API网关,显著降低GPU依赖与系统配置复杂度;Llama 2则凭借明确的商业授权、成熟的GGUF生态及丰富的中文微调模型(如llama2-chinese),成为当前最务实的开源基座选择。技术价值体现在‘开箱即用’的稳定性与跨硬件兼容性,广泛应用于客服知识库问答、合同条款解析、边缘设备日志分析等低延迟、高合规要

aocaiti5781的博客 353

R语言计算植物群落重要值:从基础概念到优势种判定

在植被生态学研究中,重要值是衡量物种在群落中地位的核心指标,它综合了相对多度、相对频度与相对显著度三个维度,能够客观反映物种的数量优势、分布广度与空间占据能力。理解重要值的生态学逻辑,是开展群落分类、优势种判定及多样性分析的基础。而R语言凭借其批量处理、可复现和与后续多元统计无缝衔接的优势,成为生态学研究者处理样方数据的高效工具。从野外记录的宽表到标准化长表,再到分组汇总计算相对指标,R语言能够显著提升数据处理效率与准确性。本文以实测群落数据为例,系统梳理重要值的两种算法口径、基于dplyr和tidyr的完

weixin_42634811的博客 269

零代码做游戏:AI辅助开发HTML5网页小游戏从创意到发布全流程

在软件开发领域,自然语言编程正成为一种新兴的人机协作方式,而AI辅助开发则是其最典型的落地形态。它让开发者无需精通语法,只需用清晰的语言描述游戏规则与交互逻辑,AI便能自动生成可运行的代码。这种模式大幅降低了编程门槛,尤其适合快速验证创意、制作原型。对于HTML5网页游戏而言,借助AI生成单个HTML文件,配合在线运行环境,即可在浏览器中直接试玩、迭代与分享。无论是产品经理验证玩法、运营人员制作互动小游戏,还是教育者设计课堂闯关,都能通过自然语言描述需求,让AI完成代码实现与报错修复。本文完整记录了一个“接

weixin_31497453的博客 337

Gemma本地编程助手:Ollama+Gradio离线部署实战

大语言模型本地化部署是当前开发者关注的核心技术趋势,尤其在代码理解、隐私保护与低延迟交互等工程场景中价值凸显。其原理在于通过轻量级模型(如Gemma 2B)结合高效推理运行时(Ollama)与快速前端封装(Gradio),实现无需联网、不传代码、可审计可控的AI辅助开发。技术价值体现在资源占用低(1.8GB模型)、中文代码理解准确率高(89.2%)、响应实时性强(流式token输出),适用于Python学习反馈、现场运维调试及金融/政企等强合规环境下的代码分析。本文聚焦Gemma本地推理与Gradio界面封

chunqingtai2922的博客 654

深度学习环境搭建以及DeepLabCut安装过程

文章目录 一、查询电脑硬件 安装GeForce驱动程序 二、环境搭建与软件安装 1.安装CUDA运算平台软件 2.安装cuDNN支持包 3.配置环境变量 三、 DeepLabCut环境配置 1.安装Anaconda 2.创建容器环境 3.激活容器环境 4.安装TensorFlow 5.验证TensorFlow是否安装成功 6...

m0_51136557的博客 3159

C#轻量图像生成工具:Ollama本地多模态工作流实践

图像生成工具是AI应用落地的关键中间件,其核心在于模型调用、提示词工程与跨平台部署的协同优化。本文围绕基于C#构建的本地化图像生成服务展开,深入解析如何通过Ollama统一抽象层对接Flux、SDXL等主流开源模型,结合离线Codex提示词增强实现中英文语义对齐,并依托.NET 6+对macOS ARM64的原生支持,达成免依赖、低内存、高确定性的端侧部署。技术价值体现在降低多模态集成门槛、规避Python生态碎片化、适配M1/M2 Mac mini等边缘算力设备。典型应用场景包括电商主图批量生成、.NET

weixin_34185320的博客 360

OpenClaw插件配置错误修复完全指南

插件文件名是插件目录结构正确package.json配置正确OpenClaw的插件系统还在快速迭代,偶尔会遇到这种配置问题。看错误信息检查配置文件检查实际文件对比差异修复问题大部分问题都能解决。查看官方文档:https://openclaw.ai/docs提Issue:https://github.com/openclaw/openclaw/issues加入Discord社区求助快速修复命令汇总。

Maynor的博客 4097

ESP32 DW1000 UWB 室内定位系统

详细介绍ESP32 DW1000 UWB 室内定位系统的设计演示demo。

DT程序员的博客 1662

Ollama WebUI安全加固实战:CSRF防护与输入过滤方案详解

在Web应用开发中,安全防护是保障服务稳定与数据安全的核心环节。其基本原理在于对用户请求进行多层次的验证与过滤,防止恶意输入与未授权操作。从技术价值看,有效的安全措施能显著降低应用被攻击的风险,保护用户数据与系统资源。尤其在本地AI工具链部署场景中,如运行Ollama及其WebUI进行模型管理与对话时,基础安全加固常被忽视。本文聚焦于CSRF(跨站请求伪造)攻击与输入过滤缺失两大常见漏洞,通过剖析其利用原理,并结合Ollama自定义镜像(如daily_stock_analysis)的典型架构,提供一套可嵌入

weixin_34184158的博客 441

LangGraph教程8:LangGraph流式处理

流式处理可显著提升基于LLM应用的响应性。LangGraph支持两种流式模式:values模式返回每一步的完整结果,适合需要完整上下文处理的场景;updates模式仅返回增量变化,适用于实时更新需求。示例代码展示了如何用create_react_agent实现这两种模式,其中values模式完整记录处理流程,updates模式逐步输出结果。通过异步迭代输出流,开发者可以灵活选择适合应用场景的流式处理方式。

Cachel Wood的博客 623

笔记工具集成AI大脑:本地部署与插件开发实战

大语言模型(LLM)通过模拟人类语言理解和生成,正深刻改变信息处理方式。其核心原理基于Transformer架构,通过海量数据训练获得强大的上下文理解和生成能力。在工程实践中,将AI能力集成到现有工作流,而非替代原有工具,成为提升效率的关键。这涉及到API调用、提示词工程和本地化部署等技术。具体到知识管理场景,通过本地部署Ollama等服务,并结合笔记软件(如Obsidian)的插件系统,可以构建一个数据完全本地、无缝集成的智能辅助环境。这种方案不仅解决了隐私和安全顾虑,还能实现文本总结、内容扩写和代码生成

weixin_34221332的博客 428

YOLOv13添加轻量化的EMA模块Faster_EMA,轻量又涨点!map50提升4.56个点,召回率提升9.66!

本文介绍了YOLOv13模型的优化移植方法,通过添加Faster_EMA模块和超参数调整,使模型性能显著提升。主要修改包括:1) 创建新的模型配置文件yolov13-Faster_EMA.yaml;2) 在tasks.py中添加新模块;3) 修改__init__.py和block.py文件,新增Partial_conv3和DropPath类。优化后模型mAP50提升4.56%,召回率提升9.66%,验证了改进方案的有效性。代码实现了局部卷积和随机深度等先进技术,为YOLO系列模型性能优化提供了新思路。

FJN110的博客 2606

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

上一篇: HTML 之 MP3复读器
下一篇: HTML 之 ollama流式API客户端 -chat模式
小6哥
博客等级 码龄18年 16粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值