aiondtech 2.1.0__tar.gz → 2.3.0__tar.gz
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.
- {aiondtech-2.1.0 → aiondtech-2.3.0}/PKG-INFO +181 -115
- {aiondtech-2.1.0 → aiondtech-2.3.0}/README.md +181 -115
- {aiondtech-2.1.0 → aiondtech-2.3.0}/aiondtech/__init__.py +1 -1
- aiondtech-2.3.0/aiondtech/client.py +595 -0
- aiondtech-2.3.0/aiondtech/models.py +426 -0
- {aiondtech-2.1.0 → aiondtech-2.3.0}/aiondtech.egg-info/PKG-INFO +181 -115
- {aiondtech-2.1.0 → aiondtech-2.3.0}/pyproject.toml +1 -1
- aiondtech-2.1.0/aiondtech/client.py +0 -1200
- aiondtech-2.1.0/aiondtech/models.py +0 -853
- {aiondtech-2.1.0 → aiondtech-2.3.0}/LICENSE +0 -0
- {aiondtech-2.1.0 → aiondtech-2.3.0}/aiondtech/py.typed +0 -0
- {aiondtech-2.1.0 → aiondtech-2.3.0}/aiondtech.egg-info/SOURCES.txt +0 -0
- {aiondtech-2.1.0 → aiondtech-2.3.0}/aiondtech.egg-info/dependency_links.txt +0 -0
- {aiondtech-2.1.0 → aiondtech-2.3.0}/aiondtech.egg-info/requires.txt +0 -0
- {aiondtech-2.1.0 → aiondtech-2.3.0}/aiondtech.egg-info/top_level.txt +0 -0
- {aiondtech-2.1.0 → aiondtech-2.3.0}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: aiondtech
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.3.0
|
|
4
4
|
Summary: Official Python SDK for AiondTech Resume Analyser API
|
|
5
5
|
Author-email: AiondTech <support@aiondtech.com>
|
|
6
6
|
Maintainer-email: AiondTech <support@aiondtech.com>
|
|
@@ -77,15 +77,17 @@ client = ResumeAnalyser(api_key="your-api-key", production=True)
|
|
|
77
77
|
|
|
78
78
|
## API Endpoints
|
|
79
79
|
|
|
80
|
+
Credit usage varies depending on resume size and complexity. Every response includes the actual `credits_used` — always check it for accurate tracking.
|
|
81
|
+
|
|
80
82
|
| Method | Credits | Description |
|
|
81
83
|
|--------|---------|-------------|
|
|
82
|
-
| `resumes.upload()` |
|
|
83
|
-
| `resumes.upload_and_analyze()` |
|
|
84
|
-
| `resumes.upload_analyze_compare()` |
|
|
85
|
-
| `resumes.analyze()` |
|
|
86
|
-
| `resumes.compare_resumes()` |
|
|
84
|
+
| `resumes.upload()` | Varies | Upload PDF resume |
|
|
85
|
+
| `resumes.upload_and_analyze()` | Varies | Upload + AI parsing |
|
|
86
|
+
| `resumes.upload_analyze_compare()` | Varies | Upload + parse + compare to job |
|
|
87
|
+
| `resumes.analyze()` | Varies | Parse existing resume by ID |
|
|
88
|
+
| `resumes.compare_resumes()` | Varies | Compare resume to job |
|
|
87
89
|
| `resumes.list()` | 0 | List all resumes |
|
|
88
|
-
| `jobs.create()` |
|
|
90
|
+
| `jobs.create()` | Varies | Create job posting |
|
|
89
91
|
| `jobs.list()` | 0 | List all jobs |
|
|
90
92
|
| `credits.balance()` | 0 | Check credit balance |
|
|
91
93
|
| `credits.usage()` | 0 | View usage history |
|
|
@@ -100,15 +102,18 @@ Upload a PDF resume without parsing. Returns a `resume_id` for later use.
|
|
|
100
102
|
|
|
101
103
|
```python
|
|
102
104
|
result = client.resumes.upload("path/to/resume.pdf")
|
|
105
|
+
|
|
106
|
+
print(f"Resume ID: {result.resume_id}")
|
|
107
|
+
print(f"Message: {result.message}")
|
|
108
|
+
print(f"Credits Used: {result.credits_used}")
|
|
103
109
|
```
|
|
104
110
|
|
|
105
|
-
**
|
|
111
|
+
**Output:**
|
|
106
112
|
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
result._raw # dict — Full raw API response
|
|
113
|
+
```
|
|
114
|
+
Resume ID: 450
|
|
115
|
+
Message: Resume uploaded successfully
|
|
116
|
+
Credits Used: 1
|
|
112
117
|
```
|
|
113
118
|
|
|
114
119
|
---
|
|
@@ -119,25 +124,31 @@ Upload a PDF and immediately extract structured data (AI-powered parsing).
|
|
|
119
124
|
|
|
120
125
|
```python
|
|
121
126
|
result = client.resumes.upload_and_analyze("path/to/resume.pdf")
|
|
122
|
-
```
|
|
123
127
|
|
|
124
|
-
|
|
128
|
+
print(f"Resume ID: {result.resume_id}")
|
|
129
|
+
print(f"Full Name: {result.full_name}")
|
|
130
|
+
print(f"Email: {result.email}")
|
|
131
|
+
print(f"Skills: {result.skills}")
|
|
132
|
+
print(f"Job Titles: {result.job_titles}")
|
|
133
|
+
print(f"Total Experience: {result.total_experience}")
|
|
134
|
+
print(f"Credits Used: {result.credits_used}")
|
|
135
|
+
print(f"Parsed Data: {result.parsed_data}")
|
|
136
|
+
```
|
|
125
137
|
|
|
126
|
-
|
|
127
|
-
result.resume_id # int — Unique resume ID
|
|
128
|
-
result.parsed_data # dict — Full parsed data (see structure below)
|
|
129
|
-
result.credits_used # int — 3
|
|
130
|
-
result._raw # dict — Full raw API response
|
|
138
|
+
**Output:**
|
|
131
139
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
140
|
+
```
|
|
141
|
+
Resume ID: 450
|
|
142
|
+
Full Name: John Doe
|
|
143
|
+
Email: john@example.com
|
|
144
|
+
Skills: ['Python', 'Django', 'AWS']
|
|
145
|
+
Job Titles: ['Senior Developer', 'Tech Lead']
|
|
146
|
+
Total Experience: 8 years
|
|
147
|
+
Credits Used: 5
|
|
148
|
+
Parsed Data: {'full_name': 'John Doe', 'email': 'john@example.com', ...}
|
|
138
149
|
```
|
|
139
150
|
|
|
140
|
-
|
|
151
|
+
**Full `parsed_data` structure:**
|
|
141
152
|
|
|
142
153
|
```python
|
|
143
154
|
{
|
|
@@ -163,20 +174,25 @@ result.total_experience # str | None
|
|
|
163
174
|
Upload a resume, parse it, and compare against a job posting in one call.
|
|
164
175
|
|
|
165
176
|
```python
|
|
166
|
-
result = client.resumes.upload_analyze_compare("resume.pdf", job_id=
|
|
177
|
+
result = client.resumes.upload_analyze_compare("resume.pdf", job_id=56)
|
|
178
|
+
|
|
179
|
+
print(f"Resume ID: {result.resume_id}")
|
|
180
|
+
print(f"Job ID: {result.job_id}")
|
|
181
|
+
print(f"Score: {result.comparison_score}")
|
|
182
|
+
print(f"Reason: {result.comparison_reason}")
|
|
183
|
+
print(f"Parsed Data: {result.parsed_data}")
|
|
184
|
+
print(f"Credits Used: {result.credits_used}")
|
|
167
185
|
```
|
|
168
186
|
|
|
169
|
-
**
|
|
187
|
+
**Output:**
|
|
170
188
|
|
|
171
|
-
```
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
result.credits_used # int — 6
|
|
179
|
-
result._raw # dict — Full raw API response
|
|
189
|
+
```
|
|
190
|
+
Resume ID: 449
|
|
191
|
+
Job ID: 56
|
|
192
|
+
Score: 30
|
|
193
|
+
Reason: The candidate has a strong technical background...
|
|
194
|
+
Parsed Data: {'full_name': 'Salem O. Ba Atya', 'email': 'Baatyaso@gmail.com', ...}
|
|
195
|
+
Credits Used: 9
|
|
180
196
|
```
|
|
181
197
|
|
|
182
198
|
---
|
|
@@ -186,30 +202,43 @@ result._raw # dict — Full raw API response
|
|
|
186
202
|
Parse an already-uploaded resume by its ID.
|
|
187
203
|
|
|
188
204
|
```python
|
|
189
|
-
result = client.resumes.analyze(resume_id=
|
|
205
|
+
result = client.resumes.analyze(resume_id=444)
|
|
206
|
+
|
|
207
|
+
print(f"Resume ID: {result.resume_id}")
|
|
208
|
+
print(f"Partner: {result.partner}")
|
|
209
|
+
print(f"Full Name: {result.full_name}")
|
|
210
|
+
print(f"Email: {result.email}")
|
|
211
|
+
print(f"Phone: {result.phone}")
|
|
212
|
+
print(f"LinkedIn: {result.linkedin}")
|
|
213
|
+
print(f"Location: {result.location}")
|
|
214
|
+
print(f"Skills: {result.skills}")
|
|
215
|
+
print(f"Job Titles: {result.job_titles}")
|
|
216
|
+
print(f"Companies: {result.companies}")
|
|
217
|
+
print(f"Education: {result.education}")
|
|
218
|
+
print(f"Total Experience: {result.total_experience}")
|
|
219
|
+
print(f"Certifications: {result.certifications}")
|
|
220
|
+
print(f"Credits Used: {result.credits_used}")
|
|
221
|
+
print(f"Parsed Data: {result.parsed_data}")
|
|
190
222
|
```
|
|
191
223
|
|
|
192
|
-
**
|
|
224
|
+
**Output:**
|
|
193
225
|
|
|
194
|
-
```
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
result.education # list[str]
|
|
211
|
-
result.total_experience # str | None
|
|
212
|
-
result.certifications # list[str]
|
|
226
|
+
```
|
|
227
|
+
Resume ID: 444
|
|
228
|
+
Partner: your-partner-id
|
|
229
|
+
Full Name: John Doe
|
|
230
|
+
Email: john@example.com
|
|
231
|
+
Phone: +1234567890
|
|
232
|
+
LinkedIn: linkedin.com/in/johndoe
|
|
233
|
+
Location: New York, NY
|
|
234
|
+
Skills: ['Python', 'Django', 'AWS']
|
|
235
|
+
Job Titles: ['Senior Developer', 'Tech Lead']
|
|
236
|
+
Companies: ['Google', 'Meta']
|
|
237
|
+
Education: ['BSc Computer Science - MIT']
|
|
238
|
+
Total Experience: 8 years
|
|
239
|
+
Certifications: ['AWS Certified Solutions Architect']
|
|
240
|
+
Credits Used: 3
|
|
241
|
+
Parsed Data: {'full_name': 'John Doe', ...}
|
|
213
242
|
```
|
|
214
243
|
|
|
215
244
|
---
|
|
@@ -223,18 +252,24 @@ job = client.jobs.create(
|
|
|
223
252
|
title="Senior Python Developer",
|
|
224
253
|
description="We are looking for an experienced Python developer..."
|
|
225
254
|
)
|
|
255
|
+
|
|
256
|
+
print(f"Job ID: {job.job_id}")
|
|
257
|
+
print(f"Title: {job.title}")
|
|
258
|
+
print(f"Description: {job.description}")
|
|
259
|
+
print(f"Created By: {job.created_by}")
|
|
260
|
+
print(f"Created At: {job.created_at}")
|
|
261
|
+
print(f"Credits Used: {job.credits_used}")
|
|
226
262
|
```
|
|
227
263
|
|
|
228
|
-
**
|
|
264
|
+
**Output:**
|
|
229
265
|
|
|
230
|
-
```
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
job._raw # dict — Full raw API response
|
|
266
|
+
```
|
|
267
|
+
Job ID: 57
|
|
268
|
+
Title: Senior Python Developer
|
|
269
|
+
Description: We are looking for an experienced Python developer...
|
|
270
|
+
Created By: your-partner-id
|
|
271
|
+
Created At: 2026-02-06T10:30:00Z
|
|
272
|
+
Credits Used: 1
|
|
238
273
|
```
|
|
239
274
|
|
|
240
275
|
---
|
|
@@ -244,19 +279,25 @@ job._raw # dict — Full raw API response
|
|
|
244
279
|
Compare an existing resume against an existing job posting.
|
|
245
280
|
|
|
246
281
|
```python
|
|
247
|
-
result = client.resumes.compare_resumes(resume_id=
|
|
282
|
+
result = client.resumes.compare_resumes(resume_id=445, job_id=56)
|
|
283
|
+
|
|
284
|
+
print(f"Resume ID: {result.resume_id}")
|
|
285
|
+
print(f"Job ID: {result.job_id}")
|
|
286
|
+
print(f"Score: {result.comparison_score}")
|
|
287
|
+
print(f"Reason: {result.comparison_reason}")
|
|
288
|
+
print(f"Language: {result.language}")
|
|
289
|
+
print(f"Credits Used: {result.credits_used}")
|
|
248
290
|
```
|
|
249
291
|
|
|
250
|
-
**
|
|
292
|
+
**Output:**
|
|
251
293
|
|
|
252
|
-
```
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
result._raw # dict — Full raw API response
|
|
294
|
+
```
|
|
295
|
+
Resume ID: 445
|
|
296
|
+
Job ID: 56
|
|
297
|
+
Score: 75
|
|
298
|
+
Reason: The candidate demonstrates strong alignment with the role requirements...
|
|
299
|
+
Language: en
|
|
300
|
+
Credits Used: 5
|
|
260
301
|
```
|
|
261
302
|
|
|
262
303
|
---
|
|
@@ -267,23 +308,28 @@ List all uploaded resumes with pagination.
|
|
|
267
308
|
|
|
268
309
|
```python
|
|
269
310
|
result = client.resumes.list(page=1, limit=50)
|
|
270
|
-
```
|
|
271
311
|
|
|
272
|
-
|
|
312
|
+
print(f"Total: {result.total}")
|
|
313
|
+
print(f"Page: {result.page}")
|
|
314
|
+
print(f"Limit: {result.limit}")
|
|
315
|
+
print(f"Has More: {result.has_more}")
|
|
316
|
+
print(f"Count: {len(result)}")
|
|
273
317
|
|
|
274
|
-
```python
|
|
275
|
-
result.resumes # list[dict] — List of resume objects
|
|
276
|
-
result.total # int — Total number of resumes
|
|
277
|
-
result.page # int — Current page
|
|
278
|
-
result.limit # int — Items per page
|
|
279
|
-
result.has_more # bool — Whether more pages exist
|
|
280
|
-
result._raw # dict — Full raw API response
|
|
281
|
-
|
|
282
|
-
# Iterable
|
|
283
318
|
for resume in result:
|
|
284
|
-
print(resume[
|
|
319
|
+
print(f" ID: {resume['id']}, Name: {resume.get('full_name')}, File: {resume.get('filename')}")
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
**Output:**
|
|
285
323
|
|
|
286
|
-
|
|
324
|
+
```
|
|
325
|
+
Total: 120
|
|
326
|
+
Page: 1
|
|
327
|
+
Limit: 50
|
|
328
|
+
Has More: True
|
|
329
|
+
Count: 50
|
|
330
|
+
ID: 450, Name: John Doe, File: resume.pdf
|
|
331
|
+
ID: 449, Name: Salem O. Ba Atya, File: Salem_20220524.pdf
|
|
332
|
+
...
|
|
287
333
|
```
|
|
288
334
|
|
|
289
335
|
---
|
|
@@ -294,21 +340,28 @@ List all job postings with pagination.
|
|
|
294
340
|
|
|
295
341
|
```python
|
|
296
342
|
result = client.jobs.list(page=1, limit=50)
|
|
297
|
-
```
|
|
298
343
|
|
|
299
|
-
|
|
344
|
+
print(f"Total: {result.total}")
|
|
345
|
+
print(f"Page: {result.page}")
|
|
346
|
+
print(f"Limit: {result.limit}")
|
|
347
|
+
print(f"Has More: {result.has_more}")
|
|
348
|
+
print(f"Count: {len(result)}")
|
|
300
349
|
|
|
301
|
-
```python
|
|
302
|
-
result.jobs # list[dict] — List of job objects
|
|
303
|
-
result.total # int — Total number of jobs
|
|
304
|
-
result.page # int — Current page
|
|
305
|
-
result.limit # int — Items per page
|
|
306
|
-
result.has_more # bool — Whether more pages exist
|
|
307
|
-
result._raw # dict — Full raw API response
|
|
308
|
-
|
|
309
|
-
# Iterable
|
|
310
350
|
for job in result:
|
|
311
|
-
print(job[
|
|
351
|
+
print(f" ID: {job['id']}, Title: {job['title']}")
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
**Output:**
|
|
355
|
+
|
|
356
|
+
```
|
|
357
|
+
Total: 10
|
|
358
|
+
Page: 1
|
|
359
|
+
Limit: 50
|
|
360
|
+
Has More: False
|
|
361
|
+
Count: 10
|
|
362
|
+
ID: 56, Title: Senior Python Developer
|
|
363
|
+
ID: 55, Title: Data Scientist
|
|
364
|
+
...
|
|
312
365
|
```
|
|
313
366
|
|
|
314
367
|
---
|
|
@@ -317,18 +370,22 @@ for job in result:
|
|
|
317
370
|
|
|
318
371
|
```python
|
|
319
372
|
balance = client.credits.balance()
|
|
373
|
+
|
|
374
|
+
print(f"Total: {balance.get('total')}")
|
|
375
|
+
print(f"Used This Month: {balance.get('used_mtd')}")
|
|
376
|
+
print(f"Remaining: {balance.get('remaining')}")
|
|
377
|
+
print(f"Plan: {balance.get('plan_name')}")
|
|
378
|
+
print(f"Resets At: {balance.get('resets_at')}")
|
|
320
379
|
```
|
|
321
380
|
|
|
322
|
-
**
|
|
381
|
+
**Output:**
|
|
323
382
|
|
|
324
|
-
```
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
"resets_at": "2026-03-01T00:00:00Z"
|
|
331
|
-
}
|
|
383
|
+
```
|
|
384
|
+
Total: 1000
|
|
385
|
+
Used This Month: 150
|
|
386
|
+
Remaining: 850
|
|
387
|
+
Plan: Professional
|
|
388
|
+
Resets At: 2026-03-01T00:00:00Z
|
|
332
389
|
```
|
|
333
390
|
|
|
334
391
|
---
|
|
@@ -337,8 +394,11 @@ balance = client.credits.balance()
|
|
|
337
394
|
|
|
338
395
|
```python
|
|
339
396
|
usage = client.credits.usage()
|
|
397
|
+
print(usage)
|
|
398
|
+
|
|
340
399
|
# Or with date filters
|
|
341
400
|
usage = client.credits.usage(start_date="2026-01-01", end_date="2026-01-31")
|
|
401
|
+
print(usage)
|
|
342
402
|
```
|
|
343
403
|
|
|
344
404
|
---
|
|
@@ -390,13 +450,14 @@ job = client.jobs.create(
|
|
|
390
450
|
title="Senior Python Developer",
|
|
391
451
|
description="5+ years Python, Django, AWS, PostgreSQL required..."
|
|
392
452
|
)
|
|
393
|
-
print(f"Created job #{job.job_id}: {job.title}")
|
|
453
|
+
print(f"Created job #{job.job_id}: {job.title} ({job.credits_used} credits)")
|
|
394
454
|
|
|
395
455
|
# Step 2: Upload and analyze a resume
|
|
396
456
|
analysis = client.resumes.upload_and_analyze("candidate_resume.pdf")
|
|
397
457
|
print(f"Candidate: {analysis.full_name}")
|
|
398
458
|
print(f"Skills: {', '.join(analysis.skills)}")
|
|
399
459
|
print(f"Experience: {analysis.total_experience}")
|
|
460
|
+
print(f"Credits used: {analysis.credits_used}")
|
|
400
461
|
|
|
401
462
|
# Step 3: Compare resume to job
|
|
402
463
|
comparison = client.resumes.compare_resumes(
|
|
@@ -404,8 +465,8 @@ comparison = client.resumes.compare_resumes(
|
|
|
404
465
|
job_id=job.job_id
|
|
405
466
|
)
|
|
406
467
|
print(f"Score: {comparison.comparison_score}%")
|
|
407
|
-
print(f"Language: {comparison.language}")
|
|
408
468
|
print(f"Reasoning: {comparison.comparison_reason}")
|
|
469
|
+
print(f"Credits used: {comparison.credits_used}")
|
|
409
470
|
|
|
410
471
|
# Step 4: Check remaining credits
|
|
411
472
|
balance = client.credits.balance()
|
|
@@ -417,6 +478,7 @@ print(f"Credits remaining: {balance['remaining']}")
|
|
|
417
478
|
```python
|
|
418
479
|
result = client.resumes.upload_analyze_compare("resume.pdf", job_id=job.job_id)
|
|
419
480
|
print(f"Score: {result.comparison_score}% — {result.comparison_reason}")
|
|
481
|
+
print(f"Credits used: {result.credits_used}")
|
|
420
482
|
```
|
|
421
483
|
|
|
422
484
|
### Batch Processing
|
|
@@ -426,18 +488,22 @@ import os
|
|
|
426
488
|
|
|
427
489
|
job = client.jobs.create("Data Scientist", "ML, Python, statistics...")
|
|
428
490
|
|
|
491
|
+
total_credits = job.credits_used
|
|
429
492
|
results = []
|
|
493
|
+
|
|
430
494
|
for pdf in os.listdir("resumes/"):
|
|
431
495
|
if pdf.endswith(".pdf"):
|
|
432
496
|
r = client.resumes.upload_analyze_compare(
|
|
433
497
|
f"resumes/{pdf}", job_id=job.job_id
|
|
434
498
|
)
|
|
435
499
|
results.append(r)
|
|
436
|
-
|
|
500
|
+
total_credits += r.credits_used
|
|
501
|
+
print(f"{r.comparison_score:5.1f}% — {pdf} ({r.credits_used} credits)")
|
|
437
502
|
|
|
438
503
|
# Sort by score
|
|
439
504
|
results.sort(key=lambda x: x.comparison_score, reverse=True)
|
|
440
505
|
print(f"\nTop candidate: resume_id={results[0].resume_id} ({results[0].comparison_score}%)")
|
|
506
|
+
print(f"Total credits used: {total_credits}")
|
|
441
507
|
```
|
|
442
508
|
|
|
443
509
|
---
|