* chore: fill out missing metadata inputs in python sdk * feat: add get_peer_config to python sdk, thoroughly document ts sdk and remove bad client usage * feat: zod chore: update tests chore: bump version, changelog * chore: python sdk version bump and changelog * [WIP] feat: combine search methods and rework endpoint to include limit param * chore: test new stainless config with library * nits: coderabbit * Merge branch 'ben/sdk-improvements' into ben/search-rrf * chore: pre-commit hooks cleanup * feat: thoroughly document observation config * Update sdks/python/src/honcho/peer.py Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * chore: v1.3.0 * feat: update version to 2.2.0 and enhance search functionality with arbitrary filters - Remove unused config variables - Added arbitrary filters to all search endpoints. - Pluralize `filters` everywhere in SDKs for consistency - Updated documentation and changelog to reflect these changes. * expose core client in TS and Python SDKs (#150) * expose core client from sdks * align text * fix: resolve get_effective_observe me race condition, default peer config (#176) * fix: resolve get_effective_observe me race condition, default peer config * fix: preserve custom config even after leaving * chore: test cases, enqueue types * Update sdks/typescript/package.json Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --------- Co-authored-by: doria <93405247+dr-frmr@users.noreply.github.com> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * chore: formatting * chore: revert undesired changes to v1 spec, clean up docs, coderabbit * feat: better search docs, fix worker.ts * fix: correctly make ts params optional in cases, update docs * chore: coderabbit * chore: remove spurious package-lock * feat: [WIP] introduce peer cards * chore: remove search.mdx * chore: clean up deriver * feat: peer cards working in deriver * feat: add basic peer_card_bench * feat: refine peer card prompt, add mini-benchmark, switch to gpt-5-nano * refactor: update peer card handling in dialectic functions and improve error handling - Enhanced `get_peer_card` function to handle `ResourceNotFoundException`. - Updated `dialectic_call` and `dialectic_stream` to accept `peer_card` and `target_peer_card` parameters. - Modified prompt generation to include peer card information. - Cleaned up whitespace in several files for consistency. * chore: update mirascope dependency version in configuration files - Bumped mirascope version from 1.25.1 to 1.25.5 in pyproject.toml and uv.lock. - Added a note in config.py regarding peer card output token handling. - Removed unnecessary comments in clients.py for clarity. * fix: [coderabbit] improve error handling in set_peer_card and enhance logging - Added a check in `set_peer_card` to raise `ResourceNotFoundException` if the peer does not exist. - Updated logging in `CertaintyReasoner` to capture exceptions with Sentry when enabled. - Refined logging messages for clarity and consistency across various functions. - Cleaned up whitespace and formatting in several files for improved readability. * refactor: update working representation handling and improve metadata key usage - Introduced constants for representation collection names to enhance clarity and maintainability. - Updated function signatures in `get_working_representation` and `set_working_representation` to require `session_name`. - Simplified metadata key determination logic by using constants instead of hardcoded strings. - Removed legacy fallback logic for working representation data retrieval. - Refactored `save_working_representation_to_peer` to utilize the new `set_working_representation` function for improved code reuse. * chore: update configuration files and enhance working representation settings - Added new peer card settings and context token limits to `.env.template`, `config.toml.example`, and documentation. - Introduced `WORKING_REPRESENTATION_MAX_OBSERVATIONS` to `DeriverSettings` for better control over observation storage. - Updated `set_working_representation` to merge new observations while respecting the maximum limit. - Improved docstrings for clarity and consistency across functions. * feat: introduce LLMError exception and enhance error handling in deriver - Added LLMError exception to handle failures in LLM calls, normalizing inputs into a JSON-serializable format. - Updated CertaintyReasoner to raise LLMError on exceptions during LLM function calls. - Enhanced QueueManager to log LLMError occurrences and re-queue messages appropriately. - Modified test runner to support asynchronous operations and improved output formatting for test results. - Updated test cases to include session information for better context. * feat: add __repr__ method to QueueItem for improved string representation - Implemented a __repr__ method in the QueueItem class to provide a clear and informative string representation of its attributes. - Updated timeout handling in TestRunner to default to 10000.0 seconds when timeout_seconds is not set, enhancing robustness in polling operations. * refactor: update peer card data structure and improve handling in related functions - Changed return type of `get_peer_card` and `set_peer_card` to use `list[str]` instead of `str | None`. - Updated `peer_card_call` and related functions to accommodate the new list structure for peer cards. - Introduced `PeerCardQuery` model to standardize responses from peer card queries. - Adjusted prompt generation in `peer_card_prompt` to reflect the new data structure. - Modified benchmark tests to align with the updated peer card handling. * refactor: adjust peer card output token settings and update related functions - Increased `PEER_CARD_MAX_OUTPUT_TOKENS` from 2000 to 4000 in `DeriverSettings`. - Updated `critical_analysis_call` to use `json_mode` and removed unused parameters. - Modified benchmark tests to utilize the new `PEER_CARD_MAX_OUTPUT_TOKENS` setting. - Removed obsolete `add_dislike.json` test file. * refactor: update peer card handling in critical analysis and dialectic prompts - Changed `peer_card` parameter type from `str | None` to `list[str] | None` in `critical_analysis_call` and related functions. - Simplified error handling in `process_representation_task` by removing redundant try-except block. - Updated prompt generation in `critical_analysis_prompt` and `dialectic_prompt` to format `peer_card` as a string with newlines. - Adjusted benchmark tests to reflect changes in peer card structure and output formatting. * refactor: update peer card test cases to use list structure - Modified test cases in `test_representation_crud.py` to reflect the change in `peer_card` parameter type from `str` to `list[str]`. - Updated assertions to accommodate the new list format for setting and retrieving peer cards. - Ensured that tests for missing peers correctly handle the list input format. * fix: improve formatting of peer card output in prompts - Updated `peer_card_prompt` to join `old_peer_card` list elements with newlines for better readability. - Removed outdated comment in `dialectic_prompt` regarding handling of non-existent cards. * chore: [coderabbit] enhance docstring and logging in prompts and queue manager - Updated the docstring in `critical_analysis_prompt` to provide detailed type annotations for parameters. - Improved logging in `chat` to differentiate between single and multiple retrieved peer cards. - Adjusted logging format in `QueueManager` to use a more structured approach for shutdown messages. --------- Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> Co-authored-by: Rajat Ahuja <rahuja445@gmail.com> |
||
|---|---|---|
| .github | ||
| .vscode | ||
| docs | ||
| mcp | ||
| migrations | ||
| scripts | ||
| sdks | ||
| src | ||
| tests | ||
| .dockerignore | ||
| .env.template | ||
| .gitignore | ||
| .markdownlint.json | ||
| .pre-commit-config.yaml | ||
| .python-version | ||
| CHANGELOG.md | ||
| CLAUDE.md | ||
| CONTRIBUTING.md | ||
| Dockerfile | ||
| LICENSE | ||
| README.md | ||
| alembic.ini | ||
| config.toml.example | ||
| docker-compose.yml.example | ||
| fly.toml | ||
| init.sql | ||
| pyproject.toml | ||
| uv.lock | ||
README.md
🫡 Honcho
Honcho is an infrastructure layer for building AI agents with social cognition and theory-of-mind capabilities. It enables developers to create AI agents and LLM-powered applications that are personalized to their end users by leveraging the inherent theory-of-mind capabilities of LLMs to build coherent models of user psychology over time.
Read about the project here.
Read the user documentation here
Table of Contents
Project Structure
The Honcho project is split between several repositories with this one hosting the core service logic. This is implemented as a FastAPI server/API to store data about an application's state.
There are also client sdks in implemented in the sdks/ directory with support
for Python and TypeScript. These SDKs wrap core SDKs that are generated using
Stainless.
We recommend using the official client SDKs instead of the core ones for better developer experience, however for any custom use cases you can still access the core SDKs in their own repos:
Examples on how to use the SDK are located within each SDK folder and in the SDK Reference
There are also documented examples of how to use the core SDKs in the API Reference section of the documentation.
Usage
When you first install the SDKs they will be ready to go, pointing at https://demo.honcho.dev which is a demo server of Honcho. This server has no authentication, no SLA, and should only be used for testing and getting familiar with Honcho.
For a production ready version of Honcho sign up for an account at https://app.honcho.dev and get started. When you sign up you'll be prompted to join an organization which will have a dedicated instance of Honcho.
Provision API keys and change your base url to point to https://api.honcho.dev
Additionally, Honcho can be self-hosted for testing and evaluation purposes. See the Local Development section below for details on how to set up a local version of Honcho.
Local Development
Below is a guide on setting up a local environment for running the Honcho Server.
This guide was made using a M3 Macbook Pro. For any compatibility issues on different platforms, please raise an Issue.
Prerequisites and Dependencies
Honcho is developed using python and uv.
The minimum python version is 3.9
The minimum uv version is 0.4.9
Setup
Once the dependencies are installed on the system run the following steps to get the local project setup.
- Clone the repository
git clone https://github.com/plastic-labs/honcho.git
- Enter the repository and install the python dependencies
We recommend using a virtual environment to isolate the dependencies for Honcho
from other projects on the same system. uv will create a virtual environment
when you sync your dependencies in the project.
cd honcho
uv sync
This will create a virtual environment and install the dependencies for Honcho.
The default virtual environment will be located at honcho/.venv. Activate the
virtual environment via:
source honcho/.venv/bin/activate
- Set up a database
Honcho utilizes Postgres for its database with pgvector. An easy way to get started with a postgres database is to create a project with Supabase
A docker-compose template is also available with a database configuration.
- Edit the environment variables
Honcho uses a .env file for managing runtime environment variables. A
.env.template file is included for convenience. Several of the configurations
are not required and are only necessary for additional logging, monitoring, and
security.
Below are the required configurations:
DB_CONNECTION_URI= # Connection uri for a postgres database (with postgresql+psycopg prefix)
# LLM Provider API Keys (at least one required depending on your configuration)
LLM_ANTHROPIC_API_KEY= # API Key for Anthropic (used for dialectic by default)
LLM_OPENAI_API_KEY= # API Key for OpenAI (optional, for embeddings if EMBED_MESSAGES=true)
LLM_GEMINI_API_KEY= # API Key for Google Gemini (used for summary/deriver by default)
LLM_GROQ_API_KEY= # API Key for Groq (used for query generation by default)
Note that the
DB_CONNECTION_URImust have the prefixpostgresql+psycopgto function properly. This is a requirement brought bysqlalchemy
The template has the additional functionality disabled by default. To ensure that they are disabled you can verify the following environment variables are set to false:
AUTH_USE_AUTH=false
SENTRY_ENABLED=false
If you set AUTH_USE_AUTH to true you will need to generate a JWT secret. You can
do this with the following command:
python scripts/generate_jwt_secret.py
This will generate a JWT secret and print it to the console. You can then set
the AUTH_JWT_SECRET environment variable. This is required for AUTH_USE_AUTH:
AUTH_JWT_SECRET=<generated_secret>
- Launch the API
With the dependencies installed, a database setup and enabled with pgvector,
and the environment variables setup you can now launch a local instance of
Honcho. The following command will launch the storage API for Honcho:
fastapi dev src/main.py
This is a development server that will reload whenever code is changed. When first launching the API with a connection to the database it will provision the necessary tables for Honcho to operate.
Pre-commit Hooks
Honcho uses pre-commit hooks to ensure code quality and consistency across the project. These hooks automatically run checks on your code before each commit, including linting, formatting, type checking, and security scans.
Installation
To set up pre-commit hooks in your development environment:
- Install pre-commit using uv
uv add --dev pre-commit
- Install the pre-commit hooks
uv run pre-commit install \
--hook-type pre-commit \
--hook-type commit-msg \
--hook-type pre-push
This will install hooks for pre-commit, commit-msg, and pre-push stages.
What the hooks do
The pre-commit configuration includes:
- Code Quality: Python linting and formatting (ruff), TypeScript linting (biome)
- Type Checking: Static type analysis with basedpyright
- Security: Vulnerability scanning with bandit
- Documentation: Markdown linting and license header checks
- Testing: Automated test runs for Python and TypeScript code
- File Hygiene: Trailing whitespace, line endings, file size checks
- Commit Standards: Conventional commit message validation
Manual execution
You can run the hooks manually on all files without making a commit:
uv run pre-commit run --all-files
Or run specific hooks:
uv run pre-commit run ruff --all-files
uv run pre-commit run basedpyright --all-files
Docker
As mentioned earlier a docker-compose template is included for running Honcho.
As an alternative to running Honcho locally it can also be run with the compose
template.
The docker-compose template is set to use an environment file called .env.
You can also copy the .env.template and fill with the appropriate values.
Copy the template and update the appropriate environment variables before launching the service:
cd honcho
cp .env.template .env
# update the file with openai key and other wanted environment variables
cp docker-compose.yml.example docker-compose.yml
docker compose up
Deploy on Fly
The API can also be deployed on fly.io. Follow the Fly.io
Docs to setup your environment and the
flyctl.
A sample fly.toml is included for convenience.
Note: The fly.toml does not include launching a Postgres database. This must be configured separately
Once flyctl is set up use the following commands to launch the application:
cd honcho
flyctl launch --no-deploy # Follow the prompts and edit as you see fit
cat .env | flyctl secrets import # Load in your secrets
flyctl deploy # Deploy with appropriate environment variables
Configuration
Honcho uses a flexible configuration system that supports both TOML files and environment variables. Configuration values are loaded in the following priority order (highest to lowest):
- Environment variables
.envfile (for local development)config.tomlfile- Default values
Using config.toml
Copy the example configuration file to get started:
cp config.toml.example config.toml
Then modify the values as needed. The TOML file is organized into sections:
[app]- Application-level settings (log level, host, port, embedding settings)[db]- Database connection and pool settings[auth]- Authentication configuration[llm]- LLM provider API keys and general settings[dialectic]- Dialectic API configuration (provider, model, search settings)[deriver]- Background worker settings and theory of mind configuration[summary]- Session summarization settings[sentry]- Error tracking and monitoring settings
Using Environment Variables
All configuration values can be overridden using environment variables. The environment variable names follow this pattern:
{SECTION}_{KEY}for nested settings- Just
{KEY}for app-level settings
Examples:
DB_CONNECTION_URI- Database connection stringAUTH_JWT_SECRET- JWT secret keyDIALECTIC_MODEL- Dialectic API modelSUMMARY_PROVIDER- Summary generation providerLOG_LEVEL- Application log level
Configuration Priority
When a configuration value is set in multiple places, Honcho uses this priority:
- Environment variables - Always take precedence
- .env file - Loaded for local development
- config.toml - Base configuration
- Default values - Built-in defaults
This allows you to:
- Use
config.tomlfor base configuration - Override specific values with environment variables in production
- Use
.envfiles for local development without modifying config.toml
Example
If you have this in config.toml:
[db]
CONNECTION_URI = "postgresql://localhost/honcho_dev"
POOL_SIZE = 10
You can override just the connection URI in production:
export DB_CONNECTION_URI="postgresql://prod-server/honcho_prod"
The application will use the production connection URI while keeping the pool size from config.toml.
Architecture
The functionality of Honcho can be split into two different services: Storage and Insights.
Peer Paradigm
Honcho uses a peer-based model where both users and agents are represented as "peers". This unified approach enables:
- Multi-participant sessions with mixed human and AI agents
- Configurable observation settings (which peers observe which others)
- Flexible identity management for all participants
- Support for complex multi-agent interactions
Key Features
- Theory-of-Mind System: Multiple implementation methods that extract facts from interactions and build comprehensive models of peer psychology
- Dialectic API: Provides theory-of-mind informed responses that integrate long-term facts with current context
- Background Processing: Asynchronous processing pipeline for expensive operations like representation updates and session summarization
- Multi-Provider Support: Configurable LLM providers for different use cases
Storage
Honcho contains several different primitives used for storing application and peer data. This data is used for managing conversations, modeling peer psychology, building RAG applications, and more.
The philosophy behind Honcho is to provide a platform that is peer-centric and easily scalable from a single user to a million.
Below is a mapping of the different primitives and their relationships.
Workspaces
├── Peers ←──────────────────┐
│ ├── Sessions │
│ ├── Collections │
│ │ └── Documents │
│ └── Messages (peer-level)│
│ │
└── Sessions ←───────────────┤ (many-to-many)
├── Peers ───────────────┘
└── Messages (session-level)
Relationship Details:
- A Workspace contains multiple Peers
- Peers and Sessions have a many-to-many relationship (peers can participate in multiple sessions, sessions can have multiple peers)
- Messages can exist at two levels:
- Session-level: Communication between peers within a session
- Peer-level: Data ingested by a peer to enhance its global representation
- Collections belong to specific Peers
- Documents are stored within Collections
Users familiar with APIs such as the OpenAI Assistants API will be familiar with much of the mapping here.
Workspaces
This is the top level construct of Honcho (formerly called Apps). Developers can register different
Workspaces for different assistants, agents, AI enabled features, etc. It is a way to
isolate data between use cases and provide multi-tenant capabilities.
Peers
Within a Workspace everything revolves around a Peer. The Peer object
represents any participant in the system - whether human users or AI agents.
This unified model enables complex multi-participant interactions.
Sessions
The Session object represents a set of interactions between Peers within a
Workspace. Other applications may refer to this as a thread or conversation.
Sessions can involve multiple peers with configurable observation settings.
Messages
The Message represents an atomic data unit that can exist at two levels:
- Session-level Messages: Communication between peers within a session context
- Peer-level Messages: Arbitrary data ingested by a peer to enhance its global representation (independent of any session)
All messages are labeled by their source peer and can be processed asynchronously to update theory-of-mind models. This flexible design allows for both conversational interactions and broader data ingestion for personality modeling.
Collections
At a high level a Collection is a named group of Documents. Developers
familiar with RAG based applications will be familiar with these. Collections
store vector embedded data that developers and agents can retrieve against using
functions like cosine similarity.
Collections are also used internally by Honcho while creating theory-of-mind representations of peers.
Documents
As stated before a Document is vector embedded data stored in a Collection.
Insights
The Insight functionality of Honcho is built on top of the Storage service. As
Messages and Sessions are created for Peers, Honcho will asynchronously
reason about peer psychology to derive facts about them and store them
in reserved Collections.
The system uses a sophisticated message processing pipeline:
- Messages are created via API
- Enqueued for background processing including:
representation: Update peer's theory of mindsummary: Create session summaries
- Session-based queue processing ensures proper ordering
- Results are stored internally in the vector database
To read more about how this works read our Research Paper
Developers can then leverage these insights in their application to better serve peer needs. The primary interface for using these insights is through the Dialectic Endpoint.
This is a regular API endpoint (/peers/{peer_id}/chat) that takes natural language requests to get data
about the Peer. This robust design lets us use this single endpoint for all
cases where extra personalization or information about the Peer is necessary.
A developer's application can treat Honcho as an oracle to the Peer and
consult it when necessary. Some examples of how to leverage the Dialectic
API include:
- Asking Honcho for a theory-of-mind insight about the
Peer - Asking Honcho to hydrate a prompt with data about the
Peers behavior - Asking Honcho for a 2nd opinion or approach about how to respond to the Peer
- Getting personalized responses that incorporate long-term facts and context
Contributing
We welcome contributions to Honcho! Please read our Contributing Guide for details on our development process, coding conventions, and how to submit pull requests.
License
Honcho is licensed under the AGPL-3.0 License. Learn more at the License file