TesserActor TesserActor

{{ loginError }}

{{ currentTab?.label }}
{{ t('chatId') }}{{ t('role') }}{{ t('model') }} {{ t('updatedAt') }}{{ t('actions') }}
{{ s.chat_id }}{{ s._label }} {{ s.role_name }} {{ s.model || '-' }} {{ s.updated_at }}

{{ t('noData') }}

{{ t('id') }}{{ t('chat') }}{{ t('role') }} Role{{ t('content') }}{{ t('time') }}{{ t('actions') }}
{{ m.id }} {{ m.chat_id }} {{ m.role_name }} {{ m.role }} {{ m.content?.substring(0, 120) }} {{ m.created_at }}

{{ t('noData') }}

{{ t('msgTotal', {n: msgTotal}) }} {{ t('msgSelected', {n: msgSelectedIds.length}) }}
{{ msgPage }} / {{ Math.max(1, Math.ceil(msgTotal/msgPageSize)) }}
{{ t('chatId') }}{{ t('role') }}{{ t('msgCount') }} {{ t('summaryPreview') }}{{ t('updatedAt') }}{{ t('actions') }}
{{ s.chat_id }} {{ s.role_name }} {{ s.message_count }} {{ s.summary?.substring(0, 100) }} {{ s.updated_at }}

{{ t('noData') }}

{{ t('envSavedNote') }}
{{ t('toolsSavedNote') }}
{{ mediaToast }} {{ t('legacyConfigNote') }}
{{ mediaSnapshot.path }}
{{ typeGroup.label }} {{ typeGroup.count }} models
{{ runtimeGroup.label }} {{ runtimeGroup.count }}
{{ platformGroup.label }} {{ platformGroup.count }}

{{ m.id }}

{{ m.platform }} / {{ m.media_type }} / {{ m.adapter }}

{{ field.description }}

No Media Models

{{ llmToast }}
{{ t('fallbackPriority') }} {{ t('fallbackHint') }}
{{ t('available') }}
{{ t('noneAvailable') }}
{{ t('fallbackOrder') }} ({{ t('dragToReorder') }})
{{ name }}
{{ t('fallbackEmpty') }}
{{ t('recentCalls') }} ({{ llmFilteredCalls.length }}/10)
{{ t('noRecentCalls') }}
{{ llmFormatCallTime(c.ts) }} {{ c.name }} {{ c.source || 'chat' }} ✓ OK ✗ FAIL {{ c.latency }}s
{{ c.completion_tokens }} out {{ c.text_len }} txt {{ c.prompt_tokens }} in {{ c.cache_hit_tokens }} cache ({{ Math.round(c.cache_hit_tokens / c.prompt_tokens * 100) }}%) {{ c.reasoning_len }} reason {{ c.reasoning_tokens }} reason 🔧 {{ c.tool_call_count }} {{ c.tool_call_names && c.tool_call_names.join(', ') }}
{{ c.error || 'unknown error' }}

{{ p.name }}

Default vision Cooldown Fallback #{{ llmFallbackOrder.indexOf(p.name)+1 }}
URL {{ p.base_url }}
Chat {{ p.model }}
Sum {{ p.summary_model }}
{{ p.adapter_type || 'openai' }} · temp {{ p.temperature ?? 0.8 }} · override

No LLM Providers

{{ llmModal.isNew ? 'Add Provider' : 'Edit ' + llmModal.data.name }}

{{ t('renameHint') }}

支持图片/文件输入(Playground 上传门控)

{{ r.rolename }}

Default Role

{{ r.persona?.trim().substring(0, 150) }}

No roles

{{ roleEdit.rolename }}

Default Role
Not available
{{ a.label }}

{{ assetMetaText(a.kind) }}

No media assets generated yet
No {{ genassetsType==='photo' ? 'Photo' : genassetsType==='video' ? 'Video' : 'Short Film' }} Assets
{{ formatSize(item.size) }}
NSFW
{{ assetPrompt(item) }}
{{ genassetsPreviewIdx + 1 }} / {{ genassetsItems.length }}
分享到 X
{{ shareX.role }} · 已选 {{ shareX.filenames.length }} 项
{{ xWeighted(shareX.text) }} / 280
⚠️ 该内容判定为 NSFW,发布到公网账号风险自负
NSFW
{{ formatSize(item.size) }}
{{ assetPrompt(item) }}

JailBreaker

Lightweight LLM for softcore/hardcore classification

✓ Saved
[classify] scene + motion prompt
  ├─ softcore → Model A
  └─ hardcore → Model B
[fallback] any failure → Model C

Aspect Ratio Auto

LLM outputs portrait/landscape → auto-map to image size & video ratio

Video ratio auto-maps: portrait→9:16, landscape→16:9

✓ Saved

Scene Plate

{{ t('desc_scene_plate') }}

Lightweight LLM for location routing & env distillation

Scene state distillation LLM (character wardrobe/location continuity). Choose an uncensored provider for NSFW scenes.

