ejschwartz commited on
Commit
a6836a6
·
1 Parent(s): 810b7bb
Files changed (5) hide show
  1. app.py +13 -1
  2. pyproject.toml +1 -0
  3. requirements.in +1 -0
  4. requirements.txt +259 -7
  5. uv.lock +17 -0
app.py CHANGED
@@ -1,3 +1,4 @@
 
1
  import os
2
  from threading import Thread
3
 
@@ -6,12 +7,23 @@ import gradio as gr
6
  import spaces
7
  import torch
8
  from gradio_client import Client, handle_file
 
9
  from transformers import TextIteratorStreamer, pipeline
10
 
 
 
 
11
  GHIDRA_SPACE_URL = "https://ejschwartz-ghidrafunctioncppexporter-space.hf.space/"
12
  DECAF_MODEL_ID = os.getenv("DECAF_MODEL_ID", "ejschwartz/decaf-v1-22b-4bit")
13
  EXAMPLE_DEFAULT_FUNCTION_BY_BASENAME = {"false": "0x1014b0"}
14
- ghidra_client = Client(GHIDRA_SPACE_URL)
 
 
 
 
 
 
 
15
  decaf_pipeline = None
16
 
17
 
 
1
+ import logging
2
  import os
3
  from threading import Thread
4
 
 
7
  import spaces
8
  import torch
9
  from gradio_client import Client, handle_file
10
+ from tenacity import before_log, retry, stop_after_attempt, wait_fixed
11
  from transformers import TextIteratorStreamer, pipeline
12
 
13
+ logging.basicConfig(level=logging.INFO)
14
+ logger = logging.getLogger(__name__)
15
+
16
  GHIDRA_SPACE_URL = "https://ejschwartz-ghidrafunctioncppexporter-space.hf.space/"
17
  DECAF_MODEL_ID = os.getenv("DECAF_MODEL_ID", "ejschwartz/decaf-v1-22b-4bit")
18
  EXAMPLE_DEFAULT_FUNCTION_BY_BASENAME = {"false": "0x1014b0"}
19
+
20
+
21
+ @retry(stop=stop_after_attempt(10), wait=wait_fixed(120), before=before_log(logger, logging.INFO))
22
+ def _connect_client(url: str) -> Client:
23
+ return Client(url)
24
+
25
+
26
+ ghidra_client = _connect_client(GHIDRA_SPACE_URL)
27
  decaf_pipeline = None
28
 
29
 
pyproject.toml CHANGED
@@ -12,6 +12,7 @@ dependencies = [
12
  "python-frontmatter>=1.1.0",
13
  "sentencepiece>=0.2.1",
14
  "spaces>=0.47.0",
 
15
  "torch",
16
  "transformers>=5.0.0",
17
  ]
 
12
  "python-frontmatter>=1.1.0",
13
  "sentencepiece>=0.2.1",
14
  "spaces>=0.47.0",
15
+ "tenacity>=9.1.4",
16
  "torch",
17
  "transformers>=5.0.0",
18
  ]
requirements.in CHANGED
@@ -6,3 +6,4 @@ sentencepiece>=0.2.1
6
  spaces>=0.47.0
7
  torch==2.9.1
8
  transformers>=5.0.0
 
 
6
  spaces>=0.47.0
7
  torch==2.9.1
8
  transformers>=5.0.0
9
+ tenacity>=9.1.4
requirements.txt CHANGED
@@ -1,8 +1,260 @@
1
- gradio_client
2
- python-frontmatter
3
- accelerate>=1.12.0
4
- bitsandbytes>=0.49.1
5
- sentencepiece>=0.2.1
6
- spaces>=0.47.0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7
  torch==2.9.1
