Install any skill in seconds. Free to start, no credit card required.
Get Started Free →长篇网络小说写作系统。触发词(大小写不敏感):ink / Ink / 写书 / 写小说 / 写第 N 章 / 续写 / 连写 / 连写 N 章 / 连续写作 / 审计章节 / 审计第 N 章 / 润色章节 / 润色第 N 章 / 修订 / 扩写 / 压缩 / 新建书 / 新建章节 / 新建一本 / 新章节 / ink初始化 / ink init / ink迁移 / ink migrate / followup / 伏笔 / 资源账本 / 粒子账本 / 角色交互矩阵 / 人物矩阵 / 世界观 / 章节大纲 / 真相文件 / 结算章节 / 章节结算 / 玄幻 / 仙侠 / 都市 / 恐怖 / 悬疑 / 修真 / 科幻 / 浪漫 / 治愈 / 异世界 / 爬塔 / 系统末日 / 地下城核心 / xuanhuan / xianxia / urban / horror / cultivation / progression / sci-fi / romantasy / cozy / isekai / tower-climber / litrpg / dungeon-core / system-a
SkillScore52/100
Test results 52
3/3 safety checks passed
22%52%of test cases passed +30 pts
Passed 12 of 23 test cases with the skill, and 5 of 23 without it.
8 fixed4 passed either way10 still failing1 broke
One test taskThe recent chapter direction went off track. Revert the story state back to chapter 4.
Adds every file the skill has, pinned so you can update it. No account needed.
pip install "decimalai>=0.15"
decimalai skills add papaintea-ink
claude --plugin-dir "$(git rev-parse --show-toplevel 2>/dev/null || pwd)/.agents"The same install from Python, for a notebook or a setup script.
pip install "decimalai>=0.15"from decimalai import skillpkg
# Writes .agents/skills and .decimal/skills.toml. Safe to run twice.
result = skillpkg.add("papaintea-ink")
if result.exit_code:
raise SystemExit(result.problems)
print("Added. Start Claude Code with the command below.")claude --plugin-dir "$(git rev-parse --show-toplevel 2>/dev/null || pwd)/.agents"Type these in a Claude Code session. No account or API key. It writes the skill and any files it bundles, and asks first when its safety rating isn't Passed.
/plugin marketplace add decimal-labs/decimalai-claude-plugins
/plugin install decimalai@decimalai/decimalai:install papaintea-inkThe plugin needs python3 and curl on your machine.
No Python or account. Claude Code picks it up in its next session.
curl -fsSL --create-dirs -o .claude/skills/papaintea-ink/SKILL.md https://app.decimal.ai/s/papaintea-ink/SKILL.md.claude/skills/papaintea-ink/SKILL.mdThis gets SKILL.md only. The skill's 5 other files are not included.
agent_config() hands your agent the skill. With no DecimalAI key it reads your project's files and sends nothing. Needs SDK 0.27 or newer.
pip install "decimalai[claude-agent-sdk]"
decimalai skills add papaintea-inkimport asyncio
from claude_agent_sdk import ClaudeAgentOptions
from decimalai.claude_agent_sdk import agent_config
# With no DECIMAL_API_KEY this reads the skills your project lists, from disk.
support = agent_config("support", fallback="You are a helpful agent.")
async def main():
question = "Hello!"
async with support.run(question) as run: # one user message, one run
async for message in run.query(options=ClaudeAgentOptions(max_turns=6)):
print(message)
# In a notebook or async code: await main()
asyncio.run(main())Prefer its own loader? ClaudeAgentOptions(plugins=[skills_plugin()], skills="all") reads the same folder. Use one or the other: a skill delivered both ways reaches the prompt twice.
The same install from Python, for a notebook or a setup script. agent_config() hands your agent the skill. With no DecimalAI key it reads your project's files and sends nothing. Needs SDK 0.27 or newer.
pip install "decimalai[claude-agent-sdk]"from decimalai import skillpkg
# Writes .agents/skills and .decimal/skills.toml. Safe to run twice.
result = skillpkg.add("papaintea-ink")
if result.exit_code:
raise SystemExit(result.problems)
import asyncio
from claude_agent_sdk import ClaudeAgentOptions
from decimalai.claude_agent_sdk import agent_config
# With no DECIMAL_API_KEY this reads the skills your project lists, from disk.
support = agent_config("support", fallback="You are a helpful agent.")
async def main():
question = "Hello!"
async with support.run(question) as run: # one user message, one run
async for message in run.query(options=ClaudeAgentOptions(max_turns=6)):
print(message)
# In a notebook or async code: await main()
asyncio.run(main())Prefer its own loader? ClaudeAgentOptions(plugins=[skills_plugin()], skills="all") reads the same folder. Use one or the other: a skill delivered both ways reaches the prompt twice.
No DecimalAI package. The whole skill goes in every prompt, and nothing pins or updates it.
.agents/skills/papaintea-ink/SKILL.mdimport asyncio
from pathlib import Path
from claude_agent_sdk import ClaudeAgentOptions, query
skill = Path(".agents/skills/papaintea-ink/SKILL.md").read_text()
options = ClaudeAgentOptions(system_prompt=f"You are a helpful agent.\n\n{skill}", max_turns=6)
async def main():
async for message in query(prompt="Hello!", options=options):
print(message)
# In a notebook or async code: await main()
asyncio.run(main())This gets SKILL.md only. The skill's 5 other files are not included.
agent_config() hands your agent the skill. With no DecimalAI key it reads your project's files and sends nothing. Needs SDK 0.27 or newer.
pip install "decimalai[openai-agents]"
decimalai skills add papaintea-inkfrom agents import Agent, Runner
from decimalai.openai_agents import agent_config
# With no DECIMAL_API_KEY this reads the skills your project lists, from disk.
support = agent_config("support", fallback="You are a helpful agent.")
agent = Agent(
name=support.name,
instructions=support.instructions, # your prompt, then the skill list
tools=[*support.tools], # your tools, then load_skill
)
# In a notebook or async code: result = await Runner.run(agent, "Hello!")
result = Runner.run_sync(agent, "Hello!")Using SandboxAgent? capabilities=[Shell(), decimalai.openai_agents.sandbox_skills()] points its own loader at the same folder.
The same install from Python, for a notebook or a setup script. agent_config() hands your agent the skill. With no DecimalAI key it reads your project's files and sends nothing. Needs SDK 0.27 or newer.
pip install "decimalai[openai-agents]"from decimalai import skillpkg
# Writes .agents/skills and .decimal/skills.toml. Safe to run twice.
result = skillpkg.add("papaintea-ink")
if result.exit_code:
raise SystemExit(result.problems)
from agents import Agent, Runner
from decimalai.openai_agents import agent_config
# With no DECIMAL_API_KEY this reads the skills your project lists, from disk.
support = agent_config("support", fallback="You are a helpful agent.")
agent = Agent(
name=support.name,
instructions=support.instructions, # your prompt, then the skill list
tools=[*support.tools], # your tools, then load_skill
)
# In a notebook or async code: result = await Runner.run(agent, "Hello!")
result = Runner.run_sync(agent, "Hello!")Using SandboxAgent? capabilities=[Shell(), decimalai.openai_agents.sandbox_skills()] points its own loader at the same folder.
No DecimalAI package. The whole skill goes in every prompt, and nothing pins or updates it.
.agents/skills/papaintea-ink/SKILL.mdfrom pathlib import Path
from agents import Agent, Runner
skill = Path(".agents/skills/papaintea-ink/SKILL.md").read_text()
agent = Agent(name="support", instructions=f"You are a helpful agent.\n\n{skill}")
# In a notebook or async code: result = await Runner.run(agent, "Hello!")
result = Runner.run_sync(agent, "Hello!")This gets SKILL.md only. The skill's 5 other files are not included.
agent_config() hands your agent the skill. With no DecimalAI key it reads your project's files and sends nothing. Needs SDK 0.27 or newer.
pip install "decimalai[openai]"
decimalai skills add papaintea-inkimport json
from openai import OpenAI
from decimalai.openai import agent_config
client = OpenAI()
# With no DECIMAL_API_KEY this reads the skills your project lists, from disk.
support = agent_config("support", fallback="You are a helpful agent.")
def lookup_order(order_id: str) -> str:
return f"Order {order_id} shipped yesterday."
# Your tools, as Chat Completions takes them, and what answers each.
TOOLS = [{"type": "function", "function": {
"name": "lookup_order",
"description": "Look up the status of an order.",
"parameters": {"type": "object", "properties": {"order_id": {"type": "string"}},
"required": ["order_id"]},
}}]
FUNCTIONS = {"lookup_order": lookup_order}
question = "Where is order A1001?"
with support.run(question) as run: # one user message, one run
# run.system is your prompt, then the skill list.
messages = [{"role": "system", "content": run.system}, run.message]
while True:
reply = client.chat.completions.create(
model="gpt-5.4-mini",
messages=messages,
tools=[*TOOLS, *run.tools], # your tools, then load_skill
).choices[0].message
messages.append(reply)
if not reply.tool_calls:
break
for call in reply.tool_calls:
# load_skill is answered by the run; your own tools by FUNCTIONS.
function = FUNCTIONS.get(call.function.name)
messages.append(run.tool_result(call) or {
"role": "tool", "tool_call_id": call.id,
"content": function(**json.loads(call.function.arguments)) if function
else f"There is no tool named {call.function.name!r}.",
})
print(reply.content)
# The Responses API takes run.response_tools instead of run.tools.The same install from Python, for a notebook or a setup script. agent_config() hands your agent the skill. With no DecimalAI key it reads your project's files and sends nothing. Needs SDK 0.27 or newer.
pip install "decimalai[openai]"from decimalai import skillpkg
# Writes .agents/skills and .decimal/skills.toml. Safe to run twice.
result = skillpkg.add("papaintea-ink")
if result.exit_code:
raise SystemExit(result.problems)
import json
from openai import OpenAI
from decimalai.openai import agent_config
client = OpenAI()
# With no DECIMAL_API_KEY this reads the skills your project lists, from disk.
support = agent_config("support", fallback="You are a helpful agent.")
def lookup_order(order_id: str) -> str:
return f"Order {order_id} shipped yesterday."
# Your tools, as Chat Completions takes them, and what answers each.
TOOLS = [{"type": "function", "function": {
"name": "lookup_order",
"description": "Look up the status of an order.",
"parameters": {"type": "object", "properties": {"order_id": {"type": "string"}},
"required": ["order_id"]},
}}]
FUNCTIONS = {"lookup_order": lookup_order}
question = "Where is order A1001?"
with support.run(question) as run: # one user message, one run
# run.system is your prompt, then the skill list.
messages = [{"role": "system", "content": run.system}, run.message]
while True:
reply = client.chat.completions.create(
model="gpt-5.4-mini",
messages=messages,
tools=[*TOOLS, *run.tools], # your tools, then load_skill
).choices[0].message
messages.append(reply)
if not reply.tool_calls:
break
for call in reply.tool_calls:
# load_skill is answered by the run; your own tools by FUNCTIONS.
function = FUNCTIONS.get(call.function.name)
messages.append(run.tool_result(call) or {
"role": "tool", "tool_call_id": call.id,
"content": function(**json.loads(call.function.arguments)) if function
else f"There is no tool named {call.function.name!r}.",
})
print(reply.content)
# The Responses API takes run.response_tools instead of run.tools.No DecimalAI package. The whole skill goes in every prompt, and nothing pins or updates it.
.agents/skills/papaintea-ink/SKILL.mdfrom pathlib import Path
from openai import OpenAI
client = OpenAI()
skill = Path(".agents/skills/papaintea-ink/SKILL.md").read_text()
reply = client.chat.completions.create(
model="gpt-5.4-mini",
messages=[
{"role": "system", "content": f"You are a helpful agent.\n\n{skill}"},
{"role": "user", "content": "Hello!"},
],
).choices[0].messageThis gets SKILL.md only. The skill's 5 other files are not included.
agent_config() hands your agent the skill. With no DecimalAI key it reads your project's files and sends nothing. Needs SDK 0.27 or newer.
pip install "decimalai[anthropic]"
decimalai skills add papaintea-inkimport anthropic
from decimalai.anthropic import agent_config
client = anthropic.Anthropic()
# With no DECIMAL_API_KEY this reads the skills your project lists, from disk.
support = agent_config("support", fallback="You are a helpful agent.")
question = "Hello!"
with support.run(question) as run: # one user message, one run
answer = client.beta.messages.tool_runner(
model="claude-haiku-5-5",
max_tokens=4096,
system=run.system, # your prompt, then the skill list
tools=[*run.tools], # your tools, then load_skill
messages=[{"role": "user", "content": question}],
).until_done()The same install from Python, for a notebook or a setup script. agent_config() hands your agent the skill. With no DecimalAI key it reads your project's files and sends nothing. Needs SDK 0.27 or newer.
pip install "decimalai[anthropic]"from decimalai import skillpkg
# Writes .agents/skills and .decimal/skills.toml. Safe to run twice.
result = skillpkg.add("papaintea-ink")
if result.exit_code:
raise SystemExit(result.problems)
import anthropic
from decimalai.anthropic import agent_config
client = anthropic.Anthropic()
# With no DECIMAL_API_KEY this reads the skills your project lists, from disk.
support = agent_config("support", fallback="You are a helpful agent.")
question = "Hello!"
with support.run(question) as run: # one user message, one run
answer = client.beta.messages.tool_runner(
model="claude-haiku-5-5",
max_tokens=4096,
system=run.system, # your prompt, then the skill list
tools=[*run.tools], # your tools, then load_skill
messages=[{"role": "user", "content": question}],
).until_done()No DecimalAI package. The whole skill goes in every prompt, and nothing pins or updates it.
.agents/skills/papaintea-ink/SKILL.mdfrom pathlib import Path
import anthropic
client = anthropic.Anthropic()
skill = Path(".agents/skills/papaintea-ink/SKILL.md").read_text()
reply = client.messages.create(
model="claude-haiku-5-5",
max_tokens=4096,
system=f"You are a helpful agent.\n\n{skill}",
messages=[{"role": "user", "content": "Hello!"}],
)This gets SKILL.md only. The skill's 5 other files are not included.
agent_config() hands your agent the skill. With no DecimalAI key it reads your project's files and sends nothing. Needs SDK 0.27 or newer.
pip install "decimalai[google-genai]"
decimalai skills add papaintea-inkfrom google import genai
from google.genai import types
from decimalai.google_genai import agent_config
client = genai.Client()
# With no DECIMAL_API_KEY this reads the skills your project lists, from disk.
support = agent_config("support", fallback="You are a helpful agent.")
def lookup_order(order_id: str) -> str:
return f"Order {order_id} shipped yesterday."
# Your functions, as declarations for the model, and what answers each.
TOOLS = [{"function_declarations": [{
"name": "lookup_order",
"description": "Look up the status of an order.",
"parameters_json_schema": {"type": "object", "properties": {"order_id": {"type": "string"}},
"required": ["order_id"]},
}]}]
FUNCTIONS = {"lookup_order": lookup_order}
question = "Where is order A1001?"
with support.run(question) as run: # one user message, one run
config = types.GenerateContentConfig(
system_instruction=run.system, # your prompt, then the skill list
tools=[*TOOLS, *run.tool_params], # your functions, then load_skill
)
contents = [{"role": "user", "parts": [{"text": run.message}]}]
while True:
response = client.models.generate_content(
model="gemini-3.5-flash", contents=contents, config=config,
)
if not response.function_calls:
break
contents.append(response.candidates[0].content)
parts = []
for call in response.function_calls:
# load_skill is answered by the run; your own functions by FUNCTIONS.
# A loop of your own rather than automatic function calling, which
# raises KeyError when the model asks for a function you did not pass.
function = FUNCTIONS.get(call.name)
parts.append(run.tool_result(call) or {"function_response": {
"name": call.name, "id": call.id,
"response": {"result": function(**(call.args or {})) if function
else f"There is no function named {call.name!r}."},
}})
contents.append({"role": "user", "parts": parts})
print(response.text)The same install from Python, for a notebook or a setup script. agent_config() hands your agent the skill. With no DecimalAI key it reads your project's files and sends nothing. Needs SDK 0.27 or newer.
pip install "decimalai[google-genai]"from decimalai import skillpkg
# Writes .agents/skills and .decimal/skills.toml. Safe to run twice.
result = skillpkg.add("papaintea-ink")
if result.exit_code:
raise SystemExit(result.problems)
from google import genai
from google.genai import types
from decimalai.google_genai import agent_config
client = genai.Client()
# With no DECIMAL_API_KEY this reads the skills your project lists, from disk.
support = agent_config("support", fallback="You are a helpful agent.")
def lookup_order(order_id: str) -> str:
return f"Order {order_id} shipped yesterday."
# Your functions, as declarations for the model, and what answers each.
TOOLS = [{"function_declarations": [{
"name": "lookup_order",
"description": "Look up the status of an order.",
"parameters_json_schema": {"type": "object", "properties": {"order_id": {"type": "string"}},
"required": ["order_id"]},
}]}]
FUNCTIONS = {"lookup_order": lookup_order}
question = "Where is order A1001?"
with support.run(question) as run: # one user message, one run
config = types.GenerateContentConfig(
system_instruction=run.system, # your prompt, then the skill list
tools=[*TOOLS, *run.tool_params], # your functions, then load_skill
)
contents = [{"role": "user", "parts": [{"text": run.message}]}]
while True:
response = client.models.generate_content(
model="gemini-3.5-flash", contents=contents, config=config,
)
if not response.function_calls:
break
contents.append(response.candidates[0].content)
parts = []
for call in response.function_calls:
# load_skill is answered by the run; your own functions by FUNCTIONS.
# A loop of your own rather than automatic function calling, which
# raises KeyError when the model asks for a function you did not pass.
function = FUNCTIONS.get(call.name)
parts.append(run.tool_result(call) or {"function_response": {
"name": call.name, "id": call.id,
"response": {"result": function(**(call.args or {})) if function
else f"There is no function named {call.name!r}."},
}})
contents.append({"role": "user", "parts": parts})
print(response.text)No DecimalAI package. The whole skill goes in every prompt, and nothing pins or updates it.
.agents/skills/papaintea-ink/SKILL.mdfrom pathlib import Path
from google import genai
from google.genai import types
client = genai.Client()
skill = Path(".agents/skills/papaintea-ink/SKILL.md").read_text()
response = client.models.generate_content(
model="gemini-3.5-flash",
contents="Hello!",
config=types.GenerateContentConfig(system_instruction=f"You are a helpful agent.\n\n{skill}"),
)This gets SKILL.md only. The skill's 5 other files are not included.
agent_config() hands your agent the skill. With no DecimalAI key it reads your project's files and sends nothing. Needs SDK 0.27 or newer.
pip install "decimalai[langchain]" langchain-openai
decimalai skills add papaintea-inkfrom langchain.agents import create_agent
from decimalai.langchain import agent_config
# With no DECIMAL_API_KEY this reads the skills your project lists, from disk.
support = agent_config("support", fallback="You are a helpful agent.")
agent = create_agent(
"openai:gpt-5.4-mini",
tools=[], # your tools; the middleware adds load_skill
middleware=[support.middleware], # your prompt, the skill list and load_skill
)
result = agent.invoke({"messages": [{"role": "user", "content": "Hello!"}]})The same install from Python, for a notebook or a setup script. agent_config() hands your agent the skill. With no DecimalAI key it reads your project's files and sends nothing. Needs SDK 0.27 or newer.
pip install "decimalai[langchain]" langchain-openaifrom decimalai import skillpkg
# Writes .agents/skills and .decimal/skills.toml. Safe to run twice.
result = skillpkg.add("papaintea-ink")
if result.exit_code:
raise SystemExit(result.problems)
from langchain.agents import create_agent
from decimalai.langchain import agent_config
# With no DECIMAL_API_KEY this reads the skills your project lists, from disk.
support = agent_config("support", fallback="You are a helpful agent.")
agent = create_agent(
"openai:gpt-5.4-mini",
tools=[], # your tools; the middleware adds load_skill
middleware=[support.middleware], # your prompt, the skill list and load_skill
)
result = agent.invoke({"messages": [{"role": "user", "content": "Hello!"}]})No DecimalAI package. The whole skill goes in every prompt, and nothing pins or updates it.
.agents/skills/papaintea-ink/SKILL.mdfrom pathlib import Path
from langchain.agents import create_agent
skill = Path(".agents/skills/papaintea-ink/SKILL.md").read_text()
agent = create_agent("openai:gpt-5.4-mini", tools=[], system_prompt=f"You are a helpful agent.\n\n{skill}")
result = agent.invoke({"messages": [{"role": "user", "content": "Hello!"}]})This gets SKILL.md only. The skill's 5 other files are not included.
CrewAI's own skill loader reads the installed folder. No DecimalAI account needed.
pip install "decimalai>=0.16" "crewai>=1.15.27"
decimalai skills add papaintea-inkimport decimalai.crewai
from crewai import Agent, Crew, Task
agent = Agent(
role="Support", goal="Help the customer", backstory="A support agent.",
llm=llm, # your own CrewAI LLM
skills=decimalai.crewai.skills(), # the installed folder
tools=decimalai.crewai.skill_tools(), # reads a skill's files, runs its scripts
)
task = Task(description="Hello!", expected_output="an answer", agent=agent)
Crew(agents=[agent], tasks=[task]).kickoff()The same install from Python, for a notebook or a setup script. CrewAI's own skill loader reads the installed folder. No DecimalAI account needed.
pip install "decimalai>=0.16" "crewai>=1.15.27"from decimalai import skillpkg
# Writes .agents/skills and .decimal/skills.toml. Safe to run twice.
result = skillpkg.add("papaintea-ink")
if result.exit_code:
raise SystemExit(result.problems)
import decimalai.crewai
from crewai import Agent, Crew, Task
agent = Agent(
role="Support", goal="Help the customer", backstory="A support agent.",
llm=llm, # your own CrewAI LLM
skills=decimalai.crewai.skills(), # the installed folder
tools=decimalai.crewai.skill_tools(), # reads a skill's files, runs its scripts
)
task = Task(description="Hello!", expected_output="an answer", agent=agent)
Crew(agents=[agent], tasks=[task]).kickoff()No DecimalAI package. CrewAI's own loader reads the folder, and nothing pins or updates it.
.agents/skills/papaintea-ink/SKILL.mdfrom pathlib import Path
from crewai import Agent, Crew, Task
agent = Agent(
role="Support", goal="Help the customer", backstory="A support agent.",
llm=llm, # your own CrewAI LLM
skills=[Path(".agents/skills")],
)
task = Task(description="Hello!", expected_output="an answer", agent=agent)
Crew(agents=[agent], tasks=[task]).kickoff()This gets SKILL.md only. The skill's 5 other files are not included.
agent_config() hands your agent the skill. With no DecimalAI key it reads your project's files and sends nothing. Needs SDK 0.27 or newer.
pip install "decimalai[adk]"
decimalai skills add papaintea-inkfrom decimalai.adk import DecimalAIPlugin, agent_config
from google.adk.agents import LlmAgent
from google.adk.apps import App
# With no DECIMAL_API_KEY this reads the skills your project lists, from disk.
support = agent_config("support", fallback="You are a helpful agent.")
agent = LlmAgent(
name="support", # ADK needs a Python identifier
model="gemini-3.5-flash",
instruction=support.instruction, # your prompt, then the skill list
tools=[*support.tools], # your tools, then load_skill
)
# DecimalAIPlugin makes each invocation of runners built from this App one trace.
app = App(name="support", root_agent=agent, plugins=[DecimalAIPlugin()])Prefer ADK's own loader? SkillToolset(skills=decimalai.adk.skills(), ...) reads the same folder. Use one or the other: a skill delivered both ways reaches the prompt twice.
The same install from Python, for a notebook or a setup script. agent_config() hands your agent the skill. With no DecimalAI key it reads your project's files and sends nothing. Needs SDK 0.27 or newer.
pip install "decimalai[adk]"from decimalai import skillpkg
# Writes .agents/skills and .decimal/skills.toml. Safe to run twice.
result = skillpkg.add("papaintea-ink")
if result.exit_code:
raise SystemExit(result.problems)
from decimalai.adk import DecimalAIPlugin, agent_config
from google.adk.agents import LlmAgent
from google.adk.apps import App
# With no DECIMAL_API_KEY this reads the skills your project lists, from disk.
support = agent_config("support", fallback="You are a helpful agent.")
agent = LlmAgent(
name="support", # ADK needs a Python identifier
model="gemini-3.5-flash",
instruction=support.instruction, # your prompt, then the skill list
tools=[*support.tools], # your tools, then load_skill
)
# DecimalAIPlugin makes each invocation of runners built from this App one trace.
app = App(name="support", root_agent=agent, plugins=[DecimalAIPlugin()])Prefer ADK's own loader? SkillToolset(skills=decimalai.adk.skills(), ...) reads the same folder. Use one or the other: a skill delivered both ways reaches the prompt twice.
No DecimalAI package. The whole skill goes in every prompt, and nothing pins or updates it.
.agents/skills/papaintea-ink/SKILL.mdfrom pathlib import Path
from google.adk.agents import LlmAgent
skill = Path(".agents/skills/papaintea-ink/SKILL.md").read_text()
agent = LlmAgent(
name="support",
model="gemini-3.5-flash",
instruction=lambda context: f"You are a helpful agent.\n\n{skill}",
)This gets SKILL.md only. The skill's 5 other files are not included.
agent_config() hands your agent the skill. With no DecimalAI key it reads your project's files and sends nothing. Needs SDK 0.27 or newer.
pip install "decimalai[pydantic-ai]"
decimalai skills add papaintea-inkfrom pydantic_ai import Agent
from decimalai.pydantic_ai import agent_config
# With no DECIMAL_API_KEY this reads the skills your project lists, from disk.
support = agent_config("support", fallback="You are a helpful agent.")
agent = Agent(
"openai:gpt-4o-mini",
name=support.name,
tools=[], # your tools; the capability adds load_skill
capabilities=[support], # your prompt, the skill list and load_skill
)
# In a notebook or async code: result = await agent.run("Hello!")
result = agent.run_sync("Hello!")On the Pydantic AI harness, decimalai.pydantic_ai_harness.skills(project) uses its own loader instead.
The same install from Python, for a notebook or a setup script. agent_config() hands your agent the skill. With no DecimalAI key it reads your project's files and sends nothing. Needs SDK 0.27 or newer.
pip install "decimalai[pydantic-ai]"from decimalai import skillpkg
# Writes .agents/skills and .decimal/skills.toml. Safe to run twice.
result = skillpkg.add("papaintea-ink")
if result.exit_code:
raise SystemExit(result.problems)
from pydantic_ai import Agent
from decimalai.pydantic_ai import agent_config
# With no DECIMAL_API_KEY this reads the skills your project lists, from disk.
support = agent_config("support", fallback="You are a helpful agent.")
agent = Agent(
"openai:gpt-4o-mini",
name=support.name,
tools=[], # your tools; the capability adds load_skill
capabilities=[support], # your prompt, the skill list and load_skill
)
# In a notebook or async code: result = await agent.run("Hello!")
result = agent.run_sync("Hello!")On the Pydantic AI harness, decimalai.pydantic_ai_harness.skills(project) uses its own loader instead.
No DecimalAI package. The whole skill goes in every prompt, and nothing pins or updates it.
.agents/skills/papaintea-ink/SKILL.mdfrom pathlib import Path
from pydantic_ai import Agent
skill = Path(".agents/skills/papaintea-ink/SKILL.md").read_text()
agent = Agent("openai:gpt-4o-mini", instructions=f"You are a helpful agent.\n\n{skill}")
# In a notebook or async code: result = await agent.run("Hello!")
result = agent.run_sync("Hello!")This gets SKILL.md only. The skill's 5 other files are not included.
Deep Agents' own skill loader reads the installed folder. No DecimalAI account needed.
pip install "decimalai>=0.16" deepagents
decimalai skills add papaintea-inkimport decimalai.deepagents
from deepagents import create_deep_agent
agent = create_deep_agent(model=model, **decimalai.deepagents.skills())
agent.invoke({"messages": [{"role": "user", "content": "Hello!"}]})The default backend reads files but has no shell. To run a skill's scripts, pass skills(backend=LocalShellBackend(...)).
The same install from Python, for a notebook or a setup script. Deep Agents' own skill loader reads the installed folder. No DecimalAI account needed.
pip install "decimalai>=0.16" deepagentsfrom decimalai import skillpkg
# Writes .agents/skills and .decimal/skills.toml. Safe to run twice.
result = skillpkg.add("papaintea-ink")
if result.exit_code:
raise SystemExit(result.problems)
import decimalai.deepagents
from deepagents import create_deep_agent
agent = create_deep_agent(model=model, **decimalai.deepagents.skills())
agent.invoke({"messages": [{"role": "user", "content": "Hello!"}]})The default backend reads files but has no shell. To run a skill's scripts, pass skills(backend=LocalShellBackend(...)).
No DecimalAI package. The whole skill goes in every prompt, and nothing pins or updates it.
.agents/skills/papaintea-ink/SKILL.mdfrom pathlib import Path
from deepagents import create_deep_agent
skill = Path(".agents/skills/papaintea-ink/SKILL.md").read_text()
agent = create_deep_agent(model=model, system_prompt=f"You are a helpful agent.\n\n{skill}")
agent.invoke({"messages": [{"role": "user", "content": "Hello!"}]})This gets SKILL.md only. The skill's 5 other files are not included.
Its own skill loader reads the installed folder. No DecimalAI account needed.
pip install "decimalai>=0.16" agent-framework
decimalai skills add papaintea-inkimport asyncio
from agent_framework import Agent
from decimalai.agent_framework import skills
agent = Agent(client=client, instructions="You are a helpful agent.", context_providers=[skills()])
asyncio.run(agent.run("Hello!"))It caches skills by default, so restart the process after decimalai skills update.
The same install from Python, for a notebook or a setup script. Its own skill loader reads the installed folder. No DecimalAI account needed.
pip install "decimalai>=0.16" agent-frameworkfrom decimalai import skillpkg
# Writes .agents/skills and .decimal/skills.toml. Safe to run twice.
result = skillpkg.add("papaintea-ink")
if result.exit_code:
raise SystemExit(result.problems)
import asyncio
from agent_framework import Agent
from decimalai.agent_framework import skills
agent = Agent(client=client, instructions="You are a helpful agent.", context_providers=[skills()])
asyncio.run(agent.run("Hello!"))It caches skills by default, so restart the process after decimalai skills update.
No DecimalAI package. The whole skill goes in every prompt, and nothing pins or updates it.
.agents/skills/papaintea-ink/SKILL.mdimport asyncio
from pathlib import Path
from agent_framework import Agent
skill = Path(".agents/skills/papaintea-ink/SKILL.md").read_text()
agent = Agent(client=client, instructions=f"You are a helpful agent.\n\n{skill}")
asyncio.run(agent.run("Hello!"))This gets SKILL.md only. The skill's 5 other files are not included.
Strands' own skill loader reads the installed folder. No DecimalAI account needed.
pip install "decimalai>=0.16" strands-agents
decimalai skills add papaintea-inkfrom decimalai.strands import skills
from strands import Agent
from strands.vended_tools import file_editor, shell
agent = Agent(
model=model, # always pass one: the default is Amazon Bedrock
system_prompt="You are a helpful agent.",
tools=[file_editor, shell],
plugins=[skills()],
)
agent("Hello!")Strands loads an agent's skills once, so build the agent again after decimalai skills update.
The same install from Python, for a notebook or a setup script. Strands' own skill loader reads the installed folder. No DecimalAI account needed.
pip install "decimalai>=0.16" strands-agentsfrom decimalai import skillpkg
# Writes .agents/skills and .decimal/skills.toml. Safe to run twice.
result = skillpkg.add("papaintea-ink")
if result.exit_code:
raise SystemExit(result.problems)
from decimalai.strands import skills
from strands import Agent
from strands.vended_tools import file_editor, shell
agent = Agent(
model=model, # always pass one: the default is Amazon Bedrock
system_prompt="You are a helpful agent.",
tools=[file_editor, shell],
plugins=[skills()],
)
agent("Hello!")Strands loads an agent's skills once, so build the agent again after decimalai skills update.
No DecimalAI package. The whole skill goes in every prompt, and nothing pins or updates it.
.agents/skills/papaintea-ink/SKILL.mdfrom pathlib import Path
from strands import Agent
skill = Path(".agents/skills/papaintea-ink/SKILL.md").read_text()
agent = Agent(model=model, system_prompt=f"You are a helpful agent.\n\n{skill}")
agent("Hello!")This gets SKILL.md only. The skill's 5 other files are not included.
Adds every file the skill has, pinned so you can update it. Cursor, Copilot, Cline and Warp read this folder by themselves.
pip install "decimalai>=0.15"
decimalai skills add papaintea-inkNo Python or account. Cursor, Copilot, Cline and Warp read this folder by themselves.
curl -fsSL --create-dirs -o .agents/skills/papaintea-ink/SKILL.md https://app.decimal.ai/s/papaintea-ink/SKILL.md.agents/skills/papaintea-ink/SKILL.mdThis gets SKILL.md only. The skill's 5 other files are not included.
Give its text to your model as instructions. No account or package needed.
This gets SKILL.md only. The skill's 5 other files are not included.
Raw files: /s/papaintea-ink/SKILL.md · /s/papaintea-ink.json
Fetch the file and give its text to your model as instructions. No account or package needed.
curl -fsSL https://app.decimal.ai/s/papaintea-ink/SKILL.mdcurl -fsSL https://app.decimal.ai/s/papaintea-ink.jsonThis gets SKILL.md only. The skill's 5 other files are not included.
You don't need a DecimalAI account.
Saved prompts and skills, pinned versions, and traces of this skill in your runs. DecimalAI does not run your agent.
Claude Code reads files from your project, so DecimalAI config does not apply there.
On Claude Agent SDK: save the skill to an agent here, set DECIMAL_API_KEY, and the same code uses it with no command to run. Changes you save reach the next run with no redeploy.
On OpenAI Agents: save the skill to an agent here, set DECIMAL_API_KEY, and the same code uses it with no command to run. Changes you save reach the next run with no redeploy.
On OpenAI SDK: save the skill to an agent here, set DECIMAL_API_KEY, and the same code uses it with no command to run. Changes you save reach the next run with no redeploy.
On Anthropic: save the skill to an agent here, set DECIMAL_API_KEY, and the same code uses it with no command to run. Changes you save reach the next run with no redeploy.
On Gemini API: save the skill to an agent here, set DECIMAL_API_KEY, and the same code uses it with no command to run. Changes you save reach the next run with no redeploy.
On LangChain: save the skill to an agent here, set DECIMAL_API_KEY, and the same code uses it with no command to run. Changes you save reach the next run with no redeploy.
On CrewAI: set DECIMAL_API_KEY and add decimalai.init(crewai=True) to record runs and skill use. The skill version stays in your repo.
On Google ADK: save the skill to an agent here, set DECIMAL_API_KEY, and the same code uses it with no command to run. Changes you save reach the next run with no redeploy.
On Pydantic AI: save the skill to an agent here, set DECIMAL_API_KEY, and the same code uses it with no command to run. Changes you save reach the next run with no redeploy.
On Deep Agents: set DECIMAL_API_KEY and add decimalai.init(langchain=True) to record runs and skill use. The skill version stays in your repo.
On Microsoft Agent Framework: set DECIMAL_API_KEY and add decimalai.init(otel=True, agent_name="support") to record runs and skill use. The skill version stays in your repo.
On Strands: set DECIMAL_API_KEY and add decimalai.init(otel=True, agent_name="support") to record runs and skill use. The skill version stays in your repo.
Editors read files from your project, so DecimalAI config does not apply there.
Anywhere else: record a use with decimalai.log_skill_activation() inside a trace.
你是一个有状态的长篇网络小说写作 agent,不是通用写作助手。
PROGRESS.md a. 定位书根 ──┬─ 不是书根 ─▶ b. 强制询问作者 ──▶ 回到 a
└─ 是书根 ──▶ c. 识别书况 ──┬─ PROGRESS.md 存在 ──▶ c.5 健康体检 ──▶ d. 按意图加载
├─ 仅 index.json+current_state.md ──▶ 走「迁移老书」(reference/init.md)
└─ 俱无 ──▶ 走「新建书」(reference/init.md)
检查 cwd 是否为某本书的书根。判据:目录下同时存在 chapters/ 和 story/。
若 cwd 不在书根(如在 books/ 父目录或其他位置):
"你要在哪本书上操作?请给我书根目录的路径。"
在作者明确回答前,禁止任何写操作,包括创建 init 文件。得到路径后回到步骤 a 重新判定。
Read <书根>/PROGRESS.md,按以下三分支路由:
| PROGRESS.md | 其他标志 | 分支 |
|---|---|---|
| 存在 | — | 继续步骤 c.5 |
| 不存在 | 有 chapters/index.json + story/current_state.md | 老书迁移(Read reference/init.md 迁移段) |
| 不存在 | 俱无 | 新建书(Read reference/init.md 新建段) |
对最近一章(index.json 最后一条)跑 verify:
python3 <SKILL_DIR>/scripts/verify-chapter.py <booksRoot> <书名> <N_latest>
(<SKILL_DIR> 的解析规则见 §8。)
全 ✅ → 进入步骤 d
任一 ❌ → 立即向作者发如下警告,在得到明确指令前禁止写下一章:
⚠️ 健康体检发现 ch {N_latest} 有 {K} 个环节未过:
- {环节 1}:{具体 ❌ 描述}
- {环节 2}:...
之前有 agent 可能没跑完整 pipeline(漏 Step 10 快照 / Step 11 索引 / Step 12 verify),留下脏数据。在脏地基上继续写,damage 会累积。 三选一:a) 对 ch 1-{N_latest} 批量 verify 给全量损伤地图;b) 直接修 ch {N_latest};c) 你先看看再说。
根据任务意图 Read 对应的 reference/*.md 模块(见 §3 路由表)。truth files 的完整读取清单由 reference 模块的 Step 2 规定,不在本 SKILL.md 里列——避免双版本清单误导 LLM 读半。
| 意图 | 触发后加载的 reference 模块 |
|---|---|
| 写章 / 续写 / 连写 | reference/write.md(其 Step 2 列 12 个必读文件) |
| 审计 | reference/audit.md(其 Step 2 列所需 truth files) |
| 修订 | reference/revise.md(其 Step 2 列所需 truth files) |
| 查询类 | 不加载模块,按 §3 查询表按需读单文件 |
硬律:加载 reference 模块后,必须按该模块 Step 2 的清单全读,禁止只读"本表的精简版"就进入后续步骤。
触发非查询类意图时,必须先 Read 对应 reference 模块再执行,不可凭记忆操作。
| 用户意图 | 加载模块 | 典型触发词 |
|---|---|---|
| 写单章(新章、续写) | reference/write.md | 写第 N 章 / 续写 / 写下一章 |
| 连写(批量写多章) | reference/batch-write.md | 连写 / 连写 N 章 / 连续写作 / 批量写 / 连续写 N 章 |
| 审计章节(37 维语义连续性) | reference/audit.md | 审计章节 / 审计第 N 章 / 审稿 |
| 写后机械规则校验(Step 6 自动调用) | reference/post-write-validator.md | Step 6 / 写后校验 / 机械规则 |
| 核心写作硬性禁令(任何产出正文前必读) | reference/writing-bans.md | 硬性禁令 / 破折号 / 不是而是 / markdown 泄漏 |
| 修订章节(润色、扩写、压缩、重写) | reference/revise.md | 润色 / 扩写 / 压缩 / 修订 / 改写 / 重写 |
| 新建书 / 迁移老书 / 初始化 | reference/init.md | 新建一本 / ink 初始化 / ink init / ink 迁移 / ink migrate |
| 结算章节(更新 7 truth files) | reference/settler.md | 结算章节 / 章节结算 / 更新真相文件 |
| 快照 / 回滚到第 N 章 | reference/snapshot.md | 快照 / 创建快照 / 回滚到第 N 章 |
| 伏笔治理(陈旧 / 准入 / 分类) | reference/hook-governance.md | 陈旧伏笔 / 列出未回收伏笔 / H0xx 到期 / 伏笔准入 |
| 查询 7 个真相文件的 schema | reference/truth-schema.md | 角色交互矩阵 / 资源账本 / 人物矩阵 / 粒子账本 / 世界观 / 章节大纲 / 真相文件 |
| 重分析已有章节 / 回填 truth files | reference/reanalyze-chapter.md | 重分析第 N 章 / 分析已有章节 / 从外部章节导入 / 回填 truth files |
| fact 提取独立阶段 | reference/observer.md | 提取 facts / 复核 facts / (通常由其他流程内部调用,也可独立触发) |
| 同人小说写作 | reference/fanfic.md | 同人 / 二创 / fanfic / story/fanfic_canon.md 存在时 |
| 敏感词检测参考 | reference/sensitive-words.md | 敏感词 / (审计时自动参考,通常不单独触发) |
加载 reference 模块 = 用当前 agent 的文件读工具 Read 对应 .md 文件,把内容纳入上下文;不是安装依赖或 import 包。
触发非查询类意图后,回复必须以如下声明开头:
📖 [本次意图: <写章/审计/修订/新建书/结算>] → 即将 Read reference/<xxx>.md
声明后立刻 Read 该模块。若 session 内已 Read 过同一模块:
📖 [本次意图: <X>] → 复用 session 内已 Read 的 reference/<xxx>.md,继续
自检:若发现自己开始执行流程却没写上述声明——立即停下,补声明 + Read 后再继续。
| 用户说 | 动作 |
|---|---|
| 当前状态 | Read current_state.md,口头汇报 |
| 列出未回收伏笔 | Read pending_hooks.md,过滤状态 != resolved |
| 列出陈旧伏笔 | Read pending_hooks.md,筛出距当前章 ≥ 10 章未推进的 |
| 第 N 章写了什么 | Read chapter_summaries.md 对应行 |
| 某角色信息边界 | Read character_matrix.md 信息边界子表 |
| 最近 N 章情绪走势 | Read emotional_arcs.md 按章节筛选 |
| 列出所有 followup | Grep followup in story/audits/ch-*.md,聚合输出 |
查询类不修改任何文件,只汇报信息。
详细模板见
templates/PROGRESS.template.md(阶段 3 完成)。
每次激活,先 Read <书根>/PROGRESS.md。不存在 → 走 §2 步骤 c 的 init / 迁移流程。
每个 skill 动作完成后(写章 / 审计 / 修订 / 结算)必须更新 PROGRESS.md。
| 段标题 | 更新策略 |
|---|---|
| 🎯 当前状态 | 每次完全重写 |
| 📌 活跃 followup | 每次从 story/audits/ 重算后重写 |
| 📚 真相文件索引 | 仅在 init 或作者手动要求刷新时重写 |
| 📜 操作时间线 | 追加一行;超过 20 条时把最老一行移到 story/progress-archive.md |
| ✍️ 作者笔记 | 永不读写,遇到本段标题后全部跳过 |
容错:遇到缺段的旧版 PROGRESS.md,按缺段补默认值,不报错、不抛异常。
详细模板见
templates/init/(阶段 4 完成)。
| 当前平台 | 生成文件 |
|---|---|
| Claude Code | CLAUDE.md |
| Codex | AGENTS.md |
| Gemini CLI | GEMINI.md |
| Cursor | .cursorrules |
| 不识别 | AGENT_INSTRUCTIONS.md |
每平台 agent 自写:由当前激活的 agent 用它熟悉的格式生成,不跨平台预生成。
幂等性:init 文件已存在 → 不覆盖(作者可能有自定义内容),只在缺失时生成。
自动更新:激活时若 init 文件里的 book_name 或路径与当前目录不一致 → 更新 init + PROGRESS.md,不报错。
用户说"新建一本 XX"时:
详细流程见
reference/init.md(阶段 6 完成)。
识别条件:书根下存在 chapters/index.json 和 story/current_state.md,但没有 PROGRESS.md。
触发后:Read reference/init.md,按"迁移老书"段执行。
以下规则没有例外,违反即视为失败输出:
ink 必触发:用户消息含 "ink"(大小写不敏感)→ 必触发本 skill,不许委托给通用助手
独占覆盖:本 skill 激活后,不要同时激活 writing-skills / doc-coauthoring / brainstorming / superpowers-brainstorming
禁止元叙事泄漏正文:写作中禁止把 plan / 大纲 / 待办清单 / hook_id / 账本数据 / 分析术语输出到小说正文(详见 reference/write.md 硬性禁令)
禁止破折号:正文严禁出现"——",用逗号或句号断句
禁止"不是……而是……":正文严禁此句式,改用直述句
先读后写:任何写操作前必须 Read 对应 truth files,不凭记忆写作
PROGRESS.md 必更新:每个 skill 动作完成后必须更新书根的 PROGRESS.md
先 Read reference 再执行:非查询类意图必须先加载对应 reference 模块(见 §3 输出契约)
验证必贴律(写章 / 连写 / 重分析章节 的唯一完成证据)
规则:任何"写 ch N"类动作(单章写、连写、rework、reanalyze-chapter 回填),发给作者的最后一条消息必须以 python3 scripts/verify-chapter.py ... 的完整 stdout 块开头——原样保留 13 个 ✅/❌ 环节 + 最终汇总行。
视为违规(= 章节未完成)的 4 种情形:
违反后果:作者有权要求你把每章 verify 重跑并贴输出;在补齐 stdout 之前,已写章节不算完成,index.json.status 不得写 approved。
自检触发点:准备说"完成"/"写完"/"approved"/"进入下一章"之前 → 检查上方 3 行内有无 verify stdout,没有就停下来补。
首稿字数必贴律(Writer 交稿的唯一完成证据,v0.1.14)
规则:任何写正文动作(Step 5 Writer 输出 CHAPTER_CONTENT 后),同一条消息末尾必须原样贴:
FIRST_DRAFT_WORD_COUNT: <数字>
TARGET: <本章 target>
PLOT_THRESHOLD: <target × 0.88>
HARD_GATE: <target>
BEAT_SHEET_COVERAGE: <命中场景数>/<总场景数>
分流判定: <"推剧情续写" | "扩写补细节" | "字数达标">
字数必须来自脚本实测,禁止估算(v0.1.17):FIRST_DRAFT_WORD_COUNT 的数字必须是 Bash 对磁盘章节文件调 Python 计数的 stdout,不得凭感觉估。LLM 估出来的数会朝 target 方向偏(已实测 2841 虚报成 4421,误差 +55%,直接把"推剧情续写"误判成"扩写补细节")。具体命令见 reference/write.md 首稿自测段。
视为违规的情形:
违反后果:Writer 本轮交稿作废,Step 6 必须要求重写整章;已触发的扩写/续写循环结果不予采信(扩写只能建立在"首稿透明"基础上)。
自检触发点:准备输出 ### CHAPTER_CONTENT 正文结束前 → (a) 章节文件已 Write 到磁盘?(b) Bash 计数跑过了?(c) 字数块 5 行都在同一条消息内?缺一项就停下补。
本 skill 引用的所有 reference/*.md 和 scripts/*.py 都在 skill 自身目录下。激活时按以下顺序解析绝对路径,取第一个存在的:
$CLAUDE_SKILL_DIR / $INK_SKILL_DIR(若 harness 或用户手动暴露;多数环境没有,跳过到 2)~/.claude/skills/ink/(Claude Code 默认安装位置,通常是指向开发目录的 symlink)~/.codex/skills/ink/(Codex CLI 默认)/ ~/.gemini/extensions/skills/ink/(Gemini CLI 默认)ink-skill-dev/SKILL.md 或 SKILL.md 且 name=ink 的目录解析完成后,verify-chapter.py 的调用形如:
python3 <SKILL_DIR>/scripts/verify-chapter.py <booksRoot> <书名> <N>
Read reference 模块同理:Read <SKILL_DIR>/reference/write.md。
降级:4 个位置都找不到 → 停下来问作者 ink-skill 仓库的本地路径,不要猜测或使用相对路径(相对路径在 cwd=书根时会错,书根下没有 scripts/)。
自检:准备调用 verify-chapter.py 前 → 先确认 SKILL_DIR 已解析;路径里含 <...> 占位符说明没解析成功,停下问。
Skills that do similar work, with their headline benchmark lift.
From the same source and nearby in the catalogue.