LRU eviction — least recently used plates are removed beyond this limit

Diptych plate render model (gpt-image-2 recommended)

Diptych 双联图, 宽x高 (21:9 recommended)

✓ Saved
[extract] [Environment]/[Scene] section from scene_description
[route] same location → reuse existing plate
  └─ new location → generate clean plate (one extra image gen)
[inject] plate as last reference image + anchor prompt
  fixed: structure/layout/props/palette/lighting · variable: angle/framing/detail states

{{ t('sp_locations') }}

{{ t('sp_no_locations') }}
{{ slot }}
{{ loc.location_id }} {{ loc.last_used_at }}
{{ loc.role_name }} · chat {{ loc.chat_id }}
{{ loc.env_summary }}

Scene States

Distilled per-role scene state injected every turn as continuity baseline. Delete to reset a role's baseline — it rebuilds on the next media generation.

No scene states — created automatically after media generation.
{{ s.role_name }} · chat {{ s.chat_id }} {{ s.media_type }}
{{ s.scene_description }}
{{ s.updated_at }} · {{ ssExpanded.has(ssKey(s)) ? 'click to collapse' : 'click to expand' }}

定价(美分/次)

📖 使用说明

干什么用:设置四种计价动作的单价,单位美分(100 美分 = $1)。改完点「保存定价」,60 秒内全站生效。

  • 对话:用户每发一条消息(含群聊发言)扣一次。参考成本:DeepSeek Flash 约 0.1–1 美分/条。
  • :每张生成图扣一次。参考成本:Seedream 约 3–5 美分/张。
  • 视频:每条生成视频扣一次。参考成本:Venice 480P 约 30 美分/条起(最贵,别定太低)。
  • 会员30天:BYOK 用户买"门票"的价格(自带 key 也要买会员才能用平台,P6b 生效)。

计费规则:用户余额 > 0 时按上表逐次扣余额;余额为 0 时自动回退到免费每日配额(试玩档)。管理员和自带 key 命中的用户不扣费。

失败退款:媒体生成预先扣费,若生成失败自动全额退款(流水里能看到 refund 记录),不用担心用户白花钱。

定价建议:按成本 ×1.5 定,留出平台利润与失败重试损耗。

对话 {{ (pricingForm.chat/100).toFixed(2) }}$/条 · 图 {{ (pricingForm.image/100).toFixed(2) }}$/张 · 视频 {{ (pricingForm.video/100).toFixed(2) }}$/条 · 会员 {{ (pricingForm.member_30d/100).toFixed(2) }}$/30天

充值码

📖 使用说明

干什么用:生成卡密卖给用户(充值/开会员),用户自己到 playground 兑换。适合线下收钱(微信/闲鱼/私聊)后发码。

和 USDT 自动充值的关系:若你在 .env 配了 USDT_TRC20_ADDRESS,用户可在 Settings 里选档位自动生成"唯一零头金额"(如 20.37 USDT),转账后约 1 分钟自动入余额——无需发码。卡密则用于没有加密币渠道的买家,或送人/促销。

两种类型:

  • 点数卡:面额填美分(500 = $5)。用户兑换后余额 +$5,之后生成按定价逐次扣。
  • 会员卡:面额填天数(30 = 30 天会员)。用户兑换后直接获得会员资格(自带 key 也要会员才生效)。

三个参数:

  • 张数:这个码能被兑换几次。1 = 一次性卡密;填 10 = 同一个码能卖 10 个人(活动码)。
  • 有效天码本身的有效期说明(留空/0 = 永久)。过期后未用的码作废。
  • 备注:给自己看,如"给老王 $10"。

完整流程:① 生成 → ② 把码发给买家 → ③ 买家在 playground 点右上角头像 → Settings → 账户 → 粘贴充值码 → 兑换 → ④ 余额/会员到账(页面即时刷新)。

吊销:点「吊销」立即作废该码,未兑换的会失效(已兑换的不回收)。

定价参考:常见面额 $5 / $10 / $20;走 USDT 收款按当日汇率折算成美分填入。

{{ c.code }} {{ c.kind === 'balance' ? (c.value/100).toFixed(2)+'$' : c.value+'天会员' }} {{ c.used_count }}/{{ c.max_uses }} 次 {{ c.expires_at.slice(0,10) }} 到期 {{ c.note }} 已用完
暂无充值码

USDT 自动充值(TRC20)

未配置:在 .env 填 USDT_TRC20_ADDRESS 即启用(用户选档位 → 生成唯一金额 → 转账自动入余额) ✅ 已启用 · 收款地址 {{ usdtStatus.address }} ❌ 地址无效:{{ usdtStatus.problem }} · 当前值 {{ usdtStatus.address }}
📖 使用说明(含新手如何拿收款地址)

原理:用户在 playground → Settings 选充值档位,系统生成一个带唯一零头的金额(如 5.37 USDT,零头当订单号),用户往你的 TRC20 地址转这笔钱,后台每 60 秒查链,匹配到就自动入余额。

