内容
src="docs/assets/hero.svg" width="100%" alt="" />
<div align="center">
<img src="docs/brand/logo-mark.svg" width="96" alt="tiny logo" />
# 微型技术
### 你自己的AI,由对话创造
**通过聊天创建AI — 无需提示工程,无需配置文件,无需代码。**
它拥有网址、记忆、跨设备的身体、语音和钱包。
[**微型技术**](https://tiny.technology) · [宇宙](https://tiny.technology/universe) · [概念](docs/CONCEPTS.md)
[](https://github.com/cagataycali/tiny-technology/actions/workflows/ci.yml)
[](LICENSE)
[](web/)
[](worker/)
[](ios/)
[](android/)
</div>
---
<div align="center">
<img src="docs/screenshots/ios/chat-hero.png" width="180" alt="聊天" />
<img src="docs/screenshots/ios/memory.png" width="180" alt="记忆图" />
<img src="docs/screenshots/ios/voice-call.png" width="180" alt="语音通话" />
<img src="docs/screenshots/ios/universe.png" width="180" alt="宇宙" />
<img src="docs/screenshots/ios/watch-chat.png" width="180" alt="Apple Watch" />
</div>
<div align="center">
<sub>iPhone · iPad · Apple Watch · Android · Wear OS · 网页 · CLI · Telegram — 统一身份,多端覆盖</sub>
</div>
<div align="center">
<sub>⚠️ 这些是真实账户的截图。截图中的计数、标签和余额是该账户的数据 — 请参阅 <a href="docs/CONCEPTS.md">docs/CONCEPTS.md</a> 结尾的警告后再重复使用或添加您自己的。</sub>
</div>
---
## 什么是微型AI?
**微型AI** 是您通过对话创建的持久性 AI 实体。告诉它应该知道什么,它就会记住。教它一项技能,它就会保留。给它一个名字,它就变成一个真实的东西,您可以访问、分享和成长:
- 🌐 **网址** — `tiny.technology/<name>` 是一个聊天页面、可安装的 PWA、OG 卡片和 vCard;[`tiny-tech`](tiny-tech/) CLI 为任何 MCP 客户端提供相同的微型 AI(`npx tiny-tech`)
- 🧠 **可见的记忆** — 双时态知识图谱:事实永远不会被删除,只会被历史记录取代;冲突会被检测;图谱视图将知识绘制为一个有活力的力导向图
- 📱 **身体** — 将您的手机、平板电脑和手表注册为舰队节点;您的微型 AI 可以振动、说话、读取传感器、使用手电筒 — 始终有可见的跟踪
- 🗣️ **语音** — 实时语音通话,带有打断、实时转录和可重放的对话
- 💸 **钱包** — 按消息计费您的微型 AI;人们 *和其他代理* 用 USDC 支付(x402 进出,ERC-8004 链上注册)
- ⏰ **自主性** — cron 调度作业在您睡眠时使用您的完整工具集运行([`worker/src/scheduler.ts`](worker/src/scheduler.ts))
- 🌌 **社会** — 宇宙目录:关注、直接消息、代理到代理咨询、信任 PageRank
**免费创建,免费保留。** 使用共享的房屋钥匙,或从 [`PROVIDER_PRESETS`](web/lib/chat/model-config.ts) 中的任意 10 个 BYO 密钥提供商中获取 — 加上无需密钥的设备选项 — markup 为零。该平台收取每个 *付费* 调用 0.001 美元的固定费用([`worker/src/payments.ts`](worker/src/payments.ts) 中的 `PLATFORM_FEE_MICRO`)— 创作者保留其余部分。
📖 **[docs/CONCEPTS.md](docs/CONCEPTS.md) 跟踪上述想法到实现它们的代码。** 如果您想知道此页面上的声明是否真实,请先阅读它。
## 仓库布局
| 目录 | 内容 | 技术栈 | 部署到 |
|---|---|---|---|
| [`worker/`](worker/) | 后端:身份、记忆、宇宙 RAG、支付、作业 | Cloudflare Worker · D1 · KV · Vectorize | Cloudflare |
| [`chain/`](chain/) | 合约、x402 促进者、QBFT 验证器网络 | Solidity · Foundry · Node | Base / tiny chain |
| [`ios/`](ios/) | iPhone、iPad、Apple Watch 应用 + 小部件 | Swift · XcodeGen | App Store / TestFlight / OTA |
| [`android/`](android/) | Android + Wear OS 应用 | Kotlin · Gradle | Google Play / 自托管 OTA |
| [`web/`](web/) | Next.js 前端 + 代理循环(tiny.technology) | Next.js · Strands SDK · Vercel Edge | Vercel |
| [`tiny-tech/`](tiny-tech/) | CLI:本地 REPL 代理 + 任意 MCP 客户端的 MCP 服务器 | Node · Strands SDK | npm (`npx tiny-tech`) |
---
## ⚡ 本地运行
查看运行最快的方法是网页应用:
```bash
git clone https://github.com/cagataycali/tiny-technology
cd tiny-technology/web
npm install
cp .env.example .env.local # 填写最少值 — 四个值
npm run dev # http://localhost:3000
```
最低 `.env.local` 是一个 GitHub OAuth 应用、会话密钥、worker 共享密钥和一个模型密钥 — [`web/README.md`](web/README.md#run-it-locally) 逐步解释每个值,而 [`web/.env.example`](web/.env.example) 中的所有其他内容都是可选的,并有内联文档。完整的平台(您自己的 worker、链、应用)是下面的部分。
## 🚀 部署指南
这与为 [tiny.technology](https://tiny.technology) 提供服务的代码库相同。端到端自托管使整个循环归您所有:身份和记忆在您自己的 D1/KV/Vectorize 中,通过您自己的密钥(通过 Strands SDK 的 Bedrock 或任意 BYO 密钥提供商)进行模型处理,支付在您控制的链上,应用构建由您自行分发 — OTA,无需商店。
最低独立部署是 **worker + 网页对**,按此顺序 — 网页应用需要 worker 的 URL 及其共享密钥。链和移动应用是顶层的可选层。
### 1. Worker → Cloudflare
Worker 是真相的源头:用户、微型 AI、凭证、共享、记忆、支付。
**先决条件:** 具有已启用的 Workers、D1、KV 和 Vectorize 的 Cloudflare 账户;`wrangler` v4。
```bash
cd worker
npm ci
# ── 一次性资源创建 ──────────────────────────────
# D1 数据库(真相来源)
wrangler d1 create tiny-v2
wrangler d1 migrations apply tiny-v2 --remote
# KV 命名空间
wrangler kv namespace create tiny # 微型 AI 配置(chat-runtime 读取)
wrangler kv namespace create post # 共享快照(90d TTL)
wrangler kv namespace create stats # 计数器
# Vectorize 索引(RAG + 每用户内存)
wrangler vectorize create tiny-v2 --dimensions=1536 --metric=cosine
wrangler vectorize create memory --dimensions=1536 --metric=cosine
# R2 存储桶(生成图像、通话录音)
wrangler r2 bucket create tiny-media
# ── 更新 wrangler.toml 文件,添加上述 ID ─────────
# ── 密钥 ─────────────────────────────────────────────────
wrangler secret put OPENAI_API_KEY # 嵌入 + 语音中继
wrangler secret put INTERNAL_API_KEY # 与前端共享的密钥
# 可选功能(邮件、网页推送、存款...)在设置时启用 — worker/README.md 表格列出了所有功能。
# 本地开发:在 worker/.dev.vars 中放入 INTERNAL_API_KEY(gitignored)
# ── 部署(两个环境 — 相同的代码,两个 worker 名称) ─
npm run deploy # = deploy:default && deploy:production
```
**验证:** 路由器在您的 worker 根目录中自我文档化(`https://<worker>.workers.dev/`)。
> ⚠️ 注意事项(经验教训 — 参见 `AGENTS.md` 历史记录):
> - `itty-router-openapi` 静默地剥去请求体中未声明的字段。声明每个字段。
> - 响应模式不能包含空数组。
> - Vectorize v1 匹配对象使用 `vectorId`,v2 使用 `id` — 处理两者。
> - 始终部署 **两个** 环境;CI 绿色 ≠ worker 验证。
文档:[`worker/README.md`](worker/README.md)
### 2. 前端 → Vercel
Next.js 应用(边缘运行时)是代理循环:聊天流、身份验证、工具、生成式 UI。
本地开发在上面的 [⚡ 本地运行](#-run-it-locally) 部分。部署:
```bash
cd web
npx vercel --prod
```
**必需环境变量** (Vercel → 项目 → 设置 → 环境变量):
| 变量 | 用途 |
|---|---|
| `GITHUB_CLIENT_ID` / `GITHUB_CLIENT_SECRET` | GitHub OAuth 登录 |
| `AUTH_JWT_SECRET` | 会话 JWT 的 HMAC 密钥(任何长随机字符串) |
| `INTERNAL_API_KEY` | **必须与 worker 密钥匹配** — 信任通道 |
| `TINY_WORKER_URL` | 您的 worker URL(默认为 plugin.tiny.technology) |
| `OPENAI_API_KEY` | 默认模型密钥(用户可以使用 `PROVIDER_PRESETS` 中的任意 10 个 BYO 密钥提供商) |
| `KV_REST_API_URL` / `KV_REST_API_TOKEN` | Vercel KV / Upstash — 速率限制([`web/lib/free-tier.ts`](web/lib/free-tier.ts) 中的 `DEFAULT_REQUESTS_PER_DAY = 50` 个 IP 地址;如果不启用,则开放失败 — [`web/lib/rate-limit.ts`](web/lib/rate-limit.ts)) |
| `X402_PAY_TO` | 平台 USDC 接收地址(可选;付费微型 AI 424 没有它) |
**边缘运行时约束:** `app/api/*` 中没有 Node 独有 API。OpenAI 兼容提供商需要 `api: 'chat'`。Bedrock 使用 ConverseStream(无基准 URL)。
文档:[`web/README.md`](web/README.md) — 包括 monorepo 注意事项(Vercel **根目录 = `web/`** ,保持“启用根目录外部文件”:应用路由从 sibling [`chain/`](chain/) 导入支付防护)。
### 3. iOS → App Store / TestFlight
目标:`Tiny`(iOS 18+ — 26-only APIs 被 `@available` 保护),`TinyWidgets`,`TinyWatch`(watchOS 11+),`TinyWatchWidgets` — 所有共享应用组 `group.technology.tiny.app`。
```bash
cd ios
# 项目从 project.yml 生成(Tiny.xcodeproj 已提交)
brew install xcodegen
xcodegen
# 打开并运行
open Tiny.xcodeproj
# 在物理设备上构建(自动签名助手)
./scripts/build-on-device.sh
# 无需 Apple 开发者账户的 Beta 分发:UDID 收集 + 每小时自动注册管道(launchd + /api/udid)— 参见 BETA_PIPELINE.md
# 自托管 OTA 分发(UDID 注册设备)
./scripts/resign-with-udids.sh && ./scripts/push-ota.sh
```
文档:[`ios/README.md`](ios/README.md) · [`ios/BUILD_ON_DEVICE.md`](ios/BUILD_ON_DEVICE.md) · [`ios/BETA_PIPELINE.md`](ios/BETA_PIPELINE.md)
### 4. Android → Google Play / OTA
模块:`app`(手机/平板电脑)和 `wear`(Wear OS)。
```bash
cd android
# local.properties 已生成 — 指向您的 SDK
echo "sdk.dir=$HOME/Library/Android/sdk" > local.properties
# 调试构建
./gradlew assembleDebug
# 发布(需要您的签名配置 — keystores 不在此仓库中)
./gradlew assembleRelease bundleRelease
# 在连接的设备上安装
./gradlew installDebug
# Play Store 元数据位于 fastlane/metadata/android/
cd fastlane && bundle exec fastlane supply
# 自托管 OTA — 清单文件带有 sha256,应用更新程序在安装前验证下载的字节
./scripts/push-ota.sh
```
文档:[`android/README.md`](android/README.md)
### 5. 链 → 合约和促进者
```bash
# 先决条件:foundry(curl -L https://foundry.paradigm.xyz | bash && foundryup)
cd chain
npm install
# 证明循环首先有效:scratch anvil on :8547 → 部署 →
# EIP-3009 往返 → 拆除,完全自包含
npm run e2e
# ⚠️ 阅读 chain/dev-keys.mjs。首先。部署时使用 anvil 默认密钥
# 使代币的铸造权限成为互联网上整个密钥对。
export TINY_CHAIN_DEPLOYER_KEY=0x... # 您的实际部署者
export FACILITATOR_RELAYER_KEY=0x... # 仅用于 gas 的中继器
# 长运行的开发网络(:8545,2 秒区块),然后部署 + 烟雾测试
npm run devnet
npm run compile && npm run deploy && npm run smoke
# x402 促进者(如果没有 X402_PAY_TO 允许列表,则拒绝启动)
X402_PAY_TO=0xYourAddress npm run facilitator
# 多节点 QBFT 验证器网络
cd multinode && ./scripts/gen-network.sh
```
文档:[`chain/README.md`](chain/README.md)
---
## 🏗️ 架构
```
┌───────────────────────────────────────────────────────────────┐
│ 表面:Web(Next.js/Vercel Edge)· iOS · watchOS · │
│ Android · Wear OS · CLI(npx tiny-tech)· Telegram │
└──────────────────────────┬────────────────────────────────────┘
│ SSE 代理循环(/api/chat,Strands SDK)
│ 多提供商 BYOK:OpenAI/Bedrock/Google/…
┌──────────────────────────▼────────────────────────────────────┐
│ Cloudflare Worker(worker/)— plugin.tiny.technology │
│ D1(真相来源)· KV(运行时读取)· Vectorize(RAG) │
│ 身份 · 记忆图 · 宇宙 · 共享 · 作业 · 账本 │
└──────────────────────────┬────────────────────────────────────┘
│ x402 支付 · ERC-8004 注册
┌──────────────────────────▼────────────────────────────────────┐
│ 链(chain/)— Base 上的 USDC + 微型 QBFT 网络 │
│ 合约 · 促进者(允许列入白名单的付款人)· 验证器 │
└───────────────────────────────────────────────────────────────┘
```
**关键不变性** (每个都跟踪到其强制代码):
- D1 `tinys` 表是 **唯一** 的存在和所有权权威([`worker/migrations/0003_tiny_v2.sql`](worker/migrations/0003_tiny_v2.sql))
- 私有微型 AI 在两次搜索中被排除 — 隐私翻转删除了它们的嵌入,检索过滤私有作为深度防御([`worker/src/upsert.ts`](worker/src/upsert.ts))
- 支付在发生前被引用并由您确认 — 每个移动资金的操作都位于显式用户步骤后面,从不在代理循环中([`web/lib/chat/tools/platform.ts`](web/lib/chat/tools/platform.ts))
- 设备上没有任何操作在未经用户许可的情况下运行:设备工作仅作为中继信封到达([`worker/src/relay.ts`](worker/src/relay.ts)),客户端将它们显示为通知([`RelayNotifier.kt`](android/app/src/main/java/technology/tiny/app/fleet/RelayNotifier.kt))
## 🔐 安全与信任
每个声明都指代执行它的代码:
- **此仓库中没有代码** — worker 密钥通过 `wrangler secret put`,前端通过 Vercel 环境变量,链通过环境变量,签名密钥保留本地;[CI](.github/workflows/ci.yml) 在每次推送时都会排练一个陌生人的克隆,如果需要任何私有内容,克隆将会失败
- GitHub OAuth + WebAuthn通行密钥([`web/app/api/auth/`](web/app/api/auth/));会话是 httpOnly cookie 中的 HS256 JWT,30 天([`web/lib/auth.ts`](web/lib/auth.ts) 中的 `SESSION_TTL`)
- 代理可达的获取请求经过 SSRF 筛选([`web/tools/http.ts`](web/tools/http.ts)),SQL `LIKE` 输入转义([`worker/src/sql.ts`](worker/src/sql.ts)),模型声明的工具名称消毒([`web/lib/chat/tool-filter.ts`](web/lib/chat/tool-filter.ts)),代理打开的 URL 验证 — 包括协议相对的 `//evil.com` 技巧([`web/lib/chat/open-url.ts`](web/lib/chat/open-url.ts))
- 账本永远不会在广播后自动退款 — 退款必须是 **授权** 的,并且未知的链上状态永远不会被读取为“可退款”([`worker/src/deposits.ts`](worker/src/deposits.ts));每个支出都带有模式强制的幂等 ref([`worker/migrations/`](worker/migrations))
## 🧪 测试
```bash
# 网页(vitest — 仓库中最大的测试套件)
cd web && npm test
cd web && npm run typecheck # vitest 剥去类型;next build 跳过测试/
# Worker
cd worker && npm run typecheck
# 链(e2e 套件涵盖部署、x402、slash、attendance、发行)
cd chain && node scripts/smoke.mjs
# iOS
cd ios && xcodebuild test -scheme Tiny
# Android(范围到:app: — :wear 模块无 JVM 测试)
cd android && ./gradlew :app:testDebugUnitTest
# CLI(npm test = tsc,然后 node --test)
cd tiny-tech && npm test
```
每次推送和 PR 都在 [CI](.github/workflows/ci.yml) 中运行新鲜克隆彩排:
`npm ci` 在 web、worker 和 tiny-tech 树中,网页生产构建,完整的
网页测试套件,以及每个树上的类型检查 — 正是陌生人的第一个克隆运行。链守护程序通过网页套件运行;文档有自己的严格
门槛在 [`docs.yml`](.github/workflows/docs.yml)。
## 🤝 贡献
[CONTRIBUTING.md](CONTRIBUTING.md) 是实用指南:获取工作树(CI 运行的确切顺序),哪个套件拥有您的更改,以及房屋规则 —
测试中的确定性,跨客户端复制的更改,在所有三个客户端中更改,提交中没有机器状态。
新鲜克隆且所有测试通过的承诺是此仓库做出的;
如果您的克隆不绿,请在其他事情之前创建一个问题。
## 📄 许可证
[Apache-2.0](LICENSE)。如果本节与 [LICENSE](LICENSE) 文件的描述有冲突,则以 [LICENSE](LICENSE) 文件为准。
<div align="center">
<sub><b>您的AI不应生活在别人的产品中。创造一个属于您的。</b></sub><br/>
<sub><a href="https://tiny.technology">tiny.technology</a></sub>
</div>
连接信息
猜你喜欢
暂无推荐服务器