tallyfy 1.0.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.

Potentially problematic release.


This version of tallyfy might be problematic. Click here for more details.

tallyfy/README.md ADDED
@@ -0,0 +1,636 @@
1
+ # Tallyfy SDK
2
+
3
+ A comprehensive Python SDK for interacting with the Tallyfy API. This SDK provides a clean, modular interface for managing users, tasks, templates, and form fields in your Tallyfy organization.
4
+
5
+ ## Table of Contents
6
+
7
+ - [Installation](#installation)
8
+ - [Quick Start](#quick-start)
9
+ - [Architecture](#architecture)
10
+ - [Core Features](#core-features)
11
+ - [API Reference](#api-reference)
12
+ - [Data Models](#data-models)
13
+ - [Error Handling](#error-handling)
14
+ - [Examples](#examples)
15
+ - [Advanced Usage](#advanced-usage)
16
+ - [Contributing](#contributing)
17
+
18
+ ## Installation
19
+
20
+ ```bash
21
+ pip install -r requirements.txt
22
+ ```
23
+
24
+ **Dependencies:**
25
+ - `requests` - HTTP client library
26
+ - `typing` - Type hints support (Python 3.5+)
27
+
28
+ ## Quick Start
29
+
30
+ ```python
31
+ from tallyfy import TallyfySDK
32
+
33
+ # Initialize the SDK
34
+ sdk = TallyfySDK(
35
+ api_key="your_api_key_here",
36
+ base_url="https://api.tallyfy.com" # Optional, defaults to Tallyfy API
37
+ )
38
+
39
+ # Get organization users
40
+ users = sdk.users.get_organization_users(org_id="your_org_id")
41
+
42
+ # Get current user's tasks
43
+ my_tasks = sdk.tasks.get_my_tasks(org_id="your_org_id")
44
+
45
+ # Search for templates
46
+ templates = sdk.search(org_id="your_org_id", search_query="onboarding", search_type="blueprint")
47
+
48
+ # Get a specific template
49
+ template = sdk.templates.get_template(org_id="your_org_id", template_name="Employee Onboarding")
50
+ ```
51
+
52
+ ## Architecture
53
+
54
+ The Tallyfy SDK follows a modular architecture with specialized management classes and comprehensive data models:
55
+
56
+ ### Core Components
57
+
58
+ - **`TallyfySDK`** - Main SDK class that orchestrates all operations with backward compatibility methods
59
+ - **`BaseSDK`** - Base class with HTTP request handling, retry logic, and connection pooling
60
+ - **Management Modules:**
61
+ - `UserManagement` - User and guest operations with full profile support
62
+ - `TaskManagement` - Task and process operations with natural language processing
63
+ - `TemplateManagement` - Template/checklist operations with automation analysis
64
+ - `FormFieldManagement` - Form field operations with AI-powered suggestions
65
+ - **Utility Modules:**
66
+ - `DateExtractor` - Natural language date parsing and task extraction
67
+ - `TallyfyError` - Custom exception handling with status codes and response data
68
+
69
+ ### File Structure
70
+
71
+ ```
72
+ tallyfy/
73
+ ├── __init__.py # SDK exports and version
74
+ ├── core.py # BaseSDK and TallyfySDK classes
75
+ ├── models.py # Data models and types
76
+ ├── user_management.py # User and guest management
77
+ ├── task_management.py # Task and process management
78
+ ├── template_management.py # Template management
79
+ ├── form_fields_management.py # Form field management
80
+ └── README.md # This documentation
81
+ ```
82
+
83
+ ## Core Features
84
+
85
+ ### 🔐 Authentication & Security
86
+ - Bearer token authentication with session management
87
+ - Configurable request timeouts and connection pooling
88
+ - Automatic retry logic for transient failures (5xx errors)
89
+ - No retry for client errors (4xx) to prevent API abuse
90
+ - Comprehensive error handling with detailed error information
91
+
92
+ ### 👥 User Management
93
+ - Get organization members with full profile data (country, timezone, job details)
94
+ - Get minimal user lists for performance-critical operations
95
+ - Manage guests and external users with guest-specific features
96
+ - Invite new users to organization with role assignment
97
+ - Support for user groups and permissions
98
+
99
+ ### ✅ Task Management
100
+ - Get tasks for specific users or processes with filtering
101
+ - Create standalone tasks with rich assignment options
102
+ - **Natural language task creation** with automatic date/time extraction
103
+ - Search processes by name with fuzzy matching
104
+ - Advanced filtering for organization runs (status, owners, tags, etc.)
105
+ - Universal search across processes, templates, and tasks
106
+
107
+ ### 📋 Template Management
108
+ - Get templates with full metadata and step details
109
+ - Search templates by name with exact and fuzzy matching
110
+ - Update template properties and metadata
111
+ - Duplicate templates with permission copying options
112
+ - **Automation management** - Create, update, and analyze conditional rules
113
+ - **Step dependency analysis** - Understand step visibility conditions
114
+ - **AI-powered deadline suggestions** for individual steps
115
+ - **Template health assessment** - Comprehensive analysis of template quality
116
+ - **Automation consolidation** - Optimize and merge redundant rules
117
+ - Add assignees and edit step descriptions
118
+ - Kickoff field management for template launch forms
119
+
120
+ ### 📝 Form Field Management
121
+ - Add form fields to template steps with comprehensive validation
122
+ - Support for text, dropdown, date, file upload, WYSIWYG editor fields
123
+ - Update field properties, validation rules, and positioning
124
+ - Move fields between steps with automatic reordering
125
+ - **AI-powered field suggestions** based on step analysis
126
+ - Manage dropdown options with bulk updates
127
+ - **Smart field recommendations** with confidence scoring
128
+ - Field dependency management and conditional logic
129
+
130
+ ### 🔍 Search & Discovery
131
+ - Universal search across processes, templates, and tasks
132
+ - Exact and fuzzy matching with relevance scoring
133
+ - Pagination support with configurable page sizes
134
+ - Rich search results with metadata and context
135
+ - **Natural language date extraction** from search queries
136
+ - Process and template name-based search with suggestions
137
+
138
+ ### 🤖 Natural Language Processing
139
+ - **Task creation from natural language** with automatic parsing
140
+ - **Date extraction** supporting various formats ("next Monday at 12PM", "tomorrow morning")
141
+ - **User/guest resolution** from names and emails
142
+ - **Smart task parsing** extracting titles, descriptions, and deadlines
143
+ - **Fuzzy matching** for user names and process titles
144
+
145
+ ## API Reference
146
+
147
+ ### SDK Initialization
148
+
149
+ ```python
150
+ TallyfySDK(
151
+ api_key: str,
152
+ base_url: str = "https://api.tallyfy.com",
153
+ timeout: int = 30,
154
+ max_retries: int = 3,
155
+ retry_delay: float = 1.0
156
+ )
157
+ ```
158
+
159
+ ### User Management
160
+
161
+ ```python
162
+ # Get all organization users
163
+ users = sdk.users.get_organization_users(org_id, with_groups=False)
164
+
165
+ # Get minimal user list
166
+ users_list = sdk.users.get_organization_users_list(org_id)
167
+
168
+ # Get organization guests
169
+ guests = sdk.users.get_organization_guests(org_id, with_stats=False)
170
+
171
+ # Invite user to organization
172
+ user = sdk.users.invite_user_to_organization(
173
+ org_id, email, first_name, last_name,
174
+ role="light", message=None
175
+ )
176
+ ```
177
+
178
+ ### Task Management
179
+
180
+ ```python
181
+ # Get current user's tasks
182
+ my_tasks = sdk.tasks.get_my_tasks(org_id)
183
+
184
+ # Get specific user's tasks
185
+ user_tasks = sdk.tasks.get_user_tasks(org_id, user_id)
186
+
187
+ # Get tasks for a process
188
+ process_tasks = sdk.tasks.get_tasks_for_process(org_id, process_id=None, process_name="My Process")
189
+
190
+ # Get organization processes with filtering
191
+ runs = sdk.tasks.get_organization_runs(
192
+ org_id,
193
+ status="active",
194
+ owners="123,456",
195
+ checklist_id="template_id"
196
+ )
197
+
198
+ # Create standalone task
199
+ task = sdk.tasks.create_task(
200
+ org_id, title="Review Document",
201
+ deadline="2024-12-31T23:59:59Z",
202
+ description="Please review the attached document"
203
+ )
204
+
205
+ # Create task from natural language (via MCP Server)
206
+ task_result = create_task_from_text(
207
+ org_id,
208
+ "Create a task called Review Document with description Review the quarterly report the deadline is next Monday at 12PM",
209
+ user_emails=["john@company.com"],
210
+ max_assignable=2
211
+ )
212
+
213
+ # Search processes, templates, or tasks
214
+ results = sdk.tasks.search(org_id, "onboarding", search_type="process")
215
+
216
+ # Search for specific entity types
217
+ templates = sdk.tasks.search(org_id, "employee onboarding", search_type="blueprint")
218
+ tasks = sdk.tasks.search(org_id, "review", search_type="task")
219
+ ```
220
+
221
+ ### Template Management
222
+
223
+ ```python
224
+ # Get template by ID or name
225
+ template = sdk.templates.get_template(org_id, template_id=None, template_name="Onboarding")
226
+
227
+ # Get template with full step details
228
+ template_data = sdk.templates.get_template_with_steps(org_id, template_id)
229
+
230
+ # Update template metadata
231
+ updated = sdk.templates.update_template_metadata(
232
+ org_id, template_id,
233
+ title="New Title",
234
+ summary="Updated summary",
235
+ guidance="New guidance text"
236
+ )
237
+
238
+ # Get template steps
239
+ steps = sdk.templates.get_template_steps(org_id, template_id)
240
+
241
+ # Analyze step dependencies
242
+ dependencies = sdk.templates.get_step_dependencies(org_id, template_id, step_id)
243
+
244
+ # Get deadline suggestions
245
+ deadline_suggestion = sdk.templates.suggest_step_deadline(org_id, template_id, step_id)
246
+
247
+ # Advanced template operations
248
+ duplicated = sdk.templates.duplicate_template(org_id, template_id, "New Template Name", copy_permissions=True)
249
+
250
+ # Automation management
251
+ automation_data = {
252
+ "automated_alias": "Auto-assign reviewer",
253
+ "conditions": [{"field_id": "department", "operator": "equals", "value": "Engineering"}],
254
+ "actions": [{"type": "assign_step", "step_id": "review_step", "assignee_type": "user", "assignee_id": "123"}]
255
+ }
256
+ automation = sdk.templates.create_automation_rule(org_id, template_id, automation_data)
257
+
258
+ # Analyze automation conflicts and redundancies
259
+ analysis = sdk.templates.analyze_template_automations(org_id, template_id)
260
+
261
+ # Get consolidation suggestions
262
+ suggestions = sdk.templates.suggest_automation_consolidation(org_id, template_id)
263
+
264
+ # Assess overall template health
265
+ health_report = sdk.templates.assess_template_health(org_id, template_id)
266
+
267
+ # Add kickoff fields
268
+ kickoff_data = {
269
+ "field_type": "text",
270
+ "label": "Project Name",
271
+ "required": True,
272
+ "validation_rules": {"min_length": 3}
273
+ }
274
+ kickoff_field = sdk.templates.add_kickoff_field(org_id, template_id, kickoff_data)
275
+
276
+ # Add assignees to step
277
+ assignees = {"users": [123, 456], "groups": ["managers"], "guests": ["contractor@company.com"]}
278
+ sdk.templates.add_assignees_to_step(org_id, template_id, step_id, assignees)
279
+
280
+ # Edit step description
281
+ sdk.templates.edit_description_on_step(org_id, template_id, step_id, "Updated step description with detailed instructions")
282
+
283
+ # Add new step to template
284
+ step_data = {
285
+ "title": "Quality Review",
286
+ "description": "Perform final quality check",
287
+ "position": 5,
288
+ "assignees": {"users": [789]}
289
+ }
290
+ new_step = sdk.templates.add_step_to_template(org_id, template_id, step_data)
291
+ ```
292
+
293
+ ### Form Field Management
294
+
295
+ ```python
296
+ # Add form field to step
297
+ field_data = {
298
+ "field_type": "text",
299
+ "label": "Customer Name",
300
+ "required": True,
301
+ "position": 1
302
+ }
303
+ field = sdk.form_fields.add_form_field_to_step(org_id, template_id, step_id, field_data)
304
+
305
+ # Update form field
306
+ updated_field = sdk.form_fields.update_form_field(
307
+ org_id, template_id, step_id, field_id,
308
+ label="Updated Label",
309
+ required=False
310
+ )
311
+
312
+ # Move field between steps
313
+ success = sdk.form_fields.move_form_field(
314
+ org_id, template_id, from_step, field_id, to_step, position=2
315
+ )
316
+
317
+ # Delete form field
318
+ success = sdk.form_fields.delete_form_field(org_id, template_id, step_id, field_id)
319
+
320
+ # Get dropdown options
321
+ options = sdk.form_fields.get_dropdown_options(org_id, template_id, step_id, field_id)
322
+
323
+ # Update dropdown options
324
+ success = sdk.form_fields.update_dropdown_options(
325
+ org_id, template_id, step_id, field_id,
326
+ ["Option 1", "Option 2", "Option 3"]
327
+ )
328
+
329
+ # Get AI-powered field suggestions
330
+ suggestions = sdk.form_fields.suggest_form_fields_for_step(org_id, template_id, step_id)
331
+ ```
332
+
333
+ ## Data Models
334
+
335
+ The SDK provides comprehensive dataclasses for type safety and easy data access:
336
+
337
+ ### Core Models
338
+
339
+ - **`User`** - Organization member with full profile data (country, timezone, job details)
340
+ - **`Guest`** - External user with limited access and guest-specific details
341
+ - **`GuestDetails`** - Extended guest information and statistics
342
+ - **`Task`** - Individual work item with owners, deadlines, and process linkage
343
+ - **`Run`** - Process instance (workflow execution) with progress tracking
344
+ - **`Template`** - Complete template/checklist definition with automation rules
345
+ - **`Step`** - Individual step within a template with conditions and assignments
346
+
347
+ ### Assignment and Ownership Models
348
+
349
+ - **`TaskOwners`** - Task assignment information supporting users, guests, and groups
350
+ - **`RunProgress`** - Process completion tracking with step-level progress
351
+ - **`Country`** - Geographic data for user profiles
352
+ - **`Folder`** - Organizational folder structure for templates and processes
353
+
354
+ ### Template and Automation Models
355
+
356
+ - **`Tag`** - Industry and topic classification tags
357
+ - **`PrerunField`** - Form fields for template kickoff with validation rules
358
+ - **`AutomationCondition`** - Conditional logic for workflow automation
359
+ - **`AutomationAction`** - Actions triggered by automation rules
360
+ - **`AutomatedAction`** - Complete automation rule with conditions and actions
361
+ - **`AutomationDeadline`** - Deadline configuration for automated actions
362
+ - **`AutomationAssignees`** - Assignee configuration for automated actions
363
+
364
+ ### Step and Form Models
365
+
366
+ - **`Capture`** - Form fields within steps with validation and positioning
367
+ - **`StepStartDate`** - Start date configuration for steps
368
+ - **`StepDeadline`** - Deadline configuration for individual steps
369
+ - **`StepBpToLaunch`** - Sub-process launch configuration
370
+
371
+ ### Search and Utility Models
372
+
373
+ - **`SearchResult`** - Unified search results for templates, processes, and tasks
374
+ - **`TallyfyError`** - Custom exception with status codes and response data
375
+
376
+ ### Model Features
377
+
378
+ - **Automatic parsing** from API responses via `from_dict()` class methods
379
+ - **Type safety** with comprehensive type hints
380
+ - **Nested object support** for complex data structures
381
+ - **Default value handling** for optional fields
382
+
383
+ Example model usage:
384
+
385
+ ```python
386
+ # Models automatically parse API responses
387
+ users = sdk.users.get_organization_users(org_id)
388
+ for user in users:
389
+ print(f"{user.full_name} ({user.email})")
390
+ if user.country:
391
+ print(f"Country: {user.country.name}")
392
+
393
+ # Access nested data safely
394
+ template = sdk.templates.get_template(org_id, template_name="Onboarding")
395
+ if template.automated_actions:
396
+ for automation in template.automated_actions:
397
+ print(f"Automation: {automation.automated_alias}")
398
+ for condition in automation.conditions:
399
+ print(f" Condition: {condition.statement}")
400
+ ```
401
+
402
+ ## Error Handling
403
+
404
+ The SDK provides comprehensive error handling through the `TallyfyError` class:
405
+
406
+ ```python
407
+ from tallyfy import TallyfyError
408
+
409
+ try:
410
+ users = sdk.users.get_organization_users("invalid_org_id")
411
+ except TallyfyError as e:
412
+ print(f"API Error: {e}")
413
+ print(f"Status Code: {e.status_code}")
414
+ print(f"Response Data: {e.response_data}")
415
+ except ValueError as e:
416
+ print(f"Validation Error: {e}")
417
+ ```
418
+
419
+ ### Error Types
420
+
421
+ - **`TallyfyError`** - API-specific errors with status codes and response data
422
+ - **`ValueError`** - Input validation errors for required parameters
423
+ - **`RequestException`** - Network and connection errors (automatically retried)
424
+
425
+ ### Retry Logic
426
+
427
+ The SDK automatically retries failed requests with configurable settings:
428
+
429
+ - **Server errors (5xx)** - Automatically retried up to `max_retries` times
430
+ - **Client errors (4xx)** - Not retried (indicates user/input error)
431
+ - **Network errors** - Retried with exponential backoff
432
+ - **Timeout errors** - Retried with configurable delay
433
+
434
+ ## Examples
435
+
436
+ ### Complete User Onboarding Workflow
437
+
438
+ ```python
439
+ from tallyfy import TallyfySDK, TaskOwners
440
+
441
+ sdk = TallyfySDK(api_key="your_api_key")
442
+ org_id = "your_org_id"
443
+
444
+ # 1. Invite new user
445
+ new_user = sdk.users.invite_user_to_organization(
446
+ org_id,
447
+ email="new.hire@company.com",
448
+ first_name="John",
449
+ last_name="Doe",
450
+ role="standard",
451
+ message="Welcome to the team! Please complete your onboarding."
452
+ )
453
+
454
+ # 2. Create onboarding task
455
+ if new_user:
456
+ owners = TaskOwners(users=[new_user.id])
457
+ onboarding_task = sdk.tasks.create_task(
458
+ org_id,
459
+ title="Complete Employee Onboarding",
460
+ deadline="2025-12-31 17:00:00",
461
+ description="Please complete all onboarding steps including HR paperwork and IT setup.",
462
+ owners=owners
463
+ )
464
+ print(f"Created onboarding task: {onboarding_task.id}")
465
+ ```
466
+
467
+ ### Template Analysis and Enhancement
468
+
469
+ ```python
470
+ # Get template with full details
471
+ template_data = sdk.templates.get_template_with_steps(org_id, template_name="Project Kickoff")
472
+
473
+ if template_data:
474
+ template = template_data['template']
475
+ print(f"Template: {template.title}")
476
+ print(f"Steps: {template_data['step_count']}")
477
+ print(f"Automations: {template_data['automation_count']}")
478
+
479
+ # Analyze each step for improvements
480
+ for step_data in template_data['steps']:
481
+ step_id = step_data['id']
482
+
483
+ # Get dependency analysis
484
+ dependencies = sdk.templates.get_step_dependencies(org_id, template.id, step_id)
485
+ if dependencies['has_conditional_visibility']:
486
+ print(f"Step '{step_data['title']}' has conditional logic")
487
+
488
+ # Get deadline suggestions
489
+ deadline_suggestion = sdk.templates.suggest_step_deadline(org_id, template.id, step_id)
490
+ print(f"Suggested deadline: {deadline_suggestion['suggested_deadline']}")
491
+
492
+ # Get form field suggestions
493
+ field_suggestions = sdk.form_fields.suggest_form_fields_for_step(org_id, template.id, step_id)
494
+ for suggestion in field_suggestions[:2]: # Top 2 suggestions
495
+ if suggestion['confidence'] > 0.7:
496
+ print(f"High-confidence field suggestion: {suggestion['field_config']['label']}")
497
+ ```
498
+
499
+ ### Advanced Process Management
500
+
501
+ ```python
502
+ # Get all active processes with comprehensive filtering
503
+ active_runs = sdk.tasks.get_organization_runs(
504
+ org_id,
505
+ status="active",
506
+ with_data="checklist,tasks,assets,tags",
507
+ form_fields_values=True,
508
+ starred=True
509
+ )
510
+
511
+ # Group by template
512
+ template_usage = {}
513
+ for run in active_runs:
514
+ template_id = run.checklist_id
515
+ if template_id not in template_usage:
516
+ template_usage[template_id] = {
517
+ 'template_name': run.checklist_title,
518
+ 'active_count': 0,
519
+ 'runs': []
520
+ }
521
+ template_usage[template_id]['active_count'] += 1
522
+ template_usage[template_id]['runs'].append(run)
523
+
524
+ # Show most used templates
525
+ sorted_templates = sorted(template_usage.items(), key=lambda x: x[1]['active_count'], reverse=True)
526
+ for template_id, data in sorted_templates[:5]:
527
+ print(f"{data['template_name']}: {data['active_count']} active processes")
528
+ ```
529
+
530
+ ## Advanced Usage
531
+
532
+ ### Custom Request Configuration
533
+
534
+ ```python
535
+ # SDK with custom configuration
536
+ sdk = TallyfySDK(
537
+ api_key="your_api_key",
538
+ base_url="https://api.tallyfy.com",
539
+ timeout=60, # 60 second timeout
540
+ max_retries=5, # Retry up to 5 times
541
+ retry_delay=2.0 # 2 second delay between retries
542
+ )
543
+ ```
544
+
545
+ ### Accessing Raw API Responses
546
+
547
+ ```python
548
+ # For advanced users who need raw API data
549
+ template_data = sdk.templates.get_template_with_steps(org_id, template_id)
550
+ raw_api_response = template_data['raw_data']
551
+
552
+ # Access nested API data not exposed in models
553
+ custom_fields = raw_api_response.get('custom_metadata', {})
554
+ ```
555
+
556
+ ### Batch Operations
557
+
558
+ ```python
559
+ # Efficiently process multiple operations
560
+ org_users = sdk.users.get_organization_users(org_id)
561
+ user_tasks = {}
562
+
563
+ for user in org_users[:10]: # Process first 10 users
564
+ try:
565
+ tasks = sdk.tasks.get_user_tasks(org_id, user.id)
566
+ user_tasks[user.id] = tasks
567
+ print(f"{user.full_name}: {len(tasks)} tasks")
568
+ except TallyfyError as e:
569
+ print(f"Failed to get tasks for {user.full_name}: {e}")
570
+ ```
571
+
572
+ ### Form Field Automation
573
+
574
+ ```python
575
+ # Automatically enhance templates with smart form fields
576
+ def enhance_template_with_smart_fields(org_id, template_id):
577
+ steps = sdk.templates.get_template_steps(org_id, template_id)
578
+
579
+ for step in steps:
580
+ # Get AI suggestions for each step
581
+ suggestions = sdk.form_fields.suggest_form_fields_for_step(org_id, template_id, step.id)
582
+
583
+ # Implement high-confidence suggestions
584
+ for suggestion in suggestions:
585
+ if suggestion['confidence'] > 0.8 and suggestion['priority'] == 'high':
586
+ field_data = suggestion['field_config']
587
+ try:
588
+ new_field = sdk.form_fields.add_form_field_to_step(
589
+ org_id, template_id, step.id, field_data
590
+ )
591
+ print(f"Added field '{field_data['label']}' to step '{step.title}'")
592
+ except TallyfyError as e:
593
+ print(f"Failed to add field: {e}")
594
+
595
+ # Use the enhancement function
596
+ enhance_template_with_smart_fields(org_id, "your_template_id")
597
+ ```
598
+
599
+ ## Contributing
600
+
601
+ ### Development Setup
602
+
603
+ 1. Clone the repository
604
+ 2. Install dependencies: `pip install -r requirements.txt`
605
+ 3. Set up environment variables in `.env`
606
+ 4. Run tests: `python -m pytest tests/`
607
+
608
+ ### Code Style
609
+
610
+ - Follow PEP 8 style guidelines
611
+ - Use type hints for all functions and methods
612
+ - Add comprehensive docstrings for public APIs
613
+ - Include error handling for all external API calls
614
+
615
+ ### Adding New Features
616
+
617
+ 1. Add methods to appropriate management class
618
+ 2. Create or update data models in `models.py`
619
+ 3. Add comprehensive docstrings and type hints
620
+ 4. Include error handling and logging
621
+ 5. Update this README with usage examples
622
+
623
+ ## License
624
+
625
+ This SDK is part of the Tallyfy MCP project. See the main project repository for license information.
626
+
627
+ ## Support
628
+
629
+ For bugs, feature requests, or questions:
630
+
631
+ 1. Check existing issues in the project repository
632
+ 2. Contact us at: support@tallyfy.com
633
+ ---
634
+
635
+ **Version:** 1.0.0
636
+ **Last Updated:** 2025
tallyfy/__init__.py ADDED
@@ -0,0 +1,20 @@
1
+ """
2
+ Tallyfy SDK - A modular Python SDK for Tallyfy API
3
+ """
4
+
5
+ from .core import TallyfySDK, TallyfyError
6
+ from .models import *
7
+ from .user_management import UserManagement
8
+ from .task_management import TaskManagement
9
+ from .template_management import TemplateManagement
10
+ from .form_fields_management import FormFieldManagement
11
+
12
+ __version__ = "1.0.0"
13
+ __all__ = [
14
+ "TallyfySDK",
15
+ "TallyfyError",
16
+ "UserManagement",
17
+ "TaskManagement",
18
+ "TemplateManagement",
19
+ "FormFieldManagement"
20
+ ]