openai-sdk-helpers 0.4.2__py3-none-any.whl → 0.5.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.
- openai_sdk_helpers/__init__.py +45 -41
- openai_sdk_helpers/agent/__init__.py +4 -6
- openai_sdk_helpers/agent/base.py +110 -191
- openai_sdk_helpers/agent/{config.py → configuration.py} +24 -32
- openai_sdk_helpers/agent/{coordination.py → coordinator.py} +22 -23
- openai_sdk_helpers/agent/runner.py +3 -45
- openai_sdk_helpers/agent/search/base.py +54 -76
- openai_sdk_helpers/agent/search/vector.py +92 -108
- openai_sdk_helpers/agent/search/web.py +104 -82
- openai_sdk_helpers/agent/summarizer.py +22 -28
- openai_sdk_helpers/agent/translator.py +22 -24
- openai_sdk_helpers/agent/{validation.py → validator.py} +19 -23
- openai_sdk_helpers/cli.py +8 -22
- openai_sdk_helpers/environment.py +8 -13
- openai_sdk_helpers/errors.py +9 -0
- openai_sdk_helpers/extract/__init__.py +23 -0
- openai_sdk_helpers/extract/extractor.py +157 -0
- openai_sdk_helpers/extract/generator.py +476 -0
- openai_sdk_helpers/prompt/extractor_config_agent_instructions.jinja +6 -0
- openai_sdk_helpers/prompt/extractor_config_generator.jinja +37 -0
- openai_sdk_helpers/prompt/extractor_config_generator_instructions.jinja +9 -0
- openai_sdk_helpers/prompt/extractor_prompt_optimizer_agent_instructions.jinja +4 -0
- openai_sdk_helpers/prompt/extractor_prompt_optimizer_request.jinja +11 -0
- openai_sdk_helpers/prompt/vector_planner.jinja +7 -0
- openai_sdk_helpers/prompt/vector_search.jinja +6 -0
- openai_sdk_helpers/prompt/vector_writer.jinja +7 -0
- openai_sdk_helpers/response/__init__.py +3 -7
- openai_sdk_helpers/response/base.py +89 -98
- openai_sdk_helpers/response/{config.py → configuration.py} +45 -20
- openai_sdk_helpers/response/files.py +2 -0
- openai_sdk_helpers/response/planner.py +1 -1
- openai_sdk_helpers/response/prompter.py +1 -1
- openai_sdk_helpers/response/runner.py +1 -48
- openai_sdk_helpers/response/tool_call.py +0 -141
- openai_sdk_helpers/response/vector_store.py +8 -5
- openai_sdk_helpers/streamlit_app/__init__.py +1 -1
- openai_sdk_helpers/streamlit_app/app.py +17 -18
- openai_sdk_helpers/streamlit_app/{config.py → configuration.py} +13 -13
- openai_sdk_helpers/structure/__init__.py +16 -0
- openai_sdk_helpers/structure/base.py +239 -278
- openai_sdk_helpers/structure/extraction.py +1228 -0
- openai_sdk_helpers/structure/plan/plan.py +0 -20
- openai_sdk_helpers/structure/plan/task.py +0 -33
- openai_sdk_helpers/structure/prompt.py +16 -0
- openai_sdk_helpers/structure/responses.py +2 -2
- openai_sdk_helpers/structure/web_search.py +0 -10
- openai_sdk_helpers/tools.py +346 -99
- openai_sdk_helpers/types.py +3 -3
- openai_sdk_helpers/utils/__init__.py +9 -6
- openai_sdk_helpers/utils/json/base_model.py +316 -33
- openai_sdk_helpers/utils/json/data_class.py +1 -1
- openai_sdk_helpers/utils/langextract.py +194 -0
- openai_sdk_helpers/utils/registry.py +19 -15
- openai_sdk_helpers/vector_storage/storage.py +1 -1
- {openai_sdk_helpers-0.4.2.dist-info → openai_sdk_helpers-0.5.0.dist-info}/METADATA +25 -11
- openai_sdk_helpers-0.5.0.dist-info/RECORD +95 -0
- openai_sdk_helpers/agent/prompt_utils.py +0 -15
- openai_sdk_helpers/context_manager.py +0 -241
- openai_sdk_helpers/deprecation.py +0 -167
- openai_sdk_helpers/retry.py +0 -175
- openai_sdk_helpers/streamlit_app/streamlit_web_search.py +0 -75
- openai_sdk_helpers/utils/deprecation.py +0 -167
- openai_sdk_helpers-0.4.2.dist-info/RECORD +0 -88
- /openai_sdk_helpers/{logging_config.py → logging.py} +0 -0
- /openai_sdk_helpers/{config.py → settings.py} +0 -0
- {openai_sdk_helpers-0.4.2.dist-info → openai_sdk_helpers-0.5.0.dist-info}/WHEEL +0 -0
- {openai_sdk_helpers-0.4.2.dist-info → openai_sdk_helpers-0.5.0.dist-info}/entry_points.txt +0 -0
- {openai_sdk_helpers-0.4.2.dist-info → openai_sdk_helpers-0.5.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,167 +0,0 @@
|
|
|
1
|
-
"""Deprecation utilities for managing deprecated features.
|
|
2
|
-
|
|
3
|
-
This module provides infrastructure for marking and managing deprecated
|
|
4
|
-
functions, classes, and features with consistent warning messages.
|
|
5
|
-
|
|
6
|
-
Functions
|
|
7
|
-
---------
|
|
8
|
-
deprecated
|
|
9
|
-
Decorator to mark functions or classes as deprecated.
|
|
10
|
-
warn_deprecated
|
|
11
|
-
Emit a deprecation warning with optional custom message.
|
|
12
|
-
|
|
13
|
-
Classes
|
|
14
|
-
-------
|
|
15
|
-
DeprecationHelper
|
|
16
|
-
Utility class for managing deprecation warnings and versions.
|
|
17
|
-
"""
|
|
18
|
-
|
|
19
|
-
from __future__ import annotations
|
|
20
|
-
|
|
21
|
-
import functools
|
|
22
|
-
import warnings
|
|
23
|
-
from typing import Any, Callable, TypeVar
|
|
24
|
-
|
|
25
|
-
F = TypeVar("F", bound=Callable[..., Any])
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
class DeprecationHelper:
|
|
29
|
-
"""Utility class for managing deprecation warnings.
|
|
30
|
-
|
|
31
|
-
Provides consistent formatting and control of deprecation warnings
|
|
32
|
-
across the package.
|
|
33
|
-
|
|
34
|
-
Methods
|
|
35
|
-
-------
|
|
36
|
-
warn
|
|
37
|
-
Emit a deprecation warning with standard formatting.
|
|
38
|
-
"""
|
|
39
|
-
|
|
40
|
-
@staticmethod
|
|
41
|
-
def warn(
|
|
42
|
-
feature_name: str,
|
|
43
|
-
removal_version: str,
|
|
44
|
-
alternative: str | None = None,
|
|
45
|
-
extra_message: str | None = None,
|
|
46
|
-
) -> None:
|
|
47
|
-
"""Emit a deprecation warning for a feature.
|
|
48
|
-
|
|
49
|
-
Parameters
|
|
50
|
-
----------
|
|
51
|
-
feature_name : str
|
|
52
|
-
Name of the deprecated feature (e.g., "MyClass.old_method").
|
|
53
|
-
removal_version : str
|
|
54
|
-
Version in which the feature will be removed.
|
|
55
|
-
alternative : str, optional
|
|
56
|
-
Recommended alternative to use instead.
|
|
57
|
-
extra_message : str, optional
|
|
58
|
-
Additional context or migration instructions.
|
|
59
|
-
|
|
60
|
-
Raises
|
|
61
|
-
------
|
|
62
|
-
DeprecationWarning
|
|
63
|
-
Always issues a DeprecationWarning to stderr.
|
|
64
|
-
"""
|
|
65
|
-
msg = f"{feature_name} is deprecated and will be removed in version {removal_version}."
|
|
66
|
-
if alternative:
|
|
67
|
-
msg += f" Use {alternative} instead."
|
|
68
|
-
if extra_message:
|
|
69
|
-
msg += f" {extra_message}"
|
|
70
|
-
|
|
71
|
-
warnings.warn(msg, DeprecationWarning, stacklevel=3)
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
def deprecated(
|
|
75
|
-
removal_version: str,
|
|
76
|
-
alternative: str | None = None,
|
|
77
|
-
extra_message: str | None = None,
|
|
78
|
-
) -> Callable[[F], F]:
|
|
79
|
-
"""Mark a function or class as deprecated.
|
|
80
|
-
|
|
81
|
-
Parameters
|
|
82
|
-
----------
|
|
83
|
-
removal_version : str
|
|
84
|
-
Version in which the decorated feature will be removed.
|
|
85
|
-
alternative : str, optional
|
|
86
|
-
Recommended alternative to use instead.
|
|
87
|
-
extra_message : str, optional
|
|
88
|
-
Additional context or migration instructions.
|
|
89
|
-
|
|
90
|
-
Returns
|
|
91
|
-
-------
|
|
92
|
-
Callable
|
|
93
|
-
Decorator function that wraps the target function or class.
|
|
94
|
-
|
|
95
|
-
Examples
|
|
96
|
-
--------
|
|
97
|
-
>>> @deprecated("1.0.0", "new_function")
|
|
98
|
-
... def old_function():
|
|
99
|
-
... pass
|
|
100
|
-
|
|
101
|
-
>>> class OldClass:
|
|
102
|
-
... @deprecated("1.0.0", "NewClass")
|
|
103
|
-
... def old_method(self):
|
|
104
|
-
... pass
|
|
105
|
-
"""
|
|
106
|
-
|
|
107
|
-
def decorator(func_or_class: F) -> F:
|
|
108
|
-
feature_name = f"{func_or_class.__module__}.{func_or_class.__qualname__}"
|
|
109
|
-
|
|
110
|
-
if isinstance(func_or_class, type):
|
|
111
|
-
# Handle class deprecation
|
|
112
|
-
original_init = func_or_class.__init__
|
|
113
|
-
|
|
114
|
-
@functools.wraps(original_init)
|
|
115
|
-
def new_init(self: Any, *args: Any, **kwargs: Any) -> None:
|
|
116
|
-
DeprecationHelper.warn(
|
|
117
|
-
feature_name,
|
|
118
|
-
removal_version,
|
|
119
|
-
alternative,
|
|
120
|
-
extra_message,
|
|
121
|
-
)
|
|
122
|
-
original_init(self, *args, **kwargs)
|
|
123
|
-
|
|
124
|
-
func_or_class.__init__ = new_init
|
|
125
|
-
else:
|
|
126
|
-
# Handle function deprecation
|
|
127
|
-
@functools.wraps(func_or_class)
|
|
128
|
-
def wrapper(*args: Any, **kwargs: Any) -> Any:
|
|
129
|
-
DeprecationHelper.warn(
|
|
130
|
-
feature_name,
|
|
131
|
-
removal_version,
|
|
132
|
-
alternative,
|
|
133
|
-
extra_message,
|
|
134
|
-
)
|
|
135
|
-
return func_or_class(*args, **kwargs)
|
|
136
|
-
|
|
137
|
-
return wrapper # type: ignore
|
|
138
|
-
|
|
139
|
-
return func_or_class # type: ignore[return-value]
|
|
140
|
-
|
|
141
|
-
return decorator
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
def warn_deprecated(
|
|
145
|
-
feature_name: str,
|
|
146
|
-
removal_version: str,
|
|
147
|
-
alternative: str | None = None,
|
|
148
|
-
extra_message: str | None = None,
|
|
149
|
-
) -> None:
|
|
150
|
-
"""Issue a deprecation warning.
|
|
151
|
-
|
|
152
|
-
Parameters
|
|
153
|
-
----------
|
|
154
|
-
feature_name : str
|
|
155
|
-
Name of the deprecated feature.
|
|
156
|
-
removal_version : str
|
|
157
|
-
Version in which the feature will be removed.
|
|
158
|
-
alternative : str, optional
|
|
159
|
-
Recommended alternative to use instead.
|
|
160
|
-
extra_message : str, optional
|
|
161
|
-
Additional context or migration instructions.
|
|
162
|
-
|
|
163
|
-
Examples
|
|
164
|
-
--------
|
|
165
|
-
>>> warn_deprecated("old_config_key", "1.0.0", "new_config_key")
|
|
166
|
-
"""
|
|
167
|
-
DeprecationHelper.warn(feature_name, removal_version, alternative, extra_message)
|
openai_sdk_helpers/retry.py
DELETED
|
@@ -1,175 +0,0 @@
|
|
|
1
|
-
"""Retry decorators with exponential backoff for API operations.
|
|
2
|
-
|
|
3
|
-
Provides decorators for retrying async and sync functions with
|
|
4
|
-
exponential backoff and jitter when rate limiting or transient
|
|
5
|
-
errors occur.
|
|
6
|
-
"""
|
|
7
|
-
|
|
8
|
-
import asyncio
|
|
9
|
-
import logging
|
|
10
|
-
import random
|
|
11
|
-
import time
|
|
12
|
-
from functools import wraps
|
|
13
|
-
from typing import Any, Callable, ParamSpec, TypeVar
|
|
14
|
-
|
|
15
|
-
from openai import APIError, RateLimitError
|
|
16
|
-
|
|
17
|
-
from openai_sdk_helpers.errors import AsyncExecutionError
|
|
18
|
-
from openai_sdk_helpers.logging_config import log
|
|
19
|
-
|
|
20
|
-
P = ParamSpec("P")
|
|
21
|
-
T = TypeVar("T")
|
|
22
|
-
|
|
23
|
-
# Default retry configuration constants
|
|
24
|
-
DEFAULT_MAX_RETRIES = 3
|
|
25
|
-
DEFAULT_BASE_DELAY = 1.0
|
|
26
|
-
DEFAULT_MAX_DELAY = 60.0
|
|
27
|
-
|
|
28
|
-
# HTTP status codes for transient errors
|
|
29
|
-
TRANSIENT_HTTP_STATUS_CODES = frozenset({408, 429, 500, 502, 503})
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
def with_exponential_backoff(
|
|
33
|
-
max_retries: int = DEFAULT_MAX_RETRIES,
|
|
34
|
-
base_delay: float = DEFAULT_BASE_DELAY,
|
|
35
|
-
max_delay: float = DEFAULT_MAX_DELAY,
|
|
36
|
-
) -> Callable[[Callable[P, T]], Callable[P, T]]:
|
|
37
|
-
"""Decorate functions with exponential backoff on transient errors.
|
|
38
|
-
|
|
39
|
-
Retries on RateLimitError or transient API errors (5xx, 408, 429).
|
|
40
|
-
Uses exponential backoff with jitter to avoid thundering herd.
|
|
41
|
-
|
|
42
|
-
Parameters
|
|
43
|
-
----------
|
|
44
|
-
max_retries : int
|
|
45
|
-
Maximum number of retry attempts (total attempts = max_retries + 1).
|
|
46
|
-
Default is 3.
|
|
47
|
-
base_delay : float
|
|
48
|
-
Initial delay in seconds before first retry. Default is 1.0.
|
|
49
|
-
max_delay : float
|
|
50
|
-
Maximum delay in seconds between retries. Default is 60.0.
|
|
51
|
-
|
|
52
|
-
Returns
|
|
53
|
-
-------
|
|
54
|
-
Callable
|
|
55
|
-
Decorator function.
|
|
56
|
-
|
|
57
|
-
Examples
|
|
58
|
-
--------
|
|
59
|
-
>>> @with_exponential_backoff(max_retries=3, base_delay=1.0)
|
|
60
|
-
... def call_api(query: str) -> str:
|
|
61
|
-
... # API call that may fail with rate limiting
|
|
62
|
-
... return client.call(query)
|
|
63
|
-
"""
|
|
64
|
-
|
|
65
|
-
def decorator(func: Callable[P, T]) -> Callable[P, T]:
|
|
66
|
-
"""Apply retry logic to function."""
|
|
67
|
-
if asyncio.iscoroutinefunction(func):
|
|
68
|
-
|
|
69
|
-
@wraps(func)
|
|
70
|
-
async def async_wrapper(*args: P.args, **kwargs: P.kwargs) -> T:
|
|
71
|
-
"""Async wrapper with retry logic."""
|
|
72
|
-
last_exc: Exception | None = None
|
|
73
|
-
for attempt in range(max_retries + 1):
|
|
74
|
-
try:
|
|
75
|
-
return await func(*args, **kwargs)
|
|
76
|
-
except RateLimitError as exc:
|
|
77
|
-
last_exc = exc
|
|
78
|
-
if attempt >= max_retries:
|
|
79
|
-
raise
|
|
80
|
-
delay = min(
|
|
81
|
-
base_delay * (2**attempt) + random.uniform(0, 1),
|
|
82
|
-
max_delay,
|
|
83
|
-
)
|
|
84
|
-
log(
|
|
85
|
-
f"Rate limited on {func.__name__}, retrying in "
|
|
86
|
-
f"{delay:.2f}s (attempt {attempt + 1}/{max_retries + 1})",
|
|
87
|
-
level=logging.WARNING,
|
|
88
|
-
)
|
|
89
|
-
await asyncio.sleep(delay)
|
|
90
|
-
except APIError as exc:
|
|
91
|
-
last_exc = exc
|
|
92
|
-
status_code: int | None = getattr(exc, "status_code", None)
|
|
93
|
-
# Only retry on transient errors
|
|
94
|
-
if (
|
|
95
|
-
not status_code
|
|
96
|
-
or status_code not in TRANSIENT_HTTP_STATUS_CODES
|
|
97
|
-
):
|
|
98
|
-
raise
|
|
99
|
-
if attempt >= max_retries:
|
|
100
|
-
raise
|
|
101
|
-
delay = min(
|
|
102
|
-
base_delay * (2**attempt),
|
|
103
|
-
max_delay,
|
|
104
|
-
)
|
|
105
|
-
log(
|
|
106
|
-
f"Transient API error on {func.__name__}: "
|
|
107
|
-
f"{status_code}, retrying in {delay:.2f}s "
|
|
108
|
-
f"(attempt {attempt + 1}/{max_retries + 1})",
|
|
109
|
-
level=logging.WARNING,
|
|
110
|
-
)
|
|
111
|
-
await asyncio.sleep(delay)
|
|
112
|
-
|
|
113
|
-
# Should never reach here, but handle edge case
|
|
114
|
-
if last_exc:
|
|
115
|
-
raise last_exc
|
|
116
|
-
raise AsyncExecutionError(
|
|
117
|
-
f"Unexpected state in {func.__name__} after retries"
|
|
118
|
-
)
|
|
119
|
-
|
|
120
|
-
return async_wrapper # type: ignore
|
|
121
|
-
|
|
122
|
-
@wraps(func)
|
|
123
|
-
def sync_wrapper(*args: P.args, **kwargs: P.kwargs) -> T:
|
|
124
|
-
"""Sync wrapper with retry logic."""
|
|
125
|
-
last_exc: Exception | None = None
|
|
126
|
-
for attempt in range(max_retries + 1):
|
|
127
|
-
try:
|
|
128
|
-
return func(*args, **kwargs)
|
|
129
|
-
except RateLimitError as exc:
|
|
130
|
-
last_exc = exc
|
|
131
|
-
if attempt >= max_retries:
|
|
132
|
-
raise
|
|
133
|
-
delay = min(
|
|
134
|
-
base_delay * (2**attempt) + random.uniform(0, 1),
|
|
135
|
-
max_delay,
|
|
136
|
-
)
|
|
137
|
-
log(
|
|
138
|
-
f"Rate limited on {func.__name__}, retrying in "
|
|
139
|
-
f"{delay:.2f}s (attempt {attempt + 1}/{max_retries + 1})",
|
|
140
|
-
level=logging.WARNING,
|
|
141
|
-
)
|
|
142
|
-
time.sleep(delay)
|
|
143
|
-
except APIError as exc:
|
|
144
|
-
last_exc = exc
|
|
145
|
-
status_code: int | None = getattr(exc, "status_code", None)
|
|
146
|
-
# Only retry on transient errors
|
|
147
|
-
if (
|
|
148
|
-
not status_code
|
|
149
|
-
or status_code not in TRANSIENT_HTTP_STATUS_CODES
|
|
150
|
-
):
|
|
151
|
-
raise
|
|
152
|
-
if attempt >= max_retries:
|
|
153
|
-
raise
|
|
154
|
-
delay = min(
|
|
155
|
-
base_delay * (2**attempt),
|
|
156
|
-
max_delay,
|
|
157
|
-
)
|
|
158
|
-
log(
|
|
159
|
-
f"Transient API error on {func.__name__}: "
|
|
160
|
-
f"{status_code}, retrying in {delay:.2f}s "
|
|
161
|
-
f"(attempt {attempt + 1}/{max_retries + 1})",
|
|
162
|
-
level=logging.WARNING,
|
|
163
|
-
)
|
|
164
|
-
time.sleep(delay)
|
|
165
|
-
|
|
166
|
-
# Should never reach here, but handle edge case
|
|
167
|
-
if last_exc:
|
|
168
|
-
raise last_exc
|
|
169
|
-
raise AsyncExecutionError(
|
|
170
|
-
f"Unexpected state in {func.__name__} after retries"
|
|
171
|
-
)
|
|
172
|
-
|
|
173
|
-
return sync_wrapper # type: ignore
|
|
174
|
-
|
|
175
|
-
return decorator
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
"""Developer configuration for the example Streamlit chat app."""
|
|
2
|
-
|
|
3
|
-
import json
|
|
4
|
-
from openai_sdk_helpers.agent.search.web import WebAgentSearch
|
|
5
|
-
from openai_sdk_helpers.config import OpenAISettings
|
|
6
|
-
from openai_sdk_helpers.response.base import ResponseBase
|
|
7
|
-
from openai_sdk_helpers.structure.web_search import WebSearchStructure
|
|
8
|
-
from openai_sdk_helpers.structure.prompt import PromptStructure
|
|
9
|
-
from openai_sdk_helpers.tools import ToolSpec, build_tool_definitions
|
|
10
|
-
from openai_sdk_helpers.utils import coerce_jsonable, customJSONEncoder
|
|
11
|
-
from openai_sdk_helpers.environment import DEFAULT_MODEL
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
class StreamlitWebSearch(ResponseBase[WebSearchStructure]):
|
|
15
|
-
"""Response tuned for a generic chat experience with structured output.
|
|
16
|
-
|
|
17
|
-
Methods
|
|
18
|
-
-------
|
|
19
|
-
__init__()
|
|
20
|
-
Configure a general-purpose response session using OpenAI settings.
|
|
21
|
-
"""
|
|
22
|
-
|
|
23
|
-
def __init__(self) -> None:
|
|
24
|
-
settings = OpenAISettings.from_env()
|
|
25
|
-
if not settings.default_model:
|
|
26
|
-
settings = settings.model_copy(update={"default_model": DEFAULT_MODEL})
|
|
27
|
-
super().__init__(
|
|
28
|
-
name="streamlit_web_search",
|
|
29
|
-
instructions="Perform web searches and generate reports.",
|
|
30
|
-
tools=build_tool_definitions(
|
|
31
|
-
[
|
|
32
|
-
ToolSpec(
|
|
33
|
-
structure=PromptStructure,
|
|
34
|
-
tool_name="perform_search",
|
|
35
|
-
tool_description="Tool to perform web searches and generate reports.",
|
|
36
|
-
output_structure=WebSearchStructure,
|
|
37
|
-
)
|
|
38
|
-
]
|
|
39
|
-
),
|
|
40
|
-
output_structure=WebSearchStructure,
|
|
41
|
-
tool_handlers={"perform_search": perform_search},
|
|
42
|
-
openai_settings=settings,
|
|
43
|
-
)
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
async def perform_search(tool) -> str:
|
|
47
|
-
"""Perform a web search and return structured results."""
|
|
48
|
-
structured_data = PromptStructure.from_tool_arguments(tool.arguments)
|
|
49
|
-
web_result = await WebAgentSearch(default_model=DEFAULT_MODEL).run_agent_async(
|
|
50
|
-
structured_data.prompt
|
|
51
|
-
)
|
|
52
|
-
payload = coerce_jsonable(web_result)
|
|
53
|
-
return json.dumps(payload, cls=customJSONEncoder)
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
APP_CONFIG = {
|
|
57
|
-
"response": StreamlitWebSearch,
|
|
58
|
-
"display_title": "Web Search Assistant",
|
|
59
|
-
"description": "Config-driven chat experience for performing web searches.",
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
if __name__ == "__main__":
|
|
63
|
-
web_search_instance = StreamlitWebSearch()
|
|
64
|
-
import asyncio
|
|
65
|
-
|
|
66
|
-
result = asyncio.run(
|
|
67
|
-
web_search_instance.run_async("What are the 2026 advancements in AI?")
|
|
68
|
-
)
|
|
69
|
-
if result:
|
|
70
|
-
print(web_search_instance.get_last_tool_message())
|
|
71
|
-
else:
|
|
72
|
-
print("No result returned.")
|
|
73
|
-
filepath = f"./data/{web_search_instance.name}.{web_search_instance.uuid}.json"
|
|
74
|
-
web_search_instance.save(filepath)
|
|
75
|
-
web_search_instance.close()
|
|
@@ -1,167 +0,0 @@
|
|
|
1
|
-
"""Deprecation utilities for managing deprecated features.
|
|
2
|
-
|
|
3
|
-
This module provides infrastructure for marking and managing deprecated
|
|
4
|
-
functions, classes, and features with consistent warning messages.
|
|
5
|
-
|
|
6
|
-
Functions
|
|
7
|
-
---------
|
|
8
|
-
deprecated
|
|
9
|
-
Decorator to mark functions or classes as deprecated.
|
|
10
|
-
warn_deprecated
|
|
11
|
-
Emit a deprecation warning with optional custom message.
|
|
12
|
-
|
|
13
|
-
Classes
|
|
14
|
-
-------
|
|
15
|
-
DeprecationHelper
|
|
16
|
-
Utility class for managing deprecation warnings and versions.
|
|
17
|
-
"""
|
|
18
|
-
|
|
19
|
-
from __future__ import annotations
|
|
20
|
-
|
|
21
|
-
import functools
|
|
22
|
-
import warnings
|
|
23
|
-
from typing import Any, Callable, TypeVar
|
|
24
|
-
|
|
25
|
-
F = TypeVar("F", bound=Callable[..., Any])
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
class DeprecationHelper:
|
|
29
|
-
"""Utility class for managing deprecation warnings.
|
|
30
|
-
|
|
31
|
-
Provides consistent formatting and control of deprecation warnings
|
|
32
|
-
across the package.
|
|
33
|
-
|
|
34
|
-
Methods
|
|
35
|
-
-------
|
|
36
|
-
warn
|
|
37
|
-
Emit a deprecation warning with standard formatting.
|
|
38
|
-
"""
|
|
39
|
-
|
|
40
|
-
@staticmethod
|
|
41
|
-
def warn(
|
|
42
|
-
feature_name: str,
|
|
43
|
-
removal_version: str,
|
|
44
|
-
alternative: str | None = None,
|
|
45
|
-
extra_message: str | None = None,
|
|
46
|
-
) -> None:
|
|
47
|
-
"""Emit a deprecation warning for a feature.
|
|
48
|
-
|
|
49
|
-
Parameters
|
|
50
|
-
----------
|
|
51
|
-
feature_name : str
|
|
52
|
-
Name of the deprecated feature (e.g., "MyClass.old_method").
|
|
53
|
-
removal_version : str
|
|
54
|
-
Version in which the feature will be removed.
|
|
55
|
-
alternative : str, optional
|
|
56
|
-
Recommended alternative to use instead.
|
|
57
|
-
extra_message : str, optional
|
|
58
|
-
Additional context or migration instructions.
|
|
59
|
-
|
|
60
|
-
Raises
|
|
61
|
-
------
|
|
62
|
-
DeprecationWarning
|
|
63
|
-
Always issues a DeprecationWarning to stderr.
|
|
64
|
-
"""
|
|
65
|
-
msg = f"{feature_name} is deprecated and will be removed in version {removal_version}."
|
|
66
|
-
if alternative:
|
|
67
|
-
msg += f" Use {alternative} instead."
|
|
68
|
-
if extra_message:
|
|
69
|
-
msg += f" {extra_message}"
|
|
70
|
-
|
|
71
|
-
warnings.warn(msg, DeprecationWarning, stacklevel=3)
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
def deprecated(
|
|
75
|
-
removal_version: str,
|
|
76
|
-
alternative: str | None = None,
|
|
77
|
-
extra_message: str | None = None,
|
|
78
|
-
) -> Callable[[F], F]:
|
|
79
|
-
"""Mark a function or class as deprecated.
|
|
80
|
-
|
|
81
|
-
Parameters
|
|
82
|
-
----------
|
|
83
|
-
removal_version : str
|
|
84
|
-
Version in which the decorated feature will be removed.
|
|
85
|
-
alternative : str, optional
|
|
86
|
-
Recommended alternative to use instead.
|
|
87
|
-
extra_message : str, optional
|
|
88
|
-
Additional context or migration instructions.
|
|
89
|
-
|
|
90
|
-
Returns
|
|
91
|
-
-------
|
|
92
|
-
Callable
|
|
93
|
-
Decorator function that wraps the target function or class.
|
|
94
|
-
|
|
95
|
-
Examples
|
|
96
|
-
--------
|
|
97
|
-
>>> @deprecated("1.0.0", "new_function")
|
|
98
|
-
... def old_function():
|
|
99
|
-
... pass
|
|
100
|
-
|
|
101
|
-
>>> class OldClass:
|
|
102
|
-
... @deprecated("1.0.0", "NewClass")
|
|
103
|
-
... def old_method(self):
|
|
104
|
-
... pass
|
|
105
|
-
"""
|
|
106
|
-
|
|
107
|
-
def decorator(func_or_class: F) -> F:
|
|
108
|
-
feature_name = f"{func_or_class.__module__}.{func_or_class.__qualname__}"
|
|
109
|
-
|
|
110
|
-
if isinstance(func_or_class, type):
|
|
111
|
-
# Handle class deprecation
|
|
112
|
-
original_init = func_or_class.__init__
|
|
113
|
-
|
|
114
|
-
@functools.wraps(original_init)
|
|
115
|
-
def new_init(self: Any, *args: Any, **kwargs: Any) -> None:
|
|
116
|
-
DeprecationHelper.warn(
|
|
117
|
-
feature_name,
|
|
118
|
-
removal_version,
|
|
119
|
-
alternative,
|
|
120
|
-
extra_message,
|
|
121
|
-
)
|
|
122
|
-
original_init(self, *args, **kwargs)
|
|
123
|
-
|
|
124
|
-
func_or_class.__init__ = new_init
|
|
125
|
-
else:
|
|
126
|
-
# Handle function deprecation
|
|
127
|
-
@functools.wraps(func_or_class)
|
|
128
|
-
def wrapper(*args: Any, **kwargs: Any) -> Any:
|
|
129
|
-
DeprecationHelper.warn(
|
|
130
|
-
feature_name,
|
|
131
|
-
removal_version,
|
|
132
|
-
alternative,
|
|
133
|
-
extra_message,
|
|
134
|
-
)
|
|
135
|
-
return func_or_class(*args, **kwargs)
|
|
136
|
-
|
|
137
|
-
return wrapper # type: ignore
|
|
138
|
-
|
|
139
|
-
return func_or_class # type: ignore[return-value]
|
|
140
|
-
|
|
141
|
-
return decorator
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
def warn_deprecated(
|
|
145
|
-
feature_name: str,
|
|
146
|
-
removal_version: str,
|
|
147
|
-
alternative: str | None = None,
|
|
148
|
-
extra_message: str | None = None,
|
|
149
|
-
) -> None:
|
|
150
|
-
"""Issue a deprecation warning.
|
|
151
|
-
|
|
152
|
-
Parameters
|
|
153
|
-
----------
|
|
154
|
-
feature_name : str
|
|
155
|
-
Name of the deprecated feature.
|
|
156
|
-
removal_version : str
|
|
157
|
-
Version in which the feature will be removed.
|
|
158
|
-
alternative : str, optional
|
|
159
|
-
Recommended alternative to use instead.
|
|
160
|
-
extra_message : str, optional
|
|
161
|
-
Additional context or migration instructions.
|
|
162
|
-
|
|
163
|
-
Examples
|
|
164
|
-
--------
|
|
165
|
-
>>> warn_deprecated("old_config_key", "1.0.0", "new_config_key")
|
|
166
|
-
"""
|
|
167
|
-
DeprecationHelper.warn(feature_name, removal_version, alternative, extra_message)
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
openai_sdk_helpers/__init__.py,sha256=19MEuQFgMqr6YqEc0QdmNe5YTg5JJVVCIisrYLFbqGk,4766
|
|
2
|
-
openai_sdk_helpers/cli.py,sha256=YnQz-IcAqcBdh8eCCxVYa7NHDuHgHaU-PJ4FWPvkz58,8278
|
|
3
|
-
openai_sdk_helpers/config.py,sha256=xK_u0YNKgtPrLrZrVr4F4k0CvSuYbsmkqqw9mCMdyF8,10932
|
|
4
|
-
openai_sdk_helpers/context_manager.py,sha256=QqlrtenwKoz2krY0IzuToKdTX1HptUYtIEylxieybgY,6633
|
|
5
|
-
openai_sdk_helpers/deprecation.py,sha256=VF0VDDegawYhsu5f-vE6dop9ob-jv8egxsm0KsPvP9E,4753
|
|
6
|
-
openai_sdk_helpers/environment.py,sha256=9SYGAgf6dp0aknDdvcnSD40vJWONZsVhO-i8Ayo3jpg,1906
|
|
7
|
-
openai_sdk_helpers/errors.py,sha256=0TLrcpRXPBvk2KlrU5I1VAQl-sYy-d15h_SMDkEawvI,2757
|
|
8
|
-
openai_sdk_helpers/files_api.py,sha256=uMKHvGg1Od0J95Izl3AG9ofQYq8EDJXEty7zP0oKjJM,12569
|
|
9
|
-
openai_sdk_helpers/logging_config.py,sha256=JcR0FTWht1tYdwD-bXH835pr0JV0RwHfY3poruiZGHM,795
|
|
10
|
-
openai_sdk_helpers/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
11
|
-
openai_sdk_helpers/retry.py,sha256=J10oQYphfzDXm3BnLoXwxk7PAhN93TC2LQOv0VDGOwI,6533
|
|
12
|
-
openai_sdk_helpers/tools.py,sha256=Awj5htt1ImBbNToM1u6qdrIZ-7MiPZAXZ_oKKiWivy8,10547
|
|
13
|
-
openai_sdk_helpers/types.py,sha256=xzldCRfwCZ3rZl18IBmfgA-PVdoZKSWNrlSIhirumSo,1451
|
|
14
|
-
openai_sdk_helpers/agent/__init__.py,sha256=39nYVK8okZv_srC86HStwtKirkH1_FXkacoqfV73naA,1070
|
|
15
|
-
openai_sdk_helpers/agent/base.py,sha256=iv14LURB5PFcbRHuP1lWyj8JbKvDqM1m1Tf1mOi6CA8,27080
|
|
16
|
-
openai_sdk_helpers/agent/config.py,sha256=NlSE1T1T3fUOu4GJzwjmrVGxB1aI969yYg6sFXgwHCI,14611
|
|
17
|
-
openai_sdk_helpers/agent/coordination.py,sha256=VTzyl4RV1q4ugiyFW4Fj7pOAVVO0bMRD63PfQRDwfoQ,18030
|
|
18
|
-
openai_sdk_helpers/agent/prompt_utils.py,sha256=-1M66tqQxh9wWCFg6X-K7cCcqauca3yA04ZjvOpN3bA,337
|
|
19
|
-
openai_sdk_helpers/agent/runner.py,sha256=aOVN1OYKK5_u7oFBqRCOOeTgcb-lLl4kZGxuPLmJrMw,4884
|
|
20
|
-
openai_sdk_helpers/agent/summarizer.py,sha256=lg_PLB1DSHox3PNDgiCzvCPM5VoCUbKEMGy1gqUvl8Y,4168
|
|
21
|
-
openai_sdk_helpers/agent/translator.py,sha256=3u7er1GhUGdy7OMa3A_vyqFFZfev3XBCZW_6w5OwYVc,6286
|
|
22
|
-
openai_sdk_helpers/agent/utils.py,sha256=DTD5foCqGYfXf13F2bZMYIQROl7SbDSy5GDPGi0Zl-0,1089
|
|
23
|
-
openai_sdk_helpers/agent/validation.py,sha256=6NHZIFaUOqRZeYqvRBnDc_uApAV3YHJnOhLHKbVUsi0,5094
|
|
24
|
-
openai_sdk_helpers/agent/search/__init__.py,sha256=LXXzEcX2MU7_htHRdRCGPw0hsr9CrZn0ESii7GZJMBw,806
|
|
25
|
-
openai_sdk_helpers/agent/search/base.py,sha256=VokTw3-V2yxGzm2WzlcvU100h3UaeyGslCFwIgMvJwI,10146
|
|
26
|
-
openai_sdk_helpers/agent/search/vector.py,sha256=A1HskDI6YVd3D9IQncowgiWUy9ptlMlSJhrBRDyqroM,15167
|
|
27
|
-
openai_sdk_helpers/agent/search/web.py,sha256=EQ0Rgcz21Rm9bDGPr8XPlDj34_nH2wnB7ER9rBy48Ak,11199
|
|
28
|
-
openai_sdk_helpers/enums/__init__.py,sha256=aFf79C4JBeLC3kMlJfSpehyjx5uNCtW6eK5rD6ZFfhM,322
|
|
29
|
-
openai_sdk_helpers/enums/base.py,sha256=cNllDtzcgI0_eZYXxFko14yhxwicX6xbeDfz9gFE3qo,2753
|
|
30
|
-
openai_sdk_helpers/prompt/__init__.py,sha256=MOqgKwG9KLqKudoKRlUfLxiSmdOi2aD6hNrWDFqLHkk,418
|
|
31
|
-
openai_sdk_helpers/prompt/base.py,sha256=6X0zeopEvO0ba8207O8Nnj1QvFZEZier7kNNh4qkcmE,7782
|
|
32
|
-
openai_sdk_helpers/prompt/summarizer.jinja,sha256=jliSetWDISbql1EkWi1RB8-L_BXUg8JMkRRsPRHuzbY,309
|
|
33
|
-
openai_sdk_helpers/prompt/translator.jinja,sha256=SZhW8ipEzM-9IA4wyS_r2wIMTAclWrilmk1s46njoL0,291
|
|
34
|
-
openai_sdk_helpers/prompt/validator.jinja,sha256=6t8q_IdxFd3mVBGX6SFKNOert1Wo3YpTOji2SNEbbtE,547
|
|
35
|
-
openai_sdk_helpers/response/__init__.py,sha256=Rh3tBygneOhS-Er_4dtX4Xa69ukvxYv01brq26VpgwQ,1886
|
|
36
|
-
openai_sdk_helpers/response/base.py,sha256=OA1p9h6EIzwt8VCWFXEalaQHOe0_eZDefqs5jQKu-vU,34844
|
|
37
|
-
openai_sdk_helpers/response/config.py,sha256=ugZIP29krecf6JXiwkrc1nBDCdT_C9DSOCdPkLRN4wY,9305
|
|
38
|
-
openai_sdk_helpers/response/files.py,sha256=6iHXeNZg4R08ilQ7D53qIJDQGYPpTLcByAhNJlEwbZ4,13226
|
|
39
|
-
openai_sdk_helpers/response/messages.py,sha256=qX3sW79rLuJEys28zyv5MovZikwGOaLevzdVN0VYMRE,10104
|
|
40
|
-
openai_sdk_helpers/response/planner.py,sha256=OfqrANheofY2155kVVfAWPPAHlnSnhaF0MLUHwNgPBU,333
|
|
41
|
-
openai_sdk_helpers/response/prompter.py,sha256=vaHrNAAB9Z5WYwQeTKfOkAoH6DaFx1aRcywngqr47Pc,337
|
|
42
|
-
openai_sdk_helpers/response/runner.py,sha256=Rg8XmxU5UwxJc3MjPlYlXWDimxy_cjxzefGiruNZK6s,4269
|
|
43
|
-
openai_sdk_helpers/response/tool_call.py,sha256=c9Filh4IG5H_RWuJlYl6KUZDaF7mCjkabFRQMNiz7zM,7422
|
|
44
|
-
openai_sdk_helpers/response/vector_store.py,sha256=cG5Mzdhjw5FsX1phgclIGz2MQ8f8uMKBaage1O2EZQU,3074
|
|
45
|
-
openai_sdk_helpers/streamlit_app/__init__.py,sha256=DIXClgbzncsex2vnXUGjBwvykazx4-Bz089beZiq8vc,805
|
|
46
|
-
openai_sdk_helpers/streamlit_app/app.py,sha256=jNkMQ4zkfojP501qk_vncyLN4TymiDXxA3cXkUvBfsw,17402
|
|
47
|
-
openai_sdk_helpers/streamlit_app/config.py,sha256=t1fylt53eVmnNOfBXwpfDyG-Jji9JBUb0ZyrtUWBZ1s,16594
|
|
48
|
-
openai_sdk_helpers/streamlit_app/streamlit_web_search.py,sha256=-5T22a7XbNDjQxC3pLySH85iAdlqSM2ZrR4ZIIYk_KA,2808
|
|
49
|
-
openai_sdk_helpers/structure/__init__.py,sha256=jROw0IbXYVRD2Eb3dBMsB6amQZrX8X7XSgGh_zjsZWc,3469
|
|
50
|
-
openai_sdk_helpers/structure/agent_blueprint.py,sha256=VyJWkgPNzAYKRDMeR1M4kE6qqQURnwqtrrEn0TRJf0g,9698
|
|
51
|
-
openai_sdk_helpers/structure/base.py,sha256=7JuHxKkLR5gP0RWGQIjOQlvySfain6LrB4-zHb0oFxo,25298
|
|
52
|
-
openai_sdk_helpers/structure/prompt.py,sha256=Pp3j-fOG0SWQO5Ts9zS86n8cveSB6kWzSGHW6J9MlcY,1075
|
|
53
|
-
openai_sdk_helpers/structure/responses.py,sha256=eqCcW4d8lwhUF5kzHMA4FR9uNkaBHl8CuZk7a8YrenI,4868
|
|
54
|
-
openai_sdk_helpers/structure/summary.py,sha256=iP1uffqve18B9HXceP4rV0Ho5AaDZXMmC66tRKDNx3c,3143
|
|
55
|
-
openai_sdk_helpers/structure/translation.py,sha256=rBSzGBX6hGaETD43340z9MbKGsxWekjRD4xEZz67SnI,712
|
|
56
|
-
openai_sdk_helpers/structure/validation.py,sha256=D03rlyBDn22qNjTGaGsjhsk3g50oPmzYMFqycYF2_CU,2409
|
|
57
|
-
openai_sdk_helpers/structure/vector_search.py,sha256=XNQsG6_-c7X6TpXjqWOdKCmqXatX1gwd0zq-hII3cz4,5782
|
|
58
|
-
openai_sdk_helpers/structure/web_search.py,sha256=8ETWc2G1eO3dWkNQrs5rsxvHHyhyG1puEYUVRNCLUYI,4572
|
|
59
|
-
openai_sdk_helpers/structure/plan/__init__.py,sha256=IGr0Tk4inN_8o7fT2N02_FTi6U6l2T9_npcQHAlBwKA,1076
|
|
60
|
-
openai_sdk_helpers/structure/plan/enum.py,sha256=seESSwH-IeeW-9BqIMUQyk3qjtchfU3TDhF9HPDB1OM,3079
|
|
61
|
-
openai_sdk_helpers/structure/plan/helpers.py,sha256=Vc6dBTMFrNWlsaCTpEImEIKjfFq4BSSxNjB4K8dywOQ,5139
|
|
62
|
-
openai_sdk_helpers/structure/plan/plan.py,sha256=CStfSfCdcv7HfLWV_G09xElJvq_kAKi_6JDkB3I7cSI,9663
|
|
63
|
-
openai_sdk_helpers/structure/plan/task.py,sha256=FSdt2OJ_arC60zMoWIUHMT3U1syWM_7svyTpOIwiRSM,4580
|
|
64
|
-
openai_sdk_helpers/structure/plan/types.py,sha256=7y9QEVdZreQUXV7n-R4RoNZzw5HeOVbJGWx9QkSfuNY,418
|
|
65
|
-
openai_sdk_helpers/utils/__init__.py,sha256=8SghfmiFhNhMj8Wuop1SAtEt1F8QJb_r4jhi5DtSCDE,3670
|
|
66
|
-
openai_sdk_helpers/utils/async_utils.py,sha256=9KbPEVfi6IXdbwkTUE0h5DleK8TI7I6P_VPL8UgUv98,3689
|
|
67
|
-
openai_sdk_helpers/utils/coercion.py,sha256=Pq1u7tAbD7kTZ84lK-7Fb9CyYKKKQt4fypG5BlSI6oQ,3774
|
|
68
|
-
openai_sdk_helpers/utils/deprecation.py,sha256=VF0VDDegawYhsu5f-vE6dop9ob-jv8egxsm0KsPvP9E,4753
|
|
69
|
-
openai_sdk_helpers/utils/encoding.py,sha256=oDtlNGZ5p-edXiHW76REs-0-8NXkQNReKJdj6sHLkt8,4615
|
|
70
|
-
openai_sdk_helpers/utils/instructions.py,sha256=trbjxjxv2otQR9VmBsPFk1_CJj8nA85Sgtj_5QmQOKI,942
|
|
71
|
-
openai_sdk_helpers/utils/output_validation.py,sha256=3DC6Hr6vAFx_bQGaLsxkGN_LuKe_MugLpVogMBgG9tc,12621
|
|
72
|
-
openai_sdk_helpers/utils/path_utils.py,sha256=NOSX7553cc8LqxbnvmdYjgDBi5Le2W2LuMINwFsTzyM,1969
|
|
73
|
-
openai_sdk_helpers/utils/registry.py,sha256=m59q6qm2IqXRdvdeKB-7H5tiUs1SB-aXTuyhTsVH5E4,6499
|
|
74
|
-
openai_sdk_helpers/utils/validation.py,sha256=ZjnZNOy5AoFlszRxarNol6YZwfgw6LnwPtkCekZmwAU,7826
|
|
75
|
-
openai_sdk_helpers/utils/json/__init__.py,sha256=wBm1DBgfy_n1uSUcnCPyqBn_cCq41mijjPigSMZJZqg,2118
|
|
76
|
-
openai_sdk_helpers/utils/json/base_model.py,sha256=8j__oKly46RRekmRjwFZjAxBHhZkIjMADcJReKo-QsQ,5100
|
|
77
|
-
openai_sdk_helpers/utils/json/data_class.py,sha256=hffMQQTNTwybuMTOtmKNzxd6kXrVyQen67F5BE_OGqE,6469
|
|
78
|
-
openai_sdk_helpers/utils/json/ref.py,sha256=FqBIRWIw33Up3rFyTlLYljcuUjg43f6Nu5wX3tOXn54,2809
|
|
79
|
-
openai_sdk_helpers/utils/json/utils.py,sha256=iyc25tnObqXQJWPKLZMVts932GArdKer59KuC8aQKsY,5948
|
|
80
|
-
openai_sdk_helpers/vector_storage/__init__.py,sha256=L5LxO09puh9_yBB9IDTvc1CvVkARVkHqYY1KX3inB4c,975
|
|
81
|
-
openai_sdk_helpers/vector_storage/cleanup.py,sha256=ImWIE-9lli-odD8qIARvmeaa0y8ZD4pYYP-kT0O3178,3552
|
|
82
|
-
openai_sdk_helpers/vector_storage/storage.py,sha256=A6zJDicObdSOVSlzhHVxEGq_tKO2_bNcsYi94xsKDNI,23655
|
|
83
|
-
openai_sdk_helpers/vector_storage/types.py,sha256=jTCcOYMeOpZWvcse0z4T3MVs-RBOPC-fqWTBeQrgafU,1639
|
|
84
|
-
openai_sdk_helpers-0.4.2.dist-info/METADATA,sha256=h1-_VwnRxkgrCwRJMEwpqMe3TCeUuMQ0U-PwYoJrJkU,23557
|
|
85
|
-
openai_sdk_helpers-0.4.2.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
86
|
-
openai_sdk_helpers-0.4.2.dist-info/entry_points.txt,sha256=gEOD1ZeXe8d2OP-KzUlG-b_9D9yUZTCt-GFW3EDbIIY,63
|
|
87
|
-
openai_sdk_helpers-0.4.2.dist-info/licenses/LICENSE,sha256=CUhc1NrE50bs45tcXF7OcTQBKEvkUuLqeOHgrWQ5jaA,1067
|
|
88
|
-
openai_sdk_helpers-0.4.2.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|