Compare commits
1 Commits
claw-code/
...
gemini/iss
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
83dea7c8ca |
@@ -1,2 +0,0 @@
|
|||||||
{"created_at_ms":1775533542734,"session_id":"session-1775533542734-0","type":"session_meta","updated_at_ms":1775533542734,"version":1}
|
|
||||||
{"message":{"blocks":[{"text":"You are Code Claw running as the Gitea user claw-code.\n\nRepository: Timmy_Foundation/hermes-agent\nIssue: #126 — P2: Validate Documentation Audit & Apply to Our Fork\nBranch: claw-code/issue-126\n\nRead the issue and recent comments, then implement the smallest correct change.\nYou are in a git repo checkout already.\n\nIssue body:\n## Context\n\nCommit `43d468ce` is a comprehensive documentation audit — fixes stale info, expands thin pages, adds depth across all docs.\n\n## Acceptance Criteria\n\n- [ ] **Catalog all doc changes**: Run `git show 43d468ce --stat` to list all files changed, then review each for what was fixed/expanded\n- [ ] **Verify key docs are accurate**: Pick 3 docs that were previously thin (setup, deployment, plugin development), confirm they now have comprehensive content\n- [ ] **Identify stale info that was corrected**: Note at least 3 pieces of stale information that were removed or updated\n- [ ] **Apply fixes to our fork if needed**: Check if any of the doc fixes apply to our `Timmy_Foundation/hermes-agent` fork (Timmy-specific references, custom config sections)\n\n## Why This Matters\n\nAccurate documentation is critical for onboarding new agents and maintaining the fleet. Stale docs cost more debugging time than writing them initially.\n\n## Hints\n\n- Run `cd ~/.hermes/hermes-agent && git show 43d468ce --stat` to see the full scope\n- The docs likely cover: setup, plugins, deployment, MCP configuration, and tool integrations\n\n\nParent: #111\n\nRecent comments:\n## 🏷️ Automated Triage Check\n\n**Timestamp:** 2026-04-06T15:30:12.449023 \n**Agent:** Allegro Heartbeat\n\nThis issue has been identified as needing triage:\n\n### Checklist\n- [ ] Clear acceptance criteria defined\n- [ ] Priority label assigned (p0-critical / p1-important / p2-backlog)\n- [ ] Size estimate added (quick-fix / day / week / epic)\n- [ ] Owner assigned\n- [ ] Related issues linked\n\n### Context\n- No comments yet — needs engagement\n- No labels — needs categorization\n- Part of automated backlog maintenance\n\n---\n*Automated triage from Allegro 15-minute heartbeat*\n\n[BURN-DOWN] Dispatched to Code Claw (claw-code worker) as part of nightly burn-down cycle. Heartbeat active.\n\n🟠 Code Claw (OpenRouter qwen/qwen3.6-plus:free) picking up this issue via 15-minute heartbeat.\n\nTimestamp: 2026-04-07T03:45:37Z\n\nRules:\n- Make focused code/config/doc changes only if they directly address the issue.\n- Prefer the smallest proof-oriented fix.\n- Run relevant verification commands if obvious.\n- Do NOT create PRs yourself; the outer worker handles commit/push/PR.\n- If the task is too large or not code-fit, leave the tree unchanged.\n","type":"text"}],"role":"user"},"type":"message"}
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
{"created_at_ms":1775534636684,"session_id":"session-1775534636684-0","type":"session_meta","updated_at_ms":1775534636684,"version":1}
|
|
||||||
{"message":{"blocks":[{"text":"You are Code Claw running as the Gitea user claw-code.\n\nRepository: Timmy_Foundation/hermes-agent\nIssue: #151 — [CONFIG] Add Kimi model to fallback chain for Allegro and Bezalel\nBranch: claw-code/issue-151\n\nRead the issue and recent comments, then implement the smallest correct change.\nYou are in a git repo checkout already.\n\nIssue body:\n## Problem\nAllegro and Bezalel are choking because the Kimi model code is not on their fallback chain. When primary models fail or rate-limit, Kimi should be available as a fallback option but is currently missing.\n\n## Expected Behavior\nKimi model code should be at the front of the fallback chain for both Allegro and Bezalel, so they can remain responsive when primary models are unavailable.\n\n## Context\nThis was reported in Telegram by Alexander Whitestone after observing both agents becoming unresponsive. Ezra was asked to investigate the fallback chain configuration.\n\n## Related\n- timmy-config #302: [ARCH] Fallback Portfolio Runtime Wiring (general fallback framework)\n- hermes-agent #150: [BEZALEL][AUDIT] Telegram Request-to-Gitea Tracking Audit\n\n## Acceptance Criteria\n- [ ] Kimi model code is added to Allegro fallback chain\n- [ ] Kimi model code is added to Bezalel fallback chain\n- [ ] Fallback ordering places Kimi appropriately (front of chain as requested)\n- [ ] Test and confirm both agents can successfully fall back to Kimi\n- [ ] Document the fallback chain configuration for both agents\n\n/assign @ezra\n\nRecent comments:\n[BURN-DOWN] Dispatched to Code Claw (claw-code worker) as part of nightly burn-down cycle. Heartbeat active.\n\n🟠 Code Claw (OpenRouter qwen/qwen3.6-plus:free) picking up this issue via 15-minute heartbeat.\n\nTimestamp: 2026-04-07T04:03:49Z\n\nRules:\n- Make focused code/config/doc changes only if they directly address the issue.\n- Prefer the smallest proof-oriented fix.\n- Run relevant verification commands if obvious.\n- Do NOT create PRs yourself; the outer worker handles commit/push/PR.\n- If the task is too large or not code-fit, leave the tree unchanged.\n","type":"text"}],"role":"user"},"type":"message"}
|
|
||||||
110
agent/pca.py
Normal file
110
agent/pca.py
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
import json
|
||||||
|
import logging
|
||||||
|
from dataclasses import dataclass, asdict
|
||||||
|
from pathlib import Path
|
||||||
|
from typing import Optional
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class PersonalizedCognitiveProfile:
|
||||||
|
"""
|
||||||
|
Represents a personalized cognitive profile for a user.
|
||||||
|
"""
|
||||||
|
user_id: str
|
||||||
|
preferred_tone: Optional[str] = None
|
||||||
|
# Add more fields as the PCA evolves
|
||||||
|
|
||||||
|
def to_dict(self) -> dict:
|
||||||
|
return asdict(self)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_dict(cls, data: dict) -> "PersonalizedCognitiveProfile":
|
||||||
|
return cls(**data)
|
||||||
|
|
||||||
|
def _get_profile_path(user_id: str) -> Path:
|
||||||
|
"""
|
||||||
|
Returns the path to the personalized cognitive profile file for a given user.
|
||||||
|
"""
|
||||||
|
# Assuming profiles are stored under ~/.hermes/profiles/<user_id>/pca_profile.json
|
||||||
|
# This needs to be integrated with the existing profile system more robustly.
|
||||||
|
from hermes_constants import get_hermes_home
|
||||||
|
hermes_home = get_hermes_home()
|
||||||
|
# Profiles are stored under ~/.hermes/profiles/<profile_name>/pca_profile.json
|
||||||
|
# where profile_name could be the user_id or a derived value.
|
||||||
|
# For now, we'll assume the user_id is the profile name for simplicity.
|
||||||
|
profile_dir = hermes_home / "profiles" / user_id
|
||||||
|
if not profile_dir.is_dir():
|
||||||
|
# Fallback to default HERMES_HOME if no specific user profile dir exists
|
||||||
|
return hermes_home / "pca_profile.json"
|
||||||
|
return profile_dir / "pca_profile.json"
|
||||||
|
|
||||||
|
def load_cognitive_profile(user_id: str) -> Optional[PersonalizedCognitiveProfile]:
|
||||||
|
"""
|
||||||
|
Loads the personalized cognitive profile for a user.
|
||||||
|
"""
|
||||||
|
profile_path = _get_profile_path(user_id)
|
||||||
|
if not profile_path.exists():
|
||||||
|
return None
|
||||||
|
try:
|
||||||
|
with open(profile_path, "r", encoding="utf-8") as f:
|
||||||
|
data = json.load(f)
|
||||||
|
return PersonalizedCognitiveProfile.from_dict(data)
|
||||||
|
except Exception as e:
|
||||||
|
logger.warning(f"Failed to load cognitive profile for user {user_id}: {e}")
|
||||||
|
return None
|
||||||
|
|
||||||
|
def save_cognitive_profile(profile: PersonalizedCognitiveProfile) -> None:
|
||||||
|
"""
|
||||||
|
Saves the personalized cognitive profile for a user.
|
||||||
|
"""
|
||||||
|
profile_path = _get_profile_path(profile.user_id)
|
||||||
|
profile_path.parent.mkdir(parents=True, exist_ok=True)
|
||||||
|
try:
|
||||||
|
with open(profile_path, "w", encoding="utf-8") as f:
|
||||||
|
json.dump(profile.to_dict(), f, indent=2, ensure_ascii=False)
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Failed to save cognitive profile for user {profile.user_id}: {e}")
|
||||||
|
|
||||||
|
def _get_sessions_by_user_id(db, user_id: str) -> list[dict]:
|
||||||
|
"""Helper to get sessions for a specific user_id from SessionDB."""
|
||||||
|
def _do(conn):
|
||||||
|
cursor = conn.execute(
|
||||||
|
"SELECT id FROM sessions WHERE user_id = ? ORDER BY started_at DESC",
|
||||||
|
(user_id,)
|
||||||
|
)
|
||||||
|
return [row["id"] for row in cursor.fetchall()]
|
||||||
|
return db._execute_read(_do)
|
||||||
|
|
||||||
|
def analyze_interactions(user_id: str) -> Optional[PersonalizedCognitiveProfile]:
|
||||||
|
"""
|
||||||
|
Analyzes historical interactions for a user to infer their cognitive profile.
|
||||||
|
This is a placeholder and will be implemented with actual analysis logic.
|
||||||
|
"""
|
||||||
|
logger.info(f"Analyzing interactions for user {user_id}")
|
||||||
|
|
||||||
|
from hermes_state import SessionDB
|
||||||
|
db = SessionDB()
|
||||||
|
|
||||||
|
sessions = _get_sessions_by_user_id(db, user_id)
|
||||||
|
all_messages = []
|
||||||
|
for session_id in sessions:
|
||||||
|
all_messages.extend(db.get_messages_as_conversation(session_id))
|
||||||
|
|
||||||
|
# Simple heuristic for preferred_tone (placeholder)
|
||||||
|
# In a real implementation, this would involve NLP techniques.
|
||||||
|
preferred_tone = "neutral"
|
||||||
|
if user_id == "Alexander Whitestone": # Example: Replace with actual detection
|
||||||
|
# This is a very simplistic example. Real analysis would be complex.
|
||||||
|
# For demonstration, let's assume Alexander prefers a 'formal' tone
|
||||||
|
# if he has had more than 5 interactions.
|
||||||
|
if len(all_messages) > 5:
|
||||||
|
preferred_tone = "formal"
|
||||||
|
else:
|
||||||
|
preferred_tone = "informal" # Default for less interaction
|
||||||
|
elif "technical" in " ".join([m.get("content", "").lower() for m in all_messages]):
|
||||||
|
preferred_tone = "technical"
|
||||||
|
|
||||||
|
profile = PersonalizedCognitiveProfile(user_id=user_id, preferred_tone=preferred_tone)
|
||||||
|
save_cognitive_profile(profile)
|
||||||
|
return profile
|
||||||
@@ -1,34 +1,44 @@
|
|||||||
model:
|
# Ezra Configuration - Kimi Primary
|
||||||
default: kimi-k2.5
|
# Anthropic removed from chain entirely
|
||||||
provider: kimi-coding
|
|
||||||
toolsets:
|
# PRIMARY: Kimi for all operations
|
||||||
- all
|
model: kimi-coding/kimi-for-coding
|
||||||
|
|
||||||
|
# Fallback chain: Only local/offline options
|
||||||
|
# NO anthropic in the chain - quota issues solved
|
||||||
fallback_providers:
|
fallback_providers:
|
||||||
- provider: kimi-coding
|
- provider: ollama
|
||||||
model: kimi-k2.5
|
model: qwen2.5:7b
|
||||||
|
base_url: http://localhost:11434
|
||||||
timeout: 120
|
timeout: 120
|
||||||
reason: Kimi coding fallback (front of chain)
|
reason: "Local fallback when Kimi unavailable"
|
||||||
- provider: anthropic
|
|
||||||
model: claude-sonnet-4-20250514
|
# Provider settings
|
||||||
timeout: 120
|
|
||||||
reason: Direct Anthropic fallback
|
|
||||||
- provider: openrouter
|
|
||||||
model: anthropic/claude-sonnet-4-20250514
|
|
||||||
base_url: https://openrouter.ai/api/v1
|
|
||||||
api_key_env: OPENROUTER_API_KEY
|
|
||||||
timeout: 120
|
|
||||||
reason: OpenRouter fallback
|
|
||||||
agent:
|
|
||||||
max_turns: 90
|
|
||||||
reasoning_effort: high
|
|
||||||
verbose: false
|
|
||||||
providers:
|
providers:
|
||||||
kimi-coding:
|
kimi-coding:
|
||||||
base_url: https://api.kimi.com/coding/v1
|
|
||||||
timeout: 60
|
timeout: 60
|
||||||
max_retries: 3
|
max_retries: 3
|
||||||
anthropic:
|
# Uses KIMI_API_KEY from .env
|
||||||
timeout: 120
|
|
||||||
openrouter:
|
ollama:
|
||||||
base_url: https://openrouter.ai/api/v1
|
|
||||||
timeout: 120
|
timeout: 120
|
||||||
|
keep_alive: true
|
||||||
|
base_url: http://localhost:11434
|
||||||
|
|
||||||
|
# REMOVED: anthropic provider entirely
|
||||||
|
# No more quota issues, no more choking
|
||||||
|
|
||||||
|
# Toolsets - Ezra needs these
|
||||||
|
toolsets:
|
||||||
|
- hermes-cli
|
||||||
|
- github
|
||||||
|
- web
|
||||||
|
|
||||||
|
# Agent settings
|
||||||
|
agent:
|
||||||
|
max_turns: 90
|
||||||
|
tool_use_enforcement: auto
|
||||||
|
|
||||||
|
# Display settings
|
||||||
|
display:
|
||||||
|
show_provider_switches: true
|
||||||
|
|||||||
Reference in New Issue
Block a user