Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/actions/test-python/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ runs:
working-directory: ${{ steps.paths.outputs.dir }}
run: |
uv run ruff check .
uv run ruff format --check .
uv run ruff format --check --extend-exclude '*.md' .

- name: Run type checking
shell: bash
Expand Down
4 changes: 3 additions & 1 deletion integrations/CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ the key, so a new Python package only needs a `paths-filter` entry.
integrations/<framework>/python/
├── src/zep_<framework>/
│ ├── __init__.py # package entry point + __version__
│ ├── py.typed # PEP 561 marker; required and included in wheel/sdist
│ ├── <core>.py # core integration (memory/context/tools)
│ └── exceptions.py
├── tests/ # mock-client tests (+ optional live tests gated on ZEP_API_KEY)
Expand Down Expand Up @@ -168,7 +169,8 @@ go vet ./... && go test ./... && golangci-lint run

Every integration must: pass ruff + mypy (Python) / tsc + lint (TS) / vet + lint (Go);
ship mock-based tests; include a runnable example; handle errors gracefully (never crash
the host agent); target the latest Zep SDK; and document all public APIs.
the host agent); target the latest Zep SDK; and document all public APIs. Published Python
packages must ship an empty `py.typed` marker in both the wheel and source distribution.

## Testing pattern (Python, mock client)
```python
Expand Down
6 changes: 6 additions & 0 deletions integrations/adk/python/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
# Changelog

## Unreleased

### Added

- Added the `py.typed` marker so installed `zep-adk` packages expose their inline type annotations to PEP 561-compatible type checkers.

## 0.3.0 (2026-07-06)

### Added
Expand Down
1 change: 1 addition & 0 deletions integrations/adk/python/src/zep_adk/py.typed
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

8 changes: 8 additions & 0 deletions integrations/ag2/python/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

### Added

- Added the `py.typed` marker so installed `zep-ag2` packages expose their inline type annotations to PEP 561-compatible type checkers.

### Fixed

- Restricted AG2 to versions below 1.0, which retain the `autogen` import namespace used by this integration.

## [0.2.0]

AG2 has no native memory interface -- `ConversableAgent.register_hook` is its only per-turn
Expand Down
2 changes: 1 addition & 1 deletion integrations/ag2/python/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ classifiers = [
"Topic :: Software Development :: Libraries :: Python Modules",
]
dependencies = [
"ag2>=0.9.0",
"ag2>=0.9.0,<1",
"zep-cloud>=3.23.0",
]

Expand Down
1 change: 1 addition & 0 deletions integrations/ag2/python/src/zep_ag2/py.typed
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

6 changes: 5 additions & 1 deletion integrations/autogen/python/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

### Added

- Added the `py.typed` marker so installed `zep-autogen` packages expose their inline type annotations to PEP 561-compatible type checkers.

## [1.2.0]

### Added
Expand Down Expand Up @@ -86,4 +90,4 @@ memory = ZepUserMemory(client=zep_client, user_id="user-1", thread_id="thread-1"
- Compatible with AutoGen 0.6.1+

[Unreleased]: https://github.com/getzep/zep/compare/v0.1.0...HEAD
[0.1.0]: https://github.com/getzep/zep/releases/tag/v0.1.0
[0.1.0]: https://github.com/getzep/zep/releases/tag/v0.1.0
1 change: 1 addition & 0 deletions integrations/autogen/python/src/zep_autogen/py.typed
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

4 changes: 4 additions & 0 deletions integrations/crewai/python/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

### Added

- Added the `py.typed` marker so installed `zep-crewai` packages expose their inline type annotations to PEP 561-compatible type checkers.

## [1.2.0]

CrewAI 1.x removed its memory extension points (`crewai.memory.storage.interface.Storage`
Expand Down
1 change: 1 addition & 0 deletions integrations/crewai/python/src/zep_crewai/py.typed
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

6 changes: 6 additions & 0 deletions integrations/langgraph/python/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
# Changelog

## Unreleased

### Added

- Added the `py.typed` marker so installed `zep-langgraph` packages expose their inline type annotations to PEP 561-compatible type checkers.

## 0.2.0 (2026-07-07)

### Added
Expand Down
1 change: 1 addition & 0 deletions integrations/langgraph/python/src/zep_langgraph/py.typed
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

54 changes: 22 additions & 32 deletions integrations/langgraph/python/tests/test_integration.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
1. ``build_system_message`` injects the Zep Context Block on every turn.
2. ``persist_messages`` writes each turn back to the Zep thread.
3. Both sides of the conversation are captured on the thread.
4. Cross-thread memory recall: a second thread for the same user recalls facts
seeded in the first thread (proving recall comes from the user graph).
4. User-graph recall: the integration's search tool retrieves facts extracted
from the conversation (proving recall comes from the user graph).
5. Zep resource verification via the SDK (user metadata, thread messages).

Requires:
Expand Down Expand Up @@ -61,7 +61,6 @@
_suffix = uuid4().hex[:8]
USER_ID = f"langgraph-integ-{_suffix}"
THREAD_1 = f"langgraph-integ-t1-{_suffix}"
THREAD_2 = f"langgraph-integ-t2-{_suffix}"

FIRST_NAME = "IntegTest"
LAST_NAME = "User"
Expand Down Expand Up @@ -178,7 +177,7 @@ async def main() -> None:
print(f"\n{'=' * 70}")
print("Zep LangGraph Integration Test")
print(f" User: {USER_ID}")
print(f" Threads: {THREAD_1}, {THREAD_2}")
print(f" Thread: {THREAD_1}")
print(f"{'=' * 70}\n")

try:
Expand Down Expand Up @@ -219,26 +218,21 @@ async def main() -> None:
# -- Wait for graph ingestion ----------------------------------------
print("\n[Step 4] Waiting for Zep to process episodes...")
await wait_for_episodes_processed(zep, USER_ID, timeout_seconds=300)
await wait_for_graph_searchable(zep, USER_ID, query="Where does IntegTest work?")
searchable = await wait_for_graph_searchable(
zep, USER_ID, query="Where does IntegTest work?"
)
passed &= check("User graph is searchable", searchable)

# -- Conversation 2: cross-thread memory recall ----------------------
print("\n[Step 5] Conversation 2: cross-thread memory recall...")
# -- Recall through the integration's graph-search tool --------------
print("\n[Step 5] Recalling facts through search_memory...")
keywords = ["acme", "data scientist", "portland", "hiking", "photography"]
recall = ""
found: list[str] = []
for attempt in range(3):
thread_id = f"{THREAD_2}-r{attempt}"
await zep.thread.create(thread_id=thread_id, user_id=USER_ID)
chat2 = build_agent(zep, thread_id)
recall = (await chat2("What do you know about me?")).lower()
found = [kw for kw in keywords if kw in recall]
if found:
break
await asyncio.sleep(10)
print(f" Agent: {recall}\n")
search_tool = create_graph_search_tool(zep, user_id=USER_ID, scope="edges")
recall = str(await search_tool.ainvoke({"query": "Where does IntegTest work?"})).lower()
found = [kw for kw in keywords if kw in recall]
print(f" Search results: {recall}\n")
print(f" Recalled keywords: {found}")
passed &= check(
"Agent recalled facts from conversation 1",
"Search tool recalled facts from conversation 1",
len(found) > 0,
f"found={found}",
)
Expand Down Expand Up @@ -286,20 +280,16 @@ async def test_integration_full_lifecycle() -> None:
assert any(m.role == "assistant" for m in messages)

await wait_for_episodes_processed(zep, USER_ID, timeout_seconds=300)
await wait_for_graph_searchable(zep, USER_ID, query="Where does IntegTest work?")
assert await wait_for_graph_searchable(zep, USER_ID, query="Where does IntegTest work?"), (
"user graph never became searchable"
)

# The recall turn is still LLM-dependent (the model may decline to use
# the tool/context), so give it a few attempts on fresh threads.
# Exercise the integration's tool directly. Whether an LLM elects to
# call an optional tool is nondeterministic and is not a reliable signal
# for whether ingestion and graph recall work.
keywords = ["acme", "data scientist", "portland", "hiking", "photography"]
recall = ""
for attempt in range(3):
thread_id = f"{THREAD_2}-r{attempt}"
await zep.thread.create(thread_id=thread_id, user_id=USER_ID)
chat2 = build_agent(zep, thread_id)
recall = (await chat2("What do you know about me?")).lower()
if any(kw in recall for kw in keywords):
break
await asyncio.sleep(10)
search_tool = create_graph_search_tool(zep, user_id=USER_ID, scope="edges")
recall = str(await search_tool.ainvoke({"query": "Where does IntegTest work?"})).lower()
assert any(kw in recall for kw in keywords), f"no recall in: {recall}"
finally:
try:
Expand Down
6 changes: 5 additions & 1 deletion integrations/livekit/python/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

### Added

- Added the `py.typed` marker so installed `zep-livekit` packages expose their inline type annotations to PEP 561-compatible type checkers.

## [0.2.0] - 2026-07-07

### Added
Expand Down Expand Up @@ -112,4 +116,4 @@ If you depend on the exact old wording (e.g. in a prompt-matching test), pass it

[Unreleased]: https://github.com/getzep/zep/compare/zep-livekit-python-v0.2.0...HEAD
[0.2.0]: https://github.com/getzep/zep/compare/zep-livekit-python-v0.1.1...zep-livekit-python-v0.2.0
[0.1.0]: https://github.com/getzep/zep/releases/tag/zep-livekit-v0.1.0
[0.1.0]: https://github.com/getzep/zep/releases/tag/zep-livekit-v0.1.0
1 change: 1 addition & 0 deletions integrations/livekit/python/src/zep_livekit/py.typed
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

6 changes: 6 additions & 0 deletions integrations/ms-agent-framework/python/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
# Changelog

## Unreleased

### Added

- Added the `py.typed` marker so installed `zep-ms-agent-framework` packages expose their inline type annotations to PEP 561-compatible type checkers.

## 0.2.0 (2026-07-07)

### Added
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

6 changes: 6 additions & 0 deletions integrations/pydantic-ai/python/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
# Changelog

## Unreleased

### Added

- Added the `py.typed` marker so installed `zep-pydantic-ai` packages expose their inline type annotations to PEP 561-compatible type checkers.

## 0.2.0 (2026-07-07)

### Added
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

Loading