This commit is contained in:
Andras Schmelczer 2026-10-28 22:31:43 +00:00
commit a61e8709d3
7 changed files with 29 additions and 21 deletions

View file

@ -66,7 +66,7 @@ from great_ai import GreatAI, use_model
def type_safe_greeter(your_name: str, model) -> str: def type_safe_greeter(your_name: str, model) -> str:
return f'Hi {your_name}!' return f'Hi {your_name}!'
assert type_safe_greeter('Andras').output == 'Hi Andras' assert type_safe_greeter('Andras').output == 'Hi Andras!'
``` ```
1. By default, the parameter named `model` will be replaced by the loaded model. This behaviour can be customised by setting the `model_kwarg_name`. This way, even multiple models can be injected into a single function. 1. By default, the parameter named `model` will be replaced by the loaded model. This behaviour can be customised by setting the `model_kwarg_name`. This way, even multiple models can be injected into a single function.
@ -82,14 +82,14 @@ If you wish to turn off logging or specify custom validation for your parameters
By default, all parameters that are not affected by an explicit [@parameter][great_ai.parameter] or [@use_model][great_ai.use_model] are automatically decorated with [@parameter][great_ai.parameter] when [@GreatAI.create][great_ai.GreatAI.create] is called. By default, all parameters that are not affected by an explicit [@parameter][great_ai.parameter] or [@use_model][great_ai.use_model] are automatically decorated with [@parameter][great_ai.parameter] when [@GreatAI.create][great_ai.GreatAI.create] is called.
```python title="greeter_with_validation.py" ```python title="greeter_with_validation.py"
from great_ai import GreatAI, use_model from great_ai import GreatAI, parameter
@GreatAI.create @GreatAI.create
@parameter('your_name', disable_logging=True) @parameter('your_name', disable_logging=True)
def type_safe_greeter(your_name: str, model) -> str: def type_safe_greeter(your_name: str) -> str:
return f'Hi {your_name}!' return f'Hi {your_name}!'
assert type_safe_greeter('Andras').output == 'Hi Andras' assert type_safe_greeter('Andras').output == 'Hi Andras!'
``` ```
!!! important !!! important

View file

