dhisana 0.0.1.dev243__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 (102) hide show
  1. dhisana/__init__.py +1 -0
  2. dhisana/cli/__init__.py +1 -0
  3. dhisana/cli/cli.py +20 -0
  4. dhisana/cli/datasets.py +27 -0
  5. dhisana/cli/models.py +26 -0
  6. dhisana/cli/predictions.py +20 -0
  7. dhisana/schemas/__init__.py +1 -0
  8. dhisana/schemas/common.py +399 -0
  9. dhisana/schemas/sales.py +965 -0
  10. dhisana/ui/__init__.py +1 -0
  11. dhisana/ui/components.py +472 -0
  12. dhisana/utils/__init__.py +1 -0
  13. dhisana/utils/add_mapping.py +352 -0
  14. dhisana/utils/agent_tools.py +51 -0
  15. dhisana/utils/apollo_tools.py +1597 -0
  16. dhisana/utils/assistant_tool_tag.py +4 -0
  17. dhisana/utils/built_with_api_tools.py +282 -0
  18. dhisana/utils/cache_output_tools.py +98 -0
  19. dhisana/utils/cache_output_tools_local.py +78 -0
  20. dhisana/utils/check_email_validity_tools.py +717 -0
  21. dhisana/utils/check_for_intent_signal.py +107 -0
  22. dhisana/utils/check_linkedin_url_validity.py +209 -0
  23. dhisana/utils/clay_tools.py +43 -0
  24. dhisana/utils/clean_properties.py +135 -0
  25. dhisana/utils/company_utils.py +60 -0
  26. dhisana/utils/compose_salesnav_query.py +259 -0
  27. dhisana/utils/compose_search_query.py +759 -0
  28. dhisana/utils/compose_three_step_workflow.py +234 -0
  29. dhisana/utils/composite_tools.py +137 -0
  30. dhisana/utils/dataframe_tools.py +237 -0
  31. dhisana/utils/domain_parser.py +45 -0
  32. dhisana/utils/email_body_utils.py +72 -0
  33. dhisana/utils/email_parse_helpers.py +132 -0
  34. dhisana/utils/email_provider.py +375 -0
  35. dhisana/utils/enrich_lead_information.py +933 -0
  36. dhisana/utils/extract_email_content_for_llm.py +101 -0
  37. dhisana/utils/fetch_openai_config.py +129 -0
  38. dhisana/utils/field_validators.py +426 -0
  39. dhisana/utils/g2_tools.py +104 -0
  40. dhisana/utils/generate_content.py +41 -0
  41. dhisana/utils/generate_custom_message.py +271 -0
  42. dhisana/utils/generate_email.py +278 -0
  43. dhisana/utils/generate_email_response.py +465 -0
  44. dhisana/utils/generate_flow.py +102 -0
  45. dhisana/utils/generate_leads_salesnav.py +303 -0
  46. dhisana/utils/generate_linkedin_connect_message.py +224 -0
  47. dhisana/utils/generate_linkedin_response_message.py +317 -0
  48. dhisana/utils/generate_structured_output_internal.py +462 -0
  49. dhisana/utils/google_custom_search.py +267 -0
  50. dhisana/utils/google_oauth_tools.py +727 -0
  51. dhisana/utils/google_workspace_tools.py +1294 -0
  52. dhisana/utils/hubspot_clearbit.py +96 -0
  53. dhisana/utils/hubspot_crm_tools.py +2440 -0
  54. dhisana/utils/instantly_tools.py +149 -0
  55. dhisana/utils/linkedin_crawler.py +168 -0
  56. dhisana/utils/lusha_tools.py +333 -0
  57. dhisana/utils/mailgun_tools.py +156 -0
  58. dhisana/utils/mailreach_tools.py +123 -0
  59. dhisana/utils/microsoft365_tools.py +455 -0
  60. dhisana/utils/openai_assistant_and_file_utils.py +267 -0
  61. dhisana/utils/openai_helpers.py +977 -0
  62. dhisana/utils/openapi_spec_to_tools.py +45 -0
  63. dhisana/utils/openapi_tool/__init__.py +1 -0
  64. dhisana/utils/openapi_tool/api_models.py +633 -0
  65. dhisana/utils/openapi_tool/convert_openai_spec_to_tool.py +271 -0
  66. dhisana/utils/openapi_tool/openapi_tool.py +319 -0
  67. dhisana/utils/parse_linkedin_messages_txt.py +100 -0
  68. dhisana/utils/profile.py +37 -0
  69. dhisana/utils/proxy_curl_tools.py +1226 -0
  70. dhisana/utils/proxycurl_search_leads.py +426 -0
  71. dhisana/utils/python_function_to_tools.py +83 -0
  72. dhisana/utils/research_lead.py +176 -0
  73. dhisana/utils/sales_navigator_crawler.py +1103 -0
  74. dhisana/utils/salesforce_crm_tools.py +477 -0
  75. dhisana/utils/search_router.py +131 -0
  76. dhisana/utils/search_router_jobs.py +51 -0
  77. dhisana/utils/sendgrid_tools.py +162 -0
  78. dhisana/utils/serarch_router_local_business.py +75 -0
  79. dhisana/utils/serpapi_additional_tools.py +290 -0
  80. dhisana/utils/serpapi_google_jobs.py +117 -0
  81. dhisana/utils/serpapi_google_search.py +188 -0
  82. dhisana/utils/serpapi_local_business_search.py +129 -0
  83. dhisana/utils/serpapi_search_tools.py +852 -0
  84. dhisana/utils/serperdev_google_jobs.py +125 -0
  85. dhisana/utils/serperdev_local_business.py +154 -0
  86. dhisana/utils/serperdev_search.py +233 -0
  87. dhisana/utils/smtp_email_tools.py +582 -0
  88. dhisana/utils/test_connect.py +2087 -0
  89. dhisana/utils/trasform_json.py +173 -0
  90. dhisana/utils/web_download_parse_tools.py +189 -0
  91. dhisana/utils/workflow_code_model.py +5 -0
  92. dhisana/utils/zoominfo_tools.py +357 -0
  93. dhisana/workflow/__init__.py +1 -0
  94. dhisana/workflow/agent.py +18 -0
  95. dhisana/workflow/flow.py +44 -0
  96. dhisana/workflow/task.py +43 -0
  97. dhisana/workflow/test.py +90 -0
  98. dhisana-0.0.1.dev243.dist-info/METADATA +43 -0
  99. dhisana-0.0.1.dev243.dist-info/RECORD +102 -0
  100. dhisana-0.0.1.dev243.dist-info/WHEEL +5 -0
  101. dhisana-0.0.1.dev243.dist-info/entry_points.txt +2 -0
  102. dhisana-0.0.1.dev243.dist-info/top_level.txt +1 -0
