首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >iOS开发之如何开发一款Ollama客户端

iOS开发之如何开发一款Ollama客户端

作者头像
YungFan
发布于 2025-03-18 04:05:18
发布于 2025-03-18 04:05:18
14500
代码可运行
举报
文章被收录于专栏:学海无涯学海无涯
运行总次数:0
代码可运行

介绍

  • Ollama 是一个开源的本地 AI 模型运行平台,能够在用户的电脑上下载、安装与运行大型语言模型(LLMs)。
  • macOS/iOS 可以调用 Ollama 的客户端很多,如 Cherry Studio、Chatbox、ChatX、Enchanted、NextChat 等。如果想要自己动手开发一款原生 App,可以使用 ollama-swift ,它是一个 Swift 编写的开源库,可以与 Ollama API 进行交互,功能包括管理模型、嵌入、生成、聊天、工具等。

开发步骤

  1. 下载并安装 Ollama。
  2. 通过 Ollama 命令下载并运行大模型。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ollama run 模型名
  1. 设置 Ollama 可以对外提供服务。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
launchctl setenv OLLAMA_HOST "0.0.0.0"
launchctl setenv OLLAMA_ORIGINS "*"
  1. 创建 macOS/iOS 项目。
  2. 添加 ollama-swift
  3. 功能开发。

案例

以生成与聊天功能为例。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import Ollama
import SwiftUI

struct ContentView: View {
    @State private var userInput: String = "什么是SwiftUI?"
    @State private var response: String = ""
    @State private var isLoading: Bool = false
    // 默认http://localhost:11434
    let client = Client(host: URL(string: "http://192.168.0.43:11434")!, userAgent: "MyApp/1.0")
    @State private var messages: [Chat.Message] = [.system("你是一个得力的全能助手,可以帮我完成很多任务。")]
    var body: some View {
        VStack(spacing: 16) {
            // 顶部输入区域
            HStack {
                TextField("输入提示词...", text: $userInput)
                    .textFieldStyle(.roundedBorder)
                    .font(.system(size: 16))

                Button {
                    response = ""

                    Task {
                        do {
                            // response = try await generate()
                            // response = try await chatSingleAround()
                            response = try await chatMultipleAround()
                        } catch {
                            debugPrint(error)
                        }
                    }
                } label: {
                    Text("开始")
                        .foregroundStyle(.white)
                        .padding(.horizontal, 16)
                        .padding(.vertical, 8)
                        .background(userInput.isEmpty ? Color.gray : Color.blue)
                        .cornerRadius(8)
                }
                .buttonStyle(.borderless)
                .disabled(userInput.isEmpty || isLoading)
            }
            .padding(.horizontal)
            .padding(.top)

            // 分隔线
            Rectangle()
                .fill(Color.gray.opacity(0.2))
                .frame(height: 1)

            // 响应展示区域
            if response != "" {
                ResponseBubble(text: response)
            }

            Spacer()
        }

        if isLoading {
            ProgressView()
                .progressViewStyle(.circular)
                .padding()
        }
    }

    // 生成
    func generate() async throws -> String {
        isLoading = true
        let response = try await client.generate(
            model: "qwen:0.5b", // 模型
            prompt: userInput,
            stream: false
        )
        isLoading = false
        return response.response
    }

    // 单轮聊天
    func chatSingleAround() async throws -> String {
        isLoading = true
        let response = try await client.chat(
            model: "qwen:0.5b",
            messages: [
                .system("你是一个得力的全能助手,可以帮我完成很多任务。"),
                .user(userInput)
            ]
        )
        isLoading = false
        return response.message.content
    }
    
    // 多轮聊天
    func chatMultipleAround() async throws -> String {
        var response = ""
        isLoading = true
        // 1
        messages.append(.user("什么是SwiftUI?"))
        response.append("1.什么是SwiftUI?\n")
        let response1 = try await client.chat(
            model: "qwen:0.5b",
            messages: messages
        )
        response.append(response1.message.content)
        // 2
        messages.append(.user("SwiftUI和UIKit有什么区别?"))
        response.append("\n\n2.SwiftUI和UIKit有什么区别?\n")
        let response2 = try await client.chat(
            model: "qwen:0.5b",
            messages: messages
        )
        response.append(response2.message.content)
        isLoading = false
        return response
    }
}

struct ResponseBubble: View {
    let text: String

    var body: some View {
        ScrollView {
            VStack(alignment: .leading, spacing: 8) {
                Text("AI")
                    .font(.system(size: 16))
                    .foregroundColor(.gray)

                Text(text)
                    .font(.system(size: 16))
                    .lineSpacing(4)
                    .padding()
                    .background(Color.blue.opacity(0.1))
                    .cornerRadius(12)
            }
        }
        .padding(.horizontal)
    }
}

