Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Khi nguoi dung muon tang traffic tu SEO, AI SEO, GEO/AEO, Google, ChatGPT, Perplexity, schema, structured data, llms.txt, programmatic SEO, directory submissions, Product Hunt, G2/Capterra, backlinks, hoac audit website khong len top. Dung cho 'SEO audit', 'AI search visibility', 'duoc AI trich dan', 'schema markup', 'pSEO', 'submit directory', 'backlink plan'.
SkillScore70/100
Test results 70
3/3 safety checks passed
39%70%of test cases passed +30 pts
Passed 16 of 23 test cases with the skill, and 9 of 23 without it.
7 fixed9 passed either way7 still failing0 broke
This benchmark measured an earlier version of the skill.
One test taskWe are performing a technical SEO health check for https://medicare.vn. The developer asked for explicit audit thresholds for Title length, Meta Description length, Redirect chains, and Index ratio. What are the audit acceptance thresholds?
Adds every file the skill has, pinned so you can update it. No account needed.
pip install "decimalai>=0.15"
decimalai skills add minhnv0807-32-seo-growth
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("minhnv0807-32-seo-growth")
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 minhnv0807-32-seo-growthThe 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/minhnv0807-32-seo-growth/SKILL.md https://app.decimal.ai/s/minhnv0807-32-seo-growth/SKILL.md.claude/skills/minhnv0807-32-seo-growth/SKILL.mdThis gets SKILL.md only. The skill's 3 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 minhnv0807-32-seo-growthimport 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("minhnv0807-32-seo-growth")
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/minhnv0807-32-seo-growth/SKILL.mdimport asyncio
from pathlib import Path
from claude_agent_sdk import ClaudeAgentOptions, query
skill = Path(".agents/skills/minhnv0807-32-seo-growth/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 3 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 minhnv0807-32-seo-growthfrom 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("minhnv0807-32-seo-growth")
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/minhnv0807-32-seo-growth/SKILL.mdfrom pathlib import Path
from agents import Agent, Runner
skill = Path(".agents/skills/minhnv0807-32-seo-growth/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 3 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 minhnv0807-32-seo-growthimport 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("minhnv0807-32-seo-growth")
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/minhnv0807-32-seo-growth/SKILL.mdfrom pathlib import Path
from openai import OpenAI
client = OpenAI()
skill = Path(".agents/skills/minhnv0807-32-seo-growth/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 3 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 minhnv0807-32-seo-growthimport 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("minhnv0807-32-seo-growth")
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/minhnv0807-32-seo-growth/SKILL.mdfrom pathlib import Path
import anthropic
client = anthropic.Anthropic()
skill = Path(".agents/skills/minhnv0807-32-seo-growth/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 3 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 minhnv0807-32-seo-growthfrom 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("minhnv0807-32-seo-growth")
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/minhnv0807-32-seo-growth/SKILL.mdfrom pathlib import Path
from google import genai
from google.genai import types
client = genai.Client()
skill = Path(".agents/skills/minhnv0807-32-seo-growth/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 3 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 minhnv0807-32-seo-growthfrom 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("minhnv0807-32-seo-growth")
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/minhnv0807-32-seo-growth/SKILL.mdfrom pathlib import Path
from langchain.agents import create_agent
skill = Path(".agents/skills/minhnv0807-32-seo-growth/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 3 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 minhnv0807-32-seo-growthimport 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("minhnv0807-32-seo-growth")
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/minhnv0807-32-seo-growth/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 3 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 minhnv0807-32-seo-growthfrom 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("minhnv0807-32-seo-growth")
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/minhnv0807-32-seo-growth/SKILL.mdfrom pathlib import Path
from google.adk.agents import LlmAgent
skill = Path(".agents/skills/minhnv0807-32-seo-growth/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 3 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 minhnv0807-32-seo-growthfrom 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("minhnv0807-32-seo-growth")
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/minhnv0807-32-seo-growth/SKILL.mdfrom pathlib import Path
from pydantic_ai import Agent
skill = Path(".agents/skills/minhnv0807-32-seo-growth/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 3 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 minhnv0807-32-seo-growthimport 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("minhnv0807-32-seo-growth")
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/minhnv0807-32-seo-growth/SKILL.mdfrom pathlib import Path
from deepagents import create_deep_agent
skill = Path(".agents/skills/minhnv0807-32-seo-growth/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 3 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 minhnv0807-32-seo-growthimport 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("minhnv0807-32-seo-growth")
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/minhnv0807-32-seo-growth/SKILL.mdimport asyncio
from pathlib import Path
from agent_framework import Agent
skill = Path(".agents/skills/minhnv0807-32-seo-growth/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 3 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 minhnv0807-32-seo-growthfrom 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("minhnv0807-32-seo-growth")
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/minhnv0807-32-seo-growth/SKILL.mdfrom pathlib import Path
from strands import Agent
skill = Path(".agents/skills/minhnv0807-32-seo-growth/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 3 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 minhnv0807-32-seo-growthNo Python or account. Cursor, Copilot, Cline and Warp read this folder by themselves.
curl -fsSL --create-dirs -o .agents/skills/minhnv0807-32-seo-growth/SKILL.md https://app.decimal.ai/s/minhnv0807-32-seo-growth/SKILL.md.agents/skills/minhnv0807-32-seo-growth/SKILL.mdThis gets SKILL.md only. The skill's 3 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 3 other files are not included.
Raw files: /s/minhnv0807-32-seo-growth/SKILL.md · /s/minhnv0807-32-seo-growth.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/minhnv0807-32-seo-growth/SKILL.mdcurl -fsSL https://app.decimal.ai/s/minhnv0807-32-seo-growth.jsonThis gets SKILL.md only. The skill's 3 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.
Quy tac van hanh chung:
skills/vi/references/quy-tac-van-hanh.md(dac biet quy tac 2, 3, 7).
Skill nay gom 6 lop SEO thuc chien: audit nen tang, local SEO, noi dung co y dinh tim kiem, AI search visibility, schema/machine-readable files, va backlink/distribution. Muc tieu la tang traffic co y dinh mua, khong phai chi viet nhieu bai.
Doc .agents/product-marketing-context.md neu co. Hoi toi da 4 cau: website/URL, thi truong muc tieu, san pham/dich vu chinh, va muc tieu SEO 90 ngay. Neu co Search Console/GA4/Ahrefs/Semrush export, dung no truoc y kien cam tinh.
Ba reference di kem:
references/seo-growth-playbook.md — lo trinh 90 ngay, pSEO, comparison page, cau truc site.references/schema-json-ld.md — 12 block JSON-LD copy-paste duoc, adapt cho VN.references/do-luong-hien-dien-ai.md — danh muc prompt, audit cau tra loi AI, traffic tu AI, log crawler, vong sua loi.| User noi | Mode |
|---|---|
| "Website khong len top", "traffic giam" | SEO audit |
| "Khach khong tim thay tiem tren Google Maps" | Local SEO |
| "Muon ChatGPT/Perplexity trich dan" | AI SEO / GEO |
| "Them schema", "rich result" | Schema |
| "Tao nhieu page SEO" | Programmatic SEO |
| "Lam trang so sanh voi doi thu" | Comparison page |
| "Submit Product Hunt/G2/AI directory" | Directory + backlink |
Chay theo thu tu — loi tang duoi lam vo hieu moi no luc o tang tren.
| Kiem tra | Nguong dat | Cong cu |
|---|---|---|
| robots.txt khong chan nham page tien | 0 page tien bi Disallow | Search Console > robots.txt report |
| Sitemap XML co mat, khai bao trong robots.txt | Co, cap nhat tu dong | Search Console > Sitemaps |
| Ti le page da index / page muon index | >90% | Search Console > Pages |
| Redirect chain | Toi da 1 hop, khong vong lap | Screaming Frog, Ahrefs Site Audit |
| Soft 404 | 0 page | Search Console > Pages > "Soft 404" |
| Canonical tro dung page | 100% self-canonical hoac tro dung ban goc | Crawl tool |
noindex sot lai tu ban staging | 0 page | Grep noindex toan site |
Hai loi chiem phan lon ca truong hop "site khong len top" ma ban se gap: canonical tro ve trang chu tren toan site (theme/plugin cau hinh sai) va noindex con sot tu ban staging sau khi len production.
| Yeu to | Nguong | Ghi chu |
|---|---|---|
| Title | 50-60 ky tu | Dai hon bi cat; keyword chinh dat gan dau |
| Meta description | 150-160 ky tu | Khong phai yeu to xep hang nhung anh huong CTR |
| H1 | Duy nhat 1 tren page | Trung noi dung voi title nhung khong copy y het |
| H2/H3 | Viet theo cach nguoi dung go truy van | La bo khung de AI engine trich passage |
| Anh | Co alt mo ta, dat ten file co nghia | Anh WebP, khong upload anh 4MB tu dien thoai |
| Internal link | Moi page co it nhat 1 link tro vao | Xem muc cau truc site trong playbook |
| Chi so | Dat | Can cai thien | Kem |
|---|---|---|---|
| LCP (Largest Contentful Paint) | < 2.5s | 2.5-4.0s | > 4.0s |
| INP (Interaction to Next Paint) | < 200ms | 200-500ms | > 500ms |
| CLS (Cumulative Layout Shift) | < 0.1 | 0.1-0.25 | > 0.25 |
Do bang du lieu field (Search Console > Core Web Vitals, CrUX) truoc, lab (PageSpeed Insights) sau. Diem PageSpeed 100 tren may tinh nhung LCP field 5s tren 4G la tinh huong pho bien o VN — uu tien mobile.
Nguyen nhan LCP kem thuong gap tren site VN: anh banner khong nen, slider tu dong o dau trang, font chu tai tu nhieu nguon, va script chat/popup tai dong bo.
Hai page cua chinh ban canh nhau tren cung mot truy van thi ca hai deu yeu. Cach phat hien:
site:tenmien.vn [tu khoa] — neu ra nhieu page gan giong nhau, gop lai.Cach xu ly theo thu tu uu tien: gop noi dung vao page manh nhat va 301 cac page con lai → hoac phan hoa y dinh tim kiem cho tung page → cuoi cung moi dung canonical.
Ap dung cho spa, phong kham, quan an, phong tap, trung tam dao tao, cua hang co mat bang — phan lon khach hang cua repo nay. Day la lop SEO co ti le ra khach cao nhat va it doi thu lam nghiem tuc nhat.
Phan setup Google Business Profile lan dau: xem
11-thiet-lap-kenhmuc 7. O day la phan toi uu khi GBP da ton tai.
NAP = Name, Address, Phone. Ba thong tin nay phai giong nguyen van tren moi noi:
| Diem xuat hien | Kiem tra |
|---|---|
| Google Business Profile | Ban goc — moi noi khac copy tu day |
| Footer website | Giong tung ky tu |
| Trang lien he / trang chi nhanh | Giong tung ky tu |
Schema LocalBusiness | Giong tung ky tu |
| Fanpage Facebook, Zalo OA, TikTok | Giong tung ky tu |
| Cac trang niem yet (Foody, Now, Shopee, danh ba nganh) | Giong tung ky tu |
Tu 7/2025 he thong hanh chinh VN bo cap quan/huyen. Nhieu doanh nghiep dang co dia chi cu tren GBP va dia chi moi tren website — day la nguyen nhan moi lam tut tin hieu local. Chon mot ban va dong bo tat ca, uu tien ban dang hien tren GBP de khong reset lich su ho so.
| Hang muc | Muc tieu | Tan suat |
|---|---|---|
| Danh muc chinh | Chon danh muc cu the nhat, khong chon chung chung | Kiem tra 1 lan/quy |
| Danh muc phu | 2-5 danh muc lien quan that | 1 lan/quy |
| Anh | Anh mat tien, khong gian, nhan su, san pham | Them 3-5 anh/thang |
| Bai dang | Uu dai, su kien, cap nhat | 2-4 bai/thang |
| Cau hoi & tra loi | Tu dat va tra loi cac cau khach hay hoi | Ra soat 1 lan/thang |
| Gio mo cua | Cap nhat dip le Tet truoc 2 tuan | Theo lich le |
| Dich vu / menu | Liet ke day du kem gia | 1 lan/quy |
Review Google Maps la yeu to local ma nguoi mua VN tin nhat, tren ca website va quang cao.
Moi chi nhanh mot trang rieng, khong nhoi tat ca vao trang lien he:
/chi-nhanh/[ten-phuong] hoac /[nganh]-[khu-vuc].LocalBusiness rieng cho tung chi nhanh (block 9 trong references/schema-json-ld.md).| Funnel | Loai keyword | Page nen co |
|---|---|---|
| TOFU | van de, cach lam, checklist | blog, guide, free tool |
| MOFU | so sanh, template, use case, "gia bao nhieu" | comparison, use-case page, bang gia |
| BOFU | thay the doi thu, review, dat lich, demo | landing page, pricing, case study |
Nganh dich vu dia phuong bo sung tang keyword theo dia ly: [dich vu] [phuong/quan], [dich vu] gan day, [dich vu] [thanh pho] gia bao nhieu.
Bo cach noi "rank tren ChatGPT" — khong ai kiem soat duoc dieu do. Dung thang 4 bac de bao cao, vi moi bac co cach dat duoc khac nhau:
| Bac | Nghia | Thu quyet dinh | Cach nhin thay |
|---|---|---|---|
| 1. Duoc truy xuat | AI doc noi dung cua ban khi soan cau tra loi | Bot vao duoc, HTML parse duoc, noi dung lien quan | Log server, gan nhu vo hinh |
| 2. Duoc trich dan | Page cua ban hien la nguon trong cau tra loi | Chat luong cau truc noi dung, so lieu, do moi | Tool theo doi prompt, danh sach nguon cua AI Overview |
| 3. Duoc nhac ten | Ten thuong hieu xuat hien trong cau tra loi | Nhan dien entity + cach web noi ve ban | Tool theo doi prompt |
| 4. Duoc khuyen nghi | San pham cua ban nam trong danh sach AI de xuat | Dong thuan cua ca web — review, cong dong, bao chi, video | Doc ky ngu canh quanh cho duoc nhac ten |
Bac 1-3 la ket qua cua viec toi uu noi dung tren site cua ban. Bac 4 chu yeu khong nam tren site cua ban. Neu bao cao chi dua ra mot con so "AI visibility" thi no che mat khoang cach nay: so lan duoc trich dan tang deu ma khong bao gio duoc khuyen nghi la mot van de rat cu the — web ben ngoai chua xac nhan ban.
Co ca bac am: bi khuyen khong nen dung. Voi truy van nhieu rang buoc, AI co the neu ten san pham nen tranh kem ly do va nguon. Vi vay phai theo doi sac thai quanh cho duoc nhac ten (tich cuc / trung tinh / de dat / tieu cuc), khong chi dem so lan.
Bai kieu "Top 10 [nganh] tot nhat 2026" do chinh ban viet va tu xep minh hang 1 la chien thuat dang duoc ban rong o VN. Thuc te no hoat dong khong nhu ky vong:
AI coi bai cua ban la nguon thong tin ve ca nganh. No lay ten doi thu, tieu chi so sanh va bang gia ma ban da cong cong ra — roi dua ra khuyen nghi dua tren dong thuan cua ca web, noi cac ten lau nam dang chiem uu the. Ket qua thuong gap: bai cua ban duoc trich dan, con thuong hieu duoc khuyen nghi lai la doi thu. Ban da lam nghien cuu giup ho.
Phan biet theo vi the:
Cau hoi kiem tra truoc khi dau tu them mot bai listicle tu xep hang: neu AI bo qua toan bo noi dung tren domain cua minh, phan con lai cua internet co du de dua minh vao danh sach de xuat khong? Neu khong, do moi la viec can lam truoc.
User-agent: GPTBot
Allow: /
User-agent: OAI-SearchBot
Allow: /
User-agent: ChatGPT-User
Allow: /
User-agent: PerplexityBot
Allow: /
User-agent: ClaudeBot
Allow: /
User-agent: anthropic-ai
Allow: /
User-agent: Google-Extended
Allow: /
User-agent: Bingbot
Allow: /
User-agent: CCBot
Disallow: /
| Bot | Thuoc ve | Vai tro |
|---|---|---|
| GPTBot | OpenAI | Thu thap du lieu de train model; tuan theo robots.txt. Doc lap voi search: cho OAI-SearchBot va chan GPTBot la to hop hop le |
| OAI-SearchBot | OpenAI | Quyet dinh site co the hien trong cau tra loi tim kiem cua ChatGPT hay khong; tuan theo robots.txt, thay doi mat khoang 24h de ap dung. Opt-out thi site khong hien trong cac cau tra loi do |
| ChatGPT-User | OpenAI | Truy cap khi nguoi dung thao tac trong ChatGPT (vi du mo mot link); robots.txt co the khong ap dung. Khong dung de quyet dinh site co vao ket qua tim kiem |
| OAI-AdsBot | OpenAI | Kiem tra landing page duoc gui cho quang cao ChatGPT; khong train model. Chi lien quan neu ban chay loai quang cao do |
| PerplexityBot | Perplexity | Perplexity luon kem nguon, day la kenh de do luong nhat |
| ClaudeBot / anthropic-ai | Anthropic | anthropic-ai la ten cu, ClaudeBot la ten hien hanh |
| Google-Extended | Khong phai crawler. Xem ghi chu ben duoi | |
| Bingbot | Microsoft | Nuoi ca Bing va Copilot |
| CCBot | Common Crawl | Chi phuc vu train model, khong tao trich dan — chan duoc neu khong muon |
Vai tro cac bot OpenAI [kiem 2026-10, developers.openai.com/api/docs/bots]. Mo lai trang nay vao ngay lap ke hoach: danh sach bot thay doi, khong chep chuoi user-agent hay so phien ban tu tri nho. Xac nhan bot co that su lay cac trang quan trong bang buoc kiem tra log crawler trong references/do-luong-hien-dien-ai.md.
Diem nhieu tai lieu ghi sai: Google-Extended khong quyet dinh viec ban co xuat hien trong AI Overviews hay khong. AI Overviews chay tren chinh chi muc Search binh thuong. Chan Google-Extended chi anh huong den viec noi dung duoc dung cho cac san pham AI khac cua Google. Muon kiem soat viec noi dung bi trich trong AI Overviews thi dung nosnippet, max-snippet, hoac data-nosnippet — nhung do la danh doi ca kha nang hien snippet thong thuong.
Ba diem kiem tra them:
llms.txt. Dat o /llms.txt, liet ke cac trang quan trong nhat dang markdown kem mo ta ngan. Day la quy uoc do cong dong de xuat, chua nen tang lon nao cam ket ho tro chinh thuc. Tuy chon: hieu qua chua duoc chung minh. Chi phi thap nen van dang lam, nhung khong dat ky vong cao va khong tinh phi client nhu mot hang muc lon.Danh muc prompt co dinh, cot audit tung cau tra loi, chi so, traffic gioi thieu tu AI va vong sua loi: xem references/do-luong-hien-dien-ai.md. Ban nhanh: chay thu 10-20 truy van quan trong nhat. Ghi ket qua:
| Cau hoi | Nen tang (ChatGPT / Perplexity / AI Overview) | Co duoc trich dan khong | Doi thu nao duoc trich thay | Hanh dong |
|---|---|---|---|---|
| [cau hoi 1] | Co / Khong | |||
| [cau hoi 2] | Co / Khong |
Cac nhom cau hoi nen thu:
Khi doi thu duoc trich ma ban khong, doi chieu 5 diem: cau truc noi dung co de trich khong, co so lieu va nguon khong, cap nhat gan day khong, co schema khong, va co duoc nhac o nguon ben thu ba (bao, cong dong, trang review) khong.
AI trich doan, khong trich ca trang. Moi khoi duoi day phai dung duoc doc lap, khong can doc doan truoc do. Chen khoi phu hop vao noi dung binh thuong — khong viet mot ban rieng "cho AI doc".
| Khoi | Dung cho truy van | Cau truc |
|---|---|---|
| Dinh nghia | "[X] la gi" | Cau 1 dinh nghia gon. Cau 2-3 mo rong dac diem. Cau cuoi noi vi sao quan trong |
| Tung buoc | "cach [X]" | 1 cau mo dau + danh sach danh so, moi buoc mot hanh dong ro |
| Bang so sanh | "[A] va [B]" | Bang co cot tieu chi + dong "Phu hop voi ai" + 1-2 cau ket luan |
| Uu / nhuoc | "[X] co dang khong" | Uu diem, nhuoc diem, roi ket luan can bang co dieu kien |
| FAQ | cau hoi lien quan | Cau hoi viet dung cach khach hoi; tra loi 50-100 tu |
| Danh sach | "top [X]" | Doc muc 4.2 truoc khi lam |
| Trich dan so lieu | truy van can bang chung | So cu the + nguon + nam + link |
| Cau tra loi tu du nghia | moi loai | 40-80 tu, khong dung "no", "cai nay", "nhu tren" |
| Gia / chi phi | "[X] gia bao nhieu" | Khoang gia that + yeu to lam gia thay doi + tinh gia mau |
| Ai nen / khong nen dung | truy van danh gia | Neu ro truong hop KHONG phu hop — day la thu tao khac biet |
| Cap nhat + tac gia | tat ca | Ngay cap nhat + ten tac gia that + chuyen mon |
Bon quy tac dinh dang: dat cau tra loi ngay dau muc thay vi giau o cuoi; H2/H3 viet giong cach nguoi dung go; bang thang van xuoi cho noi dung so sanh; danh sach danh so thang doan van cho quy trinh.
Chon schema theo loai page:
| Page | Schema |
|---|---|
| Trang cong ty | Organization, WebSite |
| Bai blog | Article / BlogPosting |
| San pham | Product + Offer (+ AggregateRating neu co review that tren page) |
| Phan mem / SaaS | SoftwareApplication |
| FAQ | FAQPage — xem canh bao ben duoi |
| Quy trinh tung buoc | HowTo — xem canh bao ben duoi |
| Breadcrumb | BreadcrumbList |
| Chi nhanh / dia diem | LocalBusiness (dung subtype cu the: HealthAndBeautyBusiness, Restaurant, MedicalClinic...) |
| Su kien, workshop | Event |
| Khoa hoc | Course |
Hai dieu phai noi ro voi client:
reported: thong bao Search Central ngay 2026-05-08, chua fetch tai lieu goc). Bao cao FAQ trong Search Console bi go thang 6/2026, API thang 8/2026 (reported). Markup FAQPage van hop le theo schema.org va vo hai: giu khi FAQ thuc su hien tren page, nhung khong hua rich result va khong ban no nhu "them dong tren Google".Code day du 12 block JSON-LD, cach kiem tra, va loi thuong gap tren site VN: references/schema-json-ld.md.
Khong ket luan "site nay khong co schema" chi dua tren mot lan fetch. Cong cu fetch don gian khong chay JavaScript, ma rat nhieu site VN chen JSON-LD qua GTM hoac plugin SEO chay phia client. Kiem tra lai bang Rich Results Test hoac DevTools truoc khi ghi vao bao cao.
Uu tien nguon backlink co kha nang tao lead, khong chay theo so luong:
Tranh: mua backlink theo goi, PBN, va comment spam. Ngoai rui ro phat, chung khong tao ra dong thuan web ma AI engine can.
# SEO Growth Plan — [Brand]
## 1. Diagnosis
| Area | Status | Evidence | Priority |
## 2. Technical baseline
| Chi so | Hien tai | Nguong dat | Fix | Owner |
## 3. 90-day SEO strategy
- Market:
- ICP:
- Main search intent:
- Primary KPI:
## 4. Page roadmap
| Page | Funnel | Keyword intent | CTA | Owner |
## 5. Local SEO (neu co mat bang)
| Hang muc | Hien tai | Hanh dong | Tan suat |
## 6. AI SEO / GEO actions
| Cau hoi | Nen tang | Co duoc trich dan | Doi thu duoc trich | Hanh dong |
Bac visibility hien tai: [truy xuat / trich dan / nhac ten / khuyen nghi]
Sac thai khi duoc nhac ten: [tich cuc / trung tinh / de dat / tieu cuc]
## 7. Schema + technical checklist
| Page | Schema/file | Action | Validation |
## 8. Backlink/distribution plan
| Destination | Asset needed | Submission copy | Deadline |
## 9. Measurement
| Metric | Baseline | Target | Tool |
08-nghien-cuu-doi-thu: tim doi thu SEO, content gap, va du lieu dau vao cho trang so sanh.11-thiet-lap-kenh: setup Google Business Profile lan dau (muc 7).12-brief-landing-page: tao page BOFU va trang so sanh.13-phan-tich-du-lieu: doc GA4/Search Console/export.15-social-listening: tim cau hoi that tu cong dong de lam FAQ va noi dung TOFU.36-content-brief: chuyen page roadmap thanh brief viet bai.aggregateRating khi page khong co review.Published skills whose descriptions closely match this one, with their headline benchmark lift.
Skills that do similar work, with their headline benchmark lift.
From the same source and nearby in the catalogue.