Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Österreichische Rechtsprechung über die offene RIS-API (data.bka.gv.at v2.6) thematisch durchsuchen — OGH, OLG, LG, BG, VfGH, VwGH, BVwG, LVwG, DSB, GBK u. a. Liefert pro Treffer Metadaten (Geschäftszahl, Entscheidungsdatum, Leitsatz) und einen Direkt-Link in das RIS. TRIGGER bei thematischen Fragen wie "Gibt es OGH-Judikatur zu Mietzinsminderung in der Pandemie?", "Aktuelle BVwG-Entscheidungen zu Afghanistan-Asyl", "Was sagt der VfGH zur Versammlungsfreiheit seit 2020?". NICHT TRIGGERN für gezi
SkillScore65/100
Test results 65
3/3 safety checks passed
22%65%of test cases passed +43 pts
Passed 15 of 23 test cases with the skill, and 5 of 23 without it.
10 fixed5 passed either way8 still failing0 broke
One test taskIch möchte mit Platzhaltern nach Wörtern wie 'Miet*' suchen. Welche Einschränkung gilt laut API-Spezifikation für Wildcards in Suchbegriffen?
Adds every file the skill has, pinned so you can update it. No account needed.
pip install "decimalai>=0.15"
decimalai skills add thomasmoreai-ris-rechtsprechung
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("thomasmoreai-ris-rechtsprechung")
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 thomasmoreai-ris-rechtsprechungThe 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/thomasmoreai-ris-rechtsprechung/SKILL.md https://app.decimal.ai/s/thomasmoreai-ris-rechtsprechung/SKILL.md.claude/skills/thomasmoreai-ris-rechtsprechung/SKILL.mdThis gets SKILL.md only. The skill's 1 other file is 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 thomasmoreai-ris-rechtsprechungimport 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("thomasmoreai-ris-rechtsprechung")
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/thomasmoreai-ris-rechtsprechung/SKILL.mdimport asyncio
from pathlib import Path
from claude_agent_sdk import ClaudeAgentOptions, query
skill = Path(".agents/skills/thomasmoreai-ris-rechtsprechung/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 1 other file is 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 thomasmoreai-ris-rechtsprechungfrom 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("thomasmoreai-ris-rechtsprechung")
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/thomasmoreai-ris-rechtsprechung/SKILL.mdfrom pathlib import Path
from agents import Agent, Runner
skill = Path(".agents/skills/thomasmoreai-ris-rechtsprechung/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 1 other file is 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 thomasmoreai-ris-rechtsprechungimport 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("thomasmoreai-ris-rechtsprechung")
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/thomasmoreai-ris-rechtsprechung/SKILL.mdfrom pathlib import Path
from openai import OpenAI
client = OpenAI()
skill = Path(".agents/skills/thomasmoreai-ris-rechtsprechung/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 1 other file is 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 thomasmoreai-ris-rechtsprechungimport 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("thomasmoreai-ris-rechtsprechung")
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/thomasmoreai-ris-rechtsprechung/SKILL.mdfrom pathlib import Path
import anthropic
client = anthropic.Anthropic()
skill = Path(".agents/skills/thomasmoreai-ris-rechtsprechung/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 1 other file is 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 thomasmoreai-ris-rechtsprechungfrom 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("thomasmoreai-ris-rechtsprechung")
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/thomasmoreai-ris-rechtsprechung/SKILL.mdfrom pathlib import Path
from google import genai
from google.genai import types
client = genai.Client()
skill = Path(".agents/skills/thomasmoreai-ris-rechtsprechung/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 1 other file is 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 thomasmoreai-ris-rechtsprechungfrom 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("thomasmoreai-ris-rechtsprechung")
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/thomasmoreai-ris-rechtsprechung/SKILL.mdfrom pathlib import Path
from langchain.agents import create_agent
skill = Path(".agents/skills/thomasmoreai-ris-rechtsprechung/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 1 other file is 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 thomasmoreai-ris-rechtsprechungimport 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("thomasmoreai-ris-rechtsprechung")
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/thomasmoreai-ris-rechtsprechung/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 1 other file is 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 thomasmoreai-ris-rechtsprechungfrom 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("thomasmoreai-ris-rechtsprechung")
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/thomasmoreai-ris-rechtsprechung/SKILL.mdfrom pathlib import Path
from google.adk.agents import LlmAgent
skill = Path(".agents/skills/thomasmoreai-ris-rechtsprechung/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 1 other file is 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 thomasmoreai-ris-rechtsprechungfrom 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("thomasmoreai-ris-rechtsprechung")
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/thomasmoreai-ris-rechtsprechung/SKILL.mdfrom pathlib import Path
from pydantic_ai import Agent
skill = Path(".agents/skills/thomasmoreai-ris-rechtsprechung/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 1 other file is not included.
Deep Agents' own skill loader reads the installed folder. No DecimalAI account needed.
pip install "decimalai>=0.16" deepagents
decimalai skills add thomasmoreai-ris-rechtsprechungimport 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("thomasmoreai-ris-rechtsprechung")
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/thomasmoreai-ris-rechtsprechung/SKILL.mdfrom pathlib import Path
from deepagents import create_deep_agent
skill = Path(".agents/skills/thomasmoreai-ris-rechtsprechung/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 1 other file is not included.
Its own skill loader reads the installed folder. No DecimalAI account needed.
pip install "decimalai>=0.16" agent-framework
decimalai skills add thomasmoreai-ris-rechtsprechungimport 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("thomasmoreai-ris-rechtsprechung")
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/thomasmoreai-ris-rechtsprechung/SKILL.mdimport asyncio
from pathlib import Path
from agent_framework import Agent
skill = Path(".agents/skills/thomasmoreai-ris-rechtsprechung/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 1 other file is not included.
Strands' own skill loader reads the installed folder. No DecimalAI account needed.
pip install "decimalai>=0.16" strands-agents
decimalai skills add thomasmoreai-ris-rechtsprechungfrom 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("thomasmoreai-ris-rechtsprechung")
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/thomasmoreai-ris-rechtsprechung/SKILL.mdfrom pathlib import Path
from strands import Agent
skill = Path(".agents/skills/thomasmoreai-ris-rechtsprechung/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 1 other file is 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 thomasmoreai-ris-rechtsprechungNo Python or account. Cursor, Copilot, Cline and Warp read this folder by themselves.
curl -fsSL --create-dirs -o .agents/skills/thomasmoreai-ris-rechtsprechung/SKILL.md https://app.decimal.ai/s/thomasmoreai-ris-rechtsprechung/SKILL.md.agents/skills/thomasmoreai-ris-rechtsprechung/SKILL.mdThis gets SKILL.md only. The skill's 1 other file is not included.
Give its text to your model as instructions. No account or package needed.
This gets SKILL.md only. The skill's 1 other file is not included.
Raw files: /s/thomasmoreai-ris-rechtsprechung/SKILL.md · /s/thomasmoreai-ris-rechtsprechung.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/thomasmoreai-ris-rechtsprechung/SKILL.mdcurl -fsSL https://app.decimal.ai/s/thomasmoreai-ris-rechtsprechung.jsonThis gets SKILL.md only. The skill's 1 other file is 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.
Du recherchierst österreichische Gerichtsentscheidungen über die offene RIS-API v2.6 (Rechtsinformationssystem des Bundes, betrieben vom Bundeskanzleramt). Die API ist authentifizierungsfrei und liefert JSON.
Scope dieses Skills: nur Rechtsprechung (Judikatur), nur Metadaten + Link. Es wird kein Volltext heruntergeladen oder konvertiert. Bundes- und Landesrecht sind nicht enthalten.
Hauptpfad — thematische / explorative Recherche im Chat:
--suchworte, --schlagworte)--von / --bis)--applikation)Beispiele, die diesen Skill triggern:
Sekundärpfade (technisch unterstützt, aber meist im RIS-Web-Frontend schneller — nur nutzen, wenn der User explizit darum bittet oder die Suche aus dem Chat-Kontext heraus eindeutig per Skript schneller geht):
--geschaeftszahl)--norm "ABGB §1319a")--rechtssatznummer RS0123456)Norm-Suche → Rechtssätze: bei reiner --norm-Suche (ohne
--suchworte) liefert die OGD-API per Default überwiegend
Rechtssätze, kaum Volltext-Entscheidungen — Rechtssätze sind im
Norm-Index hinterlegt, Entscheidungstexte erst über die zusätzlichen
Flags SucheNachRechtssatz / SucheNachText. Das Skript sendet diese
Flags bewusst nur bei --suchworte-Suchen, weil bei reiner
Norm-Recherche Rechtssätze i. d. R. die gewollte Trefferart sind.
Nicht anwenden, wenn:
https://data.bka.gv.at/ris/api/v2.6/GET /JudikaturAccept: application/json)Applikation (genau einer):
| Wert | Gericht/Behörde |
|---|---|
Justiz | OGH, OLG, LG, BG (Zivil-/Strafgerichtsbarkeit) — Standard |
Vfgh | Verfassungsgerichtshof |
Vwgh | Verwaltungsgerichtshof |
Bvwg | Bundesverwaltungsgericht |
Lvwg | Landesverwaltungsgerichte |
Dsk | Datenschutzbehörde (vormals -kommission) |
AsylGH | Asylgerichtshof (historisch, bis 2013) |
Normenliste | Normprüfungs-/Normenliste |
Pvak | Personalvertretungs-Aufsichtskommission |
Gbk | Gleichbehandlungskommission |
Dok | Disziplinarkommission |
Plus mindestens einer dieser Suchparameter (sonst HTTP 400):
| Parameter | Beispiel | Hinweis |
|---|---|---|
Suchworte | Mietzinsminderung | URL-encoden; * nur am Wortende; AND/OR/NOT. OGD-API-Einschränkung: nur ein Platzhalter pro Wort (Web-Frontend toleriert mehrere). |
Geschaeftszahl | 5Ob234/20b | exakte Aktenzeichen-Suche |
Norm | ABGB §1319a | Format: {Gesetzeskürzel} §{Paragraph} (kanonische Zitierform) — andere Reihenfolgen wie 1319a ABGB liefern fast keine Treffer. Fehlt nur das §-Zeichen (ArbVG 105), ergänzt das Skript es automatisch und schreibt einen Hinweis in den Output. Für EU-Verordnungen (z. B. DSGVO) ist der Norm-Index unzuverlässig; lieber Volltextsuche via Suchworte. |
Rechtssatznummer | RS0123456 | bei OGH-Rechtssatz-Suche |
Schlagworte | Datenschutz | kontrolliertes RIS-Vokabular |
EntscheidungsdatumVon / Bis | 2024-01-01 | ISO-Datum |
Optional:
SucheNachRechtssatz, SucheNachText — steuern, in welchen Feldern
das Suchworte-Token gesucht wird (Rechtssatz-Text vs.
Entscheidungstext). Nicht ein Filter für Trefferarten — auch mit
--no-rechtssatz können Rechtssatz-Dokumente zurückkommen, wenn der
Suchbegriff im Volltext gefunden wurde. Das Skript sendet die Flags
nur bei --suchworte-Suchen.ImRisSeit ∈ {Undefined, EinerWoche, EinemMonat, DreiMonaten, SechsMonaten, EinemJahr}Sortierung ∈ {Datum, Geschaeftszahl, Relevanz} — die API toleriert
weitere Werte; nur die hier gelisteten sind in den RIS-Handbüchern dokumentiert.
Skript-Default: setzt das Skript weder --sortierung noch
--sort-direction, sortiert es nach Datum/Descending (im
Chat-Kontext meist gewollt — „aktuelle Judikatur zu …"). Der
API-Default Relevanz ist mit --sortierung Relevanz zurückzuholen.SortDirection ∈ {Ascending, Descending}Pagination:
DokumenteProSeite ∈ {Ten, Twenty, Fifty, OneHundred} — Default TwentySeitennummer (1-basiert) — bei --alle-seiten der Einstiegspunkt--alle-seiten holt mehrere Seiten automatisch,
bis Treffer erschöpft oder --max-seiten N (Default 5) erreicht.
RIS-konforme Pause zwischen Seiten konfigurierbar via
--pause-pagination (Default 1.5 s). Default-Cap: 5 × 20 = 100
Treffer. Für breite Themen-Recherchen mit --pro-seite Fifty --alle-seiten --max-seiten 5 bis zu 250 Treffer auf einmal.Verwende immer das beigelegte Skript scripts/ris_search.py (Python 3,
nur Standardbibliothek). Es kapselt URL-Bau, Pflichtparameter-Validierung,
JSON-Parsing und Rendering in einem Aufruf.
Mapping: User-Frage → --applikation + Suchparameter. Bei Unsicherheit
--applikation Justiz + Volltext-Suche.
Aufruf — das Skript liegt immer bei scripts/ris_search.py
relativ zum Skill-Ordner (dem Verzeichnis, das diese SKILL.md enthält).
Der absolute Pfad zum Skill-Ordner hängt von der Umgebung ab; Du als
ausführendes Modell weißt, in welcher Umgebung Du läufst.
Generisches Aufrufmuster — cd in den Skill-Ordner, dann relativ
aufrufen. Standard-Chat-Recherche (Themensuche mit Auto-Pagination):
cd <skill-folder> && python scripts/ris_search.py \
--applikation Justiz \
--suchworte "Mietzinsminderung" \
--von 2020-01-01 --bis 2024-12-31 \
--pro-seite Fifty --alle-seiten --max-seiten 3
Liefert bis zu 150 Treffer, sortiert nach Datum absteigend (Default).
Python-Aufruf je Umgebung — probiere in dieser Reihenfolge:
python → python3 → py -3. Üblicherweise:
python3 oder pythonpy -3 (python3 fehlt meist im PATH)Skill-Ordner je Umgebung — typische Pfade:
~/.claude/skills/ris-rechtsprechung/%USERPROFILE%\.claude\skills\ris-rechtsprechung\/mnt/skills/... oder /home/.../skills/...); folge der Pfadangabe,
die Dir der Skill-Loader liefert.Falls cd in der Umgebung nicht zur Verfügung steht (manche Sandboxes),
verwende den absoluten Pfad zum Skript, z. B.:
python "<skill-folder>/scripts/ris_search.py" --applikation Justiz ...
Ausgabe ist Markdown (Default) oder strukturiertes JSON (--json).
Antwort an den User: die Top-Treffer mit Geschäftszahl, Datum, Leitsatz (sofern vorhanden) und RIS-Link weitergeben. Bei mehr als 10 Treffern die ersten 10 ausführlich, den Rest als Bullet-Liste.
Pagination: bei mehr als einer Seite vor jeder weiteren Anfrage ca. 1,5 s warten (RIS-Empfehlung).
Default (Markdown). Für Rechtssatz-Dokumente (häufigster Fall bei Norm-Suchen — Rechtssätze sind im Norm-Index hinterlegt):
**Treffer:** 7 (Seite 1, 10 pro Seite)
### 1. OGH 2 Ob 554/86 vom 28.10.1986 [Rechtssatz RS0051942]
**Norm:** ArbVG §105 Abs3 Z2 litb
- [Rechtssatz im RIS](https://www.ris.bka.gv.at/Dokument.wxe?Abfrage=Justiz&Dokumentnummer=JJR_19861028_OGH0002_0020OB00554_8600000_007)
- [Volltext der Stammentscheidung](https://www.ris.bka.gv.at/Dokument.wxe?Abfrage=Justiz&Dokumentnummer=JJT_19861028_OGH0002_0020OB00554_8600000_000)
_Auch zitiert in 21 weiteren Entscheidungen._
Für Volltext-Dokumente:
### 2. OGH 5 Ob 234/20b vom 15.04.2021 [Volltext]
_Leitsatz:_ ...
**Norm:** ABGB §1119
- [Zur Entscheidung im RIS](https://ris.bka.gv.at/Dokumente/Justiz/JJT_20210415_OGH0002_.../JJT_....html)
Geschaeftszahl eine Verkettung aller zitierenden Geschäftszahlen
und in Entscheidungsdatum das jüngste Update-Datum. Beides ist
irreführend. Wir nutzen stattdessen Justiz.Entscheidungstexte.item[0]
— die Stamm-Entscheidung — als Quelle für Heading-GZ + Datum.DokumentUrl), nicht mehr aus der Heuristik. Die Heuristik bleibt
als Fallback für seltene Sonderfälle.Technisch.Organ (zuverlässiger als
Justiz.Gericht). Fallback auf Applikation.[Rechtssatz RS0051942] —
praktisch zum Zitieren.--json liefert ein normalisiertes Objekt mit allen Feldern:
{
"total_hits": 7, "page": 1, "page_size": 10,
"documents": [
{
"dokumentnummer": "JJR_19861028_OGH0002_0020OB00554_8600000_007",
"applikation": "Justiz",
"gericht": "OGH",
"doc_type": "Rechtssatz", // "Volltext" | "Rechtssatz" | null
"rechtssatznummer": "RS0051942", // null bei Volltext-Dokumenten
"geschaeftszahl": "2 Ob 554/86", // Stamm-GZ aus Entscheidungstexte[0]
"geschaeftszahlen": [...], // ALLE zitierenden GZ
"entscheidungsdatum": "1986-10-28", // Stamm-Datum
"leitsatz": null, // Bei Rechtssätzen meist null
"normen": ["ArbVG §105 Abs3 Z2 litb"],
"fachgebiete": [],
"entscheidungstexte_count": 22,
"link": "https://www.ris.bka.gv.at/Dokument.wxe?...JJR_..._007",
"volltext_url": "https://www.ris.bka.gv.at/Dokument.wxe?...JJT_..._000",
"content_urls": { "html": "...", "pdf": "...", "xml": "...", "rtf": "..." }
}
]
}
doc_type und rechtssatznummer sind nur bei OGH/VfGH/VwGH-Dokumenten
zuverlässig gesetzt (J{Court}{T|R}-Konvention). Andere Applikationen
(BVWG, LVWG, DSB u. a.) folgen der Konvention nicht; dort bleibt
doc_type = null.
--raw gibt die unveränderte API-Antwort aus, falls du selbst parsen willst.
Aus der Dokumentennummer ableitbar (Präfix → Pfad):
| Präfix | Pfad |
|---|---|
JJT, JJR | https://ris.bka.gv.at/Dokumente/Justiz/{nr}/{nr}.html |
JFT, JFR | https://ris.bka.gv.at/Dokumente/Vfgh/{nr}/{nr}.html |
JWT, JWR | https://ris.bka.gv.at/Dokumente/Vwgh/{nr}/{nr}.html |
BVWG | https://ris.bka.gv.at/Dokumente/Bvwg/{nr}/{nr}.html |
LVWG | https://ris.bka.gv.at/Dokumente/Lvwg/{nr}/{nr}.html |
DSB | https://ris.bka.gv.at/Dokumente/Dsk/{nr}/{nr}.html |
GBK | https://ris.bka.gv.at/Dokumente/Gbk/{nr}/{nr}.html |
PVAK | https://ris.bka.gv.at/Dokumente/Pvak/{nr}/{nr}.html |
Validierung: Dokumentennummern matchen ^[A-Z][A-Z0-9_]+$, Länge 5–50.
Das Skript leitet diesen Link automatisch ab und stellt ihn unter link
bzw. content_urls.html bereit.
Volltext-Download ist explizit nicht Teil dieses Skills. Wenn der User den Volltext einer Entscheidung will, gib ihm den Link aus dem Trefferdatensatz und überlasse ihm das Lesen.
Bei Suchworte-Anfragen mit 0 Treffern erzeugt das Skript automatisch eine
Google site:-Such-Query nach dem Muster
site:ris.bka.gv.at <Applikation> <Suchworte> [<Norm>] ["<Geschaeftszahl>"] [after:<Jahr>] [before:<Jahr>]
und gibt sie zusammen mit dem Hinweis aus. Hintergrund: Google indexiert das RIS-Web-Frontend deutlich breiter als der OGD-API-Volltext-Index — insbesondere bei alten Entscheidungen (vor ca. 1990), wo der API-Volltext oft amputiert oder gar nicht durchsuchbar ist.
Wenn Du in einem Claude-Kontext mit web_search-Tool läufst: sobald
Du die Query im Output siehst, übergib sie unverändert an das
web_search-Tool. Aus den Treffern extrahierst Du RIS-URLs der Form
https://www.ris.bka.gv.at/Dokument.wxe?Abfrage=…&Dokumentnummer=… und
holst Dir bei Bedarf den Volltext mit web_fetch. Daraus baust Du dann
dieselben Trefferzeilen wie aus der API-Antwort (Geschäftszahl, Datum,
Leitsatz/Rechtssatz, Link).
Das Skript selbst führt keine Web-Suche aus — die Logik bleibt bei
Claude. Im JSON-Output ist die Query als websearch_query-Feld
verfügbar; im Markdown-Output steht sie im Hinweis-Block am Ende der
Trefferliste.
Applikation).Suchworte trotz nachweisbarem Vorkommen →
Bekannte Limitation des OGD-Volltext-Index, insbesondere bei alten
Entscheidungen (vor ca. 1990). Der Volltext kann existieren und das
Suchwort enthalten, ohne dass der API-Index ihn findet. Das Skript
generiert in diesem Fall automatisch eine Google site:-Such-Query
als Fallback (siehe Abschnitt Web-Search-Fallback).--pro-seite wiederholen (das Skript
retried automatisch zwei Mal mit 2/4 s Pause).--applikation Justiz,
--suchworte ... setzen.Im Repo liegt der Skill unter
recherche-ris-rechtsprechung/skill-draft/ris-rechtsprechung/ und ist
self-contained: ein Ordner mit SKILL.md und scripts/ris_search.py.
Da das Skript ausschließlich die Python-Standardbibliothek nutzt, ist
keine Build-Phase und keine Pip-Installation nötig.
mkdir -p ~/.claude/skills
cp -r recherche-ris-rechtsprechung/skill-draft/ris-rechtsprechung \
~/.claude/skills/
$dest = "$env:USERPROFILE\.claude\skills"
New-Item -ItemType Directory -Force -Path $dest | Out-Null
Copy-Item -Recurse -Force `
"recherche-ris-rechtsprechung\skill-draft\ris-rechtsprechung" `
$dest
cd recherche-ris-rechtsprechung/skill-draft/
zip -r ris-rechtsprechung.zip ris-rechtsprechung/
PowerShell:
Compress-Archive -Path "recherche-ris-rechtsprechung\skill-draft\ris-rechtsprechung" `
-DestinationPath ris-rechtsprechung.zip -Force
*.bka.gv.at alle drei mit einem Eintrag ab.
data.bka.gv.at — OGD-API (Pflicht; ohne das blockt die Sandbox
alle Skript-Aufrufe).ris.bka.gv.at — RIS-Direkt-HTML-URLs der Form
/Dokumente/Justiz/JJT_…/JJT_….html (abgeleitete „Volltext
(vermutet)"-Links bei Rechtssatz-Treffern; Hinweis-Link auf
die RIS-Web-Suche https://www.ris.bka.gv.at/Judikatur/ bei 0
Volltext-Treffern).www.ris.bka.gv.at — Dokument.wxe?…-URLs, die die API selbst
in der Trefferliste zurückgibt.ris-rechtsprechung/
├── SKILL.md
└── scripts/ris_search.py
Voraussetzung: Python ≥ 3.9 in der ausführenden Umgebung. Keine Pip-Pakete nötig.
Die über die OGD-Schnittstelle bezogenen RIS-Daten stehen unter
Creative Commons Namensnennung 4.0 International (CC BY 4.0).
Bei Wiedergabe ist die Quelle zu nennen — das Skript hängt deshalb
an jeden Markdown-Output automatisch eine Attribution-Zeile
(Quelle: RIS, Bundeskanzleramt — CC BY 4.0) und im JSON-Output ein
attribution-Feld.
Rechtlich verbindlich ist laut Bundeskanzleramt ausschließlich der Wortlaut im Bundesgesetzblatt (Applikation „Bundesgesetzblatt authentisch") bzw. in den jeweiligen Landesgesetzblättern. Der OGD-Datenbestand wird ohne Gewähr für Richtigkeit, Aktualität oder Vollständigkeit bereitgestellt. Wenn Du RIS-Treffer im Chat ausgibst, formuliere entsprechend — die zurückgelieferten Texte sind Recherchehilfe, keine authentische Rechtsquelle.
Massenabfragen: ein durchschnittlicher Skill-Aufruf (bis 5 Seiten
× 100 Treffer) ist unbedenklich. Wer den Skill systematisch über den
Tag verteilt nutzt oder --max-seiten deutlich hochdreht, sollte das
RIS-Team unter [email protected] vorab informieren (siehe OGD-FAQ),
um nicht versehentlich als DDoS-Verkehr klassifiziert zu werden.
https://data.bka.gv.at/ris/ogd/v2.6/Documents/Dokumentation_OGD-RIS_API.pdfhttps://www.ris.bka.gv.at/RisInfo/OGD-FAQ.pdfhttps://www.data.gv.at/katalog/dataset/ris2_6shrinkwrap-legal/shrinkwrap-legal-api (Java/Spring)philrox/ris-mcp-ts (TypeScript MCP-Server)[email protected]Skills that do similar work, with their headline benchmark lift.
From the same source and nearby in the catalogue.