初始化提交

This commit is contained in:
chenxin committed 2026-08-21 16:00:13 +08:00
commit 887c1f449e
963 files changed
+166869

No files matched your search

+66
View File
@@ -0,0 +1,66 @@
"""角色卡字段映射:ST CharacterCard → 魂镜 Character + 世谱条目。
纯逻辑,无 IO。``system_prompt`` / ``post_history_instructions`` 导入时存入 profile,
运行时作道体增补层注入(绝不覆盖恒定层,见融合设计 §6)。
"""
from __future__ import annotations
from app.modules.imports.card_parser import CharacterCard
def card_to_profile(card: CharacterCard) -> dict:
"""ST 卡 → Character profile JSON(自由字段,保留酒馆全部信息)。"""
return {
"background": card.description,
"scenario": card.scenario,
"first_mes": card.first_mes,
"mes_example": card.mes_example,
"alternate_greetings": card.alternate_greetings,
"tags": card.tags,
# 运行时作道体增补层注入(§6 安全边界),导入先保存
"system_prompt": card.system_prompt,
"post_history_instructions": card.post_history_instructions,
"source_meta": {
"creator": card.creator,
"character_version": card.character_version,
"creator_notes": card.creator_notes,
"spec_version": card.spec_version,
},
"st_extensions": card.extensions, # 保留未知键(酒馆规范:不得删除)
}
def card_to_daoti(card: CharacterCard) -> dict:
"""ST 卡 → 道体字段。
``personality`` 作 ``personality_summary`` 初始值(已拍板);``mission`` /
``safety_guidelines`` 酒馆卡没有,导入不设,留用户 / 演化填。
"""
return {"personality_summary": card.personality or None}
def character_book_to_entries(book: dict | None) -> list[dict]:
"""ST character_book entries → 世谱条目构造参数。"""
if not book:
return []
result = []
for e in book.get("entries") or []:
enabled_raw = e.get("enabled", True)
result.append(
{
"keys": list(e.get("keys") or []),
"content": e.get("content") or "",
"secondary_keys": list(e.get("secondary_keys") or []),
"constant": bool(e.get("constant", False)),
"selective": bool(e.get("selective", False)),
"enabled": True if enabled_raw is None else bool(enabled_raw),
"case_sensitive": bool(e.get("case_sensitive", False)),
"use_regex": bool(e.get("use_regex", False)),
"position": e.get("position") or "after_char",
"insertion_order": int(e.get("insertion_order") or 100),
"priority": int(e.get("priority") or 10),
"comment": e.get("comment") or e.get("name") or "",
}
)
return result