dhisana/__init__.py ADDED
@@ -0,0 +1 @@
1
+ __path__ = __import__('pkgutil').extend_path(__path__, __name__)
@@ -0,0 +1 @@
1
+ __path__ = __import__('pkgutil').extend_path(__path__, __name__)
dhisana/cli/cli.py ADDED
@@ -0,0 +1,20 @@
1
+ import click
2
+ from .models import model_cli
3
+ from .datasets import dataset_cli
4
+ from .predictions import prediction_cli
5
+
6
+ @click.group()
7
+ def cli():
8
+ """Dhisana AI SDK CLI."""
9
+ pass
10
+
11
+ # Add command groups from the respective CLI files
12
+ cli.add_command(model_cli)
13
+ cli.add_command(dataset_cli)
14
+ cli.add_command(prediction_cli)
15
+
16
+ def main():
17
+ cli()
18
+
19
+ if __name__ == '__main__':
20
+ main()
@@ -0,0 +1,27 @@
1
+ import click
2
+
3
+ @click.group()
4
+ def dataset_cli():
5
+ """Commands for managing datasets."""
6
+ pass
7
+
8
+ @dataset_cli.command()
9
+ def list():
10
+ """List all datasets."""
11
+ # Example placeholder logic for listing datasets
12
+ click.echo("Datasets: dataset1, dataset2, dataset3")
13
+
14
+ @dataset_cli.command()
15
+ @click.argument('dataset_name')
16
+ @click.option('--file-path', required=True, help='Path to the dataset file')
17
+ def add(dataset_name, file_path):
18
+ """Add a new dataset."""
19
+ # Example placeholder logic for adding a dataset
20
+ click.echo(f"Dataset '{dataset_name}' has been added from '{file_path}'.")
21
+
22
+ @dataset_cli.command()
23
+ @click.argument('dataset_name')
24
+ def delete(dataset_name):
25
+ """Delete an existing dataset."""
26
+ # Example placeholder logic for deleting a dataset
27
+ click.echo(f"Dataset '{dataset_name}' has been deleted.")
dhisana/cli/models.py ADDED
@@ -0,0 +1,26 @@
1
+ import click
2
+
3
+ @click.group()
4
+ def model_cli():
5
+ """Commands for managing models."""
6
+ pass
7
+
8
+ @model_cli.command()
9
+ def list():
10
+ """List all available models."""
11
+ # Example placeholder logic for listing models
12
+ click.echo("Available models: model1, model2, model3")
13
+
14
+ @model_cli.command()
15
+ @click.argument('model_name')
16
+ def add(model_name):
17
+ """Add a new model."""
18
+ # Example placeholder logic for adding a model
19
+ click.echo(f"Model '{model_name}' has been added.")
20
+
21
+ @model_cli.command()
22
+ @click.argument('model_name')
23
+ def delete(model_name):
24
+ """Delete an existing model."""
25
+ # Example placeholder logic for deleting a model
26
+ click.echo(f"Model '{model_name}' has been deleted.")
@@ -0,0 +1,20 @@
1
+ import click
2
+
3
+ @click.group()
4
+ def prediction_cli():
5
+ """Commands for running predictions."""
6
+ pass
7
+
8
+ @prediction_cli.command()
9
+ @click.argument('model_name')
10
+ @click.argument('dataset_name')
11
+ def run(model_name, dataset_name):
12
+ """Run predictions using the specified model on the given dataset."""
13
+ # Example placeholder logic for running predictions
14
+ click.echo(f"Running predictions on '{dataset_name}' using model '{model_name}'.")
15
+
16
+ @prediction_cli.command()
17
+ def list():
18
+ """List all previous predictions."""
19
+ # Example placeholder logic for listing previous predictions
20
+ click.echo("Predictions: prediction1, prediction2")
@@ -0,0 +1 @@
1
+ __path__ = __import__('pkgutil').extend_path(__path__, __name__)
@@ -0,0 +1,399 @@
1
+ from uuid import UUID
2
+ from pydantic import BaseModel, Field, HttpUrl
3
+ from typing import List, Optional, Dict, Any
4
+ from enum import Enum
5
+
6
+ ##
7
+ # PERMISSION & ROLE
8
+ ##
9
+
10
+ class PermissionBase(BaseModel):
11
+ name: str
12
+ label: Optional[str] = None
13
+ description: Optional[str] = None
14
+
15
+ class PermissionCreate(PermissionBase):
16
+ pass
17
+
18
+ class Permission(PermissionBase):
19
+ id: int
20
+
21
+ class Config:
22
+ from_attributes = True
23
+
24
+ class RoleBase(BaseModel):
25
+ name: str
26
+ label: Optional[str] = None
27
+ description: Optional[str] = None
28
+
29
+ class RoleCreate(RoleBase):
30
+ permission_ids: List[int] = []
31
+
32
+ class Role(RoleBase):
33
+ id: int
34
+ permissions: List[Permission] = []
35
+
36
+ class Config:
37
+ from_attributes = True
38
+
39
+
40
+ ##
41
+ # ORGANIZATION
42
+ ##
43
+
44
+ class OrganizationBase(BaseModel):
45
+ name: str
46
+ description: Optional[str] = None
47
+
48
+ class OrganizationCreate(OrganizationBase):
49
+ pass
50
+
51
+ class Organization(OrganizationBase):
52
+ id: UUID
53
+ # changed from datetime -> milliseconds since epoch
54
+ created_at: Optional[int] = None
55
+
56
+ class Config:
57
+ from_attributes = True
58
+
59
+
60
+ ##
61
+ # USER
62
+ ##
63
+
64
+ class User(BaseModel):
65
+ id: Optional[UUID] = None
66
+ auth0_user_id: Optional[str] = None
67
+ username: Optional[str] = None
68
+ email: Optional[str] = None
69
+ organization_id: Optional[UUID] = None
70
+ created_at: Optional[int] = None
71
+ roles: Optional[List[Role]] = []
72
+
73
+ class Config:
74
+ from_attributes = True
75
+
76
+ ##
77
+ # AGENT + STATUSES
78
+ ##
79
+
80
+ class AgentStatus(str, Enum):
81
+ PENDING = "PENDING"
82
+ APPROVED = "APPROVED"
83
+ REJECTED = "REJECTED"
84
+ PUBLISHED = "PUBLISHED"
85
+
86
+ class AgentStatusUpdate(BaseModel):
87
+ status: AgentStatus
88
+
89
+ class AgentInstanceStatus(str, Enum):
90
+ ACTIVE = "ACTIVE"
91
+ INACTIVE = "INACTIVE"
92
+ ERROR = "ERROR"
93
+
94
+
95
+ ##
96
+ # UI / CONFIG FIELDS
97
+ ##
98
+
99
+ class SelectOption(BaseModel):
100
+ label: str
101
+ value: Any
102
+
103
+ class ValidationRules(BaseModel):
104
+ required: Optional[bool] = None
105
+ min: Optional[int] = None
106
+ max: Optional[int] = None
107
+ pattern: Optional[str] = None
108
+
109
+ class ConfigField(BaseModel):
110
+ name: str
111
+ label: str
112
+ type: str
113
+ sensitive: Optional[bool] = False
114
+ default: Optional[Any] = Field(None, alias="default")
115
+ description: Optional[str] = None
116
+ validations: Optional[ValidationRules] = None
117
+ options: Optional[List[SelectOption]] = None
118
+ fields: Optional[List["ConfigField"]] = None # for nested structures
119
+
120
+ class Config:
121
+ populate_by_name = True
122
+
123
+ ConfigField.model_rebuild()
124
+
125
+ class ConfigGroup(BaseModel):
126
+ groupName: str
127
+ fields: List[ConfigField]
128
+
129
+ class BackendDefinition(BaseModel):
130
+ docker_image: Optional[str] = None
131
+ environment_variables: Optional[Dict[str, str]] = None
132
+ container_id: Optional[str] = None
133
+
134
+ class LayoutType(str, Enum):
135
+ SINGLE_COLUMN = "single-column"
136
+ TWO_COLUMN = "two-column"
137
+ DASHBOARD = "dashboard"
138
+ CHAT_INTERFACE = "chat-interface"
139
+ SMART_LIST_BUILDER = "smart-list-builder"
140
+
141
+ class ComponentType(str, Enum):
142
+ CHAT_WINDOW = "chat-window"
143
+ HEADER = "header"
144
+ FOOTER = "footer"
145
+ SIDEBAR = "sidebar"
146
+ MAIN_CONTENT = "main-content"
147
+ DATA_TABLE = "data-table"
148
+ CHART = "chart"
149
+ FORM = "form"
150
+ BUTTON = "button"
151
+ TEXT = "text"
152
+ IMAGE = "image"
153
+ VIDEO = "video"
154
+ CUSTOM_COMPONENT = "custom-component"
155
+ TABS = "tabs"
156
+ TAB = "tab"
157
+ FORM_ITEM = "form-item"
158
+ INPUT = "input"
159
+ TEXTAREA = "textarea"
160
+ UPLOAD = "upload"
161
+
162
+ class ComponentPosition(BaseModel):
163
+ row: Optional[int] = None
164
+ column: Optional[int] = None
165
+ area: Optional[str] = None
166
+
167
+ class RenderComponent(BaseModel):
168
+ type: ComponentType
169
+ position: Optional[ComponentPosition] = None
170
+ properties: Optional[Dict[str, Any]] = None
171
+ children: Optional[List["RenderComponent"]] = None
172
+ injector: Optional[Any] = None
173
+
174
+ class ActionDefinition(BaseModel):
175
+ type: str
176
+ method: str
177
+ url: str
178
+ data: Optional[Any] = None
179
+ state: Optional[str] = None
180
+ onSuccess: Optional[str] = None
181
+
182
+ class RenderDefinition(BaseModel):
183
+ layout: LayoutType
184
+ components: List[RenderComponent]
185
+ actions: Optional[Dict[str, ActionDefinition]] = None
186
+ initialActions: Optional[List[str]] = None
187
+
188
+ class ConfigValue(BaseModel):
189
+ name: str
190
+ value: Any
191
+ fields: Optional[List["ConfigValue"]] = None
192
+
193
+ class Config:
194
+ populate_by_name = True
195
+
196
+ ConfigValue.model_rebuild()
197
+
198
+ class SchemaDefinition(BaseModel):
199
+ name: str
200
+ version: str
201
+ fields: List[ConfigField]
202
+ migrations: Optional[List[Dict[str, Any]]] = None
203
+
204
+ ##
205
+ # AGENT
206
+ ##
207
+
208
+ class Agent(BaseModel):
209
+ id: Optional[UUID] = None
210
+ name: str
211
+ description: str
212
+ image_url: str
213
+ expertise: List[str]
214
+ version: str
215
+ schema_definition: Optional[List[SchemaDefinition]] = None
216
+ config_definition: List[ConfigGroup]
217
+ agent_config_definition: Optional[List[ConfigGroup]] = None
218
+ agent_configuration: Optional[List[ConfigValue]] = None
219
+ render_definition: RenderDefinition
220
+ backend: BackendDefinition
221
+ repository_url: Optional[str] = None
222
+ status: Optional[AgentStatus] = AgentStatus.PENDING
223
+
224
+ organization_id: Optional[UUID] = None
225
+ created_by: Optional[UUID] = None
226
+ created_at: Optional[int] = None
227
+ updated_by: Optional[UUID] = None
228
+ updated_at: Optional[int] = None
229
+
230
+ class Config:
231
+ from_attributes = True
232
+ populate_by_name = True
233
+
234
+ ##
235
+ # AGENT INSTANCE
236
+ ##
237
+
238
+ class AgentInstance(BaseModel):
239
+ id: Optional[UUID] = None
240
+ published_agent_id: UUID
241
+ name: str
242
+ description: str
243
+ image_url: str
244
+ expertise: Optional[List[str]] = None
245
+ version: str
246
+ schema_definition: Optional[List[SchemaDefinition]] = None
247
+ configuration: List[ConfigValue]
248
+ render_definition: RenderDefinition = None
249
+ backend: BackendDefinition = None
250
+ status: AgentInstanceStatus = AgentInstanceStatus.INACTIVE
251
+ status_message: Optional[str] = None
252
+ service_url: Optional[str] = None
253
+ port: Optional[int] = None
254
+
255
+ organization_id: Optional[UUID] = None
256
+ created_by: Optional[UUID] = None
257
+ created_at: Optional[int] = None
258
+ updated_by: Optional[UUID] = None
259
+ updated_at: Optional[int] = None
260
+
261
+ class Config:
262
+ from_attributes = True
263
+ populate_by_name = True
264
+
265
+
266
+ ##
267
+ # AGENT INSTANCE DATA
268
+ ##
269
+
270
+ class AgentInstanceData(BaseModel):
271
+ id: Optional[UUID] = None
272
+ type: str
273
+ version: str
274
+ agent_instance_id: UUID
275
+ organization_id: UUID
276
+ data: Dict[str, Any]
277
+ created_by: Optional[UUID] = None
278
+ created_at: Optional[int] = None
279
+ updated_by: Optional[UUID] = None
280
+ updated_at: Optional[int] = None
281
+
282
+ class Config:
283
+ populate_by_name = True
284
+
285
+
286
+ ##
287
+ # SOURCE
288
+ ##
289
+
290
+ class SourceType(str, Enum):
291
+ FILE = "file"
292
+ GOOGLE_DOC = "google_doc"
293
+ WEBSITE = "website"
294
+ YOUTUBE = "youtube"
295
+ TEXT = "text"
296
+
297
+ class SourceBase(BaseModel):
298
+ source_type: SourceType
299
+ title: Optional[str] = None
300
+ source_metadata: Optional[dict] = None
301
+ blob_url: Optional[HttpUrl] = None
302
+ content: Optional[str] = None
303
+
304
+ class SourceCreate(SourceBase):
305
+ pass
306
+
307
+ class SourceUpdate(SourceBase):
308
+ pass
309
+
310
+ class Source(SourceBase):
311
+ id: UUID
312
+ agent_instance_id: UUID
313
+ # changed from datetime -> milliseconds
314
+ created_at: Optional[int] = None
315
+ created_by: Optional[UUID] = None
316
+
317
+ class Config:
318
+ populate_by_name = True
319
+
320
+ ##
321
+ # INTEGRATION
322
+ ##
323
+
324
+ class IntegrationStatus(str, Enum):
325
+ CONNECTED = "connected"
326
+ DISCONNECTED = "disconnected"
327
+ COMING_SOON = "coming soon"
328
+
329
+ class IntegrationBase(BaseModel):
330
+ name: str
331
+ label: str
332
+ icon: Optional[str] = None
333
+ description: Optional[str] = None
334
+ category: Optional[str] = None
335
+ tags: Optional[List[str]] = None
336
+ status: IntegrationStatus = IntegrationStatus.DISCONNECTED
337
+ configuration: Optional[List["ConfigValue"]] = None
338
+
339
+ class IntegrationCreate(IntegrationBase):
340
+ agent_instance_id: UUID
341
+ organization_id: UUID
342
+
343
+ class IntegrationUpdate(BaseModel):
344
+ name: Optional[str] = None
345
+ label: Optional[str] = None
346
+ icon: Optional[str] = None
347
+ description: Optional[str] = None
348
+ category: Optional[str] = None
349
+ tags: Optional[List[str]] = None
350
+ status: Optional[IntegrationStatus] = None
351
+ configuration: Optional[List["ConfigValue"]] = None
352
+
353
+ class Integration(IntegrationBase):
354
+ id: UUID
355
+ agent_instance_id: UUID
356
+ organization_id: UUID
357
+ created_at: Optional[int] = None
358
+ created_by: Optional[UUID] = None
359
+
360
+ class Config:
361
+ from_attributes = True
362
+ populate_by_name = True
363
+
364
+ Integration.model_rebuild()
365
+ IntegrationUpdate.model_rebuild()
366
+
367
+ class BodyFormat(str, Enum):
368
+ AUTO = "auto"
369
+ HTML = "html"
370
+ TEXT = "text"
371
+
372
+
373
+ class SendEmailContext(BaseModel):
374
+ recipient: str
375
+ subject: str
376
+ body: str
377
+ sender_name: str
378
+ sender_email: str
379
+ labels: Optional[List[str]]
380
+ body_format: BodyFormat = BodyFormat.AUTO
381
+ headers: Optional[Dict[str, str]] = None
382
+
383
+ class QueryEmailContext(BaseModel):
384
+ start_time: str
385
+ end_time: str
386
+ sender_email: str
387
+ unread_only: bool = True
388
+ labels: Optional[List[str]] = None
389
+
390
+
391
+ class ReplyEmailContext(BaseModel):
392
+ message_id: str
393
+ reply_body: str
394
+ sender_email: str
395
+ sender_name: str
396
+ fallback_recipient: Optional[str] = None
397
+ mark_as_read: str = "True"
398
+ add_labels: Optional[List[str]] = None
399
+ reply_body_format: BodyFormat = BodyFormat.AUTO