Actoviq: Intelligence in Action
Actoviq is a Python framework for building coding agents with a default think -> act -> feedback loop.
It supports both:
- A ready-to-use default agent runtime
- A composable graph builder API for custom orchestration
pip install -U actoviqOptional browser tooling (needed only if your tools use browser automation):
playwright install chromiumExample (OpenAI):
export OPENAI_API_KEY="sk-..."from actoviq import create_builder, setup_model
model = setup_model("gpt-4o")
builder = create_builder(name="quickstart").react()
agent = builder.build(
working_dir=".",
model=model,
max_iterations=20,
load_project_docs=False,
)for event in agent.invoke(task="Summarize this repository architecture", thread_id="demo"):
if event.get("type") == "done":
print(event.get("answer", ""))from actoviq import (
create_agent,
create_builder,
KlynxAgent,
KlynxGraphBuilder,
ComposableAgentRuntime,
setup_model,
list_models,
set_tavily_api,
is_tavily_configured,
run_terminal_agent_stream,
run_terminal_ask_stream,
)from actoviq import create_builder, setup_model
model = setup_model("gpt-5.3")
builder = create_builder(name="ask-demo").ask()
agent = builder.build(working_dir=".", model=model)
for event in agent.ask("Explain the key modules in this codebase", thread_id="ask-demo"):
if event.get("type") == "done":
print(event.get("answer", ""))from actoviq import create_builder, setup_model
model = setup_model("gpt-4o")
builder = create_builder(name="demo_builder")
builder.react()
runtime = builder.build(
working_dir=".",
model=model,
max_iterations=12,
)
for event in runtime.invoke(task="Find TODOs and propose fixes", thread_id="builder-demo"):
if event.get("type") == "done":
print(event.get("answer", ""))from actoviq import create_builder, setup_model
model = setup_model("gpt-4o")
def post_process(runtime, payload):
return [{"type": "summary", "content": "Post-processing completed."}]
builder = create_builder(name="pipeline")
builder.react()
builder.add_node("post_process", post_process)
builder.add_edge("actoviq_loop", "post_process")
runtime = builder.build(working_dir=".", model=model)
for event in runtime.invoke(task="Refactor this module", thread_id="pipeline-demo"):
print(event)Both the default agent and builder runtime support tool mutation:
runtime.add_tools("group:core")
runtime.add_tools("group:terminal")
runtime.add_tools("group:tui")
runtime.add_tools("group:network_and_extra")
runtime.add_tools("none")Actoviq has 6 built-in tool groups:
system:state_update,run_subtask,parallel_tool_callcore:read_file,apply_patch,execute_command,list_directory,search_in_filesterminal:create_terminal,run_in_terminal,read_terminal,wait_terminal_until,read_terminal_since_last,run_and_wait,exec_command,write_stdin,close_exec_session,check_syntax,launch_interactive_sessiontui:open_tui,read_tui,read_tui_diff,read_tui_region,find_text_in_tui,send_keys,send_keys_and_read,wait_tui_until,close_tui,activate_tui_modenetwork_and_extra:web_search,browser_open,browser_view,browser_act,browser_scroll,browser_screenshot,browser_console_logsskills:load_skill
Default loading behavior:
- Default agent startup loads
group:systemandgroup:core. load_skillavailability is controlled byskill_injection_mode:preloadhides it,hybridandtoolexpose it.
agent = create_builder(name="perm").react().build(working_dir=".", model=model)
# default: workspace sandbox
print(agent.get_permission())
# global mode
agent.set_permission("global")
# back to workspace sandbox
agent.set_sandbox(True)from actoviq import set_tavily_api, is_tavily_configured
set_tavily_api("tvly-...")
print(is_tavily_configured()) # TrueIf Tavily API key is not configured, web_search is removed from tool groups and JSON schemas.
agent = create_builder(name="skills").react().build(
working_dir=".",
model=model,
skill_injection_mode="hybrid", # preload | tool | hybrid
)preload: preloadSKILL.mdfrom user input hints, hideload_skill.tool: disable preload, rely onload_skill.hybrid(default): preload first, keepload_skillfallback.
You can inspect checkpoint history for a thread and select a rollback target.
Rollback is one-shot by default: the next invoke/ask resumes from the selected checkpoint.
from actoviq import create_builder, setup_model
model = setup_model("gpt-4o")
agent = create_builder(name="rollback").react().build(
working_dir=".",
model=model,
load_project_docs=False,
)
thread_id = "rollback-demo"
list(agent.invoke("task A", thread_id=thread_id))
list(agent.invoke("task B", thread_id=thread_id))
history = agent.get_history(thread_id=thread_id, limit=20)
for item in history:
print(
item["display_index"],
item["checkpoint_id"][:12],
item["iteration"],
item["action"],
)
# Roll back to a selected display index (latest first).
agent.rollback(thread_id=thread_id, target_index=1)
# Optional: include tool-managed file restore.
# agent.rollback(thread_id=thread_id, target_index=1, with_files=True)
# Next run resumes from rollback checkpoint.
list(agent.invoke("task C after rollback", thread_id=thread_id))
# Optional: clear a pending rollback if needed.
agent.cancel_rollback(thread_id=thread_id)Notes:
- Checkpoint rollback restores agent session state, not all external side effects.
with_files=Truerestores file edits recorded through mutation tools (apply_patch).- Shell commands that mutate files outside these tools are out of scope for automatic restore.
invoke(...) and ask(...) produce event dictionaries. Common types include:
tokenreasoning_tokentool_exectool_resultwarningerrordone
A done event usually contains the final answer and token metrics.
setup_model(...) supports both alias and provider/model usage:
setup_model("gpt-4o")
setup_model("openai", "gpt-4o")
setup_model("deepseek", "deepseek-chat")Use list_models() to inspect available aliases.
For terminal-only usage, you can use helper stream runners:
run_terminal_agent_stream(...)run_terminal_ask_stream(...)
If you want a full command-line and TUI experience, install:
pip install -U actoviq-cli