agent-learning 0.8.0__tar.gz → 0.8.2__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.
Files changed (102) hide show
  1. {agent_learning-0.8.0/src/agent_learning.egg-info → agent_learning-0.8.2}/PKG-INFO +1 -1
  2. {agent_learning-0.8.0 → agent_learning-0.8.2}/README.md +2 -3
  3. {agent_learning-0.8.0 → agent_learning-0.8.2}/pyproject.toml +1 -1
  4. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/_version.py +1 -1
  5. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/cli.py +4 -1
  6. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/learners/reinforce.py +2 -0
  7. {agent_learning-0.8.0 → agent_learning-0.8.2/src/agent_learning.egg-info}/PKG-INFO +1 -1
  8. {agent_learning-0.8.0 → agent_learning-0.8.2}/tests/test_cli.py +2 -0
  9. {agent_learning-0.8.0 → agent_learning-0.8.2}/tests/test_learner.py +21 -0
  10. agent_learning-0.8.2/tests/test_release_workflow.py +47 -0
  11. agent_learning-0.8.0/tests/test_release_workflow.py +0 -17
  12. {agent_learning-0.8.0 → agent_learning-0.8.2}/LICENSE +0 -0
  13. {agent_learning-0.8.0 → agent_learning-0.8.2}/PYPI.md +0 -0
  14. {agent_learning-0.8.0 → agent_learning-0.8.2}/setup.cfg +0 -0
  15. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/__init__.py +0 -0
  16. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/autonomy.py +0 -0
  17. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/capture.py +0 -0
  18. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/classifiers/__init__.py +0 -0
  19. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/classifiers/base.py +0 -0
  20. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/classifiers/router.py +0 -0
  21. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/classifiers/scorers/__init__.py +0 -0
  22. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/classifiers/scorers/_base.py +0 -0
  23. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/classifiers/scorers/adherence.py +0 -0
  24. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/classifiers/scorers/completion.py +0 -0
  25. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/classifiers/scorers/intent.py +0 -0
  26. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/config.py +0 -0
  27. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/decision.py +0 -0
  28. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/learners/__init__.py +0 -0
  29. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/learners/base.py +0 -0
  30. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/metrics/__init__.py +0 -0
  31. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/metrics/base.py +0 -0
  32. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/metrics/intent_resolution.py +0 -0
  33. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/metrics/local.py +0 -0
  34. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/metrics/registry.py +0 -0
  35. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/metrics/task_adherence.py +0 -0
  36. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/metrics/task_completion.py +0 -0
  37. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/policy/__init__.py +0 -0
  38. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/policy/base.py +0 -0
  39. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/policy/contextual_softmax.py +0 -0
  40. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/policy/softmax_bandit.py +0 -0
  41. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/py.typed +0 -0
  42. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/rewards/__init__.py +0 -0
  43. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/rewards/shaping.py +0 -0
  44. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/rewards/writer.py +0 -0
  45. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/scorers/__init__.py +0 -0
  46. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/scorers/base.py +0 -0
  47. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/scorers/llm/__init__.py +0 -0
  48. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/scorers/llm/_base.py +0 -0
  49. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/scorers/llm/adherence.py +0 -0
  50. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/scorers/llm/completion.py +0 -0
  51. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/scorers/llm/intent.py +0 -0
  52. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/scorers/nlp/__init__.py +0 -0
  53. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/scorers/nlp/_base.py +0 -0
  54. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/scorers/nlp/adherence.py +0 -0
  55. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/scorers/nlp/completion.py +0 -0
  56. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/scorers/nlp/intent.py +0 -0
  57. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/scorers/nlp_text/__init__.py +0 -0
  58. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/scorers/nlp_text/_base.py +0 -0
  59. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/scorers/nlp_text/adherence.py +0 -0
  60. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/scorers/nlp_text/completion.py +0 -0
  61. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/scorers/nlp_text/intent.py +0 -0
  62. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/scorers/slm/__init__.py +0 -0
  63. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/scorers/slm/_base.py +0 -0
  64. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/scorers/slm/adherence.py +0 -0
  65. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/scorers/slm/completion.py +0 -0
  66. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/scorers/slm/intent.py +0 -0
  67. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/scorers/stdlib/__init__.py +0 -0
  68. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/scorers/stdlib/_text.py +0 -0
  69. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/scorers/stdlib/adherence.py +0 -0
  70. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/scorers/stdlib/completion.py +0 -0
  71. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/scorers/stdlib/intent.py +0 -0
  72. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/storage/__init__.py +0 -0
  73. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/storage/base.py +0 -0
  74. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/storage/cosmos.py +0 -0
  75. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/storage/local.py +0 -0
  76. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/storage/memory.py +0 -0
  77. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/training/__init__.py +0 -0
  78. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/training/runner.py +0 -0
  79. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning/types.py +0 -0
  80. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning.egg-info/SOURCES.txt +0 -0
  81. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning.egg-info/dependency_links.txt +0 -0
  82. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning.egg-info/entry_points.txt +0 -0
  83. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning.egg-info/requires.txt +0 -0
  84. {agent_learning-0.8.0 → agent_learning-0.8.2}/src/agent_learning.egg-info/top_level.txt +0 -0
  85. {agent_learning-0.8.0 → agent_learning-0.8.2}/tests/test_autonomy.py +0 -0
  86. {agent_learning-0.8.0 → agent_learning-0.8.2}/tests/test_capture.py +0 -0
  87. {agent_learning-0.8.0 → agent_learning-0.8.2}/tests/test_contextual_policy.py +0 -0
  88. {agent_learning-0.8.0 → agent_learning-0.8.2}/tests/test_decision.py +0 -0
  89. {agent_learning-0.8.0 → agent_learning-0.8.2}/tests/test_default_store.py +0 -0
  90. {agent_learning-0.8.0 → agent_learning-0.8.2}/tests/test_end_to_end.py +0 -0
  91. {agent_learning-0.8.0 → agent_learning-0.8.2}/tests/test_linux_install_script.py +0 -0
  92. {agent_learning-0.8.0 → agent_learning-0.8.2}/tests/test_metrics_local.py +0 -0
  93. {agent_learning-0.8.0 → agent_learning-0.8.2}/tests/test_policy.py +0 -0
  94. {agent_learning-0.8.0 → agent_learning-0.8.2}/tests/test_scorers.py +0 -0
  95. {agent_learning-0.8.0 → agent_learning-0.8.2}/tests/test_scorers_llm.py +0 -0
  96. {agent_learning-0.8.0 → agent_learning-0.8.2}/tests/test_scorers_nlp_text.py +0 -0
  97. {agent_learning-0.8.0 → agent_learning-0.8.2}/tests/test_scorers_slm.py +0 -0
  98. {agent_learning-0.8.0 → agent_learning-0.8.2}/tests/test_scorers_stdlib.py +0 -0
  99. {agent_learning-0.8.0 → agent_learning-0.8.2}/tests/test_shaping.py +0 -0
  100. {agent_learning-0.8.0 → agent_learning-0.8.2}/tests/test_storage_local.py +0 -0
  101. {agent_learning-0.8.0 → agent_learning-0.8.2}/tests/test_storage_memory.py +0 -0
  102. {agent_learning-0.8.0 → agent_learning-0.8.2}/tests/test_types.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agent-learning