8
- transformers>=5.0.0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # This file was autogenerated by uv via the following command:
2
+ # uv pip compile requirements.in
3
+ accelerate==1.13.0
4
+ # via -r requirements.in
5
+ aiofiles==24.1.0
6
+ # via gradio
7
+ annotated-doc==0.0.4
8
+ # via
9
+ # fastapi
10
+ # typer
11
+ annotated-types==0.7.0
12
+ # via pydantic
13
+ anyio==4.12.1
14
+ # via
15
+ # gradio
16
+ # httpx
17
+ # starlette
18
+ bitsandbytes==0.49.2
19
+ # via -r requirements.in
20
+ brotli==1.2.0
21
+ # via gradio
22
+ certifi==2026.2.25
23
+ # via
24
+ # httpcore
25
+ # httpx
26
+ # requests
27
+ charset-normalizer==3.4.5
28
+ # via requests
29
+ click==8.3.1
30
+ # via
31
+ # typer
32
+ # uvicorn
33
+ fastapi==0.135.1
34
+ # via gradio
35
+ ffmpy==1.0.0
36
+ # via gradio
37
+ filelock==3.25.1
38
+ # via
39
+ # huggingface-hub
40
+ # torch
41
+ fsspec==2026.2.0
42
+ # via
43
+ # gradio-client
44
+ # huggingface-hub
45
+ # torch
46
+ gradio==6.9.0
47
+ # via spaces
48
+ gradio-client==2.3.0
49
+ # via
50
+ # -r requirements.in
51
+ # gradio
52
+ groovy==0.1.2
53
+ # via gradio
54
+ h11==0.16.0
55
+ # via
56
+ # httpcore
57
+ # uvicorn
58
+ hf-xet==1.4.0
59
+ # via huggingface-hub
60
+ httpcore==1.0.9
61
+ # via httpx
62
+ httpx==0.28.1
63
+ # via
64
+ # gradio
65
+ # gradio-client
66
+ # huggingface-hub
67
+ # safehttpx
68
+ # spaces
69
+ huggingface-hub==1.6.0
70
+ # via
71
+ # accelerate
72
+ # gradio
73
+ # gradio-client
74
+ # tokenizers
75
+ # transformers
76
+ idna==3.11
77
+ # via
78
+ # anyio
79
+ # httpx
80
+ # requests
81
+ jinja2==3.1.6
82
+ # via
83
+ # gradio
84
+ # torch
85
+ markdown-it-py==4.0.0
86
+ # via rich
87
+ markupsafe==3.0.3
88
+ # via
89
+ # gradio
90
+ # jinja2
91
+ mdurl==0.1.2
92
+ # via markdown-it-py
93
+ mpmath==1.3.0
94
+ # via sympy
95
+ networkx==3.6.1
96
+ # via torch
97
+ numpy==2.4.3
98
+ # via
99
+ # accelerate
100
+ # bitsandbytes
101
+ # gradio
102
+ # pandas
103
+ # transformers
104
+ nvidia-cublas-cu12==12.8.4.1
105
+ # via
106
+ # nvidia-cudnn-cu12
107
+ # nvidia-cusolver-cu12
108
+ # torch
109
+ nvidia-cuda-cupti-cu12==12.8.90
110
+ # via torch
111
+ nvidia-cuda-nvrtc-cu12==12.8.93
112
+ # via torch
113
+ nvidia-cuda-runtime-cu12==12.8.90
114
+ # via torch
115
+ nvidia-cudnn-cu12==9.10.2.21
116
+ # via torch
117
+ nvidia-cufft-cu12==11.3.3.83
118
+ # via torch
119
+ nvidia-cufile-cu12==1.13.1.3
120
+ # via torch
121
+ nvidia-curand-cu12==10.3.9.90
122
+ # via torch
123
+ nvidia-cusolver-cu12==11.7.3.90
124
+ # via torch
125
+ nvidia-cusparse-cu12==12.5.8.93
126
+ # via
127
+ # nvidia-cusolver-cu12
128
+ # torch
129
+ nvidia-cusparselt-cu12==0.7.1
130
+ # via torch
131
+ nvidia-nccl-cu12==2.27.5
132
+ # via torch
133
+ nvidia-nvjitlink-cu12==12.8.93
134
+ # via
135
+ # nvidia-cufft-cu12
136
+ # nvidia-cusolver-cu12
137
+ # nvidia-cusparse-cu12
138
+ # torch
139
+ nvidia-nvshmem-cu12==3.3.20
140
+ # via torch
141
+ nvidia-nvtx-cu12==12.8.90
142
+ # via torch
143
+ orjson==3.11.7
144
+ # via gradio
145
+ packaging==26.0
146
+ # via
147
+ # accelerate
148
+ # bitsandbytes
149
+ # gradio
150
+ # gradio-client
151
+ # huggingface-hub
152
+ # spaces
153
+ # transformers
154
+ pandas==3.0.1
155
+ # via gradio
156
+ pillow==12.1.1
157
+ # via gradio
158
+ psutil==5.9.8
159
+ # via
160
+ # accelerate
161
+ # spaces
162
+ pydantic==2.12.5
163
+ # via
164
+ # fastapi
165
+ # gradio
166
+ # spaces
167
+ pydantic-core==2.41.5
168
+ # via pydantic
169
+ pydub==0.25.1
170
+ # via gradio
171
+ pygments==2.19.2
172
+ # via rich
173
+ python-dateutil==2.9.0.post0
174
+ # via pandas
175
+ python-frontmatter==1.1.0
176
+ # via -r requirements.in
177
+ python-multipart==0.0.22
178
+ # via gradio
179
+ pytz==2026.1.post1
180
+ # via gradio
181
+ pyyaml==6.0.3
182
+ # via
183
+ # accelerate
184
+ # gradio
185
+ # huggingface-hub
186
+ # python-frontmatter
187
+ # transformers
188
+ regex==2026.2.28
189
+ # via transformers
190
+ requests==2.32.5
191
+ # via spaces
192
+ rich==14.3.3
193
+ # via typer
194
+ safehttpx==0.1.7
195
+ # via gradio
196
+ safetensors==0.7.0
197
+ # via
198
+ # accelerate
199
+ # transformers
200
+ semantic-version==2.10.0
201
+ # via gradio
202
+ sentencepiece==0.2.1
203
+ # via -r requirements.in
204
+ shellingham==1.5.4
205
+ # via typer
206
+ six==1.17.0
207
+ # via python-dateutil
208
+ spaces==0.47.0
209
+ # via -r requirements.in
210
+ starlette==0.52.1
211
+ # via
212
+ # fastapi
213
+ # gradio
214
+ sympy==1.14.0
215
+ # via torch
216
+ tenacity==9.1.4
217
+ # via -r requirements.in
218
+ tokenizers==0.22.2
219
+ # via transformers
220
+ tomlkit==0.13.3
221
+ # via gradio
222
  torch==2.9.1
