revit-api-docs 0.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. revit_api_docs/__init__.py +18 -0
  2. revit_api_docs/__main__.py +8 -0
  3. revit_api_docs/config.py +115 -0
  4. revit_api_docs/data.py +320 -0
  5. revit_api_docs/default_config.yaml +85 -0
  6. revit_api_docs/embedder/__init__.py +1 -0
  7. revit_api_docs/embedder/providers/__init__.py +25 -0
  8. revit_api_docs/embedder/providers/base.py +28 -0
  9. revit_api_docs/embedder/providers/google.py +36 -0
  10. revit_api_docs/embedder/providers/openai.py +58 -0
  11. revit_api_docs/llm_client.py +288 -0
  12. revit_api_docs/prompts/__init__.py +5 -0
  13. revit_api_docs/prompts/loader.py +20 -0
  14. revit_api_docs/prompts/pipeline.api_quality_stage1_no_html.md +28 -0
  15. revit_api_docs/prompts/pipeline.api_quality_stage1_system.md +1 -0
  16. revit_api_docs/prompts/pipeline.api_quality_stage1_with_html.md +35 -0
  17. revit_api_docs/prompts/pipeline.api_quality_stage2.md +33 -0
  18. revit_api_docs/prompts/pipeline.api_quality_stage2_system.md +1 -0
  19. revit_api_docs/prompts/pipeline.rewrite_query.md +21 -0
  20. revit_api_docs/prompts/pipeline.rewrite_query_system.md +1 -0
  21. revit_api_docs/prompts/pipeline.sdk_extract_readme_system.md +1 -0
  22. revit_api_docs/prompts/pipeline.sdk_extract_readme_user.md +22 -0
  23. revit_api_docs/prompts/pipeline.sdk_golden_code.md +32 -0
  24. revit_api_docs/prompts/pipeline.sdk_golden_code_system.md +1 -0
  25. revit_api_docs/prompts/pipeline.sdk_quality_file_batch.md +17 -0
  26. revit_api_docs/prompts/pipeline.sdk_quality_file_system.md +1 -0
  27. revit_api_docs/prompts/pipeline.sdk_quality_project.md +20 -0
  28. revit_api_docs/prompts/pipeline.sdk_quality_project_system.md +1 -0
  29. revit_api_docs/reranker.py +177 -0
  30. revit_api_docs/retriever.py +901 -0
  31. revit_api_docs/server.py +244 -0
  32. revit_api_docs-0.1.0.dist-info/METADATA +139 -0
  33. revit_api_docs-0.1.0.dist-info/RECORD +36 -0
  34. revit_api_docs-0.1.0.dist-info/WHEEL +4 -0
  35. revit_api_docs-0.1.0.dist-info/entry_points.txt +2 -0
  36. revit_api_docs-0.1.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,244 @@
