Skip to main content

Documentation Index

Fetch the complete documentation index at: https://tech.illasoft.com/llms.txt

Use this file to discover all available pages before exploring further.

技术栈

类别技术说明
运行时Bun高性能 JavaScript 运行时
Web 框架Hono轻量级、高性能 Web 框架
AI SDKVercel AI SDKAI 对话和工具调用
数据库Supabase (PostgreSQL)数据存储 + Auth + Storage
缓存Dragonfly (Redis 兼容)Agent task 状态、embedding 缓存、cancel flag
Vector DBLanceDBFeed embedding 去重(512D)
AI 模型xAI Grok, OpenAI, Google, Mistral按用户 plan 选路
图片生成BytePlus, FAL, OpenAI, Google, Illustrious多 Provider
视频生成Seedance, Grok; WAN 2.7, KIE Seedance 2, TencentCloud Klinggenerate + edit/extend/motionControl
音乐生成Suno 三路 (KIE AI)generateMusic / generateInstrumental / addVocals
任务编排Inngest(自托管)替代原 NATS JetStream;事件驱动 + durable steps
实时推送CentrifugoWebSocket,任务状态
分析PostHog事件追踪 + 成本计量
监控BetterStack (OTEL) + Sentrytrace/metric/log + 错误
支付Stripe(通过 kira-sg-billing)订阅 + Booster + Webhook
2026-04 架构变化:NATS JetStream 已被 Inngest 完全替代(kira-be commit 45d54f5)。 所有异步任务通过 Inngest 事件派发,workers 由 long-lived consumer 改为 HTTP function。详见 Kira Inngest

项目结构

src
bootstrap.ts
index.ts
lib.ts
types
analytics
telemetry

核心架构

AI Agent 系统

Kira 使用 Vercel AI SDK 构建 Agent,按用户 plan 动态选模型(src/ai/agents/index.ts:80-102):
Mode模型Plan 门槛用途
litegrok-4-1-fast-reasoning (xAI)所有用户默认
novagrok-4-1-fast-reasoning (xAI)pro+标准 prompt
crazygrok-4-1-fast-reasoning (xAI)pro+CRAZY_PROMPT
ultragpt-5.4 (OpenAI)max / max_year最强推理
Plan 不够自动降级到 lite(src/hono/agent/index.ts:265-273)。 工具系统 (src/ai/tools/,30+ 个)
  • 图像:generateImageWithAIimageEditupscalereduxinpaintWithPromptinpaintWithImageexpanderaserremoveBackgroundreplaceBackgroundWithPromptreplaceBackgroundWithImagereadImage
  • 视频:generateVideovideoEditvideoExtendtrimVideomotionControlinitializeWithImageinitializeWithVideoreadVideo
  • 音乐:generateMusicgenerateInstrumentaladdVocalstrimAudioinitializeWithAudioreadMusic
  • 搜索 / 交互:googleSearchgetMaskImageFromUsergetExpandMaskImageFromUsergetFilterChoiceFromUsergetAutoCropResultFromUser

Agent 流式传输架构

长对话用 Redis 做持久化,断线重连可恢复。
POST /agent/streaming

  ├─ agentRegistry.register(threadId, abortController, promise)   ← 进程内
  ├─ redis HSET agent:task:{threadId} { status, userId, startedAt }
  │      TTL: 运行期 600s,完成后降到 120s

  ├─ ChunkWriter (75ms 批量 flush)
  │      └─ redis XADD agent:stream:{threadId} { chunk }

  ├─ createKiraAgent({ model, tools })
  │      └─ SSE → ChunkWriter.write(chunk)

  └─ onFinish:
      ├─ 保存 message + thread_version (images/videos/audios)
      ├─ 派发 video/music Inngest events
      └─ ChunkWriter.close() → XADD sentinel { type: "done" }

GET /agent/stream/:threadId  ← 断线重连
  └─ createBlockingRedis() [独立连接]
      └─ XREAD BLOCK 3s STREAMS agent:stream:{threadId} {lastId}
         → 重放未消费 chunks + sentinel
启动时 cleanupStaleTasks() 清理 > 5 min 的 running 任务(视为崩溃遗留)。

图片处理管道

详见 Image Pipeline 存储结构:{userId}/{threadId}/{imageId}(非 gen_* 前缀图片走 CSAM;gen_* 跳过)。

视频处理管道

事件命名 video/{action}-{provider}.requested,详见 Video PipelineKira Inngest

音乐处理管道

三路 Suno:generateMusic / generateInstrumental / addVocals。详见 Music Pipeline

任务取消

rewind / stop
  ├─ inngest.send("video/task.cancelled" | "music/task.cancelled", { taskId })
  └─ redis.set("cancel:{taskId}", "1", "EX", 3600)
     └─ Worker 每个 step.run 检查 → 命中抛 NonRetriableError
        └─ Inngest cleanup function 退款 + 通知

认证

所有受保护路由使用 supabaseAuth() 中间件(src/hono/middleware/auth.ts),验证 ES256 JWT via Supabase JWKS:
const userId = c.get("jwtPayload")?.sub;
公开路由用 optionalSupabaseAuth():验证失败不阻断,只清空 jwtPayload。Sentry 用户上下文在中间件中自动注入。

数据模型