3
- Version: 0.8.0
3
+ Version: 0.8.2
4
4
  Summary: Evidence-driven reasoned and learned decisions for AI agents with inspectable autonomy.
5
5
  Author: Chris Tava
6
6
  License: MIT License
@@ -82,8 +82,7 @@ points, risk floors, tier, and resolved proportional criteria.
82
82
 
83
83
  ### Windows CLI
84
84
 
85
- For a Python-independent installation, download `agent-learn.exe` or the
86
- standalone installer from the
85
+ For a Python-independent installation, download the Windows ZIP or installer from the
87
86
  [latest GitHub release](https://github.com/microsoft/agent-learning/releases/latest).
88
87
  The installer can add its installation directory to your user `PATH`, so
89
88
  `agent-learn` works from PowerShell or Command Prompt without Python or `pip`.
@@ -101,7 +100,7 @@ or install it with the automation script:
101
100
 
102
101
  ```bash
103
102
  curl -fsSL https://raw.githubusercontent.com/microsoft/agent-learning/main/scripts/install-linux.sh -o /tmp/install-linux.sh
104
- bash /tmp/install-linux.sh --version 0.8.0 --install-dir /usr/local/bin
103
+ bash /tmp/install-linux.sh --version 0.8.2 --install-dir /usr/local/bin
105
104
  ```
106
105
 
107
106
  The Linux installation guide covers Debian/Ubuntu, RHEL-compatible, and
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "agent-learning"
7
- version = "0.8.0"
7
+ version = "0.8.2"
8
8
  description = "Evidence-driven reasoned and learned decisions for AI agents with inspectable autonomy."
9
9
  readme = "PYPI.md"
10
10
  requires-python = ">=3.10"
@@ -1,3 +1,3 @@
1
1
  """Package version."""
2
2
 
3
- __version__ = "0.8.0"
3
+ __version__ = "0.8.2"
@@ -93,7 +93,7 @@ def _build_arg_parser() -> argparse.ArgumentParser:
93
93
  description=f"Evidence-driven decision CLI for AI agents. SDK version {__version__}.",
94
94
  )
