ai-microcore 5.0.0.dev6__tar.gz → 5.0.0.dev8__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.
- {ai_microcore-5.0.0.dev6 → ai_microcore-5.0.0.dev8}/PKG-INFO +4 -2
- {ai_microcore-5.0.0.dev6 → ai_microcore-5.0.0.dev8}/microcore/__init__.py +2 -2
- {ai_microcore-5.0.0.dev6 → ai_microcore-5.0.0.dev8}/microcore/_llm_functions.py +14 -4
- {ai_microcore-5.0.0.dev6 → ai_microcore-5.0.0.dev8}/microcore/ai_func/__init__.py +2 -1
- {ai_microcore-5.0.0.dev6 → ai_microcore-5.0.0.dev8}/microcore/file_storage.py +17 -14
- {ai_microcore-5.0.0.dev6 → ai_microcore-5.0.0.dev8}/microcore/images.py +1 -1
- {ai_microcore-5.0.0.dev6 → ai_microcore-5.0.0.dev8}/microcore/llm/google_genai.py +3 -2
- {ai_microcore-5.0.0.dev6 → ai_microcore-5.0.0.dev8}/microcore/llm/openai.py +50 -15
- {ai_microcore-5.0.0.dev6 → ai_microcore-5.0.0.dev8}/microcore/message_types.py +19 -5
- {ai_microcore-5.0.0.dev6 → ai_microcore-5.0.0.dev8}/pyproject.toml +16 -1
- {ai_microcore-5.0.0.dev6 → ai_microcore-5.0.0.dev8}/LICENSE +0 -0
- {ai_microcore-5.0.0.dev6 → ai_microcore-5.0.0.dev8}/README.md +0 -0
- {ai_microcore-5.0.0.dev6 → ai_microcore-5.0.0.dev8}/microcore/_env.py +0 -0
- {ai_microcore-5.0.0.dev6 → ai_microcore-5.0.0.dev8}/microcore/_prepare_llm_args.py +0 -0
- {ai_microcore-5.0.0.dev6 → ai_microcore-5.0.0.dev8}/microcore/ai_func/ai-func.json.j2 +0 -0
- {ai_microcore-5.0.0.dev6 → ai_microcore-5.0.0.dev8}/microcore/ai_func/ai-func.pythonic.j2 +0 -0
- {ai_microcore-5.0.0.dev6 → ai_microcore-5.0.0.dev8}/microcore/ai_func/ai-func.tag.j2 +0 -0
- {ai_microcore-5.0.0.dev6 → ai_microcore-5.0.0.dev8}/microcore/ai_modules.py +0 -0
- {ai_microcore-5.0.0.dev6 → ai_microcore-5.0.0.dev8}/microcore/configuration.py +0 -0
- {ai_microcore-5.0.0.dev6 → ai_microcore-5.0.0.dev8}/microcore/embedding_db/__init__.py +0 -0
- {ai_microcore-5.0.0.dev6 → ai_microcore-5.0.0.dev8}/microcore/embedding_db/chromadb.py +0 -0
- {ai_microcore-5.0.0.dev6 → ai_microcore-5.0.0.dev8}/microcore/embedding_db/qdrant.py +0 -0
- {ai_microcore-5.0.0.dev6 → ai_microcore-5.0.0.dev8}/microcore/file_cache.py +0 -0
- {ai_microcore-5.0.0.dev6 → ai_microcore-5.0.0.dev8}/microcore/interactive_setup.py +0 -0
- {ai_microcore-5.0.0.dev6 → ai_microcore-5.0.0.dev8}/microcore/json_parsing.py +0 -0
- {ai_microcore-5.0.0.dev6 → ai_microcore-5.0.0.dev8}/microcore/llm/__init__.py +0 -0
- {ai_microcore-5.0.0.dev6 → ai_microcore-5.0.0.dev8}/microcore/llm/anthropic.py +0 -0
- {ai_microcore-5.0.0.dev6 → ai_microcore-5.0.0.dev8}/microcore/llm/local_llm.py +0 -0
- {ai_microcore-5.0.0.dev6 → ai_microcore-5.0.0.dev8}/microcore/llm/local_transformers.py +0 -0
- {ai_microcore-5.0.0.dev6 → ai_microcore-5.0.0.dev8}/microcore/llm/shared.py +0 -0
- {ai_microcore-5.0.0.dev6 → ai_microcore-5.0.0.dev8}/microcore/llm_backends.py +0 -0
- {ai_microcore-5.0.0.dev6 → ai_microcore-5.0.0.dev8}/microcore/lm_client.py +0 -0
- {ai_microcore-5.0.0.dev6 → ai_microcore-5.0.0.dev8}/microcore/logging.py +0 -0
- {ai_microcore-5.0.0.dev6 → ai_microcore-5.0.0.dev8}/microcore/mcp.py +0 -0
- {ai_microcore-5.0.0.dev6 → ai_microcore-5.0.0.dev8}/microcore/metrics.py +0 -0
- {ai_microcore-5.0.0.dev6 → ai_microcore-5.0.0.dev8}/microcore/presets.py +0 -0
- {ai_microcore-5.0.0.dev6 → ai_microcore-5.0.0.dev8}/microcore/python.py +0 -0
- {ai_microcore-5.0.0.dev6 → ai_microcore-5.0.0.dev8}/microcore/templating/__init__.py +0 -0
- {ai_microcore-5.0.0.dev6 → ai_microcore-5.0.0.dev8}/microcore/templating/jinja2.py +0 -0
- {ai_microcore-5.0.0.dev6 → ai_microcore-5.0.0.dev8}/microcore/text2speech/elevenlabs.py +0 -0
- {ai_microcore-5.0.0.dev6 → ai_microcore-5.0.0.dev8}/microcore/tokenizing.py +0 -0
- {ai_microcore-5.0.0.dev6 → ai_microcore-5.0.0.dev8}/microcore/types.py +0 -0
- {ai_microcore-5.0.0.dev6 → ai_microcore-5.0.0.dev8}/microcore/ui.py +0 -0
- {ai_microcore-5.0.0.dev6 → ai_microcore-5.0.0.dev8}/microcore/utils.py +0 -0
- {ai_microcore-5.0.0.dev6 → ai_microcore-5.0.0.dev8}/microcore/wrappers/__init__.py +0 -0
- {ai_microcore-5.0.0.dev6 → ai_microcore-5.0.0.dev8}/microcore/wrappers/llm_response_wrapper.py +0 -0
- {ai_microcore-5.0.0.dev6 → ai_microcore-5.0.0.dev8}/microcore/wrappers/prompt_wrapper.py +0 -0
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ai-microcore
|
|
3
|
-
Version: 5.0.0.
|
|
3
|
+
Version: 5.0.0.dev8
|
|
4
4
|
Summary: # Minimalistic Foundation for AI Applications
|
|
5
|
-
Keywords: llm,large language models,ai,similarity search,ai search,gpt,openai,framework,adapter
|
|
5
|
+
Keywords: llm,large language models,ai,similarity search,ai search,gpt,openai,framework,adapter,anthropic,google gemini,google vertex ai
|
|
6
6
|
Author-email: Vitalii Stepanenko <mail@vitaliy.in>
|
|
7
7
|
Maintainer-email: Vitalii Stepanenko <mail@vitaliy.in>
|
|
8
8
|
Requires-Python: >=3.10
|
|
9
9
|
Description-Content-Type: text/markdown
|
|
10
10
|
Classifier: Programming Language :: Python :: 3
|
|
11
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
11
12
|
Classifier: Programming Language :: Python :: 3.11
|
|
12
13
|
Classifier: Programming Language :: Python :: 3.12
|
|
13
14
|
Classifier: Programming Language :: Python :: 3.13
|
|
@@ -29,6 +30,7 @@ Requires-Dist: mcp>=1.10.1,<2.0
|
|
|
29
30
|
Requires-Dist: fastmcp>=2.10.2,<3.0
|
|
30
31
|
Requires-Dist: docstring_parser~=0.16.0
|
|
31
32
|
Requires-Dist: httpx~=0.28.1
|
|
33
|
+
Project-URL: Bug Tracker, https://github.com/Nayjest/ai-microcore/issues
|
|
32
34
|
Project-URL: Source Code, https://github.com/Nayjest/ai-microcore
|
|
33
35
|
|
|
34
36
|
# AI MicroCore: A Minimalistic Foundation for AI Applications
|
|
@@ -79,7 +79,7 @@ def model_names() -> list[str]:
|
|
|
79
79
|
Return a list of available model names from the default LLM client.
|
|
80
80
|
"""
|
|
81
81
|
if env().default_client is None:
|
|
82
|
-
raise ValueError("No default LLM client
|
|
82
|
+
raise ValueError("No default LLM client is configured.")
|
|
83
83
|
return env().default_client.model_names()
|
|
84
84
|
|
|
85
85
|
|
|
@@ -231,4 +231,4 @@ __all__ = [
|
|
|
231
231
|
# "wrappers",
|
|
232
232
|
]
|
|
233
233
|
|
|
234
|
-
__version__ = "5.0.
|
|
234
|
+
__version__ = "5.0.0dev8"
|
|
@@ -267,9 +267,7 @@ def llm(
|
|
|
267
267
|
save_cache(cache_name, response)
|
|
268
268
|
[h(response) for h in env().llm_after_handlers]
|
|
269
269
|
if tries > 0:
|
|
270
|
-
|
|
271
|
-
retry_params["retries"] = tries - 1
|
|
272
|
-
setattr(response, "_retry_callback", lambda: llm(prompt, **retry_params))
|
|
270
|
+
setattr(response, "_retry_callback", lambda: llm(prompt, retries=tries - 1, **kwargs))
|
|
273
271
|
if parse_json:
|
|
274
272
|
parsing_params = parse_json if isinstance(parse_json, dict) else {}
|
|
275
273
|
return response.parse_json(**parsing_params)
|
|
@@ -294,6 +292,13 @@ async def allm(
|
|
|
294
292
|
parse_json (bool|dict):
|
|
295
293
|
If True, parses response as JSON,
|
|
296
294
|
alternatively non-empty dict can be used as parse_json arguments.
|
|
295
|
+
Default is False (no parsing).
|
|
296
|
+
file_cache (bool | str):
|
|
297
|
+
If True or non-empty string, enables file caching of LLM responses.
|
|
298
|
+
If string, it will be used as cache prefix.
|
|
299
|
+
When enabled, identical requests with identical parameters
|
|
300
|
+
will return cached responses instead of making new API calls.
|
|
301
|
+
Default is False (no caching).
|
|
297
302
|
**kwargs: Parameters supported by the LLM API.
|
|
298
303
|
|
|
299
304
|
See parameters supported by the OpenAI:
|
|
@@ -374,8 +379,13 @@ async def allm(
|
|
|
374
379
|
if file_cache:
|
|
375
380
|
delete_cache(cache_name)
|
|
376
381
|
return await allm(
|
|
377
|
-
prompt,
|
|
382
|
+
prompt,
|
|
383
|
+
retries=tries - 1,
|
|
384
|
+
parse_json=parse_json,
|
|
385
|
+
file_cache=file_cache,
|
|
386
|
+
**kwargs
|
|
378
387
|
)
|
|
388
|
+
raise e
|
|
379
389
|
return response
|
|
380
390
|
|
|
381
391
|
|
|
@@ -80,7 +80,7 @@ def func_metadata(func, name=None) -> Dict[str, Any]:
|
|
|
80
80
|
|
|
81
81
|
# Add descriptions from parsed docstring to parameters
|
|
82
82
|
for param in parsed_docstring.params:
|
|
83
|
-
if param.arg_name in metadata.get("args",
|
|
83
|
+
if param.arg_name in metadata.get("args", {}):
|
|
84
84
|
metadata["args"][param.arg_name]["docstr"] = param.description
|
|
85
85
|
|
|
86
86
|
return metadata
|
|
@@ -190,6 +190,7 @@ def extract_tag_tool_params(
|
|
|
190
190
|
if len(tags) > 1:
|
|
191
191
|
if raise_errors:
|
|
192
192
|
raise ValueError("Response contains multiple tags when only one expected")
|
|
193
|
+
logging.warning("Response contains multiple tags, but only the first one will be used.")
|
|
193
194
|
tag, attrs, content = tags[0]
|
|
194
195
|
return tag, [content], attrs
|
|
195
196
|
|
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
"""
|
|
2
|
-
File storage
|
|
2
|
+
File storage functionality.
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
Provides a Storage class for file operations within a configured storage directory.
|
|
6
|
+
Supports automatic file numbering, backups, JSON serialization, encoding detection,
|
|
7
|
+
file copying, directory listing, etc.
|
|
8
|
+
|
|
9
|
+
Usage:
|
|
10
|
+
from microcore import storage
|
|
11
|
+
storage.write("data.txt", "content")
|
|
12
|
+
content = storage.read("data.txt")
|
|
3
13
|
"""
|
|
4
14
|
|
|
5
15
|
import fnmatch
|
|
@@ -15,6 +25,7 @@ from ._env import config
|
|
|
15
25
|
from .utils import file_link, list_files
|
|
16
26
|
|
|
17
27
|
_missing = object()
|
|
28
|
+
"""Sentinel value to distinguish between None and 'not provided'."""
|
|
18
29
|
|
|
19
30
|
|
|
20
31
|
@dataclass
|
|
@@ -224,8 +235,6 @@ class Storage:
|
|
|
224
235
|
if isinstance(content, bytes):
|
|
225
236
|
if encoding is not None:
|
|
226
237
|
logging.warning("Encoding is ignored when writing bytes content")
|
|
227
|
-
if append:
|
|
228
|
-
raise ValueError("Cannot append bytes content")
|
|
229
238
|
|
|
230
239
|
if rewrite_existing is None:
|
|
231
240
|
rewrite_existing = True
|
|
@@ -268,18 +277,12 @@ class Storage:
|
|
|
268
277
|
if file_name != fn_incremented:
|
|
269
278
|
os.rename(self.path / file_name, self.path / fn_incremented)
|
|
270
279
|
(self.path / file_name).parent.mkdir(parents=True, exist_ok=True)
|
|
271
|
-
if
|
|
272
|
-
with (self.path / file_name).open(
|
|
273
|
-
|
|
274
|
-
encoding=encoding if not isinstance(content, bytes) else None,
|
|
275
|
-
) as file:
|
|
276
|
-
file.write(content)
|
|
280
|
+
if isinstance(content, bytes):
|
|
281
|
+
with (self.path / file_name).open(mode="ab" if append else "wb") as f:
|
|
282
|
+
f.write(content)
|
|
277
283
|
else:
|
|
278
|
-
if
|
|
279
|
-
|
|
280
|
-
file.write(content)
|
|
281
|
-
else:
|
|
282
|
-
(self.path / file_name).write_text(content, encoding=encoding)
|
|
284
|
+
with (self.path / file_name).open(mode="a" if append else "w", encoding=encoding) as f:
|
|
285
|
+
f.write(content)
|
|
283
286
|
return file_name
|
|
284
287
|
|
|
285
288
|
def clean(self, path: str | Path):
|
|
@@ -163,8 +163,9 @@ class AsyncGoogleClient(BaseAsyncAIClient):
|
|
|
163
163
|
def __init__(self, client: GoogleClient):
|
|
164
164
|
self.sync_client = client
|
|
165
165
|
|
|
166
|
-
async def load_models(self) -> dict:
|
|
167
|
-
|
|
166
|
+
async def load_models(self, **kwargs) -> dict:
|
|
167
|
+
models = await self.sync_client.genai_client.aio.models.list(**kwargs)
|
|
168
|
+
return {model.name: model for model in models}
|
|
168
169
|
|
|
169
170
|
async def generate(
|
|
170
171
|
self,
|
|
@@ -42,8 +42,7 @@ class AsyncOpenAIClient(BaseAsyncAIClient):
|
|
|
42
42
|
config = self.sync_client.config
|
|
43
43
|
args, options = _prepare_llm_arguments(config, kwargs)
|
|
44
44
|
if is_image_model(args["model"]):
|
|
45
|
-
|
|
46
|
-
return _generate_image(
|
|
45
|
+
return await _generate_image_async(
|
|
47
46
|
prompt,
|
|
48
47
|
args,
|
|
49
48
|
self.oai_client,
|
|
@@ -294,12 +293,8 @@ def _oai_image_response_to_images(response: ImagesResponse) -> list[Image]:
|
|
|
294
293
|
return images
|
|
295
294
|
|
|
296
295
|
|
|
297
|
-
def
|
|
298
|
-
prompt
|
|
299
|
-
args,
|
|
300
|
-
connection: openai.OpenAI | openai.AsyncOpenAI,
|
|
301
|
-
options
|
|
302
|
-
) -> ImageGenerationResponse | None:
|
|
296
|
+
def _prepare_image_generation(prompt, args):
|
|
297
|
+
"""Prepare prompt and images for image generation (shared logic)."""
|
|
303
298
|
def convert_input_image(image: ImageInterface):
|
|
304
299
|
if isinstance(image, FileImage):
|
|
305
300
|
return open(image.file, "rb")
|
|
@@ -333,6 +328,32 @@ def _generate_image(
|
|
|
333
328
|
if save and args.get("response_format", "b64_json") != "b64_json":
|
|
334
329
|
raise ValueError("Only 'b64_json' response format is supported.")
|
|
335
330
|
|
|
331
|
+
return prompt, images, save
|
|
332
|
+
|
|
333
|
+
|
|
334
|
+
def _image_generation_response(
|
|
335
|
+
response: ImagesResponse,
|
|
336
|
+
save: bool,
|
|
337
|
+
options: dict,
|
|
338
|
+
) -> ImageGenerationResponse | None:
|
|
339
|
+
check_for_errors(response)
|
|
340
|
+
images = _oai_image_response_to_images(response)
|
|
341
|
+
response_attrs = response.__dict__.copy()
|
|
342
|
+
result = make_image_generation_response(images, save, response_attrs)
|
|
343
|
+
for cb in options["callbacks"]:
|
|
344
|
+
cb(result)
|
|
345
|
+
return result
|
|
346
|
+
|
|
347
|
+
|
|
348
|
+
def _generate_image(
|
|
349
|
+
prompt,
|
|
350
|
+
args,
|
|
351
|
+
connection: openai.OpenAI,
|
|
352
|
+
options
|
|
353
|
+
) -> ImageGenerationResponse | None:
|
|
354
|
+
"""Synchronous version of image generation."""
|
|
355
|
+
prompt, images, save = _prepare_image_generation(prompt, args)
|
|
356
|
+
|
|
336
357
|
if not images:
|
|
337
358
|
response: ImagesResponse = connection.images.generate(prompt=prompt, **args)
|
|
338
359
|
else:
|
|
@@ -341,10 +362,24 @@ def _generate_image(
|
|
|
341
362
|
prompt=prompt,
|
|
342
363
|
**args
|
|
343
364
|
)
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
365
|
+
return _image_generation_response(response, save, options)
|
|
366
|
+
|
|
367
|
+
|
|
368
|
+
async def _generate_image_async(
|
|
369
|
+
prompt,
|
|
370
|
+
args,
|
|
371
|
+
connection: openai.AsyncOpenAI,
|
|
372
|
+
options
|
|
373
|
+
) -> ImageGenerationResponse | None:
|
|
374
|
+
"""Asynchronous version of image generation."""
|
|
375
|
+
prompt, images, save = _prepare_image_generation(prompt, args)
|
|
376
|
+
|
|
377
|
+
if not images:
|
|
378
|
+
response: ImagesResponse = await connection.images.generate(prompt=prompt, **args)
|
|
379
|
+
else:
|
|
380
|
+
response: ImagesResponse = await connection.images.edit(
|
|
381
|
+
image=images,
|
|
382
|
+
prompt=prompt,
|
|
383
|
+
**args
|
|
384
|
+
)
|
|
385
|
+
return _image_generation_response(response, save, options)
|
|
@@ -4,7 +4,10 @@ Message classes for OpenAI-like Chat APIs.
|
|
|
4
4
|
import abc
|
|
5
5
|
from enum import Enum
|
|
6
6
|
from dataclasses import dataclass, field
|
|
7
|
-
from typing import ClassVar
|
|
7
|
+
from typing import ClassVar, Any
|
|
8
|
+
|
|
9
|
+
from pydantic import GetCoreSchemaHandler
|
|
10
|
+
from pydantic_core import core_schema
|
|
8
11
|
|
|
9
12
|
|
|
10
13
|
class Role(str, Enum):
|
|
@@ -23,19 +26,30 @@ DEFAULT_MESSAGE_ROLE = Role.USER
|
|
|
23
26
|
"""Default role for messages if not specified (USER)."""
|
|
24
27
|
|
|
25
28
|
|
|
26
|
-
class
|
|
29
|
+
class _PydanticPassthrough:
|
|
30
|
+
"""
|
|
31
|
+
Mixin that allows Pydantic to accept instances of this class without transformation.
|
|
32
|
+
"""
|
|
33
|
+
@classmethod
|
|
34
|
+
def __get_pydantic_core_schema__(
|
|
35
|
+
cls, source_type: Any, handler: GetCoreSchemaHandler # pylint: disable=unused-argument
|
|
36
|
+
) -> core_schema.CoreSchema:
|
|
37
|
+
return core_schema.any_schema()
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class MsgContentPart(_PydanticPassthrough):
|
|
27
41
|
"""
|
|
28
42
|
Base class for individual parts of multipart message content.
|
|
29
43
|
"""
|
|
30
44
|
|
|
31
45
|
|
|
32
|
-
class MsgContent:
|
|
46
|
+
class MsgContent(_PydanticPassthrough):
|
|
33
47
|
"""
|
|
34
48
|
Base class for message content.
|
|
35
49
|
"""
|
|
36
50
|
|
|
37
51
|
|
|
38
|
-
class MsgMultipartContent(MsgContent,
|
|
52
|
+
class MsgMultipartContent(MsgContent, abc.ABC):
|
|
39
53
|
"""
|
|
40
54
|
Abstract base class for multipart message content.
|
|
41
55
|
"""
|
|
@@ -55,7 +69,7 @@ TMsgContent = str | MsgContent | list[TMsgContentPart]
|
|
|
55
69
|
|
|
56
70
|
|
|
57
71
|
@dataclass
|
|
58
|
-
class Msg:
|
|
72
|
+
class Msg(_PydanticPassthrough):
|
|
59
73
|
"""
|
|
60
74
|
Represents a message in a chat conversation.
|
|
61
75
|
"""
|
|
@@ -5,10 +5,24 @@ build-backend = "flit_core.buildapi"
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "ai-microcore"
|
|
7
7
|
dynamic = ["description", "version"]
|
|
8
|
-
keywords = [
|
|
8
|
+
keywords = [
|
|
9
|
+
"llm",
|
|
10
|
+
"large language models",
|
|
11
|
+
"ai",
|
|
12
|
+
"similarity search",
|
|
13
|
+
"ai search",
|
|
14
|
+
"gpt",
|
|
15
|
+
"openai",
|
|
16
|
+
"framework",
|
|
17
|
+
"adapter",
|
|
18
|
+
"anthropic",
|
|
19
|
+
"google gemini",
|
|
20
|
+
"google vertex ai",
|
|
21
|
+
]
|
|
9
22
|
readme = "README.md"
|
|
10
23
|
classifiers = [
|
|
11
24
|
"Programming Language :: Python :: 3",
|
|
25
|
+
"Programming Language :: Python :: 3.10",
|
|
12
26
|
"Programming Language :: Python :: 3.11",
|
|
13
27
|
"Programming Language :: Python :: 3.12",
|
|
14
28
|
"Programming Language :: Python :: 3.13",
|
|
@@ -45,6 +59,7 @@ license = { file = "LICENSE" }
|
|
|
45
59
|
|
|
46
60
|
[project.urls]
|
|
47
61
|
"Source Code" = "https://github.com/Nayjest/ai-microcore"
|
|
62
|
+
"Bug Tracker" = "https://github.com/Nayjest/ai-microcore/issues"
|
|
48
63
|
|
|
49
64
|
[tool.flit.module]
|
|
50
65
|
name = "microcore"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ai_microcore-5.0.0.dev6 → ai_microcore-5.0.0.dev8}/microcore/wrappers/llm_response_wrapper.py
RENAMED
|
File without changes
|
|
File without changes
|