效果

  1. 生成。
  1. 单轮聊天。
  1. 多轮聊天。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-03-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【IOS】XCode创建firstapp并运行(成为IOS开发者)
一直对IOS开发心心念念,自从买了macbook后一直也没有尝试,最近有空就折腾了一下,也把过程中遇到的问题记录一下。
DevFrank
2025/07/09
1890
【IOS】XCode创建firstapp并运行(成为IOS开发者)
MCP 和 Function Calling:示例
实现这样一个场景:和大模型聊天,然后让大模型将回答的内容总结后保存到 flomo 笔记中。
郑子铭
2025/05/25
3100
MCP 和 Function Calling:示例
SpringAI+Ollama三部曲之二:细说开发
程序员欣宸
2024/05/26
2.6K0
SpringAI+Ollama三部曲之二:细说开发
SwiftUI-MLX本地大模型开发(二)
在 SwiftUI-MLX本地大模型开发一文中,我们已经详细讲了如何利用 MLX 进行本地大模型的开发。但是通过案例可以发现 2 个问题:
YungFan
2025/04/14
870
SwiftUI-MLX本地大模型开发(二)
快速上手:实现你的第一个 MCP Client
在 MCP Server 开发实战:无缝对接 LLM 和 Elasticsearch 一文中,我们详细介绍了如何利用 MCP Python SDK 编写一个 Elasticsearch MCP 服务器,并通过 Claude Desktop 作为 MCP 客户端进行交互。本文将进一步介绍如何使用 MCP Python SDK 编写一个 MCP 客户端,以便更加灵活地与 MCP 服务器进行通信和集成。本文的完整代码可以在 Github 上找到:https://github.com/cr7258/hands-on-lab/tree/main/ai/claude/mcp/client/elasticsearch-mcp-client-example
Se7en258
2025/05/21
8360
快速上手:实现你的第一个 MCP Client
三分钟让Dify接入Ollama部署的本地大模型!
启动成功后,ollama 在本地 11434 端口启动了一个 API 服务,可通过 http://localhost:11434 访问。
JavaEdge
2025/03/10
1.5K0
三分钟让Dify接入Ollama部署的本地大模型!
💬 使用 Django + Ollama 打造本地私有化对话网站(全功能详解版)
当前大模型应用如雨后春笋,但很多用户对云端模型(如 GPT、Claude)存在数据隐私和成本担忧。Ollama 提供了本地运行主流大模型的能力,而 Django 是稳定、可扩展的 Web 框架。结合两者,我们可以打造一套完全离线、可控、安全的 AI 对话系统。
IT蜗壳-Tango
2025/04/07
2380
LLM运行框架对比:ollama与vllm浅析
开源的LLM已经成为程序员、爱好者和希望在日常工作中使用生成式AI并保持隐私的用户的最佳选择,对于企业的私有化部署而言也是如此。这些模型提供了优秀的性能,有时在许多任务中可以与大型的闭源模型 (如 GPT-4o 或 Claude Sonnet 3.5) 相媲美。
半吊子全栈工匠
2025/03/10
2K1
LLM运行框架对比:ollama与vllm浅析
SwiftUI-MLX本地大模型开发(四)
在 SwiftUI-MLX本地大模型开发、SwiftUI-MLX本地大模型开发(二)与 SwiftUI-MLX本地大模型开发(三)中,我们解决了基本使用、定制模型、使用本地模型、更改模型存储路径、转换模型、iPad运行等问题,但使用的都是别人训练好的模型。本文将介绍,如何基于一个通用 LLM 进行微调,使该模型成为个人的“专属”模型。
YungFan
2025/04/21
1440
SwiftUI-MLX本地大模型开发(四)
LangChain+Ollama+DeepSeek AI 应用开发:LangChain 模型 IO 模块认知
Lang Chain 是在 LLM 爆发之后,最早有一定知名度的开源工具,其他生态大部分工具也都基于 Lang Chain 的架构方式,所以通过学习 Lang Chain 可以了解 大部分的 AI 应用工具,今天和小伙伴分享 Lang Chain 模块中的 模型 IO
山河已无恙
2025/03/13
7200
LangChain+Ollama+DeepSeek AI 应用开发:LangChain 模型 IO 模块认知
告别复杂 API 调用!OllamaSharp 让 .NET 开发者轻松上手 AI,附带完整示例
大家好,我是深山踏红叶,今天要介绍一个名为 OllamaSharp 的库。一个用于与 Ollama API 进行交互的 C# 库, 让您轻松地与 Ollama 进行交互。 下面让我们看看是怎么来简化的。
郑子铭
2025/04/13
2700
告别复杂 API 调用!OllamaSharp 让 .NET 开发者轻松上手 AI,附带完整示例
AI智能体研发之路-工程篇(四):大模型推理服务框架Xinference一键部署
上一篇大语言模型推理服务框架—Ollama介绍了Ollama,Ollama以出色的设计一行命令完成推理框架部署,一行命令完成大模型部署,模型的下载不依赖梯子,速度非常快,大幅提升模型部署效率,同时,当有多卡GPU时,Ollama可以自动将模型分片到各个GPU上,博主使用V100显卡(单卡32G显存)部署llama3 70B(预计需要40G显存),自动完成了显存分配。
LDG_AGI
2024/08/13
4.8K0
AI智能体研发之路-工程篇(四):大模型推理服务框架Xinference一键部署
119K star!无需GPU轻松本地部署多款大模型,DeepSeek支持!这个开源神器绝了
119K star!无需GPU轻松本地部署多款大模型,DeepSeek支持!这个开源神器绝了
小华同学ai
2025/04/10
3650
119K star!无需GPU轻松本地部署多款大模型,DeepSeek支持!这个开源神器绝了
SwiftUI-MLX本地大模型开发
YungFan
2025/02/19
2240
SwiftUI-MLX本地大模型开发
Ollama本地部署大模型总结
今天计划对之前ollama系列做个回顾,从如何部署到API使用,整理到一篇内容中,提供给大家参考。
拓荒者IT
2025/03/30
1.3K0
Ollama本地部署大模型总结
Ollama系列06:C#使用OllamaSharp集成Ollama服务
本文是Ollama系列教程的第6篇,主要介绍如何通过SDK将ollama集成到c#程序中。
拓荒者IT
2025/03/26
3740
Ollama系列06:C#使用OllamaSharp集成Ollama服务
Ollama 本地CPU部署开源大模型
如 Facebook的llama3, 谷歌的gemma, 微软的phi3,阿里的qwen2 等模型。
lyhue1991
2024/06/26
2.7K0
Ollama 本地CPU部署开源大模型
解锁本地大模型的潜力:Ollama API 调用深度解析与实践指南
用ChatGPT、Claude、Gemini辅助学习更高效!注册ChatGPT、Claude、Gemini等账号,推荐使用https://yeka.ai/i/SUCCESS,输入推荐码SUCCESS,开卡费88折。 随着大语言模型(LLM)的快速发展,如何在本地高效部署和调用这些模型成为开发者关注的焦点。Ollama 作为一个轻量级开源框架,提供了一套简单而强大的 API 接口,支持本地运行多种预训练模型。本文深入探讨 Ollama API 的调用方法,包括生成补全、聊天对话、模型管理等功能,并通过丰富的代码示例展示其实践应用。从基础的安装配置到高级的流式响应处理,本文不仅详细解析了 API 的请求格式与参数,还结合 Python 编程语言,提供了大量带中文注释的代码,帮助读者快速上手。此外,文章还探讨了 Ollama 的架构优势及其在本地化场景中的潜力,适合希望在无 GPU 环境下运行大模型的开发者。通过本文,读者将掌握如何利用 Ollama API 构建本地化 AI 应用,解锁大模型的无限可能。
蒙娜丽宁
2025/04/13
1.5K0
解锁本地大模型的潜力:Ollama API 调用深度解析与实践指南
SwiftUI-MLX本地大模型开发(三)
在 SwiftUI-MLX本地大模型开发(二)一文中,我们解决了模型定制与使用离线大模型的问题,今天讲解以下 3 个问题:
YungFan
2025/04/14
1530
SwiftUI-MLX本地大模型开发(三)
LLM 大模型学习必知必会系列(十二):VLLM性能飞跃部署实践:从推理加速到高效部署的全方位优化[更多内容:XInference/FastChat等框架]
训练后的模型会用于推理或者部署。推理即使用模型用输入获得输出的过程,部署是将模型发布到恒定运行的环境中推理的过程。一般来说,LLM的推理可以直接使用PyTorch代码、使用VLLM/XInference/FastChat等框架,也可以使用llama.cpp/chatglm.cpp/qwen.cpp等c++推理框架。
汀丶人工智能
2024/05/28
13.3K0
LLM 大模型学习必知必会系列(十二):VLLM性能飞跃部署实践:从推理加速到高效部署的全方位优化[更多内容:XInference/FastChat等框架]
推荐阅读
相关推荐
【IOS】XCode创建firstapp并运行(成为IOS开发者)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验