hkblockchaintechnology's picture
2.0: skills, approval gates, a resumable task runner, structural verification
e2f048d verified
Raw History Blame
6.68 kB
"""Tiny Computer Agent - an agentic harness that drives a real computer with a
tiny, fully local model.
The harness is deliberately boring: it owns the loop, the closed action vocabulary,
perception and the safety gates, so the model only ever answers one question -
"which item from this short menu, and which verb?" Nothing here needs a network
call at run time, and the core imports nothing outside the standard library.
from tiny_computer_agent import AgentLoop, GrabScreen, IndexedScreen, OcrDetector
from tiny_computer_agent.models import TextPlannerBrain
screen = IndexedScreen(GrabScreen(), OcrDetector()) # pixels -> labels
brain = TextPlannerBrain() # 0.5B, CPU-friendly
loop = AgentLoop(screen=screen, brain=brain) # dry run by default
episode = loop.run("save the document")
print(episode.render())
An episode can be saved as a portable *trace*, replayed offline, and scored, so
"the model looked plausible on that screenshot" becomes a number:
from tiny_computer_agent import Trace, benchmark, run_scenario
trace = run_scenario(Scenario("click 'Save'", frames=[...], expected="Save"), brain)
trace.save("traces/save.json") # diffable, no pixels
print(benchmark(scenarios, {"planner": lambda s: PlannerBrain()}).render())
"""
from tiny_computer_agent.accessibility import (
INTERACTIVE_ROLES,
TEXT_ROLES,
AccessibleNode,
AtspiDetector,
AtspiReader,
TreeReader,
UiaDetector,
UiaReader,
accessibility_available,
)
from tiny_computer_agent.act import (
ActionResult,
DryRunExecutor,
Executor,
InputUnavailable,
PyAutoGuiExecutor,
resolve_point,
)
from tiny_computer_agent.actions import (
ACTION_KINDS,
ACTION_MENU,
Action,
ActionError,
parse_action,
)
from tiny_computer_agent.brain import (
Brain,
BrainError,
DecisionMenu,
GoalUnreachable,
MenuItem,
MockBrain,
ModelBrain,
PlannerBrain,
extract_json_object,
extract_json_objects,
parse_decision,
)
from tiny_computer_agent.loop import AgentLoop, Episode, Step
from tiny_computer_agent.models import (
DEFAULT_TEXT_MODEL,
DEFAULT_VISION_MODEL,
MODEL_BRAINS,
TextPlannerBrain,
VLMBrain,
make_model_brain,
model_cached,
model_dependencies,
pick_dtype,
resolve_device,
)
from tiny_computer_agent.demo import fake_desktop, write_fake_desktop
from tiny_computer_agent.observe import (
Element,
FakeScreen,
GrabScreen,
ImageScreen,
Observation,
ScreenSource,
ScreenUnavailable,
normalise_label,
)
from tiny_computer_agent.desktop import (
BRAIN_NAMES,
DEFAULT_KILL_SWITCH,
Check,
build_agent,
display_available,
doctor,
run_checks,
)
from tiny_computer_agent.perception import (
AutoDetector,
Detector,
DetectorUnavailable,
GridDetector,
IndexedScreen,
OcrDetector,
detector_available,
make_detector,
)
from tiny_computer_agent.diff import ChangeVerifier, Delta, diff, element_key
from tiny_computer_agent.gates import (
READ_ONLY_KINDS,
AllOf,
AllowAll,
AllowOnlyLabels,
AnyOf,
Approval,
DenyAll,
Gate,
InteractiveGate,
mutating,
)
from tiny_computer_agent.runner import RunReport, Task, TaskOutcome, TaskRunner
from tiny_computer_agent.safety import Policy, PolicyViolation
from tiny_computer_agent.skills import (
DEFAULT_SKILLS_PATH,
Skill,
SkillBrain,
SkillLibrary,
SkillStep,
record_skill,
slug,
)
from tiny_computer_agent.trace import (
Scenario,
Scoreboard,
Trace,
TraceStep,
Verdict,
benchmark,
benchmark_traces,
load_traces,
run_scenario,
score,
score_replay,
score_trace,
)
__version__ = "2.0.0"
__all__ = [
"ACTION_KINDS", "ACTION_MENU", "AccessibleNode", "Action",
"ActionError", "ActionResult", "AgentLoop", "AllOf",
"AllowAll", "AllowOnlyLabels", "AnyOf", "Approval",
"AtspiDetector", "AtspiReader", "AutoDetector", "BRAIN_NAMES",
"Brain", "BrainError", "ChangeVerifier", "Check",
"DEFAULT_KILL_SWITCH", "DEFAULT_SKILLS_PATH", "DEFAULT_TEXT_MODEL", "DEFAULT_VISION_MODEL",
"DecisionMenu", "Delta", "DenyAll", "Detector",
"DetectorUnavailable", "DryRunExecutor", "Element", "Episode",
"Executor", "FakeScreen", "Gate", "GoalUnreachable",
"GrabScreen", "GridDetector", "INTERACTIVE_ROLES", "ImageScreen",
"IndexedScreen", "InputUnavailable", "InteractiveGate", "MODEL_BRAINS",
"MenuItem", "MockBrain", "ModelBrain", "Observation",
"OcrDetector", "PlannerBrain", "Policy", "PolicyViolation",
"PyAutoGuiExecutor", "READ_ONLY_KINDS", "RunReport", "Scenario",
"Scoreboard", "ScreenSource", "ScreenUnavailable", "Skill",
"SkillBrain", "SkillLibrary", "SkillStep", "Step",
"TEXT_ROLES", "Task", "TaskOutcome", "TaskRunner",
"TextPlannerBrain", "Trace", "TraceStep", "TreeReader",
"UiaDetector", "UiaReader", "VLMBrain", "Verdict",
"__version__", "accessibility_available", "benchmark", "benchmark_traces",
"build_agent", "detector_available", "diff", "display_available",
"doctor", "element_key", "extract_json_object", "extract_json_objects",
"fake_desktop", "load_traces", "make_detector", "make_model_brain",
"model_cached", "model_dependencies", "mutating", "normalise_label",
"parse_action", "parse_decision", "pick_dtype", "record_skill",
"resolve_device", "resolve_point", "run_checks", "run_scenario",
"score", "score_replay", "score_trace", "slug",
"write_fake_desktop",
]