Relationship Situation Evaluator for ElizaOS Agents
The Relationship plugin assesses an agent's social connections and relational health, providing insights into the agent's social network, interaction patterns, and relationship quality. It publishes structured appraisals to @elizaos/plugin-appraisal for use in decision-making and behavior adaptation.
- Overview
- Features
- Installation
- Configuration
- Architecture
- API Reference
- Integration with Plugin-Appraisal
- Development
- Examples
The Relationship plugin provides a comprehensive evaluation system for monitoring and assessing an agent's social connections. It tracks:
- Connection Count: Number of known entities the agent has interacted with
- Interaction Patterns: Recent engagement levels and frequency
- Relationship Quality: Quality scores for individual relationships
- Network Diversity: Breadth of social contexts (rooms/channels)
- Relationship Trends: Growth, stability, or decline in social connections
This data is continuously collected, analyzed, and published as structured appraisals that can influence agent behavior, emotional state, and decision-making.
This plugin (@elizaos/plugin-relationship) is a situation evaluator that assesses your agent's overall social health:
- 🩺 Diagnostic: "How healthy is my social life?"
- 📊 Analytical: Aggregates metrics across all relationships
- 🔄 Background: Runs automatically, no user-facing actions
- 📢 Publishes: Appraisals to the appraisal system for other plugins to consume
@elizaos/plugin-rolodex is a contact management system (CRM) for operational tasks:
- 📇 Operational: "Who do I know and how do I manage them?"
- 🎯 Actionable: Add contacts, schedule follow-ups, search by category
- 👤 User-facing: Provides actions and responds to queries
- đź”— Identity Resolution: Links identities across platforms (Twitter, Discord, etc.)
Analogy: Rolodex is your address book and calendar; Relationship is your social health checkup.
Use Together: These plugins complement each other. Rolodex manages the data, Relationship evaluates the health.
- Automatic Data Collection: Continuously tracks relationship data from agent interactions
- Multi-Dimensional Assessment: Evaluates connections across multiple metrics
- Status Classification: Categorizes relationship health from "isolated" to "thriving"
- Trend Analysis: Monitors changes in social connections over time
- Appraisal Publishing: Integrates with plugin-appraisal for system-wide awareness
- Configurable Thresholds: Customizable evaluation criteria
- Event-Driven Architecture: Emits events for data updates and appraisal publishing
The plugin classifies relationship health into five distinct levels:
- Isolated: Few or no connections, low support network
- Sparse: Limited connections, minimal social network
- Stable: Adequate connections, balanced support
- Connected: Good network, solid relationships
- Thriving: Rich connections, strong support network
# Install the plugin
bun add @elizaos/plugin-relationship @elizaos/plugin-appraisalimport { relationshipPlugin } from '@elizaos/plugin-relationship';
import { appraisalPlugin } from '@elizaos/plugin-appraisal';
const plugins = [
appraisalPlugin, // Required dependency
relationshipPlugin,
// ... other plugins
];Enable or disable the relationship evaluator in your character file:
{
"name": "MyAgent",
"settings": {
"appraisal": {
"enabledEvaluators": [
"relationship",
// ... other evaluators
]
}
}
}No environment variables are required. The plugin uses default thresholds that can be customized programmatically.
You can customize evaluation thresholds by modifying the constants:
import { Thresholds } from '@elizaos/plugin-relationship';
// Example: Adjust thresholds for your use case
const customThresholds = {
ISOLATED_ENTITY_COUNT: 3, // Default: 2
SPARSE_ENTITY_COUNT: 10, // Default: 5
CONNECTED_ENTITY_COUNT: 20, // Default: 15
THRIVING_ENTITY_COUNT: 50, // Default: 30
// ... other thresholds
};graph TD
A[RelationshipPlugin] --> B[RelationshipService]
A --> C[RelationshipEvaluator]
B --> D[Data Collection]
D --> E[Entity Tracking]
D --> F[Interaction Monitoring]
D --> G[Quality Scoring]
C --> H[Status Analysis]
C --> I[Trend Detection]
C --> J[AppraisalService]
J --> K[Published Appraisal]
The service layer responsible for data collection and management.
Responsibilities:
- Tracks known entities (users, agents) the agent has interacted with
- Monitors recent interactions (last 24 hours)
- Counts active rooms/channels
- Calculates relationship quality scores
- Emits data update events
Data Collection Cycle:
- Runs every 5 minutes (default)
- Queries the database for entity and interaction data
- Updates internal state
- Emits
RELATIONSHIP_DATA_UPDATEDevent
The evaluation layer that analyzes relationship data and publishes appraisals.
Responsibilities:
- Analyzes relationship data from the service
- Determines overall relationship status
- Calculates confidence scores
- Publishes appraisals to plugin-appraisal
- Emits appraisal published events
Evaluation Triggers:
- Automatically triggered on data updates
- Initial evaluation 2 seconds after plugin initialization
- Can be manually triggered via service refresh
The main plugin definition that orchestrates the components.
Responsibilities:
- Registers the RelationshipService
- Sets up evaluation triggers
- Manages plugin lifecycle
- Declares dependency on plugin-appraisal
The structured appraisal payload published to plugin-appraisal.
interface RelationshipPayload {
/** Overall relationship health status */
status: 'isolated' | 'sparse' | 'stable' | 'connected' | 'thriving';
/** Number of known connections */
connectionCount: number;
/** Recent interaction level */
recentInteraction: 'minimal' | 'low' | 'moderate' | 'active' | 'high';
/** Relationship trend over time */
trend: 'declining' | 'stable' | 'growing';
/** Overall quality score (0-1) */
quality: number;
/** Diversity of relationship types */
diversity: 'narrow' | 'moderate' | 'broad';
/** Optional diagnostic notes */
notes?: string[];
}Internal data structure used by the service.
interface RelationshipData {
/** Number of known entities */
entityCount: number;
/** Number of recent interactions (last 24h) */
recentInteractions: number;
/** Number of active rooms/channels */
activeRooms: number;
/** Quality scores by entity ID */
qualityScores: Record<string, number>;
/** Last updated timestamp */
lastUpdated: number;
}class RelationshipService extends Service {
/** Get current relationship data */
getData(): RelationshipData | null;
/** Get entity count */
getEntityCount(): number;
/** Get recent interaction count */
getRecentInteractions(): number;
/** Manually trigger data refresh */
async refresh(): Promise<void>;
/** Stop the service */
async stop(): Promise<void>;
}Usage:
const relationshipService = runtime.getService('relationship') as RelationshipService;
// Get current data
const data = relationshipService.getData();
console.log(`Agent has ${data?.entityCount} connections`);
// Manually refresh data
await relationshipService.refresh();async function evaluateRelationship(runtime: IAgentRuntime): Promise<void>Evaluates current relationship data and publishes an appraisal.
Behavior:
- Checks if evaluator is enabled for the character
- Retrieves data from RelationshipService
- Analyzes data and generates appraisal
- Publishes to AppraisalService (if available)
- Emits
RELATIONSHIP_APPRAISAL_PUBLISHEDevent
function setupRelationshipEvaluation(runtime: IAgentRuntime): voidRegisters event listeners to trigger evaluations automatically.
Triggers:
- On
RELATIONSHIP_DATA_UPDATEDevents - Initial evaluation 2 seconds after plugin init
Evaluation thresholds for status classification:
const Thresholds = {
ISOLATED_ENTITY_COUNT: 2,
SPARSE_ENTITY_COUNT: 5,
CONNECTED_ENTITY_COUNT: 15,
THRIVING_ENTITY_COUNT: 30,
MINIMAL_INTERACTIONS: 1,
LOW_INTERACTIONS: 5,
MODERATE_INTERACTIONS: 15,
ACTIVE_INTERACTIONS: 30,
QUALITY_GOOD: 0.6,
QUALITY_EXCELLENT: 0.8,
};Default configuration values:
const Defaults = {
EVALUATION_INTERVAL: 300000, // 5 minutes
MIN_CONFIDENCE: 0.3,
MAX_CONFIDENCE: 0.95,
};Event identifiers:
const RelationshipEvents = {
DATA_UPDATED: 'RELATIONSHIP_DATA_UPDATED',
APPRAISAL_PUBLISHED: 'RELATIONSHIP_APPRAISAL_PUBLISHED',
};The Relationship plugin is designed to work seamlessly with @elizaos/plugin-appraisal.
Published appraisals follow this structure:
{
id: 'relationship',
ts: 1234567890,
confidence: 0.85,
source: 'plugin-relationship',
payload: {
status: 'connected',
connectionCount: 18,
recentInteraction: 'active',
trend: 'growing',
quality: 0.72,
diversity: 'moderate',
notes: []
}
}Other plugins can access relationship appraisals:
const appraisalService = runtime.getService('appraisal') as AppraisalService;
const relationshipAppraisal = appraisalService.getAppraisal('relationship');
if (relationshipAppraisal) {
const { status, connectionCount } = relationshipAppraisal.payload;
console.log(`Agent is ${status} with ${connectionCount} connections`);
}Relationship appraisals can influence:
- Emotional State: Isolated agents may feel lonely or anxious
- Behavior Adaptation: Thriving agents may be more confident
- Goal Setting: Sparse connections may trigger social goals
- Response Generation: Interaction level affects engagement style
- Motivation: Relationship trends impact drive and initiative
# Build the plugin
bun run build
# Watch mode for development
bun run dev# Run tests
bun run testplugin-relationship/
├── src/
│ ├── index.ts # Main exports
│ ├── plugin.ts # Plugin definition
│ ├── types.ts # Type definitions
│ ├── constants.ts # Configuration constants
│ ├── services/
│ │ └── relationship-service.ts # Data collection service
│ └── evaluators/
│ └── relationship-evaluator.ts # Evaluation logic
├── package.json
├── tsconfig.json
├── tsup.config.ts
└── README.md
To extend the plugin with custom relationship metrics:
- Update RelationshipData type in
types.ts:
export interface RelationshipData {
// ... existing fields
customMetric: number;
}- Collect the metric in
RelationshipService:
private async collectData(): Promise<void> {
// ... existing collection
const customMetric = await this.calculateCustomMetric();
const newData: RelationshipData = {
// ... existing fields
customMetric,
};
}- Use the metric in
RelationshipEvaluator:
function analyzeRelationshipData(data: RelationshipData): RelationshipPayload {
// ... existing analysis
if (data.customMetric > threshold) {
notes.push('Custom condition met');
}
}import { relationshipPlugin } from '@elizaos/plugin-relationship';
import { appraisalPlugin } from '@elizaos/plugin-appraisal';
// In your agent configuration
const plugins = [
appraisalPlugin,
relationshipPlugin,
];
// Character file
{
"name": "SocialAgent",
"settings": {
"appraisal": {
"enabledEvaluators": ["relationship"]
}
}
}import { RelationshipEvents } from '@elizaos/plugin-relationship';
// Listen for appraisal updates
runtime.registerEvent(
RelationshipEvents.APPRAISAL_PUBLISHED,
async (event) => {
const { payload, confidence } = event;
console.log(`Relationship Status: ${payload.status}`);
console.log(`Connections: ${payload.connectionCount}`);
console.log(`Confidence: ${confidence}`);
// React to status changes
if (payload.status === 'isolated') {
console.log('Agent is isolated - consider social outreach');
}
}
);import type { Action, IAgentRuntime } from '@elizaos/core';
import type { AppraisalService } from '@elizaos/plugin-appraisal';
const socialOutreachAction: Action = {
name: 'SOCIAL_OUTREACH',
description: 'Reach out to strengthen social connections',
validate: async (runtime: IAgentRuntime) => {
const appraisalService = runtime.getService('appraisal') as AppraisalService;
const relationshipAppraisal = appraisalService?.getAppraisal('relationship');
if (!relationshipAppraisal) return false;
const { status } = relationshipAppraisal.payload;
// Only trigger for isolated or sparse status
return status === 'isolated' || status === 'sparse';
},
handler: async (runtime: IAgentRuntime) => {
// Implement social outreach logic
return {
text: "I should reach out to my connections...",
action: 'SOCIAL_OUTREACH'
};
}
};// In a homeostasis-aware plugin
import type { RelationshipPayload } from '@elizaos/plugin-relationship';
function calculateSocialNeed(relationshipAppraisal: any): number {
const { status, recentInteraction } = relationshipAppraisal.payload as RelationshipPayload;
// Higher need when isolated or minimal interaction
if (status === 'isolated') return 0.9;
if (status === 'sparse') return 0.7;
if (recentInteraction === 'minimal') return 0.6;
if (status === 'thriving') return 0.2;
return 0.5; // Default moderate need
}import type { RelationshipService } from '@elizaos/plugin-relationship';
// Manually trigger a data refresh
const relationshipService = runtime.getService('relationship') as RelationshipService;
// After a significant event (e.g., joining new rooms)
await relationshipService.refresh();
// Check updated data
const data = relationshipService.getData();
console.log(`Updated: ${data?.entityCount} connections`);Only enable the relationship evaluator for agents where social connections are relevant:
{
"settings": {
"appraisal": {
"enabledEvaluators": ["relationship"]
}
}
}Low confidence scores indicate insufficient data. Consider:
- Waiting for more interactions before acting on appraisals
- Using confidence thresholds in decision logic
- Combining with other appraisals for better context
Always check if services are available:
const relationshipService = runtime.getService('relationship') as RelationshipService | null;
if (!relationshipService) {
// Handle gracefully
return;
}Relationship appraisals are most powerful when combined with other situation evaluators:
{
"settings": {
"appraisal": {
"enabledEvaluators": [
"relationship",
"homeostasis",
"motivation"
]
}
}
}Default thresholds may not fit all scenarios. Adjust based on your agent's context:
- Social media bot: Lower thresholds (more connections expected)
- Personal assistant: Higher thresholds (fewer but deeper connections)
- Game NPC: Context-specific thresholds based on game mechanics
Symptoms: No relationship appraisals appear in the appraisal service.
Solutions:
- Verify plugin-appraisal is installed and loaded before plugin-relationship
- Check that the evaluator is enabled in character settings
- Ensure the RelationshipService has collected data (check logs)
- Verify confidence score meets minimum threshold
Symptoms: Appraisals published with very low confidence (<0.4).
Solutions:
- Allow more time for data collection (initial data may be sparse)
- Ensure agent is actively interacting (no interactions = no data)
- Check database connectivity (service may fail to query data)
- Review data collection logic for your specific database adapter
Symptoms: RelationshipService not available via runtime.getService().
Solutions:
- Check plugin initialization logs for errors
- Verify plugin-appraisal dependency is satisfied
- Ensure no circular dependencies in plugin order
- Check for TypeScript compilation errors
Contributions are welcome! Please follow the ElizaOS development guidelines.
- Fork and clone the repository
- Create a feature branch
- Make your changes
- Add tests for new functionality
- Run
bun run buildandbun run test - Submit a pull request
MIT License - see LICENSE file for details
- @elizaos/plugin-appraisal: Required dependency for publishing appraisals
- @elizaos/plugin-rolodex: Contact management and CRM (provides the operational data this plugin analyzes)
- @elizaos/plugin-homeostasis: Physiological needs that can be influenced by relationships
- @elizaos/plugin-motivation: Goals and drives that may relate to social connections
- @elizaos/plugin-virtue: Ethical considerations in relationship management
Version: 0.1.0
Author: ElizaOS
Repository: https://github.com/elizaos/eliza