gllm-core-binary 0.3.23b3__py3-none-any.whl → 0.4.4__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 (40) hide show
  1. gllm_core/adapters/__init__.py +5 -0
  2. gllm_core/adapters/__init__.pyi +3 -0
  3. gllm_core/adapters/tool/__init__.py +6 -0
  4. gllm_core/adapters/tool/__init__.pyi +4 -0
  5. gllm_core/adapters/tool/google_adk.py +91 -0
  6. gllm_core/adapters/tool/google_adk.pyi +23 -0
  7. gllm_core/adapters/tool/langchain.py +130 -0
  8. gllm_core/adapters/tool/langchain.pyi +31 -0
  9. gllm_core/constants.py +0 -1
  10. gllm_core/constants.pyi +0 -1
  11. gllm_core/event/event_emitter.py +8 -44
  12. gllm_core/event/event_emitter.pyi +9 -21
  13. gllm_core/event/handler/console_event_handler.py +1 -12
  14. gllm_core/event/handler/console_event_handler.pyi +0 -1
  15. gllm_core/event/handler/print_event_handler.py +15 -59
  16. gllm_core/event/handler/print_event_handler.pyi +1 -2
  17. gllm_core/schema/__init__.py +2 -2
  18. gllm_core/schema/__init__.pyi +2 -2
  19. gllm_core/schema/component.py +236 -27
  20. gllm_core/schema/component.pyi +164 -17
  21. gllm_core/schema/schema_generator.py +150 -0
  22. gllm_core/schema/schema_generator.pyi +35 -0
  23. gllm_core/schema/tool.py +31 -1
  24. gllm_core/schema/tool.pyi +21 -0
  25. gllm_core/utils/__init__.py +2 -0
  26. gllm_core/utils/__init__.pyi +2 -1
  27. gllm_core/utils/analyzer.py +24 -1
  28. gllm_core/utils/analyzer.pyi +15 -1
  29. gllm_core/utils/concurrency.py +2 -2
  30. gllm_core/utils/logger_manager.py +17 -7
  31. gllm_core/utils/logger_manager.pyi +3 -0
  32. gllm_core/utils/main_method_resolver.py +185 -0
  33. gllm_core/utils/main_method_resolver.pyi +54 -0
  34. gllm_core/utils/retry.py +130 -21
  35. gllm_core/utils/retry.pyi +6 -29
  36. gllm_core_binary-0.4.4.dist-info/METADATA +177 -0
  37. {gllm_core_binary-0.3.23b3.dist-info → gllm_core_binary-0.4.4.dist-info}/RECORD +39 -27
  38. gllm_core_binary-0.3.23b3.dist-info/METADATA +0 -108
  39. {gllm_core_binary-0.3.23b3.dist-info → gllm_core_binary-0.4.4.dist-info}/WHEEL +0 -0
  40. {gllm_core_binary-0.3.23b3.dist-info → gllm_core_binary-0.4.4.dist-info}/top_level.txt +0 -0
gllm_core/utils/retry.py CHANGED
@@ -8,12 +8,15 @@ References:
8
8
  """
9
9
 
10
10
  import asyncio
11
+ import functools
12
+ import inspect
11
13
  import random
12
- from typing import Any, Callable, TypeVar
14
+ from typing import Any, Callable, TypeVar, overload
13
15
 
14
16
  from pydantic import BaseModel, Field, model_validator
15
17
 
16
18
  from gllm_core.utils import LoggerManager
19
+ from gllm_core.utils.concurrency import syncify
17
20
 
18
21
  logger = LoggerManager().get_logger(__name__)
19
22
 
@@ -29,18 +32,16 @@ class RetryConfig(BaseModel):
29
32
  max_retries (int): Maximum number of retry attempts.
30
33
  base_delay (float): Base delay in seconds between retries.
31
34
  max_delay (float): Maximum delay in seconds between retries.
32
- exponential_base (float): Base for exponential backoff. Deprecated and will be removed in v0.4.
33
35
  jitter (bool): Whether to add random jitter to delays.
34
36
  timeout (float | None): Overall timeout in seconds for the entire operation. If None, timeout is disabled.
35
37
  retry_on_exceptions (tuple[type[Exception], ...]): Tuple of exception types to retry on.
36
38
  """
37
39
 
38
40
  max_retries: int = Field(default=0, ge=0)
39
- base_delay: float = Field(default=1.0, ge=0.0)
40
- max_delay: float = Field(default=10.0, ge=0.0)
41
- exponential_base: float = Field(default=BASE_EXPONENTIAL_BACKOFF) # TODO: Remove in v0.4
41
+ base_delay: float = Field(default=1.0, gt=0.0)
42
+ max_delay: float = Field(default=10.0, gt=0.0)
42
43
  jitter: bool = Field(default=True)
43
- timeout: float | None = Field(default=None, ge=0.0) # TODO: In v0.4, prohibit timeout=0.0
44
+ timeout: float | None = Field(default=None, gt=0.0)
44
45
  retry_on_exceptions: tuple[type[Exception], ...] = Field(default=(Exception,))
45
46
 
46
47
  @model_validator(mode="after")
@@ -63,13 +64,29 @@ class RetryConfig(BaseModel):
63
64
  if self.max_delay < self.base_delay:
64
65
  raise ValueError("The 'max_delay' parameter must be greater than or equal to 'base_delay'.")
65
66
 
66
- if self.exponential_base != BASE_EXPONENTIAL_BACKOFF: # TODO: Remove in v0.4
67
- raise ValueError("The 'exponential_base' parameter must be exactly 2.0.")
68
-
69
67
  return self
70
68
 
71
69
 
