
Migrate Honcho
Upgrade Honcho Python client code from v1.6 async classes and Observations API to v2.0 `.aio` accessor and Conclusions terminology without breaking agent memory flows.
Install
npx skills add https://github.com/plastic-labs/honcho --skill migrate-honchoWhat is this skill?
- Replaces AsyncHoncho, AsyncPeer, and AsyncSession with Honcho() plus `.aio` on peers and sessions
- Documents async iteration patterns such as `async for p in client.aio.peers()`
- Renames Observations/ObservationScope APIs to Conclusions with scoped list and query flows
- Step-by-step import and type-hint cleanup for sync/async dual usage on one client
Adoption & trust: 1 installs on skills.sh; 5k GitHub stars; 3/3 security scanners passed (skills.sh audits); trending (+100% hot-view momentum).
Recommended Skills
Microsoft Foundrymicrosoft/azure-skills
Azure Aimicrosoft/azure-skills
Azure Hosted Copilot Sdkmicrosoft/azure-skills
Lark Eventlarksuite/cli
Running Claude Code Via Litellm Copilotxixu-me/skills
Setup Matt Pocock Skillsmattpocock/skills
Journey fit
Common Questions / FAQ
Is Migrate Honcho safe to install?
skills.sh reports 3 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.
SKILL.md
READMESKILL.md - Migrate Honcho
# Detailed API Changes ## 1. Async Client Architecture (Major Change) The separate `AsyncHoncho`, `AsyncPeer`, and `AsyncSession` classes have been removed. Use the `.aio` accessor instead. ### Before (v1.6.0) ```python from honcho import Honcho, AsyncHoncho, AsyncPeer, AsyncSession # Sync client client = Honcho() # Async client - separate class async_client = AsyncHoncho() peer = await async_client.peer("user-123") response = await peer.chat("query") ``` ### After (v2.0.0) ```python from honcho import Honcho # Single client with .aio accessor for async operations client = Honcho() # Sync operations peer = client.peer("user-123") response = peer.chat("query") # Async operations via .aio accessor peer = await client.aio.peer("user-123") response = await peer.aio.chat("query") # Async iteration async for p in client.aio.peers(): print(p.id) ``` **Migration steps:** 1. Remove all `AsyncHoncho`, `AsyncPeer`, `AsyncSession` imports 2. Replace `AsyncHoncho()` with `Honcho()` and use `.aio` accessor 3. Replace `AsyncPeer` type hints with `Peer` 4. Replace `AsyncSession` type hints with `Session` 5. Access async methods via `.aio` property on instances --- ## 2. Observations → Conclusions (Terminology Change) ### Before (v1.6.0) ```python from honcho import Observation, ObservationScope, AsyncObservationScope # Access observations scope = peer.observations scope = peer.observations_of("other-peer") # List observations obs_list = scope.list() # Query observations results = scope.query("preferences") # Create observations scope.create([{"content": "User likes dark mode", "session_id": "sess-1"}]) # Get representation from observations rep = scope.get_representation() ``` ### After (v2.0.0) ```python from honcho import Conclusion, ConclusionScope, ConclusionScopeAio # Access conclusions scope = peer.conclusions scope = peer.conclusions_of("other-peer") # List conclusions (now returns SyncPage, not list) conclusions_page = scope.list() for conclusion in conclusions_page: print(conclusion.content) # Query conclusions results = scope.query("preferences") # Create conclusions scope.create([{"content": "User likes dark mode", "session_id": "sess-1"}]) # Get representation from conclusions rep = scope.representation() # Returns str, not Representation object ``` --- ## 3. Representation Type Change (Major Change) The `Representation` class has been removed. Representations are now simple strings. ### Before (v1.6.0) ```python from honcho import Representation, ExplicitObservation, DeductiveObservation # Get working representation rep: Representation = peer.working_rep() # Access explicit and deductive observations for obs in rep.explicit: print(obs.content, obs.created_at) for obs in rep.deductive: print(obs.conclusion, obs.premises) # Check if empty if rep.is_empty(): print("No observations") # Merge representations rep.merge_representation(other_rep) # Diff representations diff = rep.diff_representation(other_rep) # String formatting print(str(rep)) print(rep.str_no_timestamps()) print(rep.format_as_markdown()) ``` ### After (v2.0.0) ```python # Get representation - now returns str directly rep: str = peer.representation() # It's just a string now print(rep) # Check if empty if not rep: print("No conclusions") ``` **Removed methods:** - `.explicit` property - `.deductive` property - `.is_empty()` - `.merge_representation()` - `.diff_representation()` - `.str_no_timestamps()` - `.format_as_markdown()` --- ## 4. Configuration Parameter Rename All `config` parameters have been renamed to `configuration`, and configuration types are now strongly typed. ### Before (v1.6.0) ```python # Creating resources with config peer = client.peer("user-1", config={"observe_me": True}) session = client.session("sess-1", config={"some_setting": True}) # Getting/setting config config = peer.get_config() peer.set_config({"observe_me": False}) config = session.get_config() session.set_