Llm-agents-from-scratch

Latest version: v0.0.18

Safety actively analyzes 945810 Python packages for vulnerabilities to keep your Python projects secure.

Scan your dependencies

Page 1 of 3

0.0.18

Added

- feat: add `RecordMemoryError` to error hierarchy (`TaskHandlerError` subclass) (601)
- feat: add `TaskHandler.record_memory(result, error)` — builds and persists an `Episode` before resolving the Future, so `await agent.run(task)` returns only after memory is written (601)
- feat: add `Episode.error: Exception | None` field; `Episode.result` is now optional (601)
- feat: add `template` param to `reflective_memory()` for custom reflection prompts (600)
- feat: add `Memory.summary()` delegating to `store.summary()` (595)
- feat: add `memory/recipes.py` with `recency_memory()`, `similarity_memory()`, `reflective_memory()` factory functions (593)
- feat: `Memory.key_fn` is now optional, defaulting to `lambda ep: ep.task.instruction` (593)
- feat: add `recall_mode` (`RecallMode` enum) to `BaseMemoryStore` — `RecallMode.RECENT` delegates `search()` to `read_recent()`; `RecallMode.SEARCH` performs similarity lookup (590)
- feat: add `RecallMode(str, Enum)` to `data_structures.memory` (590)
- feat: add `id_` UUID field to `Episode` (588)

Changed

- refactor: remove `BaseMemory` ABC and legacy strategy classes (`RecencyMemory`, `SimilarityMemory`, `ReflectiveMemory`); `LLMAgent` and `LLMAgentBuilder` now accept `list[Memory]` directly (602)
- refactor: move `BaseMemoryStore` to `base/memory_store.py`; `base/memory.py` now contains only `BaseMemory` (587)
- refactor: move store implementations into new `memory_stores/` package — `json.py`, `qdrant/store.py`, `qdrant/utils.py` (587)

- refactor: introduce `Memory` concrete class with `key_fn` + `metadata_fns`; replaces `BaseMemory` hierarchy (586)
- refactor: `Episode.additional_data` renamed to `metadata` (`dict[str, str]`, non-optional, default `{}`) (586)
- refactor: `BaseMemoryStore.write()` `embedded_text` param renamed to `key` (586)
- refactor: `BaseMemoryStore.search()` `k` param removed; stores use `self.max_results` set at construction (586)
- refactor: `BaseMemoryStore` gains `max_results: int = 5` init param (586)

0.0.17

Changed

- refactor: `BaseMemoryStore.write()` accepts `embedded_text: str | None` so memory strategies own embedding text (562)
- refactor: `episode_to_qdrant_point_struct()` takes pre-formatted `text: str`; qdrant params keyword-only (562)
- refactor: add `DEFAULT_EPISODE_INCLUDE` to `QdrantMemoryStore`; remove init-level format params (562)
- refactor: add `episode_to_qdrant_point_struct()` converter in `qdrant_utils.py` (559)
- chore: migrate `QdrantMemoryStore` off deprecated `add` and `query` methods (557)
- fix: update `recency_memory.ipynb` summary output cells to show delegated format (556)
- refactor: `JSONMemoryStore` now takes `dir` + `filename` params instead of a single `path` (547)

Added

- feat: implement ReflectiveMemory in memory/reflective.py (561)
- feat: implement `ReflectiveMemory` in `memory/reflective.py` (527)
- feat: add `Episode.additional_data` field and `Episode.format(mode, include)` with `EpisodeAttr` Literal type (562)
- feat: add `tqdm` to `notebooks` optional extra for async progress bars (559)
- bonus-example: `more-examples/ch07/similarity_memory.ipynb` — SimilarityMemory + QdrantMemoryStore with REST Countries API (554)
- feat: implement `SimilarityMemory` and add `summary()` to `BaseMemoryStore`, `JSONMemoryStore`, and `QdrantMemoryStore` (550)
- feat: implement QdrantMemoryStore (548)
- feat: add count() to store (545)
- feat: implement `RecencyMemory` in `memory/recency.py` (543)
- feat: implement `JSONMemoryStore` in `memory/json_store.py` (542)
- feat: add `with_memory()` and `with_memories()` to `LLMAgentBuilder` (541)
- feat: wire memory recall and record into `LLMAgent` and `TaskHandler`
- feat: add `BaseMemory` and `BaseMemoryStore` abstract base classes (539)
- feat: add `Episode` data structure to `data_structures.memory` (535)

0.0.16

Added

- feat: add `code` and `cwd` parameters to `PythonInterpreterTool` (490)
- feat: add `stdin` parameter to `PythonInterpreterTool` (487)

Changed

- refactor: rename rollout contribution method, templates, and local vars (502)
- refactor: rip out disable_model_invocation from LLMAgent (456)
- refactor: outsource SKILL_SUBDIR to skills/constants (453)
- Refactor _SKILL_SUBDIRS to use .agents/skills only (452)
- refactor: rename info attr to frontmatter (450)
- refactor move disable model invocation from skillinfo to skill (448)
- refactor: rename info attr to frontmatter (450)

0.0.15

Added

- feat: add run _with_skill() for user explicit skill activation (441)
- refactor: replace include_default_tools with TOOLS_FOR_SKILL_RESOURCES (440)
- feat: add ReadFileTool as default tool with opt-out (436)
- feat: implement UseSkillTool and Skill.resources (434)
- feat: handle `disable-model-invocation` flag and shadowing warnings (429)
- feat: inject skills catalog into `TaskHandler` system prompt (423)
- feat: add `skills_scopes` to `LLMAgent` and skill discovery to `TaskHandler` (424)
- refactor: introduce `SkillScope` enum and `get_skills_path()` utility (422)
- feat: implement `Skill.read_body()` (419)
- feat: implement `Skill.catalog()` (418)
- feat: implement validate_skill_dir() (417)
- feat: skills data structures, errors and skill construct (412)

Removed

- chore: remove `SkillInfo.from_skill_md()` (420)

Changed

- fix: add clean up of session_ready_task (378)

0.0.14

Changed

- fix: MCPToolProvider.session() fails silently (376)
- refactor: use prev result content if final result LLMAgent.get_next_step() (375)
- feat: add headers params for streamable http (369)
- fix: outdated naming convetion for tools MCPTool.__call__() (359)
- refactor: simplify MCPToolProvider session initialization (353)
- refactor: Use persistent sessions for MCPProviders (338)
- refactor: use same MCP tool namespacing as Claude Code (337)

0.0.13

Added

- feat: Add LLMAgentBuilder (329)
- feat: implement MCPTool and unit tests (328)
- feat: MCPToolProvider and start of MCPTool (326)

Changed

- fix: use same error handling as simple function tool for PydanticFunctionTool (310)
- fix: OpenAILLM.continue_chat_with_tool_results() (304)
- fix: pass kwargs to client construction for OpenAILLM (301)

Page 1 of 3

© 2026 Safety CLI Cybersecurity Inc. All Rights Reserved.