72
- async def retry(
70
+ def _calculate_delay(attempt: int, config: RetryConfig) -> float:
71
+ """Calculates the delay for the next retry attempt.
72
+
73
+ Args:
74
+ attempt (int): The current attempt number (0-based).
75
+ config (RetryConfig): The retry configuration.
76
+
77
+ Returns:
78
+ float: The delay in seconds.
79
+ """
80
+ delay = config.base_delay * (BASE_EXPONENTIAL_BACKOFF**attempt)
81
+
82
+ if config.jitter:
83
+ jitter_factor = random.uniform(0, 0.25)
84
+ delay += delay * jitter_factor
85
+
86
+ return min(delay, config.max_delay)
87
+
88
+
89
+ async def _retry_async(
73
90
  func: Callable[..., Any],
74
91
  *args: Any,
75
92
  retry_config: RetryConfig | None = None,
@@ -107,7 +124,10 @@ async def retry(
107
124
 
108
125
  for attempt in range(max_retries):
109
126
  try:
110
- return await func(*args, **kwargs)
127
+ result = func(*args, **kwargs)
128
+ if inspect.isawaitable(result):
129
+ return await result
130
+ return result
111
131
 
112
132
  except asyncio.TimeoutError:
113
133
  raise
@@ -130,20 +150,109 @@ async def retry(
130
150
  return await attempt_loop()
131
151
 
132
152
 
133
- def _calculate_delay(attempt: int, config: RetryConfig) -> float:
134
- """Calculates the delay for the next retry attempt.
153
+ @overload
154
+ async def retry(
155
+ func: Callable[..., Any],
156
+ *args: Any,
157
+ retry_config: RetryConfig | None = None,
158
+ **kwargs: Any,
159
+ ) -> T: ...
160
+
161
+
162
+ @overload
163
+ def retry(config: RetryConfig | None = None) -> Callable[[Callable[..., Any]], Callable[..., Any]]: ...
164
+
165
+
166
+ def retry(
167
+ func_or_config: Callable[..., Any] | RetryConfig | None = None,
168
+ *args: Any,
169
+ retry_config: RetryConfig | None = None,
170
+ **kwargs: Any,
171
+ ) -> T | Callable[[Callable[..., Any]], Callable[..., Any]]:
172
+ """Executes a function with retry logic or creates a retry decorator.
173
+
174
+ This function supports two usage patterns:
175
+ 1. Direct function execution: await retry(func, *args, retry_config=config, **kwargs)
176
+ 2. Decorator factory: @retry() or @retry(config)
135
177
 
136
178
  Args:
137
- attempt (int): The current attempt number (0-based).
138
- config (RetryConfig): The retry configuration.
179
+ func_or_config (Callable[..., Any] | RetryConfig | None, optional): Either a function to execute or a
180
+ RetryConfig for decorator usage. Defaults to None.
181
+ *args (Any): Positional arguments (only used in direct execution mode).
182
+ retry_config (RetryConfig | None, optional): Retry configuration (only used in direct execution mode).
183
+ Defaults to None, in which case no retry nor timeout is applied.
184
+ **kwargs (Any): Keyword arguments (only used in direct execution mode).
139
185
 
140
186
  Returns:
141
- float: The delay in seconds.
187
+ T | Callable[[Callable[..., Any]], Callable[..., Any]]: Either the result of function execution or
188
+ a decorator function.
189
+
190
+ Raises:
191
+ Exception: The last exception raised by the function if all retries are exhausted.
192
+ asyncio.TimeoutError: If the overall timeout is exceeded.
193
+
194
+ Examples:
195
+ # Direct function execution
196
+ ```python
197
+ result = await retry(my_function, arg1, arg2, retry_config=config)
198
+ ```
199
+
200
+ # Decorator usage - parameterless
201
+ ```python
202
+ @retry()
203
+ async def my_async_function():
204
+ # Use default settings, in which case no retry nor timeout is applied.
205
+ pass
206
+ ```
207
+
208
+ # Decorator usage - with custom configuration
209
+ ```python
210
+ @retry(RetryConfig(max_retries=3, timeout=120))
211
+ async def my_function():
212
+ # Will retry up to 3 times with 0.5s base delay
213
+ pass
214
+ ```
215
+
216
+ # Decorator on sync functions
217
+ ```python
218
+ @retry()
219
+ def my_sync_function():
220
+ # Works with sync functions too
221
+ return "success"
222
+ ```
223
+
224
+ # Decorator on class methods
225
+ ```python
226
+ class MyService:
227
+ @retry(RetryConfig(max_retries=2))
228
+ async def get_data(self, id: str):
229
+ return {"id": id, "data": "value"}
230
+ ```
142
231
  """
143
- delay = config.base_delay * (BASE_EXPONENTIAL_BACKOFF**attempt)
232
+ if callable(func_or_config) and not isinstance(func_or_config, RetryConfig):
233
+ func = func_or_config
144
234
 
145
- if config.jitter:
146
- jitter_factor = random.uniform(0, 0.25)
147
- delay += delay * jitter_factor
235
+ async def async_wrapper() -> T:
236
+ return await _retry_async(func, *args, retry_config=retry_config, **kwargs)
148
237
 
149
- return min(delay, config.max_delay)
238
+ return async_wrapper()
239
+
240
+ config = func_or_config
241
+
242
+ def decorator(func: Callable[..., Any]) -> Callable[..., Any]:
243
+ if asyncio.iscoroutinefunction(func):
244
+
245
+ @functools.wraps(func)
246
+ async def async_wrapper(*args: Any, **kwargs: Any) -> Any:
247
+ return await _retry_async(func, *args, retry_config=config, **kwargs)
248
+
249
+ return async_wrapper
250
+
251
+ @functools.wraps(func)
252
+ def sync_wrapper(*args: Any, **kwargs: Any) -> Any:
253
+ sync_retry = syncify(lambda: _retry_async(func, *args, retry_config=config, **kwargs))
254
+ return sync_retry()
255
+
256
+ return sync_wrapper
257
+
258
+ return decorator
gllm_core/utils/retry.pyi CHANGED
@@ -1,7 +1,8 @@
1
1
  from _typeshed import Incomplete
2
2
  from gllm_core.utils import LoggerManager as LoggerManager
3
+ from gllm_core.utils.concurrency import syncify as syncify
3
4
  from pydantic import BaseModel
4
- from typing import Any, Callable, TypeVar
5
+ from typing import Any, Callable, TypeVar, overload
5
6
 
6
7
  logger: Incomplete
7
8
  T = TypeVar('T')
@@ -14,7 +15,6 @@ class RetryConfig(BaseModel):
14
15
  max_retries (int): Maximum number of retry attempts.
15
16
  base_delay (float): Base delay in seconds between retries.
16
17
  max_delay (float): Maximum delay in seconds between retries.
17
- exponential_base (float): Base for exponential backoff. Deprecated and will be removed in v0.4.
18
18
  jitter (bool): Whether to add random jitter to delays.
19
19
  timeout (float | None): Overall timeout in seconds for the entire operation. If None, timeout is disabled.
20
20
  retry_on_exceptions (tuple[type[Exception], ...]): Tuple of exception types to retry on.
@@ -22,7 +22,6 @@ class RetryConfig(BaseModel):
22
22
  max_retries: int
23
23
  base_delay: float
24
24
  max_delay: float
25
- exponential_base: float
26
25
  jitter: bool
27
26
  timeout: float | None
28
27
  retry_on_exceptions: tuple[type[Exception], ...]
@@ -36,29 +35,7 @@ class RetryConfig(BaseModel):
36
35
  ValueError: If max_delay is less than base_delay.
37
36
  """
38
37
 
39
- async def retry(func: Callable[..., Any], *args: Any, retry_config: RetryConfig | None = None, **kwargs: Any) -> T:
40
- """Executes a function with retry logic and exponential backoff.
41
-
42
- This function executes the provided function with retry logic. It will first try to execute the function once.
43
- If the function raises an exception that matches the retry_on_exceptions, it will retry up to max_retries times
44
- with exponential backoff. Therefore, the max number of attempts is max_retries + 1. If provided, the timeout
45
- applies to the entire retry operation, including all attempts and delays.
46
-
47
- Example:
48
- If you set timeout=10.0 and max_retries=3, the entire retry operation (including all attempts
49
- and delays) will timeout after 10 seconds, not 10 seconds per attempt.
50
-
51
- Args:
52
- func (Callable[..., Any]): The function to execute.
53
- *args (Any): Positional arguments to pass to the function.
54
- retry_config (RetryConfig | None, optional): Retry configuration. If None, uses default config.
55
- Defaults to None.
56
- **kwargs (Any): Keyword arguments to pass to the function.
57
-
58
- Returns:
59
- T: The result of the function execution.
60
-
61
- Raises:
62
- Exception: The last exception raised by the function if all retries are exhausted.
63
- asyncio.TimeoutError: If the overall timeout is exceeded.
64
- """
38
+ @overload
39
+ async def retry(func: Callable[..., Any], *args: Any, retry_config: RetryConfig | None = None, **kwargs: Any) -> T: ...
40
+ @overload
41
+ def retry(config: RetryConfig | None = None) -> Callable[[Callable[..., Any]], Callable[..., Any]]: ...
@@ -0,0 +1,177 @@
1
+ Metadata-Version: 2.4
2
+ Name: gllm-core-binary
3
+ Version: 0.4.4
4
+ Summary: A library containing core components for Gen AI applications.
5
+ Author-email: Dimitrij Ray <dimitrij.ray@gdplabs.id>, Henry Wicaksono <henry.wicaksono@gdplabs.id>, Resti Febriana <resti.febriana@gdplabs.id>
6
+ Requires-Python: <3.14,>=3.11
7
+ Description-Content-Type: text/markdown
8
+ Requires-Dist: anyio<5.0.0,>=4.10.0
9
+ Requires-Dist: deprecation<3.0.0,>=2.1.0
10
+ Requires-Dist: google<4.0.0,>=3.0.0
11
+ Requires-Dist: google-auth<3.0.0,>=2.38.0
12
+ Requires-Dist: gspread<7.0.0,>=6.1.4
13
+ Requires-Dist: numpy<2.0.0,>=1.26; python_version < "3.12"
14
+ Requires-Dist: numpy<3.0.0,>=1.26; python_version >= "3.12" and python_version < "3.13"
15
+ Requires-Dist: numpy<3.0.0,>=2.2; python_version >= "3.13"
16
+ Requires-Dist: pydantic<3.0.0,>=2.11.4
17
+ Requires-Dist: python-json-logger<4.0.0,>=3.3.0
18
+ Requires-Dist: rich<15.0.0,>=14.1.0
19
+ Requires-Dist: scipy<2.0.0,>=1.15.1
20
+ Provides-Extra: dev
21
+ Requires-Dist: coverage<8.0.0,>=7.4.4; extra == "dev"
22
+ Requires-Dist: mypy<2.0.0,>=1.15.0; extra == "dev"
23
+ Requires-Dist: pre-commit<4.0.0,>=3.7.0; extra == "dev"
24
+ Requires-Dist: pytest<9.0.0,>=8.1.1; extra == "dev"
25
+ Requires-Dist: pytest-asyncio<1.0.0,>=0.23.6; extra == "dev"
26
+ Requires-Dist: pytest-cov<6.0.0,>=5.0.0; extra == "dev"
27
+ Requires-Dist: ruff<1.0.0,>=0.6.7; extra == "dev"
28
+ Provides-Extra: langchain
29
+ Requires-Dist: langchain-core<1.0.0,>=0.3.0; extra == "langchain"
30
+ Provides-Extra: google-adk
31
+ Requires-Dist: google-adk<2.0.0,>=1.0.0; extra == "google-adk"
32
+ Requires-Dist: starlette<1.0.0,>=0.49.0; extra == "google-adk"
33
+
34
+ # GLLM Core
35
+
36
+ ## Description
37
+ A core library providing foundational components and utilities for Generative AI applications.
38
+
39
+ ---
40
+
41
+ ## Installation
42
+
43
+ ### Prerequisites
44
+
45
+ Mandatory:
46
+ 1. Python 3.11+ — [Install here](https://www.python.org/downloads/)
47
+ 2. pip — [Install here](https://pip.pypa.io/en/stable/installation/)
48
+ 3. uv — [Install here](https://docs.astral.sh/uv/getting-started/installation/)
49
+
50
+ Extras (required only for Artifact Registry installations):
51
+ 1. gcloud CLI (for authentication) — [Install here](https://cloud.google.com/sdk/docs/install), then log in using:
52
+ ```bash
53
+ gcloud auth login
54
+ ```
55
+
56
+ ---
57
+
58
+ ### Option 1: Install from Artifact Registry
59
+
60
+ This option requires authentication via the `gcloud` CLI.
61
+
62
+ ```bash
63
+ uv pip install \
64
+ --extra-index-url "https://oauth2accesstoken:$(gcloud auth print-access-token)@glsdk.gdplabs.id/gen-ai-internal/simple/" \
65
+ gllm-inference
66
+ ```
67
+
68
+ ---
69
+
70
+ ### Option 2: Install from PyPI
71
+
72
+ This option requires no authentication.
73
+ However, it installs the **binary wheel** version of the package, which is fully usable but **does not include source code**.
74
+
75
+ ```bash
76
+ uv pip install gllm-core-binary
77
+ ```
78
+
79
+ ---
80
+
81
+ ## Local Development Setup
82
+
83
+ ### Prerequisites
84
+
85
+ 1. Python 3.11+ — [Install here](https://www.python.org/downloads/)
86
+ 2. pip — [Install here](https://pip.pypa.io/en/stable/installation/)
87
+ 3. uv — [Install here](https://docs.astral.sh/uv/getting-started/installation/)
88
+ 4. gcloud CLI — [Install here](https://cloud.google.com/sdk/docs/install), then log in using:
89
+
90
+ ```bash
91
+ gcloud auth login
92
+ ```
93
+ 5. Git — [Install here](https://git-scm.com/downloads)
94
+ 6. Access to the [GDP Labs SDK GitHub repository](https://github.com/GDP-ADMIN/gl-sdk)
95
+
96
+ ---
97
+
98
+ ### 1. Clone Repository
99
+
100
+ ```bash
101
+ git clone git@github.com:GDP-ADMIN/gl-sdk.git
102
+ cd gl-sdk/libs/gllm-core
103
+ ```
104
+
105
+ ---
106
+
107
+ ### 2. Setup Authentication
108
+
109
+ Set the following environment variables to authenticate with internal package indexes:
110
+
111
+ ```bash
112
+ export UV_INDEX_GEN_AI_INTERNAL_USERNAME=oauth2accesstoken
113
+ export UV_INDEX_GEN_AI_INTERNAL_PASSWORD="$(gcloud auth print-access-token)"
114
+ export UV_INDEX_GEN_AI_USERNAME=oauth2accesstoken
115
+ export UV_INDEX_GEN_AI_PASSWORD="$(gcloud auth print-access-token)"
116
+ ```
117
+
118
+ ---
119
+
120
+ ### 3. Quick Setup
121
+
122
+ Run:
123
+
124
+ ```bash
125
+ make setup
126
+ ```
127
+
128
+ ---
129
+
130
+ ### 4. Activate Virtual Environment
131
+
132
+ ```bash
133
+ source .venv/bin/activate
134
+ ```
135
+
136
+ ---
137
+
138
+ ## Local Development Utilities
139
+
140
+ The following Makefile commands are available for quick operations:
141
+
142
+ ### Install uv
143
+
144
+ ```bash
145
+ make install-uv
146
+ ```
147
+
148
+ ### Install Pre-Commit
149
+
150
+ ```bash
151
+ make install-pre-commit
152
+ ```
153
+
154
+ ### Install Dependencies
155
+
156
+ ```bash
157
+ make install
158
+ ```
159
+
160
+ ### Update Dependencies
161
+
162
+ ```bash
163
+ make update
164
+ ```
165
+
166
+ ### Run Tests
167
+
168
+ ```bash
169
+ make test
170
+ ```
171
+
172
+ ---
173
+
174
+ ## Contributing
175
+
176
+ Please refer to the [Python Style Guide](https://docs.google.com/document/d/1uRggCrHnVfDPBnG641FyQBwUwLoFw0kTzNqRm92vUwM/edit?usp=sharing)
177
+ for information about code style, documentation standards, and SCA requirements.
@@ -1,21 +1,29 @@
1
1
  gllm_core/__init__.py,sha256=eNadXBQreFzNIUMsBil5pQpemEqa118vXoQ7W68fb0Y,54
2
2
  gllm_core/__init__.pyi,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
- gllm_core/constants.py,sha256=I5KKviLMMNUuuBSJJAtuWhBS7R71Oloykk5mwv_9Ee8,1155
4
- gllm_core/constants.pyi,sha256=p7-Sr-sNmjv6mboGJmALDd3UtTZ4y0m_gmUXIBbAzBk,923
3
+ gllm_core/constants.py,sha256=oYp3hUekkE4Ph3X4ujIFdFJSO5VMdXUE3BB4iCd-XCg,1112
4
+ gllm_core/constants.pyi,sha256=9M5UxEkdttu4fSJTLxhjt7q1xTRYbjTFheM5EjQ5Bs4,904
5
+ gllm_core/adapters/__init__.py,sha256=DT9i3jbfas2h3OZKB8X-h1tUjmgqULK0UpdFqXwrI18,180
6
+ gllm_core/adapters/__init__.pyi,sha256=N8JBGr2mPUMAGaMd__7XxGr2NAzfaFMuNH15QkSfbrA,187
7
+ gllm_core/adapters/tool/__init__.py,sha256=_aSDU8ch_0cs7dEnPjC3DfNJojDOR7nermdnyeqFxu0,242
8
+ gllm_core/adapters/tool/__init__.pyi,sha256=zRmMo1ilDaYF-cErfkQqy8zGnArHebdWmox-P34_7fI,244
9
+ gllm_core/adapters/tool/google_adk.py,sha256=pUay4OgMdffEVQMMIje8p4R1S8AMlCe4ekDsiWnHi5E,3194
10
+ gllm_core/adapters/tool/google_adk.pyi,sha256=0awaKRXmmK5NiAP9vNNYjMARDPWfWyQqy29k3WHoX2s,953
11
+ gllm_core/adapters/tool/langchain.py,sha256=rOxuD1EMZHcFkruT65zYeKvH_xxIzq65pdfb_uUT_f4,3825
12
+ gllm_core/adapters/tool/langchain.pyi,sha256=LBqox8xFm6jSxPfBEftJr_zUmXwPk_qHNwU3bZaphhE,855
5
13
  gllm_core/event/__init__.py,sha256=kgm77bXmkT3fBUSQSl0ELAFM9NXnaGXPPml1LcthOLk,243
6
14
  gllm_core/event/__init__.pyi,sha256=HVs5C80lFzVEH7mO8KJTUqEPi_7KyPvNeMLuoG-hDeE,177
7
- gllm_core/event/event_emitter.py,sha256=plcf_xu4jG168Z11WpJcVdYKSMKFhQc7fPwHhkLAwLo,10509
8
- gllm_core/event/event_emitter.pyi,sha256=7WcK-SV4xVwh48rsc-gt_41J8qksBTxbWSWfnr85dYk,8386
15
+ gllm_core/event/event_emitter.py,sha256=8BWYLC-Nz6maGHZLXc_dfyzC08GDQWpDbZu3nYC_7oQ,8658
16
+ gllm_core/event/event_emitter.pyi,sha256=dzhlOGnA2h5-OSRZHt-AJ-THul-rDUatfwr6dyYzYu8,7297
9
17
  gllm_core/event/messenger.py,sha256=-m4Kdv6xRRqhaUG_gol0Af7_Z1bKOOgB5VTQdQqg8G8,5664
10
18
  gllm_core/event/messenger.pyi,sha256=8Nvra-a7RqnfX0PAtm-Of5M8CvsYr0L_1k3HgdNCR5I,3190
11
19
  gllm_core/event/handler/__init__.py,sha256=IClP_8FakiM1-DfYbjGWrylm1AKKbrKX5-btBhKu6Y4,406
12
20
  gllm_core/event/handler/__init__.pyi,sha256=gZ21Fjjog3-e3-_Xv5sTpX9_Mx8X2LUzTrqp_tPisCg,377
13
- gllm_core/event/handler/console_event_handler.py,sha256=OzlxmNFCXY7hv5xsxih_sepQqgl6FFyVe8TokejSyXE,2186
14
- gllm_core/event/handler/console_event_handler.pyi,sha256=h3Dpj6-UeZnKUm7iFFOmRWk8k2Hw6YsvP28FUWYjU4U,1550
21
+ gllm_core/event/handler/console_event_handler.py,sha256=lIiBcMClRHI5h1v-xb1BzE9Zzo1QJW4gBqCeB81cFjo,1817
22
+ gllm_core/event/handler/console_event_handler.pyi,sha256=eCv0SaZEpbu8W2jQPLnWwXNzhGOSM5KAtDVUYfvlvMs,1494
15
23
  gllm_core/event/handler/event_handler.py,sha256=2r2gpykTEiFnFrroKXtm3J65nE3nysFxr3iGcOSY5Vc,3055
16
24
  gllm_core/event/handler/event_handler.pyi,sha256=chEYnw3Rp9Lk3Cz4dSn6EVlzje4BG-SlM82J-4UE5Hw,2153
17
- gllm_core/event/handler/print_event_handler.py,sha256=93EighPzNXrnTO5CbE5Qop1aTMQqHqTODyZ1JBGXqfo,6729
18
- gllm_core/event/handler/print_event_handler.pyi,sha256=Z34M73brc4eaDLDt_nmdo638qsyUVuuMLyIJ0PdBt6c,1805
25
+ gllm_core/event/handler/print_event_handler.py,sha256=SvdbjJ_diJkUlB4yZL-TGfjOB56DM86XDJnB-CZgR60,4968
26
+ gllm_core/event/handler/print_event_handler.pyi,sha256=D_xNtpcBsGl7NVSCvFKEGvaUqfMTxPaQV8zXECwmZ2Q,1674
19
27
  gllm_core/event/handler/stream_event_handler.py,sha256=RbzHAyvRoGWn5XSTmkGMBwi-3l02NrKAiNWC03Kl14I,3411
20
28
  gllm_core/event/handler/stream_event_handler.pyi,sha256=5faGSFQLBN7XMqd4nIfGkdTBI_ALVaE-fmxVAjzca9w,2908
21
29
  gllm_core/event/hook/__init__.py,sha256=ro-Hf0C2BPjxUyEZBl_a19GlH23YcHkkajQC2OarNjc,204
@@ -24,25 +32,27 @@ gllm_core/event/hook/event_hook.py,sha256=LHu9DcxcrKtiOmDVia1zrbrWg9eLqQzlox_pW9
24
32
  gllm_core/event/hook/event_hook.pyi,sha256=rMatofdNAwHI65ya_7-q3NAfmTuKhc2WkXeiGPAvcKI,600
25
33
  gllm_core/event/hook/json_stringify_event_hook.py,sha256=ImOy1kEudSIzkWkD1PSwsIbMWqoN0vpnjbAKK0EOkqI,849
26
34
  gllm_core/event/hook/json_stringify_event_hook.pyi,sha256=I-QxbaLc4rEyqhW_f4INN5UxBg_ZofHHN1HQKfPJ7rs,585
27
- gllm_core/schema/__init__.py,sha256=AbYOCjcyJJLzn13TP8M8Zfv4F2VvzkVAQnBj241IRYU,322
28
- gllm_core/schema/__init__.pyi,sha256=oqfGtlLWbWJmHiKXA9Yfz1HoEpMRqStnxwNaRRIb2Vw,288
35
+ gllm_core/schema/__init__.py,sha256=p2T4be4h062eWl4NwYFV5B9p1LONoIBLjPw31sgkZWw,336
36
+ gllm_core/schema/__init__.pyi,sha256=X7Gv3xgtl4Ylzsg9iuGgjJPkQey7OdvvIC_X1e5_LAI,310
29
37
  gllm_core/schema/chunk.py,sha256=5-MjZ9D3nB3ref6qqdygkV5njH7QsUBfTOeFK7zr5PE,4875
30
38
  gllm_core/schema/chunk.pyi,sha256=ZVYQitMtvMStiFssnTCgtSIcj30VSsK2dKscSysl3R4,2378
31
- gllm_core/schema/component.py,sha256=oOe27IigRKyE3l2WOQzaAe6PS08QgaVEs_l62rfHe8U,13492
32
- gllm_core/schema/component.pyi,sha256=kZr6If6yTkY-tdhZTUm0hJtd_m-Cu8Z4jhfKsjQgKeM,2715
39
+ gllm_core/schema/component.py,sha256=gd0g1w4UM1UqswDMndoiNsLgi2PuxO5FUBwtWuQ3410,22540
40
+ gllm_core/schema/component.pyi,sha256=fghUD8QJRXjjUT2jn64dkM_KjMv6MV9OAQUXjc7xsD0,9164
33
41
  gllm_core/schema/event.py,sha256=TXukuyS7HYlm0OMwlCjUha_JB0D_qs8NWB0K7aImAmE,1744
34
42
  gllm_core/schema/event.pyi,sha256=Yd74uSWhIO1lx0_p70rYt-LMz4FZHbbbqJP7xhVh_pY,1335
35
- gllm_core/schema/tool.py,sha256=IQOewyunEJ3zFXMhcJMHeiRcbkLewbttEVStzzBsXps,15499
36
- gllm_core/schema/tool.pyi,sha256=miqqYG0XtNY4p7UCYRS1-A23FY9wq_LZ6RvbcgGIyNQ,8038
37
- gllm_core/utils/__init__.py,sha256=5iWTy3HAPOWJw_nBZpOQZjCzmuTJuy_VGDlKVWwXf38,1104
38
- gllm_core/utils/__init__.pyi,sha256=U13s25K_edFp2WoCHfB0NyTROXvnP62P5A2YRukSIhs,1246
39
- gllm_core/utils/analyzer.py,sha256=UyNh4k0jEmi5RHSDrbLDPIulzTrsEycCkckqDZoIvhs,8138
40
- gllm_core/utils/analyzer.pyi,sha256=M7_KYdBqz5S5fEPvnd49e6ij01dOvJD-k7amAlvRwNQ,3989
43
+ gllm_core/schema/schema_generator.py,sha256=1PgcghBNCljTASB_dbmcl9-5sJIevs8XiXm7RT6XFig,5129
44
+ gllm_core/schema/schema_generator.pyi,sha256=ToadC6UKEq35k32wUK1VaMKiICRtENXUYdAQOMlTg3U,1445
45
+ gllm_core/schema/tool.py,sha256=DnuZaDnd2u9-eF06iFYtYgDHKUnTKx4GWuqvxm6Fb2c,16644
46
+ gllm_core/schema/tool.pyi,sha256=T5TufJZPYUzYoSPZBX0FkqgZ9u03VAIsZdwvY1PS7nw,8848
47
+ gllm_core/utils/__init__.py,sha256=THjHMxGlgdlVSR6LoruXzsxHI9UKaN7dCadsTrjA6OY,1200
48
+ gllm_core/utils/__init__.pyi,sha256=ZFilGPXXqc2JGwy8AV8N7pf6zmtd9clzuk310PIGkBs,1359
49
+ gllm_core/utils/analyzer.py,sha256=V8hTVdqMpll0BuH9lFZHiX7Ijl72aNvBlYXLJy9FSRI,8882
50
+ gllm_core/utils/analyzer.pyi,sha256=M48PRor76L5eAQBpSqpv3EkZ4kU1t5Zm3CPFd34dxWM,4470
41
51
  gllm_core/utils/binary_handler_factory.py,sha256=JGk1G5OzYLGlx6W2eYb8mSXlHZh29zEKQEx1kX0HLuc,2512
42
52
  gllm_core/utils/binary_handler_factory.pyi,sha256=imcuCL2oa-7uwTnC_vI-_KvE1hGu1-5U4ZiF5fShDmQ,1739
43
53
  gllm_core/utils/chunk_metadata_merger.py,sha256=-Tk83zuXFlUh2ZilXHSnCTkJW1b8hgkCRaVQu136-xY,4096
44
54
  gllm_core/utils/chunk_metadata_merger.pyi,sha256=J1lHTFV-0IiC6xKzzC7x1D1wBoki249muEU2HrF6C58,2317
45
- gllm_core/utils/concurrency.py,sha256=igz4VeLI2vjd7oVeX-G-aaYibViMlHmcp7Ht4K942cY,6338
55
+ gllm_core/utils/concurrency.py,sha256=KM7qS5rN25ppssSuDsH80xzFeDYuu0MhHn6-O021AjQ,6352
46
56
  gllm_core/utils/concurrency.pyi,sha256=n_Mb9D_2hJAQ7VSwDBxhgmDv7hyFRKevDlhcHoAjvyA,3959
47
57
  gllm_core/utils/event_formatter.py,sha256=c1jOgu468IY3NPIXFbC56khU8_LERUFLXBocO25mk4g,2237
48
58
  gllm_core/utils/event_formatter.pyi,sha256=ocQ_Ev_XorRhLzj0c2szlclz8V3_Ysbg6qHmjhmur3k,1375
@@ -50,17 +60,19 @@ gllm_core/utils/google_sheets.py,sha256=8p2f-Kfz4gqtq9_bIJd5GvQY22oQ4sTaeyOYJM4t
50
60
  gllm_core/utils/google_sheets.pyi,sha256=IjKdc7H3hBLAp8I8jxnwDfKP79D1EIBIRQKKFTUNqjM,939
51
61
  gllm_core/utils/imports.py,sha256=obCG8wrTp5MDDzeQ5SbqUgwX1PDJp-OuhPxL7HZAVC0,3625
52
62
  gllm_core/utils/imports.pyi,sha256=-KM0pyw7yFVCUZjHjoNBRFgEnI8hlr0pquKuhcA2X9M,2196
53
- gllm_core/utils/logger_manager.py,sha256=RhU41aERkCMNumWEJdy7hdt-3zBqnX5afu9VyG9kAZw,12377
54
- gllm_core/utils/logger_manager.pyi,sha256=0U07paP3_NSl8QiEw3_LnboA-HdHU7VcAB4pX6_voNw,7074
63
+ gllm_core/utils/logger_manager.py,sha256=xnM3ON_6GGS-xaWFVEruq_830FwwXyuEvqqCaZJ-g7U,12827
64
+ gllm_core/utils/logger_manager.pyi,sha256=IDRgA-5jRDu4miO5Ru_tFJHql2JlHdr1GvZdmdS9Sg8,7159
65
+ gllm_core/utils/main_method_resolver.py,sha256=lGirchC4Eo4Y0WQdOp3ORIzlhBAyuPY9w1YMwiJODWY,7801
66
+ gllm_core/utils/main_method_resolver.pyi,sha256=dHozSqFMwCyVorQ0ZE9N-c2V4PkpF8FdU1VGGPvTjK4,2178
55
67
  gllm_core/utils/merger_method.py,sha256=pf06CAnC8ZhJZB7qjwades6AY_IAgoBGSeeZAxc3NYM,4727
56
68
  gllm_core/utils/merger_method.pyi,sha256=JsgHnO47cqenqNxCrHqhAR-nnR_dEqE-7wprVrd8ZFg,1868
57
- gllm_core/utils/retry.py,sha256=6YSBD2WhU0i-mys1ZMviH0afNQNIk4w1rPuk_uJOeUM,5574
58
- gllm_core/utils/retry.pyi,sha256=2RcG5C9xQS2nCSWBmtsOfKgIk5mVXHmYBrXrqStvsrI,2839
69
+ gllm_core/utils/retry.py,sha256=4uYZnqkC2poeGt9rpYiKXfrS7eZ1plnpPwVYB_l7sTY,9084
70
+ gllm_core/utils/retry.pyi,sha256=KxlPzURzZfCSgKC44v98nR2bqamzHqtbRuXLDEuX29c,1614
59
71
  gllm_core/utils/similarity.py,sha256=_pMMOkJW0gBxBS3stBvqRGa8IIG3owA-JXiIR6LzJPc,864
60
72
  gllm_core/utils/similarity.pyi,sha256=HmSxE5VfPwYZYih_bSIz8QRDbkouO_jij-FX6TSCEdM,439
61
73
  gllm_core/utils/validation.py,sha256=Vxd4PxHR2tl-VcfIqJFgA3oHf2VJvcz5D39WbwvorhQ,767
62
74
  gllm_core/utils/validation.pyi,sha256=-RdMmb8afH7F7q4Ao7x6FbwaDfxUHn3hA3WiOgzB-3s,397
63
- gllm_core_binary-0.3.23b3.dist-info/METADATA,sha256=ZM3HKQ2fy6b7nvskaomJTe1CTDZApGcx_bDi_btBx7I,4432
64
- gllm_core_binary-0.3.23b3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
65
- gllm_core_binary-0.3.23b3.dist-info/top_level.txt,sha256=UYoTGvK_Yec95-_QUuVCKEr6PUXb5Lc7Dr-x8SeX9uM,10
66
- gllm_core_binary-0.3.23b3.dist-info/RECORD,,
75
+ gllm_core_binary-0.4.4.dist-info/METADATA,sha256=K9t-hKGi91YHbA3y4CJOxfMKNZ-9jawHoh-xuNkvi_A,4662
76
+ gllm_core_binary-0.4.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
77
+ gllm_core_binary-0.4.4.dist-info/top_level.txt,sha256=UYoTGvK_Yec95-_QUuVCKEr6PUXb5Lc7Dr-x8SeX9uM,10
78
+ gllm_core_binary-0.4.4.dist-info/RECORD,,
@@ -1,108 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: gllm-core-binary
3
- Version: 0.3.23b3
4
- Summary: A library containing core components for Gen AI applications.
5
- Author-email: Dimitrij Ray <dimitrij.ray@gdplabs.id>, Henry Wicaksono <henry.wicaksono@gdplabs.id>, Resti Febriana <resti.febriana@gdplabs.id>
6
- Requires-Python: <3.14,>=3.11
7
- Description-Content-Type: text/markdown
8
- Requires-Dist: poetry<3.0.0,>=2.1.3
9
- Requires-Dist: anyio<5.0.0,>=4.10.0
10
- Requires-Dist: deprecation<3.0.0,>=2.1.0
11
- Requires-Dist: google<4.0.0,>=3.0.0
12
- Requires-Dist: google-auth<3.0.0,>=2.38.0
13
- Requires-Dist: gspread<7.0.0,>=6.1.4
14
- Requires-Dist: numpy<2.0.0,>=1.26; python_version < "3.12"
15
- Requires-Dist: numpy<3.0.0,>=1.26; python_version >= "3.12" and python_version < "3.13"
16
- Requires-Dist: numpy<3.0.0,>=2.2; python_version >= "3.13"
17
- Requires-Dist: pydantic<3.0.0,>=2.11.4
18
- Requires-Dist: python-json-logger<4.0.0,>=3.3.0
19
- Requires-Dist: rich<15.0.0,>=14.1.0
20
- Requires-Dist: scipy<2.0.0,>=1.15.1
21
- Requires-Dist: virtualenv==20.30.0
22
- Provides-Extra: dev
23
- Requires-Dist: coverage<8.0.0,>=7.4.4; extra == "dev"
24
- Requires-Dist: mypy<2.0.0,>=1.15.0; extra == "dev"
25
- Requires-Dist: pre-commit<4.0.0,>=3.7.0; extra == "dev"
26
- Requires-Dist: pytest<9.0.0,>=8.1.1; extra == "dev"
27
- Requires-Dist: pytest-asyncio<1.0.0,>=0.23.6; extra == "dev"
28
- Requires-Dist: pytest-cov<6.0.0,>=5.0.0; extra == "dev"
29
- Requires-Dist: ruff<1.0.0,>=0.6.7; extra == "dev"
30
-
31
- # GLLM Core
32
-
33
- ## Description
34
-
35
- A core library providing foundational components and utilities for Generative AI applications.
36
-
37
- ## Installation
38
-
39
- ### Prerequisites
40
- 1. Python 3.11+ - [Install here](https://www.python.org/downloads/)
41
- 2. Pip (if using Pip) - [Install here](https://pip.pypa.io/en/stable/installation/)
42
- 3. Poetry 2.1.4+ - [Install here](https://python-poetry.org/docs/#installation)
43
- 4. Git (if using Git) - [Install here](https://git-scm.com/downloads)
44
- 5. gcloud CLI (for authentication) - [Install here](https://cloud.google.com/sdk/docs/install)
45
- 6. For git installation, access to the [GDP Labs SDK github repository](https://github.com/GDP-ADMIN/gl-sdk)
46
-
47
- ### 1. Installation from Artifact Registry
48
- Choose one of the following methods to install the package:
49
-
50
- #### Using pip
51
- ```bash
52
- pip install gllm-core-binary
53
- ```
54
-
55
- #### Using Poetry
56
- ```bash
57
- poetry add gllm-core-binary
58
- ```
59
-
60
- ### 2. Development Installation (Git)
61
- For development purposes, you can install directly from the Git repository:
62
- ```bash
63
- git clone git@github.com:GDP-ADMIN/gl-sdk.git
64
- cd gl-sdk/libs/gllm-core
65
- ```
66
-
67
- ## Local Development Setup
68
-
69
- ### Quick Setup (Recommended)
70
- For local development with editable gllm packages, use the provided Makefile:
71
-
72
- ```bash
73
- # Complete setup: installs Poetry, configures auth, installs packages, sets up pre-commit
74
- make setup
75
- ```
76
-
77
- The following are the available Makefile targets:
78
-
79
- 1. `make setup` - Complete development setup (recommended for new developers)
80
- 2. `make install-poetry` - Install or upgrade Poetry to the latest version
81
- 3. `make auth` - Configure authentication for internal repositories
82
- 4. `make install` - Install all dependencies
83
- 5. `make install-pre-commit` - Set up pre-commit hooks
84
- 6. `make update` - Update dependencies
85
-
86
- ### Manual Development Setup (Legacy)
87
- If you prefer to manage dependencies manually:
88
-
89
- 1. Go to root folder of `gllm-core` module, e.g. `cd libs/gllm-core`.
90
- 2. Run `poetry shell` to create a virtual environment.
91
- 3. Run `poetry lock` to create a lock file if you haven't done it yet.
92
- 4. Run `poetry install` to install the `gllm-core` requirements for the first time.
93
- 5. Run `poetry update` if you update any dependency module version at `pyproject.toml`.
94
-
95
-
96
- ## Contributing
97
- Please refer to this [Python Style Guide](https://docs.google.com/document/d/1uRggCrHnVfDPBnG641FyQBwUwLoFw0kTzNqRm92vUwM/edit?usp=sharing)
98
- to get information about code style, documentation standard, and SCA that you need to use when contributing to this project
99
-
100
- ### Getting Started with Development
101
- 1. Clone the repository and navigate to the gllm-core directory
102
- 2. Run `make setup` to set up your development environment
103
- 3. Run `which python` to get the path to be referenced at Visual Studio Code interpreter path (`Ctrl`+`Shift`+`P` or `Cmd`+`Shift`+`P`)
104
- 4. Try running the unit test to see if it's working:
105
- ```bash
106
- poetry run pytest -s tests/unit_tests/
107
- ```
108
- 5. When you want to update the dependencies, run `make update`