134 lines
3.1 KiB
Markdown
134 lines
3.1 KiB
Markdown
|
|
# Harness Interface Specification
|
||
|
|
|
||
|
|
## Standard Interface (All Harnesses Must Implement)
|
||
|
|
|
||
|
|
```python
|
||
|
|
class Harness(ABC):
|
||
|
|
'''Abstract base for all agent harnesses'''
|
||
|
|
|
||
|
|
@abstractmethod
|
||
|
|
def execute(self, prompt: str, context: Context) -> Response:
|
||
|
|
'''Execute a prompt and return response'''
|
||
|
|
pass
|
||
|
|
|
||
|
|
@abstractmethod
|
||
|
|
def tool_call(self, tool: str, params: dict) -> Result:
|
||
|
|
'''Execute a specific tool'''
|
||
|
|
pass
|
||
|
|
|
||
|
|
@abstractmethod
|
||
|
|
def session_save(self, session: Session) -> Checkpoint:
|
||
|
|
'''Save session state'''
|
||
|
|
pass
|
||
|
|
|
||
|
|
@abstractmethod
|
||
|
|
def session_load(self, checkpoint: Checkpoint) -> Session:
|
||
|
|
'''Load session state'''
|
||
|
|
pass
|
||
|
|
|
||
|
|
@property
|
||
|
|
@abstractmethod
|
||
|
|
def capabilities(self) -> List[str]:
|
||
|
|
'''Return list of supported capabilities'''
|
||
|
|
pass
|
||
|
|
|
||
|
|
@property
|
||
|
|
@abstractmethod
|
||
|
|
def metrics(self) -> Metrics:
|
||
|
|
'''Return performance metrics'''
|
||
|
|
pass
|
||
|
|
|
||
|
|
class ClawHarness(Harness):
|
||
|
|
'''Claw Code implementation'''
|
||
|
|
|
||
|
|
def __init__(self, binary_path: str, model: str):
|
||
|
|
self.binary = binary_path
|
||
|
|
self.model = model
|
||
|
|
self.bridge = OllamaBridge() # or direct
|
||
|
|
|
||
|
|
def execute(self, prompt, context):
|
||
|
|
# Claw-specific: fast, local, tool-heavy
|
||
|
|
return self.bridge.run(prompt, model=self.model)
|
||
|
|
|
||
|
|
class HermesHarness(Harness):
|
||
|
|
'''Hermes Agent implementation'''
|
||
|
|
|
||
|
|
def __init__(self, profile: str):
|
||
|
|
self.profile = profile
|
||
|
|
self.gateway = GatewayClient()
|
||
|
|
|
||
|
|
def execute(self, prompt, context):
|
||
|
|
# Hermes-specific: complex workflows, skills
|
||
|
|
return self.gateway.chat(prompt, profile=self.profile)
|
||
|
|
|
||
|
|
class OllamaHarness(Harness):
|
||
|
|
'''Ollama local implementation'''
|
||
|
|
|
||
|
|
def __init__(self, model: str = "qwen2.5:1.5b"):
|
||
|
|
self.model = model
|
||
|
|
self.client = OllamaClient()
|
||
|
|
|
||
|
|
def execute(self, prompt, context):
|
||
|
|
# Ollama-specific: fully local, offline
|
||
|
|
return self.client.generate(prompt, model=self.model)
|
||
|
|
```
|
||
|
|
|
||
|
|
## Usage (Wizard Code)
|
||
|
|
|
||
|
|
```python
|
||
|
|
# Config-driven harness selection
|
||
|
|
config = load_profile("allegro")
|
||
|
|
harness = HarnessFactory.create(config.harness.default)
|
||
|
|
|
||
|
|
# Same code, different runtime
|
||
|
|
response = harness.execute("Write Python hello world", context)
|
||
|
|
|
||
|
|
# Fallback chain
|
||
|
|
for harness_name in config.harness.fallbacks:
|
||
|
|
try:
|
||
|
|
harness = HarnessFactory.create(harness_name)
|
||
|
|
return harness.execute(prompt, context)
|
||
|
|
except HarnessError:
|
||
|
|
continue
|
||
|
|
```
|
||
|
|
|
||
|
|
## Configuration Schema
|
||
|
|
|
||
|
|
```yaml
|
||
|
|
# ~/.hermes/profiles/allegro/config.yaml
|
||
|
|
harness:
|
||
|
|
default: claw
|
||
|
|
fallbacks:
|
||
|
|
- name: hermes
|
||
|
|
condition: "complex_workflow"
|
||
|
|
- name: ollama
|
||
|
|
condition: "offline"
|
||
|
|
|
||
|
|
claw:
|
||
|
|
binary: /opt/claw/claw-cli
|
||
|
|
model: claude-3-7-sonnet
|
||
|
|
bridge: ollama # or direct
|
||
|
|
|
||
|
|
hermes:
|
||
|
|
profile: allegro
|
||
|
|
gateway: http://localhost:8644
|
||
|
|
|
||
|
|
ollama:
|
||
|
|
model: qwen2.5:1.5b
|
||
|
|
host: http://localhost:11434
|
||
|
|
|
||
|
|
tools:
|
||
|
|
- file
|
||
|
|
- terminal
|
||
|
|
- web
|
||
|
|
|
||
|
|
selection_criteria:
|
||
|
|
speed: claw > ollama > hermes
|
||
|
|
capability: hermes > claw > ollama
|
||
|
|
offline: ollama only
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
*Design by Ezra*
|
||
|
|
*Implementation by Allegro*
|