表名说明
threads对话容器,flag: text[]nsfw 等 moderation 标记)
messages用户/AI 消息,支持 v4→v5 自动迁移
thread_version版本快照,images / videos / audios JSONB
user_profilesplan / credit / addon_credits / customer_id(_sg) / billing_region
feed社交作品,`media_type: imagevideoaudioflag: text[]`
user_liked_feedsFeed 点赞
filters预设滤镜(JSONB)
user_liked_filters用户收藏滤镜
failed_uploadsWorker CSAM 命中记录(审计)
announcements / home_cards_v2 / trending运营配置(由 kira-cms 管理)
thread_versionimages/videos/audios 采用 input/output envelope 结构。Zod schema 有 transform 兼容旧 flat 格式。详见 src/types/ 下的 VideoInputSchema / VideoOutputSchema / AudioInputSchema / AudioOutputSchema

通信流程

AI 对话流程

1

Client 发起请求

POST /agent/streaming + Bearer JWT
2

鉴权 + Plan 检查

Supabase JWT 验证 → 查询 user_profiles.plan → 根据请求 model 做降级
3

Rewind 处理 (可选)

若携带 anchorMessageId:删除该消息之后的所有消息/版本/异步任务
4

注册与启动

agentRegistry 注册 + Redis task 记录 + 打开 ChunkWriter
5

SSE 流式输出

createKiraAgent → Vercel AI SDK streamText → tool calls → chunks
6

onFinish 保存

保存 message + thread_version,派发 video/music Inngest events,关闭 ChunkWriter

Billing 流程

所有 Stripe 交互走 kira-sg-billingbilling.kira.art),详见 Kira SG Billing。kira-be 只负责:
  • 使用时的 credit 扣减:src/ai/libs/billing.ts(RPC deduct_credits
  • 删除用户时清 Stripe customer:src/hono/user/index.ts:33-88

账户删除流程

POST /support/delete-account
  ├─ 记录原因
  ├─ pgmq.send(account_deletion, {userId}, sleep=30d)
  ├─ pgmq.send(account_deletion_reminder, {userId}, sleep=27d)
  └─ 立即发 scheduled 邮件

[27 天后] kira-queue → reminder 邮件
[30 天后] kira-queue → DELETE /user → deleted 邮件 → archive
详见 Kira Queue

国际化

getI18nValue(key, locale, format) 支持 12 种 locale: en-US / zh-CN / zh-TW / ja-JP / ko-KR / de-DE / fr-FR / es-ES / pt-PT / it-IT / ru-RU / ms-MY

内容审核(CSAM)

触发点

端点触发方式源文件失败行为
POST /thread/非阻塞 Promise.allsrc/hono/thread/index.ts:159-171标 thread.flag=[“nsfw”]
PUT /user/profile同步 awaitsrc/hono/user/index.ts:626-632返回 451,删头像
POST /publish/*同步 awaitsrc/hono/publish/index.ts:58, 171, 286拒发,feed.flag=“nsfw”
POST /image/check/:imageId同步 awaitsrc/hono/image/index.ts:32-41返回 451,删派生文件
Video worker post-processstep.runkira-video-worker/src/csam.ts删文件 + failed_uploads + csam_blocked 通知 不退款
Music worker post-processstep.runkira-music-worker/src/csam.ts同上

审核实现

函数位置用途
moderateImageUrl(imageId)src/ai/libs/moderation.tsOpenAI omni-moderation-latest,图片多模态
moderateText(text)同上文本审核
detectNsfw({text?, imageId?})同上视频 provider 路由(NSFW → seedance,safe → grok)
阈值:sexual=0.2sexual/minors=0.01、其余类别 0.7

Thread Flag

const updatedFlag = [...new Set([...(thread.flag ?? []), "nsfw"])];
await supabase.from("threads").update({ flag: updatedFlag }).eq("id", threadId);
Flag 为 text[]。带 nsfw flag 的 thread 中的 feed 在非作者查看时隐藏;rewind 访问也会被 GET /rewind/check/:originImageId 阻断。

启动与优雅关闭

入口 src/bootstrap.ts 先初始化 Telemetry,再导入 src/index.ts
index.ts
  ├─ Hono app
  ├─ CORS 白名单:*.kira.art / op.kira.art / (dev=allow-all)
  ├─ HTTP logger + OTEL instrumentation
  └─ SIGINT/SIGTERM:
     ├─ agentRegistry.abortAll()
     ├─ agentRegistry.waitForAll(Infinity)
     ├─ posthog.shutdown()
     ├─ telemetry.shutdown()
     ├─ Sentry.close()
     └─ process.exit(0)
Fly.io kill_timeout = 600s 配合长耗 agent 的 graceful drain。

部署

  • 运行在 Fly.io
  • 端口:8080
  • 内部服务互联:*.internal(kira-inngest、kira-dragonfly、kira-centrifugo)

环境变量(摘要)

CoreSUPABASE_URL / _KEY / REDIS_URL / LANCEDB_URI / _API_KEY / PORT / NODE_ENV
AIOPENAI_API_KEY / GOOGLE_GENERATIVE_AI_API_KEY / XAI_API_KEY / MISTRAL_API_KEY / NOVITA_API_KEY
ImageFAL_API_KEY / BYTEPLUS_API_KEY / ILLUSTRIOUS_API_KEY / SERPER_API_KEY
ProcessingIMGPROXY_URL / _KEY / _SALT / VOYAGE_API_KEY
ObservabilityPOSTHOG_API_KEY / BETTERSTACK_HOST / _TOKEN / SENTRY_DSN
IntegrationRESEND_API_KEY / CMS_URL / FRONT_CHAT_SECRET
详细说明见各 pipeline 文档。