223
+ # via
224
+ # -r requirements.in
225
+ # accelerate
226
+ # bitsandbytes
227
+ tqdm==4.67.3
228
+ # via
229
+ # huggingface-hub
230
+ # transformers
231
+ transformers==5.3.0
232
+ # via -r requirements.in
233
+ triton==3.5.1
234
+ # via torch
235
+ typer==0.24.1
236
+ # via
237
+ # gradio
238
+ # huggingface-hub
239
+ # transformers
240
+ typing-extensions==4.15.0
241
+ # via
242
+ # anyio
243
+ # fastapi
244
+ # gradio
245
+ # gradio-client
246
+ # huggingface-hub
247
+ # pydantic
248
+ # pydantic-core
249
+ # spaces
250
+ # starlette
251
+ # torch
252
+ # typing-inspection
253
+ typing-inspection==0.4.2
254
+ # via
255
+ # fastapi
256
+ # pydantic
257
+ urllib3==2.6.3
258
+ # via requests
259
+ uvicorn==0.41.0
260
+ # via gradio
uv.lock CHANGED
@@ -376,6 +376,7 @@ dependencies = [
376
  { name = "python-frontmatter" },
377
  { name = "sentencepiece" },
378
  { name = "spaces" },
 
379
  { name = "torch" },
380
  { name = "transformers" },
381
  ]
@@ -389,6 +390,7 @@ requires-dist = [
389
  { name = "python-frontmatter", specifier = ">=1.1.0" },
390
  { name = "sentencepiece", specifier = ">=0.2.1" },
391
  { name = "spaces", specifier = ">=0.47.0" },
 
392
  { name = "torch" },
393
  { name = "transformers", specifier = ">=5.0.0" },
394
  ]
@@ -1658,6 +1660,15 @@ wheels = [
1658
  { url = "https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl", hash = "sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5", size = 6299353, upload-time = "2025-04-27T18:04:59.103Z" },
1659
  ]
1660
 
 
 
 
 
 
 
 
 
 
1661
  [[package]]
1662
  name = "tokenizers"
1663
  version = "0.22.2"
