Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Typeset a finished academic Markdown manuscript into submission-ready and publication-preview outputs — WITHOUT altering any number, citation, or claim. Produces four artifacts: submission DOCX (pandoc + APA-7 reference-docx), submission PDF (LaTeX apa7 man: double-spaced, line-numbered, tables/figures end-placed), published-look preview PDF (apa7 jou two-column), and the clean Markdown. Fidelity is a hard script gate (exit 2, no --warn-only): every output is token-compared against its source an
SkillScore96/100
Test results 96
3/3 safety checks passed
13%96%of test cases passed +83 pts
Passed 22 of 23 test cases with the skill, and 3 of 23 without it.
19 fixed3 passed either way1 still failing0 broke
One test taskWhat exact extracted text stream is compared against the stripped source markdown during fidelity verification of a generated docx file?
Adds every file the skill has, pinned so you can update it. No account needed.
pip install "decimalai>=0.15"
decimalai skills add o0000-code-manuscript-typeset
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("o0000-code-manuscript-typeset")
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 o0000-code-manuscript-typesetThe 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/o0000-code-manuscript-typeset/SKILL.md https://app.decimal.ai/s/o0000-code-manuscript-typeset/SKILL.md.claude/skills/o0000-code-manuscript-typeset/SKILL.mdThis gets SKILL.md only. The skill's 15 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 o0000-code-manuscript-typesetimport 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("o0000-code-manuscript-typeset")
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/o0000-code-manuscript-typeset/SKILL.mdimport asyncio
from pathlib import Path
from claude_agent_sdk import ClaudeAgentOptions, query
skill = Path(".agents/skills/o0000-code-manuscript-typeset/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 15 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 o0000-code-manuscript-typesetfrom 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("o0000-code-manuscript-typeset")
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/o0000-code-manuscript-typeset/SKILL.mdfrom pathlib import Path
from agents import Agent, Runner
skill = Path(".agents/skills/o0000-code-manuscript-typeset/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 15 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 o0000-code-manuscript-typesetimport 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("o0000-code-manuscript-typeset")
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/o0000-code-manuscript-typeset/SKILL.mdfrom pathlib import Path
from openai import OpenAI
client = OpenAI()
skill = Path(".agents/skills/o0000-code-manuscript-typeset/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 15 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 o0000-code-manuscript-typesetimport 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("o0000-code-manuscript-typeset")
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/o0000-code-manuscript-typeset/SKILL.mdfrom pathlib import Path
import anthropic
client = anthropic.Anthropic()
skill = Path(".agents/skills/o0000-code-manuscript-typeset/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 15 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 o0000-code-manuscript-typesetfrom 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("o0000-code-manuscript-typeset")
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/o0000-code-manuscript-typeset/SKILL.mdfrom pathlib import Path
from google import genai
from google.genai import types
client = genai.Client()
skill = Path(".agents/skills/o0000-code-manuscript-typeset/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 15 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 o0000-code-manuscript-typesetfrom 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("o0000-code-manuscript-typeset")
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/o0000-code-manuscript-typeset/SKILL.mdfrom pathlib import Path
from langchain.agents import create_agent
skill = Path(".agents/skills/o0000-code-manuscript-typeset/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 15 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 o0000-code-manuscript-typesetimport 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("o0000-code-manuscript-typeset")
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/o0000-code-manuscript-typeset/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 15 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 o0000-code-manuscript-typesetfrom 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("o0000-code-manuscript-typeset")
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/o0000-code-manuscript-typeset/SKILL.mdfrom pathlib import Path
from google.adk.agents import LlmAgent
skill = Path(".agents/skills/o0000-code-manuscript-typeset/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 15 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 o0000-code-manuscript-typesetfrom 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("o0000-code-manuscript-typeset")
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/o0000-code-manuscript-typeset/SKILL.mdfrom pathlib import Path
from pydantic_ai import Agent
skill = Path(".agents/skills/o0000-code-manuscript-typeset/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 15 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 o0000-code-manuscript-typesetimport 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("o0000-code-manuscript-typeset")
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/o0000-code-manuscript-typeset/SKILL.mdfrom pathlib import Path
from deepagents import create_deep_agent
skill = Path(".agents/skills/o0000-code-manuscript-typeset/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 15 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 o0000-code-manuscript-typesetimport 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("o0000-code-manuscript-typeset")
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/o0000-code-manuscript-typeset/SKILL.mdimport asyncio
from pathlib import Path
from agent_framework import Agent
skill = Path(".agents/skills/o0000-code-manuscript-typeset/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 15 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 o0000-code-manuscript-typesetfrom 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("o0000-code-manuscript-typeset")
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/o0000-code-manuscript-typeset/SKILL.mdfrom pathlib import Path
from strands import Agent
skill = Path(".agents/skills/o0000-code-manuscript-typeset/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 15 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 o0000-code-manuscript-typesetNo Python or account. Cursor, Copilot, Cline and Warp read this folder by themselves.
curl -fsSL --create-dirs -o .agents/skills/o0000-code-manuscript-typeset/SKILL.md https://app.decimal.ai/s/o0000-code-manuscript-typeset/SKILL.md.agents/skills/o0000-code-manuscript-typeset/SKILL.mdThis gets SKILL.md only. The skill's 15 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 15 other files are not included.
Raw files: /s/o0000-code-manuscript-typeset/SKILL.md · /s/o0000-code-manuscript-typeset.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/o0000-code-manuscript-typeset/SKILL.mdcurl -fsSL https://app.decimal.ai/s/o0000-code-manuscript-typeset.jsonThis gets SKILL.md only. The skill's 15 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.
把一篇已定稿的学术 Markdown 手稿排成投稿版 / 发表预览版的通用排版 Skill。它不做内容写作——内容属别的 Skill;它做的是版式变换:md → 投稿 docx / 投稿 PDF / 发表预览 PDF / 干净 md 四件,附忠实性声明、占位符清单、剥离报告。上游任意写作 Skill(元分析 L12、系统综述、empirical-imrad-writing 等)成稿后产一份 typeset_request.yaml 调用它;也有独立触发场景("把这篇稿子排成投稿版")。
第一可执行入口:§4 输入契约(
typeset_request.yaml)+ §9 CLI。完整字段 schema 见references/MANUSCRIPT-INPUT-CONTRACT.md,CLI 权威汇总见README.md。
排版层不得改动任何数字、引用或 claim——一个都不行。 这不是一句承诺,是一条脚本断言:每件产物落盘前必过 fidelity_check——源(strip 后的 md)与产物(去 LaTeX 宏的 tex / 去 XML 的 docx 文本)逐 token 比对,两条硬门(退出码 2,该件不落、整体阻断,无 --warn-only):①任何在产物里出现、源里没有的数 → fail——忠实渲染从不凭空造数(实测 EXTRA=0),故任何注入或改动(含纯整数计数:研究数、PRISMA 记录数、千分位样本量、表格单元格计数)必现形;②任何载荷性数字或 DOI 缺失 → fail——载荷=数据形数值(效应量/CI/p 值/%/τ²/权重)+ 标签绑定关系(k= / N= / p< …,含关系符,比较符翻转 p<.001→p>.001 也拦)+ DOI。诚实边界(唯一未硬拦的方向):仅"纯删除"一个格式层合法重排的裸整数(参考文献页码 / DOI 内嵌年份 / 引擎另渲的标题计数,源里有产物合法省略)呈报供复核、不硬拦——改动永远拦,只有这类裸整数的静默删除落复核(详见 references/FIDELITY-DISCIPLINE.md §2/§4c)。
排版是版式变换,不是内容再加工。凡涉及改动数字 / 引用 / claim 的"优化"(顺手改个措辞、"修正"一个看着不对的数、自动翻译一句),一律不属于本 Skill 的职责边界——那是上游写作/核验 Skill 的事。实战范式一句话:"No verified number, citation, or claim was altered." 本 Skill 把它从"靠 agent 自觉 + 一句声明"升级为机器强制门,这是相对实战的核心增量。
名值绑定边界(诚实,不假装覆盖):fidelity_check 的逐字比对天然覆盖"排版层改了正文的数"——改了必被抓。但它对'输入件本身名值已错'无能为力:若上游表格里 "Costa 的 0.77" 被错标成 "Abbott et al.",两侧看到的是同一份(错的)绑定,判等放行。这类"名字配错了数据"是版式检查与数字比对之外的第三类检查,超出排版层职责。凡交付物含 study 名↔数值绑定(表格 / 图注),BUILD_NOTES 明写此边界,建议上游 / 署名人抽查(见 references/TYPESET-BUILD-NOTES-PATTERN.md)。
英文:typeset manuscript、submission-ready manuscript、publication-ready、submission docx / PDF、APA 7 manuscript formatting、reference-docx、apa7 man/jou、camera-ready、strip internal traces。 中文:把 md 学术稿排成投稿版 / 发表版、出投稿 docx / PDF、投稿排版、发表预览、学术排版、内部痕迹剥离、生成投稿 Word。
| 用户场景 | 切到 |
|---|---|
| 写 / 改内容本身(Intro/Method/Results/Discussion 措辞) | 对应写作 Skill(empirical-imrad-writing / meta-analysis L11 / systematic-review) |
| 参考文献核验 / 修 DOI / APA 格式化 | academic-ref-check(本 Skill 消费其核验产物,不代做核验) |
| forest / funnel / PRISMA / RoB 图渲染 | meta-analysis 内置 ma-plots 渲染器 / ssci-plots |
| 编号制期刊(Vancouver / AMA / NEJM 数字上标引用) | 须 CSL 档——v2 延期,见 §5 边界 |
| md 通用转 Word(非学术投稿规范) | academic-paper-converter 等通用转换 Skill |
typeset_request.yaml 调本 Skill。假设前提 = md 已定稿、引用已核验——本 Skill 不回头改内容。typeset_request.yaml(或让本 Skill 据 md YAML 头兜底元数据)即可跑。| 产物 | 引擎 | 说明 |
|---|---|---|
| 投稿 docx | pandoc + reference-apa7.docx | APA 7 样式一次调校成 committed 资产;行号走 OOXML 后处理(stdlib,不依赖 python-docx) |
| 投稿 PDF(apa7 man) | XeLaTeX + apa7 类 | 双倍行距 + 行号(lineno)+ 图表末置 + CJK 0 缺字 |
| 发表预览 PDF(apa7 jou) | XeLaTeX + apa7 类 | 双栏单倍行距 + \leftheader 适配 + 悬挂缩进 0.18in + 宽内容 \onecolumn 末置 |
| generic PDF(兜底) | XeLaTeX + 通用 article | 无 apa7 类依赖时的单栏投稿兜底 |
为什么不追求 pandoc 单引擎出 PDF:apa7 的 man/jou 细节——自动 title page、running head、行号、de-float 末置结构、CJK unicode-map 逐字符映射、jou 双栏适配(leftheader/hang/onecolumn/de-float GRADE 表)——pandoc 的默认模板做不到。实战已把 LaTeX 这条路验证到 0 error / 0 缺字 / 双 PDF 均成功编译,故双引擎各司其职:docx 只走 pandoc + reference-docx,PDF 只走 LaTeX。docx 的 CJK 与复杂表格能力弱于 LaTeX,BUILD_NOTES 诚实标注每件质量状态。
typeset_request.yaml;G9 据此接线)上游产 typeset_request.yaml,声明:manuscript(正文 md)/ outputs(请求的输出子集)/ template_family(apa7 | generic)/ metadata(题录,md YAML 头兜底)/ references(默认档 = 保真渲染)/ tables(md: pandoc 或 raw_tex: 直通双形态)/ figures(末置,顺序即呈现序)/ strip_rules(可选)/ docx_line_numbers(可选)。
逐字段 schema、manuscript.md YAML 头约定、IMRaD 标题层级、metadata 覆盖规则,全文见 references/MANUSCRIPT-INPUT-CONTRACT.md(这是 G9 接线的权威)。最小可跑样例 = scripts/typeset_request.example.yaml(指向 scripts/tests/fixtures/smoke/ 的合成非元分析 IMRaD 稿,证通用性)。
请求的 outputs 子集,每件如 §3;此外每次必产三份附件:
BUILD_NOTES.md — 忠实性声明 + recompile 指令 + 每件质量状态(页数 / 缺字数 / overfull)+ 名值绑定边界诚实声明。模板见 references/TYPESET-BUILD-NOTES-PATTERN.md。PLACEHOLDERS.md — 占位符清单(author / affiliation / funding / corresponding,PDF/docx 内清楚标记,待用户填)。STRIP_REPORT.md — 剥离报告(剥了什么 / 留了什么 / 为什么——判断留痕)。## 组标题 分组,如 Cited / Included / Excluded,每条一段)→ hanging-indent tex(man 0.5in / jou 0.18in)。不引入 citeproc、不走 .bib。academic-ref-check 一条愿望——核验时同步产出 verified CSL-JSON 侧车(核验器本就查 CrossRef/OpenAlex,结构化数据在手,顺手落盘零成本)。此后 CSL 档 = 同一核验真值的第二渲染,双档从"保真 vs 灵活"两难变成"同一真值两渲染"。排版前对全部输入件(正文 + 参考 + 表格)按 strip_rules.yaml 剥离内部过程痕迹,产剥离报告。这是实战发现的新问题类别:
SP7 §3c / SP7 open item)、内部 corpus ID(papersearchpro-1628,直接致 overfull hbox)、过程顶注(L11 integrated final draft)。SP1–SP7 sign-off gates 是有意的监督流程披露)——strip 规则精确到能区分,判断入剥离报告留痕。SP7 §3c 在 References、papersearchpro-1628 在 Table 1 ID 列)——strip 范围 = 全部排版输入件,别只 grep 正文。strip_rules 缺失 → 恒等复制 + 报告声明"未配置"(不阻塞)。规则 schema 见 references/STRIP-RULES-SPEC.md(Lane C)。
| 码 | 含义 |
|---|---|
0 | 成功(请求输出全建 + fidelity 全绿) |
1 | 输入 / 契约错(request 缺字段 / 文件缺失 / 硬依赖缺失且无降级)——硬 fail |
2 | fidelity 断言失败 或 strip 安全违规(数字 / 引用 / claim 变动)——铁律,不设 --warn-only,必阻断,不落该件 |
3 | 空(无正文可排) |
依赖降级(honest):缺 xelatex → 降级为 docx + md 两件(请求的 PDF 件标记 skipped,stderr WARN + BUILD_NOTES 声明,整体 exit 0);缺 pandoc → 连 docx 不能出 → exit 1。fidelity 失败永不降级(码 2 硬阻断)。详见 §8 + README。
pandoc(docx 必需)、xelatex(TinyTeX,PDF 必需)、python3 + pyyaml。python-docx / lxml:reference-apa7.docx 是 committed 二进制资产;docx 行号注入用 stdlib zipfile+xml。make_reference_docx.py 用 python-docx 仅 dev-time(重生成资产时),用户不需要。typeset.py 启动查 shutil.which('pandoc'/'xelatex'),据此决定是否降级(见 §7)。降级路径权威汇总见 README.md。编排器 typeset.py 读 request → strip_traces(所有输入件)→ 对每个请求引擎跑 build_pdf / build_docx → 对每件产物跑 fidelity_check(source=stripped 输入,rendered=该产物) → 全绿才落该件;任一 fidelity fail(码 2)→ 该件不落 + 整体 exit 2 + 报告。产 BUILD_NOTES / PLACEHOLDERS / STRIP_REPORT。
四个底层脚本(build_pdf.py / build_docx.py / strip_traces.py / fidelity_check.py)+ 编排器 typeset.py 的完整 CLI 签名、参数、机读摘要 JSON、退出码,权威汇总见 README.md。
apa7(man + jou)+ generic。APA 7 覆盖心理学 / 社科主战场,够第一版。scripts/templates/<family>/ 只留空槽位(Elsevier / 双栏会刊等)——按真实需求再加 = v2,不预填。raw_tex: 直通,本 Skill 绝不自译(违忠实性)。manuscript-typeset/
├── SKILL.md 本文件:触发 / 忠实性纪律 / 输入契约 / 双引擎 / 边界
├── README.md CLI 签名权威 + 依赖探测 + 降级路径 + 目录导览
├── LICENSE dual: PolyForm-NC 1.0.0 (code) + CC BY-NC-SA 4.0 (docs)
├── references/
│ ├── MANUSCRIPT-INPUT-CONTRACT.md 输入契约全文(G9 接线权威)
│ ├── TYPESET-BUILD-NOTES-PATTERN.md BUILD_NOTES / 占位符 / 忠实性声明 / 名值边界 模板
│ ├── FIDELITY-DISCIPLINE.md 铁律 + 断言覆盖边界(Lane C)
│ └── STRIP-RULES-SPEC.md strip_rules schema + 剥离报告格式(Lane C)
└── scripts/
├── typeset.py 编排器(读 request → strip → 引擎 → fidelity gate → 四件+附件)
├── build_pdf.py / build_docx.py PDF / docx 引擎
├── strip_traces.py / fidelity_check.py 剥离 + 忠实性门
├── typeset_request.example.yaml 最小可跑样例(指向合成非 MA 稿)
├── assets/tex/ preamble-common / unicode-map / apa7-man/jou/generic 模板
├── assets/docx/reference-apa7.docx APA7 样式 reference-docx(committed 资产)
├── templates/<family>/ v2 期刊族槽位(空)
└── tests/ 各引擎回归 + fixtures/smoke 非 MA 冒烟稿
Skills that do similar work, with their headline benchmark lift.
From the same source and nearby in the catalogue.