1
+ """MCP server: two read-only tools over the Revit API reference.
2
+
3
+ search_revit_api(query, top_k) -> API entries (signature, parameters, remarks)
4
+ get_code_examples(query, top_k) -> C# snippets from the official SDK samples
5
+
6
+ Everything is local once the data set is installed. On the first run the
7
+ server answers immediately and downloads the data set (about 335 MB) in the
8
+ background; tool calls made before it is ready get a short status message
9
+ instead of a result. `revit-api-docs download` fetches it ahead of time.
10
+
11
+ stdout is the MCP transport: all diagnostics go to stderr.
12
+ """
13
+ from __future__ import annotations
14
+
15
+ import argparse
16
+ import asyncio
17
+ import logging
18
+ import sys
19
+ import threading
20
+ from typing import TYPE_CHECKING
21
+
22
+ from mcp.server.mcpserver import MCPServer
23
+ from mcp.types import ToolAnnotations
24
+
25
+ from revit_api_docs import __version__, data
26
+ from revit_api_docs.config import load_config
27
+
28
+ if TYPE_CHECKING:
29
+ from revit_api_docs.retriever import RAGRetriever
30
+
31
+ log = logging.getLogger("revit_api_docs.server")
32
+
33
+ MAX_TOP_K = 50
34
+
35
+ SERVER_INSTRUCTIONS = """\
36
+ Revit API reference lookup (Revit 2026). Optional companion for models that do
37
+ not know the Revit API well; it never touches a Revit session.
38
+
39
+ - search_revit_api(query, top_k): find classes, methods, properties and enums
40
+ in the API reference. Ask with API names when you have them
41
+ ("Wall.Create", "FilteredElementCollector OfCategory") or with a short task
42
+ description ("create floor from boundary"). Results carry the signature,
43
+ parameters and remarks; trust them over memory.
44
+ - get_code_examples(query, top_k): real C# from the Revit SDK samples that use
45
+ the APIs in question. Read one before writing code for an unfamiliar API.
46
+
47
+ Use these before generating code that calls an API you are not certain about
48
+ (exact method name, parameter order, required ElementIds, units).
49
+ """
50
+
51
+ mcp = MCPServer(
52
+ "revit-api-docs",
53
+ version=__version__,
54
+ instructions=SERVER_INSTRUCTIONS,
55
+ )
56
+
57
+ _READ_ONLY = ToolAnnotations(readOnlyHint=True)
58
+
59
+
60
+ # ── Retriever lifecycle ──────────────────────────────────────────────────────
61
+
62
+ class _State:
63
+ """Data download + retriever construction, shared by the tools."""
64
+
65
+ def __init__(self) -> None:
66
+ self.lock = threading.Lock()
67
+ self.status = "idle" # idle | downloading | loading | ready | failed
68
+ self.detail = ""
69
+ self.error: str | None = None
70
+ self.retriever: RAGRetriever | None = None
71
+ self._thread: threading.Thread | None = None
72
+
73
+ def _progress(self, name: str, done: int, total: int) -> None:
74
+ pct = 100 * done // total if total else 0
75
+ self.detail = f"{name} {pct}%"
76
+ data.stderr_progress(name, done, total)
77
+
78
+ def prepare(self) -> RAGRetriever:
79
+ """Blocking: install the data set if needed and build the retriever."""
80
+ with self.lock:
81
+ if self.retriever is not None:
82
+ return self.retriever
83
+ try:
84
+ self.status = "downloading" if data.missing() else "loading"
85
+ paths = data.ensure_data(progress=self._progress)
86
+ self.status = "loading"
87
+ from revit_api_docs.retriever import RAGRetriever
88
+
89
+ self.retriever = RAGRetriever(
90
+ config=load_config(),
91
+ api_db_path=str(paths.api_db),
92
+ sdk_db_path=str(paths.sdk_db),
93
+ chromadb_api_dir=str(paths.chromadb_api),
94
+ chromadb_code_dir=str(paths.chromadb_code),
95
+ )
96
+ self.status = "ready"
97
+ self.error = None
98
+ log.info("ready: data in %s", paths.root)
99
+ return self.retriever
100
+ except Exception as e: # reported to the caller, not raised into MCP
101
+ self.status = "failed"
102
+ self.error = f"{type(e).__name__}: {e}"
103
+ log.exception("preparing the data set failed")
104
+ raise
105
+
106
+ def start_background(self) -> bool:
107
+ """Start the preparation thread unless one is running; True if started."""
108
+ if self._thread is not None and self._thread.is_alive():
109
+ return False
110
+ self._thread = threading.Thread(target=self._prepare_quietly,
111
+ name="revit-api-docs-prepare", daemon=True)
112
+ self._thread.start()
113
+ return True
114
+
115
+ def _prepare_quietly(self) -> None:
116
+ try:
117
+ self.prepare()
118
+ except Exception:
119
+ pass
120
+
121
+ def message_if_not_ready(self) -> str | None:
122
+ """Text to return from a tool while the retriever is unavailable."""
123
+ if self.retriever is not None:
124
+ return None
125
+ if self.status == "failed":
126
+ # Let the next call retry (network hiccup, disk full and freed, ...),
127
+ # but only claim a retry when this call actually started one.
128
+ retrying = self.start_background()
129
+ how = ("Retrying in the background; call again in a moment"
130
+ if retrying else "A retry is already running; call again in a moment")
131
+ return (f"revit-api-docs is not available: {self.error}. {how}, or run "
132
+ f"`revit-api-docs download` in a terminal to see the full error.")
133
+ self.start_background()
134
+ if self.status == "downloading":
135
+ return (f"revit-api-docs is downloading its data set on first run "
136
+ f"({data.TOTAL_DOWNLOAD_BYTES / 1e6:.0f} MB, currently {self.detail}). "
137
+ f"Call again in a minute.")
138
+ return "revit-api-docs is loading its index. Call again in a few seconds."
139
+
140
+
141
+ _state = _State()
142
+
143
+
144
+ def _clamp_top_k(top_k: int, default: int) -> int:
145
+ try:
146
+ n = int(top_k)
147
+ except (TypeError, ValueError):
148
+ return default
149
+ return max(1, min(n, MAX_TOP_K))
150
+
151
+
152
+ def search_api(retriever: RAGRetriever, query: str, top_k: int) -> str:
153
+ results = retriever.search(query, api_top_k=top_k, code_top_k=0, rewrite=False, rerank=True)
154
+ ctx = retriever.build_context(results)
155
+ return ctx.get("api_context") or f"No API entries found for {query!r}."
156
+
157
+
158
+ def search_examples(retriever: RAGRetriever, query: str, top_k: int) -> str:
159
+ results = retriever.search(query, api_top_k=0, code_top_k=top_k, rewrite=False, rerank=False)
160
+ ctx = retriever.build_context(results)
161
+ return ctx.get("code_context") or f"No SDK examples found for {query!r}."
162
+
163
+
164
+ # ── Tools ────────────────────────────────────────────────────────────────────
165
+
166
+ @mcp.tool(annotations=_READ_ONLY)
167
+ async def search_revit_api(query: str, top_k: int = 10) -> str:
168
+ """Search the Revit 2026 API reference (27,596 classes, methods, properties,
169
+ enums). Returns each match with its signature, parameters and remarks.
170
+ Query with an API name ("Wall.Create") or a short task ("rotate element
171
+ around axis"). top_k: 1-50, default 10."""
172
+ if not query or not query.strip():
173
+ return "Give a query: an API name such as 'Wall.Create' or a short task description."
174
+ msg = _state.message_if_not_ready()
175
+ if msg:
176
+ return msg
177
+ n = _clamp_top_k(top_k, 10)
178
+ return await asyncio.to_thread(search_api, _state.retriever, query.strip(), n)
179
+
180
+
181
+ @mcp.tool(annotations=_READ_ONLY)
182
+ async def get_code_examples(query: str, top_k: int = 3) -> str:
183
+ """Return C# examples from the official Revit SDK samples (153 projects)
184
+ that use the APIs matching the query, each with the project name and the
185
+ APIs it touches. top_k: 1-50, default 3."""
186
+ if not query or not query.strip():
187
+ return "Give a query: an API name or the task the sample should show."
188
+ msg = _state.message_if_not_ready()
189
+ if msg:
190
+ return msg
191
+ n = _clamp_top_k(top_k, 3)
192
+ return await asyncio.to_thread(search_examples, _state.retriever, query.strip(), n)
193
+
194
+
195
+ # ── CLI ──────────────────────────────────────────────────────────────────────
196
+
197
+ def _configure_logging(verbose: bool) -> None:
198
+ logging.basicConfig(
199
+ stream=sys.stderr,
200
+ level=logging.INFO if verbose else logging.WARNING,
201
+ format="%(name)s: %(message)s",
202
+ )
203
+
204
+
205
+ def main(argv: list[str] | None = None) -> int:
206
+ parser = argparse.ArgumentParser(
207
+ prog="revit-api-docs",
208
+ description="MCP server for Revit API reference search (stdio).",
209
+ )
210
+ parser.add_argument("--version", action="version", version=f"revit-api-docs {__version__}")
211
+ parser.add_argument("-v", "--verbose", action="store_true", help="info-level logs on stderr")
212
+ sub = parser.add_subparsers(dest="command")
213
+ sub.add_parser("serve", help="run the MCP server on stdio (default)")
214
+ sub.add_parser("download", help="install the data set now instead of on first use")
215
+ p_search = sub.add_parser("search", help="query from the terminal (installs the data set if needed)")
216
+ p_search.add_argument("query")
217
+ p_search.add_argument("--examples", action="store_true", help="SDK code examples instead of API entries")
218
+ p_search.add_argument("--top-k", type=int, default=None)
219
+ args = parser.parse_args(argv)
220
+
221
+ _configure_logging(args.verbose or args.command in ("download", "search"))
222
+
223
+ if args.command == "download":
224
+ paths = data.ensure_data(progress=data.stderr_progress)
225
+ print(f"data ready in {paths.root}", file=sys.stderr)
226
+ return 0
227
+
228
+ if args.command == "search":
229
+ retriever = _state.prepare()
230
+ if args.examples:
231
+ text = search_examples(retriever, args.query, _clamp_top_k(args.top_k or 3, 3))
232
+ else:
233
+ text = search_api(retriever, args.query, _clamp_top_k(args.top_k or 10, 10))
234
+ sys.stdout.reconfigure(encoding="utf-8", errors="replace") # type: ignore[union-attr]
235
+ print(text)
236
+ return 0
237
+
238
+ _state.start_background()
239
+ mcp.run(transport="stdio")
240
+ return 0
241
+
242
+
243
+ if __name__ == "__main__":
244
+ sys.exit(main())
@@ -0,0 +1,139 @@
1
+ Metadata-Version: 2.5
2
+ Name: revit-api-docs
3
+ Version: 0.1.0
4
+ Summary: Revit API reference search for MCP hosts: local semantic + keyword lookup over the Revit 2026 API docs and SDK samples
5
+ Project-URL: Homepage, https://github.com/revitbridge/revit-api-docs
6
+ Project-URL: Issues, https://github.com/revitbridge/revit-api-docs/issues
7
+ Project-URL: Changelog, https://github.com/revitbridge/revit-api-docs/blob/main/CHANGELOG.md
8
+ Project-URL: Data, https://github.com/revitbridge/revit-api-docs/releases/tag/v1.0-data
9
+ Author: revitbridge
10
+ License-Expression: MIT
11
+ License-File: LICENSE
12
+ Keywords: api-docs,bim,mcp,rag,revit
13
+ Classifier: Development Status :: 3 - Alpha
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: Operating System :: OS Independent
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Topic :: Scientific/Engineering
21
+ Requires-Python: >=3.11
22
+ Requires-Dist: chromadb<2,>=1
23
+ Requires-Dist: httpx>=0.27
24
+ Requires-Dist: mcp<3,>=2
25
+ Requires-Dist: openai<3,>=1
26
+ Requires-Dist: pyyaml>=6
27
+ Provides-Extra: pipeline
28
+ Requires-Dist: beautifulsoup4>=4.12; extra == 'pipeline'
29
+ Requires-Dist: google-genai>=1; extra == 'pipeline'
30
+ Requires-Dist: tqdm>=4.66; extra == 'pipeline'
31
+ Requires-Dist: tree-sitter-c-sharp>=0.20; extra == 'pipeline'
32
+ Requires-Dist: tree-sitter>=0.20; extra == 'pipeline'
33
+ Description-Content-Type: text/markdown
34
+
35
+ # revit-api-docs
36
+
37
+ Revit API reference search as an MCP server: two read-only tools over a local
38
+ copy of the Revit 2026 API documentation (27,596 classes, methods, properties
39
+ and enums) and the official SDK samples (153 projects).
40
+
41
+ **Optional.** It exists for models that do not know the Revit API well. If
42
+ your model already writes correct Revit code, you do not need it;
43
+ [revit-bridge](https://github.com/revitbridge/revit-bridge) works without it.
44
+ It never talks to Revit and it never calls a model itself.
45
+
46
+ ## Install
47
+
48
+ Prerequisites: Python 3.11+ with [`uv`](https://docs.astral.sh/uv/) (for
49
+ `uvx`), about 700 MB of disk for the data set, network for the first run.
50
+
51
+ **Claude Desktop** — `claude_desktop_config.json`:
52
+
53
+ ```json
54
+ {
55
+ "mcpServers": {
56
+ "revit-api-docs": {
57
+ "command": "uvx",
58
+ "args": ["revit-api-docs"]
59
+ }
60
+ }
61
+ }
62
+ ```
63
+
64
+ **Claude Code**:
65
+
66
+ ```bash
67
+ claude mcp add revit-api-docs -- uvx revit-api-docs
68
+ ```
69
+
70
+ **Any MCP client** — run `uvx revit-api-docs` as a stdio server.
71
+
72
+ On the first start the server downloads the data set (335 MB, four files) from
73
+ this repository's [`v1.0-data` release](https://github.com/revitbridge/revit-api-docs/releases/tag/v1.0-data)
74
+ into `%LOCALAPPDATA%\revit-api-docs` (Windows) or `~/.local/share/revit-api-docs`
75
+ (Linux; `~/Library/Application Support/revit-api-docs` on macOS), verifies each
76
+ file's SHA-256 and unpacks the vector stores. Tool calls made while that runs
77
+ return a short progress message instead of results. To do it ahead of time:
78
+
79
+ ```bash
80
+ uvx revit-api-docs download
81
+ ```
82
+
83
+ From a checkout: `uv sync` then `uv run revit-api-docs`.
84
+
85
+ ## Use
86
+
87
+ Two tools, both read-only:
88
+
89
+ - `search_revit_api(query, top_k=10)` — API entries with signature, parameters
90
+ and remarks. Query with an API name (`Wall.Create`,
91
+ `FilteredElementCollector OfCategory`) or a short task (`create floor from
92
+ boundary`).
93
+ - `get_code_examples(query, top_k=3)` — C# from the SDK samples that use the
94
+ matching APIs, with the project name and the APIs each sample touches.
95
+
96
+ Without any API key the server answers from keyword search over the SQLite
97
+ reference (exact and partial name matches, which is what a model usually
98
+ asks for once it knows roughly what it wants). With an embedding key it adds
99
+ semantic search over the vector store, and with a Cohere key it reranks the
100
+ merged candidates. See Configure.
101
+
102
+ Try it from a terminal (installs the data set if needed):
103
+
104
+ ```bash
105
+ uvx revit-api-docs search "Wall.Create"
106
+ uvx revit-api-docs search "rotate element around axis" --examples
107
+ ```
108
+
109
+ ## Configure
110
+
111
+ All settings are environment variables; there is no config file to edit.
112
+
113
+ | Variable | Default | Meaning |
114
+ |---|---|---|
115
+ | `REVIT_API_DOCS_DATA_DIR` | `%LOCALAPPDATA%\revit-api-docs` (Windows), `~/.local/share/revit-api-docs` (Linux), `~/Library/Application Support/revit-api-docs` (macOS) | Where the data set lives. An existing tree with `sqlite/` and `chromadb/` from the old `revit-api-rag` checkout works as is |
116
+ | `REVIT_API_DOCS_EMBEDDING_API_KEY` | *(unset)* | Key for the embedding endpoint; turns on semantic (vector) search. `OPENROUTER_API_KEY` is used when this is unset |
117
+ | `REVIT_API_DOCS_EMBEDDING_BASE_URL` | `https://openrouter.ai/api/v1` | Any OpenAI-compatible `/embeddings` endpoint |
118
+ | `REVIT_API_DOCS_EMBEDDING_MODEL` | `openai/text-embedding-3-large` | Must produce the same 3072-dimensional space the shipped vectors were built with (`text-embedding-3-large`); another model makes vector search return noise |
119
+ | `COHERE_API_KEY` | *(unset)* | Enables reranking with Cohere `rerank-v3.5` (native REST API) |
120
+ | `REVIT_API_DOCS_RELEASE_URL` | this repository's `v1.0-data` release | Mirror for the data files; the SHA-256 checks still apply |
121
+ | `HTTPS_PROXY` / `HTTP_PROXY` | *(unset)* | Proxy for the embedding and rerank calls |
122
+
123
+ Pass them through the `env` block of your MCP host's server entry.
124
+
125
+ Data set: the SQLite databases and ChromaDB indexes were built from the Revit
126
+ 2026 API CHM and the Revit 2026 SDK samples with the pipeline in `pipeline/`
127
+ (`uv sync --extra pipeline`; needs the CHM, the SDK and OpenRouter/Cohere keys
128
+ in the environment). The server does not need any of that.
129
+
130
+ Development:
131
+
132
+ ```bash
133
+ uv sync
134
+ uv run pytest
135
+ uv build
136
+ uvx --from . revit-api-docs search "Wall.Create"
137
+ ```
138
+
139
+ License: MIT. Issues and discussion: <https://github.com/revitbridge/revit-api-docs/issues>.
@@ -0,0 +1,36 @@
1
+ revit_api_docs/__init__.py,sha256=J8Oj82nU_jp1cA5r2On2L3f5De5ilGU29h96YjmQ-Lc,692
2
+ revit_api_docs/__main__.py,sha256=UUDwvlo_KO7PHXswlG6hMan08oGrBjAdaY_TSbLw-so,136
3
+ revit_api_docs/config.py,sha256=16w-Y6Cl3q2pCKWzjff2et8ow9qDwvPcY812KGGCa7g,4279
4
+ revit_api_docs/data.py,sha256=6VwAQB-MtnE8LQ_KWS1gM7ccZ9Ts7bU3TnV7Xe3Pqq4,11913
5
+ revit_api_docs/default_config.yaml,sha256=fawH_qwXbYkngV02RL-r_xDOVEUpgWlfq-4iJrlh7dc,2630
6
+ revit_api_docs/llm_client.py,sha256=SJKjGYeCZmYqJ38hCnfPQEhvNyXT0yXYojJ99MbMYXk,10783
7
+ revit_api_docs/reranker.py,sha256=_MHSrSM1BGBsZfE8ffu6_XCpre8kAAjgXKPQCkYPJ1E,5922
8
+ revit_api_docs/retriever.py,sha256=N9UhO3YmNmYwH2zt5efby_gjLFMYa5lKWBb2hBYyWbU,38388
9
+ revit_api_docs/server.py,sha256=9I4MaldKrQUFEF3lqEuIBaQxM-cV3VrGqs6188aXKgo,10276
10
+ revit_api_docs/embedder/__init__.py,sha256=xzp42Ox_L0zJx6cCOn63rfEML6Nq_f8kGBLI7zagvsw,86
11
+ revit_api_docs/embedder/providers/__init__.py,sha256=k-DxaLvQA1bzaK5DQVf1FiBwGcsjj2A78Z9TaQZ1u9E,889
12
+ revit_api_docs/embedder/providers/base.py,sha256=gJQk0R1hgRH6eam2RXudlm7Vg412x9SvZg_kZsqets8,690
13
+ revit_api_docs/embedder/providers/google.py,sha256=RGpRXmxmtwA7gOTzcgtXJJJJPxtF60OcZe5IPgr4WDk,1186
14
+ revit_api_docs/embedder/providers/openai.py,sha256=vyxzrW88ytaC4joYPoVly3a_GSgUXvKydRsEfq1nWl0,1982
15
+ revit_api_docs/prompts/__init__.py,sha256=LFP2WYzR1xFeT8LkL-gT2xdgHyVN9Z0w6iIO9lk0oHs,147
16
+ revit_api_docs/prompts/loader.py,sha256=q-73PX83xHVSThH6g9HR2vO6wMKK5lw7ad9zIIMsSkA,609
17
+ revit_api_docs/prompts/pipeline.api_quality_stage1_no_html.md,sha256=vYDToPvPmzughVgLy3s9Oa9oxBaPUJH4vlRixgh0lEg,1036
18
+ revit_api_docs/prompts/pipeline.api_quality_stage1_system.md,sha256=lCvZcPaZAZHkYo1V5In8WROk6L5EzVtPL3R3RHpyn-Y,224
19
+ revit_api_docs/prompts/pipeline.api_quality_stage1_with_html.md,sha256=RrsG5zucE4Ergfx_Z4yRsNdkDKKPGNvBDd1JZ47okBI,1491
20
+ revit_api_docs/prompts/pipeline.api_quality_stage2.md,sha256=SlpFZvGoIXP7KBlPxRZlLiwxFBjlTGJBP6h00oiVUMM,1007
21
+ revit_api_docs/prompts/pipeline.api_quality_stage2_system.md,sha256=X8-yLLUYIosnXs66Xc66zVzTADTN59gzJExOC7wdNSA,213
22
+ revit_api_docs/prompts/pipeline.rewrite_query.md,sha256=UEJ-_D-SDNO4zwMzHJ72rI5_TH2_N3BnT2uUVucRSec,2177
23
+ revit_api_docs/prompts/pipeline.rewrite_query_system.md,sha256=CRzQB-dFES_pz-UY2VwMVkqLcN8O-oay7kvOEgfeILQ,57
24
+ revit_api_docs/prompts/pipeline.sdk_extract_readme_system.md,sha256=b3vD1EZlziKhSDrn_NeBmWO-OVCLDzYRvK2JrNTv1H8,119
25
+ revit_api_docs/prompts/pipeline.sdk_extract_readme_user.md,sha256=IIvPc4TPDU6EzbPK8u8QTp1mdz3Yk_dYFP1e_2iSqUU,1067
26
+ revit_api_docs/prompts/pipeline.sdk_golden_code.md,sha256=B6V6P1R4dI5kmrlNutjqrNLLY_SIlfOCHwaOCzsh4HM,1407
27
+ revit_api_docs/prompts/pipeline.sdk_golden_code_system.md,sha256=5_oWAfd0PsehQEJgMStAgeGBL8NiJr0bPd0xOUn5quY,252
28
+ revit_api_docs/prompts/pipeline.sdk_quality_file_batch.md,sha256=BFszmU58f345eVdETLuYgq9pXGugXmGK57nTHWhWpZA,497
29
+ revit_api_docs/prompts/pipeline.sdk_quality_file_system.md,sha256=3L8RpxPt44uuy8zulqMCPmcGXCUzW2HzehnaWAVUbIs,142
30
+ revit_api_docs/prompts/pipeline.sdk_quality_project.md,sha256=JHId6cNkNLeJ1c2Z0pKh9PLw_NQdegyyXCDv6ElkNEo,570
31
+ revit_api_docs/prompts/pipeline.sdk_quality_project_system.md,sha256=Ba8sOPxXMxdVG5cakf9oTMt_ziddCKKTjLLCWVEfI4Y,167
32
+ revit_api_docs-0.1.0.dist-info/METADATA,sha256=kdf7XXAJAr6nPajRzdnYNbTJkECIWiIfpbT_xg_hpNY,5855
33
+ revit_api_docs-0.1.0.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
34
+ revit_api_docs-0.1.0.dist-info/entry_points.txt,sha256=YF_Lg7IY-5MdWayjEgtgE4yioMPPJ68gwPLdm1ZhgOE,62
35
+ revit_api_docs-0.1.0.dist-info/licenses/LICENSE,sha256=gHSNJ_KoJMRDI0rhLKUQEGmyt7q1TRX6TpY9tDlqveE,1068
36
+ revit_api_docs-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.32.4
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ revit-api-docs = revit_api_docs.server:main
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 revitbridge
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.