-
Notifications
You must be signed in to change notification settings - Fork 129
Open
Labels
ai-friendlyWell-documented task suitable for AI-assisted developmentWell-documented task suitable for AI-assisted developmentarea:harnessCoding agent harness integrationCoding agent harness integrationenhancementNew feature or requestNew feature or requestsdk:pythonPython SDK relatedPython SDK relatedsdk:typescriptTypeScript SDK relatedTypeScript SDK related
Description
Overview
Wire the harness system into the Agent class: add harness_config constructor parameter, lazy AgentHarness handler, .harness() method, and public exports.
Branch: feat/harness-v2
Design doc: docs/design/harness-v2-design.md (Sections 2, 3.3)
Scope
Python
-
sdk/python/agentfield/harness/_handler.py—AgentHarnessclass:- Takes
agent_instancein constructor (mirrorsAgentAI) - Accesses
self.agent.harness_config async run(prompt, *, schema, provider, model, ...)→ delegates toHarnessRunner- Config resolution: harness_config defaults + per-call overrides
- Takes
-
sdk/python/agentfield/agent.py:- Add
harness_config: Optional[HarnessConfig] = Noneto__init__params - Store
self.harness_config = harness_config - Add
self._harness_handler: Optional[AgentHarness] = None(lazy) - Add
harness_handlerproperty (lazy init, mirrorsai_handler) - Add
async def harness(self, prompt, *, schema=None, provider=None, ...)method
- Add
-
sdk/python/agentfield/__init__.py— exportHarnessConfig,HarnessResult - Integration tests: full flow Agent → .harness() → mock provider → result
TypeScript
-
sdk/typescript/src/harness/handler.ts—HarnessHandlerclass -
sdk/typescript/src/agent/Agent.ts:- Add
harnessConfigto constructor options - Add
.harness()method
- Add
-
sdk/typescript/src/index.ts— export harness types - Integration tests
Key Pattern (mirrors .ai())
# agent.py pattern:
@property
def harness_handler(self) -> AgentHarness:
if self._harness_handler is None:
from agentfield.harness import AgentHarness
self._harness_handler = AgentHarness(self)
return self._harness_handler
async def harness(self, prompt: str, *, schema=None, **kwargs):
return await self.harness_handler.run(prompt, schema=schema, **kwargs)Acceptance Criteria
harness_configaccepted in Agent constructor.harness()method works with and without constructor config- Per-call overrides work correctly
- Raises clear error when no provider specified (no config + no per-call)
- Lazy handler only initialized on first
.harness()call - Types exported from package root
- Full integration test passes with mock provider
Dependencies
- Depends on: [SDK] Core types & provider interface for .harness() #199 (types), [SDK] Schema handling with universal file-write strategy for .harness() #200 (schema), [SDK] HarnessRunner with retry & schema orchestration for .harness() #201 (runner), [SDK] Claude Code provider for .harness() #202 (claude) or [SDK] Codex provider for .harness() #203 (codex) — needs at least one real provider
- Blocks: [SDK] Gemini CLI provider for .harness() #205, [SDK] OpenCode provider for .harness() #206
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
ai-friendlyWell-documented task suitable for AI-assisted developmentWell-documented task suitable for AI-assisted developmentarea:harnessCoding agent harness integrationCoding agent harness integrationenhancementNew feature or requestNew feature or requestsdk:pythonPython SDK relatedPython SDK relatedsdk:typescriptTypeScript SDK relatedTypeScript SDK related