How the Patent‑OA Sub‑Skill Automates Office Action Response Drafting
The patent‑oa sub‑skill streamlines examiner office action (OA) responses by parsing notification PDFs, retrieving relevant prior‑art cases through semantic or tag‑based search, and emitting a polished Word document—all from a single command.
The patent-oa sub‑skill in the handsomestWei/patent‑disclosure‑skill repository transforms how patent practitioners handle examiner rejections. Instead of manually extracting PDF text, hunting for analogous cases, and formatting legal opinions, users run one CLI command to generate a ready‑to‑edit response draft backed by historical precedent.
Core Capabilities of Patent‑OA
The sub‑skill combines three integrated capabilities: document parsing and draft generation, institutional knowledge distillation, and dual‑mode semantic retrieval.
Draft Generation Pipeline
In skills/patent-oa/tools/search_cases.py, the system ingests an examiner's notification—whether PDF or plain text—and constructs a structured query from the extracted content. The module then searches the local knowledge base (or a vector store when enabled) and produces a Markdown draft opinion containing argument scaffolding and cited precedents.
python -m skills.patent-oa.tools.search_cases \
--pdf outputs/oa/2023_08_15_通知书.pdf \
--tag "缺陷:缺少说明" \
--top-k 5 \
--config config.yaml
The JSON output includes:
query_preview— a trimmed excerpt of extracted PDF text for verificationretrieval_mode— indicates whether vector or tags_only search was activehits— ranked prior cases with adifffield highlighting domain, statutes, and defect type matches
Once edited, the opinion converts to submission format via skills/patent-oa/tools/emit_opinion_docx.py:
python -m skills.patent-oa.tools.emit_opinion_docx \
-i outputs/oa/案/意见陈述_20230815090000.md \
-o outputs/oa/案/意见陈述_20230815090000.docx
Success emits DOCX: ok=1 path=... with a professionally formatted Word document ready for filing.
Knowledge Distillation from Historical Cases
Historical OA responses populate an Obsidian vault through store.py and embed.py. When processing a new notification, the system hydrates the draft with excerpts from structurally similar past cases—matching on defect categories, technical domains, and applied statutes. This institutional memory improves argument consistency and reduces research time. The full pipeline is documented in skills/patent-oa/README.md.
Semantic Retrieval with Fallback Guarantees
Vector search activates when config.py and embed.py detect a configured database. The query text is embedded and matched against stored case vectors for semantic similarity ranking. If vector infrastructure is unavailable, the tool automatically falls back to tag‑based filtering—ensuring every execution returns usable results regardless of environment state.
Programmatic Integration
Embed the patent‑oa workflow within larger automation pipelines using direct Python imports:
from skills.patent_oa.tools.search_cases import main as search_cases
from skills.patent_oa.tools.emit_opinion_docx import emit_opinion_docx
import json, subprocess, pathlib
# Execute search and capture structured output
result = subprocess.check_output([
"python", "-m", "skills.patent-oa.tools.search_cases",
"--pdf", "my_notification.pdf",
"--top-k", "3"
])
data = json.loads(result)
# Generate minimal opinion from top match
opinion_md = f"# OA Response\n\nBased on case {data['hits'][0]['id']} ..."
path_md = pathlib.Path("draft_opinion.md")
path_md.write_text(opinion_md, encoding="utf-8")
# Convert to final submission format
docx_path = emit_opinion_docx(path_md)
print(f"Generated: {docx_path}")
Key Source Files
| File | Responsibility |
|---|---|
skills/patent-oa/README.md |
Capability overview and usage guidance |
skills/patent-oa/tools/search_cases.py |
PDF parsing, query construction, dual‑mode search, JSON draft emission |
skills/patent-oa/tools/emit_opinion_docx.py |
Markdown‑to‑DOCX conversion with formatting |
skills/patent-oa/tools/config.py |
Vector store toggles, default top-k, and runtime configuration |
skills/patent-oa/tools/embed.py |
Text embedding for semantic retrieval |
skills/patent-oa/tools/store.py |
Local case persistence and search API |
Summary
- Single‑command workflow: Supply a PDF notification, receive a structured draft and reference cases
- Dual search modes: Vector similarity when available, tag filters as guaranteed fallback
- Knowledge hydration: Historical case excerpts enrich new argument drafts
- Professional output: Pipeline terminates in submission‑ready Word documents
- Full programmability: Importable modules support custom pipeline integration
Frequently Asked Questions
What file formats does patent‑oa accept for office action notifications?
The search_cases.py tool accepts PDF examiner notifications and plain text files. PDF parsing extracts the structured rejection content automatically, while text files bypass extraction for direct query construction.
How does patent‑oa handle cases when vector search is unavailable?
The system implements automatic fallback: when config.py detects no vector database, search_cases.py switches to tag‑based filtering using defect categories, technical domains, and statute tags. Every execution returns results regardless of infrastructure state.
Can I customize the number of prior cases retrieved?
Yes. The --top-k parameter controls result count (default configured in config.py). Pass explicit values like --top-k 10 for broader research or --top-k 3 for focused precedent matching.
Is the generated Word document editable before submission?
Absolutely. The emit_opinion_docx.py tool converts user‑editable Markdown into DOCX format. Practitioners should review and refine arguments, add claim amendments, and verify citations before finalizing the office action response.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →