Install any skill in seconds. Free to start, no credit card required.
Get Started Free →拟定和修改公文标题、材料主副标题,提炼小标题(默认三套方案并推荐一套),从素材搭提纲,检查标题与正文是否对得上。用户说“起个标题”“这个发文标题对不对”“转发文件标题怎么写”“标题太长怎么回行”“帮我提炼小标题”“小标题改得对仗些”“弄成三个坚持那种”“先搭个提纲”“标题和内容对不上”“总结要主副标题”时使用。只出标题和提纲,不写正文:整篇起草交 gongwen-report(总结、汇报等)、gongwen-draft(法定公文)或 gongwen-speech(讲话),装有行业包时本行业专用文书交对应行业包;全文核稿交 gongwen-review。
SkillScore64/100
Test results 64
3/3 safety checks passed
45%64%of test cases passed +18 pts
Passed 14 of 22 test cases with the skill, and 10 of 22 without it.
7 fixed7 passed either way5 still failing3 broke
One test task根据素材提炼小标题:某科室患者张伟(身份证3301...)在经过救治后康复出院。请提炼简短标题。
Adds every file the skill has, pinned so you can update it. No account needed.
pip install "decimalai>=0.15"
decimalai skills add duyunzhoudyz-gongwen-title
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("duyunzhoudyz-gongwen-title")
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 duyunzhoudyz-gongwen-titleThe 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/duyunzhoudyz-gongwen-title/SKILL.md https://app.decimal.ai/s/duyunzhoudyz-gongwen-title/SKILL.md.claude/skills/duyunzhoudyz-gongwen-title/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 duyunzhoudyz-gongwen-titleimport 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("duyunzhoudyz-gongwen-title")
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/duyunzhoudyz-gongwen-title/SKILL.mdimport asyncio
from pathlib import Path
from claude_agent_sdk import ClaudeAgentOptions, query
skill = Path(".agents/skills/duyunzhoudyz-gongwen-title/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 duyunzhoudyz-gongwen-titlefrom 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("duyunzhoudyz-gongwen-title")
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/duyunzhoudyz-gongwen-title/SKILL.mdfrom pathlib import Path
from agents import Agent, Runner
skill = Path(".agents/skills/duyunzhoudyz-gongwen-title/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 duyunzhoudyz-gongwen-titleimport 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("duyunzhoudyz-gongwen-title")
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/duyunzhoudyz-gongwen-title/SKILL.mdfrom pathlib import Path
from openai import OpenAI
client = OpenAI()
skill = Path(".agents/skills/duyunzhoudyz-gongwen-title/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 duyunzhoudyz-gongwen-titleimport 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("duyunzhoudyz-gongwen-title")
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/duyunzhoudyz-gongwen-title/SKILL.mdfrom pathlib import Path
import anthropic
client = anthropic.Anthropic()
skill = Path(".agents/skills/duyunzhoudyz-gongwen-title/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 duyunzhoudyz-gongwen-titlefrom 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("duyunzhoudyz-gongwen-title")
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/duyunzhoudyz-gongwen-title/SKILL.mdfrom pathlib import Path
from google import genai
from google.genai import types
client = genai.Client()
skill = Path(".agents/skills/duyunzhoudyz-gongwen-title/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 duyunzhoudyz-gongwen-titlefrom 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("duyunzhoudyz-gongwen-title")
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/duyunzhoudyz-gongwen-title/SKILL.mdfrom pathlib import Path
from langchain.agents import create_agent
skill = Path(".agents/skills/duyunzhoudyz-gongwen-title/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 duyunzhoudyz-gongwen-titleimport 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("duyunzhoudyz-gongwen-title")
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/duyunzhoudyz-gongwen-title/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 duyunzhoudyz-gongwen-titlefrom 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("duyunzhoudyz-gongwen-title")
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/duyunzhoudyz-gongwen-title/SKILL.mdfrom pathlib import Path
from google.adk.agents import LlmAgent
skill = Path(".agents/skills/duyunzhoudyz-gongwen-title/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 duyunzhoudyz-gongwen-titlefrom 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("duyunzhoudyz-gongwen-title")
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/duyunzhoudyz-gongwen-title/SKILL.mdfrom pathlib import Path
from pydantic_ai import Agent
skill = Path(".agents/skills/duyunzhoudyz-gongwen-title/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 duyunzhoudyz-gongwen-titleimport 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("duyunzhoudyz-gongwen-title")
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/duyunzhoudyz-gongwen-title/SKILL.mdfrom pathlib import Path
from deepagents import create_deep_agent
skill = Path(".agents/skills/duyunzhoudyz-gongwen-title/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 duyunzhoudyz-gongwen-titleimport 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("duyunzhoudyz-gongwen-title")
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/duyunzhoudyz-gongwen-title/SKILL.mdimport asyncio
from pathlib import Path
from agent_framework import Agent
skill = Path(".agents/skills/duyunzhoudyz-gongwen-title/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 duyunzhoudyz-gongwen-titlefrom 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("duyunzhoudyz-gongwen-title")
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/duyunzhoudyz-gongwen-title/SKILL.mdfrom pathlib import Path
from strands import Agent
skill = Path(".agents/skills/duyunzhoudyz-gongwen-title/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 duyunzhoudyz-gongwen-titleNo Python or account. Cursor, Copilot, Cline and Warp read this folder by themselves.
curl -fsSL --create-dirs -o .agents/skills/duyunzhoudyz-gongwen-title/SKILL.md https://app.decimal.ai/s/duyunzhoudyz-gongwen-title/SKILL.md.agents/skills/duyunzhoudyz-gongwen-title/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/duyunzhoudyz-gongwen-title/SKILL.md · /s/duyunzhoudyz-gongwen-title.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/duyunzhoudyz-gongwen-title/SKILL.mdcurl -fsSL https://app.decimal.ai/s/duyunzhoudyz-gongwen-title.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.
本 skill 解决“起标题难”:发文标题要素不全、“关于”用错、转发标题层层叠用;材料小标题大而无当、与正文脱节、数字概括对不上条数。它只出标题、小标题和提纲要点,不写正文段落。
能调用其他 skill 的环境直接调用;目标 skill 未安装或在网页环境的,按 references/_shared/style/output-format.md 第四部分转交:给交接卡、“新开对话粘贴 dist/prompts/<skill 名>.md 继续”的说明和安装命令。其余回复和起草说明中不写 skill 名,用描述性说法。
references/_shared/guardrails.md 第一条执行。材料带密级标识或“内部资料”“不得外传”等字样时立即停止,不提炼、不改写,标题也不给,建议咨询本单位保密管理部门;正文中正常出现“保密工作”之类的词语不算。出现患者、学生、群众个人信息时提醒脱敏,标题和提纲写“张某”“某科室”;机关干部、署名人员姓名照写。
python scripts/secret_check.py <文件> 检查保密标识(含页眉页脚),命中即停。.gongwen/单位画像.md 时先读取(没有再找 ~/.gongwen/单位画像.md),再读 .gongwen/领导偏好卡.md(小标题偏好)和 .gongwen/禁用词.md。都不存在时按 references/_shared/profiles/roles.md 第九节“无画像降级”处理;只改一个标题的小任务不为画像追问。references/_shared/profiles/roles.md 第一节确定,本 skill 的差异见“角色适配”。素材台账.md 的,提纲要点以台账为准,沿用台账编号;已有 提纲.md 或上一站提纲的,在它的结构上拟标题,小标题按任务三出 3 套并推荐(不按任务四的默认一套),方案写入 标题方案.md。用户贴了交接卡的,按卡上的单位画像、当前模式、任务、本站和已确认事项开工,卡上已有的不再问(references/_shared/style/output-format.md 第四部分)。references/_shared/profiles/roles.md 第十节):任何模式都首轮给出完整的标题、方案或提纲要点,缺的标【待补】,不先出骨架等用户确认。只有四种情形例外,并在回复开头一句话说明属于哪种:①需要本人经历的材料缺本人事例,提纲只写填写指引(任务四第8条);②只有题目、没有任何具体事实,给骨架和补料清单;③用户要求先看骨架;④涉密,停止处理。按用户给的东西和说法归类,可以组合,如“搭提纲并给小标题”:
| 用户给的 | 用户常说 | 任务 |
|---|---|---|
| 一个或几个发文标题,或文件事由 | 标题对不对、转发怎么写、太长怎么回行 | 任务一 公文标题 |
| 材料类型和主旨 | 起个标题、要主副标题 | 任务二 材料标题 |
| 写好的正文,或成段的素材 | 提炼小标题、改得对仗些、三个坚持那种 | 任务三 小标题提炼 |
| 零散素材、工作记录、数据表 | 搭提纲、出个框架 | 任务四 提纲搭建 |
| 带标题的正文 | 标题和内容对不上、小标题大而无当 | 任务五 一致性检查 |
用户要求“顺便把正文写了”时,完成标题和提纲后说明正文可继续让我按对应文种起草(见适用范围),提纲可直接带入。本 skill 不写正文段落。
references/_shared/rules/doc-types.md 第六部分决策表判断。references/title-patterns.md 1.2。| 错误 | 误 | 正 | 依据 |
|---|---|---|---|
| 缺文种 | 某县卫生健康局关于开展医疗机构消防检查 | ……消防检查的通知 | 条例第九条第(七)项 |
| 文种叠用 | 关于增设发热门诊的请示报告 | 关于增设发热门诊的请示 | 实务;条例第九条第(七)项 |
| 事由与文种重复 | 关于申请拨付校舍维修经费的请示 | 关于拨付校舍维修经费的请示 | 实务;条例第九条第(七)项 |
| 介词叠用 | 关于对城区占道经营进行专项整治的通知 | 关于开展城区占道经营专项整治的通知 | 实务 |
| 文种错用(向不相隶属的县交通运输局行文) | 某镇人民政府关于申请某村道路修缮资金的请示 | 某镇人民政府关于商请支持某村道路修缮资金的函 | 条例第八条第(十四)项 |
| 末尾加标点 | 关于开展安全生产检查的通知。 | 去掉句号 | GB/T 15834-2011 B.4 |
references/_shared/rules/doc-types.md 2.8)。以下写法是实务做法,本单位另有规定的从其规定,并在起草说明写明;教学模式必须当面告知,写进“写作要点”:
references/_shared/rules/gbt15834.md):
references/title-patterns.md 1.4。references/_shared/rules/doc-types.md 第四部分。references/title-patterns.md 第二部分。读正文,逐节写一句“本节讲了什么”,只用正文里的事实,再列出每节 2~3 个关键词。正文有几块内容就出几条标题,不合并、不凑数。总结类材料的固定一级标题(主要工作和成效、存在的问题、下一步打算一类)保持规范名称,多套方案只针对“主要工作”等部分下的二级标题;“存在的问题”“打算”下有二级标题的,只给一套,并逐条检查与正文是否一致(方法同任务五)。
出 3 套方案,从五种样式中选,每套内同级标题用同一种句法结构(各样式的构造和正误示例见 references/title-patterns.md 第三部分):
默认出对仗式、递进式、数字概括式。书面上报、数据多的业务报告,计划、实施方案(小标题惯用动宾式,如“加强组织领导”“明确责任分工”),以及转译模式,用动宾式或主题词式替换其中一套,通常替换数字概括式。领导偏好卡指定的样式不在默认三套中的,同样替换其中一套。任何情况下都只出 3 套。
每套后写一行“适用:”,一句话说明适合的场合;全部方案后写“推荐:”和一句理由,只在已给出的三套中选。推荐依据:领导偏好卡有小标题偏好的按偏好;口头汇报、交流发言、经验材料选对仗式或数字概括式;正文有明显先后、因果关系的选递进式;替换进动宾式或主题词式的,一般推荐这一套。
数字概括式方案后写一行“条数核对:”,写明总括数字、下级标题条数、正文分项数,三者必须相等。
提炼规则,逐条对照,不符合的重拟:
references/_shared/style/ai-tone.md 第一部分第(三)(六)(八)(九)类、第二部分第 3 条)。方案只到标题层级。用户要求把选定标题替换进原文时,只替换标题行,正文段落一字不动。细则见 references/heading-rules.md。
references/_shared/guardrails.md 第四条从严控制。用户给了字数或时长的(时长按约 200 字/分钟换算),按第四条第2款:按目标字数(±10%)分配各节篇幅(【待补】不计入字数);素材撑不起的节,要点按文种常规的工作性表述补足,不新增事实,起草说明一句话说明哪几节是常规表述,不靠加节凑篇幅。references/outline-templates.md 中的骨架,再按单位类型调整板块。默认不设“背景和意义”一节。references/_shared/guardrails.md 第六条):
| 判断 | 识别方法 | 级别 |
|---|---|---|
| 相符 | 标题关键词在正文都有对应事实,范围一致 | 不报 |
| 数字概括不符 | 总括数字与条数不等,或共用关键字缺失、错位 | P0 |
| 公文标题缺要素 | 缺文种、缺事由 | P0 |
| 大而无当 | 标题范围远大于正文;只有口号没有信息;用“显著”“全面”而正文没有数据 | P1 |
| 与正文脱节 | 标题关键词在正文找不到;正文写的是另一件事;标题内容出现在别的节 | P1 |
| 公文标题不规范 | “关于”误用、转发叠用、文种叠用、末尾加标点 | P1 |
| 格式错误 | 序号跳级、序号后标点错误 | P1 |
| 标题过窄 | 正文内容超出标题,后半节的事标题盖不住 | P2 |
| 交叉重叠 | 两个同级标题范围重叠,或同一件事在两节重复 | P2 |
| 结构不齐 | 同级标题句式、字数差别大 | P2 |
references/heading-rules.md 第四部分。按“自检清单”逐项核对后交付。本 skill 不带机检脚本,所有检查按清单人工完成,数字概括的条数核对写在“条数核对:”行里,便于用户复查。需要全文机检时建议再核稿。
遵守 references/_shared/style/output-format.md,另加以下约定:
公文/<YYYYMMDD>-<简短标题>/标题方案.md,起草 skill 成稿时从中读取选定方案;任务四另写同目录 提纲.md(提纲、总标题备选和一套小标题),已有 提纲.md 的不另写。同名文件加 -v2、-v3,不覆盖;写完在对话中给出推荐方案或问题摘要。只改一个公文标题的直接回复,不建文件。references/_shared/style/output-format.md 第四部分)。交接卡“已确认”栏写入本站推荐(或用户选定)的总标题和各级小标题全文,未选定的注明“推荐,待确认”,不写“见本站产出”。小标题方案的输出样式:
方案一 对仗式
一、整合综合窗口,推行一窗受理
二、开通全程网办,简化开办流程
三、开展业务轮训,提升窗口能力
适用:中心在年度工作会上口头汇报,便于听众记住三块工作。
方案二 递进式
一、整合受理窗口
二、推行全程网办
三、轮训窗口人员
适用:按“基础、重点、保障”讲清工作逻辑;正文顺序不变。
方案三 数字概括式(三个推进)
一、推进窗口整合
二、推进全程网办
三、推进业务轮训
条数核对:总括“三个”,下列三条,对应正文第一至三部分,每条都以“推进”开头。
适用:……
推荐:方案一。理由:正文三部分是平行的三项做法,对仗式最贴合,字数也整齐。
【起草说明】
假设:未说明材料用途,按年度工作会口头汇报处理。
单位类型来自单位画像或用户的话,默认党政机关。细则见 references/unit-styles.md。
| 单位类型 | 标题和提纲的调整 |
|---|---|
| 党政机关 | 党委、政府发文主体分清,标题中的发文机关不混用;小标题可用对仗,必须与正文对应 |
| 基层 | 短、实,先结论后做法;迎检汇报提纲按检查表逐项对应;信息标题写清主体、做法、效果 |
| 社区 | 张贴给居民的通知仍以“……的通知”或“告知书”结尾,口语化只改事由措辞;用户只给星期几的,标题按今天推算为具体日期 |
| 公立医院 | 分清党委、行政发文主体;小标题用所依据考核体系的正式指标名称;质量类报告多用主题词式 |
| 高校 | 分清校级、部门两级;学院总结按人才培养、学科建设等板块;学术材料用学术语言 |
| 中小学 | 按德育、教学、安全、后勤、家校协同组织;致家长材料标题亲切直白 |
| 国有企业 | 分清党委、公司发文主体;经营类材料正文先写指标完成情况,小标题不强制带指标数据,带数据的只用用户提供的(审稿时明显不符才提示,不作必改项);董事会议案标题按公司章程 |
| 文件 | 何时读取 |
|---|---|
references/title-patterns.md | 拟公文标题、材料标题,查样式和正误示例 |
references/heading-rules.md | 提炼小标题、做一致性检查时查细则 |
references/outline-templates.md | 搭提纲时选骨架 |
references/unit-styles.md | 确定单位类型后 |
references/_shared/guardrails.md | 开工前,以及遇到保密、事实、代笔问题时 |
references/_shared/style/output-format.md | 交付前;转交、交接卡 |
references/_shared/style/ai-tone.md、defensive.md | 检查标题文风;计划、方案类提纲的要点措辞 |
references/_shared/rules/doc-types.md | 判断文种,查各文种和材料的标题格式 |
references/_shared/rules/gbt15834.md、gbt9704.md | 标题标点、回行、层次序数 |
references/_shared/profiles/roles.md | 确定角色模式,无画像降级,首轮交付 |
references/_shared/profiles/units/<文件名>.md | 需要发文体系、术语表时 |
Skills that do similar work, with their headline benchmark lift.
From the same source and nearby in the catalogue.