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

TIFF文件渲染避坑指南:Three.js与Cesium的5个关键差异点

本文深入对比了Three.js与Cesium在渲染TIFF文件时的5个核心差异点,包括坐标系处理、内存管理、着色器系统、性能优化策略和错误处理机制。重点解析了Cesium的全球WGS84坐标系与Three.js局部坐标系对地理空间数据渲染的根本影响,并提供了针对性的性能优化与调试方案,帮助开发者根据项目需求选择合适的3D引擎并有效避坑。

weixin_29243279的博客 334

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

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

aocaiti5781的博客 353

深入解析“PROJ: proj_create_from_database: Cannot find proj.db”错误:从环境配置到打包实战

本文深入解析了“PROJ: proj_create_from_database: Cannot find proj.db”错误的根源与解决方案,涵盖环境配置、PyInstaller打包及跨平台兼容性处理。通过详细分析PROJ库路径问题及GDAL依赖关系,提供动态路径设置、资源文件打包等实战技巧,帮助开发者高效解决地理数据处理中的常见错误。

weixin_29074409的博客 446

Android 集成 Google 与 Facebook 第三方登录实战详解(2024版)

本文详细介绍了2024年Android应用集成Google与Facebook第三方登录的完整实战指南。通过分步教程和代码示例,帮助开发者快速实现一键登录功能,提升用户体验和注册转化率,同时涵盖隐私合规和常见错误处理的最佳实践。

blue的专栏 822

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

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

chunqingtai2922的博客 654

画了多年板子才搞懂:Allegro内电层负片连接,Thermal Relief和Anti-Pad避坑全解析

本文深入解析Allegro内电层设计中Thermal Relief与Anti-Pad的关键技术要点,帮助工程师避免常见设计陷阱。通过六层板实战案例,详细阐述负片连接逻辑、热风焊盘参数设计及隔离盘优化策略,提升PCB设计的可靠性与EMI性能。

weixin_28731223的博客 265

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

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

weixin_34185320的博客 360

2024.6.10丨基于DIAMOND与VFDB数据库的致病菌毒力因子高效注释指南

本文详细介绍了基于DIAMOND与VFDB数据库的致病菌毒力因子高效注释方法,涵盖工具安装、参数优化、数据库选择及实战案例解析。通过DIAMOND的快速比对和VFDB的全面毒力因子数据,显著提升微生物基因组研究效率,适用于临床检测、食品安全监测等多个场景。

weixin_33712987的博客 376

word2vector入门教程

摘要: 网上已经有许多对w2v的介绍了,这里只是做一个简单的概括。下面这篇文章我认为是关于W2V写的比较好的文章,读者有兴趣可以先参考一下: w2v参考文章1 另外一篇是关于Skip-Gram和CBow的介绍。 Skip-Gram&CBOW 逻辑比较清晰的综述文章: 综述文章 数学原理很清晰很短的一篇文章(也有关于负采样的简单说明) 参考文章 1.什么

SCUT_Sam 1万+

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

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

weixin_34184158的博客 441

计算机视觉-深度学习图像检测方法梳理

计算机视觉-深度学习图像检测方法梳理 由于之后要转方向啦,趁这段时间整理手中硕士研究方向的一些阅读笔记,这是一篇关于计算机视觉的基础知识梳理 先搞清一些小知识点 首先我们要弄清楚图像分类、目标定位、语义分割、实例分割的区别 a. 图像分类 :给定一张输入图像,图像分类任务旨在判断该图像所属类别; b. 目标定位 :在图像分类的基础上,我们还想知道图像中的目标具体在图像的什么位置,通常是以包围盒的(bounding box)形式; c. 语义分割 :语义分割是目标检测更进阶的任务,目标检测只需要框出每个目

qq_41662991的博客 9953

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

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

weixin_34221332的博客 428

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

蓝牙模块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、付费专栏及课程。

余额充值