@@ -1727,6 +1738,12 @@ wheels = [
1727
  { url = "https://files.pythonhosted.org/packages/0f/8b/4b61d6e13f7108f36910df9ab4b58fd389cc2520d54d81b88660804aad99/torch-2.10.0-2-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:418997cb02d0a0f1497cf6a09f63166f9f5df9f3e16c8a716ab76a72127c714f", size = 79423467, upload-time = "2026-02-10T21:44:48.711Z" },
1728
  { url = "https://files.pythonhosted.org/packages/d3/54/a2ba279afcca44bbd320d4e73675b282fcee3d81400ea1b53934efca6462/torch-2.10.0-2-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:13ec4add8c3faaed8d13e0574f5cd4a323c11655546f91fbe6afa77b57423574", size = 79498202, upload-time = "2026-02-10T21:44:52.603Z" },
1729
  { url = "https://files.pythonhosted.org/packages/ec/23/2c9fe0c9c27f7f6cb865abcea8a4568f29f00acaeadfc6a37f6801f84cb4/torch-2.10.0-2-cp313-none-macosx_11_0_arm64.whl", hash = "sha256:e521c9f030a3774ed770a9c011751fb47c4d12029a3d6522116e48431f2ff89e", size = 79498254, upload-time = "2026-02-10T21:44:44.095Z" },
 
 
 
 
 
 
1730
  { url = "https://files.pythonhosted.org/packages/78/89/f5554b13ebd71e05c0b002f95148033e730d3f7067f67423026cc9c69410/torch-2.10.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:3282d9febd1e4e476630a099692b44fdc214ee9bf8ee5377732d9d9dfe5712e4", size = 145992610, upload-time = "2026-01-21T16:25:26.327Z" },
1731
  { url = "https://files.pythonhosted.org/packages/ae/30/a3a2120621bf9c17779b169fc17e3dc29b230c29d0f8222f499f5e159aa8/torch-2.10.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a2f9edd8dbc99f62bc4dfb78af7bf89499bca3d753423ac1b4e06592e467b763", size = 915607863, upload-time = "2026-01-21T16:25:06.696Z" },
1732
  { url = "https://files.pythonhosted.org/packages/6f/3d/c87b33c5f260a2a8ad68da7147e105f05868c281c63d65ed85aa4da98c66/torch-2.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:29b7009dba4b7a1c960260fc8ac85022c784250af43af9fb0ebafc9883782ebd", size = 113723116, upload-time = "2026-01-21T16:25:21.916Z" },
 
376
  { name = "python-frontmatter" },
377
  { name = "sentencepiece" },
378
  { name = "spaces" },
379
+ { name = "tenacity" },
380
  { name = "torch" },
381
  { name = "transformers" },
382
  ]
 
390
  { name = "python-frontmatter", specifier = ">=1.1.0" },
391
  { name = "sentencepiece", specifier = ">=0.2.1" },
392
  { name = "spaces", specifier = ">=0.47.0" },
393
+ { name = "tenacity", specifier = ">=9.1.4" },
394
  { name = "torch" },
395
  { name = "transformers", specifier = ">=5.0.0" },
396
  ]
 
1660
  { url = "https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl", hash = "sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5", size = 6299353, upload-time = "2025-04-27T18:04:59.103Z" },
1661
  ]
1662
 
1663
+ [[package]]
1664
+ name = "tenacity"
1665
+ version = "9.1.4"
1666
+ source = { registry = "https://pypi.org/simple" }
1667
+ sdist = { url = "https://files.pythonhosted.org/packages/47/c6/ee486fd809e357697ee8a44d3d69222b344920433d3b6666ccd9b374630c/tenacity-9.1.4.tar.gz", hash = "sha256:adb31d4c263f2bd041081ab33b498309a57c77f9acf2db65aadf0898179cf93a", size = 49413, upload-time = "2026-02-07T10:45:33.841Z" }
1668
+ wheels = [
1669
+ { url = "https://files.pythonhosted.org/packages/d7/c1/eb8f9debc45d3b7918a32ab756658a0904732f75e555402972246b0b8e71/tenacity-9.1.4-py3-none-any.whl", hash = "sha256:6095a360c919085f28c6527de529e76a06ad89b23659fa881ae0649b867a9d55", size = 28926, upload-time = "2026-02-07T10:45:32.24Z" },
1670
+ ]
1671
+
1672
  [[package]]
1673
  name = "tokenizers"
1674
  version = "0.22.2"
 
1738
  { url = "https://files.pythonhosted.org/packages/0f/8b/4b61d6e13f7108f36910df9ab4b58fd389cc2520d54d81b88660804aad99/torch-2.10.0-2-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:418997cb02d0a0f1497cf6a09f63166f9f5df9f3e16c8a716ab76a72127c714f", size = 79423467, upload-time = "2026-02-10T21:44:48.711Z" },