怎么拿到收款地址(二选一):

  • 自托管钱包(推荐):手机装 TronLink / TokenPocket / OKX Web3 钱包 → 创建钱包 → 手抄助记词(别截图别存云)→ 选 TRON 网络 → 复制 T 开头地址 → 填 .env。
  • 交易所充值地址:币安/OKX 注册 KYC → 充值选 USDT + TRON(TRC20) → 复制地址。缺点是实名 + 小额密集入账有风控风险。

三条红线:① 用户必须选 TRC20/TRON 网络(选 ERC20 钱进不来);② 先小额实测再放量;③ 助记词/私钥永不外泄(本系统只用地址,绝不填私钥)。

没有 USDT 怎么测:完全不用真钱——让测试账号在 Settings 生成一笔意向,然后在这里点该笔的「标记到账」,系统即按意向金额入余额,全链路(意向→入账→余额→扣费)都能验。

「标记到账」也是运营刚需:用户转错金额、先转账后建单、或自动匹配漏单时,人工补单入账。

可选:在 console.trongrid.io 免费申请 TRONGRID_API_KEY 填 .env,提升链上查询速率限额。

#{{ d.id }} user {{ d.user_id }} {{ d.amount_usdt }} USDT {{ d.status === 'confirmed' ? '已到账' : (d.status === 'pending' ? '待支付' : '已过期') }} {{ d.txid }} {{ (d.created_at||'').slice(5,16).replace('T',' ') }}
暂无充值意向

邀请码

📖 使用说明

干什么用:注册门槛。本站没有邀请码无法注册——用来控量、挡爬虫、并作为"已满 18 岁"的准入把关。

三个参数:

  • 次数:这个码能注册几个人。1 = 单人邀请码;填 20 = 推广码,前 20 个用了它的人都能注册。
  • 有效天:码的有效期(留空/0 = 永久)。过期后未用部分作废。
  • 备注:给自己看,如"推特活动第 1 批"。

完整流程:① 生成 → ② 把码发给要邀请的人 → ③ 他打开 playground(站点首页)→ 在登录墙点「没有账号?去注册」→ 填邮箱/密码/邀请码 + 勾选 18+/服务条款 → ④ 注册即成,登录后即可聊天。

吊销:点「吊销」立即作废该码,未注册的部分失效(已注册账号不受影响)。

和充值码的区别:邀请码管"能不能进来",充值码管"有没有钱玩"。新用户默认是试玩档(有每日免费配额),想不限量就要充值或买会员。

{{ inv.code }} {{ inv.used_count }}/{{ inv.max_uses }} 次 {{ inv.expires_at.slice(0,10) }} 到期 {{ inv.note }} 已用完
暂无邀请码

用户

📖 使用说明

干什么用:查看全部注册用户,调整余额、配额、封禁状态。

每行字段:

  • 邮箱:登录名(用户用它登录 playground)。
  • 余额 $X:>$0 时用户按定价逐次扣费;=$0 时自动回退到免费每日配额。
  • 会员至:BYOK 门票有效期(自带 key 的用户需有会员才能生成,P6b 生效)。
  • 今日用量:当天三类动作各自已用次数。只统计免费配额档;付费扣费不计数。
  • chat_id:该账号的记忆隔离键(系统自动分配,非同用户不共享)。tg 后面是绑定的 Telegram 号(P4 支持)。

配额(左边三个框):

  • 留空 = 用全局默认(当前 对话 {{ defaultQuotas.chat }} / 图 {{ defaultQuotas.image }} / 视频 {{ defaultQuotas.video }} 每日)。
  • 0 = 该用户完全不限量(送人情/自己小号)。
  • 正数 = 该用户专属每日上限(如给重度用户放宽到 500/50/10)。
  • 改完点「存」生效。

调余额(右边):美分,正数充值、负数扣减。如 500 = 加 $5,-200 = 扣 $2。每笔都会记流水(kind=admin_adjust,可在流水里查)。用于手动补偿、退款、赠送。

封禁/解封:封禁后该用户立即无法访问(token 最长 60 秒内失效),但数据和历史都保留,解封即恢复。管理员账号不可封禁。

配额留空 = 全局默认(对话 {{ defaultQuotas.chat }}/图 {{ defaultQuotas.image }}/视频 {{ defaultQuotas.video }} 每日);0 = 不限
{{ u.display_name || u.email }} {{ u.email }} admin 已封禁 余额 ${{ ((u.balance_cents||0)/100).toFixed(2) }} 会员至 {{ u.member_until.slice(0,10) }} chat_id {{ u.canonical_chat_id }} tg {{ u.telegram_chat_id }} 邀请码 {{ u.invite_code_used || '-' }}
今日用量: 对话 {{ u.usage_today.chat || 0 }} / 图 {{ u.usage_today.image || 0 }} / 视频 {{ u.usage_today.video || 0 }} 配额 次/日 调余额 美分
暂无用户

{{ modal.title }}

Prompt

{{ promptPreview }}
{{ toast.message }}