95
95
  parser.add_argument("--version", action="version", version=f"%(prog)s {__version__}")
96
- sub = parser.add_subparsers(dest="command", required=True)
96
+ sub = parser.add_subparsers(dest="command")
97
97
 
98
98
  sub.add_parser("list", help="List discovered agent ids and names.")
99
99
 
@@ -996,6 +996,9 @@ def main(argv: list[str] | None = None) -> int:
996
996
  logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(name)s - %(message)s")
997
997
  parser = _build_arg_parser()
998
998
  args = parser.parse_args(argv)
999
+ if args.command is None:
1000
+ parser.print_help()
1001
+ return 0
999
1002
  dispatch = {
1000
1003
  "list": _cmd_agents_list,
1001
1004
  "tasks-list": _cmd_agent_tasks_list,
@@ -53,6 +53,8 @@ class ReinforceLearner(Learner):
53
53
  for r in rewards:
54
54
  if r.source != RewardSource.AGGREGATE:
55
55
  continue
56
+ if not math.isfinite(r.value) or not -1.0 <= r.value <= 1.0:
57
+ raise ValueError("aggregate reward value must be finite and within [-1, 1]")
56
58
  # Rescoring may append a replacement aggregate. Keep the newest.
57
59
  current = aggregate_rewards.get(r.episode_id)
58
60
  if current is None or r.created_at > current.created_at:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agent-learning
3
- Version: 0.8.0
3
+ Version: 0.8.2
4
4
  Summary: Evidence-driven reasoned and learned decisions for AI agents with inspectable autonomy.
5
5
  Author: Chris Tava
6
6
  License: MIT License
@@ -37,6 +37,8 @@ def _full_episode() -> Episode:
37
37
 
38
38
  def test_help_and_version_print_sdk_version(capsys) -> None:
39
39
  assert f"SDK version {__version__}" in cli._build_arg_parser().format_help()
40
+ assert cli.main([]) == 0
41
+ assert "usage: agent-learn" in capsys.readouterr().out
40
42
  with pytest.raises(SystemExit) as exit_info:
41
43
  cli.main(["--version"])
42
44
  assert exit_info.value.code == 0
@@ -12,6 +12,8 @@ from __future__ import annotations
12
12
 
13
13
  import random
14
14
 
15
+ import pytest
16
+
15
17
  from agent_learning.config import LearnerConfig
16
18
  from agent_learning.learners import ReinforceLearner
17
19
  from agent_learning.policy import SoftmaxPolicy
@@ -116,3 +118,22 @@ def test_most_recent_aggregate_reward_wins() -> None:
116
118
 
117
119
  assert result.mean_reward == 0.8
118
120
  assert policy.snapshot().logits["a"] > 0.0
121
+
122
+
123
+ @pytest.mark.parametrize("value", [float("nan"), float("inf"), -float("inf"), 1.01, -1.01])
124
+ def test_invalid_aggregate_reward_is_rejected_without_policy_update(value: float) -> None:
125
+ policy = SoftmaxPolicy.from_actions([Action(id="a"), Action(id="b")])
126
+ learner = ReinforceLearner(LearnerConfig(learning_rate=0.5, entropy_bonus=0.0))
127
+ episode = _make_episode("default", "a")
128
+ reward = Reward(
129
+ episode_id=episode.id,
130
+ agent_id=episode.agent_id,
131
+ source=RewardSource.AGGREGATE,
132
+ value=value,
133
+ )
134
+ before = policy.snapshot()
135
+
136
+ with pytest.raises(ValueError, match=r"finite and within \[-1, 1\]"):
137
+ learner.update(policy, [episode], [reward])
138
+
139
+ assert policy.snapshot() == before
@@ -0,0 +1,47 @@
1
+ """Release workflow contract tests."""
2
+
3
+ from pathlib import Path
4
+
5
+
6
+ def test_release_job_uses_flattened_linux_artifact_path() -> None:
7
+ workflow = (
8
+ Path(__file__).resolve().parents[1] / ".github" / "workflows" / "publish.yaml"
9
+ ).read_text(encoding="utf-8")
10
+
11
+ expected = 'release-assets/agent-learning-cli-${VERSION}-linux-x64.tar.gz'
12
+ obsolete = (
13
+ 'release-assets/dist-installer/'
14
+ 'agent-learning-cli-${VERSION}-linux-x64.tar.gz'
15
+ )
16
+ assert expected in workflow
17
+ assert obsolete not in workflow
18
+
19
+
20
+ def test_release_job_uses_flattened_windows_artifact_paths() -> None:
21
+ workflow = (
22
+ Path(__file__).resolve().parents[1] / ".github" / "workflows" / "publish.yaml"
23
+ ).read_text(encoding="utf-8")
24
+
25
+ for suffix in ("exe", "zip"):
26
+ filename = f"agent-learning-cli-${{VERSION}}-windows-x64.{suffix}"
27
+ assert f'release-assets/{filename}' in workflow
28
+ assert f'release-assets/dist-installer/{filename}' not in workflow
29
+
30
+
31
+ def test_windows_installer_uses_directory_bundle_and_precedes_old_shims() -> None:
32
+ root = Path(__file__).resolve().parents[1]
33
+ build_script = (root / "scripts" / "build_windows_installer.ps1").read_text(
34
+ encoding="utf-8"
35
+ )
36
+ installer = (
37
+ root / "packaging" / "windows" / "agent-learning-installer.iss"
38
+ ).read_text(encoding="utf-8")
39
+
40
+ assert "--onedir" in build_script
41
+ assert "--onefile" not in build_script
42
+ assert "$env:LOCALAPPDATA" in build_script
43
+ assert 'Source: "dist\\agent-learn\\*"' in installer
44
+ assert "recursesubdirs" in installer
45
+ assert "PrivilegesRequired=lowest" in installer
46
+ assert 'ValueData: "{code:PathWithEntryFirst|{app}}"' in installer
47
+ assert 'ValueData: "{olddata};{app}"' not in installer
@@ -1,17 +0,0 @@
1
- """Release workflow contract tests."""
2
-
3
- from pathlib import Path
4
-
5
-
6
- def test_release_job_uses_flattened_linux_artifact_path() -> None:
7
- workflow = (
8
- Path(__file__).resolve().parents[1] / ".github" / "workflows" / "publish.yaml"
9
- ).read_text(encoding="utf-8")
10
-
11
- expected = 'release-assets/agent-learning-cli-${VERSION}-linux-x64.tar.gz'
12
- obsolete = (
13
- 'release-assets/dist-installer/'
14
- 'agent-learning-cli-${VERSION}-linux-x64.tar.gz'
15
- )
16
- assert expected in workflow
17
- assert obsolete not in workflow
File without changes
File without changes
File without changes