254 lines
8.7 KiB
Python
254 lines
8.7 KiB
Python
"""Example: Querying Reasoning Artifacts
|
|
|
|
This example demonstrates how to query hypotheses, predictions, traces, and inductions
|
|
generated during reasoning dreams using the Honcho SDK.
|
|
|
|
Reasoning artifacts are created exclusively by reasoning agents during dream processing
|
|
and cannot be created or modified via the API. This provides read-only access for
|
|
transparency and debugging.
|
|
"""
|
|
|
|
from honcho import Honcho
|
|
|
|
# Initialize the client
|
|
client = Honcho(workspace_id="my-workspace")
|
|
|
|
# =============================================================================
|
|
# Hypotheses - Explanatory theories about observed patterns
|
|
# =============================================================================
|
|
|
|
print("=" * 80)
|
|
print("HYPOTHESES")
|
|
print("=" * 80)
|
|
|
|
# List all active hypotheses for a peer
|
|
print("\n1. List active hypotheses for a peer:")
|
|
hypotheses = client.get_hypotheses(
|
|
observer="user_123",
|
|
observed="user_123",
|
|
status="active"
|
|
)
|
|
print(f"Found {len(hypotheses)} active hypotheses")
|
|
|
|
# Get a specific hypothesis
|
|
if hypotheses:
|
|
hypothesis_id = hypotheses[0].id
|
|
print(f"\n2. Get hypothesis details:")
|
|
hypothesis = client.get_hypothesis(hypothesis_id)
|
|
print(f"Content: {hypothesis.content}")
|
|
print(f"Confidence: {hypothesis.confidence}")
|
|
print(f"Tier: {hypothesis.tier}")
|
|
print(f"Status: {hypothesis.status}")
|
|
|
|
# Get predictions for this hypothesis
|
|
print(f"\n3. Get predictions for hypothesis:")
|
|
predictions = client.get_hypothesis_predictions(
|
|
hypothesis_id,
|
|
status="unfalsified"
|
|
)
|
|
print(f"Found {len(predictions)} unfalsified predictions")
|
|
|
|
# Get hypothesis genealogy (evolution tree)
|
|
print(f"\n4. Get hypothesis genealogy:")
|
|
genealogy = client.get_hypothesis_genealogy(hypothesis_id)
|
|
print(f"Parents (superseded): {len(genealogy['parents'])}")
|
|
print(f"Children (superseded by): {len(genealogy['children'])}")
|
|
if genealogy['reasoning_metadata']:
|
|
print(f"Evolution reason: {genealogy['reasoning_metadata'].get('reason', 'N/A')}")
|
|
|
|
|
|
# =============================================================================
|
|
# Predictions - Testable claims derived from hypotheses
|
|
# =============================================================================
|
|
|
|
print("\n" + "=" * 80)
|
|
print("PREDICTIONS")
|
|
print("=" * 80)
|
|
|
|
# List all predictions
|
|
print("\n5. List predictions by status:")
|
|
predictions = client.get_predictions(status="unfalsified")
|
|
print(f"Found {len(predictions)} unfalsified predictions")
|
|
|
|
# Get a specific prediction
|
|
if predictions:
|
|
prediction_id = predictions[0].id
|
|
print(f"\n6. Get prediction details:")
|
|
prediction = client.get_prediction(prediction_id)
|
|
print(f"Content: {prediction.content}")
|
|
print(f"Status: {prediction.status}")
|
|
print(f"Is Blind: {prediction.is_blind}")
|
|
print(f"Hypothesis ID: {prediction.hypothesis_id}")
|
|
|
|
# Get traces for this prediction
|
|
print(f"\n7. Get falsification traces for prediction:")
|
|
traces = client.get_prediction_traces(prediction_id)
|
|
print(f"Found {len(traces)} traces")
|
|
|
|
# Semantic search for similar predictions
|
|
print("\n8. Search for similar predictions:")
|
|
similar = client.search_predictions(
|
|
"prefers dark mode over light mode",
|
|
hypothesis_id=hypothesis_id if hypotheses else None
|
|
)
|
|
print(f"Found {len(similar)} semantically similar predictions")
|
|
for pred in similar[:3]: # Show top 3
|
|
print(f" - {pred.content} (confidence: {pred.confidence})")
|
|
|
|
|
|
# =============================================================================
|
|
# Falsification Traces - Records of falsification attempts
|
|
# =============================================================================
|
|
|
|
print("\n" + "=" * 80)
|
|
print("FALSIFICATION TRACES")
|
|
print("=" * 80)
|
|
|
|
# List all traces
|
|
print("\n9. List falsification traces:")
|
|
traces = client.get_traces(final_status="unfalsified")
|
|
print(f"Found {len(traces)} unfalsified traces")
|
|
|
|
# Get a specific trace
|
|
if traces:
|
|
trace_id = traces[0].id
|
|
print(f"\n10. Get trace details:")
|
|
trace = client.get_trace(trace_id)
|
|
print(f"Prediction ID: {trace.prediction_id}")
|
|
print(f"Final Status: {trace.final_status}")
|
|
print(f"Search Count: {trace.search_count}")
|
|
print(f"Search Efficiency: {trace.search_efficiency_score}")
|
|
print(f"Search Queries Executed:")
|
|
for query in trace.search_queries or []:
|
|
print(f" - {query}")
|
|
if trace.contradicting_premise_ids:
|
|
print(f"Contradicting Premises Found: {len(trace.contradicting_premise_ids)}")
|
|
|
|
|
|
# =============================================================================
|
|
# Inductions - Patterns extracted from unfalsified predictions
|
|
# =============================================================================
|
|
|
|
print("\n" + "=" * 80)
|
|
print("INDUCTIONS")
|
|
print("=" * 80)
|
|
|
|
# List all inductions
|
|
print("\n11. List inductions by confidence:")
|
|
inductions = client.get_inductions(
|
|
observer="user_123",
|
|
observed="user_123",
|
|
confidence="high"
|
|
)
|
|
print(f"Found {len(inductions)} high-confidence inductions")
|
|
|
|
# Get a specific induction
|
|
if inductions:
|
|
induction_id = inductions[0].id
|
|
print(f"\n12. Get induction details:")
|
|
induction = client.get_induction(induction_id)
|
|
print(f"Content: {induction.content}")
|
|
print(f"Pattern Type: {induction.pattern_type}")
|
|
print(f"Confidence: {induction.confidence}")
|
|
print(f"Stability Score: {induction.stability_score}")
|
|
|
|
# Get sources for this induction
|
|
print(f"\n13. Get induction sources:")
|
|
sources = client.get_induction_sources(induction_id)
|
|
print(f"Based on {len(sources['source_predictions'])} predictions")
|
|
print(f"From {len(sources['source_premises'])} observations")
|
|
print(f"\nSource Predictions:")
|
|
for pred in sources['source_predictions'][:3]: # Show top 3
|
|
print(f" - {pred.content}")
|
|
|
|
|
|
# =============================================================================
|
|
# Filtering by Pattern Type
|
|
# =============================================================================
|
|
|
|
print("\n" + "=" * 80)
|
|
print("PATTERN TYPE FILTERING")
|
|
print("=" * 80)
|
|
|
|
# Get inductions by pattern type
|
|
pattern_types = ["preference", "behavior", "personality", "tendency"]
|
|
for pattern_type in pattern_types:
|
|
inductions = client.get_inductions(
|
|
observer="user_123",
|
|
observed="user_123",
|
|
pattern_type=pattern_type
|
|
)
|
|
if inductions:
|
|
print(f"\n{pattern_type.capitalize()} patterns: {len(inductions)}")
|
|
for ind in inductions[:2]: # Show top 2
|
|
print(f" - {ind.content}")
|
|
|
|
|
|
# =============================================================================
|
|
# Cross-Referencing
|
|
# =============================================================================
|
|
|
|
print("\n" + "=" * 80)
|
|
print("CROSS-REFERENCING")
|
|
print("=" * 80)
|
|
|
|
# Example: Trace a pattern back to its origins
|
|
print("\n14. Trace pattern provenance:")
|
|
if inductions:
|
|
induction = inductions[0]
|
|
print(f"\nPattern: {induction.content}")
|
|
|
|
# Get sources
|
|
sources = client.get_induction_sources(induction.id)
|
|
|
|
# Show predictions
|
|
print(f"\n└─ Based on {len(sources['source_predictions'])} predictions:")
|
|
for pred in sources['source_predictions'][:2]:
|
|
print(f" ├─ {pred.content}")
|
|
|
|
# Get hypothesis for each prediction
|
|
hypothesis = client.get_hypothesis(pred.hypothesis_id)
|
|
print(f" │ └─ From hypothesis: {hypothesis.content}")
|
|
|
|
# Get traces for each prediction
|
|
traces = client.get_prediction_traces(pred.id)
|
|
print(f" │ └─ Tested {len(traces)} times, all unfalsified")
|
|
|
|
print("\n" + "=" * 80)
|
|
print("PEER CONVENIENCE METHODS")
|
|
print("=" * 80)
|
|
|
|
# Peer objects have convenience methods that automatically scope to that peer
|
|
print("\n15. Using Peer convenience methods:")
|
|
|
|
# Get a peer object
|
|
peer = client.peer("user_123")
|
|
|
|
# Get hypotheses about self using Peer method
|
|
print("\nHypotheses about self (via peer.get_hypotheses()):")
|
|
peer_hypotheses = peer.get_hypotheses(status="active")
|
|
print(f"Found {len(peer_hypotheses.get('items', []))} active hypotheses")
|
|
|
|
# Get hypotheses about another peer
|
|
print("\nHypotheses about another peer:")
|
|
peer_hypotheses_target = peer.get_hypotheses(target="user_456", status="active")
|
|
print(f"Found {len(peer_hypotheses_target.get('items', []))} hypotheses about user_456")
|
|
|
|
# Get induction patterns
|
|
print("\nInduction patterns (via peer.get_inductions()):")
|
|
peer_inductions = peer.get_inductions(confidence="high")
|
|
print(f"Found {len(peer_inductions.get('items', []))} high-confidence patterns")
|
|
|
|
# Get behavioral patterns about another peer
|
|
print("\nBehavioral patterns about another peer:")
|
|
peer_behavioral = peer.get_inductions(
|
|
target="user_456",
|
|
pattern_type="behavioral"
|
|
)
|
|
print(f"Found {len(peer_behavioral.get('items', []))} behavioral patterns")
|
|
|
|
|
|
print("\n" + "=" * 80)
|
|
print("COMPLETE")
|
|
print("=" * 80)
|