digitalkin 0.2.11__tar.gz → 0.2.13__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.
- {digitalkin-0.2.11 → digitalkin-0.2.13}/PKG-INFO +43 -12
- {digitalkin-0.2.11 → digitalkin-0.2.13}/README.md +24 -0
- digitalkin-0.2.13/examples/modules/cpu_intensive_module.py +271 -0
- digitalkin-0.2.13/examples/modules/minimal_llm_module.py +309 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/examples/modules/storage_module.py +5 -6
- {digitalkin-0.2.11 → digitalkin-0.2.13}/examples/modules/text_transform_module.py +1 -1
- {digitalkin-0.2.11 → digitalkin-0.2.13}/pyproject.toml +23 -11
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/__version__.py +1 -1
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/grpc_servers/_base_server.py +15 -17
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/grpc_servers/module_server.py +9 -10
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/grpc_servers/module_servicer.py +108 -85
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/grpc_servers/registry_server.py +3 -6
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/grpc_servers/registry_servicer.py +18 -19
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/grpc_servers/utils/grpc_client_wrapper.py +3 -5
- digitalkin-0.2.13/src/digitalkin/logger.py +61 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/models/module/module.py +1 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/modules/_base_module.py +47 -6
- digitalkin-0.2.13/src/digitalkin/modules/job_manager/base_job_manager.py +139 -0
- digitalkin-0.2.13/src/digitalkin/modules/job_manager/job_manager_models.py +44 -0
- digitalkin-0.2.13/src/digitalkin/modules/job_manager/single_job_manager.py +218 -0
- digitalkin-0.2.13/src/digitalkin/modules/job_manager/taskiq_broker.py +173 -0
- digitalkin-0.2.13/src/digitalkin/modules/job_manager/taskiq_job_manager.py +213 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/services/base_strategy.py +3 -1
- digitalkin-0.2.13/src/digitalkin/services/cost/cost_strategy.py +93 -0
- digitalkin-0.2.13/src/digitalkin/services/cost/default_cost.py +113 -0
- digitalkin-0.2.13/src/digitalkin/services/cost/grpc_cost.py +170 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/services/filesystem/default_filesystem.py +5 -6
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/services/filesystem/filesystem_strategy.py +3 -2
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/services/filesystem/grpc_filesystem.py +31 -26
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/services/services_config.py +6 -5
- digitalkin-0.2.13/src/digitalkin/services/setup/__init__.py +1 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/services/setup/default_setup.py +10 -12
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/services/setup/grpc_setup.py +8 -10
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/services/storage/default_storage.py +13 -6
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/services/storage/grpc_storage.py +25 -9
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/services/storage/storage_strategy.py +3 -2
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/utils/arg_parser.py +5 -48
- digitalkin-0.2.13/src/digitalkin/utils/development_mode_action.py +51 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin.egg-info/PKG-INFO +43 -12
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin.egg-info/SOURCES.txt +8 -1
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin.egg-info/requires.txt +20 -11
- digitalkin-0.2.11/examples/modules/minimal_llm_module.py +0 -165
- digitalkin-0.2.11/src/digitalkin/logger.py +0 -17
- digitalkin-0.2.11/src/digitalkin/modules/job_manager.py +0 -176
- digitalkin-0.2.11/src/digitalkin/services/cost/cost_strategy.py +0 -45
- digitalkin-0.2.11/src/digitalkin/services/cost/default_cost.py +0 -30
- digitalkin-0.2.11/src/digitalkin/services/cost/grpc_cost.py +0 -81
- {digitalkin-0.2.11 → digitalkin-0.2.13}/LICENSE +0 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/examples/base_server/__init__.py +0 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/examples/base_server/mock/__init__.py +0 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/examples/base_server/mock/mock_pb2.py +0 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/examples/base_server/mock/mock_pb2_grpc.py +0 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/examples/base_server/server_async_insecure.py +0 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/examples/base_server/server_async_secure.py +0 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/examples/base_server/server_sync_insecure.py +0 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/examples/base_server/server_sync_secure.py +0 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/examples/modules/__init__.py +0 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/setup.cfg +0 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/__init__.py +0 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/grpc_servers/__init__.py +0 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/grpc_servers/utils/exceptions.py +0 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/grpc_servers/utils/factory.py +0 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/grpc_servers/utils/models.py +0 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/grpc_servers/utils/types.py +0 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/models/__init__.py +0 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/models/module/__init__.py +0 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/models/module/module_types.py +0 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/models/services/__init__.py +0 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/models/services/cost.py +0 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/models/services/storage.py +0 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/modules/__init__.py +0 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/modules/archetype_module.py +0 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/modules/tool_module.py +0 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/modules/trigger_module.py +0 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/py.typed +0 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/services/__init__.py +0 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/services/agent/__init__.py +0 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/services/agent/agent_strategy.py +0 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/services/agent/default_agent.py +0 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/services/cost/__init__.py +0 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/services/filesystem/__init__.py +0 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/services/identity/__init__.py +0 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/services/identity/default_identity.py +0 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/services/identity/identity_strategy.py +0 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/services/registry/__init__.py +0 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/services/registry/default_registry.py +0 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/services/registry/registry_strategy.py +0 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/services/services_models.py +0 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/services/setup/setup_strategy.py +0 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/services/snapshot/__init__.py +0 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/services/snapshot/default_snapshot.py +0 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/services/snapshot/snapshot_strategy.py +0 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/services/storage/__init__.py +0 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/utils/__init__.py +0 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin/utils/llm_ready_schema.py +0 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin.egg-info/dependency_links.txt +0 -0
- {digitalkin-0.2.11 → digitalkin-0.2.13}/src/digitalkin.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: digitalkin
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.13
|
|
4
4
|
Summary: SDK to build kin used in DigitalKin
|
|
5
5
|
Author-email: "DigitalKin.ai" <contact@digitalkin.ai>
|
|
6
6
|
License: Attribution-NonCommercial-ShareAlike 4.0 International
|
|
@@ -452,29 +452,36 @@ Classifier: License :: Other/Proprietary License
|
|
|
452
452
|
Requires-Python: >=3.10
|
|
453
453
|
Description-Content-Type: text/markdown
|
|
454
454
|
License-File: LICENSE
|
|
455
|
-
Requires-Dist: digitalkin-proto>=0.1.
|
|
455
|
+
Requires-Dist: digitalkin-proto>=0.1.10
|
|
456
456
|
Requires-Dist: grpcio-health-checking>=1.71.0
|
|
457
457
|
Requires-Dist: grpcio-reflection>=1.71.0
|
|
458
458
|
Requires-Dist: grpcio-status>=1.71.0
|
|
459
|
-
Requires-Dist: openai>=1.76.2
|
|
460
459
|
Requires-Dist: pydantic>=2.11.4
|
|
461
460
|
Provides-Extra: dev
|
|
462
|
-
Requires-Dist:
|
|
463
|
-
Requires-Dist:
|
|
464
|
-
Requires-Dist: pytest-cov>=6.1.0; extra == "dev"
|
|
465
|
-
Requires-Dist: typos>=1.31.2; extra == "dev"
|
|
466
|
-
Requires-Dist: ruff>=0.11.7; extra == "dev"
|
|
461
|
+
Requires-Dist: typos>=1.32.0; extra == "dev"
|
|
462
|
+
Requires-Dist: ruff>=0.11.9; extra == "dev"
|
|
467
463
|
Requires-Dist: mypy>=1.15.0; extra == "dev"
|
|
468
464
|
Requires-Dist: pyright>=1.1.400; extra == "dev"
|
|
469
465
|
Requires-Dist: pre-commit>=4.2.0; extra == "dev"
|
|
470
466
|
Requires-Dist: bump2version>=1.0.1; extra == "dev"
|
|
471
467
|
Requires-Dist: build>=1.2.2; extra == "dev"
|
|
472
468
|
Requires-Dist: twine>=6.1.0; extra == "dev"
|
|
473
|
-
Requires-Dist: cryptography>=44.0.
|
|
474
|
-
Requires-Dist:
|
|
475
|
-
Requires-Dist: freezegun>=1.5.1; extra == "dev"
|
|
469
|
+
Requires-Dist: cryptography>=44.0.3; extra == "dev"
|
|
470
|
+
Requires-Dist: taskiq[reload]>=0.11.17; extra == "dev"
|
|
476
471
|
Provides-Extra: examples
|
|
477
|
-
Requires-Dist: openai>=1.
|
|
472
|
+
Requires-Dist: openai>=1.75.0; extra == "examples"
|
|
473
|
+
Provides-Extra: tests
|
|
474
|
+
Requires-Dist: freezegun>=1.5.1; extra == "tests"
|
|
475
|
+
Requires-Dist: hdrhistogram>=0.10.3; extra == "tests"
|
|
476
|
+
Requires-Dist: grpcio-testing>=1.71.0; extra == "tests"
|
|
477
|
+
Requires-Dist: psutil>=7.0.0; extra == "tests"
|
|
478
|
+
Requires-Dist: pytest>=8.3.4; extra == "tests"
|
|
479
|
+
Requires-Dist: pytest-asyncio>=0.26.0; extra == "tests"
|
|
480
|
+
Requires-Dist: pytest-cov>=6.1.0; extra == "tests"
|
|
481
|
+
Provides-Extra: taskiq
|
|
482
|
+
Requires-Dist: rstream>=0.20.9; extra == "taskiq"
|
|
483
|
+
Requires-Dist: taskiq-aio-pika>=0.4.2; extra == "taskiq"
|
|
484
|
+
Requires-Dist: taskiq-redis>=1.0.8; extra == "taskiq"
|
|
478
485
|
Dynamic: license-file
|
|
479
486
|
|
|
480
487
|
# DigitalKin Python SDK
|
|
@@ -509,6 +516,16 @@ To install the DigitalKin SDK, simply run:
|
|
|
509
516
|
pip install digitalkin
|
|
510
517
|
```
|
|
511
518
|
|
|
519
|
+
**Optional Taskiq Integration**: Asynchronous task execution powered by Taskiq, backed by RabbitMQ and Redis
|
|
520
|
+
To enable the Rabbitmq streaming capabilities, run:
|
|
521
|
+
|
|
522
|
+
```sh
|
|
523
|
+
sudo rabbitmq-plugins enable rabbitmq_stream
|
|
524
|
+
|
|
525
|
+
# Core + Taskiq integration (RabbitMQ broker)
|
|
526
|
+
pip install digitalkin[taskiq]
|
|
527
|
+
```
|
|
528
|
+
|
|
512
529
|
## 🛠️ Usage
|
|
513
530
|
|
|
514
531
|
### Basic Import
|
|
@@ -519,6 +536,20 @@ Start by importing the necessary modules:
|
|
|
519
536
|
import digitalkin
|
|
520
537
|
```
|
|
521
538
|
|
|
539
|
+
## Features
|
|
540
|
+
|
|
541
|
+
### Taskiq with RabbitMQ
|
|
542
|
+
|
|
543
|
+
TaskIQ intergration allows the module to scale for heavy CPU tasks by having the request's stateless module in a new instance.
|
|
544
|
+
|
|
545
|
+
- **Decoupled Scalability**: RabbitMQ brokers messages, letting producers and consumers scale independently.
|
|
546
|
+
- **Reliability**: Durable queues, acknowledgements, and dead-lettering ensure tasks aren’t lost.
|
|
547
|
+
- **Concurrency Control**: Taskiq’s worker pool manages parallel execution without custom schedulers.
|
|
548
|
+
- **Flexibility**: Built-in retries, exponential backoff, and Redis result-backend for resilient workflows.
|
|
549
|
+
- **Ecosystem**: Battle-tested `aio-pika` AMQP client plus Taskiq’s decorator-based API.
|
|
550
|
+
|
|
551
|
+
By combining Taskiq’s async API with RabbitMQ’s guarantees, you get a robust, production-ready queue with minimal boilerplate.
|
|
552
|
+
|
|
522
553
|
## 👷♂️ Development
|
|
523
554
|
|
|
524
555
|
### Prerequisites
|
|
@@ -30,6 +30,16 @@ To install the DigitalKin SDK, simply run:
|
|
|
30
30
|
pip install digitalkin
|
|
31
31
|
```
|
|
32
32
|
|
|
33
|
+
**Optional Taskiq Integration**: Asynchronous task execution powered by Taskiq, backed by RabbitMQ and Redis
|
|
34
|
+
To enable the Rabbitmq streaming capabilities, run:
|
|
35
|
+
|
|
36
|
+
```sh
|
|
37
|
+
sudo rabbitmq-plugins enable rabbitmq_stream
|
|
38
|
+
|
|
39
|
+
# Core + Taskiq integration (RabbitMQ broker)
|
|
40
|
+
pip install digitalkin[taskiq]
|
|
41
|
+
```
|
|
42
|
+
|
|
33
43
|
## 🛠️ Usage
|
|
34
44
|
|
|
35
45
|
### Basic Import
|
|
@@ -40,6 +50,20 @@ Start by importing the necessary modules:
|
|
|
40
50
|
import digitalkin
|
|
41
51
|
```
|
|
42
52
|
|
|
53
|
+
## Features
|
|
54
|
+
|
|
55
|
+
### Taskiq with RabbitMQ
|
|
56
|
+
|
|
57
|
+
TaskIQ intergration allows the module to scale for heavy CPU tasks by having the request's stateless module in a new instance.
|
|
58
|
+
|
|
59
|
+
- **Decoupled Scalability**: RabbitMQ brokers messages, letting producers and consumers scale independently.
|
|
60
|
+
- **Reliability**: Durable queues, acknowledgements, and dead-lettering ensure tasks aren’t lost.
|
|
61
|
+
- **Concurrency Control**: Taskiq’s worker pool manages parallel execution without custom schedulers.
|
|
62
|
+
- **Flexibility**: Built-in retries, exponential backoff, and Redis result-backend for resilient workflows.
|
|
63
|
+
- **Ecosystem**: Battle-tested `aio-pika` AMQP client plus Taskiq’s decorator-based API.
|
|
64
|
+
|
|
65
|
+
By combining Taskiq’s async API with RabbitMQ’s guarantees, you get a robust, production-ready queue with minimal boilerplate.
|
|
66
|
+
|
|
43
67
|
## 👷♂️ Development
|
|
44
68
|
|
|
45
69
|
### Prerequisites
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
"""Simple module calling an LLM."""
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
from collections.abc import Callable
|
|
5
|
+
from typing import Any, ClassVar, Literal
|
|
6
|
+
|
|
7
|
+
from pydantic import BaseModel, Field
|
|
8
|
+
|
|
9
|
+
from digitalkin.grpc_servers.utils.models import ClientConfig, SecurityMode, ServerConfig, ServerMode
|
|
10
|
+
from digitalkin.modules._base_module import BaseModule
|
|
11
|
+
from digitalkin.services.services_models import ServicesStrategy
|
|
12
|
+
from digitalkin.services.setup.setup_strategy import SetupData
|
|
13
|
+
|
|
14
|
+
# Configure logging with clear formatting
|
|
15
|
+
logging.basicConfig(
|
|
16
|
+
level=logging.DEBUG,
|
|
17
|
+
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
|
|
18
|
+
)
|
|
19
|
+
logger = logging.getLogger(__name__)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class MessageInputPayload(BaseModel):
|
|
23
|
+
"""Message trigger model for the CPU Archetype module."""
|
|
24
|
+
|
|
25
|
+
payload_type: Literal["message"] = "message"
|
|
26
|
+
user_prompt: str = Field(
|
|
27
|
+
...,
|
|
28
|
+
title="User Prompt",
|
|
29
|
+
description="The prompt provided by the user for processing.",
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class InputFile(BaseModel):
|
|
34
|
+
"""File model for the CPU Archetype module."""
|
|
35
|
+
|
|
36
|
+
name: str = Field(
|
|
37
|
+
...,
|
|
38
|
+
title="File Name",
|
|
39
|
+
description="The name of the file to be processed.",
|
|
40
|
+
)
|
|
41
|
+
content: bytes = Field(
|
|
42
|
+
...,
|
|
43
|
+
title="File Content",
|
|
44
|
+
description="The content of the file to be processed.",
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
file_type: str = Field(
|
|
48
|
+
...,
|
|
49
|
+
title="File Type",
|
|
50
|
+
description="The type of the file to be processed.",
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class FileInputPayload(BaseModel):
|
|
55
|
+
"""File input model for the CPU Archetype module."""
|
|
56
|
+
|
|
57
|
+
payload_type: Literal["file"] = "file"
|
|
58
|
+
files: list[InputFile] = Field(
|
|
59
|
+
...,
|
|
60
|
+
title="Files",
|
|
61
|
+
description="List of files to be processed.",
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
class CPUInput(BaseModel):
|
|
66
|
+
"""Input model defining what data the module expects."""
|
|
67
|
+
|
|
68
|
+
payload: MessageInputPayload | FileInputPayload = Field(
|
|
69
|
+
...,
|
|
70
|
+
discriminator="payload_type",
|
|
71
|
+
title="Payload",
|
|
72
|
+
description="Either a message or list of file input.",
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
class MessageOutputPayload(BaseModel):
|
|
77
|
+
"""Message output model for the CPU Archetype module."""
|
|
78
|
+
|
|
79
|
+
payload_type: Literal["message"] = "message"
|
|
80
|
+
user_response: str = Field(
|
|
81
|
+
...,
|
|
82
|
+
title="User Response",
|
|
83
|
+
description="The response generated by the assistant based on the user prompt.",
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
class OutputFile(BaseModel):
|
|
88
|
+
"""File model for the CPU Archetype module."""
|
|
89
|
+
|
|
90
|
+
name: str = Field(
|
|
91
|
+
...,
|
|
92
|
+
title="File Name",
|
|
93
|
+
description="The name of the file to be processed.",
|
|
94
|
+
)
|
|
95
|
+
url: str | None = Field(
|
|
96
|
+
...,
|
|
97
|
+
title="File URL",
|
|
98
|
+
description="The URL of the file to be processed.",
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
message: str | None = Field(
|
|
102
|
+
None,
|
|
103
|
+
title="Message",
|
|
104
|
+
description="Optional message associated with the file.",
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
class FileOutputPayload(BaseModel):
|
|
109
|
+
"""File output model for the CPU Archetype module."""
|
|
110
|
+
|
|
111
|
+
payload_type: Literal["file"] = "file"
|
|
112
|
+
files: list[OutputFile] = Field(
|
|
113
|
+
...,
|
|
114
|
+
title="Files",
|
|
115
|
+
description="List of files generated by the assistant.",
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
class CPUOutput(BaseModel):
|
|
120
|
+
"""Output model defining what data the module produces."""
|
|
121
|
+
|
|
122
|
+
payload: MessageOutputPayload | FileOutputPayload = Field(
|
|
123
|
+
...,
|
|
124
|
+
discriminator="payload_type",
|
|
125
|
+
title="Payload",
|
|
126
|
+
description="Either a message or file response.",
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
class CPUSetup(BaseModel):
|
|
131
|
+
"""Setup model defining module configuration parameters."""
|
|
132
|
+
|
|
133
|
+
model_name: str = Field(
|
|
134
|
+
...,
|
|
135
|
+
title="Model Name",
|
|
136
|
+
description="The name of the CPU model to use for processing.",
|
|
137
|
+
)
|
|
138
|
+
developer_prompt: str = Field(
|
|
139
|
+
...,
|
|
140
|
+
title="Developer Prompt",
|
|
141
|
+
description="The developer prompt new versions of system prompt, it defines the behavior of the assistant.",
|
|
142
|
+
)
|
|
143
|
+
temperature: float = Field(
|
|
144
|
+
0.7,
|
|
145
|
+
title="Temperature",
|
|
146
|
+
description="Controls the randomness of the model's output. Higher values make output more random.",
|
|
147
|
+
)
|
|
148
|
+
max_tokens: int = Field(
|
|
149
|
+
100,
|
|
150
|
+
title="Max Tokens",
|
|
151
|
+
description="The maximum number of tokens to generate in the response.",
|
|
152
|
+
)
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
class CPUToolSecret(BaseModel):
|
|
156
|
+
"""Secret model defining module configuration parameters."""
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
server_config = ServerConfig(
|
|
160
|
+
host="[::]",
|
|
161
|
+
port=50151,
|
|
162
|
+
mode=ServerMode.ASYNC,
|
|
163
|
+
security=SecurityMode.INSECURE,
|
|
164
|
+
max_workers=10,
|
|
165
|
+
credentials=None,
|
|
166
|
+
)
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
client_config = ClientConfig(
|
|
170
|
+
host="[::]",
|
|
171
|
+
port=50151,
|
|
172
|
+
mode=ServerMode.ASYNC,
|
|
173
|
+
security=SecurityMode.INSECURE,
|
|
174
|
+
credentials=None,
|
|
175
|
+
)
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
class CPUIntensiveModule(BaseModule[CPUInput, CPUOutput, CPUSetup, CPUToolSecret]):
|
|
179
|
+
"""A CPU endpoint tool module module."""
|
|
180
|
+
|
|
181
|
+
name = "CPUIntensiveModule"
|
|
182
|
+
description = "A module that interacts with CPU API to process text"
|
|
183
|
+
|
|
184
|
+
# Define the schema formats for the module
|
|
185
|
+
input_format = CPUInput
|
|
186
|
+
output_format = CPUOutput
|
|
187
|
+
setup_format = CPUSetup
|
|
188
|
+
secret_format = CPUToolSecret
|
|
189
|
+
|
|
190
|
+
# Define module metadata for discovery
|
|
191
|
+
metadata: ClassVar[dict[str, Any]] = {
|
|
192
|
+
"name": "CPUIntensiveModule",
|
|
193
|
+
"description": "Transforms input text using a streaming LLM response.",
|
|
194
|
+
"version": "1.0.0",
|
|
195
|
+
"tags": ["text", "transformation", "encryption", "streaming"],
|
|
196
|
+
}
|
|
197
|
+
# Define services_config_params with default values
|
|
198
|
+
services_config_strategies: ClassVar[dict[str, ServicesStrategy | None]] = {}
|
|
199
|
+
services_config_params: ClassVar[dict[str, dict[str, Any | None] | None]] = {
|
|
200
|
+
"storage": {
|
|
201
|
+
"config": {"chat_history": None},
|
|
202
|
+
"client_config": client_config,
|
|
203
|
+
},
|
|
204
|
+
"filesystem": {
|
|
205
|
+
"config": {},
|
|
206
|
+
"client_config": client_config,
|
|
207
|
+
},
|
|
208
|
+
"cost": {
|
|
209
|
+
"config": {},
|
|
210
|
+
"client_config": client_config,
|
|
211
|
+
},
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
async def initialize(self, setup_data: SetupData) -> None:
|
|
215
|
+
"""Initialize the module capabilities.
|
|
216
|
+
|
|
217
|
+
This method is called when the module is loaded by the server.
|
|
218
|
+
Use it to set up module-specific resources or configurations.
|
|
219
|
+
"""
|
|
220
|
+
|
|
221
|
+
async def run(
|
|
222
|
+
self,
|
|
223
|
+
input_data: CPUInput,
|
|
224
|
+
setup_data: CPUSetup,
|
|
225
|
+
callback: Callable,
|
|
226
|
+
) -> None:
|
|
227
|
+
"""Run the module.
|
|
228
|
+
|
|
229
|
+
Args:
|
|
230
|
+
input_data: Input data for the module
|
|
231
|
+
setup_data: Setup data for the module
|
|
232
|
+
callback: Callback function to report progress
|
|
233
|
+
|
|
234
|
+
Raises:
|
|
235
|
+
ValueError: If the payload type is unknown
|
|
236
|
+
"""
|
|
237
|
+
# Validate the input data
|
|
238
|
+
input_model = self.input_format.model_validate(input_data)
|
|
239
|
+
self.setup_format.model_validate(setup_data)
|
|
240
|
+
logger.debug("Running with input data: %s", input_model)
|
|
241
|
+
|
|
242
|
+
if not hasattr(input_model, "payload"):
|
|
243
|
+
error_msg = "Input data is missing 'payload' field"
|
|
244
|
+
raise ValueError(error_msg)
|
|
245
|
+
|
|
246
|
+
if not hasattr(input_model.payload, "payload_type"):
|
|
247
|
+
error_msg = "Input payload is missing 'type' field"
|
|
248
|
+
raise ValueError(error_msg)
|
|
249
|
+
|
|
250
|
+
total = 0
|
|
251
|
+
input = MessageInputPayload.model_validate(input_model.payload).user_prompt
|
|
252
|
+
|
|
253
|
+
for i in range(int(input)):
|
|
254
|
+
total += i * i
|
|
255
|
+
if i % 100 == 0 or i == int(input) - 1:
|
|
256
|
+
message_output_payload = MessageOutputPayload(
|
|
257
|
+
payload_type="message",
|
|
258
|
+
user_response=f"result iteration {i}: {total}",
|
|
259
|
+
)
|
|
260
|
+
output_model = self.output_format.model_validate({"payload": message_output_payload})
|
|
261
|
+
await callback(output_data=output_model)
|
|
262
|
+
logger.info("Job %s completed", self.job_id)
|
|
263
|
+
|
|
264
|
+
async def cleanup(self) -> None:
|
|
265
|
+
"""Clean up any resources when the module is stopped.
|
|
266
|
+
|
|
267
|
+
This method is called when the module is being shut down.
|
|
268
|
+
Use it to close connections, free resources, etc.
|
|
269
|
+
"""
|
|
270
|
+
logger.info("Cleaning up module %s", self.metadata["name"])
|
|
271
|
+
# Release any resources here if needed.
|