@ -1,6 +1,6 @@
# How to use LargeFiles # How to use LargeFiles
The functions [save_model][great_ai.use_model] and [@use_model][great_ai.use_model] wrap LargeFile instances. Hence, besides configuring [LargeFile](https://great-ai.schmelczer.dev/reference/large-file), users have few reasons to use LargeFiles directly. The functions [save_model][great_ai.save_model] and [@use_model][great_ai.use_model] wrap LargeFile instances. Hence, besides configuring [LargeFile](https://great-ai.schmelczer.dev/reference/large-file), users have few reasons to use LargeFiles directly.
## Motivation ## Motivation
@ -16,12 +16,12 @@ Often, especially when working with data-heavy applications, large files can pro
```python ```python
from great_ai.large_file import LargeFileS3 from great_ai.large_file import LargeFileS3
LargeFileS3.configure_credentials({ LargeFileS3.configure_credentials(
"aws_region_name": "your_region_like_eu-west-2", aws_region_name="your_region_like_eu-west-2",
"aws_access_key_id": "YOUR_ACCESS_KEY_ID", aws_access_key_id="YOUR_ACCESS_KEY_ID",
"aws_secret_access_key": "YOUR_VERY_SECRET_ACCESS_KEY", aws_secret_access_key="YOUR_VERY_SECRET_ACCESS_KEY",
"large_files_bucket_name": "create_a_bucket_and_put_its_name_here", large_files_bucket_name="create_a_bucket_and_put_its_name_here",
}) )
# Creates a new version and deletes the older version # Creates a new version and deletes the older version
# leaving the three most recently used intact # leaving the three most recently used intact
@ -44,6 +44,8 @@ Often, especially when working with data-heavy applications, large files can pro
The local cache can be configured with these properties: The local cache can be configured with these properties:
```python ```python
from pathlib import Path
LargeFileS3.cache_path = Path('.cache') LargeFileS3.cache_path = Path('.cache')
LargeFileS3.max_cache_size = "30 GB" LargeFileS3.max_cache_size = "30 GB"
``` ```

View file

@ -4,16 +4,21 @@ import json
import os import os
from collections import Counter from collections import Counter
from pathlib import Path from pathlib import Path
from typing import List, Optional from typing import Dict, List, Optional
ROOT = Path(__file__).resolve().parents[1]
DATA_DIR = ROOT / "docs/tutorial/data"
SURVEY_DIR = ROOT / "docs/surveys"
FULL_RUN = os.environ.get("GREAT_AI_NOTEBOOK_FULL") == "1"
def setup_notebook(root: Path, workflow: str) -> Path: def setup_notebook(workflow: str) -> Path:
"""Keep related notebooks' models and traces together, outside source files.""" """Keep related notebooks' models and traces together, outside source files."""
from great_ai import ParallelTinyDbDriver, configure from great_ai import ParallelTinyDbDriver, configure
from great_ai.large_file import LargeFileLocal from great_ai.large_file import LargeFileLocal
base = Path(os.environ.get("GREAT_AI_NOTEBOOK_WORKDIR", root / ".cache/notebooks")) base = Path(os.environ.get("GREAT_AI_NOTEBOOK_WORKDIR", ROOT / ".cache/notebooks"))
suffix = "-full" if os.environ.get("GREAT_AI_NOTEBOOK_FULL") == "1" else "" suffix = "-full" if FULL_RUN else ""
work_dir = (base / (workflow + suffix)).resolve() work_dir = (base / (workflow + suffix)).resolve()
work_dir.mkdir(parents=True, exist_ok=True) work_dir.mkdir(parents=True, exist_ok=True)
LargeFileLocal.cache_path = work_dir / "models-cache" LargeFileLocal.cache_path = work_dir / "models-cache"
@ -43,7 +48,7 @@ def mag_lines(path: Path, per_label: Optional[int] = None) -> List[str]:
def demo_annotations() -> List[dict]: def demo_annotations() -> List[dict]:
"""Synthetic annotations for exercising the pipeline, not measuring quality.""" """Synthetic annotations for exercising the pipeline, not measuring quality."""
annotations = [{}, {}] annotations: List[Dict[str, int]] = [{}, {}]
for index, topic in enumerate( for index, topic in enumerate(
["protein", "cancer", "solar", "quantum", "neural", "genome"] ["protein", "cancer", "solar", "quantum", "neural", "genome"]
): ):

View file

@ -40,7 +40,7 @@ After training and evaluating a model, it is exported using [great_ai.save_model
```python ```python
from great_ai.large_file import LargeFileS3 from great_ai.large_file import LargeFileS3
LargeFileS3.configure( LargeFileS3.configure_credentials(
aws_region_name='eu-west-2', aws_region_name='eu-west-2',
aws_access_key_id='MY_AWS_ACCESS_KEY', aws_access_key_id='MY_AWS_ACCESS_KEY',
aws_secret_access_key='MY_AWS_SECRET_KEY', aws_secret_access_key='MY_AWS_SECRET_KEY',

View file

@ -79,8 +79,8 @@ markdown_extensions:
- pymdownx.details - pymdownx.details
- md_in_html - md_in_html
- pymdownx.emoji: - pymdownx.emoji:
emoji_index: !!python/name:materialx.emoji.twemoji emoji_index: !!python/name:material.extensions.emoji.twemoji
emoji_generator: !!python/name:materialx.emoji.to_svg emoji_generator: !!python/name:material.extensions.emoji.to_svg
- abbr - abbr
- attr_list - attr_list
- pymdownx.caret - pymdownx.caret

View file

@ -83,6 +83,9 @@ dev = [
] ]
[tool.pytest.ini_options] [tool.pytest.ini_options]
# Collect doctests and tests from the checkout even when a wheel is installed.
pythonpath = ["."]
asyncio_default_fixture_loop_scope = "function"
# `...` in doctests (e.g. third-party exception messages that drift between # `...` in doctests (e.g. third-party exception messages that drift between
# dependency versions) is treated as a wildcard rather than a literal. # dependency versions) is treated as a wildcard rather than a literal.
doctest_optionflags = ["ELLIPSIS"] doctest_optionflags = ["ELLIPSIS"]

View file

@ -4,8 +4,6 @@ isolated_build = True
[testenv] [testenv]
alwayscopy = True alwayscopy = True
setenv =
PY_IGNORE_IMPORTMISMATCH = 1
deps = deps =
pytest pytest
pytest-cov pytest-cov