1739
  { url = "https://files.pythonhosted.org/packages/d3/54/a2ba279afcca44bbd320d4e73675b282fcee3d81400ea1b53934efca6462/torch-2.10.0-2-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:13ec4add8c3faaed8d13e0574f5cd4a323c11655546f91fbe6afa77b57423574", size = 79498202, upload-time = "2026-02-10T21:44:52.603Z" },
1740
  { url = "https://files.pythonhosted.org/packages/ec/23/2c9fe0c9c27f7f6cb865abcea8a4568f29f00acaeadfc6a37f6801f84cb4/torch-2.10.0-2-cp313-none-macosx_11_0_arm64.whl", hash = "sha256:e521c9f030a3774ed770a9c011751fb47c4d12029a3d6522116e48431f2ff89e", size = 79498254, upload-time = "2026-02-10T21:44:44.095Z" },
1741
+ { url = "https://files.pythonhosted.org/packages/36/ab/7b562f1808d3f65414cd80a4f7d4bb00979d9355616c034c171249e1a303/torch-2.10.0-3-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:ac5bdcbb074384c66fa160c15b1ead77839e3fe7ed117d667249afce0acabfac", size = 915518691, upload-time = "2026-03-11T14:15:43.147Z" },
1742
+ { url = "https://files.pythonhosted.org/packages/b3/7a/abada41517ce0011775f0f4eacc79659bc9bc6c361e6bfe6f7052a6b9363/torch-2.10.0-3-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:98c01b8bb5e3240426dcde1446eed6f40c778091c8544767ef1168fc663a05a6", size = 915622781, upload-time = "2026-03-11T14:17:11.354Z" },
1743
+ { url = "https://files.pythonhosted.org/packages/ab/c6/4dfe238342ffdcec5aef1c96c457548762d33c40b45a1ab7033bb26d2ff2/torch-2.10.0-3-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:80b1b5bfe38eb0e9f5ff09f206dcac0a87aadd084230d4a36eea5ec5232c115b", size = 915627275, upload-time = "2026-03-11T14:16:11.325Z" },
1744
+ { url = "https://files.pythonhosted.org/packages/d8/f0/72bf18847f58f877a6a8acf60614b14935e2f156d942483af1ffc081aea0/torch-2.10.0-3-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:46b3574d93a2a8134b3f5475cfb98e2eb46771794c57015f6ad1fb795ec25e49", size = 915523474, upload-time = "2026-03-11T14:17:44.422Z" },
1745
+ { url = "https://files.pythonhosted.org/packages/f4/39/590742415c3030551944edc2ddc273ea1fdfe8ffb2780992e824f1ebee98/torch-2.10.0-3-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:b1d5e2aba4eb7f8e87fbe04f86442887f9167a35f092afe4c237dfcaaef6e328", size = 915632474, upload-time = "2026-03-11T14:15:13.666Z" },
1746
+ { url = "https://files.pythonhosted.org/packages/b6/8e/34949484f764dde5b222b7fe3fede43e4a6f0da9d7f8c370bb617d629ee2/torch-2.10.0-3-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:0228d20b06701c05a8f978357f657817a4a63984b0c90745def81c18aedfa591", size = 915523882, upload-time = "2026-03-11T14:14:46.311Z" },
1747
  { url = "https://files.pythonhosted.org/packages/78/89/f5554b13ebd71e05c0b002f95148033e730d3f7067f67423026cc9c69410/torch-2.10.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:3282d9febd1e4e476630a099692b44fdc214ee9bf8ee5377732d9d9dfe5712e4", size = 145992610, upload-time = "2026-01-21T16:25:26.327Z" },
1748
  { url = "https://files.pythonhosted.org/packages/ae/30/a3a2120621bf9c17779b169fc17e3dc29b230c29d0f8222f499f5e159aa8/torch-2.10.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a2f9edd8dbc99f62bc4dfb78af7bf89499bca3d753423ac1b4e06592e467b763", size = 915607863, upload-time = "2026-01-21T16:25:06.696Z" },
1749
  { url = "https://files.pythonhosted.org/packages/6f/3d/c87b33c5f260a2a8ad68da7147e105f05868c281c63d65ed85aa4da98c66/torch-2.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:29b7009dba4b7a1c960260fc8ac85022c784250af43af9fb0ebafc9883782ebd", size = 113723116, upload-time = "2026-01-21T16:25:21.916Z" },