robotframework-gemini 0.3.0__tar.gz → 0.3.1__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.
- {robotframework_gemini-0.3.0 → robotframework_gemini-0.3.1}/PKG-INFO +57 -8
- {robotframework_gemini-0.3.0 → robotframework_gemini-0.3.1}/README.md +56 -7
- {robotframework_gemini-0.3.0 → robotframework_gemini-0.3.1}/pyproject.toml +12 -2
- robotframework_gemini-0.3.1/src/BrowserGeminiLibrary.py +10 -0
- robotframework_gemini-0.3.1/src/GeminiLibrary.py +9 -0
- {robotframework_gemini-0.3.0 → robotframework_gemini-0.3.1}/src/robotframework_gemini/__init__.py +1 -1
- {robotframework_gemini-0.3.0 → robotframework_gemini-0.3.1}/src/robotframework_gemini/client.py +2 -2
- {robotframework_gemini-0.3.0 → robotframework_gemini-0.3.1}/src/robotframework_gemini/library.py +6 -1
- robotframework_gemini-0.3.1/src/robotframework_gemini/py.typed +0 -0
- {robotframework_gemini-0.3.0 → robotframework_gemini-0.3.1}/.gitignore +0 -0
- {robotframework_gemini-0.3.0 → robotframework_gemini-0.3.1}/LICENSE +0 -0
- {robotframework_gemini-0.3.0 → robotframework_gemini-0.3.1}/src/robotframework_gemini/browser_helpers.py +0 -0
- {robotframework_gemini-0.3.0 → robotframework_gemini-0.3.1}/src/robotframework_gemini/legacy_env.py +0 -0
- {robotframework_gemini-0.3.0 → robotframework_gemini-0.3.1}/src/robotframework_gemini/prompt_build.py +0 -0
- {robotframework_gemini-0.3.0 → robotframework_gemini-0.3.1}/src/robotframework_gemini/response_parse.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: robotframework-gemini
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.1
|
|
4
4
|
Summary: Google Gemini oracles for Robot Framework: text-only and multimodal (image) assertions.
|
|
5
5
|
Project-URL: Homepage, https://github.com/carlosnizolli/robotframework-gemini
|
|
6
6
|
Project-URL: Documentation, https://github.com/carlosnizolli/robotframework-gemini#readme
|
|
@@ -59,12 +59,39 @@ Desenvolvimento local:
|
|
|
59
59
|
python -m pip install -e ".[dev]"
|
|
60
60
|
```
|
|
61
61
|
|
|
62
|
-
## Variáveis de ambiente
|
|
62
|
+
## Variáveis de ambiente e importação da Library
|
|
63
63
|
|
|
64
|
-
| Variável
|
|
65
|
-
|
|
66
|
-
| `GEMINI_API_KEY`
|
|
67
|
-
| `GEMINI_MODEL`
|
|
64
|
+
| Variável / argumento | Função |
|
|
65
|
+
|----------------------|--------|
|
|
66
|
+
| `GEMINI_API_KEY` | Chave da API Gemini (obrigatória se não passar `api_key` na Library) |
|
|
67
|
+
| `GEMINI_MODEL` | Modelo (ex.: `gemini-2.5-flash`). Se omitido, usa `gemini-2.5-flash`. |
|
|
68
|
+
| `api_key` (import) | Sobrescreve `GEMINI_API_KEY` na importação da Library |
|
|
69
|
+
| `model` (import) | Sobrescreve `GEMINI_MODEL` na importação da Library |
|
|
70
|
+
|
|
71
|
+
Por padrão, a Library lê chave e modelo das variáveis de ambiente. Você também pode passá-los na importação (útil em CI ou suítes com credenciais em variáveis Robot):
|
|
72
|
+
|
|
73
|
+
```robot
|
|
74
|
+
*** Variables ***
|
|
75
|
+
${GEMINI_API_KEY} %{GEMINI_API_KEY}
|
|
76
|
+
${GEMINI_MODEL} gemini-2.5-flash
|
|
77
|
+
|
|
78
|
+
*** Settings ***
|
|
79
|
+
Library GeminiLibrary api_key=${GEMINI_API_KEY} model=${GEMINI_MODEL}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Só o modelo (chave continua vinda do ambiente):
|
|
83
|
+
|
|
84
|
+
```robot
|
|
85
|
+
Library GeminiLibrary model=gemini-2.5-flash
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Import explícito (equivalente):
|
|
89
|
+
|
|
90
|
+
```robot
|
|
91
|
+
Library robotframework_gemini.library.GeminiLibrary api_key=${GEMINI_API_KEY} model=${GEMINI_MODEL}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
> Evite commitar a chave literal no repositório; prefira `%{GEMINI_API_KEY}` ou secrets do CI.
|
|
68
95
|
|
|
69
96
|
## Uso em Python (`GeminiOrchestrator`)
|
|
70
97
|
|
|
@@ -73,6 +100,8 @@ from pathlib import Path
|
|
|
73
100
|
from robotframework_gemini import GeminiOrchestrator
|
|
74
101
|
|
|
75
102
|
orchestrator = GeminiOrchestrator()
|
|
103
|
+
# ou explicitamente:
|
|
104
|
+
# orchestrator = GeminiOrchestrator(api_key="...", model="gemini-2.5-flash")
|
|
76
105
|
context = "Web dashboard with the 'Active' category filter applied."
|
|
77
106
|
evaluation = "Do the visible list items match the selected category?"
|
|
78
107
|
model_response = orchestrator.evaluate_with_image(context, evaluation, Path("screen.png"))
|
|
@@ -123,12 +152,32 @@ Checar tela por critério neutro
|
|
|
123
152
|
Log ${model_response}
|
|
124
153
|
```
|
|
125
154
|
|
|
126
|
-
Import
|
|
155
|
+
Import recomendado (RobotCode, runtime e PyPI):
|
|
127
156
|
|
|
128
157
|
```robot
|
|
129
|
-
Library
|
|
158
|
+
Library GeminiLibrary api_key=${GEMINI_API_KEY} model=${GEMINI_MODEL}
|
|
130
159
|
```
|
|
131
160
|
|
|
161
|
+
Import explícito do pacote (Python / IDEs que preferem o caminho completo):
|
|
162
|
+
|
|
163
|
+
```robot
|
|
164
|
+
Library robotframework_gemini.library.GeminiLibrary api_key=${GEMINI_API_KEY} model=${GEMINI_MODEL}
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### IDE e RobotCode
|
|
168
|
+
|
|
169
|
+
| Forma de import | Quem resolve |
|
|
170
|
+
|-----------------|--------------|
|
|
171
|
+
| `Library GeminiLibrary` | Módulo top-level `GeminiLibrary.py` (instalado no wheel ou via `src/` no clone) |
|
|
172
|
+
| `Library robotframework_gemini.library.GeminiLibrary` | Pacote Python padrão |
|
|
173
|
+
|
|
174
|
+
No **clone do repositório**, sem instalar:
|
|
175
|
+
|
|
176
|
+
- [`robot.toml`](robot.toml) — `python-path = ["src"]` para RobotCode/LSP
|
|
177
|
+
- [`.vscode/settings.json`](.vscode/settings.json) — `extraPaths` para Pylance/Cursor
|
|
178
|
+
|
|
179
|
+
Com venv local: `pip install -e ".[dev]"` e recarregue a janela do IDE após mudanças.
|
|
180
|
+
|
|
132
181
|
Com arquivo já salvo:
|
|
133
182
|
|
|
134
183
|
```robot
|
|
@@ -25,12 +25,39 @@ Desenvolvimento local:
|
|
|
25
25
|
python -m pip install -e ".[dev]"
|
|
26
26
|
```
|
|
27
27
|
|
|
28
|
-
## Variáveis de ambiente
|
|
28
|
+
## Variáveis de ambiente e importação da Library
|
|
29
29
|
|
|
30
|
-
| Variável
|
|
31
|
-
|
|
32
|
-
| `GEMINI_API_KEY`
|
|
33
|
-
| `GEMINI_MODEL`
|
|
30
|
+
| Variável / argumento | Função |
|
|
31
|
+
|----------------------|--------|
|
|
32
|
+
| `GEMINI_API_KEY` | Chave da API Gemini (obrigatória se não passar `api_key` na Library) |
|
|
33
|
+
| `GEMINI_MODEL` | Modelo (ex.: `gemini-2.5-flash`). Se omitido, usa `gemini-2.5-flash`. |
|
|
34
|
+
| `api_key` (import) | Sobrescreve `GEMINI_API_KEY` na importação da Library |
|
|
35
|
+
| `model` (import) | Sobrescreve `GEMINI_MODEL` na importação da Library |
|
|
36
|
+
|
|
37
|
+
Por padrão, a Library lê chave e modelo das variáveis de ambiente. Você também pode passá-los na importação (útil em CI ou suítes com credenciais em variáveis Robot):
|
|
38
|
+
|
|
39
|
+
```robot
|
|
40
|
+
*** Variables ***
|
|
41
|
+
${GEMINI_API_KEY} %{GEMINI_API_KEY}
|
|
42
|
+
${GEMINI_MODEL} gemini-2.5-flash
|
|
43
|
+
|
|
44
|
+
*** Settings ***
|
|
45
|
+
Library GeminiLibrary api_key=${GEMINI_API_KEY} model=${GEMINI_MODEL}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Só o modelo (chave continua vinda do ambiente):
|
|
49
|
+
|
|
50
|
+
```robot
|
|
51
|
+
Library GeminiLibrary model=gemini-2.5-flash
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Import explícito (equivalente):
|
|
55
|
+
|
|
56
|
+
```robot
|
|
57
|
+
Library robotframework_gemini.library.GeminiLibrary api_key=${GEMINI_API_KEY} model=${GEMINI_MODEL}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
> Evite commitar a chave literal no repositório; prefira `%{GEMINI_API_KEY}` ou secrets do CI.
|
|
34
61
|
|
|
35
62
|
## Uso em Python (`GeminiOrchestrator`)
|
|
36
63
|
|
|
@@ -39,6 +66,8 @@ from pathlib import Path
|
|
|
39
66
|
from robotframework_gemini import GeminiOrchestrator
|
|
40
67
|
|
|
41
68
|
orchestrator = GeminiOrchestrator()
|
|
69
|
+
# ou explicitamente:
|
|
70
|
+
# orchestrator = GeminiOrchestrator(api_key="...", model="gemini-2.5-flash")
|
|
42
71
|
context = "Web dashboard with the 'Active' category filter applied."
|
|
43
72
|
evaluation = "Do the visible list items match the selected category?"
|
|
44
73
|
model_response = orchestrator.evaluate_with_image(context, evaluation, Path("screen.png"))
|
|
@@ -89,12 +118,32 @@ Checar tela por critério neutro
|
|
|
89
118
|
Log ${model_response}
|
|
90
119
|
```
|
|
91
120
|
|
|
92
|
-
Import
|
|
121
|
+
Import recomendado (RobotCode, runtime e PyPI):
|
|
93
122
|
|
|
94
123
|
```robot
|
|
95
|
-
Library
|
|
124
|
+
Library GeminiLibrary api_key=${GEMINI_API_KEY} model=${GEMINI_MODEL}
|
|
96
125
|
```
|
|
97
126
|
|
|
127
|
+
Import explícito do pacote (Python / IDEs que preferem o caminho completo):
|
|
128
|
+
|
|
129
|
+
```robot
|
|
130
|
+
Library robotframework_gemini.library.GeminiLibrary api_key=${GEMINI_API_KEY} model=${GEMINI_MODEL}
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### IDE e RobotCode
|
|
134
|
+
|
|
135
|
+
| Forma de import | Quem resolve |
|
|
136
|
+
|-----------------|--------------|
|
|
137
|
+
| `Library GeminiLibrary` | Módulo top-level `GeminiLibrary.py` (instalado no wheel ou via `src/` no clone) |
|
|
138
|
+
| `Library robotframework_gemini.library.GeminiLibrary` | Pacote Python padrão |
|
|
139
|
+
|
|
140
|
+
No **clone do repositório**, sem instalar:
|
|
141
|
+
|
|
142
|
+
- [`robot.toml`](robot.toml) — `python-path = ["src"]` para RobotCode/LSP
|
|
143
|
+
- [`.vscode/settings.json`](.vscode/settings.json) — `extraPaths` para Pylance/Cursor
|
|
144
|
+
|
|
145
|
+
Com venv local: `pip install -e ".[dev]"` e recarregue a janela do IDE após mudanças.
|
|
146
|
+
|
|
98
147
|
Com arquivo já salvo:
|
|
99
148
|
|
|
100
149
|
```robot
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "robotframework-gemini"
|
|
7
|
-
version = "0.3.
|
|
7
|
+
version = "0.3.1"
|
|
8
8
|
description = "Google Gemini oracles for Robot Framework: text-only and multimodal (image) assertions."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -47,14 +47,24 @@ dev = [
|
|
|
47
47
|
]
|
|
48
48
|
|
|
49
49
|
[project.entry-points."robotframework.libraries"]
|
|
50
|
-
GeminiLibrary = "
|
|
50
|
+
GeminiLibrary = "GeminiLibrary:GeminiLibrary"
|
|
51
|
+
BrowserGeminiLibrary = "BrowserGeminiLibrary:BrowserGeminiLibrary"
|
|
51
52
|
|
|
52
53
|
[tool.hatch.build.targets.wheel]
|
|
53
54
|
packages = ["src/robotframework_gemini"]
|
|
54
55
|
|
|
56
|
+
[tool.hatch.build.targets.wheel.force-include]
|
|
57
|
+
"src/GeminiLibrary.py" = "GeminiLibrary.py"
|
|
58
|
+
"src/BrowserGeminiLibrary.py" = "BrowserGeminiLibrary.py"
|
|
59
|
+
|
|
60
|
+
[tool.hatch.build.targets.editable]
|
|
61
|
+
dev-mode-dirs = ["src"]
|
|
62
|
+
|
|
55
63
|
[tool.hatch.build.targets.sdist]
|
|
56
64
|
include = [
|
|
57
65
|
"src/robotframework_gemini",
|
|
66
|
+
"src/GeminiLibrary.py",
|
|
67
|
+
"src/BrowserGeminiLibrary.py",
|
|
58
68
|
"LICENSE",
|
|
59
69
|
"README.md",
|
|
60
70
|
]
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"""Backward-compatible shim for ``Library BrowserGeminiLibrary``."""
|
|
2
|
+
|
|
3
|
+
from robotframework_gemini.library import GeminiLibrary
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class BrowserGeminiLibrary(GeminiLibrary):
|
|
7
|
+
"""Alias of :class:`robotframework_gemini.library.GeminiLibrary`."""
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
__all__ = ["BrowserGeminiLibrary"]
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"""Top-level shim so ``Library GeminiLibrary`` resolves via ``import GeminiLibrary``.
|
|
2
|
+
|
|
3
|
+
Robot Framework entry points work at runtime; RobotCode and other tools often
|
|
4
|
+
import the library name as a Python module first.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from robotframework_gemini.library import GeminiLibrary
|
|
8
|
+
|
|
9
|
+
__all__ = ["GeminiLibrary"]
|
{robotframework_gemini-0.3.0 → robotframework_gemini-0.3.1}/src/robotframework_gemini/client.py
RENAMED
|
@@ -33,7 +33,7 @@ class GeminiOrchestrator:
|
|
|
33
33
|
|
|
34
34
|
Environment:
|
|
35
35
|
- GEMINI_API_KEY for the API key (unless ``api_key`` is passed explicitly)
|
|
36
|
-
- GEMINI_MODEL for model id (e.g. gemini-2.
|
|
36
|
+
- GEMINI_MODEL for model id (e.g. gemini-2.5-flash); defaults to gemini-2.5-flash
|
|
37
37
|
"""
|
|
38
38
|
|
|
39
39
|
def __init__(
|
|
@@ -47,7 +47,7 @@ class GeminiOrchestrator:
|
|
|
47
47
|
raise ValueError(
|
|
48
48
|
"Missing API key: set GEMINI_API_KEY (or pass api_key=...)"
|
|
49
49
|
)
|
|
50
|
-
self.model = model or os.environ.get("GEMINI_MODEL") or "gemini-2.
|
|
50
|
+
self.model = model or os.environ.get("GEMINI_MODEL") or "gemini-2.5-flash"
|
|
51
51
|
self._client = genai.Client(api_key=key)
|
|
52
52
|
|
|
53
53
|
def generate_from_text(self, prompt: str) -> str:
|
{robotframework_gemini-0.3.0 → robotframework_gemini-0.3.1}/src/robotframework_gemini/library.py
RENAMED
|
@@ -33,7 +33,12 @@ ensure_gemini_env_from_legacy()
|
|
|
33
33
|
|
|
34
34
|
|
|
35
35
|
class GeminiLibrary:
|
|
36
|
-
"""Keywords for Gemini text oracles and optional Browser screenshot capture.
|
|
36
|
+
"""Keywords for Gemini text oracles and optional Browser screenshot capture.
|
|
37
|
+
|
|
38
|
+
Import arguments:
|
|
39
|
+
- ``api_key`` — Gemini API key (falls back to ``GEMINI_API_KEY`` when omitted)
|
|
40
|
+
- ``model`` — model id (falls back to ``GEMINI_MODEL``, then ``gemini-2.5-flash``)
|
|
41
|
+
"""
|
|
37
42
|
|
|
38
43
|
ROBOT_LIBRARY_SCOPE = "GLOBAL"
|
|
39
44
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{robotframework_gemini-0.3.0 → robotframework_gemini-0.3.1}/src/robotframework_gemini/legacy_env.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|