chore: complete @yume → @infiplot rename (post-PR#9)
PR #9 已完成首页和 layout 的视觉品牌迁移,此 commit 补齐剩余的 技术性改名 —— workspace 包名、source import、localStorage 键、 CSS keyframe、内部 header logo、.env.example、README。 - @yume/* → @infiplot/* (6 package.json + 17 imports + lockfile) - localStorage/sessionStorage: yume:* → infiplot:* (含 PR #9 新增的 yume:hintClosed) - CSS keyframe yume-ripple → infiplot-ripple - new/play 页面 header logo "云梦" → "InfiPlot" - 代码注释中的「云梦」style 形容词删除(layout.tsx, page.tsx) - 根 package.json name + description(描述跟齐 staging "AI 实时交互剧情游戏") - README: tagline / Vercel deploy URL / 目录树 / engine 描述 保留:prompts.ts 的 LLM 体裁术语「视觉小说/galgame」、CustomForm placeholder 的「视觉小说画风」(图像模型识别的风格名词)。 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
# 云梦
|
# InfiPlot
|
||||||
|
|
||||||
> An AI-driven visual novel painted by an AI, one scene at a time. You talk and explore within a scene; when the story turns a corner, it paints the next. You click. It paints. The story unfolds.
|
> A real-time AI-generated interactive story game — painted scene by scene. You talk and explore within a scene; when the story turns a corner, it paints the next. You click. It paints. The story unfolds.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -37,7 +37,7 @@ There is no traditional game UI baked into the art. The AI paints the world in w
|
|||||||
|
|
||||||
## One-click deploy
|
## One-click deploy
|
||||||
|
|
||||||
[](https://vercel.com/new/clone?repository-url=https://github.com/zonghaoyuan/yume&root-directory=apps/web&env=TEXT_BASE_URL,TEXT_API_KEY,TEXT_MODEL,IMAGE_BASE_URL,IMAGE_API_KEY,IMAGE_MODEL,VISION_BASE_URL,VISION_API_KEY,VISION_MODEL,TTS_BASE_URL,TTS_API_KEY,TTS_SPEECH_MODEL,MOCK_IMAGE&envDescription=Three%20required%20providers%20%2B%20optional%20TTS.%20Any%20OpenAI-compatible%20endpoint%20works%20for%20text%2Fvision%2Ftts.&envLink=https://github.com/zonghaoyuan/yume%23environment-variables)
|
[](https://vercel.com/new/clone?repository-url=https://github.com/zonghaoyuan/infiplot&root-directory=apps/web&env=TEXT_BASE_URL,TEXT_API_KEY,TEXT_MODEL,IMAGE_BASE_URL,IMAGE_API_KEY,IMAGE_MODEL,VISION_BASE_URL,VISION_API_KEY,VISION_MODEL,TTS_BASE_URL,TTS_API_KEY,TTS_SPEECH_MODEL,MOCK_IMAGE&envDescription=Three%20required%20providers%20%2B%20optional%20TTS.%20Any%20OpenAI-compatible%20endpoint%20works%20for%20text%2Fvision%2Ftts.&envLink=https://github.com/zonghaoyuan/infiplot%23environment-variables)
|
||||||
|
|
||||||
After deploy, set the environment variables (see below) in your Vercel project. Nine are required; TTS is optional (leave blank to run silently); `MOCK_IMAGE=true` skips image generation for cheap TTS-only testing. The Vercel project's **Root Directory** must be set to `apps/web` (the deploy button passes this; if you configure manually, set it in Project Settings).
|
After deploy, set the environment variables (see below) in your Vercel project. Nine are required; TTS is optional (leave blank to run silently); `MOCK_IMAGE=true` skips image generation for cheap TTS-only testing. The Vercel project's **Root Directory** must be set to `apps/web` (the deploy button passes this; if you configure manually, set it in Project Settings).
|
||||||
|
|
||||||
@@ -81,7 +81,7 @@ pnpm dev
|
|||||||
## Project layout
|
## Project layout
|
||||||
|
|
||||||
```
|
```
|
||||||
yume/
|
infiplot/
|
||||||
├── apps/web/ Next.js 16 app — pages + API routes (Vercel root)
|
├── apps/web/ Next.js 16 app — pages + API routes (Vercel root)
|
||||||
└── packages/
|
└── packages/
|
||||||
├── types/ shared TypeScript types
|
├── types/ shared TypeScript types
|
||||||
@@ -90,7 +90,7 @@ yume/
|
|||||||
└── engine/ multi-agent AI orchestration (open core)
|
└── engine/ multi-agent AI orchestration (open core)
|
||||||
```
|
```
|
||||||
|
|
||||||
`packages/engine` is the open core — pure TS, no Next.js or browser dependency. Import it directly to build your own visual-novel front-end (Tauri, Electron, CLI, anywhere).
|
`packages/engine` is the open core — pure TS, no Next.js or browser dependency. Import it directly to build your own interactive-narrative front-end (Tauri, Electron, CLI, anywhere).
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# =============================================================
|
# =============================================================
|
||||||
# 云梦 — AI 视觉小说
|
# InfiPlot — AI 实时交互剧情游戏
|
||||||
# Recommended setup: Xiaomi MiMo Token Plan for TEXT / VISION / TTS
|
# Recommended setup: Xiaomi MiMo Token Plan for TEXT / VISION / TTS
|
||||||
# (one API key covers all three) + Runware for IMAGE (FLUX.2 [klein]).
|
# (one API key covers all three) + Runware for IMAGE (FLUX.2 [klein]).
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { requestBeatAudio } from "@yume/engine";
|
import { requestBeatAudio } from "@infiplot/engine";
|
||||||
import type { BeatAudioRequest } from "@yume/types";
|
import type { BeatAudioRequest } from "@infiplot/types";
|
||||||
import { NextResponse } from "next/server";
|
import { NextResponse } from "next/server";
|
||||||
import { loadEngineConfig } from "@/lib/config";
|
import { loadEngineConfig } from "@/lib/config";
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { requestInsertBeat } from "@yume/engine";
|
import { requestInsertBeat } from "@infiplot/engine";
|
||||||
import type { InsertBeatRequest } from "@yume/types";
|
import type { InsertBeatRequest } from "@infiplot/types";
|
||||||
import { NextResponse } from "next/server";
|
import { NextResponse } from "next/server";
|
||||||
import { loadEngineConfig } from "@/lib/config";
|
import { loadEngineConfig } from "@/lib/config";
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { requestScene } from "@yume/engine";
|
import { requestScene } from "@infiplot/engine";
|
||||||
import type { SceneRequest } from "@yume/types";
|
import type { SceneRequest } from "@infiplot/types";
|
||||||
import { NextResponse } from "next/server";
|
import { NextResponse } from "next/server";
|
||||||
import { loadEngineConfig } from "@/lib/config";
|
import { loadEngineConfig } from "@/lib/config";
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { startSession } from "@yume/engine";
|
import { startSession } from "@infiplot/engine";
|
||||||
import type { StartRequest } from "@yume/types";
|
import type { StartRequest } from "@infiplot/types";
|
||||||
import { NextResponse } from "next/server";
|
import { NextResponse } from "next/server";
|
||||||
import { loadEngineConfig } from "@/lib/config";
|
import { loadEngineConfig } from "@/lib/config";
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { visionDecide } from "@yume/engine";
|
import { visionDecide } from "@infiplot/engine";
|
||||||
import type { VisionRequest } from "@yume/types";
|
import type { VisionRequest } from "@infiplot/types";
|
||||||
import { NextResponse } from "next/server";
|
import { NextResponse } from "next/server";
|
||||||
import { loadEngineConfig } from "@/lib/config";
|
import { loadEngineConfig } from "@/lib/config";
|
||||||
|
|
||||||
|
|||||||
@@ -54,7 +54,7 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@keyframes yume-ripple {
|
@keyframes infiplot-ripple {
|
||||||
0% {
|
0% {
|
||||||
width: 14px;
|
width: 14px;
|
||||||
height: 14px;
|
height: 14px;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import type { Metadata } from "next";
|
|||||||
import { Cormorant_Garamond, Inter } from "next/font/google";
|
import { Cormorant_Garamond, Inter } from "next/font/google";
|
||||||
import "./globals.css";
|
import "./globals.css";
|
||||||
|
|
||||||
// Editorial 云梦 fonts: drive tailwind `font-serif`/`font-sans` via
|
// Editorial fonts: drive tailwind `font-serif`/`font-sans` via
|
||||||
// --font-serif / --font-sans across every page (home, /play, /new, CustomForm).
|
// --font-serif / --font-sans across every page (home, /play, /new, CustomForm).
|
||||||
const cormorant = Cormorant_Garamond({
|
const cormorant = Cormorant_Garamond({
|
||||||
subsets: ["latin"],
|
subsets: ["latin"],
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ export default function NewPage() {
|
|||||||
className="text-[10px] smallcaps text-clay-700 hover:text-clay-900 transition-colors flex items-center gap-2"
|
className="text-[10px] smallcaps text-clay-700 hover:text-clay-900 transition-colors flex items-center gap-2"
|
||||||
>
|
>
|
||||||
<i className="fa-solid fa-arrow-left text-[9px]" />
|
<i className="fa-solid fa-arrow-left text-[9px]" />
|
||||||
云梦
|
InfiPlot
|
||||||
</Link>
|
</Link>
|
||||||
<span className="text-[10px] smallcaps text-clay-500">
|
<span className="text-[10px] smallcaps text-clay-500">
|
||||||
编 织 一 个 世 界
|
编 织 一 个 世 界
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import { useRouter } from "next/navigation";
|
|||||||
import { useEffect, useRef, useState } from "react";
|
import { useEffect, useRef, useState } from "react";
|
||||||
|
|
||||||
/* ============================================================================
|
/* ============================================================================
|
||||||
InfiPlot · 首页(云梦编辑式视觉风格 · 居中构图,呼应低保真原型)
|
InfiPlot · 首页(编辑式视觉风格 · 居中构图,呼应低保真原型)
|
||||||
- 顶部 Header:左上角衬线 wordmark logo
|
- 顶部 Header:左上角衬线 wordmark logo
|
||||||
- Hero 控制区(居中):标题 / prompt 输入框 + 开始 / 5 个类别选择器
|
- Hero 控制区(居中):标题 / prompt 输入框 + 开始 / 5 个类别选择器
|
||||||
- 统一瀑布流(居中定宽):7 张主推 + 16 张画廊,按性向整体 crossfade 切换
|
- 统一瀑布流(居中定宽):7 张主推 + 16 张画廊,按性向整体 crossfade 切换
|
||||||
@@ -399,7 +399,7 @@ export default function HomePage() {
|
|||||||
const [prompt, setPrompt] = useState("");
|
const [prompt, setPrompt] = useState("");
|
||||||
const inputRef = useRef<HTMLTextAreaElement>(null);
|
const inputRef = useRef<HTMLTextAreaElement>(null);
|
||||||
|
|
||||||
// 顶部使用提示:默认展示,用户可点 × 永久关闭(localStorage:yume:hintClosed)。
|
// 顶部使用提示:默认展示,用户可点 × 永久关闭(localStorage:infiplot:hintClosed)。
|
||||||
const [hintClosed, setHintClosed] = useState(false);
|
const [hintClosed, setHintClosed] = useState(false);
|
||||||
|
|
||||||
const styleRow = OPTS.findIndex((o) => o.modal);
|
const styleRow = OPTS.findIndex((o) => o.modal);
|
||||||
@@ -432,7 +432,7 @@ export default function HomePage() {
|
|||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
try {
|
try {
|
||||||
if (localStorage.getItem("yume:hintClosed") === "1") setHintClosed(true);
|
if (localStorage.getItem("infiplot:hintClosed") === "1") setHintClosed(true);
|
||||||
} catch {
|
} catch {
|
||||||
/* ignore */
|
/* ignore */
|
||||||
}
|
}
|
||||||
@@ -449,7 +449,7 @@ export default function HomePage() {
|
|||||||
const closeHint = () => {
|
const closeHint = () => {
|
||||||
setHintClosed(true);
|
setHintClosed(true);
|
||||||
try {
|
try {
|
||||||
localStorage.setItem("yume:hintClosed", "1");
|
localStorage.setItem("infiplot:hintClosed", "1");
|
||||||
} catch {
|
} catch {
|
||||||
/* ignore */
|
/* ignore */
|
||||||
}
|
}
|
||||||
@@ -496,7 +496,7 @@ export default function HomePage() {
|
|||||||
const audioEnabled = voice === "开启";
|
const audioEnabled = voice === "开启";
|
||||||
|
|
||||||
sessionStorage.setItem(
|
sessionStorage.setItem(
|
||||||
"yume:custom",
|
"infiplot:custom",
|
||||||
JSON.stringify({ worldSetting, styleGuide, audioEnabled }),
|
JSON.stringify({ worldSetting, styleGuide, audioEnabled }),
|
||||||
);
|
);
|
||||||
router.push("/play?custom=1");
|
router.push("/play?custom=1");
|
||||||
@@ -610,7 +610,7 @@ export default function HomePage() {
|
|||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* 使用提示:可被用户永久关闭(localStorage:yume:hintClosed) */}
|
{/* 使用提示:可被用户永久关闭(localStorage:infiplot:hintClosed) */}
|
||||||
{!hintClosed && (
|
{!hintClosed && (
|
||||||
<div className="relative mx-auto mt-10 md:mt-12 max-w-[640px] rounded-sm border border-clay-900/10 bg-cream-100/50 px-8 py-3.5">
|
<div className="relative mx-auto mt-10 md:mt-12 max-w-[640px] rounded-sm border border-clay-900/10 bg-cream-100/50 px-8 py-3.5">
|
||||||
<p className="font-serif text-[13px] md:text-sm leading-relaxed text-clay-500">
|
<p className="font-serif text-[13px] md:text-sm leading-relaxed text-clay-500">
|
||||||
|
|||||||
@@ -24,9 +24,9 @@ import type {
|
|||||||
Session,
|
Session,
|
||||||
StartResponse,
|
StartResponse,
|
||||||
VisionResponse,
|
VisionResponse,
|
||||||
} from "@yume/types";
|
} from "@infiplot/types";
|
||||||
|
|
||||||
const MUTED_STORAGE_KEY = "yume:muted";
|
const MUTED_STORAGE_KEY = "infiplot:muted";
|
||||||
|
|
||||||
// Cap how long we wait for the browser to download + decode a scene image
|
// Cap how long we wait for the browser to download + decode a scene image
|
||||||
// before giving up and rendering anyway. Runware's CDN is normally <2s for a
|
// before giving up and rendering anyway. Runware's CDN is normally <2s for a
|
||||||
@@ -485,7 +485,7 @@ function PlayInner() {
|
|||||||
const p = PRESETS.find((x) => x.id === presetId);
|
const p = PRESETS.find((x) => x.id === presetId);
|
||||||
if (p) payload = { worldSetting: p.worldSetting, styleGuide: p.styleGuide };
|
if (p) payload = { worldSetting: p.worldSetting, styleGuide: p.styleGuide };
|
||||||
} else if (params.get("custom") === "1") {
|
} else if (params.get("custom") === "1") {
|
||||||
const stored = sessionStorage.getItem("yume:custom");
|
const stored = sessionStorage.getItem("infiplot:custom");
|
||||||
if (stored) {
|
if (stored) {
|
||||||
try {
|
try {
|
||||||
const parsed = JSON.parse(stored) as {
|
const parsed = JSON.parse(stored) as {
|
||||||
@@ -890,7 +890,7 @@ function PlayInner() {
|
|||||||
className="text-[10px] smallcaps text-clay-600 hover:text-clay-900 transition-colors flex items-center gap-2"
|
className="text-[10px] smallcaps text-clay-600 hover:text-clay-900 transition-colors flex items-center gap-2"
|
||||||
>
|
>
|
||||||
<i className="fa-solid fa-arrow-left text-[9px]" />
|
<i className="fa-solid fa-arrow-left text-[9px]" />
|
||||||
云梦
|
InfiPlot
|
||||||
</Link>
|
</Link>
|
||||||
<div className="flex items-center gap-3 text-[10px] smallcaps text-clay-500 num">
|
<div className="flex items-center gap-3 text-[10px] smallcaps text-clay-500 num">
|
||||||
<span>第 · {String(sceneCount).padStart(3, "0")} · 幕</span>
|
<span>第 · {String(sceneCount).padStart(3, "0")} · 幕</span>
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ export function CustomForm() {
|
|||||||
if (!canSubmit) return;
|
if (!canSubmit) return;
|
||||||
setSubmitting(true);
|
setSubmitting(true);
|
||||||
sessionStorage.setItem(
|
sessionStorage.setItem(
|
||||||
"yume:custom",
|
"infiplot:custom",
|
||||||
JSON.stringify({ worldSetting, styleGuide }),
|
JSON.stringify({ worldSetting, styleGuide }),
|
||||||
);
|
);
|
||||||
router.push("/play?custom=1");
|
router.push("/play?custom=1");
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
import { useCallback, useEffect, useRef, useState } from "react";
|
import { useCallback, useEffect, useRef, useState } from "react";
|
||||||
import type { Beat, BeatChoice } from "@yume/types";
|
import type { Beat, BeatChoice } from "@infiplot/types";
|
||||||
|
|
||||||
export type Phase =
|
export type Phase =
|
||||||
| "loading-first" // first scene not yet rendered
|
| "loading-first" // first scene not yet rendered
|
||||||
@@ -439,7 +439,7 @@ export function PlayCanvas({
|
|||||||
width: 30,
|
width: 30,
|
||||||
height: 30,
|
height: 30,
|
||||||
animation:
|
animation:
|
||||||
"yume-ripple 1.6s cubic-bezier(0.16,1,0.3,1) infinite",
|
"infiplot-ripple 1.6s cubic-bezier(0.16,1,0.3,1) infinite",
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
<div
|
<div
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import type { EngineConfig, TtsConfig } from "@yume/types";
|
import type { EngineConfig, TtsConfig } from "@infiplot/types";
|
||||||
|
|
||||||
function readVar(name: string): string {
|
function readVar(name: string): string {
|
||||||
const v = process.env[name];
|
const v = process.env[name];
|
||||||
|
|||||||
@@ -5,10 +5,10 @@ const config: NextConfig = {
|
|||||||
reactStrictMode: true,
|
reactStrictMode: true,
|
||||||
typedRoutes: false,
|
typedRoutes: false,
|
||||||
transpilePackages: [
|
transpilePackages: [
|
||||||
"@yume/engine",
|
"@infiplot/engine",
|
||||||
"@yume/ai-client",
|
"@infiplot/ai-client",
|
||||||
"@yume/types",
|
"@infiplot/types",
|
||||||
"@yume/tts-client",
|
"@infiplot/tts-client",
|
||||||
],
|
],
|
||||||
serverExternalPackages: ["sharp"],
|
serverExternalPackages: ["sharp"],
|
||||||
turbopack: {
|
turbopack: {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"name": "@yume/web",
|
"name": "@infiplot/web",
|
||||||
"version": "0.1.0",
|
"version": "0.1.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
@@ -11,9 +11,9 @@
|
|||||||
"typecheck": "tsc --noEmit"
|
"typecheck": "tsc --noEmit"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@yume/ai-client": "workspace:*",
|
"@infiplot/ai-client": "workspace:*",
|
||||||
"@yume/engine": "workspace:*",
|
"@infiplot/engine": "workspace:*",
|
||||||
"@yume/types": "workspace:*",
|
"@infiplot/types": "workspace:*",
|
||||||
"next": "^16.0.0",
|
"next": "^16.0.0",
|
||||||
"react": "^19.0.0",
|
"react": "^19.0.0",
|
||||||
"react-dom": "^19.0.0",
|
"react-dom": "^19.0.0",
|
||||||
|
|||||||
+5
-5
@@ -1,17 +1,17 @@
|
|||||||
{
|
{
|
||||||
"name": "yume",
|
"name": "infiplot",
|
||||||
"version": "0.1.0",
|
"version": "0.1.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "AI 驱动的视觉小说(云梦)",
|
"description": "AI 实时交互剧情游戏",
|
||||||
"license": "UNLICENSED",
|
"license": "UNLICENSED",
|
||||||
"packageManager": "pnpm@9.12.0",
|
"packageManager": "pnpm@9.12.0",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=20"
|
"node": ">=20"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "pnpm --filter @yume/web dev",
|
"dev": "pnpm --filter @infiplot/web dev",
|
||||||
"build": "pnpm --filter @yume/web build",
|
"build": "pnpm --filter @infiplot/web build",
|
||||||
"start": "pnpm --filter @yume/web start",
|
"start": "pnpm --filter @infiplot/web start",
|
||||||
"lint": "pnpm -r lint",
|
"lint": "pnpm -r lint",
|
||||||
"typecheck": "pnpm -r typecheck"
|
"typecheck": "pnpm -r typecheck"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"name": "@yume/ai-client",
|
"name": "@infiplot/ai-client",
|
||||||
"version": "0.1.0",
|
"version": "0.1.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
@@ -12,6 +12,6 @@
|
|||||||
"typecheck": "tsc --noEmit"
|
"typecheck": "tsc --noEmit"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@yume/types": "workspace:*"
|
"@infiplot/types": "workspace:*"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import type { ProviderConfig } from "@yume/types";
|
import type { ProviderConfig } from "@infiplot/types";
|
||||||
import { fetchWithRetry } from "./fetchWithRetry";
|
import { fetchWithRetry } from "./fetchWithRetry";
|
||||||
|
|
||||||
export type ChatMessage = {
|
export type ChatMessage = {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import type { ProviderConfig } from "@yume/types";
|
import type { ProviderConfig } from "@infiplot/types";
|
||||||
import { fetchWithRetry } from "./fetchWithRetry";
|
import { fetchWithRetry } from "./fetchWithRetry";
|
||||||
|
|
||||||
// Runware uses its own task-array protocol (not OpenAI-compatible).
|
// Runware uses its own task-array protocol (not OpenAI-compatible).
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import type { ProviderConfig } from "@yume/types";
|
import type { ProviderConfig } from "@infiplot/types";
|
||||||
import { fetchWithRetry } from "./fetchWithRetry";
|
import { fetchWithRetry } from "./fetchWithRetry";
|
||||||
|
|
||||||
export async function interpretClick(
|
export async function interpretClick(
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"name": "@yume/engine",
|
"name": "@infiplot/engine",
|
||||||
"version": "0.1.0",
|
"version": "0.1.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
@@ -12,9 +12,9 @@
|
|||||||
"typecheck": "tsc --noEmit"
|
"typecheck": "tsc --noEmit"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@yume/ai-client": "workspace:*",
|
"@infiplot/ai-client": "workspace:*",
|
||||||
"@yume/tts-client": "workspace:*",
|
"@infiplot/tts-client": "workspace:*",
|
||||||
"@yume/types": "workspace:*",
|
"@infiplot/types": "workspace:*",
|
||||||
"jsonrepair": "^3.14.0",
|
"jsonrepair": "^3.14.0",
|
||||||
"sharp": "^0.33.5"
|
"sharp": "^0.33.5"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
import { chat, generateImage } from "@yume/ai-client";
|
import { chat, generateImage } from "@infiplot/ai-client";
|
||||||
import { provisionVoice } from "@yume/tts-client";
|
import { provisionVoice } from "@infiplot/tts-client";
|
||||||
import type {
|
import type {
|
||||||
Character,
|
Character,
|
||||||
CharacterVoice,
|
CharacterVoice,
|
||||||
EngineConfig,
|
EngineConfig,
|
||||||
Session,
|
Session,
|
||||||
} from "@yume/types";
|
} from "@infiplot/types";
|
||||||
import { parseJsonLoose } from "../jsonParser";
|
import { parseJsonLoose } from "../jsonParser";
|
||||||
import { mockImageDataUri } from "../mockImage";
|
import { mockImageDataUri } from "../mockImage";
|
||||||
import {
|
import {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { chat } from "@yume/ai-client";
|
import { chat } from "@infiplot/ai-client";
|
||||||
import type { BeatActiveCharacter, ProviderConfig } from "@yume/types";
|
import type { BeatActiveCharacter, ProviderConfig } from "@infiplot/types";
|
||||||
import { parseJsonLoose } from "../jsonParser";
|
import { parseJsonLoose } from "../jsonParser";
|
||||||
import {
|
import {
|
||||||
CINEMATOGRAPHER_SYSTEM,
|
CINEMATOGRAPHER_SYSTEM,
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
import { generateImage } from "@yume/ai-client";
|
import { generateImage } from "@infiplot/ai-client";
|
||||||
import type { GenerateImageOptions, GenerateImageResult } from "@yume/ai-client";
|
import type { GenerateImageOptions, GenerateImageResult } from "@infiplot/ai-client";
|
||||||
import type {
|
import type {
|
||||||
Beat,
|
Beat,
|
||||||
Character,
|
Character,
|
||||||
EngineConfig,
|
EngineConfig,
|
||||||
ProviderConfig,
|
ProviderConfig,
|
||||||
} from "@yume/types";
|
} from "@infiplot/types";
|
||||||
import { mockImageDataUri } from "../mockImage";
|
import { mockImageDataUri } from "../mockImage";
|
||||||
import { buildPainterPrompt } from "../prompts";
|
import { buildPainterPrompt } from "../prompts";
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { chat } from "@yume/ai-client";
|
import { chat } from "@infiplot/ai-client";
|
||||||
import type {
|
import type {
|
||||||
Beat,
|
Beat,
|
||||||
BeatActiveCharacter,
|
BeatActiveCharacter,
|
||||||
@@ -7,7 +7,7 @@ import type {
|
|||||||
BeatNext,
|
BeatNext,
|
||||||
ProviderConfig,
|
ProviderConfig,
|
||||||
Session,
|
Session,
|
||||||
} from "@yume/types";
|
} from "@infiplot/types";
|
||||||
import { parseJsonLoose } from "../jsonParser";
|
import { parseJsonLoose } from "../jsonParser";
|
||||||
import { WRITER_SYSTEM, buildWriterUserMessage } from "../prompts";
|
import { WRITER_SYSTEM, buildWriterUserMessage } from "../prompts";
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { chat } from "@yume/ai-client";
|
import { chat } from "@infiplot/ai-client";
|
||||||
import type {
|
import type {
|
||||||
Character,
|
Character,
|
||||||
EngineConfig,
|
EngineConfig,
|
||||||
@@ -6,7 +6,7 @@ import type {
|
|||||||
ProviderConfig,
|
ProviderConfig,
|
||||||
Scene,
|
Scene,
|
||||||
Session,
|
Session,
|
||||||
} from "@yume/types";
|
} from "@infiplot/types";
|
||||||
import { designCharacter, provisionVoiceForName } from "./agents/characterDesigner";
|
import { designCharacter, provisionVoiceForName } from "./agents/characterDesigner";
|
||||||
import { runCinematographer } from "./agents/cinematographer";
|
import { runCinematographer } from "./agents/cinematographer";
|
||||||
import { runPainter } from "./agents/painter";
|
import { runPainter } from "./agents/painter";
|
||||||
|
|||||||
@@ -11,5 +11,5 @@ export { mergeCharacters } from "./director";
|
|||||||
export type { SceneResult } from "./director";
|
export type { SceneResult } from "./director";
|
||||||
export type { WriterOutput } from "./agents/writer";
|
export type { WriterOutput } from "./agents/writer";
|
||||||
export type { CinematographerOutput } from "./agents/cinematographer";
|
export type { CinematographerOutput } from "./agents/cinematographer";
|
||||||
export type { InsertBeatPartial } from "@yume/types";
|
export type { InsertBeatPartial } from "@infiplot/types";
|
||||||
export * from "./prompts";
|
export * from "./prompts";
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import type {
|
|||||||
StartResponse,
|
StartResponse,
|
||||||
VisionRequest,
|
VisionRequest,
|
||||||
VisionResponse,
|
VisionResponse,
|
||||||
} from "@yume/types";
|
} from "@infiplot/types";
|
||||||
import { annotateClick } from "./annotate";
|
import { annotateClick } from "./annotate";
|
||||||
import { directInsertBeat, directScene } from "./director";
|
import { directInsertBeat, directScene } from "./director";
|
||||||
import { synthesizeBeat } from "./voice";
|
import { synthesizeBeat } from "./voice";
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import type {
|
|||||||
Character,
|
Character,
|
||||||
Scene,
|
Scene,
|
||||||
Session,
|
Session,
|
||||||
} from "@yume/types";
|
} from "@infiplot/types";
|
||||||
|
|
||||||
// ══════════════════════════════════════════════════════════════════════
|
// ══════════════════════════════════════════════════════════════════════
|
||||||
// Multi-agent scene generation pipeline:
|
// Multi-agent scene generation pipeline:
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
import { interpretClick } from "@yume/ai-client";
|
import { interpretClick } from "@infiplot/ai-client";
|
||||||
import type {
|
import type {
|
||||||
ClickIntent,
|
ClickIntent,
|
||||||
ProviderConfig,
|
ProviderConfig,
|
||||||
Scene,
|
Scene,
|
||||||
VisionClassify,
|
VisionClassify,
|
||||||
} from "@yume/types";
|
} from "@infiplot/types";
|
||||||
import { parseJsonLoose } from "./jsonParser";
|
import { parseJsonLoose } from "./jsonParser";
|
||||||
import { VISION_SYSTEM_PROMPT, buildVisionUserPrompt } from "./prompts";
|
import { VISION_SYSTEM_PROMPT, buildVisionUserPrompt } from "./prompts";
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { synthesize } from "@yume/tts-client";
|
import { synthesize } from "@infiplot/tts-client";
|
||||||
import type { BeatAudio, CharacterVoice, TtsConfig } from "@yume/types";
|
import type { BeatAudio, CharacterVoice, TtsConfig } from "@infiplot/types";
|
||||||
|
|
||||||
// Per-beat synth budget. MiMo's median synth is 3–7s; the tail can spike
|
// Per-beat synth budget. MiMo's median synth is 3–7s; the tail can spike
|
||||||
// to 30–70s under concurrent load. Capping here means a single bad beat
|
// to 30–70s under concurrent load. Capping here means a single bad beat
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"name": "@yume/tts-client",
|
"name": "@infiplot/tts-client",
|
||||||
"version": "0.1.0",
|
"version": "0.1.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
@@ -12,6 +12,6 @@
|
|||||||
"typecheck": "tsc --noEmit"
|
"typecheck": "tsc --noEmit"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@yume/types": "workspace:*"
|
"@infiplot/types": "workspace:*"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import type { CharacterVoice, TtsConfig } from "@yume/types";
|
import type { CharacterVoice, TtsConfig } from "@infiplot/types";
|
||||||
|
|
||||||
// Xiaomi MiMo currently outputs wav / pcm16 only (mp3 not supported for output).
|
// Xiaomi MiMo currently outputs wav / pcm16 only (mp3 not supported for output).
|
||||||
// The reference clip we persist is therefore wav. Kept as a single switch so we
|
// The reference clip we persist is therefore wav. Kept as a single switch so we
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"name": "@yume/types",
|
"name": "@infiplot/types",
|
||||||
"version": "0.1.0",
|
"version": "0.1.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
|
|||||||
Generated
+25
-25
@@ -14,13 +14,13 @@ importers:
|
|||||||
|
|
||||||
apps/web:
|
apps/web:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@yume/ai-client':
|
'@infiplot/ai-client':
|
||||||
specifier: workspace:*
|
specifier: workspace:*
|
||||||
version: link:../../packages/ai-client
|
version: link:../../packages/ai-client
|
||||||
'@yume/engine':
|
'@infiplot/engine':
|
||||||
specifier: workspace:*
|
specifier: workspace:*
|
||||||
version: link:../../packages/engine
|
version: link:../../packages/engine
|
||||||
'@yume/types':
|
'@infiplot/types':
|
||||||
specifier: workspace:*
|
specifier: workspace:*
|
||||||
version: link:../../packages/types
|
version: link:../../packages/types
|
||||||
next:
|
next:
|
||||||
@@ -60,19 +60,19 @@ importers:
|
|||||||
|
|
||||||
packages/ai-client:
|
packages/ai-client:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@yume/types':
|
'@infiplot/types':
|
||||||
specifier: workspace:*
|
specifier: workspace:*
|
||||||
version: link:../types
|
version: link:../types
|
||||||
|
|
||||||
packages/engine:
|
packages/engine:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@yume/ai-client':
|
'@infiplot/ai-client':
|
||||||
specifier: workspace:*
|
specifier: workspace:*
|
||||||
version: link:../ai-client
|
version: link:../ai-client
|
||||||
'@yume/tts-client':
|
'@infiplot/tts-client':
|
||||||
specifier: workspace:*
|
specifier: workspace:*
|
||||||
version: link:../tts-client
|
version: link:../tts-client
|
||||||
'@yume/types':
|
'@infiplot/types':
|
||||||
specifier: workspace:*
|
specifier: workspace:*
|
||||||
version: link:../types
|
version: link:../types
|
||||||
jsonrepair:
|
jsonrepair:
|
||||||
@@ -84,7 +84,7 @@ importers:
|
|||||||
|
|
||||||
packages/tts-client:
|
packages/tts-client:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@yume/types':
|
'@infiplot/types':
|
||||||
specifier: workspace:*
|
specifier: workspace:*
|
||||||
version: link:../types
|
version: link:../types
|
||||||
|
|
||||||
@@ -448,8 +448,8 @@ packages:
|
|||||||
peerDependencies:
|
peerDependencies:
|
||||||
postcss: ^8.1.0
|
postcss: ^8.1.0
|
||||||
|
|
||||||
baseline-browser-mapping@2.10.32:
|
baseline-browser-mapping@2.10.33:
|
||||||
resolution: {integrity: sha512-wbPvpyjJPC0zdfdKXxqEL3Ea+bOMD/87X4lftiJkkaBiuG6ALQy1SLmEd7BSmVCuwCQsBrCamgBoLyfFDD1EPg==}
|
resolution: {integrity: sha512-bA6+tcSLpz2tIEdDXZPpPTIuxBcC4+w6SieaYyfigIa4h8GlFxbA17v22Vx3JUtuZQj9SgOsnbK+aTBzyDyEuw==}
|
||||||
engines: {node: '>=6.0.0'}
|
engines: {node: '>=6.0.0'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
@@ -516,8 +516,8 @@ packages:
|
|||||||
dlv@1.1.3:
|
dlv@1.1.3:
|
||||||
resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
|
resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
|
||||||
|
|
||||||
electron-to-chromium@1.5.361:
|
electron-to-chromium@1.5.364:
|
||||||
resolution: {integrity: sha512-Q6Hts7N9FnJc5LeGRINFvLhCI9xZmNtTDe5ZbcVezQz7cU4a8Aua3GH1b8J2XY8Al9PF+OCwYqhgsOOheMdvkA==}
|
resolution: {integrity: sha512-G/dYE3+AYhyHwzTwg8UbnXf7zqMERYh7l2jJ3QujhFsH8agSYwtnGAR2aZ7f0AakIKJXd5En/Hre4igIUrdlYw==}
|
||||||
|
|
||||||
es-errors@1.3.0:
|
es-errors@1.3.0:
|
||||||
resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
|
resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
|
||||||
@@ -566,8 +566,8 @@ packages:
|
|||||||
resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
|
resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
|
||||||
engines: {node: '>=10.13.0'}
|
engines: {node: '>=10.13.0'}
|
||||||
|
|
||||||
hasown@2.0.3:
|
hasown@2.0.4:
|
||||||
resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==}
|
resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==}
|
||||||
engines: {node: '>= 0.4'}
|
engines: {node: '>= 0.4'}
|
||||||
|
|
||||||
is-arrayish@0.3.4:
|
is-arrayish@0.3.4:
|
||||||
@@ -822,8 +822,8 @@ packages:
|
|||||||
thenify@3.3.1:
|
thenify@3.3.1:
|
||||||
resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==}
|
resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==}
|
||||||
|
|
||||||
tinyglobby@0.2.16:
|
tinyglobby@0.2.17:
|
||||||
resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==}
|
resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==}
|
||||||
engines: {node: '>=12.0.0'}
|
engines: {node: '>=12.0.0'}
|
||||||
|
|
||||||
to-regex-range@5.0.1:
|
to-regex-range@5.0.1:
|
||||||
@@ -1120,7 +1120,7 @@ snapshots:
|
|||||||
postcss: 8.5.15
|
postcss: 8.5.15
|
||||||
postcss-value-parser: 4.2.0
|
postcss-value-parser: 4.2.0
|
||||||
|
|
||||||
baseline-browser-mapping@2.10.32: {}
|
baseline-browser-mapping@2.10.33: {}
|
||||||
|
|
||||||
binary-extensions@2.3.0: {}
|
binary-extensions@2.3.0: {}
|
||||||
|
|
||||||
@@ -1130,9 +1130,9 @@ snapshots:
|
|||||||
|
|
||||||
browserslist@4.28.2:
|
browserslist@4.28.2:
|
||||||
dependencies:
|
dependencies:
|
||||||
baseline-browser-mapping: 2.10.32
|
baseline-browser-mapping: 2.10.33
|
||||||
caniuse-lite: 1.0.30001793
|
caniuse-lite: 1.0.30001793
|
||||||
electron-to-chromium: 1.5.361
|
electron-to-chromium: 1.5.364
|
||||||
node-releases: 2.0.46
|
node-releases: 2.0.46
|
||||||
update-browserslist-db: 1.2.3(browserslist@4.28.2)
|
update-browserslist-db: 1.2.3(browserslist@4.28.2)
|
||||||
|
|
||||||
@@ -1182,7 +1182,7 @@ snapshots:
|
|||||||
|
|
||||||
dlv@1.1.3: {}
|
dlv@1.1.3: {}
|
||||||
|
|
||||||
electron-to-chromium@1.5.361: {}
|
electron-to-chromium@1.5.364: {}
|
||||||
|
|
||||||
es-errors@1.3.0: {}
|
es-errors@1.3.0: {}
|
||||||
|
|
||||||
@@ -1223,7 +1223,7 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
is-glob: 4.0.3
|
is-glob: 4.0.3
|
||||||
|
|
||||||
hasown@2.0.3:
|
hasown@2.0.4:
|
||||||
dependencies:
|
dependencies:
|
||||||
function-bind: 1.1.2
|
function-bind: 1.1.2
|
||||||
|
|
||||||
@@ -1235,7 +1235,7 @@ snapshots:
|
|||||||
|
|
||||||
is-core-module@2.16.2:
|
is-core-module@2.16.2:
|
||||||
dependencies:
|
dependencies:
|
||||||
hasown: 2.0.3
|
hasown: 2.0.4
|
||||||
|
|
||||||
is-extglob@2.1.1: {}
|
is-extglob@2.1.1: {}
|
||||||
|
|
||||||
@@ -1272,7 +1272,7 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
'@next/env': 16.2.6
|
'@next/env': 16.2.6
|
||||||
'@swc/helpers': 0.5.15
|
'@swc/helpers': 0.5.15
|
||||||
baseline-browser-mapping: 2.10.32
|
baseline-browser-mapping: 2.10.33
|
||||||
caniuse-lite: 1.0.30001793
|
caniuse-lite: 1.0.30001793
|
||||||
postcss: 8.4.31
|
postcss: 8.4.31
|
||||||
react: 19.2.6
|
react: 19.2.6
|
||||||
@@ -1465,7 +1465,7 @@ snapshots:
|
|||||||
lines-and-columns: 1.2.4
|
lines-and-columns: 1.2.4
|
||||||
mz: 2.7.0
|
mz: 2.7.0
|
||||||
pirates: 4.0.7
|
pirates: 4.0.7
|
||||||
tinyglobby: 0.2.16
|
tinyglobby: 0.2.17
|
||||||
ts-interface-checker: 0.1.13
|
ts-interface-checker: 0.1.13
|
||||||
|
|
||||||
supports-preserve-symlinks-flag@1.0.0: {}
|
supports-preserve-symlinks-flag@1.0.0: {}
|
||||||
@@ -1506,7 +1506,7 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
any-promise: 1.3.0
|
any-promise: 1.3.0
|
||||||
|
|
||||||
tinyglobby@0.2.16:
|
tinyglobby@0.2.17:
|
||||||
dependencies:
|
dependencies:
|
||||||
fdir: 6.5.0(picomatch@4.0.4)
|
fdir: 6.5.0(picomatch@4.0.4)
|
||||||
picomatch: 4.0.4
|
picomatch: 4.0.4
|
||||||
|
|||||||
Reference in New Issue
Block a user